如何使用INSERT INTO On Duplicate Key UPDATE
进行表单输入?我在网上找到的所有例子都有计数器或预定值。
我已经能够使用标准UPDATE
和SET
方法让我的代码工作(感谢一些非常有帮助的成员),但我的表真的要求使用INSERT INTO On Duplicate Key UPDATE
'user_id'
是所有表中唯一的主键,除了帐户表外,它都是外键。
<?php
session_start();
require_once('config.php');
require_once('open_db.php');
$setlist='';
foreach ($_POST as $key=>$value) {
$setlist.=$key .'=\''.$value.'\',';
}
$setlist=substr($setlist, 0, -1);
$user_id=$_SESSION['SESS_USER_ID'];
$sql='UPDATE style_test SET '.$setlist.' WHERE user_id='.$user_id;
if (!mysql_query($sql,$con)) {
die('Error: ' . mysql_error());
}
?>
我以前用来自动插入每个字段的代码是:
$fieldlist=$vallist='';
foreach ($_POST as $key => $value) {
$fieldlist.=$key.',';
$vallist.='\''.urlencode($value).'\',';
}
$fieldlist=substr($fieldlist, 0, -1);
$vallist=substr($vallist, 0, -1);
$user_id=$_SESSION['SESS_USER_ID'];
$fieldlist.=', user_id';
$vallist.=','.$user_id;
$qry='INSERT INTO style_test1 ('.$fieldlist.') VALUES ('.$vallist.')';
答案 0 :(得分:2)
语法高亮显示器显示您的问题所在:
$sql='UPDATE style_test SET ;.$setlist.' WHERE user_id='.$user_id;
^
Here
这需要单引号:
$sql='UPDATE style_test SET '.$setlist.' WHERE user_id='.$user_id;
您还应该注意,mysql_*
函数已被弃用,您不应该使用它们。此外,您的原始代码对SQL注入是开放的。
对于重复密钥更新,您可以将其添加到SQL查询中,然后添加要更新的所有column = value
字段:
$sql='INSERT INTO style_test SET ' . $setlist.' WHERE user_id = ' . $user_id. ' ON DUPLICATE KEY UPDATE ' . $setlist;
答案 1 :(得分:0)
确保您正在转发表单输入。现在你对SQL注入持开放态度。至少使用类似mysql_real_escape_string的东西或使用is_numeric来确保数值是数字而不是SQL。您拥有非常危险的代码,因为它会占用用户键入的任何内容并将数据库暴露给它。