phpbar.de logo

Mailinglisten-Archive

[php] PDO-Blackout

[php] PDO-Blackout

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Fre Nov 17 08:49:17 CET 2006


Hallo Gereon,

Am Donnerstag, 16. November 2006 20:50 schrieb Gereon Kremer:
> Ich habe ein kleines Blackout in sachen PDO...
>
> Ich habe ein funktionierende DB-Verbindung (andere Querys und
> Prepared Statements funktionieren ja...) und folgendes Statement:
>
>  $this->stmt_getcnt = $this->db->prepare('SELECT Count(*) FROM
> fragen');
>
> Führe ich den Query in PhpMyAdmin aus, funktioniert alles...
> Auch alle anderen Querys auf die fragen-Tabelle funktionieren.
>
> nun möchte ich das ganze ausführen:
>
> if ($this->stmt_getcnt->execute(Array())) {
>   $res = $this->stmt_getcnt->fetch();
> } else exit(var_dump($this->db->errorInfo(),true));
>
> Das Script bricht aber immer beim Exit ab und gibt diese ErrorInfo
> aus:
>
> array(1) { [0]=> string(5) "00000" } bool(true)
>
> was natürlich sehr vielsagend ist, und sonst nichts.

kommt darauf an... errorInfo() liefert laut Handbuch folgendes zurück:

0	SQLSTATE error code
	(a five-character alphanumeric identifier defined in the ANSI SQL
	 standard).
1	Driver-specific error code.
2	Driver-specific error message.

Wenn Du obiges Ergebnis zurückerhältst, bedeutet das theoretisch, daß 
kein SQL-Fehler aufgetreten ist. Die Frage ist also, wie konnte 
execute() trotzdem FALSE zurückliefern...


> ich habe auch schon geprüft ob das Statement irgendwann mal null
> wird, wird es aber nicht.
> Es käme ja auch ein Fehler...

ich habe Deine Code folgendermaßen bei mir nachgestellt:


$dbh = new PDO('mysql:host=localhost;dbname=...', '...', '...');

$stmt_getcnt = $dbh->prepare('SELECT Count(*) FROM Keyword');

if ($stmt_getcnt->execute(Array())) {
  $res = $stmt_getcnt->fetch();
} else exit(var_dump($stmt_getcnt->errorInfo(),true));

print_r($res);


Dabei wurde $res am Ende korrekt ausgegeben:
Array ( [Count(*)] => 16032 [0] => 16032 ) 


Jetzt ist es natürlich schwierig, aus der Ferne Dein Problem zu lösen... 
Also schreibe ich einfach mal ein paar Dinge, die ich an Deiner Stelle 
prüfen würde:

1. Welche PHP- und PDO-Version setzt Du ein? Gibt einen bekannten Bug, 
der Deinen Fehler verursacht haben könnte?

2. Oder liegt es vielleicht an Deinem Code? Passiert noch irgendetwas 
zwischen prepare() und execute(), was den Fehler verursachen könnte?

3. Aufgrund fehlender SQL-Fehlermeldung unwahrscheinlich, aber: Liegt 
eventuell ein Rechteproblem vor? Fehlende Zugriffsrechte bei der 
aktuellen Verbindung auf die Tabelle? Oder auf einem Linuxsystem: Der 
Tabellenname im SQL-Befehl weicht in der Schreibweise (groß/klein) von 
dem Tabellennamen im Dateisystem ab?

4. Ansonsten fallen mir auf die Schnelle nur Kleinigkeiten ein, die Du 
mal probieren könntest, z.B.: a) Array() in execute() gehört eigentlich 
klein geschrieben (array()), b) würde ich array() in execute mal 
weglassen, c) mal Count() im SQL-Befehl entweder COUNT() oder count() 
schreiben...


Also im Prinzip sehe ich drei grundsätzliche Ansatzpunkte: ein Bug, ein 
Fehler in Deinem Code oder eine gewisse Intoleranz gegenüber 
abweichenden Schreibweisen.

Vielleicht kommst Du damit ja weiter, wenn Du Dein Problem nicht 
mittlerweile selbst gelöst hast. Wenn Du schon eine Lösung hast, wäre 
es nett, wenn Du sie uns mitteilen könntest. So kann jeder davon 
lernen. :-)


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive