【问题标题】:What's wrong with my PDO statement?我的 PDO 声明有什么问题?
【发布时间】:2015-12-03 17:34:50
【问题描述】:
// Check for existence - don't add a duplicate
$sqlQuery = $pdo->prepare('SELECT campaign_id FROM campaigns WHERE (customer_id=:customerId) AND (title=:campaignTitle) AND (description=:campaignDescription) AND (start_time=:startTimeStamp) AND (end_time=:endTimeStamp)');

$sqlQuery->bindParam(':customerId', $customerId);  // , PDO::PARAM_INT
$sqlQuery->bindParam(':campaignTitle', $campaignTitle);
$sqlQuery->bindParam(':campaignDescription', $campaignDescription);
$sqlQuery->bindParam(':startTimeStamp', $campaignTitle);
$sqlQuery->bindParam(':endTimeStamp', $endTimeStamp);

$sqlResult = DatabaseCommand($sqlQuery);

结果

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 ':customerId 附近使用正确的语法) AND (title=:campaignTitle) AND (description=:campaignDescription) A' 在 E:\coding\Web 的第 1 行 Development\Xampp\htdocs\api\addCampaign.php:42 堆栈跟踪:#0 E:\coding\Web Development\Xampp\htdocs\api\addCampaign.php(42): PDO->query('SELECT campaign...') #1 {main} 在 E:\coding\Web 中抛出 Development\Xampp\htdocs\api\addCampaign.php 在第 42 行

但我不明白为什么


[更新]对于那些想看DatabaseCommand()代码的人来说,差不多就是这样。

function DatabaseCommand($sqlCommand)
{
   $result = $sqlCommand->execute();
   return $result;
}

还有一些额外的代码,但只是记录调试 porpoise 的命令、检查错误、记录错误、捕获异常并通过电子邮件发送给我。

【问题讨论】:

  • 语法看起来不错,所以很可能是访问冲突。确保您对该数据库/表拥有所需的read 权限。
  • Parenethis 不是必需的。你也可以发布 DatabaseCommand() 方法吗?查询如下所示:“从活动中选择活动 ID=:客户 ID AND 标题=:活动标题 AND 描述=:活动描述和开始时间=:开始时间标记和结束时间=:结束时间标记”。使用第一个括号,查询正在执行 where (not set) = (condition=value)
  • 什么是DatabaseCommand()?它有什么作用?此命令不是标准 PDO afaik 的一部分。
  • 我将在 8 或 10 小时后下班后发布代码(问题是在离开家之前发布的)。我只能说该函数对先前的查询有效,因此这似乎不太可能是问题 - 但让我们等到您看到代码再决定。感谢您的反馈
  • @Mawg 我敢打赌,您之前使用的查询当时不是准备好的语句。您在DatabaseCommand() 函数中使用PDO->query(),这可以从您发布的堆栈跟踪中读出。 PDO->query() 不适用于准备好的语句,您需要使用 PDO->execute()

标签: php pdo


【解决方案1】:

更新: 似乎这不是解决方案,只会提高可读性

=和参数之间放一个空格:

$sqlQuery = $pdo->prepare('SELECT campaign_id FROM campaigns WHERE (customer_id= :customerId) AND (title= :campaignTitle) AND (description= :campaignDescription) AND (start_time= :startTimeStamp) AND (end_time= :endTimeStamp)');

【讨论】:

  • 确定吗? 1) 听起来很奇怪 & 2) 这行得通 $sqlQuery = $pdo->prepare('SELECT * FROM campaigns WHERE customer_id=:customer');
  • 不,我不确定。我只知道 PDO 遇到了奇怪的解析问题。我会在几秒钟内测试。
  • 尽管有四张赞成票?我有时想知道这里的人在想什么:-)
  • @Mawg ya,同样 :) 这只是我的一个快速猜测。
【解决方案2】:

您在此处发布的此代码与您收到的错误消息无关。

您必须检查 addCampaign.php 文件,第 42 行您使用的是 query() 方法而不是 execute()。当然,您必须检查正在执行的实际文件。

我将借此机会将所有狂热的程序员的注意力引向阅读错误消息的极大帮助。尽管有共同的信念,但这不仅仅是一种责备,阅读“你做错了!”,让你猜测原因,而是准确而详细的解释。而且只需要阅读获取线索的错误消息。

我还将借此机会引导所有狂热的程序员注意这样一个事实,即如果使用仅回显错误消息而留下堆栈跟踪的常见做法,则会省略有关错误真正原因的信息。

【讨论】:

  • 在 SO 回答(或“猜测”)时,并不是每个人都有时间分析、测试和编写大量文本。另外,如果没有猜测,我永远不会解决我在使用PDO(及其解析器)时遇到的一些严重问题。 猜猜PDO中注释的 MySQL 代码中的命名参数会发生什么情况@...
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多