Vraag & Antwoord

Webprogrammeren & scripting

PHP verwerken checkbox selecties

10 antwoorden
  • Ik heb een PHP probleem met het overnemen van variablen uit een form. Als er meer checkboxen gebruikt worden als input dan moeten deze in een array komen. Het vreemde is als ik in de afhandelende php script de array uitlees dat niet de selectie wordt uitgelezen zoals ik had verwacht. Ik selecteer checkbox 1,3 en 4. Als ik in de array kij dan zijn element 0,1,2 op waar gezet! Wat doe ik fout? Heeft iemand een werkend goed voorbeeld? Hieronder de scripts voor formulier en voor handler. //------------------ form begin <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Microsoft FrontPage 6.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>Algemeen</title> </head> <body stylesrc="welkom.htm"> <? //include database connectie require("database.php"); //-- haal de nieuws berichten uit de database $sql = "SELECT * FROM laastenieuws WHERE LN_vervallen='N' ORDER BY LN_datum DESC"; //-- via de functie mysql_query() kun je de SQL code //-- die in $sql staat uitvoeren. $res = mysql_query($sql); echo '<p align="center" style="text-align:center"><font size="6"><span style="font-family: Arial">'; echo " Laatste nieuws onderhoud"; echo " </span></font></p>"; //-- kijk via de functie mysql_num_rows() hoeveel //-- rijen er zijn. Deze moet groter of gelijk zijn //-- aan 1. Is dit dat niet, dan zijn er dus geen //-- rijen in de tabel nieuws, en dus ook geen //-- nieuwsberichten. if (mysql_num_rows($res) >= 1) { //-- met de functie mysql_fetch_array() //-- zet je alle resultaten in een array //-- en kun je deze aanroepen (in dit geval) //-- via de variabele $row. Voorbeeld: $row[id] //-- , $row[datum] en $row[titel] in dit geval omdat //-- alleen de kolommen id, titel en datum uit //-- de database worden geselecteerd (zoals //-- je boven kunt zien in de SQL code). //-- loop door de resultaten //maak formulier echo'<form name="laatstenieuws_onderhoud" method="post" action="laatstenieuws_onderhoud_verwerk.php">'; // maak tabel met onzichtbare rand echo '<table border=0 cellspacing="10" cellpadding="10">'; echo '<tr>'; echo '<td align="left">ID</td>'; echo '<td align="left">Datum</td>'; echo '<td align="left">Titel</td>'; echo '<td align="left">Vervallen</td>'; echo '<td align="left">wijzig</td>'; echo '<td align="left">Verwijder</td>'; echo '</tr>'; $regels=0; while ($row = mysql_fetch_array($res)) { //nieuwe tabel regel echo '<tr>'; // ID in tabel echo '<td align="left">'; echo $row[id]; echo '</td>'; // datum in tabel echo '<td align="left">'; echo $row[LN_datum]; echo '</td>'; // titel in tabel echo '<td align="left">'; echo $row[LN_titel]; echo '</td>'; // vervallen in tabel echo '<td align="left">'; echo $row[LN_vervallen]; echo '</td>'; // Wijzig in tabel echo '<td align="left">'; echo 'Wijzig'; echo '</td>'; // delete in tabel echo '<td align="left">'; echo '<td align="left"><input type="checkbox" name="verwijder[]"> </td>'; echo '</td>'; //einde tabel regel echo '</tr>'; $regels++; } //submit knop echo "<tr><td colspan='6' align='left'><input type='submit' name='submit' value='Verzenden' class='Velden'></td> </tr>"; //einde tabel regel echo '</table>'; echo '</form>'; } //-- laat dit dus zien als er geen nieuwsberichten //-- zijn. else { echo 'Er zijn geen nieuwsberichten.'; } ?> </body> </html> //------------------ form eind //------------------ handler begin <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Microsoft FrontPage 6.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>Algemeen</title> </head> <body stylesrc="welkom.htm"> <? //include database connectie require("database.php"); $regel=0; $verwijder=$_POST['verwijder']; if ($verwijder[0]) echo "0 "; if ($verwijder[1]) echo "1 "; if ($verwijder[2]) echo "2 "; if ($verwijder[3]) echo "3 "; if ($verwijder[4]) echo "4 "; // while($regel<5) // { // echo $regel; // echo $verwijder[$regel]; // $regel++; // } ?> </body> </html> //------------------ handler eind
  • Dat gaat wel goed, maar PHP begint te tellen bij 0 dus 0=1 1=2 2=3 Dus eigenlijk klopt je antwoord prima.
  • Antwoord is wat mijn betreft niet goed. als ik 1 3 en 4 selecteer dan verwacht ik: verwijder[0] = true verwijder[1] = false of leeg verwijder[2] = true verwijder[3] = true verwijder[4] = false of leeg Ik krijg: verwijder[0] = true verwijder[1] = true verwijder[2] = true verwijder[3] = false of leeg verwijder[4] = false of leeg Hoe weet ik nu welke regel ik kan verwerken (in dit geval verwijderen)?
  • Dan had ik je vraag niet goed begrepen.. Kan het niet zijn dat die tweede variabele leeg is en dus gewoon wordt opgevuld met de derde? Test dat eens, door een andere waarde in die array te stoppen.
  • Dat is gewoon niet waar. Niet geselecteerde checkboxes zal hij gewoon niet doorgeven. Dus wat ik van jouw code begrijp zal hij inderdaad 0 tm 3 aangegeven. Ikzelf zorg er bijvoorbeeld voor dat ik ipv: [code:1:e1dffba1d8] echo '<td align="left"><input type="checkbox" name="verwijder[]"> </td>'; [/code:1:e1dffba1d8] [code:1:e1dffba1d8] echo '<td align='left'><input type='checkbox' name='verwijder_".$row[id]."'> </td>'; [/code:1:e1dffba1d8] Neem, dan kijk ik gewoon welk ID er verwijderd moet worden, hoef ik niet nog een query te doen welk ID er weg moet.
  • Klinkt logisch. Ga ik straks, thuis, proberen. sjouken bedankt
  • Nog een vraagje. Hoe ziet de parameter er uit in de verwerkende php script Zoiets als verwiijder1 verwiijder3 verwiijder4 Hoe weet ik welke var ik moet nemen? Programmeer al 15 jaar maar php in combi met html heeft toch wat vreemde constructies voor mij. :)
  • ten eerste zou ik eens het volgende doen: [code:1:b3afc8f0da] print_r($_POST); echo"<p>"; [/code:1:b3afc8f0da] Dan zie je al je variabelen In mijn voorbeeld gaf ik: [code:1:b3afc8f0da] 'verwijder_".$row[id] [/code:1:b3afc8f0da] ik vergat alleen om het compleet te maken :( [code:1:b3afc8f0da] echo '<td align='left'><input type='checkbox' name='verwijder_".$row[id]." value = 'verwijder_".$row[id]."'> </td>'; [/code:1:b3afc8f0da] Nu kan je in je script 2 dingen doen :) 1. tijdens het tellen de id's in een array stoppen en deze meesturen als een hidden field en deze later uitkleden 2. tijdens het verwerken van je script kijken of je ID meegekomen is door een query los te laten waardoor je stuk voor stuk kijk of ze bestaan (deze laatste methode heb ik tot voor kort gebruikt en is het simpelste :) Dit laatste kan je doen mbv een $in $ oftewel een string in string (staat uitgelegd in PHP) Ik hoop dat je hier wat aan heb
  • Waarom stop je niet gewoon de waarden die je wil hebben in de value van de checkbox? Daar is-ie immers voor bedoeld. [code:1:405945fe0a] <input type="checkbox" name="verwijder[]" value="1" /> <input type="checkbox" name="verwijder[]" value="2" /> <input type="checkbox" name="verwijder[]" value="3" /> [/code:1:405945fe0a] De aangevinkte waarden kan je dan simpelweg uitlezen in je verwerkende code. tip: als je de waarden dan joined tot een komma-gescheiden string, dan kan je ze weer makkelijk verwijderen uit de database: [code:1:405945fe0a] $sql = "DELETE FROM tabel WHERE idveld IN (" . $kommagescheidenstring . ")"; [/code:1:405945fe0a]
  • Annie, dat laatste doe ik tegenwoordig ook. Alleen geef ik ze geen seperate waardes :wink: Want ik gebruik die variabelen links en rechts en dan is het problematischer om die waarde mee te laten lopen, vandaar dat ik ze later vergelijk op de manier die ik eerder aangaf.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.