我试图通过绑定参数来执行查询。我在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'));
答案 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之后移除了空格并且它有效!