1

我正在尝试创建一个函数来获取表格中的所有帖子。我还想添加一个可选的 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"); 然后我得到这个错误:

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /Applications/MAMP/htdocs/sandbox/blog2/functions.php:19 中的第 1 行的“1”附近使用正确的语法 堆栈跟踪:#0 /Applications /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') #2 {main} 在第 19 行的 /Applications/MAMP/htdocs/sandbox/blog2/functions.php 中抛出

谁能告诉我我哪里出错了?

4

4 回答 4

3

1不是字符串,所以不要在此处加上引号:get_all_posts($conn, 1);

于 2012-11-06T23:00:15.683 回答
1

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

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

于 2012-11-06T23:02:47.127 回答
0

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

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

清除任何变量类型问题

于 2012-11-06T23:03:15.070 回答
0

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

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

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

而是将参数设置为整​​数,你很好。

$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;

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

于 2012-11-06T23:22:45.400 回答