使用INSERT INTO On Duplicate Key UPDATE进行表单输入

时间:2012-07-25 16:31:34

标签: php mysql on-duplicate-key

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

我已经能够使用标准UPDATESET方法让我的代码工作(感谢一些非常有帮助的成员),但我的表真的要求使用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.')';

2 个答案:

答案 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。您拥有非常危险的代码,因为它会占用用户键入的任何内容并将数据库暴露给它。