2016-06-15 3 views
-1

Ich habe eine PHP-Datei, in der ich eine Funktion habe, die (neben anderen Sachen) eine Select-Abfrage ausführt. Jetzt, bevor diese Select-Abfrage stattfinden kann, muss ich mich natürlich erst mit der db verbinden. Dazu versuche ich derzeit, die folgenden connectdb.php innerhalb der Funktion direkt vor der Select-Abfrage, aber es schlägt fehl/keine Verbindung zur db. Der Inhalt der connectdb.php:Verbinden mit DB in einer Funktion über Include-Klasse (mit dem Verbindungsteil)

<?php 

require_once 'configdb.php'; // contains my database credentials 

//Connect To Database 

class connectdb 
{ 
public function __construct($dsn, $user, $pw){ 
$this->pdo = $pdo; 
if ([email protected]$this->connect($dsn, $user, $pw)){ 
    echo "Failed."; 
} else { 
    echo "Successful."; 
} 
} 

public function connect($dsn, $user, $pw){ 
    try { 
    $pdo = new PDO($dsn, $user, $pw); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $e) { 
    $e->getMessage(); 
    } 
} 
} 

$connect = new connectdb($dsn, $user, $pw); 
$connect->connect($dsn, $user, $pw); 

?> 

Der Fehler, der die folgenden Auswahlabfrage bezieht, die hat sie offensichtlich nicht in der Lage gewesen, eine Verbindung mit dem db zu bekommen, ist:

Fatal error: Call to a member function prepare() on a non-object in /var/www/xxx/html/xxx/index.php on line 753

Ich weiß nicht, wo ich den Fehler in der connectdb.php - schon beobachtete php Videos darüber gefunden und versucht, den Code für meine Bedürfnisse zu übernehmen, aber immer noch, es ist ein Fehler. Ich habe auch versucht die folgende (funktioniert auch nicht):

<?php 
require_once 'configdb.php'; 

class connectdb 
{ 
public function __construct($dsn, $user, $pw){ 
try { 
    $pdo = new PDO($dsn, $user, $pw); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $e) { 
    $e->getMessage(); 
    } 
} 
} 

$connect = new connectdb($dsn, $user, $pw); 
?> 

EDIT - Code, der funktioniert jetzt -: Was ich zur Zeit verwenden, und was das Problem oben angezeigt löst. The database.php:

<?php 
//Class, which includes the connection function along other query functions 

class Database{ 

// variables DB_HOSt, DB_USER etc. have been defined in an external file 
private $host = DB_HOST; 
private $user = DB_USER; 
private $pass = DB_PASS; 
private $dbname = DB_NAME; 

private $dbh; 
private $error; 

public function __construct(){ 
    // Set DSN 
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8'; 
    // Set options 
    $options = array(
     PDO::ATTR_PERSISTENT => true, 
     PDO::ATTR_ERRMODE  => PDO::ERRMODE_EXCEPTION, 
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 
    ); 
    // Create a new PDO instanace 
    try{ 
     $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
    } 
    // Catch any errors 
    catch(PDOException $e){ 
     $this->error = $e->getMessage(); 
    } 
} 

public function query($query){ 
$this->stmt = $this->dbh->prepare($query); 
} 

public function bind($param, $value, $type = null){ 
if (is_null($type)) { 
switch (true) { 
case is_int($value): 
    $type = PDO::PARAM_INT; 
    break; 
case is_bool($value): 
    $type = PDO::PARAM_BOOL; 
    break; 
case is_null($value): 
    $type = PDO::PARAM_NULL; 
    break; 
default: 
    $type = PDO::PARAM_STR; 
} 
} 
$this->stmt->bindValue($param, $value, $type); 
} 

public function execute(){ 
return $this->stmt->execute(); 
} 

public function resultset(){ 
$this->execute(); 
return $this->stmt->fetchAll(PDO::FETCH_ASSOC); 
} 
(...) 
} 
?> 

Und die index.php Datei mit der Abfrage:

require_once ('../configdb.php'); 

require_once ('../database.php'); 


$database = new Database(); 

$selectsubjectsquery = "SELECT faecher.fach, klassen.klasse_id FROM faecher 
LEFT JOIN 
lehrer_faecher 
ON 
faecher.fach_id = lehrer_faecher.fach_id 
LEFT JOIN 
klassen 
ON 
lehrer_faecher.klasse_id = klassen.klasse_id 
WHERE 
lehrer_id = :lehrer AND lehrer_faecher.fach_id != :fach AND  lehrer_faecher.fach_id != '11'"; 

$database->query ($selectsubjectsquery); 

$database->bind(':lehrer', $lehrer); 
$database->bind(':fach', $fach); 

$teachersubjects = $database->resultset(); 
+0

Welche Werte übergeben Sie in den Konstruktor für connectdb? – Drumbeg

+0

Hallo Drumbeg, Ich gebe die Datenbank-Anmeldeinformationen '$ dsn' (einschließlich Host-Name und Datenbank-Name),' $ Benutzer' (Benutzername) und '$ pw' (Passwort). Diese werden von 'configdb.php' durch die Codezeile' require_once 'configdb.php'; ' – Franky2207

+0

gegeben. Wo rufst du' prepare() '? Außerdem ist Ihre '$ pdo'-Variable * nur * innerhalb Ihrer' connect() '(oder' __construct() ') Funktion zugänglich. Sie möchten stattdessen '$ this-> pdo' (oder ähnlich) setzen, damit Sie auf diese Variable außerhalb dieser Funktionen zugreifen können. –

Antwort

0

Ich frage mich, warum die @ Symbol in @ $ this-> connect ($ dsn, Benutzer $, $ pw!) ???

+0

Hey Sakil, ich folgte den Schritten von einem php class video und es enthielt das "@". Es schlägt immer noch fehl, wenn ich es lösche. – Franky2207

0

Ich werde die obige Antwort aktualisieren - Ich habe einige Dinge nicht in Bezug auf die Verwendung der Verbindungsfunktion in der Klasse und habe es jetzt behoben.