【问题标题】:SQL SELECT statement to check for duplicate email not working with PHP variable用于检查重复电子邮件的 SQL SELECT 语句不适用于 PHP 变量
【发布时间】:2015-10-29 16:28:23
【问题描述】:

我有一个订阅组件,它是一个简单的表单,如下所示:

<form id="newsletter_subscribe">        

    <label class="label-margin">Email<span class="required-field">*</label>
    <input type="email" name="mailinglistEmail">

    <input type="submit" value="Subscribe" class="subscribe-button float-r"> 
    <div class="clear_float"></div>

 </form>

使用 jquery 和 ajax 的组合,我序列化数据并将其发送到这样的进程文件(如果我粘贴了太多代码,我深表歉意,但我宁愿粘贴所有内容也不要太少):

$(function() {

$("#newsletter_subscribe").submit(function(event) {

    //SUPPRESS SUBMIT DEFAULT BEHAVIOUR
    event.preventDefault();

    //STRINGIFY THE SERIALIZED OBJECT OF THE FORM AND PACK INTO VARIABLE JSONstring
    var JSONstring = JSON.stringify($("#newsletter_subscribe").serializeObject());

    //AJAX REQUEST TO THE SERVER
    var subscribeRequest = $.ajax({
       url: "mailinglist-process-test.php", //URL PARAMETER CONTAINS A STRING OF THE URL SENDING THE REQUEST TO
       type: "POST",        //THE TYPE OF REQUEST BEING SENT, IE GET, POST ETC       
       data: JSONstring,    //THE ACTUAL DATA SENT TO THE SERVER WITH THE AJAX REQUEST  
       dataType: "json",    //THE TYPE OF DATA EXPECTED BACK FROM THE SERVER     
       cache: false,        //SET THIS TO FALSE TO FORCE REQUESTED PAGES TO NOT BE CACHED IN THE BROWSER         
    });
    console.log(subscribeRequest);
    //THINGS TO HAPPEN AFTER SUCCESSFUL REQUEST 
    subscribeRequest.then(function(result){
        $("#newsletter_subscribe").hide();
        queryResult = result;
        return success(queryResult);

        }).then(function(message){
                $("#subscribe_success").html(message);
            }); 

    // ########### SUCCESS FUNCTION START        
    function success(queryResult) {
        subscribed = queryResult.userSubscribe;
        if (subscribed == 'yes'){
            message = "You have successfully signed up for our newsletter.";
        }

        if (subscribed == 'duplicate'){
            message = "This email address is already subscribed.";
        } 
        return message;
    }   
    // ########### SUCCESS FUNCTION END                         
});

});

现在在进程文件中,在我插入数据库之前,我想检查电子邮件是否已经在数据库中!我正在尝试这样做:

$data = json_decode(file_get_contents('php://input'), true);

$vMailinglistDate = date('Y-m-d');

$vMailinglistEmail = strtolower(trim($data['mailinglistEmail']));   

$sql_mailinglist = "SELECT * FROM tblmailinglist WHERE MailinglistEmail = $vMailinglistEmail " ;

require('cms/inc-conn-tekiah.php');

$rs_mailinglist = mysqli_query($vConnTekiah, $sql_mailinglist);

$rs_mailinglistRows = mysqli_fetch_assoc($rs_mailinglist);

if ($rs_mailinglistRows === 0) {            

    require('inc-conn-tekiah.php');
    require('inc-function-escapestring.php'); 

    //FORMULATE THE INSERT STATEMENT    
    $sql_subscribe = sprintf("INSERT INTO tblmailinglist (MailinglistDate, MailinglistEmail) VALUES (%s, %s)",
    escapestring($vConnTekiah, $vMailinglistDate, 'text'),
    escapestring($vConnTekiah, $vMailinglistEmail, 'text')
    );

    $sql_subscribeResult = mysqli_query($vConnTekiah, $sql_subscribe);

...等插入过程继续。

在测试并试图弄清楚为什么这没有产生我想要的结果后,我发现这是因为查询中的 mysqli_result 为空!即使我测试的电子邮件肯定已经在数据库中了。

更多测试表明,如果我使用这个 select 语句并将我正在测试的电子邮件输入为单引号中的字符串,它可以正常工作:

"SELECT * FROM tblmailinglist WHERE MailinglistEmail = 'test@gmail.com' ";

但是使用该变量,SELECT 语句会输出一个看起来像这样的字符串,这显然是行不通的:

"SELECT * FROM tblmailinglist WHERE MailinglistEmail = test@gmail.com ";

我能看到的唯一区别是第一个版本中的单引号似乎使它起作用。但真正令人困惑的是,我在之前的 SELECT 语句中一直使用变量,一点问题都没有。

所以我的问题是,我应该采取什么方法来构造一个 SELECT 语句,以使用我拥有的信息(以表格形式发送的电子邮件以测试它是否已经在数据库中)测试重复的电子邮件。

【问题讨论】:

    标签: php sql variables


    【解决方案1】:

    第一种方法。这就是mysql 中的语法。所以自己加单引号

    $sql_mailinglist = "SELECT * FROM tblmailinglist WHERE MailinglistEmail = '$vMailinglistEmail' " ;
                                                                              ^                  ^
    

    【讨论】:

    • 完美!我尝试连接单引号,但那是一团糟。不知道为什么我没有想到像那样添加它们!非常感谢。
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多