Uncaught TypeError: PDO :: __ construct () ожидает, что параметр 1 будет строкой - PullRequest
0 голосов
/ 26 февраля 2019

Я искал на форуме, но не нашел ничего, что напрямую связано с моей проблемой.Я довольно новичок в PDO и создании ООП класса.Я пытаюсь создать класс подключения к базе данных, где я могу создать экземпляр подключения по мере необходимости.У меня возникли проблемы с установлением связи.

Организация файла:

parent directory (folder)
      |     
      private (folder)
            |
            config.php
             classes (folder)
                     |
                     class1.class.php
                     DatabaseConnection.class.php
                     db_cred.inc.php
      public (folder)
           |
           search.php

Процесс:

  • Я создал файл php учетных данных базы данных "db_cred.inc.php "
  • У меня есть класс подключения к базе данных" DatabaseConnect "в файле" DatabaseConnect.class.php "
  • Я загружаю эти файлы следующим образом
    • require_once'db_cred.inc.php';в файле «DatabaseConnect.class.php»
    • spl_autoload_register для всех моих файлов классов

Ожидаемые действия:

  1. Когда моя страница «search.php» запрашивает данные у mysql через pdo, новое соединение с базой данных будет создавать новое соединение с помощью метода openConnection ().
  2. Класс DatabaseConnection загрузит учетные данные из "db_cred.inc.php" в виде строки и подключится к базе данных.
  3. Затем класс будет использовать учетные данные для подключения к базе данных mysql.и выполните запрошенный запрос pdo, возвращая результаты и сохраняя их в переменной «$ row».

Проблема: Когда я выполняю pdo, возвращается следующая ошибка:Uncaught TypeError: PDO :: __ construct () ожидает, что параметр 1 будет строкой, а массив задан как private / classes / DatabaseConnect.class.php: 21 Трассировка стека: # 0 private \ classes \ DatabaseConnect.class.php (21): PDO-> __ construct (Array) # 1 \ public \ search.php (53): DatabaseConnect-> openConnection () # 2 {main}, брошенный в \ private \ classes \ DatabaseConnect.class.php в строке 21

spl_autoload_register () в файле config.php

  function my_autoload($class) {
    if(preg_match('/\A\w+\Z/', $class)) {
      require ('classes/' . $class . '.class.php');
    }
  }
  spl_autoload_register('my_autoload');

Настройка учетных данных в "db_cred.inc.php"

<?php

// define an array for db connection.
define("DB", [
  "DB_HOST" => "mysql:host=localhost",
  "DB_USER" => "user",
  "DB_PASS" => "pass",
  "DB_DATABASE" => "mytestdb",
  "DB_CHAR" => "utf8",
]);
?>

Мой класс для подключения к базе данных:

<?php
require_once 'db_cred.inc.php';

// creating db connection class

class DatabaseConnect {

private $server = 'DB_HOST';
private $database = 'DB_DATABASE';
private $pass = 'DB_PASS';
private $user = 'DB_USER';
private $opt = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES   => false,
];

protected $con;

public function openConnection() {

**ERROR TAKES PLACE HERE**

  try {
    $this->con = new PDO([$this->server, $this->database, $this->user, $this->pass]);
      return $this->con;
  } catch(PDOExeption $e){
    echo "ERROR: " . $e->getMessage(), (int)$e->getCode();
  }
}
public function closeConnection() {
     $this->con = null;
  }
}

 ?>

PDOдля search.php

<?php

$dbconn = new DatabaseConnect();
$pdo = $dbconn->openConnection();

$sql = "SELECT * FROM report";
foreach ($pdo->query($sql) as $row) {
  echo " PI: ".$row['pi'] . "<br>";

}
?>

Я не уверен, что является причиной ошибки.Я уверен, что это из-за моей неопытности с классами и упс.Похоже, что файл config.php работает нормально.Класс идентифицируется запросом, потому что ошибка происходит внутри метода PDO __construct.Пожалуйста, помогите.

ОБНОВЛЕНИЕ - МОЕ РАБОЧЕЕ РЕШЕНИЕ

Я надеюсь, что это может помочь кому-то продвинуться с подобным вопросом.Я не закончил с разработкой этого процесса, но это пнуло в огромную дверь.

Мой исправленный класс

<?php
// Associating db_cred.inc.php with class
require_once('db_cred.inc.php');

// Creating db connection class
class DatabaseConnect {
/*
!! Assigning defined constants per define('DB_CONSTANT', 'value') loaded from "db_cred.inc.php" file to variables
!! "db_cred.inc.php" should not be loaded into the "config.php" file
!! BECAUSE THE VALUES OF THE VARIABLES ($variable) ARE CONSTANTS (DB_CONSTANT), DO NOT USE SINGLE OR DOUBLE QUOTES. THE PDO __CONSTRUCT FUNCTION WILL IGNORE  THE VALUE OF THE VARIABLE
*/
private $host =  DB_HOST;
private $database = DB_DATABASE;
private $pass = DB_PASS;
private $user = DB_USER;
private $char = DB_CHAR;
// Setting attributes and storing in variable $opt
private $opt = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES   => false,
];
// $con variable will store PDO connection and is set to NULL
private $con;

// Create Connection to database
public function openConnection() {
  // Setting $con to null
$this->con = NULL;

// If $con is not NULL make it NULL
if ($this->con === NULL){
  try {
    // Establish DSN
    $dsn = "mysql:host={$this->host};dbname={$this->database};charset={$this->char}";
    // Complete the PDO connection
    $this->con = new PDO($dsn, $this->user, $this->pass,$this->opt);
    // Return the connection and store it in $con
      return $this->con;
      // Catch any exceptions and store in $e
  } catch(PDOExeption $e){
    // Echo error and Exception message
    echo "ERROR: " . $e->getMessage(), (int)$e->getCode();
  }
  // If the try/catch block fails, echo that no connection was established
} else {
  echo "ERROR: No connection can be established";
}
}
// Close connection and set it to NULL
public function closeConnection() {
     if($this->con !== NULL){
     $this->con = NULL;
   }
  }

// create CRUD subclass (Create, Read, Update, Delete)
}
 ?>

Я изменил "db_cred.inc.php", удалив массив.Я могу вернуться к этой идее.

<?php

// defining DB Credential CONSTANTS to be stored in variables and instantiated by connect class
define("DB_HOST", "localhost");
define("DB_USER", "user");
define("DB_PASS", "pass");
define("DB_DATABASE", "mytestdb");
define("DB_CHAR", "utf8");

// define an array for db connection.
/*define("DB", [
  "DB_HOST" => "localhost",
  "DB_USER" => "user",
  "DB_PASS" => "pass",
  "DB_DATABASE" => "mytestdb",
  "DB_CHAR" => "utf8",
]);*/

?>

1 Ответ

0 голосов
/ 26 февраля 2019

Ошибка объясняется: вы передаете массив, в котором вместо этого следует использовать строку.

Вам необходимо изменить эту строку:

$this->con = new PDO([$this->server, $this->database, $this->user, $this->pass]);

На это (указываетDSN первый):

$dsn = "mysql:dbname={$this->database};host:{$this->host}";

$this->con = new PDO($dsn, $this->user, $this->password);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...