2016-04-11 14 views
1

Çalıştığım bir kod parçam var, ancak oldukça dağınık. Amaç, bir kullanıcı aramasından tüm ilgili satırları almaktır. Örneğin: Kullanıcı aramalar 'Jo', John ve Josh alır edin:Bu MySQLi/PHP kod segmentinde bakım yapılabilirlikle mücadele

çalışır kod: denedim ne

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

Ancak bu olmaz fetch_assoc() öğesinden yalnızca ilk sonuç olarak çalışmak $ searchArray öğesinde saklanır ve başka bir şey olmaz! Herhangi bir öneri var mı? Sonraki kodlamayı yapmaya başlamak için emin değilim.

James.

+2

** UYARI **: Eğer parametreli sorguları kullanarak ve gerektiği mysqli' 'kullanırken [' bind_param'] (http://php.net/manual/en/mysqli -stmt.bind-param.php) sorgunuza kullanıcı verilerini eklemek için. ** Şiddetli [SQL enjeksiyon hataları] (http://bobby-tables.com/) yaratacağınız için bunu yapmak için manuel kaçış ve dizgi enterpolasyonu veya bitiştirme kullanmayın. Dizininizi temizlemeniz verilerinizi temiz tutabilir ancak SQL enjeksiyon sorunlarını her zaman engellemez, daha sonra enjekte edilen bir şeyi doğru bir şekilde temizlemeyi unutabilirsiniz. Yer tutucuların kullanılması hataları açık bir şekilde yapar. – tadman

cevap

2

Döngüyü her çalıştırdığınızda dizinin üzerine yazıyorsunuz. Bir dizi dizi oluşturmanız gerekir, böylece bir dizi döndürürsünüz. Aşağıda, geçerli satırı döndürdüğünüz diziye eklemek için kodunuzu basitleştirdim. Daha sonra döndürülen veriler üzerinde foreach yapmak ve görüntülemek kodunuzu Ayrıca

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

, bir PROTIP edebilirsiniz: bir parametre olarak DB konektörü geçmek ve

(başka iyi yöntem olan) küresel olarak kullanmaktan kaçının
function getSearchResults($search) { 
    global $db; 

function getSearchResults($search, $db) { 

Ve son ama Oluyor az değil, sizin fonksiyon yankı şeyler (bunu bu işlev denir katmanına sahip) yoktur. Bunun yerine, sadece boş dizi döndürür

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

Merhaba @Machavity Detaylı cevabınız için teşekkür ederiz! Ekrandaki değerleri foreach kullanarak yankılamaya nasıl başlarım? Buna nasıl yaklaşacağım konusunda da emin değilim. Başka bir dosyada getSearchResults() işlevini çağırdım ve döndürülen diziyi $ searchResult adında bir değişkende sakladım. Yardımın için tekrar teşekkürler. –

+0

@JamesBarrett 'Bu soruya nasıl göz atın' (http://stackoverflow.com/questions/10057671/how-does-foreach-actually-work) 'foreach' nasıl çalıştığına dair ayrıntılar için – Machavity