Как показать только один результат от каждого типа в массиве mysql php

#php #mysql #arrays

#php #mysql #массивы

Вопрос:

У меня есть массив php для отображения информации из базы данных. Я хочу иметь возможность показывать элементы, подобные этому, например. Space Quest (3) ‘(3)’ представляет количество раз, найденных в базе данных. Прямо сейчас он извлекает информацию и выводит результаты столько раз, сколько отображается в базе данных, как это например. Космический квест Космический квест космический квест которые ссылаются на отдельные истории. Вот мой код:

 <?php
  $type = $_POST['Type'];

  $result = mysqli_query($cxn, "SELECT * 
                                  FROM Stories 
                                 WHERE Type = '$type'");

if($result < 0) {
  echo "<center><b>No stories are posted for this category yet.</b></center>";
} else {
  while($row = mysqli_fetch_array($result)) {
    $title = $row['Title']; 
    $result2 = mysqli_num_rows($result);
    echo "<FORM ACTION ='browse.php' METHOD ='POST'>
            <INPUT TYPE = 'Submit' name='cool2' id='cool2' VALUE = '$title'>";
    echo "amp;nbsp;amp;nbsp;<font color = '#0000ff''>(" . $result2 . ")";
    echo "</form>";
    echo "amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;";
  }
} ?>
  

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

Ответ №1:

Вместо этого вы должны выполнить следующий запрос

 "SELECT Title,count(*) as cnt FROM Stories WHERE Type = '$type' group by Title"
  

тогда вы получите только разные заголовки, а столбец cnt будет содержать количество раз, когда это происходит.

Ответ №2:

Проблема в том, что вы используете

 while($row = mysqli_fetch_array($result))
  

Это приведет к повторению всех строк в результате. Вместо этого, если вам нужен только первый, выполните

 $row = mysqli_num_rows($result); 
$occurrences = mysqli_num_rows($result);
// ...
  

Ответ №3:

Ну, если я правильно понимаю, то вам нужна функция группировки. Например:

 select id, title, count( * ) from stories where type = 'ANYTHING' group by id, title
  

Это что?

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

1. В большинстве схем вы, вероятно, не хотели бы, чтобы идентификатор был там таким.

Ответ №4:

Это не ответ на ваш вопрос, но в любом случае это полезная информация:

Ваш SQL-запрос уязвим для атак с использованием SQL-инъекций. Это потому, что вы напрямую вставляете пользовательский ввод (параметр POST) в строку вашего SQL-запроса. Для строковых значений следует использовать функцию escape для строки, которая гарантирует, что строка будет безопасно вставлена в запрос:

 $query = "SELECT * FROM Stories WHERE Type = '" . mysqli_real_escape_string($type) . "'";
  

Также неплохо избегать любых значений, которые вы выводите в свой HTML-код. Это помогает предотвратить атаки с использованием межсайтового скриптинга. Используйте htmlspecialchars() функцию для этого:

 echo "<INPUT TYPE = 'Submit' name='cool2' id='cool2' VALUE = '" . htmlspecialchars($title) . "'>";