Создание экземпляра PDO вызывает ошибку

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

Я пытаюсь использовать PDO для подключения к mysql, но когда я пытаюсь создать экземпляр PDO, это приводит к сбою кода. Я попытался поместить его в try and catch, но он по-прежнему нарушает код / я получаю страницу с надписью «Страница локального хоста не работает»

 protected $conn;

$dsn = "mysql:host=localhost;dbname=Mydatabase";
$this->conn = new PDO($dsn, "admin", "test2016");
  

Если я попытаюсь подключиться к mysql следующим образом:

 $conn = mysqli_connect("localhost", "admin", "test2016");
  

все работает нормально.

Я не уверен, почему новый PDO вызывает эту ошибку.

 class Database {

protected $conn;

function __construct() {
    $this->init();
}

function init(){
   try{
    $this->conn= $this->connectDB("localhost","Mydatabase","admin","test2016"); // the here
    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
   }catch(PDOException $e){
      echo "Connection failed: " . $e->getMessage();
    }

}

function connectDB($servername,$database,$username,$password){

   $dsn = "mysql:host=localhost;dbname=Mydatabase";
   return new PDO($dsn, $username, $password);// i am not sure why new pdo is the cause of the problem

   // $conn = mysqli_connect($servername, $username, $password);

    //if (!$conn) {
      // die("Connection failed: " . mysqli_connect_error());
    //}

    //echo "Connected successfully";

}
  

Комментарии:

1. почему здесь есть mysqli_ и PDO? Если вы их смешиваете, вы не сможете.

2. Я надеюсь, что вы используете здесь точку с запятой protected $conn

3.В вашем заголовке сказано, что создание экземпляра PDO вызывает ошибку , сообщите нам, какие ошибки

4. После a protected $conn; я бы ожидал метод, если вы хотите использовать $this->conn . Это неверно или отсутствует много строк…

5. Посмотрите, показанный вами код не имеет смысла, вы слишком много упустили. И вы не ответите на очевидный вопрос о том, какая ошибка возникает. Итак, я ухожу, чтобы сделать что-то более продуктивное

Ответ №1:

Основываясь на вашем редактировании, вы пытаетесь вызвать метод для неопределенной переменной:

 function init(){
   try{
     $this->conn= $this->connectDB("localhost","Mydatabase","admin","test2016"); // the here
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  

Должно быть:

 function init(){
   try{
     $this->conn= $this->connectDB("localhost","Mydatabase","admin","test2016"); // the here
     $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     ^^^^^ here
  

Комментарии:

1. так ли это? Но я уверен, что создаю PDO в методе connectDB. Я пытаюсь понять, почему это сейчас не определено.

2. Я понимаю, что вы имеете в виду, и я изменил его $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); , и я все еще показываю мне «Страница локального хоста не работает»

Ответ №2:

Это очень простой пример, который работает для того, что вы пытаетесь сделать, в think .

 class Database {

    protected $conn;

    public function __construct() {
        $this->init();
    }

    public function init() {
        try{
            $this->conn = $this->connectDB("localhost","Mydatabase","admin","test2016");
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            if (!$this->conn) {
                throw new Exception("Connection failed: ");
            }
            echo 'Connected';
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }

    public function connectDB($servername, $database, $username, $password) {
        $dsn = "mysql:host=".$servername.";dbname=".$database;
        return new PDO($dsn, $username, $password);
    }

}
  

Если этот класс не работает для вас, пожалуйста, проверьте информацию о вашем сервере или даже состояние сервера.

Я надеюсь, что это вам немного поможет.

Комментарии:

1. Я пробовал это таким образом, но это все равно как-то связано с созданием экземпляра pdo. Я предполагаю, что у меня нет диска pdo или мне не хватает настройки. (Я нахожусь на Mac, используя mamp) это кошмар, выполняющий настройки на Mac> [