【发布时间】: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 语句,以使用我拥有的信息(以表格形式发送的电子邮件以测试它是否已经在数据库中)测试重复的电子邮件。
【问题讨论】: