可选LIMIT,用于获取PDO所有帖子的功能

时间:2012-11-06 22:56:50

标签: php mysql pdo limit posts

我正在尝试创建一个能够获取表中所有帖子的函数。我还想添加一个可选的LIMIT参数。这是一个例子:

function get_all_posts($conn, $limit = 0) {
if ($limit > 0) {
    $stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit");
    $stmt->execute(array(
        ':limit' => $limit
    ));
    $results = $stmt->fetchAll();
    return $results ? $results : false ;
} else {
    $stmt = $conn->prepare("SELECT * FROM posts");
    $stmt->execute();
    $results = $stmt->fetchAll();
    return $results ? $results : false ;
}
}

如果我在不使用极限参数的情况下调用该函数,它将工作并显示所有帖子。但是如果我这样调用函数:get_all_posts($ conn,“1”);然后我收到了这个错误:

  

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在/Applications/MAMP/htdocs/sandbox/blog2/functions.php:19的第1行''''附近使用正确的语法。堆栈跟踪:#0 /应用程序/MAMP/htdocs/sandbox/blog2/functions.php(19):PDOStatement-> execute(Array)#1 /Applications/MAMP/htdocs/sandbox/blog2/index.php(12):get_all_posts(Object(PDO) ,'1')在第19行的/Applications/MAMP/htdocs/sandbox/blog2/functions.php中抛出#2 {main}

有人能告诉我哪里出错了吗?

4 个答案:

答案 0 :(得分:3)

1不是字符串,因此请勿在此处加上引号:get_all_posts($conn, 1);

答案 1 :(得分:1)

默认情况下,PDO execute()将参数视为字符串。因此它引用了"1"。您需要使用bindParam()

虽然MySQL可以处理这个问题,但是你应该相应地绑定这个参数(作为INT)。有关详细信息,请参阅此related question

答案 2 :(得分:0)

像Sammitch说的那样,因为它是一个字符串,而不是一个整数。用此来修复:

if (is_numeric($limit)) {
    $limit = (int)$limit;
    ... 

清除任何变量类型问题

答案 3 :(得分:0)

LIMIT子句中,您需要一个整数参数。

在您的代码中,您传递了所有字符串的:limit' parameter's value via execute`。

字符串不是整数。这种不匹配会产生问题。

而是将参数作为整数加入,你没事。

$stmt = $conn->prepare("SELECT * FROM posts LIMIT :limit");
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$success = $stmt->execute();
$results = $stmt->fetchAll();

当你通过函数参数接受$limit变量时,你也应该清理它的值:

$limit = (int) $limit;

这将确保在将其绑定为整数参数时使用整数类型的变量。