2016-04-11 6 views
1

私は動作するコードを持っていますが、かなり面倒です。目的は、ユーザー検索からすべての関連する行を検索することです。たとえば:ユーザー検索「ジョー」は、それがジョンとジョシュを取得する場合:このMySQLi/PHPコードセグメントのメンテナンス性に苦しんでいます

動作するコードを:私が試してみました何

if($_SERVER["REQUEST_METHOD"] == "POST") { 
    $search = trim(filter_input(INPUT_POST,"user_search",FILTER_SANITIZE_SPECIAL_CHARS)); 
    $search = preg_replace("#[^0-9a-z]#i", "", $search); 

    if(!isset($error_message)) { 
    $query = $db->query("SELECT * FROM User WHERE U_Forename LIKE '%$search%' 
        OR U_Surname LIKE '%$search%' OR U_Team LIKE '%$search' 
        OR U_City LIKE '%$search%'"); 
    } 
} 

    <?php 
      if ($query->num_rows == 0) { 
      $output = "No results found!"; 
      } else { 
      echo "<h2>Search results for: " . $search . "</h2>"; 
      while($row = $query->fetch_assoc()) { 
       $id = $row['U_ID']; 
       $firstname = $row['U_Forename']; 
       $lastname = $row['U_Surname']; 
       $team = $row['U_Team']; 
       $city = $row['U_City']; 
       echo "<div class='searchresults'>"; 
       echo "<p> Name: " . ucfirst($firstname) . " " . ucfirst($lastname) . "</p>"; 
       echo "<p> Favourite Team: " . ucfirst($team) . "</p>"; 
       echo "<p> Location: " . ucfirst($city) . "</p>"; 
       echo "<a class='lift' href='profile.php?=[$id]'>View Profile</a>"; 
       echo "<a class='lift' href='#'>Follow Driver</a>"; 
       echo "</div>"; 
      } 
      } 
      ?> 

function getSearchResults($search) { 
    global $db; 
    $searchArray = array(); 
    $query = $db->query("SELECT * FROM User WHERE U_Forename LIKE '%$search%' 
        OR U_Surname LIKE '%$search%' OR U_Team LIKE '%$search' 
        OR U_City LIKE '%$search%'"); 
    if ($query->num_rows == 0) { 
    echo "No results found!"; 
    } else { 
    while($row = $query->fetch_assoc()) { 
     $searchArray['U_ID'] = $row['U_ID']; 
     $searchArray['U_Forename'] = $row['U_Forename']; 
     $searchArray['U_Surname'] = $row['U_Surname']; 
     $searchArray['U_Team'] = $row['U_Team']; 
     $searchArray['U_City'] = $row['U_City']; 
    } 
    } 
    return $searchArray; 
} 

しかしこれはしませんfetch_assoc()の最初の結果が$ searchArrayに格納されているだけです。誰にも何か提案はありますか?私は次にどこでコーディングを始めるべきか確信しています。

James。

+2

** WARNING **:あなたはパラメータ化クエリを使用すべきであり、mysqli' '使用する場合は、[' bind_param'](http://php.net/manual/en/mysqli -stmt.bind-param.php)を使用してユーザーデータをクエリに追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成するため、マニュアルエスケープと文字列補間または連結を使用しないでください。あなたの文字列をスクラブすると、データはきれいに保たれるかもしれませんが、SQLインジェクションの問題を必ずしも防止するとは限りません。後から注入されたものを適切にスクラブするのを忘れるかもしれません。プレースホルダを使用すると間違いが明らかになります。 – tadman

答えて

2

ループを実行するたびに配列を上書きしています。 1つの配列を返すことができるように配列の配列を作成する必要があります。以下は、現在の行を返す配列に追加するコードを簡略化したものです。パラメータとして、あなたのDBコネクタを渡すと(別のベストプラクティスである)グローバルとしてそれを使用しないよう

:あなたは、その後、またprotipを foreach
while($row = $query->fetch_assoc()) { 
    $searchArray[] = $row; 
} 

返されたデータにし、あなたのコードを表示

を行うことができます

function getSearchResults($search) { 
    global $db; 

function getSearchResults($search, $db) { 

そして最後にではなく、少なくともなり、(それを行う、この関数を呼び出した層を持っている)あなたの関数のエコーのものを持っていません。代わりに、ちょうど空の配列を返す

if ($query->num_rows == 0) { 
    return $searchArray; 
} 
+0

こんにちは@Machavityはあなたの詳細な答えに感謝します! foreachを使用して値を画面にエコーする方法はありますか?私はこれに近づく方法もわかりません。別のファイルでgetSearchResults()関数を呼び出し、返された配列を$ searchResultという変数に格納しました。あなたの助けをもう一度ありがとう。 –

+0

@JamesBarrett 'foreach'の仕組みの詳細については、[この質問](http://stackoverflow.com/questions/10057671/how-does-foreach-actually-work)を参照してください。 – Machavity

関連する問題