【问题标题】:php echoing the ACTUAL statement of a query after its executedphp 在执行后回显查询的 ACTUAL 语句
【发布时间】:2013-08-24 04:02:54
【问题描述】:

自从我搬到 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

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

【问题讨论】:

  • 我想你的意思是where id = :id 对吧?
  • 那么,如果不是预期的结果,你会得到什么做什么
  • 第一段代码是假的,实际的语句很大,包括一堆不相关的函数等,所以我用了一个例子,但是 PDOStatement 对象和 debugDumpParams 是真实的,你可以看到它们都匹配,但它们不显示 user_id 或验证码的值。我猜这就是问题所在,但每次遇到问题时尝试猜测问题所在的效率并不高

标签: php mysql pdo


【解决方案1】:

使用$stmt->debugDumpParams();

【讨论】:

  • 它说调用未定义的方法 Database::debugDumpParams() 当我使用它时?
  • 好的,但它只返回我可以通过回显 $stmt 得到的参数,请参阅原始帖子
【解决方案2】:

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

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

$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();

【讨论】:

  • 也许 $id == ':id'... 但这有点多余。
  • 是的,实际代码本身并不重要,它完全随机并放在一起,所以它真的是打印出语句的概念,我有插入和更新的工作代码但是当它们不起作用时问题是.因此,为了浪费您的时间来纠正这些事情,我应该指出这一点:)
【解决方案3】:

我错过了什么吗?您没有获取结果,$stmt 是一个 PDOStatement 对象,您需要获取实际结果集才能使用它:

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

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

【讨论】:

  • 至少你有一个令人欣慰的赞成票 :) 错误。不是我说的,要说清楚。
  • @YourCommonSense: :D 是的。我不确定我是白痴,还是其他人都是。
  • 在聊天中向你的朋友恳求总是会给你带来一个。但它不会使您的答案具有相关性。
  • @YourCommonSense:可能,尽管我仍然不明白它有什么问题。我不认为获取是理所当然的。如果 OP 会编辑他的问题以包括他确实获取了,以及他得到了什么而不是他所期望的,我很乐意删除这个答案。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2021-08-25
  • 2012-04-14
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多