Abfrage mit PDO

Abfrage mit PDO

am 04.08.2006 07:49:03 von Martin Lemke

Folgendes Problem:

try {
$db = new PDO('mysql:host=' ... );
}
catch (PDOException $e) {
printf("

FEHLER!>/strong> %s

\n",$e->getMessage());
die('Zugriff gescheitert.');
}

$kdo = $db->prepare($sql);
$kdo->bindParam(":name",$wert);
$kdo->execute();

Das Objekt $kdo scheint nicht zu existieren, denn ich bekomme die
Fehlermeldung 'Call to a member function fetch() on a non-object in ...'

Woran mag es hapern?

Technische Bedingungen:
MySQL-Version: 5.0518
PHP-Version: 5.1.2 (pdo ist installiert)

Martin

Re: Abfrage mit PDO

am 04.08.2006 12:05:43 von Frank Schenk

Martin Lemke wrote:
> Folgendes Problem:
>
> try {
> $db = new PDO('mysql:host=' ... );
> }
> catch (PDOException $e) {
> printf("

FEHLER!>/strong> %s

\n",$e->getMessage());
> die('Zugriff gescheitert.');
> }
>
> $kdo = $db->prepare($sql);
> $kdo->bindParam(":name",$wert);
> $kdo->execute();
>
> Das Objekt $kdo scheint nicht zu existieren, denn ich bekomme die
> Fehlermeldung 'Call to a member function fetch() on a non-object in ..

Funktioniert der Query an der Konsole?

-> http://de.php.net/manual/en/function.pdo-prepare.php

Return Values

If the database server successfully prepares the statement,
PDO::prepare() returns a PDOStatement object. If the database server
cannot successfully prepare the statement, PDO::prepare() returns FALSE.


Frank

Re: Abfrage mit PDO

am 04.08.2006 12:11:33 von Helmut Chang

Martin Lemke schrieb:

> try {
> $db = new PDO('mysql:host=' ... );
> }
> catch (PDOException $e) {
> printf("

FEHLER!>/strong> %s

\n",$e->getMessage());
> die('Zugriff gescheitert.');
> }
>
> $kdo = $db->prepare($sql);
> $kdo->bindParam(":name",$wert);
> $kdo->execute();
>
> Das Objekt $kdo scheint nicht zu existieren, denn ich bekomme die
> Fehlermeldung 'Call to a member function fetch() on a non-object in ...'

Hmm... Wo wird fetch() denn aufgerufen?

Mach einmal "korrekte" Einrückungen und ich rate folgendes:

try {
$var = new Object();
} catch {
...
}

$var->method();

Zumindest in anderen Sprachen ist es so, dass $var so nur im Scope des
try-Blocks existiert. Also rate ich (ich "muss" noch immer in PHP4
entwickeln), dass es hier genauso ist und $db nicht existiert.
Eigentlich müsste die Fehlermeldung für $db->prepare() kommen. Aber du
verrätst ja nicht, in welcher Zeile exakt der Fehler auftritt.

gruss, heli

Re: Abfrage mit PDO

am 04.08.2006 17:57:06 von Christian Schmelzer

Helmut Chang wrote:
> Martin Lemke schrieb:
>
>> try {
>> $db = new PDO('mysql:host=' ... );
>> }
>> catch (PDOException $e) {
>> printf("

FEHLER!>/strong> %s

\n",$e->getMessage());
>> die('Zugriff gescheitert.');
>> }
>>
>> $kdo = $db->prepare($sql);
>> $kdo->bindParam(":name",$wert);
>> $kdo->execute();
>>
>> Das Objekt $kdo scheint nicht zu existieren, denn ich bekomme die
>> Fehlermeldung 'Call to a member function fetch() on a non-object in
>> ...'
>
> Hmm... Wo wird fetch() denn aufgerufen?
>
> Mach einmal "korrekte" Einrückungen und ich rate folgendes:
>
> try {
> $var = new Object();
> } catch {
> ...
> }
>
> $var->method();
>
> Zumindest in anderen Sprachen ist es so, dass $var so nur im Scope des
> try-Blocks existiert. Also rate ich (ich "muss" noch immer in PHP4
> entwickeln), dass es hier genauso ist und $db nicht existiert.
> Eigentlich müsste die Fehlermeldung für $db->prepare() kommen. Aber du
> verrätst ja nicht, in welcher Zeile exakt der Fehler auftritt.
>

Nö, PHP erlaubt solche "Nettigkeiten" da es keinen Strict o.ä. Modus gibt.

Christian

Re: Abfrage mit PDO

am 05.08.2006 04:17:12 von Martin Lemke

Am Fri, 04 Aug 2006 12:11:33 +0200 schrieb Helmut Chang:

> Hmm... Wo wird fetch() denn aufgerufen?
>
> Mach einmal "korrekte" Einrückungen und ich rate folgendes:

So direkt hat mir Dein Kommentar nicht geholfen, aber indirekt.

Es lag wohl ein Fehler in der try/catch-Struktur vor. Sowas ist tückisch,
wenn man mit Konstruktionen arbeitet, die man noch nicht richtig kennt und
unsicher ist (PDO).

fetch kam weiter unten in dem Teil des Skriptes, das ich nicht zitierte, da
der Fehler schon darüber auftrat.

Folgende Konstruktion klappt nun:

$sql="SELECT name FROM sf_fundregister WHERE name LIKE 'Clubiona%'";

print "

PDO-Test

\n

Ausgabe der Datentabelle:

\n";

try {
$db = new PDO('mysql:host= [...]');

if (!$db)
print '

Pech! $db-Objekt konnte nicht erzeugt werden.

';
else
{
$kdo = $db->prepare($sql);
$wert=0;
$kdo->bindParam(":name",$wert);
$kdo->execute();

while ($zeile = $kdo->fetch(PDO::FETCH_OBJ))
print htmlspecialchars($zeile->name)."
\n";
}

}
catch (PDOException $e) {
printf("

FEHLER!>/strong> %s

\n",$e->getMessage());
die('Zugriff gescheitert.');
}

Für if (!$db) Dank an Frank Schenk.

BTW:
Hat von Euch mal jemand eine eine Datenbankabgrage mit dem Zend framework
hin bekommen? Das hatte ich alternativ versucht, aber das klappte auch
nicht.

Es gibt noch mehr Widrigkeiten. Etwa dass PDO mit MySQL < Version 5 unter
PHP < Version 5.1.4 gar nicht klappt. Solche Hintergründe erschweren die
Fehlersuche, da das mögliche Fehlerspektrum so breit ist. Ein Fehler muss
nicht zwingend ein eigener sein.

Gruß, Martin

Re: Abfrage mit PDO

am 06.08.2006 06:40:38 von Martin Lemke

Am Sat, 5 Aug 2006 04:17:12 +0200 schrieb Martin Lemke:

> Hat von Euch mal jemand eine eine Datenbankabgrage mit dem Zend framework
> hin bekommen?

Auch da langen meine Fehler woanders. Vielen Dank für Eure Geduld mit mir.

Eine gute Doku findet sich beim hersteller:
http://framework.zend.com/manual/de/zend.db.html

Martin