В моей таблице у меня есть 2 записи с companyid = 1
, но когда я запускаю php ниже для companyid = 1
он возвращает только первый!
Как я могу получить все записи?
Файл php:
if (isset($_GET["companyid"])) { $companyid = $_GET['companyid']; // get a product from products table $result = mysql_query("SELECT * FROM `products` WHERE companyid = $companyid;"); if (!empty($result)) { if (mysql_num_rows($result) > 0) { while($row = mysql_fetch_assoc($result)){ $product = array(); $product["pid"] = $row["pid"]; $product["productname"] = $row["productname"]; } $response["product"] = array(); array_push($response["product"], $product); // success $response["success"] = 1; echo json_encode($response); } else { // no product found $response["success"] = 0; $response["message"] = "No product found"; // echo no product JSON echo json_encode($response); } } else { // no product found $response["success"] = 0; $response["message"] = "No product found"; // echo no users JSON echo json_encode($response); } } else { $response["success"] = 0; $response["message"] = "Required field(s) is missing"; // echoing JSON response echo json_encode($response); }
Использование mysql_fetch_array
происходит одинаково. он возвращает {"product":[{"pid":"12371","productname":"test"}],"success":1}
когда я запускаю запрос без параметров, select * from table
с помощью mysql_fetch_array
он возвращает все ряды ..
Как отметил NikiC, вы больше не должны использовать функции mysql_, вы можете получить весь массив как в PDO, так и в mysqli. Вот пример, чтобы получить все строки, используя функцию mysqli-> fetch_all , надеюсь, что это поможет!
//Database Connection $sqlConn = new mysqli($hostname, $username, $password, $database); //Build SQL String $sqlString = "SELECT * FROM my_table"; //Execute the query and put data into a result $result = $this->sqlConn->query($sqlString); //Copy result into a associative array $resultArray = $result->fetch_all(MYSQLI_ASSOC); //Copy result into a numeric array $resultArray = $result->fetch_all(MYSQLI_NUM); //Copy result into both a associative and numeric array $resultArray = $result->fetch_all(MYSQLI_BOTH);
while ($row = mysql_fetch_assoc($result)) { echo $row["userid"]; echo $row["fullname"]; echo $row["userstatus"]; } mysql_free_result($result);
php.net/mysql_fetch_assoc
Я бы рекомендовал вам использовать PDO вместо mysql_
if (!empty($result)) {
Может быть is_resource($result)
Чтобы получить все строки, вам нужно пройти через результат:
while($row = mysql_fetch_assoc($result)){ //Do stuff }
На стороне примечания вы должны использовать как минимум mysqli или PDO вместо функций mysql_ *.
Я твердо верю, что пакетная обработка с Doctrine или любые итерации с MySQL (PDO или mysqli) – всего лишь иллюзия.
@ dimitri-k предоставил приятное объяснение, особенно о единице работы. Проблема заключается в пропуске: « $ query-> iterate () », который на самом деле не перебирает источник данных. Это просто оболочка \ Traversable вокруг уже полностью загруженного источника данных.
Пример, демонстрирующий, что даже удаление уровня абстракции Doctrine полностью из изображения, мы все равно столкнемся с проблемами памяти :
echo 'Starting with memory usage: ' . memory_get_usage(true) / 1024 / 1024 . " MB \n"; $pdo = new \PDO("mysql:dbname=DBNAME;host=HOST", "USER", "PW"); $stmt = $pdo->prepare('SELECT * FROM my_big_table LIMIT 100000'); $stmt->execute(); while ($rawCampaign = $stmt->fetch()) { // echo $rawCampaign['id'] . "\n"; } echo 'Ending with memory usage: ' . memory_get_usage(true) / 1024 / 1024 . " MB \n";
Вывод:
Starting with memory usage: 6 MB Ending with memory usage: 109.46875 MB
Здесь неутешительный метод getIterator () :
namespace Doctrine\DBAL\Driver\Mysqli\MysqliStatement /** * {@inheritdoc} */ public function getIterator() { $data = $this->fetchAll(); return new \ArrayIterator($data); }
Вы можете использовать мою небольшую библиотеку для фактического потока больших таблиц с использованием PHP Doctrine или DQL или просто чистого SQL. Однако вы сочтете нужным: https://github.com/EnchanterIO/remote-collection-stream