我遇到了这个有趣的问题,我甚至不知道如何开始解释,但我会尽我所能。所以我有一个网站,里面有一堆动态页面,比如音乐,电影等,每个都以index.php
的形式存在于其名称的目录中。因此,音乐页面会调用index.php
文件夹中的/music
,依此类推。我还有一个位于/blog
内的WP博客。
当您打开音乐页面时,它会查询一个表并列出它检索的前12个条目。除了列表,它还添加了一个"加载更多"按钮到页面。单击此按钮会触发对后端文件(/assets/engines/more_music_engine.php
)的XHR调用。该引擎文件依次在表中查询接下来的12个条目,并将结果回显到最初称为引擎的/music/index.php
页面。
此设置完美无缺。直到您访问任何博客页面(它可能是主要博客页面或其任何子页面,例如帖子,标签,作者等)。当您首先访问博客页面后尝试重新访问音乐页面时,XHR会崩溃!不仅如此,即使状态代码在浏览器中也不一致。在Safari上,我得到0,而在Firefox上,它是500.在您在新标签页或窗口中重新加载页面之前,此问题仍然存在。
有没有人在这里遇到过类似的事情,如果有的话,结果是什么?我可以分享代码,但我需要知道要分享哪些部分。整个转储对于粘贴来说是不切实际的。首先,这里是JS函数进行XHR调用:
function moretracks(){
var trackdivs = document.getElementsByTagName('trackitem');
var countoftracks = trackdivs.length;
var mus = $('#mus');
var totalcount = parseInt($('totalcount').text(), 10);
$('#loadmore-container').remove();
var waittext = '<div class="loading text-center"><i class="fa fa-4x fa-spinner fa-spin"></i></div>';
var hr = createXMLHTTPRequestObject();
var url = 'assets/engines/more_music_engine.php';
var vars = "count=" + countoftracks + "&totalcount=" + totalcount;
hr.open("POST", url, true);
hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
hr.onreadystatechange = function(){
if(hr.readyState == 4 && hr.status == 200){
$('.loading').remove();
var return_data = hr.responseText;
mus.append(return_data);
}
else if(hr.status == 500){
mus.html("Something went wrong! Please try again later...");
}
}
hr.send(vars);
mus.append(waittext);
}
这是触发此功能的按钮:
<button id="loadmore" class="btn btn-lg btn-brown" onClick="moretracks();">See more</button>
有问题的页面现已发布在peppyburro.com/music。
这是服务器端more_music_engine.php文件的一部分:
<?php
require_once 'Admin/Connector.php';
include_once('simplehtmldom_1_5/simple_html_dom.php');
$clientcount = $_POST['count'];
$totalcount = $_POST['totalcount'];
// further processing...
?>
我再说一遍,响应代码在FF中为500,在Safari中为0。在调试和跟踪时,我发现服务器端脚本没有收到空的_POST,这很难解释,因为当页面在不同的选项卡中重新加载时,相同的脚本就像魅力一样。
这是我的error.log文件的转储:
[20-Jul-2016 06:40:35 Etc/GMT] PHP Notice: Undefined index: count in /home/peppyoil/public_html/assets/engines/more_music_engine.php on line 5
[20-Jul-2016 06:40:35 Etc/GMT] PHP Notice: Undefined index: totalcount in /home/peppyoil/public_html/assets/engines/more_music_engine.php on line 6
[20-Jul-2016 06:40:35 Etc/GMT] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 12' at line 1' in /home/peppyoil/public_html/assets/engines/more_music_engine.php:12
Stack trace:
#0 /home/peppyoil/public_html/assets/engines/more_music_engine.php(12): PDOStatement->execute()
#1 {main}
thrown in /home/peppyoil/public_html/assets/engines/more_music_engine.php on line 12
请注意,此日志仅在FF(500)上运行时生成。在Safari上运行时(响应代码0),不会生成任何日志。
更新:我用AJAX替换了XHR并且问题仍然存在。在Firefox上,抛出的错误是:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://www.peppyburro.com/assets/engines/more_music_engine.php. (Reason: missing token 'x-requested-with' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel).
这没有意义,因为请求脚本是文件的一部分(peppyburro.com/music.php),它也位于同一个域中!