0

PHPFreaksの「Simple SQL Search」スクリプトをいじっています。クエリが送信された後に検索方法を絞り込む方法を考えていました。

「音楽」のような検索語を送信したとします。検索クエリは、「音楽」という語を含むデータベース内のすべてのデータの結果を返しますが、「音楽」という語を検索したいとします。結果が表示されました 検索を絞り込んで、カテゴリ「ロック」または「ラップ」にある音楽の下のすべての結果を探します。選択したオプションのリストを使用してこれを行いたいです。

これはPHPFreaksの作業スクリプトです。必要に応じて、ここのユーザーもこのスクリプトを使用できるように含めました。

$error = array();
$results = array();


if (isset($_GET['search'])) {
   $searchTerms = trim($_GET['search']);
   $searchTerms = strip_tags($searchTerms); // remove any html/javascript.

   if (strlen($searchTerms) < 3) {
      $error[] = "Search terms must be longer than 3 characters.";
   }else {
      $searchTermDB = mysql_real_escape_string($searchTerms); // prevent sql injection.
   }

   // If there are no errors, lets get the search going.
   if (count($error) < 1) {
      $searchSQL = "SELECT sid, sbody, stitle, sdescription FROM simple_search WHERE ";

      // grab the search types.
      $types = array();
      $types[] = isset($_GET['body'])?"`sbody` LIKE '%{$searchTermDB}%'":'';
      $types[] = isset($_GET['title'])?"`stitle` LIKE '%{$searchTermDB}%'":'';
      $types[] = isset($_GET['desc'])?"`sdescription` LIKE '%{$searchTermDB}%'":'';

      $types = array_filter($types, "removeEmpty"); // removes any item that was empty (not checked)

      if (count($types) < 1)
         $types[] = "`sbody` LIKE '%{$searchTermDB}%'"; // use the body as a default search if none are checked

          $andOr = isset($_GET['matchall'])?'AND':'OR';
      $searchSQL .= implode(" {$andOr} ", $types) . " ORDER BY `stitle`"; // order by title.

      $searchResult = mysql_query($searchSQL) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$searchSQL}");

      if (mysql_num_rows($searchResult) < 1) {
         $error[] = "The search term provided {$searchTerms} yielded no results.";
      }else {
         $results = array(); // the result array
         $i = 1;
         while ($row = mysql_fetch_assoc($searchResult)) {
            $results[] = "{$i}: {$row['stitle']}<br />{$row['sdescription']}<br />{$row['sbody']}<br /><br />";
            $i++;
         }
      }
   }
}

function removeEmpty($var) {
   return (!empty($var)); 
}
?>

結果:

 <?php echo (count($error) > 0)?"The following had errors:<br /><span id=\"error\">" . implode("<br />", $error) . "</span><br /><br />":""; ?>
      <form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>" name="searchForm">
         Search For: <input type="text" name="search" value="<?php echo isset($searchTerms)?htmlspecialchars($searchTerms):''; ?>" /><br />
         Search In:<br />
         Body: <input type="checkbox" name="body" value="on" <?php echo isset($_GET['body'])?"checked":''; ?> /> | 
         Title: <input type="checkbox" name="title" value="on" <?php echo isset($_GET['title'])?"checked":''; ?> /> | 
         Description: <input type="checkbox" name="desc" value="on" <?php echo isset($_GET['desc'])?"checked":''; ?> /><br />
                 Match All Selected Fields? <input type="checkbox" name="matchall" value="on" <?php echo isset($_GET['matchall'])?"checked":''; ?><br /><br />
         <input type="submit" name="submit" value="Search!" />
      </form>
      <?php echo (count($results) > 0)?"Your search term: {$searchTerms} returned:<br /><br />" . implode("", $results):""; ?>

ここで誰かが私を正しい方向に導いてくれることを願っています。私は PHP/MySQL にある程度精通しており、どこでもオンラインで調べましたが、このスクリプトを使用して検索結果を絞り込む方法がわかりません。ありがとう。

4

1 に答える 1

0

検索結果を絞り込むには、2 つのオプションがあります。

  1. 検索(結果の行セット)をディスク/セッションに保存/シリアル化して、ユーザーが検索パラメーターに何かを追加した場合に検索できるようにします。このシナリオでは、ユーザーが「ベース」検索パラメーターを変更していないことを確認する必要があります。もしそうなら、最初に別のベース検索を実行してから、絞り込んだ結果 (ジャンル固有のエントリ) を結果から引き出すことができます。

  2. 新しい検索パラメーターをベースクエリ文字列に追加し、データベースにその洗練された検索を実行させます。

どちらの場合も、洗練された結果が得られます。以前の検索パラメーターを気にする必要がない 2 番目のオプションを使用します。「ジャンル」をクエリに追加するだけで完了です。

于 2013-04-08T13:57:15.860 に答える