2012-12-05 58 views
3

我不確定哪個部分導致頁面響應沒有任何內容。這些頁面是我的lubuntu機器中的主機。但是,當我從另一臺LAN計算機訪問此頁面時,選擇startDate爲「2012-12-16」,endDate爲「2013-12-16」,該頁面僅在Chrome瀏覽器中凍結。任何想法,當它凍結? 當我打電話給$.get('duty.php'...時,警報甚至不能彈出。 當我去到挺直php頁面無響應

/attendence/duty.php?mode=9 &的startDate = 2012年12月6日結束日期& = 2013年12月6日&命名=所有

回報是

[]

* 編輯2 * 找到原因,它變成另一個「愚蠢」的問題。這個問題是由$.get()造成的。正如你可以看到從PHP的輸出是一個空數組[],這沒關係。然而,$.get()函數沒有看到它是一個有效的響應,只是等到瀏覽器超時。(使用jQuery 1.7.2)解決方法是返回json的一些內容,如{'no','result'}

的Apache2的access.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(KHTML,如Gecko)Ubuntu/11.10 Chromium/18.0 .1025.168鉻/ 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); 
} 
} 
+0

嘗試在Chrome的開發人員工具中跟蹤響應。請注意HTTP狀態碼。 – Raptor

+0

發現更多問題:(1)不建議在'duty.php'中使用HEREDOC作爲SQL語句; (2)SQL包含太多的MySQL保留字; (3)在@marteljin建議的Ubuntu環境(4)中,duty.php!= Duty.php,'if'情況應該執行數據類型檢查。 – Raptor

+0

當我用ajax函數提交時,頁面剛剛凍結,在開發工具中沒有更多的更新。我只能跟蹤服務器上的apache日誌 – metro

回答

2

您的頁面正在拋出服務器錯誤。您訪問日誌中的500All 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將顯示的只是失敗的錯誤消息,而不是。

1

在$ data數組中添加任何內容,以便它不會返回空的json。 在duty.php結尾添加

... 
if(count($data)==0){ 
$data['content']=['none']; 
} 
echo json_encode($data);