对表单输入的重复键UPDATE使用INSERT INTO


Using INSERT INTO On Duplicate Key UPDATE for form input

如何使用INSERT INTO On Duplicate Key UPDATE进行表单输入?我在网上找到的所有例子都有计数器或预定值。

我已经能够使用标准的UPDATESET方法让我的代码工作(多亏了一些非常有用的成员),但我的表确实需要使用INSERT INTO On Duplicate Key UPDATE

'user_id'在所有表中是唯一的主键,在除account表之外的所有表中都是外键。

<?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.')';

语法高亮显示问题所在:

$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;

确保您正在转义表单输入。现在您对SQL注入持开放态度。至少使用类似mysql_real_eescape_string的东西,或者使用is_numeric来确保数值是数字而不是SQL。你有非常危险的代码,因为它接受了用户键入的任何内容,并将你的数据库暴露给它。