PHP PDO fetchAll()返回空数组

时间:2012-07-06 10:28:49

标签: php mysql pdo

这是我的代码

$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替换参数时,效果很好。

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,这是必须要做的事情。