【问题标题】:PDO MySQL query failing with more than one comparison operator [duplicate]PDO MySQL查询因多个比较运算符而失败[重复]
【发布时间】:2019-06-21 11:45:51
【问题描述】:

我确定我的格式不正确,但我的一个查询出现了 PDO 异常,并且调试没有帮助。

如果我运行以下它可以正常工作:

$db = static::getDB();

$sql = 'SELECT * FROM djs WHERE day = :day 
                 AND start_hour = :hr AND shifts LIKE :shift';

$stmt = $db->prepare($sql);
$stmt->bindParam(':day', $arr['day'], PDO::PARAM_STR);
$stmt->bindParam(':hr', $arr['hr'], PDO::PARAM_INT);
$stmt->bindParam(':shift', $shift, PDO::PARAM_STR);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_OBJ);

但是当我尝试在这样的查询中添加多个比较运算符时:

$sql = 'SELECT * FROM djs WHERE day = :day 
                 AND start_hour > :hr AND end_hour <= :hr 
                 AND shifts LIKE :shift';

它抛出以下指向包含执行命令的行的异常:

Uncaught exception: 'PDOException'
Message: 'SQLSTATE[HY093]: Invalid parameter number'

end_hour 是表中的有效列,我试图确定 star_hour 是否大于 :hrend_hour 是否小于或等于 :hr。我一定做错了。请问有什么指点吗?这是因为我在查询中使用了相同的命名参数:hr 两次但只绑定一次?如果是这样,除了设置另一个具有相同数据的命名参数之外,还有什么解决方案?

【问题讨论】:

  • @Magnus Eriksson 谢谢你回答了我的问题。抱歉重复了。

标签: php mysql pdo


【解决方案1】:

尝试为参数使用不同的名称,即使您使用相同的值:

$db = static::getDB();
$sql = 'SELECT * FROM djs WHERE day = :day 
                 AND start_hour > :hr1 AND end_hour <= :hr2 
                 AND shifts LIKE :shift';

$stmt = $db->prepare($sql);
$stmt->bindParam(':day', $arr['day'], PDO::PARAM_STR);
$stmt->bindParam(':hr1', $arr['hr'], PDO::PARAM_INT);
$stmt->bindParam(':hr2', $arr['hr'], PDO::PARAM_INT);
$stmt->bindParam(':shift', $shift, PDO::PARAM_STR);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_OBJ);

【讨论】:

  • 所以唯一的选择就是像我在问题中提到的那样重复自己?为什么 PDO 不允许在同一个查询中使用相同的命名参数两次?对我来说似乎有点奇怪。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多