gpt4 book ai didi

php - 带有准备语句的 MySQL 上的 LIMIT 关键字

转载 作者:IT老高 更新时间:2023-10-28 23:50:26 25 4
gpt4 key购买 nike

SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT ?, ?

使用 PDO(我正在使用具有 Apache 2.2.21、PHP 最高 5.3.6 和 MySQL 5.5.9 的 MAMP 2.0.5)准备好的语句,如果我更改查询,这将不起作用

LIMIT 0, 10

它有效。

我在 MySQL 的 bug 中看到这是以前版本的 bug,但我不明白这是否仍然需要修复。

如果这仍然是一个问题,有没有办法以另一种方式选择一系列行?

代码:

$comments = $db->prepare($query); 
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));

最佳答案

问题来了:

$comments = $db->prepare($query); 
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));

PDOStatement::execute() 的手册页|说(强调我的):

Parameters

input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.

因此,您的参数将作为字符串插入,因此最终的 SQL 代码如下所示:

LIMIT '0', '10'

这是 MySQL 不会强制转换为数字但会触发解析错误的特殊情况:

mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1

什么docs不得不说:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

  • Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.

  • Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

您的选择包括:

  • 参数一一绑定(bind),可以设置类型:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
  • 不要将这些值作为参数传递:

    $query = sprintf('SELECT id, content, date
    FROM comment
    WHERE post = ?
    ORDER BY date DESC
    LIMIT %d, %d', $min, $max);
  • 禁用模拟准备(MySQL 驱动程序有一个错误/功能会使其引用数字参数):

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

关于php - 带有准备语句的 MySQL 上的 LIMIT 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com