#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()
.