【问题标题】:PHP MySQL Prepared Query using IN使用 IN 的 PHP MySQL 准备查询
【发布时间】:2012-07-19 06:34:23
【问题描述】:

我有几个输入数组的情况,例如:

$myArray = array( "apple", "banana", "orange", "pear" );

数组中可以包含任意数量的水果。我想在 PHP 中使用 MySQL 准备好的语句来创建类似于以下内容的查询:

SELECT * FROM fruitcart WHERE fruitname IN ('apple','banana','orange','pear');

以前,我通过执行以下操作来完成此操作:

$query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . implode( "','", $myArray ) . "')";

但我想知道是否有一种方法可以用准备好的语句做类似的事情?

【问题讨论】:

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

没有办法使用准备好的语句来做到这一点。唯一的可能性是做这样的事情:

$query = "SELECT * FROM fruitcart WHERE fruitname = ? OR fruitname = ? OR fruitname = ? ...

您可以使用 foreach 循环轻松构建这样的语句。

但请注意,由于您的数组可能有不同数量的值,这可能会导致数据库优化器算法出现一些混乱。为了获得最佳性能,您可能需要准备具有例如 128、64、32、16、8、4、2、1 个插槽的语句,然后使用您可以填充的最大一个,直到您从数据库中获取所有值。这样优化器就能够处理数量有限的语句骨架。

您也可以为此使用临时表。例如,为您的值集创建一个仅包含值(apple、banana、...)和 id 的表。

然后您可以使用唯一的 set-id 将值数组插入到数据库中(例如,php 提供了一个 guid 函数),然后在子查询中选择它们:

$query = "SELECT * FROM fruitcart WHERE fruitname IN (SELECT fruitname FROM temptable WHERE setid = ?)"

这很容易准备,并且表现非常好。 您可以为 temptable 使用内存中的表,这样它会非常快。

【讨论】:

    【解决方案2】:
    $placeholders = rtrim(str_repeat('?, ', count($myArray)), ', ') ;
    $query = "SELECT * FROM fruitcart WHERE fruitname IN ($placeholders)";
    
    $stm = $db->prepare($query) ;
    $stm->execute($myArray) ;
    

    【讨论】:

      【解决方案3】:

      您正在使用正确的方法来执行此操作,您可以编辑

      $list = implode( ',', $myArray );
      $query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . $list . "')";
      

      就是这样:)

      【讨论】:

      • 数据应该与语句分开,所以,不。
      • 不是一个可准备的声明,不是吗? :)
      猜你喜欢
      • 2020-12-08
      • 2010-12-19
      • 2019-01-02
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多