PHP PDO查询未执行

时间:2015-07-10 08:50:31

标签: php mysql pdo

我试图通过绑定参数来执行查询。我在DB.php中有一个query()函数,它将查询和参数作为参数。在这个函数中,使用prepare()成功地准备了查询,但是当我在它上面使用execute()时,查询没有被执行。(我没有得到&#34;成功&#34;在屏幕上打印。)< / p>

我该怎么办?这样查询就会成功执行。

代码:

db.php中

<?php

class DB {
    private static $_instance = null;
    private $_pdo,
            $_query,
            $_error = false,
            $_results,
            $_count = 0;

    private function __construct() {
        try {
            $this->_pdo = new PDO('mysql:host = '. Config::get('mysql/host').'; dbname ='. Config::get('mysql/db').'', Config::get('mysql/username'), Config::get('mysql/password'));

        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }

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

    }

    public function query($sql, $params = array()) {
        $this->_error = false;
        if ($this->_query = $this->_pdo->prepare($sql)) {
            $x = 1;
            if (count($params)) {
                foreach ($params as $param) {
                    $this->_query->bindValue($x, $param);
                    $x++;
                }
            }

        if ($this->_query->execute()) {
            echo "Success";
        } 

        }

    }


}

的index.php

<?php 
require_once 'core/init.php';

DB::getInstance()->query("SELECT username FROM users WHERE username = ?", array('alex'));

2 个答案:

答案 0 :(得分:2)

这个非常聪明的课程有很多缺陷,例如缺乏错误报告和状态。为了使其清醒,请按如下方式进行更改:

class DB {
    private static $_instance = null;

    protected function __construct() {
        $opt  = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
        $this->_pdo = new PDO('mysql:host = '. Config::get('mysql/host').'; dbname ='. Config::get('mysql/db').'', Config::get('mysql/username'), Config::get('mysql/password'), $opt);
    }

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

    public function query($sql, $params = array()) {
        $stmt = $this->_pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
}

请注意,您必须能够查看PHP错误。明显。

但是,此类无法访问某些PDO功能。您可以手动添加它们,但我个人更喜欢使用一些魔法来自动调用它们。所以,我写了自己的PDO wrapper,如果我必须使用PDO而不是自己的DB包装器,这对我很有用。它&#39; S漏抽象过的,因为它&#39; s,使用PDO语句返回数据,但一个必须绝对疯狂抛售是辉煌的机制,可以在十几种不同的格式返回数据

在任何情况下都应该绝对没有像

这样的变量
$_query,
$_error,
$_results,

因为他们在你的班级中引入必须严格无国籍的状态。

答案 1 :(得分:0)

以下的其他声明:

print_r($this->_query->errorInfo());

显示: 数组([0] =&gt; 3D000 [1] =&gt; 1046 [2] =&gt;未选择数据库)

然后我检查了PDO连接线:

更改了这一行:

$this->_pdo = new PDO('mysql:host = '. Config::get('mysql/host').';dbname =' .Config::get('mysql/db').'', Config::get('mysql/username'), Config::get('mysql/password'));

进入这个:

$this->_pdo = new PDO('mysql:host = '. Config::get('mysql/host').';dbname=' .Config::get('mysql/db').'', Config::get('mysql/username'), Config::get('mysql/password'));

在dbname之后移除了空格并且它有效!