PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler mit PDO::prepare() / non-object


phury
27.05.2012, 15:46:52
Liebe Community,

ich rätsel mittlerweile seit Stunden an folgendem Problem. Als Warnung vorab: Ich bin blutiger Anfänger in php. Also bitte nicht böse sein, wenns mal bisschen dauert ;)


<?php
$suchbegriff = $_GET["q1"] . '%';
$tabelle = $_GET["q2"];
$feld = $_GET["q3"];

$result = NULL;
$sql = "SELECT * FROM (?) WHERE (?) LIKE (?)";
$dbh = new PDO('sqlite:../db/db_schulung.sqlite');

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

$query = $dbh->prepare($sql);
$query->execute(array($tabelle, $feld, $suchbegriff));


do{
$result = $query->fetch(PDO::FETCH_ASSOC);
if ($result != NULL)
print_r ($result);

} while ($result != NULL);

$dbh = null;
?>


Als Fehlerausgabe bekomme ich:
Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[HY000]: General error: 1 near "?": syntax error in ...\livesearch.php on line 12
Fatal error: Call to a member function execute() on a non-object in ...\livesearch.php on line 13

Was mich stutzig macht ist, dass in vorherigen (ähnlichen) Versuchen das Ganze ohne weiteres geklappt hat.

vt1816
27.05.2012, 16:31:15
Liebe Community,

Hallo und willkommen hier im Forum.




<?php
$suchbegriff = $_GET["q1"] . '%';
$tabelle = $_GET["q2"];
$feld = $_GET["q3"];

$result = NULL;
$sql = "SELECT * FROM (?) WHERE (?) LIKE (?)";
?>


Was soll "(?)" machen? Solltest Du dort nicht die entsprechend benötigten Werte einsetzten?

phury
27.05.2012, 17:17:19
Hallo und willkommen hier im Forum.
Dankeschön ;)

Ja ... also die Fragezeichen stehen als Platzhalter für die 3 Werte,
die in der Methode execute als Parameter (zusammengefasst als array) übergeben werden.

Laut http://www.php.net/manual/de/pdostatement.execute.php (Bsp. 3) sollte das auch funktionieren.
(Die anderen Herangehensweisen habe ich schon mit gleichem Ergebnis ausprobiert.)

vt1816
27.05.2012, 17:29:19
<?php
...
$dbh = new PDO('sqlite:../db/db_schulung.sqlite');

?>


Nur das Du PDO und nicht PDOStatment benutzt!

phury
27.05.2012, 21:18:13
Hmm, viel hat mir das jetzt nicht geholfen.

Wie auch immer ...
Ich habe das Problem gelöst, indem ich

erstens das SQL-Statement mit den Parametern in einer Variable $sql abgelegt
und zweitens statt prepare() und execute() direkt query($sql) verwendet habe.



$sql = "SELECT * FROM ".$tabelle." WHERE ".$feld." LIKE '".$suchbegriff."%'";
$menge = $dbh->query($sql);

meikel (†)
27.05.2012, 21:22:40
Ja ... also die Fragezeichen stehen als Platzhalter für die 3 Werte, Ja, aber seit wann wird der Tabellenbezeichner geklammert?

phury
27.05.2012, 21:33:06
Ja, aber seit wann wird der Tabellenbezeichner geklammert?
Ich hatte das wohl in dem Versuch das Problem zu lösen irgendwo gesehen, ausprobiert und danach nicht mehr rückgängig gemacht.
Wo das war kann ich nicht mehr sagen. Ich dachte eben, dass das zu der "Ersetzung" gehört.

meikel (†)
27.05.2012, 21:44:13
Ich hatte das wohl in dem Versuch das Problem zu lösen irgendwo gesehen, ausprobiert und danach nicht mehr rückgängig gemacht.
Wo das war kann ich nicht mehr sagen. Ich dachte eben, dass das zu der "Ersetzung" gehört.Meine Frage betraf die Klammern um den Tabellennamen. MySQL erwartet dort einen literalen String und keinen Term.

btw: die Syntax bei LIKE sieht auch gewöhnungsbedürftig aus.

phury
27.05.2012, 22:02:10
Klammern um welchen Tabellennamen?

Ich verwende keine MySQL- sondern eine SQLite-Datenbank. Ich nahm an, das sieht man wo die PDO-Instanz erzeugt wird.

Wieso sieht die Syntax bei LIKE gewöhnungsbedürftig aus? Die einfachen Hochkommata habe ich gesetzt um sicherzustellen, dass das % als Wildcard die Datenbank auch erreicht.

vt1816
27.05.2012, 22:46:56
Hmm, viel hat mir das jetzt nicht geholfen.

Scheibar doch, denn darauf
...
Wie auch immer ...
Ich habe das Problem gelöst, indem ich

erstens das SQL-Statement mit den Parametern in einer Variable $sql abgelegt
...


lief meine Hilfe hinaus.



[]
Als Warnung vorab: Ich bin blutiger Anfänger in php. Also bitte nicht böse sein, ...

Noch ein Hinweis: übernimm niemals ungeprüft $_GET/$_POST!

meikel (†)
28.05.2012, 02:12:53
Klammern um welchen Tabellennamen?
Na hier:
$sql = "SELECT * FROM (?) WHERE (?) LIKE (?)";

Ich verwende keine MySQL- sondern eine SQLite-Datenbank. Ich nahm an, das sieht man wo die PDO-Instanz erzeugt wird.
Rille. FROM (?) ist kein gültiges SQL. Det WHERE (?) LIKE (?) is auch ne neue Sprache.

phury
28.05.2012, 12:39:12
Noch ein Hinweis: übernimm niemals ungeprüft $_GET/$_POST!
Wird gemacht :)
Ich nehm an, damit niemand Schadcode einschleusen kann?


FROM (?) ist kein gültiges SQL. Det WHERE (?) LIKE (?) is auch ne neue Sprache.
Ja, das meinte ich mit "gesehen, ausprobiert und nicht rückgängig gemacht".


Nun dann bedanke ich mich für eure Hilfe. Schöne Feiertage noch.

vt1816
28.05.2012, 19:44:05
Wird gemacht :)
Ich nehm an, damit niemand Schadcode einschleusen kann?

Ja!