Tabelle mit PDO auslesen

Tabelle mit PDO auslesen

am 30.05.2006 16:28:36 von Martin Lemke

Hat von Euch schon mal jemand geschafft, eine Tabelle mit pdo auszulesen?

Ich bekomme es nicht hin. Nach dem es anhand eines Tutorials nicht klappte,
habe ich mir für gut 50 Euro ein Buch gekauft, in dem unter anderem PDO
erläutert wird. Doch Pustekuchen!


$sql="SELECT name FROM sf_fundregister WHERE name LIKE :name";

try {
$db = new PDO('mysql:host=host;xxxx','yyyyy','zzzzz');

$abfrage = $db->prepare($sql);
$abfrage->bindParam(":name",'Clubiona %');

An dieser Stelle bricht das Skript ab und meldet:
Fatal error: Call to a member function bindParam() on a non-object

var_dump($abfrage) ergibt folgendes: bool(false)

Was mache ich falsch?

Rest des Skriptes:
$abfrage->execute();

while ($zeile = $abfrage->fetch(PDO::FETCH_OBJ)) {
printf("%s
\n",$zeile->name);
}
}

catch (PDOException $e) {
print "Fehler beim Öffnen der Datenbank: " . $e->getMessage();
}

// Datenbankverbindung freigeben.
$db = NULL;
?>

PHP-Version: 5.1.2
MySQL-Version: 3.23.58

Martin

Re: Tabelle mit PDO auslesen

am 30.05.2006 16:54:54 von Martin Lemke

Ingrid schrieb:

> PHP-Version: 5.1.2

Wie ich nun woanders erfahren habe, ist es anscheinend ein Bug in PHP
5.1.2, der mit der Version 5.1.3 behoben sein soll.

> MySQL-Version: 3.23.58

Unter MySQL 4 tritt der Fehler nicht auf.

Martin

Re: Tabelle mit PDO auslesen

am 30.05.2006 16:55:44 von Frank Schenk

Martin Lemke wrote:
> Hat von Euch schon mal jemand geschafft, eine Tabelle mit pdo auszulesen?
>
> Ich bekomme es nicht hin. Nach dem es anhand eines Tutorials nicht klappte,
> habe ich mir für gut 50 Euro ein Buch gekauft, in dem unter anderem PDO
> erläutert wird. Doch Pustekuchen!
>
> >
> $sql="SELECT name FROM sf_fundregister WHERE name LIKE :name";
>
> try {
> $db = new PDO('mysql:host=host;xxxx','yyyyy','zzzzz');

Du selektierst hier keine Datenbank (dbname=yyyy), das Prepare dürfte
einfach fehlschlagen (false).


gruß, Frank

Re: Tabelle mit PDO auslesen

am 30.05.2006 17:07:48 von Alex Hepp

Hallo!

Martin Lemke schrieb:
> Hat von Euch schon mal jemand geschafft, eine Tabelle mit pdo auszulesen?

Nein, noch nie versucht ;)

> Ich bekomme es nicht hin. Nach dem es anhand eines Tutorials nicht klappte,
> habe ich mir für gut 50 Euro ein Buch gekauft, in dem unter anderem PDO
> erläutert wird. Doch Pustekuchen!

Selbst teuerste Bücher ersetzen nicht das lesen und lernen ;)

SCNR

> >
> $sql="SELECT name FROM sf_fundregister WHERE name LIKE :name";
>
> try {
> $db = new PDO('mysql:host=host;xxxx','yyyyy','zzzzz');
^^^^

An dieser Stelle sollte in Deinem Skript dbname='xxxx' stehen, aber ich
schätze mal, du hast einfach zu viel rausgeschmissen fürs Posting ...

>
> $abfrage = $db->prepare($sql);
> $abfrage->bindParam(":name",'Clubiona %');

Zuerst mal sollte man prepared queries nur dann verwenden, wenn man es
tatsächlich öfter mit einem anderen gebundenen Parameterwert benutzen
möchte. Aber auch hier gehe ich davon aus, dass Du der Einfachheit
halber reduziert hast.

Wenn ich das richtig verstanden habe, sollte man bindParam mit einer
Variable binden, also so:

$abfrage->bindParam(":name",$mySearchQuery);
$mySearchQuery = 'Clubiona %';

// und dann:
$abfrage->execute();

aber das muss nich stimmen, bzw. nix mit Deinem Problem zu tun haben ...

> An dieser Stelle bricht das Skript ab und meldet:
> Fatal error: Call to a member function bindParam() on a non-object
> var_dump($abfrage) ergibt folgendes: bool(false)

Ich würde ja mal schätzen, dass $abfrage nicht tatsächlich das Objekt
ist, dass es in Deinen augen sein sollte ;)

Aus http://de3.php.net/manual/de/function.pdo-prepare.php:

Rückgabewerte:

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.

Heisst? PDO kann mit Deinem Statement nix anfangen. Warum?

Schauen wir uns Dein Query nochmal an:

"SELECT name FROM sf_fundregister WHERE name LIKE :name";

Ersetzen wir nun mal Deinen Versuch des Bindings:

"SELECT name FROM sf_fundregister WHERE name LIKE Clubiona%";

setz mal dieses Query in der DB selbst ab... Das wird einen Fehler werfen...

Mach mal das daraus:

"SELECT name FROM sf_fundregister WHERE name LIKE ':name'";

und versuchs nochmal.

HTH

grüße alex

Re: Tabelle mit PDO auslesen

am 30.05.2006 17:37:54 von Martin Lemke

Alex Hepp schrieb:

>> $db = new PDO('mysql:host=host;xxxx','yyyyy','zzzzz');
>
> An dieser Stelle sollte in Deinem Skript dbname='xxxx' stehen,

Die Änderung hat am Ergebnis nichts geändert. Im Tutorial aus dem Web
stand:

$db = new PDO('mysql:host=localhost;dbank','user','passwort');

Im Buch steht
$db = new PDO('mysql:dbname=dbank;host=localhost','user','passwort');

Ihr schreibt hier:

$db = new PDO('mysql:host=localhost;dbname=dbank','user','passwort');

Ich schätze, das ist alles Jacke wie Hose. Da die Fehler mit Catch
abgefangen werden, müsste eine entsprechende Fehlermeldung auftreten.


> aber ich
> schätze mal, du hast einfach zu viel rausgeschmissen fürs Posting ...

Da sind mir in der Tat einige Fehler unterlaufen und ich musste mein
Posting mehrfach superseden.

>> $abfrage = $db->prepare($sql);
>> $abfrage->bindParam(":name",'Clubiona %');
Diese Zeile ist fehlerhaft. Richtig muss es heißen:

$name='Clubiona %';
$abfrage->bindParam(":name",$name);

denn an dieser Stelle ist eine Variable notwendig.

> Zuerst mal sollte man prepared queries nur dann verwenden, wenn man es
> tatsächlich öfter mit einem anderen gebundenen Parameterwert benutzen
> möchte.

Die meisten Beispiele arbeiten einfach mit prepare. Wenn es erstmal mit den
ersten Gehversuchen klappt, würde ich das nach meinen Bedürfnissen
anpassen.

> Wenn ich das richtig verstanden habe, sollte man bindParam mit einer
> Variable binden,
[...]

Doch, das ist korrekt so.

> Heisst? PDO kann mit Deinem Statement nix anfangen. Warum?

Weil meine PHP-Version (5.1.2) einen Bug hat:
http://bugs.php.net/bug.php?id=36890

Martin

Re: Tabelle mit PDO auslesen

am 30.05.2006 17:51:57 von Frank Schenk

Martin Lemke wrote:
> Ihr schreibt hier:
>
> $db = new PDO('mysql:host=localhost;dbname=dbank','user','passwort');
>
> Ich schätze, das ist alles Jacke wie Hose. Da die Fehler mit Catch
> abgefangen werden, müsste eine entsprechende Fehlermeldung auftreten.

Wenn ich den Bug richtig deute schmeißt die PDO Library nicht immer
einen Error, von daher kannst catchen was du willst. prepare() liefert
false, ich würd mal die errorinfo auslesen.

gruß, Frank

Re: Tabelle mit PDO auslesen

am 30.05.2006 18:15:28 von Alex Hepp

Martin Lemke schrieb:
> Alex Hepp schrieb:
>
> Die Änderung hat am Ergebnis nichts geändert. Im Tutorial aus dem Web
> stand:

Trotzdem sollte man sich an die Referenz halten, und richtiger(tm)
erscheint es mir schon anzugeben, dass man jetzt gerade den
datenbanknamen angeben möchte...


>>> $abfrage = $db->prepare($sql);
>>> $abfrage->bindParam(":name",'Clubiona %');
> Diese Zeile ist fehlerhaft. Richtig muss es heißen:
>
> $name='Clubiona %';
> $abfrage->bindParam(":name",$name);
>
> denn an dieser Stelle ist eine Variable notwendig.
>
>> Wenn ich das richtig verstanden habe, sollte man bindParam mit einer
>> Variable binden,
> [...]
>
> Doch, das ist korrekt so.

Bitte? Also entweder hast Du mich falsch zitiert, oder Du hast nicht
gesehen, dass ich damit genau den Fehler meinte, den Du jetzt oben
selbst korrigiert hast.

>
>> Heisst? PDO kann mit Deinem Statement nix anfangen. Warum?
>
> Weil meine PHP-Version (5.1.2) einen Bug hat:
> http://bugs.php.net/bug.php?id=36890

Ok. Gut, dann wissen wir das jetzt auch. Dennoch bin ich der Meinung,
dass in Deinem Statement auch noch ein Problem ist. Oder baut PDO
automatisch Quotes um Strings im Statement?

greetz Alex

Re: Tabelle mit PDO auslesen

am 30.05.2006 18:20:00 von Matthias Esken

On Tue, 30 May 2006 16:54:54 +0200, Martin Lemke wrote:

> Ingrid schrieb:
>
>> PHP-Version: 5.1.2
>
> Wie ich nun woanders erfahren habe, ist es anscheinend ein Bug in PHP
> 5.1.2, der mit der Version 5.1.3 behoben sein soll.

Bitte komme nicht auf die Idee 5.1.3 einzusetzen. Anschließend
funktionieren mit POST versendete Formulare nicht mehr sauber
(http://bugs.php.net/bug.php?id=37276). Nimm direkt 5.1.4.

Gruß,
Matthias

Re: Tabelle mit PDO auslesen

am 30.05.2006 22:16:36 von Helmut Chang

Alex Hepp schrieb:

> Ok. Gut, dann wissen wir das jetzt auch. Dennoch bin ich der Meinung,
> dass in Deinem Statement auch noch ein Problem ist. Oder baut PDO
> automatisch Quotes um Strings im Statement?

Hoffentlich. Das ist unter anderem der Sinn von solchen Sachen.

gruss, heli

Re: Tabelle mit PDO auslesen

am 30.05.2006 23:39:46 von Martin Lemke

Matthias Esken schrieb:

> Bitte komme nicht auf die Idee 5.1.3 einzusetzen. Anschließend
> funktionieren mit POST versendete Formulare nicht mehr sauber
> (http://bugs.php.net/bug.php?id=37276). Nimm direkt 5.1.4.

Danke für den Hinweis.

Ansonsten bin ich darauf angewiesen, was mein Hoster installiert. Mit PHP
5.1.2 ist er sicher schon ziemlich fortschrittlich.

Martin

Re: Tabelle mit PDO auslesen

am 31.05.2006 10:01:00 von Alex Hepp

Helmut Chang schrieb:
> Hoffentlich. Das ist unter anderem der Sinn von solchen Sachen.

ok, ok. Ich habs mir nochmal angesehen. Es werden nicht nur Quotes
drumherum gebaut, sondern die Strings werden auch noch automatisch
maskiert, um SQL Injections zu verhinden.

Nette Sache!

@OP: Sorry für die flschae Vermutung eines Fehlers...

gruß alex