这是使用PHP更新/插入记录的正确方法吗?

时间:2015-08-19 12:33:52

标签: php html mysql forms

我正在为简报订阅者撰写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注入的所有建议,但问题与安全无关。

3 个答案:

答案 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-InjectionPHP-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注入漏洞。