Как я могу сократить эту часть кода?

#php #mysql #html

#php #mysql #HTML

Вопрос:

Я знаю только, что эта часть кода не подходит для производительности веб-приложения, потому что она потратила много времени на выполнение двух SQL-запросов вместо одного. Я хочу прочитать ваши предложения по этой части кода. Кроме того, я хочу прочитать ваше кодовое решение этого. Код работает нормально.

Я ценю вашу помощь.

Заранее благодарю вас

 <html>
<body>
    <select name="category">
        <option value="category">category name</option>
        <?php
        $sql = "SELECT category.name as cat, article.name as art from category
        JOIN article ON category.id = article.id";
        $query = mysqli_query($conn, $sql);
        while($row = mysqli_fetch_array($query)){
        echo "
        <option value='".$row["cat"]."'>".$row["cat"]."</option>";
        }
        mysqli_close($conn);
        ?>
    </select>
    <select name="article">
        <option value="articlename">article name</option>
        <?php
        $sql = "SELECT category.name as cat, article.name as art from category
        JOIN article ON category.id = article.id";
        $query = mysqli_query($conn, $sql);
        while($row = mysqli_fetch_array($query)){
        echo "
        <option value='".$row["art"]."'>".$row["art"]."</option>";
        }
        mysqli_close($conn);
        ?>
    </select>
</body>
</html>
  

Комментарии:

1. Код с хорошим отступом приятнее читать

2. Примечание: объектно-ориентированный интерфейс to mysqli значительно менее подробный, что упрощает чтение и аудит кода, и его нелегко спутать с устаревшим mysql_query интерфейсом, где отсутствие одного i может вызвать проблемы. Пример: $db = new mysqli(…) и $db->prepare("…") процедурный интерфейс в значительной степени является артефактом эпохи PHP 4, когда mysqli был представлен API, и его не следует использовать в новом коде.

Ответ №1:

Вам не нужно устанавливать 2 подключения к БД для получения одних и тех же данных. Вы могли бы создать коллекцию объектов и использовать их на месте, например…

 <?php
  $arr = [];

  $sql = "SELECT category.name as cat, article.name as art from category 
  JOIN article ON category.id = article.id";

  $query = mysqli_query($conn, $sql);

  while($row = mysqli_fetch_array($query)){
      $obj = (object) [
          "cat" => $row["cat"],
          "art" => $row["art"]
      ];

      array_push($arr, $obj);
  }

  mysqli_close($conn);
?>

<select name="category">
<option value="category">category name</option>
foreach($arr as $obj) {
    ?>
        <option value='"<?php echo $obj->cat; ?>"'><?php echo $obj->cat; ?></option>
    <?php
}
  

 <select name="article">
<option value="articlename">article name</option>
foreach($arr as $obj) {
    ?>
        <option value='"<?php echo $obj->art; ?>"'><?php echo $obj->art; ?></option>
    <?php
}
  

Ответ №2:

Вы можете подготовить строки, которые будут содержать цикл <option> in 1, а затем просто повторить их.

В примере :

 <?php
$sql = "SELECT category.name as cat,
               article.name as art
        FROM category 
        JOIN article
        ON category.id = article.id";
$query = mysqli_query($conn, $sql);
$articles = "";
$categories = "";
while($row = mysqli_fetch_array($query)) {
    $categories .= "<option value='" . $row["cat"] . "'>" . $row["cat"] . "</option>";
    $articles .= "<option value='" . $row["art"] . "'>" . $row["art"] . "</option>";
}
mysqli_close($conn);
?>
<select name="category">
    <option value="category">category name</option>
    <?php echo $categories; ?>
</select>
<select name="article">
    <option value="articlename">article name</option>
    <?php echo $articles; ?>
</select>