Warnmeldung: "not a valid MySQL result resource"
Yadgar
- php
High!
Ich bin immer noch mit der Programmierung einer komfortablen Eingabemaske für eine Musikdatenbank (demnächst unter www.bergisch-afghanistan.de) beschäftigt... gegenwärtig geht es um die Tabelle "person_kuenstlername", die neben ihrer eigenen laufenden Eintragsnummer als Primärschlüssel die laufenden Eintragsnummern der Tabellen "personen" und "kuenstlernamen" enthält.
Wenn ich jetzt nach Prüfung der übergebenen Formulardaten (zwei Auswahlmenüs mit den Klartextformen der jeweiligen bürgerlichen Namen und Künstlernamen) per SELECT-Abfrage die zu den Namen passenden Eintragsnummern (IDs) ermitteln lasse, erscheint folgende Warnmeldung:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\htdocs\rockodata\person_kuenstlername.php on line 105
Trotzdem werden die beiden Eintragsnummern korrekt in "person_kuenstlername" eingetragen, wie ich mich mittels PHPMyAdmin überzeugen konnte.
Der fragliche PHP-Code sieht so aus:
$query = "SELECT personen.ID, kuenstlernamen.ID from personen, kuenstlernamen WHERE personen.Vorname = '".mysql_real_escape_string($PersonVorname)."' AND personen.Nachname = '".mysql_real_escape_string($PersonNachname)."' AND Kuenstlername_Vorname = '".mysql_real_escape_string($KuenstlernameVorname)."' AND Kuenstlername_Nachname = '".mysql_real_escape_string($KuenstlernameNachname)."'";
$result=mysql_query($query);
var_dump($result);
echo "<br>";
dberror();
Der var_dump von $result ergibt folgende Meldung:
resource(8) of type (mysql result)
...scheint also wohl doch einwandfrei zu sein.
Wenn ich die SELECT-Abfrage mit konkreten Werten in PHPMyAdmin ausprobiere:
SELECT personen.ID, kuenstlernamen.ID from personen, kuenstlernamen WHERE personen.Vorname = 'Lawrence Roger' AND personen.Nachname = 'Fast' AND Kuenstlername_Vorname = 'Larry' AND Kuenstlername_Nachname = 'Fast';
erscheint keine Warnung, die IDs werden korrekt übergeben (und anschließend in die Tabelle eingetragen).
Gibt es eine Möglichkeit (außer @ vor mysql_fetch_row()), diese Warnung zu vermeiden - oder kann ich sie getrost ignorieren?
Bis bald im Khyberspace!
Yadgar
Hi,
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Zeig uns bitte, dass du auch in der Lage bist, etwas dazu zu erlernen, und dass wir dir nicht jeden trivialen Kleinkram immer wieder erneute beibringen müssen!
</archiv/2008/4/t170336/>
MfG ChrisB
Hi,
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Zeig uns bitte, dass du auch in der Lage bist, etwas dazu zu erlernen, und dass wir dir nicht jeden trivialen Kleinkram immer wieder erneute beibringen müssen!
</archiv/2008/4/t170336/>
OK, ich sehe, ansatzweise hast du schon Debugging betrieben, in dem du dir den Datentyp des Ergebnisses angeschaut hast.
Wo du auf dieses zugreifst, hast du uns aber nicht gezeigt.
MfG ChrisB
High!
<!-- hier fehlt ein <Ingrid> -->
Hi,
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Zeig uns bitte, dass du auch in der Lage bist, etwas dazu zu erlernen, und dass wir dir nicht jeden trivialen Kleinkram immer wieder erneute beibringen müssen!
</archiv/2008/4/t170336/>
<!-- hier fehlt ein </Ingrid> -->
OK, ich sehe, ansatzweise hast du schon Debugging betrieben, in dem du dir den Datentyp des Ergebnisses angeschaut hast.
Wo du auf dieses zugreifst, hast du uns aber nicht gezeigt.
Die vollständige Routine sieht so aus:
$query = "SELECT personen.ID, kuenstlernamen.ID from personen, kuenstlernamen WHERE personen.Vorname = '".mysql_real_escape_string($PersonVorname)."' AND personen.Nachname = '".mysql_real_escape_string($PersonNachname)."' AND Kuenstlername_Vorname = '".mysql_real_escape_string($KuenstlernameVorname)."' AND Kuenstlername_Nachname = '".mysql_real_escape_string($KuenstlernameNachname)."'";
$result=mysql_query($query);
var_dump($result);
echo "<br>";
dberror();
while ($row = mysql_fetch_row($result)) // nur 1 Ausgabezeile!
{
dberror();
$query = "INSERT INTO person_kuenstlername (Person, Kuenstlername) VALUES ('".mysql_real_escape_string($row[0])."','".mysql_real_escape_string($row[1])."')";
$result = mysql_query($query);
dberror();
}
echo "Ihre Eingabe war korrekt und wurde in die Datenbank eingetragen!";
dberror() ist eine selbstgeschriebene Funktion mit folgendem Code:
function dberror()
{
if (mysql_errno())
{
die ("<br>".mysql_errno().": ".mysql_error()."<br>");
}
}
Bis bald im Khyberspace!
Yadgar
Hi,
$result=mysql_query($query);
var_dump($result);
echo "<br>";
dberror();
while ($row = mysql_fetch_row($result)) // nur 1 Ausgabezeile!
Was soll der Kommentar bedeuten - dass es garantiert nur maximal einen Datensatz im Abfrageergebnis geben wird?
Warum benutzt du dann überhaupt eine Schleife für die Verarbeitung?
> ~~~php
{
> dberror();
> $query = "INSERT INTO person_kuenstlername (Person, Kuenstlername) VALUES ('".mysql_real_escape_string($row[0])."','".mysql_real_escape_string($row[1])."')";
> $result = mysql_query($query);
> dberror();
> }
Hier überschreibst du dir $result wieder.
MfG ChrisB
High!
{
dberror();
$query = "INSERT INTO person_kuenstlername (Person, Kuenstlername) VALUES ('".mysql_real_escape_string($row[0])."','".mysql_real_escape_string($row[1])."')";
$result = mysql_query($query);
dberror();
}
>
> Hier überschreibst du dir $result wieder.
...was kein Problem ist, da ich ja vorher schon $row[0] und $row[1] aus dem alten $result extrahiert habe und dann in der INSERT-Abfrage verwende! Das würde aber auch nicht die Warnmeldung erklären, denn mit "line 105" ist eindeutig die SELECT-Abfrage (genauer, die Zuweisung dieser Abfrage zur Stringvariable $query) gemeint...
Was mache ich denn jetzt mit der Warnung? Wie gesagt, für PHPMyAdmin ist besagter Query-String kein Problem...
Bis bald im Khyberspace!
Yadgar
Hallo Yadgar,
Hier überschreibst du dir $result wieder.
...was kein Problem ist, da ich ja vorher schon $row[0] und $row[1] aus dem alten $result extrahiert habe und dann in der INSERT-Abfrage verwende!
Du hast die Daten die das SELECT geliefert hat, ja - aber die Schleife wird ja nicht abgebrochen und mysql_fetch_row() versucht im nächsten Durchlauf dann mit deinem überschriebenen Wert Daten zu holen was eben schief geht. Warum lässt du die Schleife nicht einfach weg wenn es sowieso nur einen Datensatz gibt?
Das würde aber auch nicht die Warnmeldung erklären, denn mit "line 105" ist eindeutig die SELECT-Abfrage (genauer, die Zuweisung dieser Abfrage zur Stringvariable $query) gemeint...
Das die Fehlermeldung in der Zeile in der der Query der Variablen $query zugewiesen wird auftritt halte ich für ein Gerücht ...
Gruß,
Tobias
High!
Du hast die Daten die das SELECT geliefert hat, ja - aber die Schleife wird ja nicht abgebrochen und mysql_fetch_row() versucht im nächsten Durchlauf dann mit deinem überschriebenen Wert Daten zu holen was eben schief geht. Warum lässt du die Schleife nicht einfach weg wenn es sowieso nur einen Datensatz gibt?
Stimmt, da war ich übervorsichtig - vorher hatte ich ja schon sichergestellt, dass identische ID-Kombinationen nicht eingetragen werden, sondern stattdessen eine Fehlermeldung "Eintrag mit diesen Daten existiert bereits" ausgegeben wird! Danke für den Tipp!
Nur... in anderen Tabellen arbeite ich genauso und bekomme keine Warnmeldung!
Bis bald im Khyberspace!
Yadgar
hi,
Nur... in anderen Tabellen arbeite ich genauso und bekomme keine Warnmeldung!
Guck dir die Datentypen an. Wenn du ohne mysql_real_escape_string() codest, wird im Statement ein varchar mit f='$string' und ein integer mit f=$number notiert. Verwendest Du jedoch mysql_real_escape_string($string) erzeugt Dein einfaches Hochkomma eine Warnmeldung im dem Fall, wenn der Datentyp varchar ist. Lass das eigene Quoten weg, dann gibts auch keine Warnung.
Hotti
Hi!
Guck dir die Datentypen an. Wenn du ohne mysql_real_escape_string() codest, wird im Statement ein varchar mit f='$string' und ein integer mit f=$number notiert. Verwendest Du jedoch mysql_real_escape_string($string) erzeugt Dein einfaches Hochkomma eine Warnmeldung im dem Fall, wenn der Datentyp varchar ist. Lass das eigene Quoten weg, dann gibts auch keine Warnung.
Erzähl bitte keinen Unsinn. Yadgar hat es schon schwer, fachlich korrekte Aussagen zu verstehen, da musst du ihn nicht noch mit solchem Zeug in die Irre führen. Die Ursache des Problems ist nicht, dass im Falle der Person.ID Zahlenwerte in Hochkomma notiert wurden. Damit hat MySQL auch überhaupt kein Problem und erzeugt auch keine Warnung. Die fragliche Warnung ist eine, die PHP erzeugt, weil bei einem Funktionsaufruf ein nicht erwartetet Parametertyp übergeben wurde. Sie kommt nicht von MySQL. Die Ursache ist ein falscher Aufbau des PHP-Codes.
INSERT INTO table (int_feld) VALUES ('42')
wird klaglos von MySQL verarbeitet, weil es selbständig eine Typumwandlung vornimmt. Die muss es übrigens auch ohne Hochkomma vornehmen, weil die 42 im SQL-Statement auch nur ein String ist.
Natürlich ist es nicht korrekt, Zahlen in Hochkomms zu notieren, aber wie gesagt, zumindest beim einfachen INSERT ist das problemlos verwendbar. Besser wäre es: Zahlen im (My)SQL-Statement.
Lo!
Hi,
Hier überschreibst du dir $result wieder.
...was kein Problem ist, da ich ja vorher schon $row[0] und $row[1] aus dem alten $result extrahiert habe und dann in der INSERT-Abfrage verwende!
Da du aber unsinnigerweise eine Schleife verwendet hast, muss diese mit dem aktuellen $result weiter arbeiten, um zu entscheiden, ob sie noch einen weiteren Durchlauf macht.
Das würde aber auch nicht die Warnmeldung erklären, denn mit "line 105" ist eindeutig die SELECT-Abfrage (genauer, die Zuweisung dieser Abfrage zur Stringvariable $query) gemeint...
Das ist nahezu unmöglich.
Dass du nicht richtig geschaut hast, welche Zeile tatsächlich #105 ist, ist sehr viel wahrscheinlicher ...
Was mache ich denn jetzt mit der Warnung?
Du behebst ihre Ursache.
MfG ChrisB
Hi there,
Was mache ich denn jetzt mit der Warnung?
Einer der wichtigsten Sätze aus dem Leitfaden für den angehenden Programmierer:
"Be clever, ignore warnings!"...
Hi,
while ($row = mysql_fetch_row($result)) // nur 1 Ausgabezeile!
Wenn der Interpreter zum ersten Mal hier vorbeikommt, ist $result an dieser Stelle eine resource (falls der SELECT gut gegangen ist).
$result = mysql_query($query);
Hier wird $result auf true oder false gesetzt (abhängig davon, ob der INSERT klappt oder nicht).
Jetzt kommt der Interpreter wieder bei
while ($row = mysql_fetch_row($result)) // nur 1 Ausgabezeile!
vorbei. Bei der Prüfung wird jetzt mysql_fetch_row(true) oder mysql_fetch_row(false) aufgerufen - aber weder true noch false ist eine resource. Daher die Fehlermeldung.
cu,
Andreas
hi,
Der fragliche PHP-Code sieht so aus:
'".mysql_real_escape_string($PersonNachname)."'
Ja, was denn nun, möchtest Du selbst quoten oder das Quoten der Funktion mysql_real_escape_string() überlassen?
Überlasse das Quoten der Funktion o.g.
Hotti
Hi,
Der fragliche PHP-Code sieht so aus:
'".mysql_real_escape_string($PersonNachname)."'Ja, was denn nun, möchtest Du selbst quoten oder das Quoten der Funktion mysql_real_escape_string() überlassen?
Überlasse das Quoten der Funktion o.g.
Und du erzähl' bitte nicht schon wieder Quark.
Wenn du nicht weißt, was die Funktion macht, lese es bitte im Handbuch nach.
MfG ChrisB
[latex]Mae govannen![/latex]
Und du erzähl' bitte nicht schon wieder Quark.
Wenn du nicht weißt, was die Funktion macht, lese es bitte im Handbuch nach.
/me wartet jetzt auf die obligatorisch "lustige" Antwort, die wie üblich mit keinem Wort auf das Problem eingehen wird...
Stur lächeln und winken, Männer!
Kai
[latex]Mae govannen![/latex]
Und du erzähl' bitte nicht schon wieder Quark.
Wenn du nicht weißt, was die Funktion macht, lese es bitte im Handbuch nach./me wartet jetzt auf die obligatorisch "lustige" Antwort, die wie üblich mit keinem Wort auf das Problem eingehen wird...
Das fällt mir echt schwer, bei den Missverständnissen, die es hierzu gibt, was mysql_real_escape_string() eigentlich wirklich macht. Es mag für MySQL genügen, unsicheren Zeichen einen Backslash voranzustellen was sich Escape nennt. Es gibt jedoch noch andere RDBMS und andere Programmiersprachen, da wird das als Quoten bezeichnet, weil es eben mehr ist, als nur ein Escape.
Im Übrigen ist die genannte Warnmeldung im hiesigen Forumsarchiv beschrieben, da steht auch, wie die vermieden werden kann.
Schönen Sonntag,
Hotti
Hi,
Das fällt mir echt schwer, bei den Missverständnissen, die es hierzu gibt, was mysql_real_escape_string() eigentlich wirklich macht.
Was soll es da für „Missverständnisse“ geben?
Was die Funktion macht, steht ganz klar im Handbuch beschrieben.
Es mag für MySQL genügen, unsicheren Zeichen einen Backslash voranzustellen was sich Escape nennt. Es gibt jedoch noch andere RDBMS und andere Programmiersprachen, da wird das als Quoten bezeichnet, weil es eben mehr ist, als nur ein Escape.
Mag durchaus sein, hat aber für die Thematik dieses Threads keinerlei Relevanz.
Also mal wieder der übliche, bereits bekannte Ablauf, wie von Kai prognostiziert: Hotti hat Unfug gelabert, gefolgt von Hotti weicht auf irrelevante Nebenschauplätze aus. Dampfplauderer as usual.
Im Übrigen ist die genannte Warnmeldung im hiesigen Forumsarchiv beschrieben, da steht auch, wie die vermieden werden kann.
Wieder mal keine Ahnung bewiesen, aber noch schnell einen Allgemeinplatz-Klugschiss hinter geschmissen. Bravo, Hotti.
MfG ChrisB
Hallo,
Es mag für MySQL genügen, unsicheren Zeichen einen Backslash voranzustellen was sich Escape nennt. Es gibt jedoch noch andere RDBMS und andere Programmiersprachen, da wird das als Quoten bezeichnet, weil es eben mehr ist, als nur ein Escape.
hurra, da ist sie ja, die obligatorisch "lustige" Antwort!
Ciao,
Martin
Hi!
Das fällt mir echt schwer, bei den Missverständnissen, die es hierzu gibt, was mysql_real_escape_string() eigentlich wirklich macht. Es mag für MySQL genügen, unsicheren Zeichen einen Backslash voranzustellen was sich Escape nennt.
Diese Zeichen sind nicht unsicher, sie haben lediglich eine syntaktische Bedeutung, wenn sie nicht maskiert sind.
Es gibt jedoch noch andere RDBMS und andere Programmiersprachen, da wird das als Quoten bezeichnet, weil es eben mehr ist, als nur ein Escape.
Jedes System und jeder, das/der es richtig macht, unterschiedet zwischen Quotieren und Escapen. To quote heißt (für diesen Fall) in Anführungszeichen setzen. Maskieren/escapen ist der Vorgang, wenn den Zeichen "eine Maske aufgesetzt" wird. Sie werden mit Hilfe eines weiteren Zeichens oder einer bestimmten Zeichensequenz (wie bei HTML-/XML-eigenen Zeichen) vor dem Parser versteckt, der sie daraufhin als Datenbestandteil und nicht als Zeichen mit syntaktischer Bedeutung behandelt.
Lo!
Hi!
Der fragliche PHP-Code sieht so aus:
'".mysql_real_escape_string($PersonNachname)."'
Und der ist soweit richtig.
Ja, was denn nun, möchtest Du selbst quoten oder das Quoten der Funktion mysql_real_escape_string() überlassen?
Sie quotet nicht, sie escapt nur - wie ihr Name sagt.
Überlasse das Quoten der Funktion o.g.
Diese Funktionalität bietet sie nicht.
Lo!