checkbox delete row in database

Status
Niet open voor verdere reacties.

mvraven

Gebruiker
Lid geworden
16 jul 2009
Berichten
48
Wat ik probeer te maken is dat een aantal rijen tegelijk uit mijn database verwijderd worden die ik geselecteerd heb met een checkbox. Ik probeer het nu maar nu wordt steeds de bovenste verwijderd ipv de geselecteerde. De code om te tonen:

-----
PHP:
        echo '<td width="25px;">';
	echo '<form method="post" name="deleteall" action="delete.php?id='.$id.'"';
	echo '<input type="checkbox" id="dellall" name="deleteall">';
	echo '</td>';
		
	echo '<td width="50px;">';
	echo '<center>[<a href="delete.php?id='.$id.'"><font class="error">delete</font></a>]</center>';
	echo '</td>';
	
		}

}else{
	echo '<tr><td><font class="error">.</font></td></tr>';
	}
?>

</table>
<table>
</tr>	
<tr><td width="800px"></td> <input type="submit"name="submit" value="Delete Selected"></form></td><td width="50px"></td>

De delete.php file bevat het volgende:

PHP:
include_once('../../../configuratie/connect.php');

if(isset($_GET['id']) && ctype_digit($_GET['id'])) {  
$id = mysql_real_escape_string($_GET['id']); 
                
mysql_query("DELETE FROM orders WHERE id = '".$id."' ") or die(mysql_error('Query kon niet worden uitgevoerd.'));

Hoe kan ik het nu voor elkaar krijgen dat er ook precies verwijderd wordt wat ik selecteer en niet de bovenste uit de lijst?
Thnx!
 
Volgensmij is je code niet echt compleet. Wat je moet doen, in elk geval, is je IDs in een array gooien:

HTML:
<input type="checkbox" name="todelete[1]" value="delete" />Optie met id 1.<br />
<input type="checkbox" name="todelete[2]" value="delete" />Optie met id 2.<br />
<input type="checkbox" name="todelete[3]" value="delete" />Optie met id 3.<br />

Vervolgens krijg je in PHP een lijst, en die moet je in je SQL query zetten:

PHP:
$_POST['todelete']; // dit zijn alle IDs die weg moeten
// maak er eerst een  lijst van met komma's ertussen
$lijst = implode( ', ', $_POST['todelete'] );
// voeg dit in een query met een WHERE IN
$query = "DELETE FROM table WHERE id IN (" . $lijst . ")";
// uitvoeren etc.

Pas op; dit is een voorbeeld script ;) Houd rekening met de volgende dingen in je implementatie:

- er zijn nog geen checks of de user de rijen wel mag verwijderen (hij kan ook checkboxen inzenden die niet op je pagina staan!)
- er is geen controle of de ingezonden values wel integer ids zijn, met string gaat ie mis (en die kan een user ook inzenden)
- het werkt niet als er niks geselecteerd is; dan crasht de query
 
Dit gaat iets te ver boven mijn pet uit vliegen.
Kan het wat duidelijker misschien uitgelegd worden zodat ik het misschien ga snappen hahahaha

Thnx!
 
Sure, ik zal het wat uitgebreider uitleggen. Als er hierna nog iets wat je niet begrijpt, vraag het dan gerust.

Ik ga er even vanuit dat je bekend met het begrip Array? Een lijst met variabelen? Het idee is dat je een Array gebruikt om daar alle waarden in te zetten die de gebruiker wil verwijderen; omdat je van tevoren niet weet hoeveel dingen hij weg wil gooien kun je dat namelijk niet gewoon in een variabele zetten.

HTML ondersteunt het idee van arrays, door in het name attribuut haakjes te gebruiken. (Ik zie trouwens dat ik mijn vorige voorbeeld niet helemaal goed heb gedaan, zal dat gelijk verbeteren hier)

Als ik zeg:
HTML:
<input type="checkbox" name="blaat" value="3" />

Dan krijg ik in mijn formulier een checkbox; dat weet je als het goed is. Als de gebruiker deze checkbox heeft aangevinkt voor hij het formulier verzond, dan wordt in PHP een variabele aangemaakt om die op te vangen, dat ken je als het goed is ook.
Die variabele is $_POST['blaat'], omdat de checkbox "blaat" heet, en de waarde is 3.

Wat we nu gaan doen, is een lijst bijhouden met ingevulde checkboxen. Hiervoor geven we ze allemaal dezelfde naam, maar we voegen haakjes toe om aan te geven dat al deze checkboxen onderdeel zijn van een lijst, en dat PHP dus alle values achter elkaar in een lijst moet zetten.

Dit werkt zo:
HTML:
<input type="checkbox" name="blaat[]" value="1" />
<input type="checkbox" name="blaat[]" value="2" />

Nu krijg je in PHP ipv een getal in $_POST['blaat'], daarin een nieuwe array. Deze array bevat alle waarden die de gebruiker geselecteerd heeft (in het voorbeeld geval dus 1 en/of 2) Deze waarden geven aan welke IDs de gebruiker wil verwijderen, en je moet dus een query maken die ze weghaalt.

Dat kan op twee manieren; je kunt er overheen lopen en een voor een elk ID weghalen:

PHP:
$lijst_om_te_verwijderen = $_POST['blaat']; // haal de lijst met getallen op

foreach( $lijst_om_te_verwijderen as $id ) {
  // loop over elk ID, en verwijder het
  $query = "DELETE FROM tabel WHERE id = " . (int) $id;
  mysql_query( $query );
}

Het alternatief is om ze allemaal in 1x weg te gooien met een IN query. Die ziet er zo uit:

[sql]
DELETE FROM tabel WHERE id IN ( 1, 2, 3, 4 )
[/sql]

Deze query verwijderd elke rij waarvan het id in de opgegeven lijst voorkomt. Hiervoor moeten we eerst een rij met ids opbouwen. Dat kun je doen met de php functie Implode, die neemt een lijst en plakt alle elementen daarvan achter elkaar.

PHP:
$lijst = array( 1, 2, 3, 4 );
$rij = implode( ', ', $lijst ); // $rij = "1, 2, 3, 4";

Daarmee kun je de query in het voorbeeld opbouwen, op deze manier:

PHP:
$rij = implode( ', ', $_POST['blaat'] );
$query = "DELETE FROM tabel WHERE id IN ( " . $rij . " ) ";
mysql_query( $query );

Nu worden alle rijen in 1x verwijderd. Je zult voor jezelf wat betere namen moeten kiezen dan "blaat", maar verder is het idee hetzelfde als het goed is.

Helpt dit?
 
Zo das een hele uitleg haha. Thnx. Ik begrijp het nu iets meer maar....

Je zegt dat je elke checkbox een value moet geven. Maar ik weet niet hoeveel checkboxen ik heb want er komen er steeds wat bij en er gaan er steeds wat af. Elke keer als ik via het systeem iets toevoeg dan wordt er een nieuw ID aan gegeven en deze heeft zijn eigen checkbox.

Even verwijzen naar mijn eerste berich: Hier geef ik aan dat er achter de row een checkbox gezet moet worden. (Let niet op de inhoud want die klopt dus nog niet).
echo '<form method="post" name="deleteall" action="delete.php?id='.$id.'"';
echo '<input type="checkbox" id="dellall" name="deleteall">';
echo '</td>';

Dus hoe kan ik er dan automatisch een value aan die checkbox geven die bij die ID hoort?
 
Jij beheerst de HTML, dus die kun je zelf toewijzen.

PHP:
echo '<input type="checkbox" name="to_delete[]" value="'. $id . '" />";

Als je dat in een loop zet en $id iedere keer veranderd, werkt dat perfect.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan