[PHP] Radio button probs

Ik heb een tabel met links, en die links zijn opgedeeld in categoriëen, dus heb ik ook een tabel met categoriëen. Nu laat ik de categoriëen zien met een radio button ervoor, zodat hij kan aangeklikt worden en verwijderd. De afhandeling gebeurt in dezelfde pagina.

Dit is de code voor de de form:

[code:1:6ecbaaab3e]
<form name=“link_categorie_verwijderen” method=“post” action="">
<h4>| Categorie verwijderen </h4>
<?php
$sql = “select * from link_categorie order by id desc”;
$result = mysql_query($sql) or die(“Query is mislukt: “.mysql_error());
if (mysql_num_rows($result) >0) {
while ($qry = mysql_fetch_array($result)) {
echo ‘<p>’.“n”;
echo '<input name=“link_cat_verwijder” type=“radio” value=”$qry[’.‘id’.’]” />’.$qry[‘categorie’].“n”;
echo ‘</p>’.“n”;
}
}
?>
<p>
<input type=“submit” name=“verwijderen” value=“Verwijder” />
</p>
</form>
[/code:1:6ecbaaab3e]

…en dit is de code voor de afhandeling

[code:1:6ecbaaab3e]
elseif (isset($_POST[‘verwijderen’])) {
$cat = $_POST[‘link_cat_verwijder’];
$sql = “delete from link_categorie where id = ‘$cat’”;
$result = mysql_query($sql) or die("Query is mislukt: " .mysql_error() );
}
[/code:1:6ecbaaab3e]

Bij dat laatste gaat het natuurlijk fout, omdat ik niet weet hoe je een radio button kan benaderen met PHP, zodat deze kan aangeklikt worden, en dat dan de record verwijderd wordt uit de database.

[code:1:04d4949885]elseif (isset($_POST['link_cat_verwijder'])) { $cat = $_POST['link_cat_verwijder']; $sql = "delete from link_categorie where id = '". $_POST['link_cat_verwijder'] . "'"'; $result = mysql_query($sql) or die("Query is mislukt: " .mysql_error() ); } [/code:1:04d4949885]

En als je meerdere per keer wilt verwijderen:

[code:1:04d4949885]<input name=“remove” type=“checkbox” value="$qry[’.‘id’.’]" />[/code:1:04d4949885]

En dan

[code:1:04d4949885]foreach ( $_POST[‘remove’] AS $remove ) {
$sql = “delete from link_categorie where id = '” . $remove . “’”’;
$result = mysql_query($sql) or die("Query is mislukt: " .mysql_error() );
} [/code:1:04d4949885]

het is laat, ik weet niet of dit allemaal 100% goed is, maar volgens mij doe ik het altijd zo…

Mijnheer de koekepeer geeft wel het juiste aan (ik handel het zelf weer op een andere manier af, maar dat is niet van belang): Zowel het opbouwen als het afhandelen moet een for/next (of do/while) loop zijn.

Wat belangrijk is, is dat de NAAM van de radiobutton steeds anders is, want het is geen gegroepeerde keuzelijst als ik het goed begrijp. Als de radiobuttions dezelfde naam hebben, dan zijn het keuzemogelijkheden die bij 1 item horen en niet een ja/nee optie voor iedere keuze!

Dus wat ik altijd doe is een standaard naam geven en dan een nummer erachter plakken:

[code:1:ccccf050df]
$q = mysql_query("select * from link_categorie order by id desc") or die(mysql_error());

if ($r = mysql_fetch_array($q)) {
echo ‘<form method=“post” action=“action.php”><table>;
$count = 1;
do {
echo ‘<tr><td>$r[categorie]</td>’;
echo ‘<td><input type=“radio” name="verwijder’.$count.’" value=“Y” />Y&nbsp;<input type=“radio” name=“allowlink’.$count.’” value=“N” />N</td></tr>’;
echo ‘<input type=“hidden” name="id’.$count.’" value="’.$r[id].’" />’;
$count++;
} while ($r = mysql_fetch_array($q));
echo ‘<input type=“hidden” name=“aantal” value="’.–$count.’" />’;
echo '<tr><td colspan=“2”><input type=“submit” /></td></tr></table></form>;
}[/code:1:ccccf050df]

en in de afhandeling lees ik uit het verborgen veld “aantal” het aantal items en verwerk dat in de loop voor de afhandeling:

[code:1:ccccf050df]
$aantal = $_POST["aantal"];

for ($i=1; $i<=$aantal; $i++) {
$id = $_POST["id$i"];
$delete = $_POST["verwijder$i"];
if ($delete == "N") {
mysql_query("DELETE from categorien where id = $id") or die(mysql_error());
}
}[/code:1:ccccf050df]

Je kan allerlei checks inbouwen om het veilig te maken tegen SQL injection e.d. (voordat iemand daar over begint), maar het gaat even om het principe., Ongetwijfeld kan dit allemaal beter en korter gecodeerd worden, dus als een PHP guru op dit forum deze code kan verbeteren, graag :slight_smile:

allereerst denk ik dat je keus voor een radiobutton verkeerd is... een radiobutton hoort in een groep te werken, en niet in een groep waar alleen 1 radiobutton zit.. Als je een radiobutton hebt aangeklikt, dan kun je deze niet meer uitzetten... wat je wilt, is volgens mij een checkbox ipv een radiobutton...

[code:1:612225c2a4] <? // is form al verstuurd -> verwijder rows if (isset($_POST['link_cat_verwijder']) && !empty($_POST['link_cat_verwijder'])) { // even wat makkelijker om mee te werken, minder typewerk $ids = $_POST['link_cat_verwijder'];

$query = 'DELETE FROM link_categorie WHERE id IN &#40;';
foreach&#40;$ids as $id&#41;
&#123;
	$query .= $id.',';
&#125;
$query = substr&#40;$query, 0, -1&#41;; // haal laatste ',' weg
$result = mysql_query&#40;$query&#41; or die&#40;&quot;Query is mislukt&#58; &quot; .mysql_error&#40;&#41;&#41;;

}

// haal na verwijderen (of toevoegen) pas de data op, zodat je altijd de nieuwste data hebt.
// haal alleen data op die je nodig hebt
$query = ‘SELECT id, categorie FROM link_categorie ORDER BY id DESC’;
$result = mysql_query($query) or die("Query is mislukt: ".mysql_error());

// plaats het geheel in een array
while($row = mysql_fetch_assoc($result))
{
$category_links[] = $row;
}

// nadat alle logica is uitgevoerd, gaan we verder met de html, niet eerder…
?>

<form name=“link_categorie_verwijderen” method=“post” action="<? // naam bestand!! ?>">
<h4>| Categorie verwijderen </h4>
<? foreach($category_links as $link) : /* begin loop */ ?>
<p>
<input name=“link_cat_verwijder[]” type=“checkbox” value="<?=$link[‘id’]?>" /><?=$link[‘categorie’]?>
</p>
<p>
<input type=“submit” name=“verwijderen” value=“Verwijder” />
</p>
</form>

[/code:1:612225c2a4]

waarom gaat het nu wel goed?
allereerst heb je nu bij de naam van de checkbox een [] erachter staan… hij maakt er nu een array van, en bij elke checkbox wordt er gewoon een element achteraan in de array bij geplakt… je kan nu een boel tegelijk verwijderen en hoef niet meer per stuk die dingen te verwijderen…
en voor de rest is het wat meer gestructureerd… ik wil je toch aanmoedigen om niet de logica van php door de html heen te gooien…

succes

Misschien was de opgave ietwat onduidelijk, sorry daarvoor. Links worden dus ingedeeld in categoriëen, en om categoriëen toe te voegen, weer te geven en te verwijderen heb ik een aparte pagina (categorie.php).

De functionaliteit ziet er zo uit:


| Categorie toevoegen
_____________________ TOEVOEGEN

[ Categorie verwijderen

(O) Nieuws
(O) Opmerkingen
(O) Aanpassingen

VERWIJDEREN


Je kan dus een categorie ingeven en op toevoegen klikke, of je kan een categorie aanklikken en deze verwijderen. Maar het idee om meerdere categoriëen tegelijkertijd te kunnen verwijderen aan de hand van checkboxes is inderdaad niet slecht.