Mysql Warning trotz erfolgreicher Ausführung
Hallo,
ich arbeite gerade an einer kleinen Seite, bei der man das Menü bestellen und auch löschen kann. Dazu kann man einfach einen Haken in eine Checkbox (name cb) machen und auf löschen klicken; das Löschen erledigt der untenstehende Code. er funktioniert auch einwandfrei, nur gibt er diese Warnmeldungnach jedem gelöschten Eintrag aus:
"Bestellung vom 2013-11-27 gelöscht!
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\kantine\uebersicht.php on line 39"
(line 39 ist: while($zeile=mysql_fetch_array($erg)){ )
Ich habe mittlerweile stundenlang herumprobiert, ich bekomm die Warnung nicht weg, was mich mittlerweile etwas verzweifeln lässt (vor allem da quasi der idente Code (also nur das SQL, ohne die ganzen IFs) woanders problemlos tut)....
ich arbeite gerade an einer kleinen Seite, bei der man das Menü bestellen und auch löschen kann. Dazu kann man einfach einen Haken in eine Checkbox (name cb) machen und auf löschen klicken; das Löschen erledigt der untenstehende Code. er funktioniert auch einwandfrei, nur gibt er diese Warnmeldungnach jedem gelöschten Eintrag aus:
"Bestellung vom 2013-11-27 gelöscht!
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\kantine\uebersicht.php on line 39"
(line 39 ist: while($zeile=mysql_fetch_array($erg)){ )
if(isset($_POST['loeschen'])){
print_r($_POST);
$heute=date('Y-m-d'); $t=time(); $uhrzeit = date("H:i",time());
if (!isset($_POST['cb'])) $_POST['cb']="";
if (is_array($_POST['cb']) == true) {
foreach ($_POST['cb'] as $cbID) {
if ($cbID != '') {//min. 1 zu löschender Eintrag
//Prüfen, ob es fürs Löschen nicht zu spät ist
$sql="SELECT datum FROM user_menu
WHERE user_menuID = '$cbID'";
$erg=mysql_query($sql);
while($zeile=mysql_fetch_array($erg)){
$datum=$zeile['datum'];
if($datum == $heute){
if($uhrzeit > '08:45'){
echo "<br><span style='color:red'>für heute zu spät.</span>";
}
else {
//Eintrag löschen
$sql="DELETE FROM user_menu
WHERE user_menuID = '$cbID'";
$erg=mysql_query($sql);
echo "<br><span style='color:green'>Bestellung vom $datum gelöscht!</span>";
}
} //datum heute Ende
if($datum > $heute){
//Eintrag löschen
$sql="DELETE FROM user_menu
WHERE user_menuID = '$cbID'";
$erg=mysql_query($sql);
echo "<br><span style='color:green'>Bestellung vom $datum gelöscht!</span>";
}
if($datum < $heute) {
echo "<br><span style='color:red'>Dieser Tag liegt in der Vergangenheit, Zeitreisen sind noch nicht möglich!</span>";
}
}//while Ende
}//if ungleich leer Ende
}//foreach Ende
} else {
//nichts angehakt
echo "<p><span style='color:red'>Es wurde kein zu löschender Eintrag angegeben!</span></p>";
}
} //Löschen Ende
Ich habe mittlerweile stundenlang herumprobiert, ich bekomm die Warnung nicht weg, was mich mittlerweile etwas verzweifeln lässt (vor allem da quasi der idente Code (also nur das SQL, ohne die ganzen IFs) woanders problemlos tut)....
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 222627
Url: https://administrator.de/forum/mysql-warning-trotz-erfolgreicher-ausfuehrung-222627.html
Ausgedruckt am: 12.04.2025 um 02:04 Uhr
13 Kommentare
Neuester Kommentar
Hallo,
irgendwie versteh ich Deine Verarbeitung nicht...
Wenn $_POST['cb'] gesetzt ist, soll/muss/kann/darf es ein Array sein...dann definier das erst einmal so:
Mit diesem Code ersetzt Du zeile 4..damit sparst Du Dir Zeile 6..denn ab jetzt ist $cb immer ein Array, ggf. eben ein leeres. Wenn Du das dann der foreach übergibst, dann durchläuft die jeden einzelnen Eintrag - ist das Array leer, führt er den Foreach-Block eben nicht aus.
Jetzt kommt es darauf an, wie Deine ID ausschaut. Ich geht jetzt mal davon aus, dass es ein INT-Wert ist:
Damit ist sichergestellt, dass Du mySQL einen INT-Wert übergibst.
Des Weiteren suchst Du mit Deiner ID genau einen Wert; Das kannst Du mit einem LIMIT machen und bekommst dann auch nur genau einen Datensatz zurück - das spart Dir die ganzen whle()-Schleifen..
So, dann packst Du das zusammen in die DELETE:
DELETE gibt Dir die Anzahl gelöschter Einträge zurück. Wurde kein Eintrag gelöscht, kann das nur an einer falschen ID oder daran liegen, dass das Datum nicht mehr passt. Du musst allerdings das Datum dann auch MySQL-konform übergeben.
vg
Bytecounter
irgendwie versteh ich Deine Verarbeitung nicht...
Wenn $_POST['cb'] gesetzt ist, soll/muss/kann/darf es ein Array sein...dann definier das erst einmal so:
$cb = is_array($_POST['cb']) ? $_POST['cb'] : array();
Mit diesem Code ersetzt Du zeile 4..damit sparst Du Dir Zeile 6..denn ab jetzt ist $cb immer ein Array, ggf. eben ein leeres. Wenn Du das dann der foreach übergibst, dann durchläuft die jeden einzelnen Eintrag - ist das Array leer, führt er den Foreach-Block eben nicht aus.
Jetzt kommt es darauf an, wie Deine ID ausschaut. Ich geht jetzt mal davon aus, dass es ein INT-Wert ist:
$cbId = (int) $cbId // wenn der Wert als String übergeben wird, in INT umwandeln
Damit ist sichergestellt, dass Du mySQL einen INT-Wert übergibst.
Des Weiteren suchst Du mit Deiner ID genau einen Wert; Das kannst Du mit einem LIMIT machen und bekommst dann auch nur genau einen Datensatz zurück - das spart Dir die ganzen whle()-Schleifen..
So, dann packst Du das zusammen in die DELETE:
$query = "DELETE FROM user_menu WHERE user_menuID = $cbID AND datum > $date"
DELETE gibt Dir die Anzahl gelöschter Einträge zurück. Wurde kein Eintrag gelöscht, kann das nur an einer falschen ID oder daran liegen, dass das Datum nicht mehr passt. Du musst allerdings das Datum dann auch MySQL-konform übergeben.
vg
Bytecounter
Die Sache mit der Performance kann man glaube ich in dem Fall vergessen..oder wieviel Anfragen kommen da pro Sekunde?
Zu dem Datumsprpoblem:
NOW() gibt Dir das aktuelle Datum mit Uhrzeit zurück; und mit DATE_ADD fügst Du dem in Deiner Tabelle hinterlegten Datum die 08:45 zu. Es muss also vor 08:45 sein, ansonsten wir das Menu nicht gelöscht.
vg
Bytecounter
Zu dem Datumsprpoblem:
DELETE FROM user_menu WHERE user_menuID = '$cbID' AND (DATE_ADD(`date`, INTERVAL '08:45' HOUR_MINUTE) > NOW())
NOW() gibt Dir das aktuelle Datum mit Uhrzeit zurück; und mit DATE_ADD fügst Du dem in Deiner Tabelle hinterlegten Datum die 08:45 zu. Es muss also vor 08:45 sein, ansonsten wir das Menu nicht gelöscht.
vg
Bytecounter