2016-04-11 6 views
1

Ich habe ein Stück Code, der funktioniert, aber es ist ziemlich chaotisch. Ziel ist es, alle relevanten Zeilen aus einer Benutzersuche abzurufen. Zum Beispiel:Mit Wartbarkeit auf diesem MySQLi/PHP-Code-Segment zu kämpfen

Der Code, der funktioniert:

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>"; 
      } 
      } 
      ?> 

Was ich versucht habe: Wenn der Nutzer nach 'Jo', wird es John und Josh abrufen

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; 
} 

Allerdings wird dies nicht arbeiten als nur das erste Ergebnis von der fetch_assoc() ist in der $ searchArray und nichts anderes gespeichert! Hat jemand irgendwelche Vorschläge? Ich bin mir nicht sicher, wo ich als nächstes anfangen soll.

James.

+2

** WARNUNG **: Bei der Verwendung von 'mysqli' Sie parametrisierte Abfragen verwenden sollten und [' bind_param'] (http://php.net/manual/en/mysqli -stmt.bind-param.php), um Benutzerdaten zu Ihrer Abfrage hinzuzufügen. ** Verwenden Sie ** NICHT manuelle Entschlüsselung und String-Interpolation oder Verkettung, um dies zu erreichen, da Sie schwerwiegende [SQL-Injektionsfehler] (http://bobby-tables.com/) erstellen werden. Wenn Sie Ihre Zeichenfolge bereinigen, werden zwar Ihre Daten sauber gehalten, aber SQL-Injection-Probleme werden dadurch nicht immer verhindert. Sie können möglicherweise vergessen, etwas, das später injiziert wird, ordnungsgemäß zu scrubben. Die Verwendung von Platzhaltern macht Fehler offensichtlich. – tadman

Antwort

2

Sie überschreiben das Array jedes Mal, wenn Sie die Schleife ausführen. Sie müssen ein Array von Arrays erstellen, damit Sie ein Array zurückgeben können. Im Folgenden habe ich Ihren Code vereinfacht, um die aktuelle Zeile an das Array anzufügen, das Sie zurückgeben. Sie können dann eine foreach auf die zurückgegebenen Daten tun und Ihren Code

while($row = $query->fetch_assoc()) { 
    $searchArray[] = $row; 
} 

auch angezeigt werden, eine protip: Ihr DB-Anschluss als Parameter übergeben und vermeiden Sie es als eine globale Verwendung (die andere Best Practice ist)

function getSearchResults($search) { 
    global $db; 

Wird

function getSearchResults($search, $db) { 

Und last but not least, nicht über Ihre Echo Dinge Funktion (haben die Ebene, die diese Funktion tun genannt). Stattdessen nur ein leeres Array zurück

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

Hallo @Machavity danke für deine ausführliche Antwort! Wie würde ich die Werte auf dem Bildschirm mit foreach wiedergeben? Ich bin mir unsicher, wie ich das auch angehen soll. Ich habe die Funktion getSearchResults() in einer anderen Datei aufgerufen und das zurückgegebene Array in einer Variablen namens $ searchResult gespeichert. Danke nochmal für deine Hilfe. –

+0

@JamesBarrett Sehen Sie sich [diese Frage] (http://stackoverflow.com/questions/10056771/how-does-foreach-actually-work) an, um zu erfahren, wie foreach funktioniert – Machavity

Verwandte Themen