与PDO和Singleton类的数据库连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与PDO和Singleton类的数据库连接相关的知识,希望对你有一定的参考价值。

我正在尝试与PDO和Singleton类建立数据库连接,但我在从数据库中获取数据时遇到问题。

我一直在阅读这篇文章,但我仍然不确定如何从我的数据库文件中调用另一个文件中的Singelton类并打印出结果。我现在得到的错误是我的db.php文件中的Fatal error: Call to undefined function query(),这是我数据库文件中的最后一个函数。但是我相信功能是定义的。

任何帮助表示赞赏!

这是我的数据库(db.php)连接文件:

<?php
class Database 
{
    private $_db;
    static $_instance;

    private function __construct() {
        $this->_db = new PDO('mysql:host=localhost;dbname=mvcuser', 'root', '');
        $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    private function __clone(){}

    public static function getInstance() {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function query($sql) {
        return query($this->_db,$sql);
    }

}

这是我的index.php文件中的代码:

<?php
    require_once 'model/db.php';

    $db = Database::getInstance();

    $db->query('SELECT * FROM users');
    if ($result = $db->query($query)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo $row;
    }
    }
答案

你的Database::query方法的定义没有意义。看起来你正在调用一些PHP函数query(它不存在),因此你得到错误。 我想你可能想把方法的定义改为:

public function query($sql) {
    return $this->_db->query($sql);
}

更新:并在您的index.php

$db = Database::getInstance();
$statement = 'SELECT * FROM users';

if ($result = $db->query($statement)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo $row;
    }
}
另一答案

我知道这个任务有点老了,但对于那些从Google发现它的人来说,如果你不想为每个PDO方法创建一个包装器方法,你可以在你的单例类中使用它。

public function __call ( $method, $args ) {
    if ( is_callable(array($this->_db, $method)) ) {
        return call_user_func_array(array($this->_db, $method), $args);
    }
    else {
        throw new BadMethodCallException('Undefined method Database::' . $method);
    }
}

现在您可以使用$db->query($statement)或任何其他PDO方法,而无需在单例类中定义它。

另一答案

刚想到这个问题。我以不同的方式连接数据库。它也包括在内。就像这样。

PHP

class try_connect
{
    function connect($s_name,$db_name,$user,$pass)
    {
        $this->s_name = $s_name;
        $this->db_name = $db_name;
        $this->user = $user;
        $this->pass = $pass;
        try {
            $db = new PDO("mysql:host=$s_name;dbname=$db_name","$user","$pass");
            if ($db) {
                echo $db->query("select database()")->fetch(PDO::FETCH_COLUMN);
            }else {
                echo "fail";
            }
        } catch (Exception $e) {
            print $e->getMessage();
        }
    }
}
if (isset($_POST["submit"])) {
    $get_server_name = $_POST["server_name"];
    $get_db_name = $_POST["database_name"];
    $get_user = $_POST["user"];
    $get_pass = $_POST["password"];
    $connect = new try_connect();
    $connect->connect($get_server_name,$get_db_name,$get_user,$get_pass);
}

html

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
    <p><input type="text" name="server_name"></p>
    <p><input type="text" name="database_name"></p>
    <p><input type="text" name="user"></p>
    <p><input type="text" name="password"></p>
    <p><input type="submit" name="submit"></p>
</form>

编码真的很好。我喜欢它。 :)

以上是关于与PDO和Singleton类的数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

连接与连接管理

利用PDO.so连接并读取Mysql数据库 核心代码实现讲解

制作 PDO mysql 静态连接类的最佳方法?

php和Pdo包括与其他页面的连接[重复]

php和Pdo包括与其他页面的连接[重复]

PDO 持久连接缓存要求