2011-08-19 113 views
1

我想要做的是做一個高分頁面,每次更新時我希望它進入相同的條目,所以如果用戶名是重複的,我希望它用當前信息更新然後發佈的信息,在看了一些在互聯網上的東西后,我嘗試了下面的代碼,這給了我錯誤列計數不匹配第1行的值計數。任何人都可以告訴我我做錯了,因爲我是對PHP + MySql非常新穎。INSERT ... ON DUPLICATE UPDATE

mysql_query("INSERT INTO $table(Username, Time, Videos, Credits) VALUES ('$user', '$time', '$videos', '$credits', 
    'ON DUPLICATE KEY UPDATE', Time='Time+$time', Videos='Videos+$videos', Credits='Credits+$credits')", $conn); 
+4

警告,你的代碼容易受到SQL注入 –

+0

我有腳本針對一些保護,但我已經嘗試過了我自己,它被修補。 – Daniel

+2

@Daniel不一定,我們不知道他在將變量放入查詢之前對變量做了什麼,他可能會調用'mysql_real_escape_string'。 @Daniel你可能更適合爲用戶創建另一個表,並且你可以做一個簡單的查找,以查看該用戶名是否存在,如果不創建它,並將用戶的Id放在高分表中。 – JConstantine

回答

6

語法不正確,您傳遞'重複更新'並且它的規則是插入的值。正確的查詢將是

mysql_query(" 
    INSERT INTO 
     $table(Username, Time, Videos, Credits) 
    VALUES 
     ('$user', '$time', '$videos', '$credits') 
    ON DUPLICATE KEY UPDATE 
     Time=Time+'$time', 
     Videos=Videos+'$videos', 
     Credits=Credits+'$credits' 
    ", 
    $conn 
); 
+0

這工作,謝謝:) – Daniel

+0

修復了亞注入SQL注入(除動態表名稱)。 – Johan

1

此代碼是一個SQL注入噩夢。

確保針對白名單檢查動態表的名字,像這樣:

$user = mysql_real_escape_string($_GET['user']); 
$time = mysql_real_escape_string($_GET['time']); 
$videos = mysql_real_escape_string($_GET['videos']); 
$credits = mysql_real_escape_string($_GET['credits']); 

$allowed_tables = array('table1', 'table2'); 
$table = $_POST['table']; 
$query = ""; //do nothing 

if (in_array($table, $allowed_tables)) { //<<-- check against whitelist. 
    $query = " 
    INSERT INTO 
     $table(Username, Time, Videos, Credits) 
    VALUES 
     ('$user', '$time', '$videos', '$credits') 
    ON DUPLICATE KEY UPDATE 
     Time=Time+'$time', 
     Videos=Videos+'$videos', 
     Credits=Credits+'$credits' 
    " 
}  
mysql_query($query, $con); 
相關問題