【问题标题】:Uncaught TypeError: PDO::__construct() expects parameter 1 to be string未捕获的 TypeError:PDO::__construct() 期望参数 1 为字符串
【发布时间】:2019-02-26 20:43:25
【问题描述】:

我搜索了论坛,但没有找到与我的问题直接相关的任何内容。我对 PDO 和类 OOP 创建相当陌生。我正在尝试创建一个数据库连接类,我可以根据需要在其中实例化连接。我在实例化连接时遇到问题。

文件组织:

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.class.php”文件中有一个名为“DatabaseConnect”的数据库连接类
  • 我加载这些文件如下
    • require_once 'db_cred.inc.php';在“DatabaseConnect.class.php”文件中
    • spl_autoload_register 用于我所有的类文件

预期行动:

  1. 当我的“search.php”页面通过 pdo 从 mysql 请求数据时,一个新的数据库连接将通过“openConnection()”方法实例化一个新连接。
  2. “DatabaseConnection”类将从“db_cred.inc.php”加载凭据作为字符串并连接到数据库
  3. 然后该类将使用凭据连接到 mysql 数据库,并执行请求的 pdo 查询,返回结果并将它们存储到变量“$row”中。

问题: 当我执行 pdo 时,返回以下错误: 未捕获的类型错误: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} 在第 21 行的 \private\classes\DatabaseConnect.class.php 中抛出

config.php 文件中的 spl_autoload_register()

  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;
  }
}

 ?>

search.php 的 PDO

<?php

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

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

}
?>

我不确定是什么导致了错误。我确信这是由于我对课程和 oop 缺乏经验。看来 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",
]);*/

?>

【问题讨论】:

  • 你期望什么,你传递 PDO 一个数组,而且只是一个数组。阅读docs,尤其是示例。
  • 松开方括号。
  • @LawrenceCherone 感谢您的回复。我删除了括号,错误从“未捕获的 TypeError:PDO::__construct() 期望参数 1 为字符串”更改为“未捕获的 TypeError:PDO::__construct() 期望参数 4 为数组”。
  • 来自我已经链接到的文档。 PDO __construct 期望...public PDO::__construct ( string $dsn [, string $username [, string $passwd [, array $options ]]] )
  • 顺便说一句,这仍然会失败,因为$server 不是 DSN。

标签: php pdo


【解决方案1】:

错误解释了自己:您正在传递一个数组,而您应该在其中使用字符串。

你需要改变这一行:

$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);

【讨论】:

  • 谢谢你。我确实改变了一点。见下文。 // 建立 DSN $dsn = "mysql:host={$this->host};dbname={$this->database};charset={$this->char}"; // 完成 PDO 连接 $this->con = new PDO($dsn, $this->user, $this->pass,$this->opt);
  • 如果我的回答对你有帮助,请采纳。 (通过单击复选标记),因为它可能会在将来帮助其他人。
  • 我点击了向上箭头。因为我是新人,所以不会显示,但是系统会统计。
  • 箭头下方应该有一个复选标记,以接受答案。它也会给你一些代表。
  • 谢谢...新手。哈哈
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2012-12-08
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多