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);
答
语法不正确,您传递'重复更新'并且它的规则是插入的值。正确的查询将是
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
);
答
此代码是一个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);
警告,你的代码容易受到SQL注入 –
我有脚本针对一些保护,但我已经尝试过了我自己,它被修补。 – Daniel
@Daniel不一定,我们不知道他在将变量放入查询之前对变量做了什么,他可能会调用'mysql_real_escape_string'。 @Daniel你可能更适合为用户创建另一个表,并且你可以做一个简单的查找,以查看该用户名是否存在,如果不创建它,并将用户的Id放在高分表中。 – JConstantine