PHP / MySQL: почему мой запрос возвращает только первую строку? - PullRequest
3 голосов
/ 20 февраля 2012

Почему мой метод возвращает только первый ряд моей таблицы?Я не могу понять почему, и это сводит меня с ума.Я уверен, что это что-то очень простое.

public function getTitlesForRegistrationForm() {
    $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");
    $i=0;
    $array[0] = "No result";
    foreach($result->fetch(PDO::FETCH_ASSOC) as $row){
        $array[$i] = $row;
        $i++;
    }
    return $array;
}

Спасибо.

Ответы [ 6 ]

7 голосов
/ 20 февраля 2012

Это может быть потому, что ваш $result->fetch() вызов не возвращает итеративное значение, а либо строку результата, либо FALSE.PHP foreach работает только с повторяемыми значениями.Обновление вашего кода до чего-то подобного должно помочь:

public function getTitlesForRegistrationForm() {
    $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");
    $i=0;
    $array[0] = "No result";
    while (($row = $result->fetch(PDO::FETCH_ASSOC)) !== FALSE) {
        $array[$i] = $row;
        $i++;
    }
    return $array;
}
3 голосов
/ 20 февраля 2012

Это потому, что вы используете fetch(). Вам нужно fetchall().

http://www.php.net/manual/en/pdostatement.fetchall.php

[править] Ничего себе. Мне нужно научиться печатать быстрее.

3 голосов
/ 20 февраля 2012

Вам нужно fetch() внутри while цикла. Он будет возвращать только одну строку при каждом вызове.

Я также взял на себя смелость рефакторинга вашего $i счетчика. Вместо этого No result добавляется к массиву в первой позиции (для любых целей, которые вы планировали использовать), а последующие строки добавляются с помощью [].

public function getTitlesForRegistrationForm() {
    $array = array();
    $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");

    // Why are you putting No Result onto the array?
    // I've left it in, but it doesn't make sense to me.
    $array[] = "No result";
    while ($row = $result->fetch(PDO::FETCH_ASSOC)){
        $array[] = $row;
    }
    return $array;
}
2 голосов
/ 20 февраля 2012

Просто замените метод fetch на fetchAll

2 голосов
/ 20 февраля 2012

Попробуйте время вместо foreach. Foreach повторяет только одну возвращаемую строку. код:

while($row = fetch(PDO::FETCH_ASSOC)) {
  $array[$i] = $row;
  $i++;
}
2 голосов
/ 20 февраля 2012

Попробуйте:

while($row = $result->fetch(PDO::FETCH_ASSOC)){
    foo();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...