INSERT ... ON DUPLICATE UPDATE

INSERT ... ON DUPLICATE UPDATE

问题描述:

我想要做的是做一个高分页面,每次更新时我希望它进入相同的条目,所以如果用户名是重复的,我希望它用当前信息更新然后发布的信息,在看了一些在互联网上的东西后,我尝试了下面的代码,这给了我错误列计数不匹配第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

语法不正确,您传递'重复更新'并且它的规则是插入的值。正确的查询将是

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

此代码是一个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);