2011-07-17 133 views
2

我有一個是動態生成的形式。最終用戶將能夠向數據庫提交員工詳細信息。因此,數組$ fname將包含所有名字,$ lname所有姓氏等。然後,將陣列插入MySQL的,像這樣:消毒的Array

$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"; 
    } 

這工作偉大,直到我們有危險的字符,如單引號e.g MC'Mahon,這使得查詢失敗。我不能使用許多正常的函數,例如mysqli_real_escape_string(),因爲這是一個數組。 有沒有一種方法來消毒陣列即逃離陣列內的任何危險字符,以便我將其推入他們的循環,將每個陣列成字符串,然後進入MySQL的前消毒每個陣列?

+4

你應考慮使用[PDO庫](http://php.net/manual/en/book.pdo.php)。 –

+2

您沒有將數組插入數據庫,您從數組中插入字符串。你可以也應該消毒他們。 – 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()需要傳遞數據庫連接作爲參數,以便在上述生成錯誤之一。我不是很確定array_map需要什麼參數,所以我仍然在弄清楚如何傳遞數據庫連接。 – Bululu

+0

@Bululu - 確保您建立使用以上是'mysqli_connect'或'$ = mysqli的新的mysqli()這些行到MySQL的連接;'。如果您使用'mysql_connect',則需要使用'mysql_real_escape_string'。在任何情況下,您都不需要指定「鏈接」,就好像沒有指定「鏈接」一樣,它將使用最近的連接,因此您應該先連接。 –

+0

@Franchois我有如下的數據庫連接在行的頂部。 $ dbc = mysqli_connect(localhost,root,user_password,some_db);我認爲$ DBC需要傳遞給mysqli_real_escape_string()函數,因爲它是一個MySQL的功能, – Bululu