• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

PDO - Call to a member function prepare() on a non-object

J

j-l-n

Guest
Ich habe die Datei "db-connect.php" mittels include() eingebunden.
PHP:
//db-connect.php

try{
   $pdo = new PDO($server, $db_user, $db_password, $options); 
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $db_connected = true;
}

catch(PDOException $pdo_error){
   die("Error trying to connect to database: ".$pdo_error->getMessage());
}
Bei der Datenbankverbindung treten keine Fehler auf, und wenn ich
PHP:
var_dump($pdo);
ausgebe, wird dies korrekt als PDO-Objekt angezeigt:
object(PDO)#1 (0) { }
Auch wenn ich in dem Skript, in das die Datei eingebunden wurde, Datenbankoperationen durchführe, funktionieren diese problemlos.
Allerdings habe ich nun noch eine Datei eingebunden. In dieser wird auch auf $pdo zugegriffen und Datenbankabfragen getätigt. Es wird jetzt folgende Fehlermeldung ausgegeben:
Fatal Error: Call to a member function prepare() on a non-object


PS: auf stackoverflow habe ich bereits mehrere Fragen dieser Art gelesen, aber keine hat mein Problem lösen können.
 
Was genau passiert denn in dieser Datei? Verändert die $pdo vielleicht?
Nein, die macht vom Prinzip her nichts anders. Nämlich auch eine Datenbankabfrage so ähnlich wie in der Hauptdatei:
PHP:
 $query = "SELECT IP FROM ".$blockedIPs_db." WHERE IP = :ip";
 $mysql = $pdo->prepare($query);
 $mysql->execute(array(':ip' => $ip));
 $num_rows = $mysql->rowCount();
 
Und durch diese Struktur wird $pdo nicht geändert? Ich denke an soetwas wie Referenzen, wie es sie in Perl gibt.
 
Schau' dir mit var_dump() mal $mysql an. Vielleicht ist das false.

EDIT: äh - welche Zeile genau wirft denn den Fehler?

... und was sagt
PHP:
var_dump($pdo);
kurz vor dieser Zeile?
 
Zuletzt bearbeitet von einem Moderator:
Der Fehler wird in der eingebundenen Datei geworfen.
Ich glaub, ich hab zumindest die Ursache gefunden: hängt irgendwie mit dem Scope zusammen. Wenn ich vor der Funktion var_dump() ausgebe, wird mir ein korrektes PDO-Objekt angezeigt; innerhalb der Funktion jedoch NULL.
 
Innerhalb von Funktionen sind in PHP alle Variablen local. Wenn du ein Objekt innerhalb einer Funktion benötigst, übergib es als Parameter.
 
Innerhalb von Funktionen sind in PHP alle Variablen local. Wenn du ein Objekt innerhalb einer Funktion benötigst, übergib es als Parameter.
Ja, genau das meinte ich. In Perl kann man Referenzen auf Variablen übergeben, das verhindert die Doppelung der Variable und ermöglicht der Funktion die Änderung der Variable im übergeordneten Scope. Aber da muss man sauber arbeiten, sonst hat man ruck zuck genau solche Auswirkungen.
 
Man kann mit dem "globale"-Keyword auch eine globale Variable in den Scope der Funktion importieren. Würde ich aber nicht empfehlen.
 
Innerhalb von Funktionen sind in PHP alle Variablen local. Wenn du ein Objekt innerhalb einer Funktion benötigst, übergib es als Parameter.
Ja, da hatte ich nicht drangedacht. Sonst übergeb ich auch alles als Parameter, bloß hatte ich davor noch nie ein PDO-Objekt übergeben müssen - da war wohl die Datenbankabfrage schon zu selbstverständlich, als dass sie ein Objekt benötigt hätte sozusagen... ;)

- - - Aktualisiert - - -

'SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE IP = '127.0.0.1'' at line 1'

(Anmerkung: IP anonymisiert)

Betreffender Skriptausschnitt:
PHP:
$blockedIPs_db = "blocked_IPs";

function check_IP($ip, $pdo){
 $query = "SELECT IP FROM ".$blocked_IPs_db." WHERE IP = :ip";
 $mysql = $pdo->prepare($query);
 $mysql->execute(array(':ip' => $ip));
 
Pack' mal den Feldnamen und den Tabellennamen zwischen Backticks. Vielleicht hilft's.
Vielleicht hat auch der Benutzer, mit dem du dich mit der DB verbindest nicht die richigen Leserechte...

Ansonsten können wir nur raten, da wir deine DB nicht kennen.
 
Deinen Tabellennamen solltest du auch per Parameter an deine Funktion übergeben.
Eine Ausgabe von $query per var_dump zeigt, was wirklich zusammengebaut wurde.
PHP:
function check_IP($pdo, $tbl, $ip){
  $query = "SELECT IP FROM " . $tbl . " WHERE IP = :ip";
  var_dump($query);
    :
 
Zurück
Oben