【发布时间】:2020-08-19 01:55:26
【问题描述】:
我遇到了这个问题,找不到解决办法, 有专家可以帮我吗?
public function getComments($postId,$pageCmt){
$db = $this->dbConnect();
$cmtNb=3;
$r=($pageCmt-1)*3;
$req = $db->prepare('SELECT id, comments FROM comments WHERE post_id = ? ORDER BY ind_date DESC,date_comments DESC LIMIT ? OFFSET ?' );
$req->bindParam(1,$postId,\PDO::PARAM_INT);
$req->bindParam(2,$cmtNb,\PDO::PARAM_INT );
$req->bindParam(3,$r,\PDO::PARAM_INT);
$req->execute(array($postId,$cmtNb,$r));
return $req;
}
似乎问题来自LIMIT之后的参数, 因为如果我起飞“限制?偏移?”代码可以与第一个参数 $postId 一起使用,将获取 cmets,
但如果我添加带有“LIMIT ? OFFSET?”的代码在页面上将不会获取任何 cmets,但也不会显示任何错误,
有什么想法吗?
谢谢。
【问题讨论】:
-
我的建议是从
execute中删除参数,因为前面的bindParam调用已经完成了占位符绑定。 (我们将假设启用了 PHP 错误报告,并且 PDO 连接配置为在发生错误时抛出异常,即setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)我个人的偏好是使用bindValue代替bindParam的值在绑定时已知,我个人的偏好是使用LIMIT ? , ?形式而不是OFFSET -
首先感谢您的建议,好吧,PDO 连接似乎没问题,因为如果我删除 2e 和 3e “?”,此代码可以工作,但如果我添加 2e 和 3e 变量,即使使用bindValue,它也不能工作......!。
-
对于 debubbing,当我们离开
OFFSET ?时,只剩下LIMIT会发生什么?如果我们硬编码 LIMIT 子句,没有任何绑定占位符(作为测试),例如LIMIT 3,还是LIMIT 0,3?如果可行,那么$r的值是多少(我们可以将其转储以进行调试。 -
是的,去掉
execute中的array($postId,$cmtNb,$r)。 -
@spencer7593 你好,我今天用你的方法又试了一次,但仍然使用“LIMIT ?OFFSET ?”有用!谢谢,“vardump”真的很有用。顺便说一句,当我使用“限制?,?”它不起作用,仍然不知道为什么。
标签: php mysql sqlbindparameter