2013-01-16 51 views
0

我的網站www.guidedsolutions.co.uk是在一段時間之前建立的,而我對php並不瞭解,但是當我進入搜索crieteria即蘇格蘭的醫療銷售工作時,搜索結果加載非常快,但是當我點擊搜索時,所有結果頁面加載速度非常慢,有時甚至無法加載。這是它的直接鏈接:www.guidedsolutions.co.uk/medical_devices/search_results.php 我不確定哪部分的PHP複製,所以這就是爲什麼我發送的鏈接,但是如果我可以給任何更多的信息,請讓我知道。 非常感謝。搜索所有PHP加載速度非常慢?

**

$conds_cat = ""; 
$conds_loc = ""; 
$conds_sec = ""; 
$conds_sal = ""; 

if (isset($i["start"]) && $i["start"] > 0) 
    $start = $i["start"]; 

if (isset($i["limit"]) && $i["limit"] > 0) 
    $limit = $i["limit"]; 

if(isset($i["category"]) && $i["category"] != "") 
    $conds_cat = "AND ".CAT_TABLE."_id ='".$i["category"]."'"; 

if(isset($i["location"]) && $i["location"] != "") 
    $conds_loc = "AND ".LOC_TABLE."_id ='".$i["location"]."'"; 

$searchstring = "&category=".$i["category"]."&location=".$i["location"]."&limit=".$i["limit"]; 

$sql = "SELECT * FROM ".JOB_TABLE." LEFT JOIN (".JBC_TABLE.", ".JBL_TABLE.", ".JBS_TABLE.", ".JBP_TABLE.") ON (".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) WHERE ".JOB_TABLE."_display = '1' AND (".CAT_TABLE."_id IN (SELECT ".CAT_TABLE."_id FROM ".CAT_TABLE." WHERE ".CAT_TABLE."_display='1' ".$conds_cat.") AND ".LOC_TABLE."_id IN (SELECT ".LOC_TABLE."_id FROM ".LOC_TABLE." WHERE ".LOC_TABLE."_display='1' ".$conds_loc.")) GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id ORDER BY ".JOB_TABLE."_rank DESC"; 

更新:感謝dwurf,下面的代碼:

//echo $sql; 
$res=$_Db->execute($sql); 
$total = $_Db->numResults($res); 

$displaylimit = $limit; 

if ($total<$displaylimit+$start) 
    $displaylimit=$total-$start; 

$sql .= " LIMIT ".$start.", ".$limit; 
//echo $sql; 
$res=$_Db->execute($sql); 

if($_Db->numResults($res)>0) { 

    $co = 0; 
    while($row=$_Db->fetchAssoc($res)) {  

     $jobs[$co]["id"]=$row[JOB_TABLE."_id"]; 
     $jobs[$co]["title"]=$row[JOB_TABLE."_title"]; 
     $jobs[$co]["product"]=getCatLocSecTitle($_Db, PDT_TABLE, $row[PDT_TABLE."_id"]); 
     $jobs[$co]["salary"]=getCatLocSecTitle($_Db, SAL_TABLE, $row[SAL_TABLE."_id"]); 

     $co++; 

    } 
} 
+0

您好,歡迎堆棧溢出。本網站旨在回答特定的編程問題。你的問題太模糊,無法正確回答。我可以確認'search_results.php'需要永久加載。我建議你詢問建立你的網站關於你的問題的公司,或聘請其他人修復它。 – Carsten

+0

嗨卡斯滕,感謝您的快速回復。我知道這是模糊的,但是我想找出一個出發點,所以我可以自己做這個工作。我已經檢查過mysql表格,它們都是大約3-4kb,除了一個80kb大的,這是我應該看看,還是看看php代碼本身?再次感謝 – user1983090

+0

既然你還沒有給我們任何東西繼續下去,我會猜測:如果你的SQL查詢看起來像這個'.... WHERE searchfield LIKE'%searchterm%''那麼這就是你的問題。 SQL中的通配符搜索非常緩慢。 – SDC

回答

2

哇。

問題是您的查詢是垃圾。數據庫設計也可能需要一些工作。我沒有看到PHP的錯誤(除了過多的字符串操作),但我們只能看到它的一點點。

讓我們整理一下你的SQL語句,所以我們可以在其所有的榮耀欣賞它:

$sql = 
"SELECT * FROM ".JOB_TABLE." 
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND (".CAT_TABLE."_id IN 
    (SELECT ".CAT_TABLE."_id FROM ".CAT_TABLE." WHERE ".CAT_TABLE."_display='1' ".$conds_cat.") 
AND ".LOC_TABLE."_id IN 
    (SELECT ".LOC_TABLE."_id FROM ".LOC_TABLE." WHERE ".LOC_TABLE."_display='1' ".$conds_loc.")) 
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC"; 

的性能問題的根源很簡單。當沒有設置類別或位置時,查詢將檢索的所有類別/位置的完整列表工作表中的每項工作。我們說它與O(m * n)成比例,這是不好的。

提高性能的一個簡單方法是在未設置位置/類別時完全刪除該子句。我們將 也直接加入到這些表中,並檢查類別應該顯示在where子句中。

$conds_cat = ""; 
$conds_loc = ""; 
$conds_sec = ""; 
$conds_sal = ""; 

if (isset($i["start"]) && $i["start"] > 0) 
    $start = $i["start"]; 

if (isset($i["limit"]) && $i["limit"] > 0) 
    $limit = $i["limit"]; 

$conds_cat = ''; 
$conds_loc = ''; 
if(isset($i["category"]) && $i["category"] != "") 
    $conds_cat = " AND ".CAT_TABLE.".".CAT_TABLE."_id ='".$i["category"]."'"; 
if(isset($i["location"]) && $i["location"] != "") 
    $conds_loc = " AND ".LOC_TABLE.".".LOC_TABLE."_id ='".$i["location"]."'"; 

$searchstring = "&category=".$i["category"]."&location=".$i["location"]."&limit=".$i["limit"]; 

$sql = 
"SELECT 
    ".JOB_TABLE.".*, 
    ".JBC_TABLE.".*, 
    ".JBL_TABLE.".*, 
    ".JBS_TABLE.".*, 
    ".JBP_TABLE.".* 
FROM 
    ".CAT_TABLE.", 
    ".LOC_TABLE.", 
    ".JOB_TABLE." 
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND ".JOB_TABLE.".".CAT_TABLE."_id = ".CAT_TABLE.".".CAT_TABLE."_id 
AND ".JOB_TABLE.".".LOC_TABLE."_id = ".LOC_TABLE.".".LOC_TABLE."_id 
AND ".CAT_TABLE."_display = '1' 
AND ".LOC_TABLE."_display = '1' 
$conds_cat 
$conds_loc 
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC"; 

更新:修復了兩個會導致PHP錯誤或不正確的SQL結果的錯誤。 更新2:修復類別/位置過濾器中的錯誤

+0

dwurf,感謝您的代碼,我已將其替換,但是加載時間沒有任何變化?感謝您的幫助,我並沒有真正的幫助,因爲我做了html,但對php和sql沒有太多瞭解,所以謝謝。我更新了原始文章中的代碼 – user1983090

+1

我的原始版本沒有語義更改,它只會使查詢更具可讀性。查看我的更新。另外,當你不明白它時,你必須非常小心地將隨機代碼從互聯網上粘貼到你的製作網站上。至少我可以犯一個錯誤(畢竟我沒有辦法測試這個),並且你的網站出現故障。最糟糕的情況是,我可能會放棄桌子或者在私人數據上徘徊。 – dwurf

+0

另外,請請保留原始文件的備份。不這樣做會是瘋狂。 – dwurf

1

我首先要確保它不可注射。您直接從用戶處獲取輸入並直接發送到數據庫。唯一的檢查是那裏有東西。

PHP/MySQL有驗證這一點的工具。林不知道你用什麼函數來查詢數據庫,但我會假設其標準的MySQL庫?

http://php.net/manual/en/function.mysql-real-escape-string.php

還要注意頂部的紅色預警,其日期爲出(儘管仍然有效)

+0

目前尚不清楚輸入是否已經過消毒。輸入已經以某種方式處理過(否則它將在'$ _REQUEST'中)。讓OP看到已經完成了衛生處理的希望。 – dwurf