создать массив из mysql-запроса php

У меня есть небольшая проблема, которую я не понимаю. У меня есть db, у которого есть владелец и тип (и больше). Я хочу получить список всех значений типа, которые имеют владельца, равного текущему пользователю, но я получаю только два результата

$sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' ORDER BY id DESC "; $result = mysql_query($sql,$con); print_r(mysql_fetch_array($result)); 

распечатывает:

 Array ( [0] => 18 [type] => 18 ) 

а также

 $sql = "SELECT type FROM cars WHERE owner='".mysql_real_escape_string($_SESSION['username'])."' AND selling='0' "; 

распечатывает:

 Array ( [0] => 16 [type] => 16 ) 

И результат должен быть примерно 19, 19, 18, 17, 16 в массиве. Thats все типы, которые имеют меня в качестве владельца.

У меня сейчас это работает:

 for ($x = 0; $x < mysql_num_rows($result); $x++){ $row = mysql_fetch_assoc($result); echo $row['type']; } 

Здесь я печатаю все значения правильно, но мне нужно создать массив со всеми значениями. Хотя я мог бы использовать array_push, но лучше всего это сделать лучше. Я думал, что получаю все значения типов с помощью простого запроса mysql.

Очень часто это делается в цикле while:

 $types = array(); while(($row = mysql_fetch_assoc($result))) { $types[] = $row['type']; } 

Взгляните на примеры в документации .

mysql_fetch_* всегда будут получать следующий элемент набора результатов:

Возвращает массив строк, соответствующий выбранной строке, или FALSE, если больше строк нет.

Вот почему работает цикл while . Если строк больше нет, $row будет false и цикл while существует.

Кажется, что mysql_fetch_array получает более одной строки, потому что по умолчанию он получает результат как обычно и как ассоциативное значение :

Используя MYSQL_BOTH (по умолчанию), вы получите массив с ассоциативными и числовыми индексами.

Ваш пример показывает это лучше всего, вы получаете то же значение 18 и вы можете получить к нему доступ через $v[0] или $v['type'] .

Вам нужно пройти через …

 $typeArray = array(); $query = "select * from whatever"; $result = mysql_query($query); if ($result) { while ($record = mysql_fetch_array($results)) $typeArray[] = $record['type']; } 
 THE CORRECT WAY ************************ THE CORRECT WAY while($rows[] = mysqli_fetch_assoc($result)); array_pop($rows); // pop the last row off, which is an empty row 
 while($row = mysql_fetch_assoc($result)) { echo $row['type']; } 

Вы также можете облегчить жизнь с помощью обертки, например, с помощью ADODb:

 $myarray=$db->GetCol("SELECT type FROM cars ". "WHERE owner=? and selling=0", array($_SESSION['username'])); 

Хорошая обертка сделает все возможное для вас, облегчая чтение.

 $type_array = array(); while($row = mysql_fetch_assoc($result)) { $type_array[] = $row['type']; } 

Вы можете захотеть взглянуть на статью SQL Injection в Википедии. Посмотрите в разделе «Шестигранное преобразование», чтобы найти небольшую функцию для выполнения ваших SQL-команд и вернуть массив с информацией в нем.

https://en.wikipedia.org/wiki/SQL_injection

Я написал функцию dosql (), потому что устал от того, что мои SQL-команды выполняются повсюду, забывая проверить наличие ошибок и записывая все мои команды в файл журнала для последующего просмотра, если это необходимо. Процедура бесплатна для тех, кто хочет использовать ее в любых целях. Я на самом деле немного расширил функцию, потому что хотел, чтобы она выполняла больше, но эта базовая функция является хорошей отправной точкой для получения вывода из SQL-запроса.