哪些参数应该传递给PDO :: __ construct()?

问题描述 投票:0回答:2

我是Web编程的新手,会在下面的代码中询问建议。

我在数据库类中有代码。有。如您所见,mysqli与数据库建立了连接。并且此代码有效。

   function __construct() {
        $this->conn = $this->connectDB();
    }

    function connectDB() {
        $conn = mysqli_connect($this->host,$this->user,$this->password,$this->database);
        return $conn;
    }

    function runBaseQuery($query) {
        $result = mysqli_query($this->conn,$query);
        while($row=mysqli_fetch_assoc($result)) {
            $resultset[] = $row;
        }
        if(!empty($resultset))
            return $resultset;
    }



    function runQuery($query, $param_type, $param_value_array) {
        $sql = $this->conn->prepare($query);
        $this->bindQueryParams($sql, $param_type, $param_value_array);
        $sql->execute();
        $result = $sql->get_result();
            if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                $resultset[] = $row;
            }
        }
            if(!empty($resultset)) {
            return $resultset;
        }
    }

    function bindQueryParams($sql, $param_type, $param_value_array) {
        $param_value_reference[] = & $param_type;
        for($i=0; $i<count($param_value_array); $i++) {
            $param_value_reference[] = & $param_value_array[$i];
        }
        call_user_func_array(array(
            $sql,
            'bind_param'
        ), $param_value_reference);
    }

    function insert($query, $param_type, $param_value_array) {
        $sql = $this->conn->prepare($query);
        $this->bindQueryParams($sql, $param_type, $param_value_array);
        $sql->execute();
    }

    function update($query, $param_type, $param_value_array) {
        $sql = $this->conn->prepare($query);
        $this->bindQueryParams($sql, $param_type, $param_value_array);
        $sql->execute();
    }

我必须在PDO中编写此类。我已经做到了,但是出了点问题。我尝试连接我的数据库并收到错误

致命错误:未捕获的TypeError:PDO :: __ construct()需要参数4

class DB {
    private $host = "";
    private $user = "";
    private $password = "";
    private $database = "";
    private $pdo;


    function __construct() {
        $this->pdo = $this->connectDB();
    }

    function connectDB() {
        try
        {
            $pdo = new PDO($this->host,$this->user,$this->password,$this->database);
        }
        catch (PDOException $e) {
            print "Error!: " . $e->getMessage();
        }
        die();
    }

    function runBaseQuery($query)
    {
        $result = $pdo->query($query);
        while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
            $resultset[] = $row;
        }
        if (!empty($resultset))
            return $resultset;
    }



    function runQuery($query, $param_type, $param_value_array) {

        $sql = $pdo->prepare($query);
        $pdo->execute($sql, $param_type, $param_value_array);
        $result = $pdo->fetchAll(PDO::FETCH_ASSOC);

        if ($result->num_rows > 0) {
            while ($row = $pdo->fetchAll(PDO::FETCH_ASSOC)) {
                $resultset[] = $row;
            }
        }
        if(!empty($resultset)) {
            return $resultset;
        }
    }

    function bindQueryParams($sql, $param_type, $param_value_array) {
        $param_value_reference[] = & $param_type;
        for($i=0; $i<count($param_value_array); $i++) {
            $param_value_reference[] = & $param_value_array[$i];
        }
        call_user_func_array(array(
            $sql,
            'bind_param'
        ), $param_value_reference);
    }

    function insert($query, $param_type, $param_value_array) {
        $sql = $pdo->prepare($query);
        $pdo->execute($sql, $param_type, $param_value_array);
           }

    function update($query, $param_type, $param_value_array) {
        $sql = $pdo->prepare($query);
        $pdo->execute($sql, $param_type, $param_value_array);
           }
}

但是我的新代码不起作用。问题出在哪里?

php class pdo
2个回答
1
投票

您的新班级有多个问题。您所要解决的问题可以通过了解如何与PDO正确连接以及DSN是什么来解决。为此,我必须向您推荐这篇很棒的文章https://phpdelusions.net/pdo#dsn

以此DSN为例:

      mysql:host=localhost;dbname=test;port=3306;charset=utf8mb4
driver^    ^ colon         ^param=value pair    ^semicolon 

首先,指定要使用的数据库驱动程序:mysql:。之后是由分号分隔的键/值对的列表。顺序应为主机,数据库名称和字符集。您应该指定所有这些值。

您的DSN是您PDO::__construct()的第一个参数,第二个和第三个分别是用户名和密码。第三个是一组选项。

您的选项数组应至少包含两个值。您需要启用错误报告并关闭模拟的准备好的语句。这些是推荐设置。

您的连接外观至少应与此类似:

PDO::__construct()

但是,请注意,该构造函数将被调用一次,并且您无需将这些值放在私有属性中。它们可以简单地是常量,也可以在构造函数中进行硬编码。打开连接后,您将不再需要重用此值。

您的第二个主要错误是您在很多地方都引用了$options = [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_EMULATE_PREPARES => false, ]; $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->database.';charset=utf8mb4', $this->user, $this->password, $options); ,但是您应该使用$pdo

[其他说明:

  • $this->pdo将结束整个脚本。不要使用它。
  • 请勿捕获异常,仅用于打印错误消息。它破坏了例外的全部目的。
  • die();方法似乎完全不必要。我建议您将其删除。
  • bindQueryParams()充满错误。 runQuery仅接受一个参数,该参数应为要绑定的值的数组。不需要像mysqli中一样的参数类型。 while循环是多余且不正确的。
  • $pdo->execute()在PDO中不存在,根本不需要。
  • 这些方法都不能提供比普通PDO更好的收益。

结论:您编写的类完全没有必要,只会使您的代码更难以理解和维护。尽管使用mysqli可能更有意义,但PDO使用起来更简单,不需要包装在此类中。请仔细阅读开头的链接文章,它将对您有很大帮助。


0
投票

PDO连接没有第四个参数作为数据库名称。数据库名称与主机名一起传递。因此更改:

num_rows

到:

$pdo = new PDO($this->host,$this->user,$this->password,$this->database);

有关更多信息,请参见$pdo = new PDO($this->host . ';dbname=' . $this->database, $this->user, $this->password);

此外,还不清楚https://www.php.net/manual/en/pdo.connections.php包含什么,但对于PDO,如果这只是一个主机路径,您还需要传递您正在使用的驱动程序,那么您甚至可能需要添加]]

$this->host

到此开始。对于mysql:host= ,这不是必需的,因为唯一的RDBMS mysqli支持的是mysqli

因此可能是完整的答案:

mysql
© www.soinside.com 2019 - 2024. All rights reserved.