02. februar 2010 - 12:37Der er
28 kommentarer og 1 løsning
Checkbox mysql UPDATE language SET visibility = 0/1
Hej eksperter!
Nu har jeg siddet og zappet eksperten tyndt og har nu besluttet mig for at høre om der er nogen der kan hjælpe mig.
Jeg har følgende kode, som gør det, at når jeg markerer mine checkbox's skriver den "1" i tabellen. Men jeg kan ikke få den til at gøre det inverse, altså når jeg fjerner markeringen skal den skrive "0" i tabellen... Jeg har prøvet mig lidt frem nogle MySQL kommandoer som IN/NOT IN etc. Men synes ikke helt at kunne få det til at virke alligevel. Nogle gode fif, noget der kan hjælpe på vej?
Det er fordi du i din $updateSQL altid sætter visiblity til 1.
Sætter du den i stedet til at være værdien af din checkboks vil det hjælpe.
- Michael
Synes godt om
Slettet bruger
02. februar 2010 - 12:59#2
Du kan prøve #2's kommentar af, men hvis jeg husker rigtigt, så fungerer checkboxes på følgende måde at deres værdi kun sendes vidre hvis den er tjekket af. Så for at tjekke om "visibility"-kolonnen i din db-tabel skal være 1 eller 0, så skal du tjekke i din foreach om $id har en værdi. Som dit script står lige nu, så forsøger den for hver checkbox at sætte "visibility" til 1 lige meget hvad, men hvis checkboxen ikke er tjekket af så vil din SQL-query se sådan her ud:
UPDATE language SET visibility=1 WHERE id=''
og den vil derfor ikke gøre noget.
Men som sagt så prøv #2's kommentar af først og se om det ordner dit problem.
Hvis du kun tjekker box 1 og 2 af så vil du få følgende array sendt videre til validering:
[lang] => Array ( [0] => 1 [1] => 3 )
Ud fra den information vil du ikke få værdien for box #2, så du vil faktisk ikke engang have muligheden for at sætte "visibility" til 0 for box #2 da du ikke engang får ID-nr'et sendt med.
Nej netop... derfor bliver man vel nødt til at lave en funktion der siger NOT IN eller IN, eller lign?
Synes godt om
Slettet bruger
02. februar 2010 - 13:31#8
Det du kunne gøre er at hente alle records/rækker fra din "language"-tabel og så kører dem igennem, for hver række matcher du rækkens id med din $_POST["lang"] array og ser om den finder en match, hvis den gør det så er det fordi den pågældne række er blevet tjekket af og den skal derfor have sin "visibility" sat til "1", og hvis den ikke fandt en match så skal "visibility" sættes til "0". Lige på stående fod vil jeg tro det er den nemmeste måde at kringle dit problem på.
Der vil det nok være lettest at sætte al visibility til off og derefter sætte dem der er on til on.
Synes godt om
Slettet bruger
02. februar 2010 - 13:38#10
Hvad vil du gøre når man så slår et af sprogene fra? Det jo ikke til at vide med mindre man kører alle sprogene fra tabellen igennem og ser hvilke der er tjekke af?
$sql_one = $sqlstart."1 WHERE id IN (".$updates.")"; $sql_two = $sqlstart."0 WHERE id NOT IN (".$updates.")";
echo"Sprog sat til 1 : ".$sql_one; echo"<br />Sprog sat til 0 : ".$sql_two;
// D.v.s. her skal afvikles to query's
}else{
// Kun en enkelt query er nødvendig, men der skal vel altid være et sprog ? $sql = $sqlstart."0";
echo $sql; } }
?>
Synes godt om
Slettet bruger
02. februar 2010 - 13:59#15
Selvfølgelig kan jeg det :-) Kommer alligevel ikke nogen steder i det her snestorm-vejr der hærger østjylland lige pt.
Som jeg sagde i post #8 så vil jeg, istedet for at have dit foreach-loop, hente alle rækker fra din database-tabel "language" og loop dem igennem. For hvert loop vil jeg så tjekke sprogets-id om det matcher en af rækkerne i dit array $_POST["lang"], hvis det gør det så skal du sørge for at "visibility" for den pågældne række er "1". Hvis der derimod ikke findes en match i dit array $_POST["lang"] så er det pga. det sprog ikke er tjekket af og så skal "visibility" være "0".
Her kan du få et kort eksempel (ikke fuld kode!):
<?php // Form-validerings siden
// Henter alle sprog fra tabellen "languages" $sql = "SELECT * FROM languages"; $query = mysql_query($sql);
// Looper sprogene igennem while($data = mysql_fetch_object($query)) { // Tjekker om sprogets ID har en match i $_POST["lang"]-arrayet if(in_array($data["id"], $_POST["lang"])) { // ID'et fandt sig en match i arrayet, så vi sørger for at "visibility" er sat til 1 if($data["visibility"] == 0) { mysql_query("UPDATE languages SET visibility = 1 WHERE id = $data["id"]"); } } else { // ID'et fandt IKKE en match i arrayet, så vi sørger for at "visibility" er sat til 0 if($data["visibility"] == 1) { mysql_query("UPDATE languages SET visibility = 0 WHERE id = $data["id"]"); } } } ?>
Fik lige trykket "Se preview" og fik set showsources post, som ser ud til at være lidt kortere. Anyway du får stadig mit eksempel i håb om det kan give dig et bedre indblik i hvordan det også kan gøres! :-)
Synes godt om
Slettet bruger
02. februar 2010 - 14:05#16
Hov der er da fejl i mit eksempel, jeg henter resultaterne af SQL-kaldet ud i form af objekter, men håndterer dem som arrays, må du lige undskylde! For at mit eksempel skal være brugbart så skal følgende linje:
I ex. er "key" i array'et defineret ved $row['id'] Mere for evt. at sætte en value=$row['lang'] på, så man ved post f.eks. kan skrive echo"Flg. sprog bliver synlige: ".implode(", ", $_POST["sprog"]);
$sql_one = $sqlstart."1 WHERE id IN (".$updates.")"; $sql_two = $sqlstart."0 WHERE id NOT IN (".$updates.")";
echo"Sprog sat til 1 : ".$sql_one; echo"<br />Sprog sat til 0 : ".$sql_two; echo"<br />Flg. sprog bliver synlige: ".implode(", ", $_POST["sprog"]);
// D.v.s. her skal afvikles to query's
}else{
// Kun en enkelt query er nødvendig, men der skal vel altid være et sprog ? $sql = $sqlstart."0";
echo $sql; } }
?>
Får udskriftet, ved alle sprog er valgte:
Sprog sat til 1 : UPDATE language SET visibility = 1 WHERE id IN (1,2,3) Sprog sat til 0 : UPDATE language SET visibility = 0 WHERE id NOT IN (1,2,3) Flg. sprog bliver synlige: Dansk, English, Svensk
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.