Дублированные записи данных в массиве PHP

#php #mysql #database #arrays

#php #mysql #База данных #массивы

Вопрос:

Я не уверен, подходит ли это здесь, поскольку с моей стороны это скорее проблема понимания, но мне любопытно узнать, почему я получаю этот вывод:

 Response id: 3 Question id: 1 Question: What is my middle name? Title: How Well Do You Know Michael
Array ( [0] => Array ( [0] => 3 [r_id] => 3 [1] => 1 [question_id] => 1 [2] => What is my middle name? [question] => What is my middle name? [3] => How Well Do You Know Michael [title] => How Well Do You Know Michael ) ) 
  

когда я запускаю этот PHP-скрипт:

 // Grab the response data from the database to generate the form
    $query = "SELECT qr.response_id AS r_id, qr.question_id, q.question, quiz.title " . 
         "FROM quiz_response AS qr " . 
         "INNER JOIN question AS q USING (question_id) " . 
         "INNER JOIN quiz USING (quiz_id) " .
         "WHERE qr.user_id = '" . $_SESSION['user_id'] . "'";
    $data = mysqli_query($dbc, $query) or die("MySQL error: " . mysqli_error($dbc) . "<hr>nQuery: $query");
    $questions = array(); 
    while ($row = mysqli_fetch_array($data)) {
        echo 'Response id: ' . $row['r_id'] . 'Question id: ' . $row['question_id'] . ' Question: ' . $row['question'] . ' Title: ' . $row['title'] . '<br />';
        array_push($questions, $row);
    }
    print_r($questions);
  

Кажется, что для каждой части данных есть две записи. Например, есть две записи «Идентификатора ответа» под индексом [0] и [r_id]. Оба равны 3. Это мой безумный страх, что я беспокоюсь о дублированных данных в моем массиве? Я думаю о будущем, когда я буду выполнять 10 запросов одновременно, и повлияет ли это на скорость или точность. Любой ввод приветствуется!

Ответ №1:

Если вы проверите документацию mysqli_fetch_array , вы увидите второй параметр $result_type , который по умолчанию установлен на MYSQL_BOTH .

Это означает, что в качестве индекса массива используются как числовой индекс поля ( MYSQL_NUM ), так и имя поля ( MYSQL_ASSOC ). Итак, если вам нужны только индексы имен полей, вы должны использовать это так:

 while ($row = mysqli_fetch_array($data, MYSQL_ASSOC)) {
    // ....
  

Ответ №2:

Такое поведение исключено.

Из http://php.net/manual/en/mysqli-result .fetch-array.php

mysqli_fetch_array() — это расширенная версия функции mysqli_fetch_row(). В дополнение к хранению данных в числовых индексах результирующего массива функция mysqli_fetch_array() также может хранить данные в ассоциативных индексах, используя имена полей результирующего набора в качестве ключей.

Ответ №3:

Взято прямо из документации:

Возвращает массив строк, который соответствует выбранной строке, или FALSE, если строк больше нет. Тип возвращаемого массива зависит от того, как определен result_type. Используя MYSQL_BOT (по умолчанию), вы получите массив как с ассоциативным, так и с числовым индексами. Используя MYSQL_ASSOC, вы получаете только ассоциативные индексы (как работает mysql_fetch_assoc()), используя MYSQL_NUM, вы получаете только числовые индексы (как работает mysql_fetch_row()).

Итак, меняем это:

  while ($row = mysqli_fetch_array($data)) {
  

Для:

  while ($row = mysqli_fetch_array($data, MYSQL_ASSOC)) {
  

Это вернет только строковые ключи или, в качестве альтернативы, вы могли бы использовать mysqli_fetch_assoc

Ответ №4:

Чтение http://php.net/manual/en/function.mysql-fetch-array.php , в нем говорится, что возвращаемое значение mysqli_fetch_array() (которое работает так же, как mysql_fetch_array() ) содержит как численно индексированные данные строки , так и данные строки, индексированные именем поля. Если вы просто хотите, чтобы имя поля индексировало данные, используйте mysqli_fetch_assoc() .