2

うまくいけば、配列に入力された単語を変換し、データベース内の配列を検索することになっているこのコードがあります。データベースには、クローラーによって Web サイトでスキャンされる単語の行があります。

配列コードが機能していないようです:(私のクエリは以下の通りです:

        if( isset($_POST['keyword']) ){
        $k = $_POST['keyword'];
        }else{
        $k = '';
        }
        $k = ( isset($_POST['keyword']) )? trim($_POST['keyword']) : '';
        $terms = (strlen($k) > 0)? explode(' ', $k) : Array();

          $keyword = addslashes( $k);
          $results = addslashes( $_POST['results'] );

          /* Execute the query that performs the actual search in the DB: */
             $result = mysql_query(" SELECT p.page_url AS url,
                       COUNT(*) AS occurrences 
                       FROM page p, word w, occurrence o
                       WHERE p.page_id = o.page_id AND
                       w.word_id = o.word_id AND
                       w.word_word = \"$keyword\"
                       GROUP BY p.page_id
                       ORDER BY occurrences DESC
                       LIMIT $results" ); 
4

1 に答える 1

1

あなたの質問は「複数用語検索エンジン」と題されていますが、このコード (SQL 部分はかなりよく考えられたインデックス作成を意味します) は複数の用語に対応できません。実際、PHP コードは意味不明です。まず、if 式を使用して $k の値を設定します。次に、三項演算子を使用して同じ値に設定します。

使用している検索用語の例も、それから生成されたクエリも提供していません。また、「機能していないようだ」という説明もありません。

クローラーと検索データベースを作成した人に相談することをお勧めします。複数の用語がある場合は、リテラル値をまったく異なる方法でクエリにスプライスするか、それらを (一時的に) ロードする必要があると説明されます。テーブルに入れ、それを検索クエリと結合します。彼らはまた、大きな魚であなたを平手打ちし、SQL インジェクションについて学びに行くように言うべきです。

例えば

...
$qry=searchQuery($_POST['keywords'], $dbh);
if ($qry) {
    $limit = (integer) $_POST['results'] ? (integer) $_POST['results'] : 20;
    $qry.=" LIMIT $limit";
    result=mysql_query($qry, $dbh);
} else {
    ...
    exit;
}
...

function searchQuery($keywords $dbh)
{
   if (''==$keywords) return false;
   $keywords=str_replace('  ', ' ', $keywords); // remove consecutive spaces
   $keywords=str_replace('  ', ' ', $keywords); // cos you might have an odd number of consecutive spaces
   $parts=explode(' ', $keywords);
   foreach ($parts as $x=>$word) {
       $parts[$x]="'" . mysql_real_escape_string($word, $dbh) . "'";
   }
   $keywords=implode(',', $parts);
   return " SELECT p.page_url AS url,
                   COUNT(*) AS occurrences 
                   FROM page p, word w, occurrence o
                   WHERE p.page_id = o.page_id AND
                   w.word_id = o.word_id AND
                   w.word_word in ($keywords)
                   GROUP BY p.page_id
                   ORDER BY COUNT(DISTINCT w.word_id)*COUNT(*) DESC";

}
于 2012-11-24T23:42:00.507 に答える