这个MySQLi/PHP代码段的可维护性很差

这个MySQLi/PHP代码段的可维护性很差,php,mysql,mysqli,Php,Mysql,Mysqli,我有一段代码可以工作,但它相当混乱。目标是从用户搜索中检索所有相关行。例如:如果用户搜索“Jo”,它将检索John和Josh: 有效的代码: if($_SERVER["REQUEST_METHOD"] == "POST") { $search = trim(filter_input(INPUT_POST,"user_search",FILTER_SANITIZE_SPECIAL_CHARS)); $search = preg_replace("#[^0-9a-z]#i", "", $se

我有一段代码可以工作,但它相当混乱。目标是从用户搜索中检索所有相关行。例如:如果用户搜索“Jo”,它将检索John和Josh:

有效的代码:

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>";
            }
          }
          ?>
但是,这将不起作用,因为只有fetch_assoc()的第一个结果存储在$searchArray中,其他什么都没有!有人有什么建议吗?我不确定下一步从哪里开始编码


James。

每次运行循环时都会覆盖数组。您需要创建一个数组数组,以便可以返回一个数组。下面,我简化了代码,将当前行附加到返回的数组中。然后,您可以对返回的数据执行
foreach
,并显示您的代码

while($row = $query->fetch_assoc()) {
  $searchArray[] = $row;
}
另外,一个protip:将DB连接器作为参数传递,避免将其作为全局参数使用(这是另一个最佳实践)

变成

function getSearchResults($search, $db) {
最后,但并非最不重要的一点是,不要让你的函数回显(让调用这个函数的层去做)。相反,只需返回一个空数组

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

警告:使用
mysqli
时,应使用参数化查询,并将用户数据添加到查询中。不要使用手动转义和字符串插值或串联来完成此操作,因为这样会创建严重的错误。清理字符串可能会保持数据干净,但并不总是可以防止SQL注入问题,您可能会忘记正确清理稍后注入的内容。使用占位符会导致明显的错误。您好@Machavity谢谢您的详细回答!我将如何使用foreach将值回显到屏幕上?我也不确定如何处理这个问题。我在另一个文件中调用了getSearchResults()函数,并将返回的数组存储在名为$searchResult的变量中。再次感谢您的帮助。@JamesBarrett查看有关
foreach
工作原理的详细信息
function getSearchResults($search, $db) {
if ($query->num_rows == 0) {
   return $searchArray;
}