PDO MySQL查询失败,并且有多个比较运算符

时间:2019-01-28 12:59:46

标签: php mysql pdo

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

1 个答案:

答案 0 :(得分:5)

即使使用相同的值,也请尝试对参数使用不同的名称:

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