【问题标题】:What is wrong with my PDO prepared statement?我的 PDO 准备好的声明有什么问题?
【发布时间】:2013-02-25 19:11:09
【问题描述】:

显然,我准备的陈述是错误的,但我不确定自己做错了什么。

这两个代码段是相同的,除了第二行。

这失败了:

    $dbh = new PDO('mysql:host=localhost;dbname=' . $DB_Database, $DB_UserName, $DB_Password);
    $sth = $dbh->prepare("SELECT * FROM `PNB`.`Users` WHERE `Users`.`EMail` = :email OR `Users`.`Temp_EMail` = :temp_email");
    $sth->execute(array(':email' => $email, ':temp_email' => $email));
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    $res = $sth->fetch();
    $dbh = null;

这个硬编码测试有效:

    $dbh = new PDO('mysql:host=localhost;dbname=' . $DB_Database, $DB_UserName, $DB_Password);
    $sth = $dbh->prepare("SELECT * FROM `PNB`.`Users` WHERE `Users`.`EMail` = 'me@example.com' OR `Users`.`Temp_EMail` = 'me@example.com'");
    $sth->execute(array(':email' => $email, ':temp_email' => $email));
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    $res = $sth->fetch();
    $dbh = null;

我做错了什么?

谢谢!

更新:已解决!

确切的问题仍然未知,但似乎与以下 cmets 中用户“Your Common Sense”建议的“过度命名”有关。

这很好用:

$dbh = new PDO('mysql:host=localhost;dbname=' . $DB_Database, $DB_UserName, $DB_Password);
$sth = $dbh->prepare("SELECT * FROM Users WHERE EMail=:email OR Temp_EMail=:temp_email");
$sth->execute(array(':email' => $email, ':temp_email' => $email));

感谢大家。我学到了很多东西并解决了这个问题。

传达常识的信息;如果您将您的评论形成为“答案”,那么我可以接受。

【问题讨论】:

  • 您遇到错误了吗?
  • 顺便说一句,这样过分的命名是没有用的。 "SELECT * FROM Users WHERE EMail = :email OR Temp_EMail = :temp_email" 没问题。
  • 谢谢。我怀疑过度命名是没有价值的。只是想与我在调试时看到的示例保持一致。

标签: php arrays pdo


【解决方案1】:

很难一目了然。
你的代码对我来说似乎没问题。因此,调试似乎是唯一的方法。

我做错了什么?

始终向您的 PDO 提出这个问题。
每次连接到 PDO 时,都以这种方式进行(同时确保您可以在屏幕上或日志中看到错误):

error_reporting(E_ALL);
$opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$dsn = 'mysql:host=localhost;dbname=' . $DB_Database;
$dbh = new PDO($dsn, $DB_UserName, $DB_Password, $opt);

如果有错误 - 您会收到通知。
如果没有 - 检查类似错字的问题。

【讨论】:

  • 我会在哪里收到通知?我试过了,没有区别。查询失败,不知道为什么。
【解决方案2】:

快速尝试一下 - 这两行你做得对吗?

$sth = $dbh->prepare("SELECT * FROM `PNB`.`Users` WHERE `Users`.`EMail` = :email OR `Users`.`Temp_EMail` = :temp_email");
$sth->execute(array(':email' => 'me@example.com', ':temp_email' => 'me@example.com'));

换句话说...您是否设置了 $email 变量?

【讨论】:

  • 没有。我得到相同的结果。查询失败。将尝试来自用户“您的常识”的错误报告步骤。
【解决方案3】:

试试这个

  $dbh = new PDO('mysql:host=localhost;dbname=' . $DB_Database, $DB_UserName, $DB_Password);
$sth = $dbh->prepare("SELECT * FROM `PNB`.`Users` WHERE `Users`.`EMail` = :email OR `Users`.`Temp_EMail` = :temp_email");
$sth->bindParam(':email', $email, PDO::PARAM_STR);
$sth->bindParam(':temp_email', $email, PDO::PARAM_STR);
$sth->execute();
$res = $sth->fetch(PDO::FETCH_ASSOC);
$dbh = null;

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 2015-12-03
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2011-06-02
    • 2023-01-16
    相关资源
    最近更新 更多