Я перехожу от mysql к mysqli, и у меня возникают проблемы с возвратом более одной строки из базы данных в запросе.
$db = new mysqli($hostname, $sql_us, $sql_us_pwd, $sql_db); // This is already connected function db_query($db, $query, $type = 'object') { global $db; $result = $db->query($query); if ($type == 'assoc') { while($row = $result->fetch_assoc()) { return $row; } } else { while($row = $result->fetch_object()) { return $row; } } mysqli_free_result($result); } $query = "SELECT * FROM `users`"; $user = db_query($db, $query); print_r($user); // This is only returning the first row of results
Я, очевидно, пытаюсь сделать функцию, где я могу запросить базу данных и либо вернуть результаты в ассоциативный массив, либо как объект. Что я делаю не так?
Используйте этот код:
$rows = array(); if ($type == 'assoc') { while($row = $result->fetch_assoc()) { $rows[] = $row; } } else { while($row = $result->fetch_object()) { $rows[] = $row; } } return $rows;
Вы используете возврат внутри while, а return завершает цикл while после первой итерации, поэтому вы получаете только одну строку.
Вам нужно сохранить значения цикла в массиве, попробуйте это
$rows = array(); if ($type == 'assoc') { while($row = $result->fetch_assoc()) { $rows[] = $row; } } else { while($row = $result->fetch_object()) { $rows[] = $row; } } return $rows;
Когда вы возвращаетесь в функцию, она перестает выполняться в этой точке и возвращается к тому, откуда она была вызвана, с возвращаемым значением.
В вашем случае, когда вы возвращаете $ row, вы получаете выход из функции, как только читается первая строка.
Исправление:
$result = array(); if ($type == 'assoc') { while($row = $result->fetch_assoc()) { $result[] = $row; } } else { while($row = $result->fetch_object()) { $result[] = $row; } } return $row;
Вы возвращаете только первую строку. Вы должны вернуть массив.
$arr = array(); if ($type == 'assoc') { while($row = $result->fetch_assoc()) { $arr[] = $row; } } else { while($row = $result->fetch_object()) { $arr[] = $row; } } return $arr;