首页 > 解决方案 > PDO MySQL 查询因多个比较运算符而失败

问题描述

我确定我只是错误地格式化了它,但是我的一个查询出现了 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在查询中两次使用相同的命名参数但只绑定一次?如果是这样,除了使用相同的数据设置另一个命名参数之外,解决方案是什么?

标签: phpmysqlpdo

解决方案


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

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

推荐阅读