PDO LIMIT 和 OFFSET [重复]

Posted

技术标签:

【中文标题】PDO LIMIT 和 OFFSET [重复]【英文标题】:PDO LIMIT and OFFSET [duplicate] 【发布时间】:2011-07-27 09:51:12 【问题描述】:

可能重复:php PDO bindValue in LIMIT

在prepare语句中使用LIMIT和/或OFFSET时无法显示数据,但是如果不使用LIMIT和OFFSET可以显示“雷雷”,是不是代码看起来不对?

$statement = $conn->prepare("SELECT id,username FROM public2 WHERE username = :name LIMIT :sta OFFSET :ppage");
$name = "Lei Lei";
$statement->execute(array(':name' => $name,':sta' => $start,':ppage' => $per_page));

这已从有效的原始代码更改:

$query_pag_data = "SELECT id,username from public2 LIMIT $start, $per_page";
$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());

【问题讨论】:

你有什么理由运行$statement->execute() 两次?你在执行后使用$statement->fetch()$statement->fetchAll() 来检索结果吗? 更新我的帖子,我正在使用 $statement->fetch() 【参考方案1】:

我找到了答案!

$statement->bindValue(':sta1', (int) $start, PDO::PARAM_INT); 

有效

【讨论】:

谢谢。我想知道为什么我的 LIMIT :count 不起作用。看起来它被转换为字符串。【参考方案2】:
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

会让你绑定变量而不用担心它们类型

【讨论】:

为什么在调用后添加 PDO::PARAM_INT 时还要这样做? 这也允许你使用普通的数组绑定而不是 $statement->bindValue。 +1【参考方案3】:

编辑:固定

$statement = $conn->prepare("SELECT id,username FROM public2 WHERE username = :name LIMIT :limit OFFSET :offset");
$name = "Lei Lei";
$statement->bindValue(':name', $name);
$statement->bindValue(':limit', (int) $start, PDO::PARAM_INT);
$statement->bindValue(':offset', (int) $per_page, PDO::PARAM_INT);
$statement->execute();

【讨论】:

@proyb2 尝试不使用原始查询中的 OFFSET:SELECT id, username FROM public2 WHERE username = :name LIMIT $start , $per_page 我明白了,那么如何将 LIMIT 添加到 prepare 语句中? 我找到了答案! $statement->bindValue(':sta1', (int) $start, PDO::PARAM_INT);确实有效 你错了。这样做违背了准备好的陈述的想法 讨厌死一个线程...但是编辑后的版本将参数绑定到错误的名称...给定 SQL 语句中的参数 "... LIMIT :limit OFFSET :offset" 你应该将 $start 绑定到 offset 并将 $per_page 绑定到 limit

以上是关于PDO LIMIT 和 OFFSET [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在查询中使用 PDO 准备好的语句和 LIMIT 时出错 [重复]

Oracle 中分页的 LIMIT 和 OFFSET 的替代方法 [重复]

如何在 SQL Server 2005 中使用 LIMIT [X] OFFSET [Y] [重复]

PDO 准备语句限制不起作用 [重复]

MySQL与PDO [重复]

PDO:无法传递变量来准备[重复]