我正在尝试创建一个能够获取表中所有帖子的函数。我还想添加一个可选的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}
有人能告诉我哪里出错了吗?
答案 0 :(得分:3)
1
不是字符串,因此请勿在此处加上引号:get_all_posts($conn, 1);
答案 1 :(得分:1)
默认情况下,PDO execute()
将参数视为字符串。因此它引用了"1"
。您需要使用bindParam()
。
虽然MySQL可以处理这个问题,但是你应该相应地绑定这个参数(作为INT)。有关详细信息,请参阅此related question。
答案 2 :(得分:0)
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;
这将确保在将其绑定为整数参数时使用整数类型的变量。