nachdem ich nun zusammen mit einem Kollegen wohl über 5 Stunden den
Fehler versucht haben zu finden, diverse Linux-Server hierzu als Test
herangezogen haben und jedesmal das identische, fehlerhafte, Ergebnis
erhielten, bin ich nun einmal gespannt, ob mir hier jemand helfen kann
(ach ja, Google wurde schon mehrfach versucht zu beauskunften):
Wir haben folgenden, kurzen Code:
$db1 = mysql_connect("localhost","<name>","<passwort>");
$db_selected = mysql_select_db("dev-startseite",$db1);
$abfrage = "SELECT * FROM tabelle;";
$result1 = mysql_query($abfrage,$db1);
$test1 = mysql_fetch_row($result1);
print test1;
Welches Ergebnis würde man hier erwarten? Jedes, nur nicht das:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL
result resource in /opt/dev-startseite/login/authorisiert.php on line 24
Ersetze ich die Abfrage mit z.b: "INSERT INTO tabelle VALUES(4)", dann
wird der Datensatz wunderbar in die Tabelle geschrieben (wobei der
mysql_fetch_row() Fehler trotzdem noch auftritt).
Was wir festgestellt haben:
Datenbankverbindung - OK (Logfiles von mysql und apache geprüft)
PHP-Syntax OK (verglichen mit PHP Referenz)
SELECT-Statement - OK (liefert alle Datensätze der Tabelle zurück (hat
nur eine Spalte))
Ich habe das auf meinen Entwicklungs-Server getestet, sowie auf meinem
Server bei meinem Provider und ich erhalte jedesmal den gleichen Fehler.
An den Rechten kann es nicht liegen, da ich z.b. per mysql mich mit dem
Benutzer anmelden kann und genau diese Abfrage ausführen.
ein mysql_error() liefert ebenfalls keine Fehler zurück.
Wir haben keine Ahnung mehr, woran das liegen könnte.
Wir haben die mysql-Datenbanken zum einen neu gestartet, sowie komplett
analysieren und optimieren lassen, keine Vorkommnisse gewesen. (apache
in diesem Zuge ebenfalls neu gestartet)
Hat irgendjemand hier noch einen Tipp? Ich vermute langsam aber sicher
dass es womöglich mit einem Modul von Apache ggf. in die Quere zu kommen
scheint, aber mit welchen?
Zur Umgebung (Entwicklungsserver(Ubuntu)):
PHP 5.2.10
mySQL 5.1.37
apache 2.2.12
(Provider(Debian)):
PHP 5.2.10
mySQL 5.0.32
apache 2.2
Wäre wirklich super, wenn mir/uns hier jemand helfen könnte!
Vielen Dank im Voraus
Daniel Seichter
> $db1 = mysql_connect("localhost","<name>","<passwort>");
> $db_selected = mysql_select_db("dev-startseite",$db1);
> $abfrage = "SELECT * FROM tabelle;";
^
Dieses Semikolon ist überflüssig.
> $result1 = mysql_query($abfrage,$db1);
> $test1 = mysql_fetch_row($result1);
Du verwendest $result1, ohne es vorher zu prüfen.
> Welches Ergebnis würde man hier erwarten? Jedes, nur nicht das:
> Warning: mysql_fetch_row(): supplied argument is not a valid MySQL
> result resource in /opt/dev-startseite/login/authorisiert.php on line 24
Doch, das würde man durchaus erwarten, wenn man mit ungeprüften Werten
weiterarbeitet.
Deine Query ist fehlgeschlagen und $result1 folglich keine Ressource,
sondern FALSE. Warum sie fehlgeschlagen ist, kannt Du mit mysql_error()
ermitteln.
Gruß. Claus
> Wir haben folgenden, kurzen Code:
> $db1 = mysql_connect("localhost","<name>","<passwort>");
Hier fehlt eine Überprüfung.
> $db_selected = mysql_select_db("dev-startseite",$db1);
Hier fehlt eine Überprüfung.
> $abfrage = "SELECT * FROM tabelle;";
> $result1 = mysql_query($abfrage,$db1);
Hier fehlt eine Überprüfung.
> $test1 = mysql_fetch_row($result1);
>
> print test1;
>
> Welches Ergebnis würde man hier erwarten? Jedes, nur nicht das:
> Warning: mysql_fetch_row(): supplied argument is not a valid MySQL
> result resource in /opt/dev-startseite/login/authorisiert.php on line 24
Wenn du die notwendigen Überprüfungen einführst und ggf. mysql_error()
ausgibst, hat MySQL eine Chance, die mitzuteilen, was du falsch machst.
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
Hallo,
danke erst einmal für die Antwort!
> Daniel Seichter schrieb:
>
> Wenn du die notwendigen Überprüfungen einführst und ggf. mysql_error()
> ausgibst, hat MySQL eine Chance, die mitzuteilen, was du falsch machst.
$db1 = mysql_connect("localhost","<name>","<passwort>");
if (!$db1) {
die('keine Verbindung möglich: ' . mysql_error());
}
$db_selected = mysql_select_db('dev-startseite',$db1);
if (!$db_selected) {
die ('Kann dev-startseite nicht benutzen : ' . mysql_error());
}
$abfrage = "SELECT * FROM tabelle";
$result1 = mysql_query($abfrage);
if (!$result1) {
die('Ungültige Abfrage: ' . mysql_error());
}
Liefert nun:
Ungültige Abfrage:
Mehr nicht! Irgendwie scheint es hier ein Problem zu haben :-( Aber es
kommt keine Fehlermeldung :-(
Habe nun diverse Verbindungen noch versucht, einen neuen Benutzer mit
allen Rechten angelegt, aber es geht nicht über diesen Punkt weiter :-(
Danke
Daniel
> Am 20.10.2009 16:46, schrieb Niels Braczek:
>> Wenn du die notwendigen Überprüfungen einführst und ggf. mysql_error()
>> ausgibst, hat MySQL eine Chance, die mitzuteilen, was du falsch machst.
> $db1 = mysql_connect("localhost","<name>","<passwort>");
> if (!$db1) {
> die('keine Verbindung möglich: ' . mysql_error());
> }
> $db_selected = mysql_select_db('dev-startseite',$db1);
> if (!$db_selected) {
> die ('Kann dev-startseite nicht benutzen : ' . mysql_error());
> }
> $abfrage = "SELECT * FROM tabelle";
> $result1 = mysql_query($abfrage);
> if (!$result1) {
> die('Ungültige Abfrage: ' . mysql_error());
> }
Das sieht schon mal besser aus. Ich bevorzuge allerdings bessere Prüfungen:
if ( !is_resource( $db1 ) ) {...} // bei SELECT wird Ressource erwartet
if ( !$db_selected ) {...} // ok, weil bool
if ( !is_resource( $result1 ) ) {...}
gemäß dem Prinzip "Teste, was du testen willst und nicht irgendetwas,
das zufällig so ähnlich evaluiert".
> Liefert nun:
> Ungültige Abfrage:
>
> Mehr nicht! Irgendwie scheint es hier ein Problem zu haben :-( Aber es
> kommt keine Fehlermeldung :-(
Der leere String bedeutet, dass kein Fehler bei der letzten Operation
aufgetreten ist.
Bist du sicher, dass du das Beispiel nicht zu stark verkürzt hast,
zwischen mysql_query() und mysql_error() also keine weiteren
MySQL-Aufrufe liegen?
> Daniel Seichter schrieb:
>
>> $db1 = mysql_connect("localhost","<name>","<passwort>");
>> if (!$db1) [...]
>>
>> $result1 = mysql_query($abfrage);
>> if (!$result1) [...]
>
> Das sieht schon mal besser aus. Ich bevorzuge allerdings bessere Prüfungen:
>
> if ( !is_resource( $db1 ) ) {...} // bei SELECT wird Ressource erwartet
"Returns a MySQL link identifier on success, or FALSE on failure."
Du gewinnst also nichts.
> if ( !is_resource( $result1 ) ) {...}
"For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning
resultset, mysql_query() returns a resource on success, or FALSE on error."
Du gewinnst schon wieder nichts.
> gemäß dem Prinzip "Teste, was du testen willst und nicht irgendetwas,
> das zufällig so ähnlich evaluiert".
Ich richte mich eher nach dem Prinzip "Teste, was getestet werden muss".
Gruß. Claus
Doch. Ich erwarte eine Ressource und kann sicher sein eine zu haben.
>> if ( !is_resource( $result1 ) ) {...}
>
> "For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning
> resultset, mysql_query() returns a resource on success, or FALSE on error."
>
> Du gewinnst schon wieder nichts.
Doch, genau dasselbe.
>> gemäß dem Prinzip "Teste, was du testen willst und nicht irgendetwas,
>> das zufällig so ähnlich evaluiert".
>
> Ich richte mich eher nach dem Prinzip "Teste, was getestet werden muss".
Kannst du ruhig tun. Ich habe da höhere Standards. Implizite Casts sind
böse. YMMV.
> Claus Reibenstein schrieb:
>
>> Niels Braczek schrieb:
>>
>>> if ( !is_resource( $db1 ) ) {...} // bei SELECT wird Ressource erwartet
>>
>> "Returns a MySQL link identifier on success, or FALSE on failure."
>>
>> Du gewinnst also nichts.
>
> Doch. Ich erwarte eine Ressource und kann sicher sein eine zu haben.
Ich auch.
>>> if ( !is_resource( $result1 ) ) {...}
>>
>> "For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning
>> resultset, mysql_query() returns a resource on success, or FALSE on error."
>>
>> Du gewinnst schon wieder nichts.
>
> Doch, genau dasselbe.
Nein. Genau dasselbe.
>>> gemäß dem Prinzip "Teste, was du testen willst und nicht irgendetwas,
>>> das zufällig so ähnlich evaluiert".
>>
>> Ich richte mich eher nach dem Prinzip "Teste, was getestet werden muss".
>
> Kannst du ruhig tun. Ich habe da höhere Standards.
Ob Deine Standards höher sind, wage ich zu bezweifeln. Sie sind
bestenfalls anders.
> Implizite Casts sind
> böse. YMMV.
"Implizite Casts" ist ein Widerspruch in sich. Casts sind per
definitionem explizite Typkonvertierungen. Du meinst vermutlich
implizite Typkonvervierungen.
Hier wird aber nichts konvertiert. Hier wird lediglich interpretiert,
und die Art der Interpretation ist durch die Sprachdefinition eindeutig
festgelegt.
Gruß. Claus
Hallo Niels,
> Der leere String bedeutet, dass kein Fehler bei der letzten Operation
> aufgetreten ist.
> Bist du sicher, dass du das Beispiel nicht zu stark verkürzt hast,
> zwischen mysql_query() und mysql_error() also keine weiteren
> MySQL-Aufrufe liegen?
ich habe nun ein sehr seltsames Verhalten feststellen müssen:
1)
Ich habe ein ein einfaches Skript genommen einfach ein "Select * from
tabelle" ausgeführt und mir die zurückgegebenen Daten mittels echo
ausgeben lassen. Dies hat einwandfrei funktioniert.
2)
Aufgrund dessen, habe ich mysql_fetch_row gegen mysql_fetch_array
"ausgetauscht" und das vorherige Problem war behoben. Dieses allerdings
genau 2 mal. Ich konnte diese Seite also 2 mal aufrufen und anschließend
bekam ich wieder die Warnung wie in meinem Öffnungsthread, nur eben
statt fetch_row, fetch_array
3)
Nachdem ich die Module mod_php5 und mod_mysql komplett vom System
entfernt habe und neu installiert hatte, war das Problem immer noch
vorhanden. Allerdings und nun kommt das absolut seltsame:
Nach etwa 5 Minuten ging es auf einmal. Mit mysql_fetch_array() und nach
der Änderung auf mysql_fetch_row() auch mit mysql_fetch_row().
In diesen 5 Minuten, bis es ging, wurde nichts, aber auch rein garnichts
an mysql oder php oder apache verändert. Logfiles haben hier auch nichts
ausgegeben.
Ich habe nun 11 Jahre Erfahrung mit Linux bzw. halb so viel mit PHP und
mysql, aber dieses Phänomen ist mir bisher noch nicht untergekommen. Es
kann auch nicht mehr nachvollzogen werden, da es bis heute Mittag
immernoch einwandfrei lief und ich mich nun kurzerhand entschlossen
habe, den Server neu aufzusetzen, um wirklich eine saubere und
"jungfräuliche" Umgebung wieder zu erhalten, um dann nochmals das
gleiche zu prüfen.
An Caching-Mechanismen konnte es auch nicht liegen, da ich dies zum
einen manuell, zum anderen durch einen Neustart des Servers ausschließen
konnte.
Auf den entfernten Server meines Providers läuft dies mittlerweile
ebenfalls, da hier aufgrund der fehlenden Fehlerbehandlung mein
Tippfehler des SQL-Statements zu keinem Ergebnis kam.
Viele Grüße und Danke
Daniel