[php] Probleem met checkbox waarden

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het volgende probleem. Ik heb een 4 tal klant waarvan ik per week bijhoud hoe de communicatie verloopt. De opzet is als volgt:
Bijv.
Week 32
klant1 (checkbox) ma (checkbox) di (checkbox) wo (checkbox) do
klant2 (checkbox) ma (checkbox) di (checkbox) wo (checkbox) do
klant3 (checkbox) ma (checkbox) di (checkbox) wo (checkbox) do
klant4 (checkbox) ma (checkbox) di (checkbox) wo (checkbox) do

Nu wil ik dus voor elke klant de aangevinkt dagen opslaan in de database. Dus als voor klant1 ma en do aangevinkt zijn moet die worden opgeslagen. En als voor klant2 di en wo aangevinkt zijn moet hij deze opslaan.
Alle checkboxen hebben een aparte naam voor klant 1 is dit ma,di,wo,do; voor klant2 ma2,di2,wo2,do2 etc...

De volgende code gebruik ik om de waarden op te slaan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if (!$wk == "")
{ 
$klanten = array ("$klant","$klant2","$klant3","$klant4");
    foreach ($klanten as $klant)
    {
    $sql = "INSERT INTO klantwk (id, klant, wk) VALUES ('', '$klant', '$wk')";
    $res = mysql_query($sql); 
        if ($res)
        {
            $dag = array("$ma","$di","$wo","$do");
            foreach ($dag as $wkdag)
            {
            $sql2 = "UPDATE klantwk SET ma='$ma', di='$di',wo='$wo',do='$do' WHERE klant ='$klant' AND wk ='$wk'";
            $res2 = mysql_query($sql2);         
            }
            echo "Dagen toegevoegd!";
            echo "<br>Klik <a href=\"toevoegen.php\">hier</a> om naar het schema te gaan...";
        }
        else
        {
        echo "Klant niet toegevoegd aan schema!";
        echo "<br> Klik <a href=\"javascript:go.back(-1)\">hier</a> om terug te gaan...";
        }
    
    }
}

Ik krijg het niet voor elkaar dat hij per klant de waarden opslaat in de DB.

Ziet iemand waar ik de fout maak??? alvast bedankt ;)

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
$dag = array("$ma","$di","$wo","$do"); 
foreach ($dag as $wkdag) 
            { 
            $sql2 = "UPDATE klantwk SET ma='$ma', di='$di',wo='$wo',do='$do' WHERE klant ='$klant' AND wk ='$wk'";


Je stopt alle dagen in een array en vraagt ze daarna op met de foreach(), ik zie je alleen daarna geen $wkdag[1] etc. gebruiken om die waardes terug te vragen.
Bovendien zie ik geen $ma2, $di2 etc. voor klant2 en hetzelfde geldt voor klant3 en klant4...
Daarnaast is het ophalen van een de gegevens uit een formuliertje met $ma voor een veld dat name="ma" heeft een beetje smerig, vind je zelf ook niet? Je kunt beter $_POST['ma'] gebruiken...

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Zet je html code met de checkboxen hier eens neer. Ik denk dat het je naamgeving is.
Ik heb de code niet bestudeerd op fouten...

Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

Je had register globals inmiddels aangezet? Anders moet je, zoals in je vorige topic (ook) al werd aangegeven eerst $_POST['ma'] enzo beschikbaar maken.

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Begrijp ik goed dat je dus eerst een insert in een tabel doet en indien deze insert goed gaat je dit record dan gaat updaten? Dat is niet bepaald logisch... :?

Kan je niet beter eerst een select doen op klant en dan kijken of er al een record voor deze klant en deze dan te updaten?

Daarnaast zet je een lege string in jouw id, is dit een int met autoincrement? Lijkt me dat dat ook niet helemaal goed gaat.

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is de HTML code voor 1 klant maar deze heb ik herhaald voor de overige klanten.
Register globals staan aan.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<form action="test1.php" method="post">
  <p>Communicatie schema invullen voor:</p>
  <table width="240" border="0">
    <tr>
      <td width="91">Week </td>
      <td width="139"><input name="wk" type="text" id="wk" size="5" maxlength="2"></td>
    </tr>
  </table>
  <table width="240" border="0">
    <tr> 
      <td width="91">Klant</td>
      <td width="33">Ma</td>
      <td width="31">Di</td>
      <td width="30">Wo</td>
      <td width="33">Do</td>
    </tr>
    <tr> 
      <td>Klant 1<input name="klant" type="hidden" id="klant" value="klant1"></td>
      <td><input name="ma" type="checkbox" id="ma" value="1"></td>
      <td><input name="di" type="checkbox" id="di" value="1"></td>
      <td><input name="wo" type="checkbox" id="wo" value="1"></td>
      <td><input name="do" type="checkbox" id="do" value="1"></td>
    </tr>
etc...


Ik wil inderdaad uiteindelijk dat hij gaat kijken of er al een record bestaat voor een klant en deze zonodig updaten maar wilde eerst kijken of ik dit voor elkaar kon krijgen dat hij voor elke klant de dagen van de week invuld...

Acties:
  • 0 Henk 'm!

Verwijderd

Ik denk dat je dit niet zo wilt doen...

Dit is makkelijker:
code:
1
2
3
4
<input type="checkbox" id="chk[1][]" value="ma">
<input type="checkbox" id="chk[1][]" value="di">
...voor de andere dagen net zo...
<input type="hidden" id="chk[1][blaat]" value="BOEM!">


Het laatste (hidden) veld zit er in om te zorgen dat de array ook aangemaakt wordt als er geen checkboxes aangevinkt zijn. In het script wordt deze waarde gewoon genegeerd.

Nu kun je dit parsen als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$alldays = Array("ma", "di", "wo", "do");
foreach ($_POST["chk"] as $klantid => $dagen) {
   $checkdays = array_intersect($dagen, $alldays);
   $missingdays = array_diff($alldays, $checkdays);

   // $checkdays bevat nu de dagen die de klant aangevinkt heeft,
   // $missingdays bevat de dagen die de klant niet aangevinkt heeft
   // ...
   // Doe database updaten hier
   // ...
}

[ Voor 51% gewijzigd door Verwijderd op 02-08-2004 14:39 ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Wat er dus idd fout gaat is dat jij meerdere checkboxen met dezelfde naam/id hebt. Dan kun je niet meer onderscheiden welke "ma" checkbox je bedoeld.

OneOfBorg zal je wel verder geholpen hebben...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb voor de overige klanten gewoon de naam van de checkbox aangepast.
Dus voor klant 2 wordt het ma2,di2,wo2,do2 en voor klant 3 ma3,di3,wo3,do3 etc...
Ik had eerst een constructie op de volgende manier:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$klanten = array ("$klant","$klant2","$klant3","$klant4");
    foreach ($klanten as $klant)
    {
    $sql = "INSERT INTO klantwk (id, klant, wk) VALUES ('', '$klant', '$wk')";
    $res = mysql_query($sql); 
        if ($res)
        {
            $dag = array("$ma","$di","$wo","$do");
            foreach ($dag as $wkdag)
            {
            $sql2 = "UPDATE klantwk SET ma='$ma', di='$di', wo='$wo',do='$do' WHERE klant ='$klant' AND wk ='$wk'";
            $res2 = mysql_query($sql2);
                                                 }
$dag2 = array("$ma2","$di2","$wo2","$do2");
foreach ($dag2 as $wkdag2)
            {
            $sql3= "UPDATE klantwk SET ma='$ma2', di='$di2', wo='$wo2',do='$do2' WHERE klant ='$klant' AND wk ='$wk'";
            $res3 = mysql_query($sql3);
                                                 }
etc....

Op de manier van OneofBorg krijg ik het ook :'( niet voor elkaar
Hoe komt dan de UPDATE query eruit te zien?
PHP:
1
$sql="UPDATE klantwk SET ma='CHK[]'etc..."

[ Voor 38% gewijzigd door Verwijderd op 03-08-2004 10:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat krijg je niet voor elkaar? Komen de gegevens niet goed binnen weet je niet hoe je de query uit moet voeren?

In het laatste geval, voeg deze code aan mijn vorige toe :-

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Deze functie komt bovenaan
// Transformeert een array van de vorm 
//   Array('ma', 'di', wo')
// naar bijvoorbeeld:
//   Array('SET `ma` = 0', 'SET `di` = 0', 'SET `wo` = 0')
function make_sets($ar, $value) {
  return array_map(
    create_function('$a', 'return "SET `$a` = ' . $value . '";'),
    $ar
  );
}


// Deze code komt op de plek die ik in de vorige snippet weg heb gelaten
if (is_numeric($klantid) && is_numeric($wk)) { // Bescherming tegen SQL injection
  $setones = make_sets($checkdays, 1); // Maak de enen
  $setzeroes = make_sets($missingdays, 0); // Maak de nullen

  $setclause = implode(", ", array_merge($setones, $setzeroes));

  if ($setclause) {
    mysql_query("UPDATE klantwk SET $setclause WHERE klant = $klantid AND wk = $wk");
  }
}


edit:
Overigens werkt deze code natuurlijk alleen voor rijen die al bestaan. Ik neem aan dat je zelf wel het toevoegen van nieuwe rijen kan maken, mocht dat nodig zijn. Zoniet, geef dan maar een gil.

[ Voor 28% gewijzigd door Verwijderd op 03-08-2004 10:46 ]


Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Heb je er al eens aan gedacht de queries te printen zodat je ziet wat de queries uiteindelijk worden? :?

Snap overigens nog steeds niet waarom je uberhaupt eerst een insert doet en daarna in dezelfde tabel een update, zou het zelf dus ongeveer op deze manier doen:

Checkboxscherm:
PHP:
1
2
3
4
5
6
7
8
$week = array("ma", "di", "wo", "do");
$klanten = array($klant1, $klant2, $klant3);
foreach($klanten as $klantid) {
  foreach($week as $dag) {
    echo "<input type='checkbox' name='chk[$klantid][$dag]' value='1'>\n";
  }
  echo "<input type='hidden' name='chk[$klantid][BOEM]' value='1'>\n";
}


Uitleesscherm:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$wk = 31;
$chkboxes = $_POST["chk"];
$week = array("ma", "di", "wo", "do");
$klanten = array($klant1, $klant2, $klant3);

foreach($klanten as $klantid) {
  $klantchk = $chkboxes[$klantid];

  foreach($week as $dag) {
    //Als de weekdag niet gezet is, betekent dit dat de checkbox niet aangevinkt
    //is en de waarde dus op 0 gezet moet worden.
    if(!isset($klantchk[$dag])) {
      $klantchk[$dag] = 0;
    }
  }
  //Yay! We kunnen nu veilig een query maken zonder dat een waarde niet bestaat!
  $sql = "SELECT id FROM klantwk WHERE klant='$klantid' and wk='$wk'";
  $res = mysql_query($sql);
  if ($res) {
     if (mysql_num_rows ($res) > 0) {
      //Er bestaat al een record, dus updaten
      $sql="UPDATE klantwk SET ma='".$klantchk["ma"]."' di='".$klantchk["di"]."' ... 
where klant='$klant' and wk='$wk'";
      $res = mysql_query($sql);
    }
    else {
      //Er bestaat nog geen record, dus inserten
      $sql="INSERT INTO klantwk (klant, wk, ma, di, wo, do) 
VALUES ('$klantid', '$wk', '".$klantchk["ma"]."' di='".$klantchk["di"]."' etc)";
      $res = mysql_query($sql);
    }
  }
}


Edit: OneofBorg heeft op zich ook een mooie oplossing

[ Voor 16% gewijzigd door Banpei op 03-08-2004 11:10 ]

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik dacht als ik eerst de klanten insert en vervolgens de dagen update (hij maakt tijdens het inserten van de klant een nieuwe regel aan in de tabel van de DB waarvan de velden ma t/m do leeg blijven) het wel goed zou gaan maar het werkte dus niet.

Heb overigens beide oplossingen geprobeerd. Ze werken alleen volgens mij niet.

Hij geeft geen resultaten in de database.

Zit er soms nog een foutje in? Ik werk met 2 pagina's de ene is het formulier en de waarden laat ik versturen naar een 2e pagina. Op de tweede pagina plaats ik dan de uitleeschermcode... dit werkt helaas niet :'(

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Verwijderd schreef op 03 augustus 2004 @ 11:52:
Ik dacht als ik eerst de klanten insert en vervolgens de dagen update (hij maakt tijdens het inserten van de klant een nieuwe regel aan in de tabel van de DB waarvan de velden ma t/m do leeg blijven) het wel goed zou gaan maar het werkte dus niet.

Heb overigens beide oplossingen geprobeerd. Ze werken alleen volgens mij niet.

Hij geeft geen resultaten in de database.

Zit er soms nog een foutje in? Ik werk met 2 pagina's de ene is het formulier en de waarden laat ik versturen naar een 2e pagina. Op de tweede pagina plaats ik dan de uitleeschermcode... dit werkt helaas niet :'(
Probeer eens wat debugging te doen. Print bijvoorbeeld eens de fouten die terug krijgt van MySQL, en kijk eens wat of al die variabelen wel zo staan als je ze zou verwachten (bijvoorbeeld een print_r op $_POST) oid. Denk dan je dan een stuk verder komt. :/

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 03 augustus 2004 @ 11:52:
Zit er soms nog een foutje in? Ik werk met 2 pagina's de ene is het formulier en de waarden laat ik versturen naar een 2e pagina. Op de tweede pagina plaats ik dan de uitleeschermcode... dit werkt helaas niet :'(
Er zit vast nog wel een foutje in. Ik schrijf al deze code uit mijn hoofd en zonder te testen. De code is er vooral om het globale idee aan te geven. In code schrijft dat veel makkelijker en duidelijker op dan om het met zinnen uit te gaan leggen, en pseudocode schrikt vaak af (want dat werkt toch niet, dus daar heb je toch niks aan?).

Ik probeer je hier een oplossing-strategie aan de hand te doen, waarmee je misschien zelf voorbij het probleem kan komen. Wat ik niet ga doen is jouw script tot in de fijnstje puntjes voor je schrijven. Als je dat wil, kan je me inhuren, maar dan gaat de meter ook lopen. En ik denk dat ik voor meer mensen hier spreek.

Oftewel: duik zelf in het script, kijk wat er gebeurt en waar het mis kan gaan. Ten eeste leer je op die manier meer over de gebruikte techniek achter de oplossing. Van copy/pasten leer je namelijk niks, net als van overschrijven. En ten tweede leer je alleen door het te doen fatsoenlijk debuggen, en als je dat kan, dan kun je grotendeels je eigen problemen oplossen. Mocht het dan nog niet lukken, dan kun je dan altijd nog met een iets geïnformeerdere probleembeschrijving terugkomen, maar aan "het werkt niet" heeft niemand iets...

Succes.

[ Voor 8% gewijzigd door Verwijderd op 03-08-2004 14:29 ]

Pagina: 1