2012-03-16 69 views
1

所以我創建了一個簡單的PHP函數,通過更新PHP接收的數組來更新我的MySQL行。這個查詢是過度逃脫的!需要一個簡單的想法

function db_updateproduct(array $new, array $old = array()) { 
    $diff = array_diff($new, $old); 
    return 'INSERT INTO table (`'.mysql_real_escape_string(implode(array_keys($diff), '`,`')).'`) VALUES \''.mysql_real_escape_string(implode(array_values($diff), '\',\'')).'\''; 
} 

...


更新(與接受的答案)

function db_updateproduct(array $new, array $old = array()) { 
    $diff = array_diff($new, $old); 
    return 'INSERT INTO `Product` (`'.implode(array_keys($diff), '`,`').'`) VALUES (\'' 
     .implode(array_map('mysql_real_escape_string', array_values($diff)), '\', \'').'\')'; 
} 

現在...

echo db_updateproduct(array('a' => 'on\'e', 'b' => 'two', 'c' => 'three')); 

回報:

INSERT INTO `Product` (`a`,`b`,`c`) VALUES ('on\'e', 'two', 'three') 

(如預期/希望!)

+0

第一個鏡頭:爲你的查詢字符串「而不是單引號」使用雙引號,在implode中也使用「','」這應該避免混淆轉義序列 – micfra 2012-03-16 11:03:57

+0

我不明白爲什麼。 'implode(array_values($ diff),'\',\'')'我是否丟失了某些東西? – rgin 2012-03-16 11:07:36

+1

** micfra ** :,不幸的是引號仍然會被轉義 – 2012-03-16 11:23:23

回答

6

您可以run the escape function上的按鍵和值array_map()

$ escaped_keys = array_map( 'mysql_real_escape_string',array_keys($ DIFF)) ;

$escaped_values = array_map('mysql_real_escape_string', array_values($diff)); 

然後你就可以做這兩個數組,你implode()法寶。


UPDATE:作爲@YourCommonSense正確地指出了這一點,它並沒有真正意義上,這將在查詢的字段名/表名/等一起使用的值運行 mysql_real_escape_string()。它正確地逃脫 \x00\n\r\'"\x1a,但它 不逃避反引號,所以查詢仍容易受到攻擊。

您應驗證字段名稱(因此只能使用預期的名稱),或者甚至更好,使用準備好的查詢(我推薦使用PDO)。

推薦閱讀:

+0

沒有想到這一點,但聽起來很棒,謝謝!我現在就去試試吧! – 2012-03-16 11:21:09

+0

請問第一行代碼有什麼意義? – 2012-03-16 14:48:00

+0

@YourCommonSense看着這種方法,你並不知道密鑰來自哪裏。如果它們直接來自表單,那麼可以操縱鍵(因此如果沒有進行驗證就應該逃避 - 我們不知道這一點,它不在問題範圍內)。我不覺得這值得讚揚,但我明白這只是你決定如何使用它們的決定。 – kapa 2012-03-16 17:06:38

1

作爲事實上,做mysql_real_escape_string在陣列的鍵是絕對無用的動作的一個例子。

+0

事實上,這不是一個答案:)。 – kapa 2012-03-16 17:06:56

+0

是的,它是無用的。我不確定爲什麼我試圖消毒它。 但是...這不是一個答案。 – 2012-03-16 23:45:43

+1

無論如何,我會投票它,因爲這樣一個好點是值得的。如果你提供了一個解釋,爲什麼會這樣(如你在上面的評論中所做的那樣) – mkk 2012-03-17 00:09:22