2016-09-08 6 views
2
$query = "SELECT * FROM posts WHERE language='$lang' AND (title LIKE '%$search%' OR author LIKE '%$search%' OR year LIKE '%$search%')"; 

これはまさにそれがすべきことです。しかし、私がしたいのは、「タイトル」を優先事項とすることです。しかし、今見ているように(すべての検索はhtmlのドロップダウンにあります)、シンプルなショーは優先順位なしに行います。タイトルは一番下に、著者は一番上に表示されます。注文間違い。どういうわけか、常にトップにタイトルをつけたいと思います。php MySQLは優先度を選択します

どのようにですか?

$output = ''; 
     $lang = $_SESSION["lang"]; 
     $search = $_POST["query"]; 
     $query = "SELECT * FROM posts WHERE language='$lang' AND (title LIKE '%$search%' OR author LIKE '%$search%' OR year LIKE '%$search%')"; 
     $result = mysqli_query($connect, $query); 
     $output = '<ul class="list-unstyled">'; 
     if(mysqli_num_rows($result) > 0) 
     { 
      while($row = mysqli_fetch_array($result)) 
      { 

       $output .= '<a href="'.$url.'/'.$lang.'/'.$row["url"].'/"><li>'.$row["book"].'</li></a>'; 
      } 
     } 
     else 
     { 
      $output .= 'Not found.'; 
     } 
     $output .= '</ul>'; 
     echo $output; 
+0

クエリでorder by句を使用します。 – SanketR

+0

私を見せてください! – mezt

+0

質問を回答として投稿しました – SanketR

答えて

1

クエリを分割することができます。

$output = ''; 
    $lang = $_SESSION["lang"]; 
    $search = $_POST["query"]; 



     $query2 = "SELECT * FROM posts WHERE language='$lang' AND title LIKE '%$search%'"; 
     $result2 = mysqli_query($connect, $query2); 
     $output = '<ul class="list-unstyled">'; 
     if(mysqli_num_rows($result2) > 0) 
     { 
      while($row = mysqli_fetch_array($result2)) 
      { 

       $output .= '<a href="'.$url.'/'.$lang.'/'.$row["url"].'/"><li>'.$row["book"].'</li></a>'; 
      } 
     } 
     else 
     { 
      $output .= 'Not found.'; 
     } 

     $query = "SELECT * FROM posts WHERE language='$lang' AND (author LIKE '%$search%' OR year LIKE '%$search%')"; 
     $result = mysqli_query($connect, $query); 


     if(mysqli_num_rows($result) > 0) 
     { 
     while($row = mysqli_fetch_array($result)) 
     { 

      $output .= '<a href="'.$url.'/'.$lang.'/'.$row["url"].'/"><li>'.$row["book"].'</li></a>'; 
     } 
    } 
     else 
    { 
     $output .= 'Not found.'; 
    } 


    $output .= '</ul>'; 
    echo $output; 
+0

私のためには機能しません! – mezt

+0

私はあなたの質問を最初に誤解しました。コードを変更しました。クエリを2つに分割し、出力を連結することができます。 – SanketR

+0

クエリに問題がないかどうか確認できますか?私はあなたが提供したのと同じコードを使用しました。 – SanketR

0

ORDER BYここにあなたのためのトリックを行う必要があります。

http://www.w3schools.com/sql/sql_orderby.asp

$query = " 
SELECT book 
    , title 
    , url 
    FROM posts 
WHERE language='$lang' 
    AND ( 
     title LIKE '%$search%' 
     OR 
     author LIKE '%$search%' 
     OR 
     year LIKE '%$search%' 
     ) 
    ORDER BY title ASC 
     , author ASC 
     , book ASC 
"; 

を私は「作者」とあまりにもの本 '(注文開始の優先順位によって、任意の順序を追加しました'title'、次に 'author'、そして最後に 'book') - あなたはASC(昇順)またはDESC(降順)の順で必要なものに変更できます。

SQLインジェクションを防ぐために変数をSQLに直接渡すのではなく、バインド・パラメーターを使用することをお勧めします。

のMysqliバインドParamのドキュメント

http://php.net/manual/en/mysqli-stmt.bind-param.php

本当に良いSO

また

How can I prevent SQL injection in PHP?

SQLインジェクションに関するヘルプと詳細情報をここに投稿 - SELECT * FROM...を使用して回避しよう可能な場合はSELECT番目あなたが必要とする情報。 INDEXすることもできます(データベースからデータをすばやく取得することを意味します)。

0

スコアリングシステムを使用して、各試合に得点を付け、試合スコアでソートすることができます。だから、タイトルのマッチが高いスコアを得て、作者のマッチが次に高いものを獲得するなどです。

SELECT *, 
(
    CASE 
     WHEN title LIKE '%$search%' THEN 100 
     WHEN author LIKE '%$search%' THEN 10 
     WHEN year LIKE '%$search%' THEN 1 
    END 
) AS matchScore 
FROM posts 
WHERE 
language='$lang' AND 
(title LIKE '%$search%' OR author LIKE '%$search%' OR year LIKE '%$search%') 
ORDER BY matchScore DESC 
関連する問題