web-dev-qa-db-ja.com

PHP実装するが、各要素を引用符で囲む

私は配列を持っていると仮定します:

 $elements = array('foo', 'bar', 'tar', 'dar');

次に、DELETE IN SQLクエリ:

 $SQL = "DELETE FROM elements
               WHERE id IN ('" . implode(',', $elements) . "')";

問題は、elements配列のidがそれぞれ個別に引用されていないことです。 I.Eクエリは次のようになります:

 $SQL = "DELETE FROM elements
               WHERE id IN ('foo,bar,tar,dar');

これを修正するための最良の、最もエレガントな方法は何ですか?

56
Justin

引用符をimplode呼び出しに追加します:(implodeを意味すると想定しています)

$SQL = 'DELETE FROM elements
           WHERE id IN ("' . implode('", "', $elements) . '")';

これにより、以下が生成されます。

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")

SQLインジェクションを防ぐ最善の方法は、要素が適切にエスケープされるようにすることです。

動作するはずの簡単なことは動作します(ただし、テストしていません)array_mapまたはarray_walk、および次のようにすべてのパラメーターをエスケープします。

$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
111
nickb

array_walk 要素への参照を渡す配列の内側のすべての要素を繰り返し、次のように引用符を追加します。

<?php

$arr = ['a','b','c'];

array_walk($arr, function(&$x) {$x = "'$x'";});

echo implode(',', $arr); // 'a','b','c'

?>
5
insign

ここで少し答えを追加すると、MySQLiを使用している場合でも、オブジェクトメソッドcallable形式を使用してarray_mapを使用してreal_escape_stringを呼び出すことができます。 $connがMySQLi接続であると仮定した場合の例を次に示します。

$elements = array('foo', 'bar', 'tar', 'dar');
$cleanedElements = array_map([$conn, 'real_escape_string'], $ids);
$SQL = 'DELETE FROM elements WHERE id IN ("' . implode('", "', $elements) . '")';

Array_mapの最初のパラメーターは、オブジェクトの後にメソッド名が続く配列であることに注意してください。これは、配列内の各アイテムに対して次を実行するのと同じです。

$newItem = $conn->real_escape_string($item);
0
techdude

単純なarray_map()関数を実行して文字列を引用符で囲み、それをimplode()で囲んでコンマを追加できます。

$array = ["one", "two", "three", "four"];

implode(",", array_map(function($string) {
    return '"' . $string . '"';
}, $array));
0
ssharp_wp