2011-07-17 10 views
2

私は動的に生成されるフォームを持っています。エンドユーザーは従業員の詳細をデータベースに送信できます。配列$ fnameにはすべてのファーストネームが含まれ、$ lnameにはすべてのファストネームが含まれます。次いで、アレイをそのようにMySQLのに挿入されています。私たちは例えば、クエリが失敗する可能MC'Mahon、単一引用符のような危険な文字を持つまで配列のサニタイズ

$query = "INSERT INTO workers (date_added, department,fname, lname, rank) 
    VALUES "; 
    $fname = count(fname); 
    for($i=0; $i<$employee_count; $i++) { 
    $query .= "(NOW(),'$department','{$fname[$i]}','{$lname[$i]}','{$rank[$i]}'),\n"; 
    } 

これは素晴らしいに動作します。これは配列なので、mysqli_real_escape_string()のような多くの通常の関数を使うことはできません。 配列を消毒する、つまり危険な文字をエスケープする方法はありますか?それで、各配列をMySQLに入力された文字列に分割するループの前に各配列を消毒しますか?

+4

あなたは[PDOライブラリ](http://php.net/manual/en/book.pdo.php)の使用を検討する必要があります。 –

+2

DBから配列を挿入するのではなく、配列から文字列を挿入します。あなたはそれらを浄化できます。 – Thilo

+0

私は「あなただよ」もちろん、...二度を意味しました。 – Thilo

答えて

13

forループの前にarray_mapを使用できます。この関数は、配列の各値にコールバックを適用します。この場合、コールバックはmysqli_real_escape_stringになります。

$fname = array_map('mysqli_real_escape_string', $fname); 
$lname = array_map('mysqli_real_escape_string', $lname); 
$rank = array_map('mysqli_real_escape_string', $rank); 

下のコメントに基づいて更新:手続きモードでmysqli_real_escape_stringを使用するには

、あなたはカスタム関数を作成する必要がありますので、「リンク」を渡す必要があります。

function array_map_callback($a) 
{ 
    global $dbc; 

    return mysqli_real_escape_string($dbc, $a); 
} 

$fname = array_map('array_map_callback', $fname); 
$lname = array_map('array_map_callback', $lname); 
$rank = array_map('array_map_callback', $rank); 
+0

ありがとう@Francois、問題は、mysqli_real_escape_string()がデータベース接続をパラメータの1つとして渡す必要があるため、上記でエラーが発生することです。私は、どのパラメータがarray_mapに必要なのかよくわからないので、db接続を渡す方法をまだ考えています。 – Bululu

+0

@Bululu - mysqli_connectまたは$ mysqli = new mysqli();を使用して、これらの行の上にMySQLへの接続を確立することを確認してください。 mysql_connectを使用している場合は、mysql_real_escape_stringを使用します。いずれの場合も、 "link"を指定する必要はありません。何も指定されていない場合は、最新の接続が使用されます。 –

+0

@Franchois私は以下のように、行の上にデータベース接続を持っています。 $ dbc = mysqli_connect(localhost、root、user_password、some_db); $ dbcはmysqli_real_escape_string()関数に渡す必要があると思います。それはMySQLの関数だからです。 – Bululu