3

我不确定哪个部分没有导致页面响应。这些页面是我的 lubuntu 机器中的主机。但是,当我从另一台 LAN 计算机访问此页面时,选择 startDate 为“2012-12-16”,endDate 为“2013-12-16”,页面在 Chrome 浏览器中冻结。知道什么时候结冰吗?当我打电话$.get('duty.php'...时,警报甚至无法弹出。当我直奔

/attendence/duty.php?mode=9&startDate=2012-12-06&endDate=2013-12-06&christened=All

回报是

[]

*编辑 2 * 找到了原因,结果证明这是另一个“愚蠢”的问题。问题是由$.get(). 如您所见,php 的输出是一个空数组[],这没关系。然而,该$.get()函数并未将其视为有效响应,只是等到浏览器超时。(使用 jQuery 1.7.2)解决方法是返回带有一些内容的 json,例如{'no','result'}.

Apache2 访问日志

192.168.1.7 - - [06/Dec/2012:21:02:48 +0800] “GET /attendence/duty.php?mode=9&startDate=2012-12-06&endDate=2013-12-06&christened=All HTTP/1.1” 500 411 "-" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19"

$.get('duty.php',
{'mode':9,
    'startDate':$('input[name=startDate]').val(),
    'endDate':$('input[name=endDate]').val(),
    'christened':$('input[name=christened]:checked').val()},
    function(data, textStatus, jqXHR){
         alert('result reach back');
        if (typeof data === 'undefined') {
         return;
        }
        numWeek = getDiffWeek();
        tableHtml='Num Of week:'+numWeek+'<table border=1><tr>';
        tableHtml+='<td>Barcode</td><td>name</td><td>attendence</td><td>frequency</td>';
        tableHtml+='    </tr></table>';
        $('#attendenceRate').html(tableHtml);
        for(name in data){

            attendenceRate = Math.round(data[name]['times']/numWeek*100);
            memberIcon ='';

            $('#attendenceRate table').append('<tr><td>'+data[name]['barcode']+'</td><td>'+name+'</td><td>'+attendenceRate+'%</td><td>'+data[name]['times']+'</td></tr>');

        }
    }
    ,'json'
    );

编辑只是一个错字,应该是duty.php而不是 Duty.php

include ("lock.php");
if($_GET){
if ($_GET['mode']==9){//calculate overall christian attendence
    $startDate = $_GET['startDate'];
    $endDate = $_GET['endDate'];
    $christened=$_GET['christened'];
    if($christened=='All'){
        $christenedClause='';
    }else{
        $christenedClause= ' AND record.christened = '.$christened;
    }

    $sql = <<<EOD
    SELECT name,barcode, COUNT( * ) AS times ,christened,gender
    FROM (

    SELECT name,attendence.barcode as barcode, DATE, TIME,christened,gender
    FROM attendence, record
    WHERE attendence.barcode = record.barcode
    AND DATE
    BETWEEN  "$startDate"
    AND  "$endDate"
    $christenedClause
    GROUP BY name, DATE

    )A
    GROUP BY name

排爆;

    $result = $link->query($sql);
    $data = array();
    $i=0;
    if($result->num_rows>0){

        while ($result2 = $result->fetch_assoc()){

            $data[$result2['name']]['times'] = $result2['times'];
            $data[$result2['name']]['barcode'] = $result2['barcode'];
            $data[$result2['name']]['gender'] = $result2['gender'];
            $data[$result2['name']]['christened'] = $result2['christened'];
            $i++;

        }
    }
    echo json_encode($data); 
}
}
4

2 回答 2

2

您的页面正在引发服务器错误。您的500访问日志 ( All HTTP/1.1" 500 411) 中的 表示该页面无法加载。您需要修复 PHP 页面中的某些内容。

首先,我不会使用.get()命令,而是使用.ajax()命令。该.ajax()命令包括在失败时中止 ( .fail()) 和在设定的时间后停止尝试 ( timeout:) 的方法。

$.ajax({
    url: url,
    type: "GET",
    timeout: 1000,
    data: { 'mode':9,
        'startDate':$('input[name=startDate]').val(),
        'endDate':$('input[name=endDate]').val(),
        'christened':$('input[name=christened]:checked').val()
     }
}).done(function(data) {
    alert('success!');
    //  ...
}).fail(function(jqXHR, textStatus, errorThrown) {
    alert('fail :(');
    //  ...
});

其次,可以清理您的 SQL。正如@Shivan 指出的那样,查询中的许多单词(例如:、、、datetime都是record关键字:用作函数或数据类型的单词。如果您尝试使用这些单词之一作为列名,MySQL 会感到困惑,因此您需要使用反引号 ( `) 字符对其进行转义。

我还将日期放在单引号 ( ')中

SELECT 
    `name`, `barcode` , COUNT( * ) AS `times`, `christened`, `gender`
FROM (
    SELECT 
        `name`, attendence.barcode as `barcode`, `DATE`, `TIME`, `christened`, `gender`
    FROM 
        `attendence`, `record`
    WHERE
        `attendence`.`barcode` = `record`.`barcode`
        AND `DATE`
        BETWEEN  '$startDate'
            AND  '$endDate'
        $christenedClause
    GROUP BY `name`, `DATE`
)A
GROUP BY name

我认为这不会解决您的所有问题,因此您应该在 PHP 页面上启用错误报告。将此代码放在顶部duty.php

ini_set('display_errors',1); 
error_reporting(E_ALL);

如果这工作正常,那么 PHP 将显示错误消息,而不仅仅是失败。

于 2012-12-06T14:25:35.660 回答
1

在 $data 数组中添加任何东西,这样它就不会返回空的 json。在 duty.php 末尾添加

...
if( count($data)==0){
$data['content']=['none'];
}
echo json_encode($data); 
于 2012-12-06T15:59:49.917 回答