【问题标题】:PDO LIMIT and OFFSET [duplicate]PDO LIMIT 和 OFFSET [重复]
【发布时间】: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()

标签: php pdo


【解决方案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
猜你喜欢
  • 2021-05-17
  • 2020-08-19
  • 2011-02-24
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2021-05-08
  • 2020-12-30
相关资源
最近更新 更多