0

你如何使用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.')';
4

2 回答 2

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;
于 2012-07-25T16:32:28.870 回答
0

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

于 2012-07-25T17:47:05.640 回答