所以我有一些代码,它检查是否存在一次性使用折扣代码,如果是,则应用它然后将其标记为在数据库中使用。问题是,如果垃圾邮件点击它,它最终可以使用不止一次,然后有一段时间可能会在15-20秒之后停止使用。
相关的javascript组件:
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
discountAmount += parseFloat(xmlhttp.responseText);
modifyCartOrder();
}
}
xmlhttp.open("GET","forms/jsPromoCode.php?code="+code+"&type="+order_name,true);
xmlhttp.send();
这是在php文件中处理的,当找到匹配时我们回显该数量然后删除条目
$mysqli->query("DELETE FROM discounts_available WHERE `index`=$index");
php文件确实在做它应该做的事情。单击“应用代码”时,会立即从数据库中删除它。问题是,即使代码不再在db中,你仍然可以在js文件最终意识到db中没有条目之前反复应用代码一段时间。这是为什么?
答案 0 :(得分:1)
你首先要检查它是否存在于DB中,然后只有你应该继续请求,它应该是第一个声明。 如果它不存在,您可以发送已应用代码的响应。
答案 1 :(得分:0)
您很可能需要尽快锁定表,以便其他实例不能同时修改表。
答案 2 :(得分:0)
我没有得到你的问题,我正在假设丢失的东西,所以..
//this is triggered on some click, right?
//TODO:- check if button is disabled? you can have some js variable or check button attribute disbled
//TODO:-if its not disaled->{so first disable the button when it is clicked } else do nothing
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
discountAmount += parseFloat(xmlhttp.responseText);
// if succefull keep button disabled
// else renable it, so that it can be clicked again.
modifyCartOrder();
}
}
xmlhttp.open("GET","forms/jsPromoCode.php?code="+code+"&type="+order_name,true);
xmlhttp.send();
他们的代码中没有语法问题,这是合乎逻辑的, ajax调用是异步调用,它不会按顺序发生 1)你点击了 2)请求已发送 3)处理请求 4)通知JS:您的modifyCartOrder函数已执行
我想在这里说的是,在2之后没有3,3需要时间才能启动,js无法控制它,每当php完成它将回复那里并不保证。所以你可以反复重复1次,2次会继续重复......所以3会...... 我希望我理解你的问题,你理解我想说的话:)。
答案 3 :(得分:0)
问题是:您正在通过以下代码发送异步ajax调用:
xmlhttp.open( “GET”, “?形式/ jsPromoCode.php代码=” +代码+ “&安培;类型=” + ORDER_NAME,的真强>);
解决方案:如定义,打开ajax调用,方法是:
<强> xmlhttp.open(方法,URL,异步)强>
所以,你必须将上面的行修改为:
xmlhttp.open( “GET”, “?形式/ jsPromoCode.php代码=” +代码+ “&安培;类型=” + ORDER_NAME,的假强>);