PHP PDO准备语句不会用冒号工作(:),只能用美元符号变量($)[复制]

问题描述 投票:2回答:1

这个问题已经在这里有一个答案:

我正在写一个分页脚本,而留下不相关的细节,现在是这样的:

$starting_limit = ($page-1)*$limit;
$show  = "SELECT * FROM company ORDER BY id ASC LIMIT :starting_limit, :limit";

$r = $pdo->prepare($show);
$r->execute(array(':starting_limit' => $starting_limit, ':limit' => $limit));

当我运行它,我得到一个错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL syntax; 
check the manual that corresponds to your MariaDB server version for the right 
syntax to use near ''0', '10'' at line 1' in C:\xampp\htdocs\plain-
pkr\tutorial_pagination.php:34 Stack trace: #0 C:\xampp\htdocs\plain-
pkr\tutorial_pagination.php(34): PDOStatement->execute(Array) #1 {main} thrown 
in C:\xampp\htdocs\plain-pkr\tutorial_pagination.php on line 34

但是,当我改变:参数设置为$参数,它的工作原理:

$starting_limit = ($page-1)*$limit;
$show  = "SELECT * FROM company ORDER BY id ASC LIMIT $starting_limit, $limit";

$r = $pdo->prepare($show);
$r->execute();

为什么?

php pdo prepared-statement
1个回答
2
投票

尽量做到INT,因为你的错误味精显示你正在处理limitoffset为字符串即'0', '10'不是整数,因为与PDOStatement::execute,所有值都被视为PDO :: PARAM_STR。

$r->bindValue(':starting_limit', $starting_limit, PDO::PARAM_INT);
$r->bindValue(':limit', $limit, PDO::PARAM_INT);
$r->execute();

或者您可以使用此停止生产的数字参数报价

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
© www.soinside.com 2019 - 2024. All rights reserved.