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

参数化的PDO查询和LIMIT子句-无效

裘安阳
2023-03-14
问题内容

我有这样的查询:

SELECT imageurl 
FROM entries 
WHERE thumbdl IS NULL 
LIMIT 10;

它与PDO和MySQL Workbench完美配合(根据需要返回10个URL)。

但是我试图LIMIT用PDO 参数化:

$cnt = 10;
$query = $this->link->prepare("
             SELECT imageurl 
             FROM entries 
             WHERE imgdl is null 
             LIMIT ?
         ");

$query->bindValue(1, $cnt);

$query->execute();

$result = $query->fetchAll(PDO::FETCH_ASSOC);

返回空数组


问题答案:

我只是测试了很多案例。我在OS X上使用PHP 5.3.15,并查询MySQL 5.6.12。

如果您进行以下设置,则任何组合均有效:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

以下所有工作 :您可以使用an int或字符串;您不需要使用PDO :: PARAM_INT。

$stmt = $dbh->prepare("select user from mysql.user limit ?");

$int = intval(1);
$int = '1';

$stmt->bindValue(1, 1);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindValue(1, '1');
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindValue(1, 1, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindValue(1, '1', PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindParam(1, $int);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindParam(1, $string);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindParam(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindParam(1, $string, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

您还可以忘记bindValue()或bindParam(),而是将数组参数中的int或字符串传递给execute()。这可以很好地工作并且做同样的事情,但是使用数组更简单,并且通常更便于编码。

$stmt = $dbh->prepare("select user from mysql.user limit ?");

$stmt->execute(array($int));
print_r($stmt->fetchAll());

$stmt->execute(array($string));
print_r($stmt->fetchAll());

如果启用了模拟准备,则只有一种组合有效:必须使用整数作为参数, 并且 必须指定PDO :: PARAM_INT:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

$stmt = $dbh->prepare("select user from mysql.user limit ?");

$stmt->bindValue(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

$stmt->bindParam(1, $int, PDO::PARAM_INT);
$stmt->execute();
print_r($stmt->fetchAll());

如果您已启用模拟准备,则将值传递给execute()无效。



 类似资料:
  • 问题内容: 这是我的尝试: 问题答案: 我发布后马上想通了:

  • 问题内容: 我正在将几个已硬编码到应用程序中的查询转换为动态的参数化查询。我遇到一个特定的查询,该查询有一个子句: 第一个参数很简单,因为它只是一个普通参数: 但是,第二个参数是一个整数列表,表示需要更新的行的ID。如何为单个参数传递整数列表?或者,您将如何设置此查询,以使您不必每次调用时都完全构建它,并且可以防止SQL注入攻击? 问题答案: 您可以基于(可能)可变数量的参数“动态”构建参数化查询

  • 问题内容: 如标题所述,我想要一个解决方法… 干杯 问题答案: 您可能会希望将an添加到嵌套查询中。

  • 本文向大家介绍MySQL对limit查询语句的优化方法,包括了MySQL对limit查询语句的优化方法的使用技巧和注意事项,需要的朋友参考一下 当我们的网站达到一定的规模时,网站的各种优化是必须要进行的。而网站的优化中,针对数据库各种优化是最重点的了。下面作者将要和大家分享一下MySQL数据库中的查询语句有关limit语句的优化。 大家都知道一般limit是用在分页的程序的分页上的,当你的应用数据

  • 本文向大家介绍mysql优化limit查询语句的5个方法,包括了mysql优化limit查询语句的5个方法的使用技巧和注意事项,需要的朋友参考一下 mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须

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