Pomoc oko Checkbox-a!

Hocu da stavim dva,tri checkbox-a na sajt.
Kako da u bazu podataka upisem DA ako je checkbox cekiran a NE ako nije cekiran?

Ako checkbox nije čekiran, ne dobiješ nikakav POST header u vezi njega.
Ako je čekiran, dobit ćeš njegovu vrijednost (po defaultu je “on”, dakle nije true ili 1, već “on” ali to možeš postaviti da bude što želiš).

<?php
if( isset($_POST['checkbox']) ) 
{
    //ovdje uradi što trebaš
}
?>

Zend Framework koristi zanimljiv trik u vezi ovoga.

<input type="hidden" name="foo" value="0" />
<input type="checkbox" name="foo" value="1"> 

U principu ukoliko korisnik čekira checkbox, dobit će vrijednost 1. Ukoliko ne čekira, ostaje 0.

Osobno, ja bih to odradio ovako nekako

$checkbox = isset($_POST['checkbox']) ? (int)$_POST['checkbox'] : 0 ;
2 Likeova

Moraš ih staviti u formu
`

`

…formi dodaš metodu get ili post i submit button. Prilikom submitanja ti se pokreće tvojaSkripta.php, gdje vidiš koji su ti checkbox-i stigli.

$x=$_POST("nekoIme");
if($x)echo "chexbox is checked";

$_POST je array, a ne funkcija. Ispravno bi bilo $x = $_POST["nekoIme"]

Usput, ovaj kod bi bacio grešku ukoliko checkbox nije označen jer u POST globalu neće postojati ništa s indexom “nekoIme”.

Ocke, hvala!
…e sad, imam i ja pitanje…možda blesavo, ali ja zapravo nikad nisam koristio forme xd

U zadnje vrijeme se želim malo “izdresirati” da radim kao i svi ostali i da poštujem standarde. Zapitao sam sam sebe, zašto sam izbjegao forme? I pronašao sam ovako nekakav odgovor:

“Više manje kad sam god htio nešto submitat na server, htio sam i dobiti response sa servera bez refreshanja stranice. (tu su svi sugerirali, naravno, ajax). Dali forma omogućava submitanje nešto po principu ajax-a? Nisam imao pojma, a neznam niti sad.
Drugi problem koji sam imao: Najčešće kod submitanja me nebi zanimali samo podaci iz forme…nego bi ih kombinirao i uspoređivao sa raznim ostalim poljima…i onda nerjetko prosljeđivao na server daleko više podataka nego ih je korisnik zadao. Tu se često radilo o objektima i listama (+ ugnježdenima), a ne samo string vrijednostima. Forme su mi nekako izgledale nefleksibilnima za te stvari.”

Kako sam to radio:
Submit sam zamjenio sa običnim buttonom koji je aktivirao neku funkciju. Unutar te funkcije bi pročitao polja koja su me zanimala. Mogao sam tako lagano dohvaćati polja i koja nisu unutar same forme …i uspoređivat što me bila volja. Na kraju bi dobivene varijable serializirao i putem ajax konekcije prosljedio na server.

Pitanja su:

  1. Dali je moj pristup prihvatljiv?
  2. Mogu li s formom i submitom to odraditi kao i ajaxom? Dobiti response bez refreshanja stranice?

Zašto ne?

$('#forma').submit(function() {
   //ovdje uradi što želiš

   return false; //ovo sprječava reload
});

HTML dio ovoga bi bio nešto poput

<form id="forma">
   <input type="text" name="name1">
   <input type="submit">
</form>

Usput bih ti preporučio da izguglaš “jQuery Serialize”.

Hmm, sad malo čačkam i ovo te nisam skužio što si htio reći? Ne uspjevam ga natjerati da vrisne niti u jednoj soluciji?

//na ovaj dio koda mislim
$x=$_POST["nekoIme"];
if($x)echo "chexbox is checked";

Ako u arrayu ne postoji “nekoIme”, zašto bi to bio problem?

Zato što ti provjeravaš na liniji

if($x)

A $x postoji kao $_POST["nekoIme"] a “nekoIme” je nedefiniran index.

Kao kada bi počeo program i prva linija koda ti je echo $_POST["nekoIme"] a nisi dodijelio nikakvu vrijednost.

Ocke, ali znači u globalu prolazi sa provjerom if($x)…isto kao što bi se moglo:

if($_POST["nekoIme"]) echo $_POST["nekoIme"]

Ajmo reći da sam skužio poantu koju si htio reći. Ako nešto nije definirano, bolje definirati kao “nulu”, kako bi se kasnije lakše s tim baratalo.

Molim te kad si već spomenuo ovu submit funkciju, možeš li mi odati kako da mi se i vrati response sa servera bez refreshanja stranice. Ovaj “return false” blokira refresh, ali kako uhvatit server odgovor??

Ne prolaziš jer ti skripta baca grešku da taj index nije definiran. Ne želiš da ti aplikacija baca grešku, nikako, pogotovo kada je tako nešto što se da riješiti doslovce u jednoj liniji koda sa skraćenom if izjavom

$checkbox = isset($_POST['checkbox']) ? $_POST['checkbox'] : 0 ;

Što se tiče ovog drugog

$('#forma').submit(function() {
   $.ajax({
      type: "POST",
      url: "stranica.php",
      data: { name1: $("#forma input[name=name1]").val() },
      success: function(data){
        //ovo ti je response od stranica.php
        alert(data);
      }
   });

   return false;
});

Momci hvala na pomoci! Resio sam ovako:

<input type="hidden" name="x" value="Ne" />
<input type="checkbox" name="x" value="Da">

 $x=$_POST['x'];

 $q =mysqli_query($con,"INSERT INTO `mytable` (
 `x` ,)
VALUES (
 NULL ,'$x'
 );");

I ako je checkbox cekiran u bazu mi upisuje Da a ako nije Ne!
Hvala jos jednom na pomoci!
Pozz!

Znaš li da ti je sada baza podataka ranjiva?
Svatko može u Chromeu ili Firefoxu koristeći Firebug promijeniti vrijednost tvojih checkboxeva u neki maliciozan kod i napraviti sql izjavu koja bi ti mogla izmijeniti bazu podataka kako žele, obrisati ju potpuno pa čak i gore stvari.

Moraš srediti $x prije nego ga kreneš koristiti za radnje s bazom podataka.

Uh ja tek ucim ovo!Pa neznam kako da to sredim.Moze neki savet?

Mislim da ti hoce reci da ne unosis u bazu vrijednosti koje ocitavas iz browsera, nego da sam odlučuješ što se upisuje u bazu. Ako je $x==da, promjeni ga u 1, i ako je ne, promjeni ga u 0. Mozes ga cak i nakon provjere ostaviti u stanju “da” ili “ne”, iako bi ti toplo preporučio da uvijek koristiš stanja 1 i 0. Ako tek učiš, otpočetka uči pravilno da poslije ne moraš mučiti muku s nekim stvarima kao ja :slight_smile:

@tony , drzžat ću se tvog ispravnog načina :wink: …samo ne kuzim još gdje se ta greška prikazuje? Mislim, meni skripta uredno sve odradi do kraja i nigdje ne vrisne.

Hvala i za ovo drugo…sve to nakraju završi slično. Umjesto submit funkcije se opet koristi ajax konekcija, samo ju trigira submit funkcija.

Hmmm nerazumem bas najbolje sta si hteo reci!Jel moze jedan mali primer da vidim konkretno kako se to radi pa da primenim to i na ostale slicne stvari?

if($x=='da')$x='da';
else if($x=='ne')$x='ne';
else { } // ak si ovdje, onda znaš da ti je netko petljao nešto

// ili ono što ti toplo preporučavam

if($x=='da')$x=1;
else if($x=='ne')$x=0;
else { } // ak si ovdje, onda znaš da ti je netko petljao nešto

Nakon ovako nečega tek možeš biti siguran što upisuješ u bazu. Poanta što ti je toni htio reći, da moraš biti uvijek siguran što stavljaš u query kad se spajaš na bazu. Moraš biti svjestan da sve što stiže sa klijent strane (korisničkog računala), može biti nekako promijenjeno.
A konkretno kad radiš query, ako ne provjeriš što ide u njega…netko ti se može ubaciti tako da umjesto tvoje željene varijable napiše dio query-a i tako ti recimo izbriše nešto, ili općenito napravi dar mar. Takav upad ti se inače zove SQL injection.

A moze li ovako?

if($x=='1')$x=da;
else if($x=='0')$x=da;
else { }

umesto ovako

if($x=='da')$x=1;
else if($x=='ne')$x=0;
else { }

Predpostavljam da bih i na ovaj nacin izvrsio tu proveru al bi cuvao da i ne umesto 1 i 2 u bazi podataka!

Gle, bolje ti je čuvati 0 ili 1 umjesto “ne” ili “da” u bazi podataka, prvenstvo radi performanse. Ti uvijek možeš u samom prikazu te podatke provući kroz jedan if-statement i prikazati korisniku “ne” ukoliko je 0, iil prikazati korisniku “da” ukoliko je rezultat 1

E sad, zašto još staviti 0 ili 1?
Lakša zaštita od SQL injekcije.

U onom tvom kodu možeš napisati ovako

<input type="hidden" name="x" value="0" />
<input type="checkbox" name="x" value="1">

$x = $_POST['x'];
if( is_integer($x) )
{
  // ovdje tvoj kod
}

U ovom slučaju očekuješ vrijednosti 0 ili 1 iz forme, ali čak iako netko to izmijeni i napiše neki dio SQL koda (SQL injekciju), ovdje radiš provjeru je li varijabla $x zapravo broj. Ako jeste, možeš nastaviti još dodatno s validacijom ili samo produljiti na istoj liniji dodatnu validaciju, mada će ti ovo biti dovoljno u tvom slučaju vjerojatno.

Dakle ako netko napiše dio SQL-a, ovo će uvelike pomoći u ovom slučaju jer ti znaš da očekuješ broj - 0 uli 1.

Naravno, nije ovo najsavršenije rješenje, ali je dobar korak naprijed. Inače, uvijek kad znaš kakav tip podataka očekuješ od korisnika, uvijek možeš pribjeći toj metodi.

Ok ovo sam skontao sto si napisao ali imam formu za dodavanje slika i polje za unos teksta od 500 karaktera maksimalno.Kako to zastititi?

Kako radiš upload slika?

Nadam se da u bazu podataka zabilježiš samo lokaciju do slike, a ne i samu sliku.
Što se tiče polje za unos teksta, dovoljno će ti biti sljedeće:

$tekst = mysql_real_escape_string( $_POST['tekst'] );