我确定我的格式化格式不正确,但是我的一个查询中出现了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
是否大于:hr
且end_hour
小于或等于:hr
。我一定做错了。有指针吗?这是因为我在查询中两次使用了相同的命名参数:hr
,但只绑定了一次?如果是这样,除了设置具有相同数据的另一个命名参数外,解决方案是什么?
答案 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);