MySQL Query Problem - PullRequest
       10

MySQL Query Problem

0 голосов
/ 21 февраля 2011

У меня следующий запрос SQL:

SELECT id, retailerName, savingsDetails
FROM coupons
WHERE zone =  '1';

Когда я запускаю его в phpMyAdmin, я получаю аккуратный список строк, которые соответствуют моему значению для zone.

Предположим, что код SQL $gotRows. Я пытаюсь сделать mysql_fetch_array(mysql_query($gotRows)), но по какой-то причине он создает только массив 1x3, а не (в данном случае) 17x3. То есть в массиве есть только одна запись, а не 17, которая должна быть.

Когда я пытаюсь сделать:

foreach($resultOfThat as $foo)
{
    echo $foo;
}

Это ведет себя странно, давая мне вывод, похожий на этот (и только одна итерация выполняется, так как в массиве есть только одна запись):

 33foofoobarbar

Где id = 3, retailerName = foo и SavingDetails = bar. Например, попытка зациклить массив даст мне двойные результаты для каждой его части, подобно тому, как я описал.

В чем проблема?

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

mysql_fetch_array возвращает одну строку в виде массива. используйте цикл для извлечения всех результатов, при необходимости сохраняя их в массиве:

$arr = array();
$q = mysql_query($gotRows);
while ($row = mysql_fetch_array($q)) {
    $arr[] = $row;
}
//$arr now holds the 17x3 result set
var_dump($arr);

Кроме того, сами строки являются массивами для индексации первого столбца, echo $row[0]. Чтобы получить результаты в виде ассоциативного массива, см. Ответ Патрика.

1 голос
/ 21 февраля 2011

Используемый метод (mysql_fetch_array) требует ссылки на запрос выполнения, т. Е.:

$queryCursor = mysql_query($query);
while($row = mysql_fetch_array($queryCursor))
{
  // Do your thing with $row
}

Он также возвращает "следующую строку" из результатаустановить, а не весь результат.

Причина, по которой вы получаете повторяющиеся записи, заключается в том, что mysql_fetch_array принимает вторичный параметр, который описывает, должен ли метод возвращать числовой, ассоциативный или оба типа в строке для каждого столбца.По умолчанию возвращаются ОБА числовые и ассоциативные записи для каждого столбца.

Если вам нужны только числовые или ассоциативные столбцы, либо укажите последний параметр как MYSQL_ASSOC, либо используйте другую функцию, например mysql_fetch_assoc.

В качестве последнего замечания я настоятельно рекомендую вам использовать какой-либо тип DBAL (уровень абстракции базы данных) и, необязательно, ORM (объектно-реляционное отображение), поскольку для встроенной библиотеки требуетсямного кода котельной плиты всякий раз, когда вы хотите взаимодействовать с базой данных.Это также усложняет или, по крайней мере, требует от вас большего кодирования, когда вы хотите настроить более сложные вещи, такие как общие или множественные соединения, делегирование запросов CRUD определенному соединению (чтобы впоследствии его можно было реплицировать в ведомые базы данных) и т. Д.В DBAL часто есть встроенные функции.ORM заботится о прозрачном преобразовании реляционного представления в объектно-ориентированное представление, позволяя вам сосредоточиться на своем приложении, а не создавать код отображения.

На ум приходят следующие библиотеки: Zend_Db и Учение .Существует множество других библиотек, и я бы порекомендовал вам найти активно поддерживаемую библиотеку, соответствующую вашему стилю программирования.

0 голосов
/ 21 февраля 2011

Это должно помочь вам в отладке:

$result = mysql_query($gotRows);
if (!$result) {
  die(mysql_error());
}
while ($row = mysql_fetch_assoc($result)) {
  var_dump($row);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...