marta.e
Goto Top

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)){ )


 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)....

Content-Key: 222627

Url: https://administrator.de/contentid/222627

Printed on: April 19, 2024 at 22:04 o'clock

Member: Dani
Dani Nov 21, 2013 at 14:51:56 (UTC)
Goto Top
Moin,
was möchtest du mit Zeile 4 und 6 bewirken?
Meine PHP-Kenntnisse sind nicht mehr frisch, aber seit wann kann eine POST-Variable ein Array sein?


Grüße,
Dani
Member: marta.e
marta.e Nov 21, 2013 at 14:54:35 (UTC)
Goto Top
Zeile 4: wenn eine Variable nicht gesetzt ist, aber irgendwo steht, kommt ebenfalls eine Warnung, durch ein setzten auf "" umgehst du das.

Zeile 6: seit wann weiss ich nicht, gehen tuts aber ;) im Prinzip ists halt einfach ein Array im (POST-)Array.
Member: Dani
Dani Nov 21, 2013 at 14:58:44 (UTC)
Goto Top
Zeile 6 wird immer zutreffen und darum läuft dein Script in den Fehler.
Member: marta.e
marta.e Nov 21, 2013 at 15:16:34 (UTC)
Goto Top
Zeile 6 wird doch genau 1x aufgerufen, die (foreach- bzw. while)Schleife ist ja IN dem IF, nicht ausserhalb? Und wenn sie eben nicht zutrifft, hat man nichts angehakt (= zum löschen ausgewählt)
Member: Dani
Dani Nov 21, 2013 at 15:40:18 (UTC)
Goto Top
Genau, aber die IF-Anweisung trifft meiner Ansicht immer zu.

Grüße,
Dani
Member: bytecounter
bytecounter Nov 21, 2013 at 17:58:22 (UTC)
Goto Top
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:

$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
Member: marta.e
marta.e Nov 22, 2013 updated at 09:28:41 (UTC)
Goto Top
Könntest du mir deine erste Zeile genauer erklären? Also die Syntax, den Sinn hast du ja bereits erklärt.

Die ID ist der Primary Key der Hilfstabelle user_menu, also immer ein INT-Wert.

Statt:
	            	$sql="SELECT datum FROM user_menu  
	            		  WHERE user_menuID = '$cbID'";  
					$erg=mysql_query($sql);
	            	while($zeile=mysql_fetch_array($erg)){
	            		$datum=$zeile['datum'];  

also so:
	            	$sql="SELECT datum FROM user_menu  
	            		  WHERE user_menuID = '$cbID'  
	            		  LIMIT 1";  
			$erg=mysql_query($sql);
	            	$datum=mysql_fetch_array(['datum']);  

-> klappt noch nicht ganz, $datum ist leer :/

Was spare ich mir durch dein DELETE? Ich muss ja trotzdem 4 Fälle beachten:
1)Datum ist heute, aber nach 8:45,
2)Datum heute und vor 8:45,
3)Datum in der Vergangenheit
4)Datum in der Zukunft

Meines (zugegebenermassen nicht enormen) Wissen über PHP und SQL ist aber eine SQL Abfrage deutlich langsamer als die Überprüfung eines IF, weshalb die jetztige Abfrage doch perfomanter sein sollte? Evtl. habe ich aber auch nicht ganz verstanden, wie du das lösen würdest face-smile
Danke jedenfalls schonmal.
Member: bytecounter
bytecounter Nov 22, 2013 at 14:39:35 (UTC)
Goto Top
Die Sache mit der Performance kann man glaube ich in dem Fall vergessen..oder wieviel Anfragen kommen da pro Sekunde?

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
Member: marta.e
marta.e Nov 23, 2013 at 21:08:12 (UTC)
Goto Top
Ok, mein ursprüngliches Problem besteht jedoch weiterhin: mit while kommt die Warnung, ohne while, dafür mit LIMIT und mysql_fetch_object funktionierts nicht ($datum ist dann leer).
Member: bytecounter
bytecounter Nov 25, 2013 at 14:42:45 (UTC)
Goto Top
Wie schaut denn der Code jetzt aus?

Eine angenehme Woche
Bytecounter
Member: marta.e
marta.e Nov 28, 2013 at 15:09:37 (UTC)
Goto Top
Hi, sorry für die späte Antwort...

 if(isset($_POST['loeschen'])){  
	print_r($_POST);
	$heute=date('Y-m-d'); $t=time(); $uhrzeit = date("H:i",time());  
	$cb = is_array($_POST['cb']) ? $_POST['cb'] : array();  
   
            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'  
	            		  LIMIT 1";  
					$erg=mysql_query($sql);
                        $datum=mysql_fetch_object($erg); 
                        echo $datum;
/*
			//Löschen
			$sql="DELETE FROM user_menu  
			WHERE user_menuID = '$cbID'  
			AND (DATE_ADD($datum, INTERVAL '08:45' HOUR_MINUTE) > NOW())"; 
			$erg=mysql_query($sql);
*/


	            }//if ungleich leer Ende
          }//foreach Ende
		  if ($cbID = '') {  
            //nichts angehakt
            echo "<p><span style='color:red'>Es wurde kein zu löschender Eintrag angegeben!</span></p>";  
        } 
 } //Löschen Ende


Zeile 13 ist eben das Problem:
"Catchable fatal error: Object of class stdClass could not be converted to string"
Member: Dani
Dani Nov 28, 2013 at 21:43:40 (UTC)
Goto Top
Was gibt denn "print_r($_POST); aus?


Grüße,
Dani
Member: bytecounter
bytecounter Nov 29, 2013 at 05:46:25 (UTC)
Goto Top
Hallo,

spontan fallen mir Zeile 4 und 6 in Deinem Code auf:
> 	$cb = is_array($_POST['cb']) ? $_POST['cb'] : array();  
>    
>             foreach ($_POST['cb'] as $cbID) {  
> 

In Zeile 6 muss es daher heißen
foreach ($cb as $cbId) {

vg
Bytecounter