我正在为简报订阅者撰写HTML表单。到目前为止,表单通过使subscriber_email字段在mysql表中唯一并使用:
来忽略重复条目 "INSERT IGNORE INTO newsletter_subscriber_popup (subscriber_name, subscriber_email)
VALUES ('$subscriber_name', '$subscriber_email')";
我正在尝试改进表单,以便在表中已存在电子邮件时更新其他字段,如果电子邮件不存在,则会插入新记录。为此我正在这样做(到目前为止它有效,但我觉得这不是正确的方法):
//HTML form variables----------------------------------------------------//
$subscriber_name = mysql_real_escape_string($_POST['subscriber_name']);
$subscriber_email = mysql_real_escape_string($_POST['subscriber_email']);
//Try update into DB---------------------------------------------------------//
$sqlUpdate =
"UPDATE newsletter_subscriber_popup
SET subscriber_name = '$subscriber_name'
WHERE subscriber_email = '$subscriber_email'";
if(!mysql_query($sqlUpdate)){
//Insert into DB--------------------------------------------------------//
$sqlInsert =
"INSERT IGNORE INTO newsletter_subscriber_popup (subscriber_name, subscriber_email)
VALUES ('$subscriber_name', '$subscriber_email')";
if(!mysql_query($sqlInsert)){
die('Error: ' .mysql_error());
}
}
脚本在subscriber_email存在时起作用,它会更新其他字段但在插入新记录时失败。
修改----------------------------
ON DUPLICATED KEY UPDATE 是我正在寻找的。当subscriber_email已经存在时,脚本现在更新其他字段,并在subscriber_email不存在时插入新记录。
//HTML form variables----------------------------------------------------//
$subscriber_name = mysql_real_escape_string($_POST['subscriber_name']);
$subscriber_email = mysql_real_escape_string($_POST['subscriber_email']);
//Insert into DB--------------------------------------------------------//
$sqlName =
"INSERT IGNORE INTO newsletter_subscriber_popup (subscriber_name, subscriber_email)
VALUES ('$subscriber_name', '$subscriber_email')
ON DUPLICATE KEY UPDATE subscriber_name = '$subscriber_name'";
if(!mysql_query($sqlName)){
die('Error: ' .mysql_error());
}
注意:感谢您提供有关sql注入的所有建议,但问题与安全无关。
答案 0 :(得分:1)
INSERT .. ON DUPLICATE KEY UPDATE可能正是您正在寻找的。见https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
您需要在subscriber_email上设置唯一约束。
答案 1 :(得分:0)
NO。它不是防SQL注入的。如果somwone进入a = 1或1 = 1'作为subscriber_email,他将更新所有条目。查看Wikipedia: SQL-Injection和PHP-Doc to prepared statements
答案 2 :(得分:0)
首先,至少使用sqli而不是sql。这里有一篇关于PHP http://php.net/manual/en/security.database.sql-injection.php
中sql注入的文档此外,如果您不确定来自用户的输入(例如电子邮件地址),则可以使用电子邮件解析器http://php.net/manual/en/ref.mailparse.php(服务器端)。在客户端和服务器端验证价值是一种很好的做法。
请记住,表单条目的更多规则意味着更高的安全性,从而减少sql注入漏洞。