Мой цикл for позволяет отображать только один пост снова и снова

#php #mysql #sql #for-loop

Вопрос:

 
    
  /* To sort the id and limit the post by 40 */
  $sql = "SELECT * FROM requests"; 
  $result = $conn->query($sql);
  $sqlall= "SELECT * FROM requests ";
  $resultall = $conn->query($sqlall);
     
  $i = 0;
     
  if ($result->num_rows > 0) {  
    
      // Output data of each row
      $idarray= array();
      while($row = $result->fetch_assoc()) {
          echo "<br>";  
          
          // Create an array to store the
          // id of the blogs        
          array_push($idarray,$row['id']); 
      } 
  }
  else {
      echo "0 results";
  }
?>
          <?php 
            for($x = 1; $x < 40; $x  ) {
              // This is the loop to display all the stored blog posts
              if(isset($x)) {
                $query = mysqli_query(
$conn,"SELECT * FROM `requests`");
                  
                $res = mysqli_fetch_array($query);
                $email1 = $res['email1'];
                $msg1= $res['msg1'];
                $subject1 = $res['subject1'];
                $name1 = $res['name1'];
                $id = $res['id'];


                  
            
 

результат-40 карт, считывающих данные из первой строки в моей базе данных. кто-нибудь может помочь?
Я использую xampp.
Этот код предназначен для отображения цикла, но если кто-то хочет, чтобы полный код был здесь

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

1. Вы сохраняете все идентификаторы в массиве $idarray , а затем просто выполняете 40 раз один и тот же запрос снова и всегда извлекаете одну и ту же первую строку.

2. @AllanSharad помог ли вам приведенный ниже ответ? Если да, пожалуйста, не забудьте отметить его как принятый и/или проголосовать за него. Если это не помогает, пожалуйста, объясните, почему. Спасибо.

Ответ №1:

Вы храните все идентификаторы в массиве $idarray , но на самом деле не используете их должным образом. Вы перебираете их, но просто выполняете SELECT * FROM запросы еще 40 раз и всегда извлекаете одну и ту же первую строку. Вы никогда не используете идентификатор для изменения запроса.

Но в любом случае действительно нет смысла запускать множество отдельных запросов. Если вам нужны только первые 40 строк, используйте LIMIT ключевое слово MySQL. Обычно это лучше всего работает в сочетании с ORDER BY тем же. Что-то вроде этого:

 $sql = "SELECT * FROM requests ORDER BY id LIMIT 40";
$result = $conn->query($sql);

while ($res = $result->fetch_assoc()) {
  $email1 = $res['email1'];
  $msg1 = $res['msg1'];
  $subject1 = $res['subject1'];
  $name1 = $res['name1'];
  $id = $res['id'];

  //example output, just for demo:
  echo $email1." ".$msg1." ".$subject1." ".$name1." ".$id;
}
 

Документация: https://dev.mysql.com/doc/refman/8.0/en/limit-optimization.html