2011-12-09 47 views
1

我想批量插入所有POST數據,而不必單獨鍵入每個名稱/字段。最後一行mysql INSERT正確嗎?我也不需要重新處理mysql_real_escape_string() INSERT正確嗎?批量插入的foreach語句

if (is_array($_POST['add'])) 
    foreach ($_POST['add'] as $key => $value) 
    $_POST['add'][$key] = mysql_real_escape_string(stripslashes($value)); 

    mysql_query("UPDATE mem SET m_".$key."='".$value."' WHERE m_id=$id"); 

.... more code 

    mysql_query("INSERT INTO meminfo m_".$key." VALUES '".$value."'"); 
+1

請不要通過連接字符串來構建SQL。 http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – idstam

+0

@idstam他*有*連接。沒有辦法避免它。這是問題的重點。 –

+0

請記住要逃跑的鑰匙,你永遠不知道攻擊者會走多長。 – Nightwolf

回答

1

此代碼注入容易發生。

您必須將您的密鑰列入白名單才能進行保護。
這是一個爲mysql查詢生成SET語句的函數。

function dbSet($fields, $source = array()) { 
    $set=''; 
    if (!$source) $source = &$_POST; 
    foreach ($fields as $field) { 
    if (isset($source[$field])) { 
     $set.="`$field`='".mysql_real_escape_string($source[$field])."', "; 
    } 
    } 
    return substr($set, 0, -2); 
} 

像這樣使用

$fields = explode(" ","name surname lastname address zip fax phone"); 
$query = "INSERT INTO $table SET ".dbSet($fields,$_POST['add']); 
$fields = array("foo","bar"); 
$query = "UPDATE $table SET ".dbSet($fields,$_POST['add'])." where id=".intval($id); 
+0

謝謝,我現在試試這個 – acctman

+0

關於$ fields var的問題,我是否總是寫出所有的字段名稱,或者我可以做'm _「。$ _ POST ['add']。」' – acctman

+1

如果你做$ _POST ['add']你將允許SQL注入。 –

-1

你可以做這樣的事情:

$fields = $values = $set = ''; 

foreach ($_POST as $key=>$value) { 
    $fields .= '`fld_' . $key . '`,'; 
    $values .= '"' . mysql_real_escape_string($value) . '",'; 
    $set .= '`fld_' . $key . '` = "' . $mysql_real_escape_string($value) . '",'; 
} 

$fields = substr($fields, 0, -1); 
$values = substr($values, 0, -1); 
$set = substr($set, 0, -1); 

$sql_insert = 'INSERT INTO `table` (' . $fields . ') VALUES (' . $values . ');'; 
$sql_update = 'UPDATE `table` SET ' . $set . ' WHERE `fld_id`=' . $id . ';'; 

此代碼沒有經過測試,我只是寫它從我的頭頂,有可能會有一些錯誤。