2016-06-06 10 views
-1

Я подключаюсь к базе данных MySQL с PHP, и в начале я использовал методы mysql_. Затем я узнал, что эти методы устарели, поэтому я переключился на PDO, и теперь я посреди изменения моего кода (и у меня нет опыта работы с PHP PDO). Теперь я получаю сообщение об ошибке, и я (а также мой коллега) не может понять, почему я его получаю, и код очень прост, поэтому я не уверен.500 Внутренняя ошибка сервера с подключением PDO к MySQL

У меня есть скрипт, который настраивает переменные соединения как это:

<?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 
?> 

Тогда я определил класс для подключения к базе данных:

<?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()); 
     } 
    } 
} 
?> 

Теперь я бегу этот следующий сценарий, который извлекает все элементы из одной таблицы в моей базе данных:

<?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

Основное правило: если вы получаете ошибку 500 с сайта, ваша ПЕРВАЯ остановка на отладочном поезде должна перейти к журналу ошибок веб-сервера. Пока вы не получите подробные сведения об ошибке, все, что вы делаете, просто крутится в темноте, УГАДАЙТЕ проблему. –

+1

Обратите внимание, что вы возвращаете 'return $ con;' not 'return $ this-> con;' – Rasclatt

+0

Могу ли я рекомендовать вам ответ с моей структурой классов php PDO, которую я использую в своих приложениях? –

ответ

2

Именно это:

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

$con не определено в этом контексте, что означает, что вы делаете эквивалент $this->null = new PDO ....

Попробуйте $this->con вместо этого. Обратите внимание на отсутствие $ на con.

+0

Это сработало, однако, теперь у меня есть еще одна ошибка: PHP Неустранимая ошибка: вызов неопределенного метода DB_CONNECT :: prepare() в get_all_products.php. Итак, теперь он жалуется, что prepare() не определено, но разве это не встроенная функция для PDO? – eee

+0

Будет ли это хорошим решением для добавления public function prepare ($ z) { return $ this-> pdo-> prepare ($ z); } класс DB_connect? – eee

+0

, потому что ваш дескриптор DB находится в '$ db-> con'. у вас нет метода 'prepare', определенного в вашем собственном объекте, вы просто встраиваете PDO внутри, что означает, что вам нужно поговорить с pdo:' $ db-> con> подготовить' –