当前位置: 首页 > 面试题库 >

MySQL上的LIMIT关键字,带有准备好的语句[重复]

空翼
2023-03-14
问题内容

这个问题已经在这里有了答案

如何在LIMIT子句中应用bindValue方法? (10个答案)

5年前关闭。

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的错误中看到这是先前版本中的错误,但我不知道是否仍要解决。

如果仍然存在问题,是否可以通过另一种方式选择行范围?

码:

$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()
的手册页说(强调我的意思):

参量

input_parameters一个值数组,其中元素的数量与要执行的SQL语句中绑定参数的数量相同。 所有值均视为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

文档怎么说:

LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这些参数都必须是非负整数常量,但以下情况除外:

  • 在准备好的语句中,LIMIT可以使用?指定参数。占位符标记。

  • 在存储的程序中,LIMIT可以使用整数值的例程参数或局部变量来指定参数。

您的选择包括:

  • 一对一绑定参数,以便您可以设置类型:

    $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);
    


 类似资料:
  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行时都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做

  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 我正在寻找一种用Java转义MySQL查询的字符串的方法。 但等一下,在你们中的一些人直接下结论说“事先准备好的声明”之前,我想再解释一下。

  • 问题内容: 这个问题已经在这里有了答案 : 如何在LIMIT子句中应用bindValue方法? (10个答案) 5年前关闭。 我在应用程序中使用PDO。但是在包含的查询中使用准备好的语句时遇到问题。有什么问题? 代码: 错误: 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“ 0”,“ 20”附近使用 问题答案: 关于在带有预备语句的MySQL上发布LIMIT关键字,以下代码可以