这个问题已经在这里有一个答案:
- 如何在LIMIT子句适用bindValue方法? 10个回答
我在我的应用程序中使用PDO。 但我有一个问题,而我在包含查询预处理语句的工作LIMIT
。 有什么问题?
代码:
$start = 0;
$rows = 20;
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?";
$q = $db->prepare($sql);
$q->execute(array($start , $rows));
错误:
检查对应于你的MySQL服务器版本使用附近的“” 0' 正确的语法手册,‘20’”
关于发布LIMIT关键字在MySQL用准备好的声明中 ,下面的代码可以解决我的问题。
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
由于阿尔瓦罗·维卡里奥G.和Maerlyn
你可以这样做:
$sql = SELECT * FROM tbl_news ORDER BY date DESC LIMIT :start, :rows";
$q = $db->prepare($sql);
$q->bindParam(':start', $start, PDO::PARAM_INT);
$q->bindParam(':rows',$rows, PDO::PARAM_INT);
它是一种已知的错误 ,将其从存储器固定5.5.6。
从文章:LIMIT不允许在任何上下文中的变量。 它的参数必须是整型常量。
进一步编辑:(有争对此事)用户变量接受LIMIT子句的参数在准备好的发言,并准备语句的SQL语法可以在存储过程中使用。
三编辑:此链接解释说,这些应与预处理语句工作。
我只是偶然发现了同样的问题。 对我来说,用我自己的发言类(延伸PDOStatement
)我自己execute()
方法固定它。
这是类:
class MyPDOStatement extends PDOStatement {
public function execute($input_parameters = null) {
if (is_array($input_parameters)) {
$i = 1;
foreach ($input_parameters as $p) {
// default to string datatype
$parameterType = PDO::PARAM_STR;
// now let's see if there is something more appropriate
if (is_bool($p)) {
$parameterType = PDO::PARAM_BOOL;
} elseif (is_null($p)) {
$parameterType = PDO::PARAM_NULL;
} elseif (is_int($p)) {
$parameterType = PDO::PARAM_INT;
}
// parameters passed to execute() are input-only parameters, so use
// bindValue()
$this->bindValue($i, $p, $parameterType);
$i++;
}
}
return parent::execute();
}
}
告诉PDO使用这个类的语句而不是默认的,这样做:
$db = new PDO(...);
$db->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement'));
现在问题的代码将工作:
$start = 0;
$rows = 20;
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?";
$q = $db->prepare($sql);
$q->execute(array($start , $rows));
你必须使舒尔的唯一的事情就是绑定到该语句的变量具有正确的类型,整数。 如果你有一个数字字符串,例如,从$_GET
数组,你可以这样做:
if (isset($_GET['start']) && is_numeric($_GET['start'])
&& is_int($_GET['start'] + 0) {
$start = (int) $_GET['start'];
}
我不是舒尔如果是过去的事情更简单的方法,但至少它为我工作得很好。
date
是你有把它包起来的保留字back-ticks
$sql = "SELECT * FROM tbl_news ORDER BY `date` DESC LIMIT ?, ?";