0

自从我搬到 PDO 后,这让我很沮丧

我有这样的事情:

$sql = "select * FROM $table where id=:id";
$this->stmt = $this->dbh->prepare($query);
$this->stmt->bindValue($param, $value, $type);
bindValue(:id => $this->user_id);
$this->stmt->execute();

现在选择运行,不会破坏任何东西,但我没有得到预期的结果,如果我回显 $this->stmt 我会得到这样的结果:

PDOStatement Object ( [queryString] => UPDATE `users` 
SET user_active= :user_active, user_activation_hash= :user_activation_hash
WHERE user_id = :user_id AND user_activation_hash = :verification_code ) 

现在看起来不错,所以问题很可能与传递的值有关,所以我可能没有传递一个数字,而是把引号弄乱了,并将 $id 作为字符串传递,它没有评估变量,但我想不出办法来看看什么实际声明值是。必须有一种更简单的方法,使用标准mysql非常简单,只需将查询分配给一个变量并将其回显或使用或死mysql_error?

fwiw 我尝试了 debugDumpParams ,它只返回这个:

UPDATE `users` SET user_active= :user_active, user_activation_hash= :user_activation_hash WHERE user_id = :user_id AND user_activation_hash = :verification_code Params: 4 Key: Name: [12] :user_active paramno=-1 name=[12] ":user_active" is_param=1 param_type=2 Key: Name: [21] :user_activation_hash paramno=-1 name=[21] ":user_activation_hash" is_param=1 param_type=2 Key: Name: [8] :user_id paramno=-1 name=[8] ":user_id" is_param=1 param_type=2 Key: Name: [18] :verification_code paramno=-1 name=[18] ":verification_code" is_param=1 param_type=2

在猜测没有调试转储值或类似的东西时,它是我要调试的值

4

3 回答 3

0

利用$stmt->debugDumpParams();

于 2013-08-24T04:07:42.270 回答
0

我不确定如何打印在 DBMS 中执行的最终查询,但我会指出我在您的代码中注意到的问题。

以下语句未使用任何参数化占位符,即:idor ?

$sql = "select * FROM $table where id=$id";

所以,下面的语句有点没用:

bindValue(:id => $this->user_id);

在以下语句中,您正在准备$query变量,但尚未$query定义。应该是$sql

$this->stmt = $this->dbh->prepare($query);

根据上面的解释,你的代码块应该是:

$sql = "select * FROM $table where id=:id";
$this->stmt = $this->dbh->prepare($sql);

// Don't know the use of the following line so I'm commenting it out.
// $this->stmt->bindValue($param, $value, $type);

$this->stmt->bindValue(:id => $this->user_id);
$this->stmt->execute();
于 2013-08-24T04:10:40.347 回答
0

我错过了什么吗?您不是在获取结果,$stmt而是一个 PDOStatement 对象,您需要先获取实际的结果集,然后才能使用它:

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

将所有结果提取到关联数组中。

于 2013-08-24T05:39:40.170 回答