2016-06-06 16 views
-1

Ich bin eine Verbindung zu einer MySQL-Datenbank mit PHP, und am Anfang habe ich die mysql_ Methoden. Ich habe dann herausgefunden, dass diese Methoden veraltet sind, also bin ich zu PDO gewechselt und bin gerade dabei meinen Code zu ändern (und ich habe keine Erfahrung mit PHP PDO). Jetzt bekomme ich einen Fehler und ich (und auch mein Kollege) kann nicht herausfinden, warum ich es bekomme, und der Code ist sehr einfach, also bin ich mir nicht sicher ..500 Interner Server Fehler mit PDO Verbindung zu MySQL

Ich habe ein Skript, das Verbindungsvariablen konfiguriert dies wie:

<?php 
define('DB_USER', "user"); // db user 
define('DB_PASSWORD', "password"); // db password 
define('DB_DATABASE', "myDB"); // database name 
define('DB_SERVER', "localhost"); // db server 
?> 

Dann in die Datenbank eine Klasse definiert für die Verbindung ich habe:

<?php 

/** 
* A class file to connect to database 
*/ 
class DB_CONNECT { 
    private $con; 

    // constructor 
    function __construct() { 
     // connecting to database 
     $this->connect(); 
    } 

    // destructor 
    function __destruct() { 
     // closing db connection 
     $this->con = null; 
    } 

    /** 
    * Function to connect with database 
    */ 
    function connect() { 
     try { 
     // import database connection variables 
     require_once __DIR__ . '/db_config.php'; 

     $this->con = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_DATABASE.";charset=utf8mb4", DB_USER, DB_PASSWORD); 
     $this->con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     return $con; 

     } catch (PDOException $ex) { 
      die("Error connecting to DB: ".$ex->getMessage()); 
     } 
    } 
} 
?> 

Jetzt renne ich dieses nächste Skript, das alle Elemente aus einer Tabelle in meiner Datenbank holt:

<?php 

// array for JSON response 
$response = array(); 
// include db connect class 
require_once __DIR__ . '/db_connect.php'; 

// connecting to db 
$db = new DB_CONNECT(); 

// get all products from products table 
//$result = mysql_query("SELECT * FROM ITEM") or die(mysql_error()); 

$query = "SELECT * FROM ITEM"; 
$stmt = $db->prepare($query); //eror here! 

$stmt -> execute(); 

//foreach($db->query("SELECT * FROM ITEM") as $row) { 
// $response["products"] = array(); 
//} 




// check for empty result 
if ($stmt->fetchColumn() > 0) { 
    // looping through all results 
    // products node 
    $response["products"] = array(); 

    while ($row =$stmt->fetch(PDO::FETCH_ASSOC)) { 
     // temp user array 
     $product = array(); 
     $product["name"] = $row["name"]; 
     $product["am"] = $row["am"]; 

     // push single product into final response array 
     array_push($response["products"], $product); 
    } 
    // success 
    $response["success"] = 1; 

    // echoing JSON response 
    echo json_encode($response); 
} else { 
    // no products found 
    $response["success"] = 0; 
    $response["message"] = "No products found"; 

    // echo no users JSON 
    echo json_encode($response); 
} 
?> 
+2

Grundregel: Wenn Sie einen 500 Fehler von einer Website erhalten, wird Ihr ERSTER Halt auf dem Debugging-Zug sein, um das Fehlerprotokoll des Webservers anzusehen. Bis Sie Details über den Fehler erhalten, dreht sich alles, was Sie tun, nur im Dunkeln, GUESS bei dem Problem. –

+1

Beachten Sie, dass Sie 'return $ con;' nicht 'return $ this-> con;' – Rasclatt

+0

zurückliefern. Kann ich Ihnen eine Antwort mit meiner Klassenstruktur von php PDO empfehlen, die ich in meinen Anwendungen verwende? –

Antwort

2

Es ist diese:

$this->$con = new PDO(etc... 
     ^--- 

$con in diesem Zusammenhang nicht definiert ist, das heißt, Sie $this->null = new PDO ....

Versuchen $this->con stattdessen das Äquivalent tun. Beachten Sie das Fehlen von $ auf con.

+0

Das funktionierte, aber jetzt habe ich einen weiteren Fehler: PHP Schwerwiegender Fehler: Aufruf an undefinierte Methode DB_CONNECT :: prepare() in get_all_products.php. Jetzt beklagt es sich, dass prepare() nicht definiert ist, aber ist das nicht eine eingebaute Funktion für PDO? – eee

+0

Ist es eine gute Lösung hinzuzufügen öffentliche Funktion vorbereiten ($ z) { zurückgeben $ this-> pdo-> vorbereiten ($ z); } an die DB_connect-Klasse? – eee

+0

, weil sich Ihr DB-Handle in '$ db-> contrigiert. Sie haben keine "Prepare" -Methode in Ihrem eigenen Objekt definiert, Sie sind nur PDO innerhalb einbetten, was bedeutet, dass Sie mit PDO sprechen müssen: '$ db-> conf> prepare' –