【问题标题】:Parametrized PDO query and `LIMIT` clause - not working [duplicate]参数化 PDO 查询和“LIMIT”子句 - 不起作用 [重复]
【发布时间】:2013-08-03 01:22:12
【问题描述】:

我有这样的查询:

SELECT imageurl 
FROM entries 
WHERE thumbdl IS NULL 
LIMIT 10;

它与 PDO 和 MySQL Workbench 完美配合(它返回 10 个我想要的 url)。

但是我尝试使用 PDO 参数化 LIMIT

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

返回空数组。

【问题讨论】:

    标签: php pdo limit sql-parametrized-query


    【解决方案1】:

    默认bindValue绑定一个字符串值但limit是一个整数,所以使用PDO::PARAM_INT

    $query->bindValue(1, $cnt, PDO::PARAM_INT);
    

    【讨论】:

    • 这个帮助了我:)
    【解决方案2】:

    我刚刚测试了一堆案例。我在 OS X 上使用 PHP 5.3.15,并查询 MySQL 5.6.12。

    如果您设置,任何组合都有效:

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

    以下所有工作:您可以使用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() 不起作用。

    【讨论】:

    • 感谢您提供有关 PDO 中参数的大量有用信息! :)
    • 匿名投票者:请让我知道您为什么认为这个答案不正确。也许我可以改进它。
    • 好吧,我非常不喜欢匿名的downvoters,这里应该禁止:) Downvotes 也应该被解释。但你是对的,绑定发生在你所有的例子中。我读错了,所以我将撤消我的反对票。编辑:不可能,除非答案已被编辑?
    • @Terradon,谢谢,我做了一个小修改,以澄清数组方法与绑定参数的作用相同。我同意你的观点,反对票不应该是匿名的,应该需要解释。不幸的是,Stack Overflow 上的权力一再否决了这个建议。
    • 比尔,由于所有有用的信息,我能够撤消我的反对票,然后投票赞成:)
    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多