Meerdere rijen verwijderen
Ik zit al een tijd met deze vraag, en kom er maar niet uit.
Ik ben bezig met een nieuws systeem voor me zelf, en ik wil in de admin ook meerdere nieuws berichten verwijderen (om alles schoon te houden)
Maar echter lukt me het niet.
Ik gebruik de volgende code (ik maak tevens gebruik van template power)
De html gedeelte
Code (php)
1
2
3
4
5
2
3
4
5
<select name="kies" size="5" multiple="multiple" id="kies">
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
Het php gedeelte
Code (php)
1
2
3
4
5
2
3
4
5
$titel = $_POST['kies'];
mysql_query("DELETE FROM nieuws WHERE id = '".$titel."'") or die(mysql_error());
$tpl->newBlock('goed');
$tpl->assign('SUCCES', 'Met succes verwijdered');
mysql_query("DELETE FROM nieuws WHERE id = '".$titel."'") or die(mysql_error());
$tpl->newBlock('goed');
$tpl->assign('SUCCES', 'Met succes verwijdered');
Ik weet al dat de $_POST['kies']; niet automatisch in een array komt. Echter moet dat wel om de boel te kunnen verwijderen.
DELETE FROM nieuws WHERE id = '".$titel."'"
Die id = hoogstwaarschijnlijk een INT dus de enkele quotes moeten/mogen weg.
Welke quotes bedoel je?
En ik kan dus ook meerdere berichten selecteren, en elke bericht heeft een andere id. En hoe moet ik dat oplossen?
Zo dus:
DELETE FROM nieuws WHERE id = " . $titel
Zolang je selecteert op een id zul je inderdaad alleen enkele records kunnen verwijderen. Als je er meer wilt verwijderen, bijvoorbeeld aan de hand van een array met id's, moet je zoiets doen:
DELETE FROM nieuws WHERE id IN(1,2,3,4,5,6)
waarbij 1,2,3,4,5,6 de waarden uit je array zijn.
En ik heb dus ook IN toegevoegd, en hij verwijderd er maar 1.
Moet ik de post var nog in een array zetten?
Tot nu toe heb ik de volgende query lijn:
mysql_query("DELETE FROM nieuws WHERE id IN(".$titel.")") or die(mysql_error());
Als je een array uit je formulier wilt krijgen, zul je met een multiple select moeten gaan werken, of met een series checkboxen.
Code (php)
1
2
3
4
5
2
3
4
5
<select name="kies" size="5" multiple="multiple" id="kies">
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
Ik doe het al met miltiple select.
En check boxen, nee. Maar ik denk ook tevens dat hier boven staand wel iets fout gaat.
Niet vergeten te controleren hoeveel records er zijn verwijderd!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($_POST['kies'] as $nr) {
$sql = "
DELETE FROM nieuws
WHERE id = " . $nr;
if (mysql_query ($sql)) {
if (mysql_affected_rows () > 0) {
echo 'record met id: ' . $nr . ' is verwijderd';
}
}
else {
trigger_error (mysql_error ());
}
}
}
?>
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($_POST['kies'] as $nr) {
$sql = "
DELETE FROM nieuws
WHERE id = " . $nr;
if (mysql_query ($sql)) {
if (mysql_affected_rows () > 0) {
echo 'record met id: ' . $nr . ' is verwijderd';
}
}
else {
trigger_error (mysql_error ());
}
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
jan foei
$sql = "DELETE FROM nieuws WHERE id = " . $nr;
wes schreef op 06.09.2007 16:17:
$sql = "DELETE FROM nieuws WHERE id = " . $nr . "";
jan foei
$sql = "DELETE FROM nieuws WHERE id = " . $nr;
jan foei
$sql = "DELETE FROM nieuws WHERE id = " . $nr;
Hahaha... (sorry Jan, maar ik moest even lachen)
Het heeft te maken met mijn manier van werken. Bepaalde code snippets zitten onder shortcut keys bij mij en daar hoort buiten quotes halen ook bij. Ik zal hem even verwijderen.
Zo zorg je ervoor dan er altijd een nummer in de query komt.
En niets iets als "0 OR 1=1", wat voor een lege nieuws tabel zorgt.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
hmm, dan toch gewoon over gaan op 1 per keer.
Code (php)
1
2
3
4
5
2
3
4
5
<select name="kies[]" size="5" multiple="multiple" id="kies">
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
<!-- START BLOCK : while_d -->
<option value="{ID}">{VAL}</option>
<!-- END BLOCK : while_d -->
</select>
Nu wordt "kies" verzonden als array. Nu moet het lukken, denk ik.
Dat was de truc. Thanks!
En de query die jij hebt opgesteld, heb je tussen enkele quotes gezet. Dat is zwaar klote, nu kun je alle enkele quotes die je om strings in de SQL moet zetten, gaan escapen.
I.p.v. (int) kun je beter gewoon mysql_real_escape_string() gebruiken en de integer (ja, ook een integer!) tussen enkele quotes zetten. escapen moet een gewoon worden/zijn en het gebruik van quotes kan heel handig zijn wanneer je ook nog wel eens met andere databases werkt. Er zijn er bij die dit eisen, en dit zijn betere databases dan MySQL...
Leesvoer: Prepared statements met PDO.
Quote:
@Martijn: Bij een multiple hoef je geen blokhaken achter de naam te zetten, de browser maakt er zelf al een array van. Dat is juist 1 van de eigenschappen van multiple.
Het werkt voormij en het werkt ook voor Mr. de Jong. De blokhaken horen volgens mij gewoon bij de HTML standaard. Als het zonder ook werkt okee, maar werkt het dan in andere browsers ook?
Quote:
En de query die jij hebt opgesteld, heb je tussen enkele quotes gezet. Dat is zwaar klote, nu kun je alle enkele quotes die je om strings in de SQL moet zetten, gaan escapen.
Nee, dat is een keuze die je maakt. En is voor jou zwaar kloten, voormij niet. Ik werk alleen met quotes als dit ook echt nodig is. En bij een query is dit niet nodig, omdat je geen speciale tekens wilt gebruiken.
Quote:
I.p.v. (int) kun je beter gewoon mysql_real_escape_string() gebruiken en de integer (ja, ook een integer!) tussen enkele quotes zetten. escapen moet een gewoon worden/zijn en het gebruik van quotes kan heel handig zijn wanneer je ook nog wel eens met andere databases werkt. Er zijn er bij die dit eisen, en dit zijn betere databases dan MySQL...
Ik zeg nergens dat ik mysql_real_escape_string() i.p.v. (int) gebruik.
PostGreSQL werkt toch ook met nummers zonder quotes?
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Quote:
Het lijkt me dat je bij het gebruik van een string in een SQL query toch wel degelijk quotes wilt gebruiken?En bij een query is dit niet nodig, omdat je geen speciale tekens wilt gebruiken.
Nee ik heb het over de query string enkele quotes versus quotes.
Dus:
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit