Php 在表单输入的重复密钥更新中使用INSERT INTO

Php 在表单输入的重复密钥更新中使用INSERT INTO,php,mysql,on-duplicate-key,Php,Mysql,On Duplicate Key,如何在重复密钥更新时使用INSERT-in-Duplicate Key UPDATE进行表单输入?我在网上找到的所有例子都带有计数器或预定值 我已经能够使用标准的UPDATE和SET方法使我的代码正常工作(多亏了一些非常有用的成员),但是我的表确实需要使用INSERT-in-On-replicate-Key-UPDATE “user\u id”在所有表中都是唯一的主键,在除account表外的所有表中都是外键 <?php session_start(); require_once('c

如何在重复密钥更新时使用
INSERT-in-Duplicate Key UPDATE
进行表单输入?我在网上找到的所有例子都带有计数器或预定值

我已经能够使用标准的
UPDATE
SET
方法使我的代码正常工作(多亏了一些非常有用的成员),但是我的表确实需要使用
INSERT-in-On-replicate-Key-UPDATE

“user\u 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());
}         
?>

语法高亮显示了问题所在:

$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注入非常开放

对于on duplicate key update,您可以将其添加到SQL查询中,然后是要更新的所有
column=value
字段:

$sql='INSERT INTO style_test SET ' . $setlist.' WHERE user_id = ' . $user_id. ' ON DUPLICATE KEY UPDATE ' . $setlist;

确保您正在转义表单输入。现在,您可以使用SQL注入。至少使用类似mysql\u real\u escape\u string的东西,或者使用is\u numeric来确保数值是数字而不是SQL。您拥有的代码非常危险,因为它接受用户键入的任何内容,并将您的数据库暴露于此

成功了:-D感谢您捕捉到:-)现在,它工作了,它让我意识到我真的需要使用“复制密钥更新”,我相应地编辑了这个问题。我也感谢您指出其他问题,我将尽快研究如何修改代码以防止注入。我不确定你所说的mysql_*函数被弃用是什么意思,因为我使用的代码是基于W3C建议的代码,我在他们弃用的函数列表中找不到任何问题。最好使用:$result=@mysql\u query($qry);如果($result){exit();}或者{die('Error:'.mysql_Error());}而不是:$if(!mysql_query($sql,$con)){die('Error:'.mysql_Error());}否,则您正在抑制错误。你应该使用。有很多关于stackoverflow和文档的例子可以让你开始学习。我会研究一下:-)但是你能帮我澄清一下我的代码中的哪一部分是由于被弃用而导致的问题吗?
mysql\u query()
被弃用了,你可以看到上面的红色框。另外,问题的另一部分是SQL注入,如果您使用准备好的语句(所有您可以搜索示例的内容),PDO可以修复SQL注入。谢谢您的建议。我将尽快研究如何修改代码以防止注射:-)@Nathaniel Ford-我一定会尽快这样做:-)我之前的一个问题在评论中被其他人回答了-我是否应该接受即使实际答案不正确?如果在合理的时间后没有人回答,如果你找到了另一个解决方案,你应该发布你自己的、正确的解决方案并接受它。这将确保未来的搜索者找到他们需要的答案!你完全正确,而我就是这么做的
$sql='INSERT INTO style_test SET ' . $setlist.' WHERE user_id = ' . $user_id. ' ON DUPLICATE KEY UPDATE ' . $setlist;