mysql_fetch_array() Fehler
Niels
- php
Hi,
ich habe mittels Checkboxen und PHP einen dynamischen Filter für eine MySQL Tabelle erstellt und bekommen nun den folgenden Fehler, kann die Ursache allerdings nicht ausmachen:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/htdocs/w00a191e/bestimmen/getuser.php on line 62
Der Code der den Filter zusammenstellt und die MySQLabfrage durchführt ist der folgende:
<?
if ($_GET["Dolde"] == "")
{
echo "es funzt fals dolde nicht markiert ist!<br>";
}
if ($_GET["Dolde"] != "")
{
echo "es funzt leider nur wenn du dolde markiert hast!<br>";
}
//Zusammenstellen des Filters für die SQL-Abfrage
$count = 0;
while ($count < 25)
{
//Nach jeder Gruppe von Merkmalen findet eine AND verknüpfung statt!
if ($count == 3 or $count == 25)
{
$and_or = "AND";
}
//Inerhalb der Gruppen finden OR verknüpfungen statt!
else
{
$and_or = "OR";
}
//Falls $_GET[""] Werte enthält
if ($_GET[$count] != "")
{
//Falls $mysql nicht existiert oder keine Werte enthält --> Die erste Filteroption (kein AND/OR)
if (!isset($mysql) OR $mysql == "")
{
$mysql = $_GET[$count];
}
//Falls $mysql Werte enthält wird $mysql die nächste Filteroption per AND/OR hinzugefügt
if (isset($mysql) AND $mysql != "")
{
$mysql .= $and_or.$_GET[$count];
}
}
//Erhöht $count um 1
$count ++;
}
$con = mysql_connect('localhost', '****', '****');
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("****", $con);
$sql="SELECT * FROM test WHERE '".$mysql."'";
$result = mysql_query($sql);
echo "<table border='1'>
<tr>
<th>Name</th>
<th>Blütensymmetrie</th>
<th>Blütenstände</th>
</tr>";
while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['name'] . "</td>";
echo "<td>" . $row['bluetensymmetrie'] . "</td>";
echo "<td>" . $row['bluetenstaende'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close($con);
print_r($_GET);
?>
Testen kann man das ganze unter dieser Seite.
Grüße Niels
Hello,
$con = mysql_connect('localhost', '****', '****');
if (!$con)
hmh, hier kümmerst du dich noch um Fehlerbehandlung...
mysql_select_db("****", $con);
$result = mysql_query($sql);
...hier nicht mehr.
while($row = mysql_fetch_array($result))
damit greifst du hier ggf. auf etwas zu, was NICHT das Ergebnis einer MySQL-Abfrage ist, wie dir die Fehlermeldung auch sagt.
MfG
Rouven
Hello,
»» $con = mysql_connect('localhost', '****', '****');
»» if (!$con)
hmh, hier kümmerst du dich noch um Fehlerbehandlung...»» mysql_select_db("****", $con);
»» $result = mysql_query($sql);
...hier nicht mehr.»» while($row = mysql_fetch_array($result))
damit greifst du hier ggf. auf etwas zu, was NICHT das Ergebnis einer MySQL-Abfrage ist, wie dir die Fehlermeldung auch sagt.MfG
Rouven
Da ich das ganze aus diesem Beispiel entwickelt habe (welches auch funktionierte!), glaube ich nicht das es direkt an den oben genannten Stellen liegt.
Das Beispiel:
<?php
$q=$_GET["q"];
$con = mysql_connect('localhost', 'peter', 'abc123');
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("ajax_demo", $con);
$sql="SELECT * FROM user WHERE id = '".$q."'";
$result = mysql_query($sql);
echo "<table border='1'>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
<th>Hometown</th>
<th>Job</th>
</tr>";
while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['FirstName'] . "</td>";
echo "<td>" . $row['LastName'] . "</td>";
echo "<td>" . $row['Age'] . "</td>";
echo "<td>" . $row['Hometown'] . "</td>";
echo "<td>" . $row['Job'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close($con);
?>
Quelle:Link
Hi,
Da ich das ganze aus diesem Beispiel entwickelt habe (welches auch funktionierte!), glaube ich nicht das es direkt an den oben genannten Stellen liegt.
Glaube ist schön, wenn Du Hoffnung suchst. Andernfalls solltest Du den Glauben zugunsten von Wissen aufgeben.
Cheatah
Hi,
»» Da ich das ganze aus diesem Beispiel entwickelt habe (welches auch funktionierte!), glaube ich nicht das es direkt an den oben genannten Stellen liegt.
Glaube ist schön, wenn Du Hoffnung suchst. Andernfalls solltest Du den Glauben zugunsten von Wissen aufgeben.
Cheatah
Habe die MySQL Abfrage nochmals überprüft indem ich den WHERE Teil entfernt habe und alle Inhalte ausgegeben habe.
Der Fehler muss also irgendwo beim erstallen des Filters liegen.
Hallo
»» »» Da ich das ganze aus diesem Beispiel entwickelt habe (welches auch funktionierte!), glaube ich nicht das es direkt an den oben genannten Stellen liegt.
»»
»» Glaube ist schön, wenn Du Hoffnung suchst. Andernfalls solltest Du den Glauben zugunsten von Wissen aufgeben.
»»
»» Cheatah
»»Habe die MySQL Abfrage nochmals überprüft indem ich den WHERE Teil entfernt habe und alle Inhalte ausgegeben habe.
Der Fehler muss also irgendwo beim erstallen des Filters liegen.
Möglich, kann aber keiner wissen. Warum folgst du nicht Rouvens Rat mit der Fehlerbehandlung für mysql_query? Mit mysql_errno und mysql_error würdest du vielleicht rausbekommen, ob der Query gültig ist oder auch nicht. Dann wären wir bei Rouvens Ansatz, auf den ich gern eine Wette abschlösse. Ich setze also auf "Rouven hat Recht".
Tschö, Auge
und ihr solltet natürlich recht behalten, hab den Fehler gefunden, ich habe vergessen vor und hinter dem AND/OR ein Lehrzeichen einzufügen.
Da das ganze aber im PHP-Code des Filters lag, hab ich auch nochn bisl recht ;-).
Danke auf jedenfall für eure Hilfe!
Grüße Niels
Testen kann man das Ergebnis momentan unter bestimmen.nielswestphal.de
Hallo
und ihr solltet natürlich recht behalten, hab den Fehler gefunden, ich habe vergessen vor und hinter dem AND/OR ein Lehrzeichen einzufügen.
Da das ganze aber im PHP-Code des Filters lag, hab ich auch nochn bisl recht ;-).
Schön, das gefunden zu haben, oder? Dennoch hat die konsequente Anwendung einer Fehlerbehandlung den Riesenvorteil, die Fehlersuche plan- und nachvollziehbar zu machen.
Mit der Ausgabe des Queries vor (oder auch nach) seiner Ausführung hättest du das fehlende Leerzeichen bestimmt von Anfang an nicht übersehen. Die Auswertung der Rückgabe von mysql_query würde dir in anderen Fällen auf die Sprünge helfen bzw. einen Ansatz zur Suche geben.
$query = "Text des Query";
$rueckgabewert = mysql_query($query);
if ($rueckgabewert===false) {
echo "<pre>".mysql_errno()."\n".mysql_error()."\n\n".$query."</pre>";
}
... gibt im Fehlerfall die Fehlernummer, die Fehermeldung (beide von MySQL) und den Query selbst aus.
Tschö, Auge
echo $begrüßung;
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/htdocs/w00a191e/bestimmen/getuser.php on line 62
Nicht nur, dass du keine Fehler behandelst,
Der Code der den Filter zusammenstellt und die MySQLabfrage durchführt ist der folgende:
Du baust auch noch das Statement mit Ausdrücken zusammen, die vorher beim Benutzer waren. Das ist schon nicht mal mehr als SQL-Injection-Fehler sondern als grob fahrlässig einzustufen. Damit kann man dein Statement nahezu beliebig manipulieren.
echo "$verabschiedung $name";
Du baust auch noch das Statement mit Ausdrücken zusammen, die vorher beim Benutzer waren. Das ist schon nicht mal mehr als SQL-Injection-Fehler sondern als grob fahrlässig einzustufen. Damit kann man dein Statement nahezu beliebig manipulieren.
In wievern?
Der Nutzer kann natürlich so den Filter manipulieren, dies hat allerdings nur Einfluss auf den Teil hinter dem "WHERE", ergo das einzige was passieren könnte ist das er beliebige Daten ausgibt und da dies schon vom Filter her möglich ist, sehe ich da kein Problem. Zumal in der Tabelle lediglich Pflanzen und ihre Bestimmungsmerkmale abgespeichert sind und alle nicht öffentlichen Daten in einer separaten Datenbank abgespeichert sind.
Hi,
Der Nutzer kann natürlich so den Filter manipulieren, dies hat allerdings nur Einfluss auf den Teil hinter dem "WHERE", ergo das einzige was passieren könnte ist das er beliebige Daten ausgibt und da dies schon vom Filter her möglich ist, sehe ich da kein Problem.
dass Du kein Problem siehst liegt daran, dass Du fälschlicherweise davon ausgehst, Statements könnten nicht beendet und nach einem beendeten Statement kein neues begonnen werden. Jeder Besucher Deiner Website könnte Deine Tabellen löschen - und vielleicht auch noch mehr.
Cheatah
Moin!
dass Du kein Problem siehst liegt daran, dass Du fälschlicherweise davon ausgehst, Statements könnten nicht beendet und nach einem beendeten Statement kein neues begonnen werden. Jeder Besucher Deiner Website könnte Deine Tabellen löschen - und vielleicht auch noch mehr.
mysql_query() erlaubt nur die Ausführung eines einzigen Statements. Erst mysqli_multi_query() wäre anfällig für das Einfügen weiterer SQL-Befehle wie "DROP DATABASE" hinter einem Semikolon.
Trotzdem ist die Argumentation richtig: Wenn Niels jetzt schon kein Problem sieht, wo eindeutig ganz viele sind, wird er irgendwann unwissend in die Falle tappen, weil er sich nicht angewöhnt hat, sämtliche Daten, die er aus Variablen in ein SQL-Statement packt, egal wo sie herkommen, immer zu escapen!
Das hat nicht mal was mit "Daten kommen vom User" zu tun - auch legale Daten, die hundertprozentig in der Gewalt der Anwendung stehen und validiert wurden, können ganz banal genau die Zeichen enthalten, die das SQL-Statement ungültig machen. Es reicht schon, wenn man aus der Datenbank den Namen "O'Brien" ausliest, und wieder ins SQL einbaut.
- Sven Rautenberg
echo $begrüßung;
» Der Nutzer kann natürlich so den Filter manipulieren, dies hat allerdings nur Einfluss auf den Teil hinter dem "WHERE", ergo das einzige was passieren könnte ist das er beliebige Daten ausgibt und da dies schon vom Filter her möglich ist, sehe ich da kein Problem.
dass Du kein Problem siehst liegt daran, dass Du fälschlicherweise davon ausgehst, Statements könnten nicht beendet und nach einem beendeten Statement kein neues begonnen werden. Jeder Besucher Deiner Website könnte Deine Tabellen löschen - und vielleicht auch noch mehr.
Dieses Szenario ist unrealistisch. MySQL verweigert im Normalfall die Abarbeitung mehrerer Statements in einem Rutsch. Will man dies haben, muss man schon explizit mysqli_multi_query() verwenden.
Was sich allerdings machen lässt, wäre, das SELECT-Statement mit UNION zu erweitern und mit diesem beispielsweise die Benutzertabelle zu befragen.
Eine bessere Lösung als Teile des Statements zwischen Client und Webserver hin- und herzusenden wäre, stattdessen einen unverfänglichen Wert zu nehmen und diesen beispielsweise per switch auszuwerten und das Statement entsprechen zusammenzusetzen.
echo "$verabschiedung $name";
kann ich dann in meinem Fall den mysql_real_escape_string direkt auf die Variable $mysql anwenden, oder muss ich es auf jede Variable einzelnd anwenden?
$mysql enthält auch AND/OR anweisungen.
erhalte bei beiden Varianten diesen Fehler:
Error: SELECT * FROM test WHERE bluetensymmetrie = '0' OR bluetensymmetrie = '0'
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 ''0' OR bluetensymmetrie = '0'' at line 1
echo $begrüßung;
kann ich dann in meinem Fall den mysql_real_escape_string direkt auf die Variable $mysql anwenden, oder muss ich es auf jede Variable einzelnd anwenden?
Die Anwendung von mysql_real_escape_string() ist nicht fallspezifisch sondern immer gleich und zur Genüge dokumentiert. Die Funktion heißt ..._string und nicht ..._statement. Sie kann nicht raten, welche Teile du als String und welche als Anweisung angesehen haben willst.
echo "$verabschiedung $name";
Die Anwendung von mysql_real_escape_string() ist nicht fallspezifisch sondern immer gleich und zur Genüge dokumentiert. Die Funktion heißt ..._string und nicht ..._statement. Sie kann nicht raten, welche Teile du als String und welche als Anweisung angesehen haben willst.
THX, habs mir durchgelesen, muss aber zugeben das es wohl nicht gründlich genug war :-(.
Funktioniert jetzt jedenfalls :-), also danke nochmal für eure Hilfe und Geduld;-).
Grüße Niels