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=すべて

リターンは

[]

*編集 2 * 理由が見つかり、別の「ばかげた」質問であることが判明しました。問題は によって引き起こされました$.get()。ご覧のとおり、php からの出力は空の配列ですが[]、これで問題ありません。それでも、$.get()関数はそれを有効な応答として認識せず、ブラウザーのタイムアウトまで待機します。(jQuery 1.7.2 を使用) 回避策は、{'no','result'}.

Apache2 アクセス.log

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=すべて HTTP/1.1" 500 411 "-" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (Gecko のような KHTML) 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

EOD;

    $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 が指摘したように、クエリ内の単語の多く (例: date, time, 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 に答える