我一直在处理一个非常大的html表单,它有一个重置按钮。 在重置时,会发生数据库操作。
我有一个javascript函数,在重置时调用:
function clearDatabaseOfAnySavedForm() {
window.name = 1;
$.post('assets/scripts/reset-form.php');
window.location.reload();
$(document).load().scrollTop(0);
return false;
}
此函数中引用的php文件的代码是:
<?php
//Authcate
$authcate = xxxxx;
$username = "xxxxx";
$password = "xxxxx";
//$hostname = "xxxxx";
$hostname = "xxxxx";
$database = "xxxxx";
$conn = mysql_connect($hostname, $username, $password);
mysql_select_db($database, $conn) or die( "Unable to select database");
if (!empty($authcate)) {
$table = "xxxxx";
$sqlSelectQuery = "SELECT * FROM $table WHERE authcate = '$authcate'";
$selectResults = mysql_query($sqlSelectQuery);
$selectNumResults = mysql_num_rows($selectResults);
if ($selectNumResults > 0) {
$sqlUpdateQuery = "DELETE FROM $table WHERE authcate = '$authcate'";
$result = mysql_query($sqlUpdateQuery);
}
}
mysql_close($conn);
}
所有这些都适用于所有浏览器,但由于某种原因,PHP文件不会在Firefox中调用。 有没有人有任何建议的想法?
答案 0 :(得分:7)
您的代码充满了竞争条件和不可能的步骤。我很惊讶它会在其他浏览器中运行。
function clearDatabaseOfAnySavedForm()
{
window.name = 1;
$.post('assets/scripts/reset-form.php'); <-- call server with asynchronous call
window.location.reload(); <-- reload page, it will cancel out the server call
$(document).load().scrollTop(0); <-- um page is been reload, what does this do ?
return false; <-- page is reloaded, what are you cancelling?
}
确保运行服务器上的代码的唯一方法是确保回调发生,而不是重新加载页面。 post请求是异步的。无法保证浏览器会执行它。当页面退出并杀死它们时,大多数浏览器将采用任何打开的连接。这就是为什么Firefox没有执行它。
在Firefox中,你正在失去竞争条件。进行调用,在完成连接到服务器之前,请求被切断,因此浏览器可以发送刷新页面的请求。您需要等待请求与服务器建立连接。你需要等待readyState至少达到2。
但为什么甚至打扰进行Ajax调用,向页面提交帖子请求。该页面将重新加载并重定向回您来自的位置。 Ajax不是正确的解决方案。
答案 1 :(得分:0)