1

1 つの準備済みステートメントでデータベースをフェッチし、配列値で実行できるソリューションを探していました

通常、私は自分のステートメントでこれを行います:

$search = $db->prepare("SELECT * FROM table WHERE name = ?");
$search->execute(array($name));

しかし、次のような配列がある場合はどうなりますか:

Array ( 
  [0] => Array 
  ( 
    [name] => Burger Joint 
  ) 
  [1] => Array 
  ( 
    [name] => Burger Joint 
  ) 
  [2] => Array 
  ( 
    [name] => Burgers 
  ) 
  [3] => Array 
  ( 
   [name] => Meats 
  )
)

WHERE name=?ステートメントの配列の値のいずれかを使用して、データベースを何らかの形で調べたいと思います。ただし、似たような名前が複数ある場合があります。配列を事前に圧縮する方法はありますか、またはこのような状況でのベストプラクティスは何ですか?

ありがとう!

4

3 に答える 3

0

これはさまざまな方法で行うことができますが、言及したので、それをOR使用しましょう。

まず、可能な値の配列。配列を取得して、一意の値の配列に成形しましょう。

$values_array = array_unique(
    array_map(
        function($element) { 
            return $element['name']; 
        },
        $original_array
    )
);
// $values_array now contains array('Burger Joint', 'Burgers', 'Meats')

ここで、可能な値と同じ数のプレースホルダーを導入して、準備されたクエリを作成します。

$query = sprintf('SELECT * FROM table WHERE %s',
    implode(
        ' OR ',
        array_fill(
            'name = ?', 
            count($values_array)
        )
    )
);
// $query now contains 'SELECT * FROM table WHERE name = ? OR name = ? OR name = ?'

そしてそれを実行します:

$search = $db->prepare($query);
$search->execute($values_array);

INまたは、代わりに使用して、次のようにクエリを作成することもできます。

$query = sprintf('SELECT * FROM table WHERE name in (%s)',
    implode(
        ', ',
        array_fill(
            '?', 
            count($values_array)
        )
    )
);
// $query now contains 'SELECT * FROM table WHERE name in (?, ?, ?)'

$search = $db->prepare($query);
$search->execute($values_array);

これは同じ効果があり、コードを見ると何が起こっているのかが少し明確になります。

于 2013-12-03T13:51:37.770 に答える
-1

First, you need IN. field IN (1,2) is equal to field=1 OR field=2.
Next, you need some sort of helper function, to put all that mess of technical details of creating correct SQL statements away from application business code. To make it in ONE line, not 50.

$data = $db->getAll("SELECT * FROM table WHERE name IN (?a)",$names);

Finally, it seems you're getting your names from another query.
In this case you have to run only single query using JOIN. You may ask another question under [mysql] tag providing both your queries.

To get only names into array you have to use another helper function (though you have to create it yourself or get somewhere first):

$names = $db->getCol("here goes your query to get names");
于 2013-02-21T07:31:28.833 に答える
-1

name INの代わりに試してくださいname =

于 2013-02-21T07:08:55.850 に答える