Warning: mysql_fetch_array(): supplied argument is not a ...
pc-world
- php
0 Cheatah1 Vinzenz Mai
Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...
Ich habe schon im Internet nach diesem Problem gesucht und auch schon ein bisschen rumprobiert, was allerdings bis jetzt noch nichts genützt hat.
Hier mein Code:
<?php
include "mysqlconfig.inc.php"; //MySQL-Login sowie DB-Auswahl
//Variablen-Sicherheit
$res = mysql_query("select max(id) AS max from ".$tableforen);
$row = mysql_fetch_array($res);
$maxForumId = $row["max"];
if(isset($_GET['fid']) && $_GET['fid'] > 0 && $_GET['fid'] < ($maxForumId + 1) ) { $fid = mysql_real_escape_string(htmlentities($_GET['fid'],ENT_QUOTES)); } else { echo 'Keine Forums-ID empfangen oder die Forums-ID existiert nicht.'; exit; }
$res = mysql_query("select max(id) AS max from ".$tablethreads);
$row = mysql_fetch_array($res);
$maxThreadId = $row["max"];
if(isset($_GET['tid']) && $_GET['tid'] > 0 && $_GET['tid'] < ($maxThreadId + 1) ) { $tid = mysql_real_escape_string(htmlentities($_GET['tid'],ENT_QUOTES)); } else { echo 'Keine Thread-ID empfangen oder die Thread-ID existiert nicht.'; exit; }
//Lesen aus DB
$topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'");
$topic = mysql_fetch_array($topic);
$topic = $topic['topic'];
echo '<h1>'.$topic.'</h1><br><br>';
$res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);
//ausgeben
while($row = mysql_fetch_array($res)) {
$text = nl2br($row["text"]);
echo '<fieldset>
<legend>'.$row["user"].'schrieb:</legend>'.
$text.'</p>';
}
?>
Hi,
Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...
Dein SQL-Statement ist ungültig. Ich wittere darin aber ein absolut unglaublich kritisch schwerwiegendes Mega-Problem:
$res = mysql_query("select max(id) AS max from ".$tableforen);
Falls es sich bei der Spalte "id" um eine ID-Spalte handelt: Was zur Hölle interessiert Dich dessen Maximalwert? Der hat für Dich keinerlei Nutzen.
$res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);
Desweiteren ist das Selektieren von "*" außerhalb von Tests widersinnig.
Cheatah
Dein SQL-Statement ist ungültig. Ich wittere darin aber ein absolut unglaublich kritisch schwerwiegendes Mega-Problem:
$res = mysql_query("select max(id) AS max from ".$tableforen);
Falls es sich bei der Spalte "id" um eine ID-Spalte handelt: Was zur Hölle interessiert Dich dessen Maximalwert? Der hat für Dich keinerlei Nutzen.
Ich möchte überprüfen, ob es überhaupt die ID gibt, die mir in der URL geliefert wird.
Aber was sollte dort das Problem sein?
Hi,
Ich möchte überprüfen, ob es überhaupt die ID gibt, die mir in der URL geliefert wird.
und was hat das mit der maximalen ID zu tun?
Aber was sollte dort das Problem sein?
Du scheinst in der ID irgend eine Information zu sehen, die dort nicht existieren *darf*. Ich habe nicht den geringsten Zweifel, dass dies kurz- bis mittelfristig bei Dir zu Problemen führt, die ggf. irreversibel sind.
Cheatah
und was hat das mit der maximalen ID zu tun?
Weil es keine höhere gibt...
Ich hab die Zeilen ja jetzt gelöscht...
Hab jetzt rausbekommen, welche Zeile den Fehler verursacht:
$sql = "SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'";
Dann entsteht z. B. folgender Befehl:
SELECT * FROM 'MeineTabelle' WHERE id='5'
Die MySQL-Fehlermeldung:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''MeineTabelle' WHERE id='5'' at line 1
Vermutlich liegt es wirklich an der Spalte id, ich schau gleich mal...
So, hier meine Tabelle $tablethreads :-)
Kann mir jemand sagen, ob da id steht, ansonten bin ich blind...
echo $begrüßung;
SELECT * FROM 'MeineTabelle' WHERE id='5'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''MeineTabelle' WHERE id='5'' at line 1
Vermutlich liegt es wirklich an der Spalte id, ich schau gleich mal...
Nein, es liegt am Anfang der zitierten Stelle. Der Rest ist einfach nur eine Fortsetzung deines Statements. Das Kapitel Language Structure klärt dich über die Formalitäten der MySQL-Syntax auf. Ein String ist kein Tabellen-Identifizierer.
echo "$verabschiedung $name";
Ein String ist kein Tabellen-Identifizierer.
Hab jetzt die Zeile so abgeändert:
$sql = "SELECT * FROM '".$tablethreads."' WHERE id=".$tid;
Du meintest doch, dass die ' wegmüssen, oder?
Jetzt sieht die Variable $sql z. B. so aus:
SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5
Es kommt immer noch die gleiche Fehlermeldung.
echo $begrüßung;
Du meintest doch, dass die ' wegmüssen, oder?
Jetzt sieht die Variable $sql z. B. so aus:
SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5Es kommt immer noch die gleiche Fehlermeldung.
Dann sag ich es dir mochmal deutlicher: Es geht _nicht_ um die id. Die bemängelte Stelle ist am Anfang der in der Fehlermeldung zitierten Stelle deines Statements zu finden, also der Tabellenname.
echo "$verabschiedung $name";
Die bemängelte Stelle ist am Anfang der in der Fehlermeldung zitierten Stelle deines Statements zu finden, also der Tabellenname.
Danke! Jetzt geht alles perfekt.
Hello,
Hab jetzt die Zeile so abgeändert:
$sql = "SELECT * FROM '".$tablethreads."' WHERE id=".$tid;
Du meintest doch, dass die ' wegmüssen, oder?
Jetzt sieht die Variable $sql z. B. so aus:
SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5
Damit das hier nicht halbgar stehen bleibt, auch wenn pc-world inzwischen den fehler gefunden zu haben scheint:
~~~php
$sql = "SELECT $columnlist FROM $tablethreads
WHERE id=".intval($tid);
sollte nicht schädlich sein für MySQL.
Anstelle von einfachen Hochkommata für den Tabellenbezeichner sind "Backticks" zu verwenden, wenn man die eben überhaupt setzen will (siehe übrige Diskussionen zum Thema in anderen aktuellen Threads).
Und die \_numerische\_ ID, die irgendwie "von außen" kommt, auch als numerische Größe zu übergeben, ist positiv zu gunsten der Sicherheit. Dafür sollte dann aber die 0 als ID nicht zulässig, bzw. den "neutralen Wert" darstellen.
Anderenfalls müsste man hier die vorgesehene Escape-Funktion verwenden (mysql\_real\_escape\_string()).
Ich bin jetzt davon ausgegangen, dass der Tabellenname \_nicht\_ von außen geliefert wird!
Und die Verwendung des \* für die Spaltenliste sollte auch unterbleiben, sondern stattdessen eine dedizierte Liste von Spaltennamen übergeben werden, die ihrerseits dann wieder
~~~php
$columnlist = "`vorname`, `nachname`, `plz`, `index`";
lauten könnte...
Ich habe hier absichtlich eine Spalte (index) mit einem reservierten Wort benutzt, da MySQL dies nun einmal erlaubt und ich daher der Meinung bin, dass man genau deshalb auch die Backticks _immer_ einsetzen sollte.
Wenn man ein richtiges[tm] DBMS benutzt, kann oder muss man das ja dann sowieso unterlassen.
Ein harzliches Glückauf
Tom vom Berg
echo $begrüßung;
Wenn man ein richtiges[tm] DBMS benutzt, kann oder muss man das ja dann sowieso unterlassen.
Was sind für dich richtige™ DBMS und welche davon bieten keine Möglichkeit, Identifizierer zu quotieren?
echo "$verabschiedung $name";
Hallo
Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...
aha, in welcher Zeile also?
<?php
$res = mysql_query("select max(id) AS max from ".$tableforen);
$row = mysql_fetch_array($res);
[...]
$res = mysql_query("select max(id) AS max from ".$tablethreads);
$row = mysql_fetch_array($res);
$topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'");
$topic = mysql_fetch_array($topic);
$topic = $topic['topic'];
$res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);
while($row = mysql_fetch_array($res)) {
Freundliche Grüße
Vinzenz
aha, in welcher Zeile also?
Ich verwende so einen blöden Free-Space-Provider, da stehen in der Fehlermeldung immer Zeilen, die nichtmal in der Datei existieren (sonst hätte ich die Zeile gepostet und auch im Code markiert!).
<?php
$res = mysql_query("select max(id) AS max from ".$tableforen);
>
> # Schlechte Idee.
> # Wenn Du schon die veralteten mysql\_\*-Funktionen nutzen willst, dann baue
> # bitte Dein Statement zuvor in einer eigenen Variable zusammen, damit Du
> # Dir anschauen kannst, was Du da an die DB schickst.
Also das mit der Überprüfung der zuletzt verwendeten ID hab ich jetzt weggelassen, die Fehlermeldung kommt allerdings immer noch.
> # Es fehlt die Überprüfung, ob die Aktion erfolgreich war.
> > ~~~php
$row = mysql_fetch_array($res);[/lang]
>
> # Hier könnte der Fehler bereits auftreten.
Ich habe jetzt nach allen MySQL-Befehlen "or die(mysql_error())" hinzugefügt. Das ist doch das, was du gemeint hattest, oder?
Mein aktueller Code (die Fehlermeldung kommt immer noch):
[code lang=php]<?php
include "mysqlconfig.inc.php"; //Login und DB-Auswahl
//Var-Sicherheit
if(isset($_GET['fid'])) { $fid = mysql_real_escape_string(htmlentities($_GET['fid'],ENT_QUOTES)); } else { echo 'Keine Forums-ID empfangen oder die Forums-ID existiert nicht..'; exit; }
if(isset($_GET['tid'])) { $tid = mysql_real_escape_string(htmlentities($_GET['tid'],ENT_QUOTES)); } else { echo 'Keine Thread-ID empfangen oder die Thread-ID existiert nicht.'; exit; }
//Lesen aus DB
$topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'") or die(mysql_error()) or die(mysql_error());
$topic = mysql_fetch_array($topic) or die(mysql_error());
$topic = $topic['topic'];
echo '<h1>'.$topic.'</h1><br><br>';
$res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);
//ausgeben
while($row = mysql_fetch_array($res) or die(mysql_error())) {
$text = nl2br($row["text"]); //Zeilenumbrüche
echo '<fieldset>
<legend>'.$row["user"].'schrieb:</legend>'.
$text.'</p>';
}
?>
Hi,
Ich verwende so einen blöden Free-Space-Provider, da stehen in der Fehlermeldung immer Zeilen, die nichtmal in der Datei existieren (sonst hätte ich die Zeile gepostet und auch im Code markiert!).
durch sinnvolle Debug-Ausgaben lässt sich die Zeile auch dann recht zuverlässig ermitteln, wenn Dein Provider darum bettelt, von Dir verlassen zu werden.
Also das mit der Überprüfung der zuletzt verwendeten ID
Du hast die höchste ID abgefragt, nicht die zuletzt verwendete. Egal, wie Du "verwendet" definierst.
Ich habe jetzt nach allen MySQL-Befehlen "or die(mysql_error())" hinzugefügt. Das ist doch das, was du gemeint hattest, oder?
Das vermute ich nicht, denn "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
Cheatah
Grundlage für Zitat #1119.
Moin Moin!
"die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)
Als Heilung würde ich das aber auch nicht definieren.
Alexander
Hi,
"die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)
es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)
Als Heilung würde ich das aber auch nicht definieren.
Glücklicherweise haben die meisten Ärzte eine ähnliche Auffassung ...
Cheatah
Grundlage für Zitat #1120.
Hallo Cheatah,
"die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)
Nicht für Buddhisten mit schlechtem Karma.
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Moin Moin!
"die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)
Naja, zumindest bis die Verwesung einsetzt.
Alexander
wenn Dein Provider darum bettelt, von Dir verlassen zu werden.
Wollte mich gerade von ihm abmelden...
Natürlich kann es nicht anders kommen und es kommt folgende Fehlermeldung: "Fehler:
Server konnte nicht identifiziert werden"
Das ganze Theater war bei: http://www.kostenlos-php.de/ - samt Serverausfällen, manchml hat die Seite 10-40 Sekunden gebraucht, um zu laden... :D