У меня есть небольшая проблема, которую я не понимаю. У меня есть 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-запроса.