Avatar billede discotk Nybegynder
02. februar 2010 - 12:37 Der 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?

KODEN:

<?php include('../Connections/config.php'); ?>
<?php include(DB_CONNECTION . '/cms.php'); ?>

<form name="test" method="post" action="">
<input type="hidden" name="send" value="1">

<?php
mysql_select_db($database_cms, $cms);
$q = "SELECT * FROM language";
$r = mysql_query($q);

while($row = @mysql_fetch_array($r)){
    echo "<input type=\"checkbox\" ";
    if ($row['visibility'] == 1) { echo "checked=\"yes\" "; } echo "name=\"lang[]\" value=\"". $row['id'] ."\">" . $row['lang'] . "<br />";
}
?>

<INPUT TYPE="hidden" name="resultsPlease" value="Right now">
<INPUT TYPE="submit" name="submit" value="Submit">
</FORM>

<?php
if (isset($_POST['send'])) {
    foreach ($_POST['lang'] as $id) {
        $updateSQL = "UPDATE language SET visibility=1 WHERE id='$id'";
        $querySQL = mysql_query($updateSQL, $cms) or die(mysql_error());
        $updateGoTo = $_SERVER['PHP_SELF'];
        echo "<meta http-equiv=\"refresh\" content=\"0; url=$updateGoTo\">";
    }
}
?>
Avatar billede ruprect Nybegynder
02. februar 2010 - 12:55 #1
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
Avatar billede 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.
Avatar billede discotk Nybegynder
02. februar 2010 - 13:00 #3
nu spørger jeg mega dumt... men kan du give et eksempel?
Avatar billede discotk Nybegynder
02. februar 2010 - 13:01 #4
hvis jeg ikke klikker nogle af... så får jeg nemlig fejl, så du kan godt have ret i at den ikke sender nogle værdi, får følgende:

Warning: Invalid argument supplied for foreach() in check.php on line 24
Avatar billede ruprect Nybegynder
02. februar 2010 - 13:06 #5
@Roxki
Ja, det er korrekt - Den sender kun værdier med hvis den bliver sat

@discotk
Jeg skal se om jeg lige kan køre et eksempel af til dig .. Jeg vender tilbage asap.
Avatar billede Slettet bruger
02. februar 2010 - 13:17 #6
Prøv at tag et kig på følgende test side jeg har lavet

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.
Avatar billede discotk Nybegynder
02. februar 2010 - 13:21 #7
Nej netop... derfor bliver man vel nødt til at lave en funktion der siger NOT IN eller IN, eller lign?
Avatar billede 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å.
Avatar billede ruprect Nybegynder
02. februar 2010 - 13:33 #9
Der vil det nok være lettest at sætte al visibility til off og derefter sætte dem der er on til on.
Avatar billede 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?
Avatar billede discotk Nybegynder
02. februar 2010 - 13:44 #11
ruprect
- Men hvis jeg gør sådan, så kan man jo ikke slå dem fra igen :) hvilket skal være muligt.

roxki
- Ja, det tænkte jeg også lidt på, kan du måske hjælpe mig lidt på vej?
Avatar billede discotk Nybegynder
02. februar 2010 - 13:45 #12
:) undskyld jeg gentager jer, men havde ikke lige fået opdateret
Avatar billede ruprect Nybegynder
02. februar 2010 - 13:51 #13
Hvad med dette her:
http://www.photofolio.dk/test/test.php

Der sætter jeg alt til off, og markerer dem som er on bagefter.

Koden kan ses her:
http://www.photofolio.dk/test/test.php.txt


Ja, jeg ved den giver en fejl når man loader, jeg glemte lige checket om der er sendt noget POST.
Avatar billede showsource Seniormester
02. februar 2010 - 13:53 #14
Her er et ex. på hvordan det kan gøres.
forløkken skal jo blot erstattes af din while()

<form action="" method="post">

<?php

for($i = 1; $i < 8; $i++) {

echo'Checkbox '.$i.' <input type="checkbox" name="sprog['.$i.']"><br />';

}
?>

<input type="submit" value="Vis query" name="opdater">

</form>

<?php

if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE tabel SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $updates = implode(",", $addlang);

    $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;
    }
}

?>
Avatar billede 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! :-)
Avatar billede 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:
while($data = mysql_fetch_object($query)) {

Ændres til:
while($data = mysql_fetch_assoc($query)) {
Avatar billede discotk Nybegynder
02. februar 2010 - 14:11 #17
showsource
- har prøvet følgende...
<?php include('../Connections/config.php'); ?>
<?php include(DB_CONNECTION . '/cms.php'); ?>
<form action="" method="post">

<?php
mysql_select_db($database_cms, $cms);
$q = "SELECT * FROM language";
$r = mysql_query($q);

while($row = @mysql_fetch_array($r)){
    echo "<input type=\"checkbox\" ";
    if ($row['visibility'] == 1) { echo "checked=\"yes\" "; } echo "name=\"sprog[".$row['id']."]\">" . $row['lang'] . "<br />";
}
?>

<input type="submit" value="Vis query" name="opdater">

</form>

<?php

if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE tabel SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $updates = implode(",", $addlang);

    $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;
    }
}

?>

Men dem jeg markerer eller fjerne fra, ændrer sig ikke i databasen :S på trods af at der står (hvis jeg har valgt 1 og 3:

Sprog sat til 1 : UPDATE tabel SET visibility = 1 WHERE id IN (1,3)
Sprog sat til 0 : UPDATE tabel SET visibility = 0 WHERE id NOT IN (1,3)

nogle foreslag
Avatar billede showsource Seniormester
02. februar 2010 - 14:12 #18
Well, prøv at bytte "tabel" i query ud med language :O)
Avatar billede showsource Seniormester
02. februar 2010 - 14:16 #19
Altså:

$sqlstart = "UPDATE tabel SET visibility = ";

skal være

$sqlstart = "UPDATE language SET visibility = ";
Avatar billede showsource Seniormester
02. februar 2010 - 14:20 #20
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"]);
Avatar billede discotk Nybegynder
02. februar 2010 - 14:21 #21
haha hov :) skylder mig selv en stor dummeflad der. Men anyways, det virker stadig ikke :S Der sker ikke noget
Avatar billede showsource Seniormester
02. februar 2010 - 14:25 #22
Hmm, det er utestet, så jeg prøver lige af.
Avatar billede discotk Nybegynder
02. februar 2010 - 14:27 #23
Hele koden...

<?php include('../Connections/config.php'); ?>
<?php include(DB_CONNECTION . '/cms.php'); ?>
<form action="" method="post">

<?php
mysql_select_db($database_cms, $cms);
$q = "SELECT * FROM language";
$r = mysql_query($q);

while($row = @mysql_fetch_array($r)){
    echo "<input type=\"checkbox\" ";
    if ($row['visibility'] == 1) { echo "checked=\"yes\" "; } echo "name=\"sprog[".$row['id']."]\" value=\"" .$row['lang']. "\">" . $row['lang'] . "<br />";
}
?>

<input type="submit" value="Vis query" name="opdater">

</form>

<?php

if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE language SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $updates = implode(",", $addlang);

    $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

Men der sker ikke noget i databasen :S
Avatar billede showsource Seniormester
02. februar 2010 - 14:45 #24
Det her virker fint for mig, men tror nu det er fordi du IKKE afvikler query, blot echo'er post resultat ?


if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE language SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $updates = implode(",", $addlang);

    $sql_one = $sqlstart."1 WHERE id IN (".$updates.")";
    $sql_two = $sqlstart."0 WHERE id NOT IN (".$updates.")";

    echo"Flg. sprog sættes til 1 : ".implode(", ", $_POST["sprog"]);
    mysql_query($sql_one) or die (mysql_error());

    echo"<br />Alle andre sprog er sættes til 0";
    mysql_query($sql_two) or die (mysql_error());
    }else{

    $sql = $sqlstart."0";

    echo"Alle sprog sættes til 0!";
    mysql_query($sql) or die (mysql_error());

    }
}


?>

<p>


<form action="" method="post">

<?php

$hent = mysql_query("SELECT * FROM language") or die (mysql_error());

$check = array(0 => "", 1 => " checked=\"yes\"");

    while($r = mysql_fetch_object($hent)) {

    echo"<input type=\"checkbox\" name=\"sprog[".$r->id."]\"".$check[$r->visibility]." value=\"".$r->lang."\">".$r->lang."<br />\r\n";

    }

mysql_free_result($hent);

?>

<input type="submit" value="Vis query" name="opdater">

</form>
Avatar billede showsource Seniormester
02. februar 2010 - 14:47 #25
Derudover, bør der laves check på hvad$_POST["sprog"] indeholder, så der ikke risikeres en sql-injection
Avatar billede showsource Seniormester
02. februar 2010 - 15:05 #26
Altså:

if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE language SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $langs = array();

        foreach($addlang as $val) {
            if(is_numeric($val)) {
            $langs[] = $val;
            }
        }

        if(empty($langs)) {
        echo"Noget er gået galt!";
        exit;
        }

    $updates = implode(",", $langs);

    $sql_one = $sqlstart."1 WHERE id IN (".$updates.")";
    $sql_two = $sqlstart."0 WHERE id NOT IN (".$updates.")";

    echo"Flg. sprog sættes til 1 : ".implode(", ", $_POST["sprog"]);
    mysql_query($sql_one) or die (mysql_error());

    echo"<br />Alle andre sprog sættes til 0";
    mysql_query($sql_two) or die (mysql_error());

    }else{

    $sql = $sqlstart."0";

    echo"Alle sprog sættes til 0!";
    mysql_query($sql) or die (mysql_error());

    }
}
Avatar billede discotk Nybegynder
02. februar 2010 - 15:07 #27
Yay! Det funker... Det kan jeg sagtens selv sidde og rode med :) tak for hjælpen :) smid et svar
Avatar billede showsource Seniormester
02. februar 2010 - 15:17 #28
ok
Avatar billede discotk Nybegynder
02. februar 2010 - 15:27 #29
og den den samlede og fungerende løsning til andre:

<?php include('../Connections/config.php'); ?>
<?php include(DB_CONNECTION . '/cms.php');
mysql_select_db($database_cms, $cms);

if(isset($_POST["opdater"])) {

$sqlstart = "UPDATE language SET visibility = ";

    if(isset($_POST["sprog"]) && is_array($_POST["sprog"])) {
    $addlang = array_keys($_POST["sprog"]);

    $langs = array();

        foreach($addlang as $val) {
            if(is_numeric($val)) {
            $langs[] = $val;
            }
        }

        if(empty($langs)) {
        echo"Noget er gået galt!";
        exit;
        }

    $updates = implode(",", $langs);

    $sql_one = $sqlstart."1 WHERE id IN (".$updates.")";
    $sql_two = $sqlstart."0 WHERE id NOT IN (".$updates.")";

    echo"Flg. sprog sættes til 1 : ".implode(", ", $_POST["sprog"]);
    mysql_query($sql_one) or die (mysql_error());

    echo"<br />Alle andre sprog sættes til 0";
    mysql_query($sql_two) or die (mysql_error());

    }else{

    $sql = $sqlstart."0";

    echo"Alle sprog sættes til 0!";
    mysql_query($sql) or die (mysql_error());

    }
}


?>

<p>


<form action="" method="post">

<?php

$hent = mysql_query("SELECT * FROM language") or die (mysql_error());

$check = array(0 => "", 1 => " checked=\"yes\"");

    while($r = mysql_fetch_object($hent)) {

    echo"<input type=\"checkbox\" name=\"sprog[".$r->id."]\"".$check[$r->visibility]." value=\"".$r->lang."\">".$r->lang."<br />\r\n";

    }

mysql_free_result($hent);

?>

<input type="submit" value="Vis query" name="opdater">

</form>
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Netcompany A/S

Test Specialist

Ejner Hessel A/S

Tech Lead

Dynamicweb Software A/S

Solution Architect

Udviklings- og Forenklingsstyrelsen

IT-supporter til stort IT-center i Aalborg