【问题标题】:Database connection with PDO and Singleton class与 PDO 和 Singleton 类的数据库连接
【发布时间】:2013-11-16 14:54:55
【问题描述】:

我正在尝试与 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;
    }
    }

【问题讨论】:

  • 去掉if,没有意义...做:$result = $db-&gt;query(...)...
  • 好的!但是我仍然遇到同样的错误:(
  • @HenriqueBarcelos,是的,if 确实有道理!
  • 没有意义的是两次调用query,这就是我的意思......
  • 并将上一行写为 $result = $db->query('SELECT * FROM users');

标签: php pdo singleton


【解决方案1】:

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

【讨论】:

  • 我刚试过,但它给了我注意:未定义的变量:索引文件中的查询。还有致命错误:未捕获的异常 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty'。
  • 我是从我的索引文件中正确调用它还是需要更改它?
  • 你目前正在做if ($result = $db-&gt;query($query)) {,但我看不到某处定义的变量 $query
  • 但它不是在我的数据库文件的函数中定义的吗?否则我不确定将其定义为什么?我的问题是我不确定如何连接数据库文件和我的索引文件并收集数据:( 非常感谢您的帮助!@ilpaijin
  • @GeekGirl:不,变量$query 没有在任何地方定义。查看我的更新答案 - 我将 $query 替换为 $statement
【解决方案2】:

我知道这个查询有点老了,但是对于从 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-&gt;query($statement) 或任何其他 PDO 方法,而无需在您的单例类中定义它。

【讨论】:

    【解决方案3】:

    刚刚想到这个问题。我用不同的方式连接数据库。它也包含在表格中。就像这样。

    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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 2016-04-02
      • 2012-11-22
      • 1970-01-01
      • 2013-08-03
      • 2013-04-22
      • 2013-05-14
      • 1970-01-01
      相关资源
      最近更新 更多