0

私のウェブサイトwww.guidedsolutions.co.ukは少し前に作成されたもので、php についてはよくわかりませんが、検索基準、つまりスコットランドの医療販売の仕事を入力すると、検索結果が非常に速く読み込まれます。検索結果ページの読み込みが非常に遅く、読み込まれないこともあります。これはそれへの直接リンクです: www.guidedsolutions.co.uk/medical_devices/search_results.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";

更新:ドワーフに感謝します。次のコード:

//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++;

    }
}
4

2 に答える 2

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) でスケーリングすると言いますが、これは悪いことです。

パフォーマンスを向上させる簡単な方法の 1 つは、場所/カテゴリが設定されていないときにその句を完全に削除することです。また、これらのテーブルに直接結合し、カテゴリが 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 つの間違いを修正しました。更新 2: カテゴリ/場所フィルターのバグを修正しました

于 2013-01-16T11:11:30.947 に答える
1

私は最初にそれが注射できないことを確認します。ユーザーから直接入力を受け取り、データベースに直接送信します。唯一のチェックは、そこに何かがあることです。

PHP / MySQLには、これを検証するためのツールがあります。データベースのクエリに使用する関数がわかりませんが、標準のmysqlライブラリを想定しますか?

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

ただし、上部の赤い警告にも注意してください。古くなっています(ただし、機能します)

于 2013-01-16T11:47:36.580 に答える