这是我的代码
$PageNumber = $_GET["p"];
if (!isset($PageNumber) || $PageNumber < 1 || !is_int($PageNumber))
$PageNumber = 1;
$PageSize = 3;
$strSQL = $dbCon->prepare("SELECT * FROM News WHERE isActive = 1 ORDER BY NewsID DESC LIMIT (:PageNumber - 1)*:PageSize, :PageSize;");
$strSQL->bindParam(":PageNumber", $PageNumber, PDO::PARAM_INT);
$strSQL->bindParam(":PageSize", $PageSize, PDO::PARAM_INT);
$strSQL->execute();
$Result = $strSQL->fetchAll();
if (count($Result) != 0) {
print_r($Result);
} else {
echo "no record";
}
我确定存在行,但输出为no record
,当我用默认值LIMIT 0,3
替换参数时,效果很好。
答案 0 :(得分:1)
试试这个,因为你尝试在预备语句中使用数学运算符,我只是替换了它们并在分配的位置进行了。
$PageNumber = $_GET["p"];
if (!isset($PageNumber) || $PageNumber < 1 || !is_int($PageNumber))
$PageNumber = 1;
$PageSize = 3;
$strSQL = $dbCon->prepare("SELECT * FROM News WHERE isActive = 1 ORDER BY NewsID DESC LIMIT :PageNumber, :PageSize;");
$strSQL->bindParam(":PageNumber", ($PageNumber - 1) * $PageSize, PDO::PARAM_INT);
$strSQL->bindParam(":PageSize", $PageSize, PDO::PARAM_INT);
$strSQL->execute();
$Result = $strSQL->fetchAll();
if (count($Result) != 0) {
print_r($Result);
} else {
echo "no record";
}
答案 1 :(得分:1)
因为你没有捕获异常,但我猜你做错了。在PDO中你的bindValue或bindParam变量应该等于在查询中使用。我的意思是
$strSQL = $dbCon->prepare("SELECT * FROM News WHERE isActive = 1 ORDER BY NewsID DESC LIMIT :Start, :PageSize;");
$strSQL->bindParam(":Start",($PageNumber - 1)*$PageSize, PDO::PARAM_INT);
$strSQL->bindParam(":PageSize", $PageSize, PDO::PARAM_INT);
答案 2 :(得分:0)
我认为问题在于您使用了两次相同的令牌(“:PageSize”)。
正如php documentation of PDO::prepare()所说:
您不能在预准备语句中两次使用同名的命名参数标记。
因此,您只能使用每个令牌一次,因此您必须使用两个不同的令牌,例如“:PageSizeA”和“:PageSizeB”。
$strSQL = $dbCon->prepare("SELECT * FROM News WHERE isActive = 1 ORDER BY NewsID DESC LIMIT (:PageNumber - 1)*:PageSizeA, :PageSizeB;");
$strSQL->bindParam(":PageNumber", $PageNumber, PDO::PARAM_INT);
$strSQL->bindParam(":PageSizeA", $PageSize, PDO::PARAM_INT);
$strSQL->bindParam(":PageSizeB", $PageSize, PDO::PARAM_INT);
无论如何,@ user1432124或@ Ramesh的解决方案更好,因为它处理php中的数据而不是mysql,这是必须要做的事情。