18

次のような文字列に 3 つの値があります。

$villes = '"paris","fes","rabat"';

次のような準備済みステートメントにそれをフィードすると:

$sql    = 'SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN(%s)';
$query  = $wpdb->prepare($sql, $villes);

echo $query;ショー:

SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN('\"CHAPELLE VIVIERS \",\"LE MANS \",\"QUEND\"')

文字列を 3 つの個別の値として書き込むのではなく、二重引用符がエスケープされた 1 つの文字列です。

WordPress で複数の値を持つ準備済みステートメントを適切に実装するにはどうすればよいですか?

4

6 に答える 6

48

このコードを試してください:

// Create an array of the values to use in the list
$villes = array("paris", "fes", "rabat");    

// Generate the SQL statement.
// The number of %s items is based on the length of the $villes array
$sql = "
  SELECT DISTINCT telecopie
  FROM `comptage_fax`
  WHERE `ville` IN(".implode(', ', array_fill(0, count($villes), '%s')).")
";

// Call $wpdb->prepare passing the values of the array as separate arguments
$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $villes));

echo $query;
于 2012-05-17T10:45:05.630 に答える
21

WordPress には、この目的のための関数が既にあります。 esc_sql()を参照してください。この関数の定義は次のとおりです。

MySQL クエリで使用するためにデータをエスケープします。通常、wpdb::prepare() を使用してクエリを準備する必要があります。場合によっては、スポットエスケープが必要または有用です。1 つの例は、IN 句で使用する配列を準備することです。

次のように使用できます。

$villes = ["paris", "fes", "rabat"];
$villes = array_map(function($v) {
    return "'" . esc_sql($v) . "'";
}, $villes);
$villes = implode(',', $villes);
$query = "SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN (" . $villes . ")"
于 2016-04-16T14:58:15.170 に答える
-3

このprepare関数はarray、2 番目のパラメーターとしても受け取ります。

$villes次のように変換してみてください。

現時点の

<?php
$villes = '"paris","fes","rabat"';
?

に変更します

<?php
$villes = array("paris","fes","rabat");
?>

$villesここで、prepare 関数に渡して、動作するかどうかを確認してください。それが役に立てば幸い。

于 2012-05-17T10:46:12.133 に答える