Запрос mysqli возвращает только первую строку

Я перехожу от 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;