1

このスクリプトは部分的に機能していますが、1 つのビデオに 3 つのタグがあり、3 つのタグすべてを入力すると、ビデオが 3 回戻ってきます。これを修正する方法がわかりません。

$search = sanitize($_GET['search']);
$array = explode(" ", $search);
foreach($array as $mySearch)
{
  $query = mysql_query("SELECT * FROM `videos`");
  while($mad = mysql_fetch_array($query))
  {
    if(strpos($mad['tags'], $mySearch))
    {
      // show results
      echo "<div class='comment_1'>$mad[title]</div>";
    }
  }
}

どんな助けでも大歓迎です。

4

4 に答える 4

1

ここでは、おそらく少し後ろ向きのアプローチをとっています。テーブル全体を返す必要がないように、クエリで検索タグを使用する必要があります。おそらく、タグをタグ テーブルと、それらの間の多対多の関係を表す videos_tags テーブルに正規化する必要もあります。次に、次のように検索します。

SELECT * FROM
videos
INNER JOIN videos_tags ON videos.video_id = videos_tags.video_id
INNER JOIN tags ON videos_tags.tag_id = tags.tag_id
WHERE tags.tag_text IN ('tag 1', 'tag 2', etc.)

これにより、アプリケーションの成長に合わせてモデルがより持続可能になります。

于 2012-12-18T20:01:59.903 に答える
1

少し変更して、次のようにすることができます。

$search = mysqli_real_escape_string($_GET['search']);
$search = preg_replace('/\s+/m', '|', $search);
$query = mysqli_query("SELECT * FROM `videos` where tags regexp '{$search}'");
while($mad = mysqli_fetch_array($query))
{
   // show results
   echo "<div class='comment_1'>{$mad['title']}</div>";
   break;
}

関数は廃止されたため、同等のmysql_*関数に変更したことに注意してください。mysqli_*また、コードを 1 つのループに減らし、クエリに検索語を追加しました。

于 2012-12-18T19:55:35.057 に答える
1

これはうまくいくはずです

$search = sanitize($_GET['search']);
$array = explode(" ", $search);

$query = mysql_query("SELECT * FROM `videos`");
while($mad = mysql_fetch_array($query)) {
    foreach($array as $mySearch) {
        if(strpos($mad['tags'], $mySearch)) {
            // show results
            echo "<div class='comment_1'>$mad[title]</div>";
            continue 2;
        }   
    }   
}
于 2012-12-18T19:58:55.930 に答える
0

このスクリプトは部分的に機能しています

それはいいのですが、スクリプトは妊娠しているようなものです。部分的にはありません。システムは機能するかしないかのどちらかであり、行間はあまりありません。

ここに論理的な問題があり、制御構造の処理順序が間違っていることが原因です。

通常の手順は次のとおりです。

  1. 入力データを検証して処理します。
  2. データを操作し、変換します。あなたの場合、それを使用してデータベースからデータをフェッチします。
  3. ストアから取得したデータを出力します。

スクリプトでは、次の 3 つのことを交互に行うのではなく、これら 3 つのことをすべて混ぜ合わせます。

$tags_array = get_tags_array_from_input();

$result = mysql_query_result_based_on_tags_array($tags_array);

display_results($result);

/**
 * exemplary only
 */
function mysql_query_result_based_on_tags_array(array $tags)
{
    $mask = "SELECT * FROM videos WHERE tags REGEXP '%s'";
    $sql  = sprintf($mask, implode('|', $tags));

    return mysql_query($sql);
}
于 2012-12-18T19:59:51.120 に答える