【问题标题】:Can't use prepare() when using mysqli prepared statements使用 mysqli 准备好的语句时不能使用 prepare()
【发布时间】:2023-03-26 20:35:01
【问题描述】:

我正在尝试为我正在从事的一个项目创建一种面向对象的方法,但我很难理解数据库类的想法。我收到以下错误。

    Call to undefined method Database::prepare()

数据库类

class Database
{

    protected $connection;

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

    private function createConnection()
    {

        $this->connection = new mysqli("localhost", "user", "password", "test");
        if ($this->connection->connect_errno)
        {
            echo "Failed to connect to MySQL: (" . $this->connection->connect_errno . ") " . $this->connection->connect_error;
        }
        else
        {
            echo 'Connected to database.<br />';
        }

    }
}

$db = new Database();

用户操作类

class userActions
{

    protected $_db;
    protected $_username;
    protected $_password;
    protected $_auth;
    protected $tableName;
    function __construct($db, $username, $password, $auth)
    {
        $this->_db = $db;
        $this->_username = $username;
        $this->_password = $password;
        $this->_auth = $auth;

        $this->checkUserExists();
    }

    private function checkUserExists()
    {
        $query= "SELECT COUNT(*) FROM '{$this->tableName}' WHERE username = ?";
        $stmt = $this->_db->prepare($query);
        $stmt->bind_param('s', $this->username);
        $userNumber= $stmt->execute();
        echo $userNumber;
    }
}

我做错了什么,我可以做些什么来改进我完成这项任务的方式吗?

【问题讨论】:

  • 您的数据库类没有准备例程,不确定您还期望什么......
  • 但是您(我假设)在这里传递了您的数据库类(如果没有,您为什么要共享该代码)?
  • 您似乎希望您的课程能够扩展 mysqli 课程。但它只是将mysqli 对象存储为私有变量。

标签: php oop mysqli prepared-statement


【解决方案1】:

您需要将以下方法添加到您的类中:

public function prepare($query) {
  return $this->connection->prepare($query);
}

您可以为您的类定义一个魔术方法,自动将任何未定义的方法传递给连接:

public function __call($name, $arguments) {
  return call_user_func_array(array($this->connection, $name), $arguments);
}

【讨论】:

  • 感谢您的回答 :) 但似乎有点啰嗦,我的编码方式是否正确?或者有没有更好的方法来编写类?
  • 我添加了一个通用的__call() 方法,允许您使用您的类作为mysqli 的代理。或者,您可以定义一个返回连接的公共方法,然后直接在其上调用 mysqli 方法。
  • 我认为第二个选项是最好的,因为我现在遇到了必须访问 'bind_param' 的问题。
  • 那么,您的课程的意义还不清楚。为什么不直接打电话给mysqli_connect()?您的课程唯一要做的就是隐藏连接参数。
猜你喜欢
  • 2016-07-22
  • 2012-03-26
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多