Странно для цикла / массива в PHP - PullRequest
0 голосов
/ 11 февраля 2011

Это мой первый вопрос здесь о StackOverflow, и, честно говоря, я довольно новичок в PHP.Просто чтобы кратко рассказать вам;)

Я создаю веб-сайт на основе ООП в трехуровневой архитектуре.В моем уровне абстракции данных у меня есть объект, который я назвал DbAdapter, который содержит все функции, необходимые для взаимодействия с базой данных.Ниже приведена одна из этих функций: read ($ sql), которая принимает запрос SQL и сохраняет результат в двумерном массиве.

Для этого используются два вложенных цикла for (один длястроки и один для столбцов в строке).И хотя итератор $ i увеличивается как обычно, последний элемент массива как-то перезаписывается.

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

Кто-нибудь хочет помочь новичку?

Заранее спасибо, Сэм

public $loadedRows;
public function read($sql)
{
    if ($this->connect())
    {
        $result = mysql_query($sql);
        if ($result)
        {
            $totalRows = mysql_num_rows($result);
            $totalFields = mysql_num_fields($result);

            for ($i = 0; $i < $totalRows; $i++)
            {
                for ($j = 0; $j < $totalFields; $j++)
                {
                    $fieldName = mysql_field_name($result, $j);
                    $loadedFields["$fieldName"] = mysql_result($result, $i, $fieldName);
                }

                $this->loadedRows[i] = $loadedFields;
            }

            $this->closeConnection();
            return $this->loadedRows;
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Вы просто забыли $, прежде чем я $this->loadedRows[$i]

и этот код должен быть короче:

public function read($sql)
{
    $a = array();
    $result = mysql_query($sql);
    if ($result)
    {
        while($row = mysql_fetch_assoc($res)) $a[]=$row;
    }
    return $a;
}

Это ВСЕ.

и для того, чтобы ловить эти ошибки самостоятельно, вы должны установить уровень сообщений об ошибках на E_ALL
Для этого вы можете добавить эту строку

error_reporting(E_ALL);

в вашем конфигурационном файле.
Он скажет PHP, что нужно наблюдать за такими ошибками (в этом случае используется неопределенная константа i), и уведомит вас

2 голосов
/ 11 февраля 2011

Я предполагаю, что пропал $ до i вот ваш виновник:

           $this->loadedRows[i] = $loadedFields;
2 голосов
/ 11 февраля 2011

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

while($row = mysql_fetch_assoc()) {
    $this->loadedRows[] = $row;
}

Вместо обеих ваших петель?Выборка имен полей / значений по отдельности, как это, ужасно медленна по сравнению с простой выборкой ассоциативной строки, в которой уже есть имя / значения поля.

Лично я предпочитаю съесть миску с ликерами, а не по отдельности вытаскивать одну из коробки, класть ее в миску, поливать каплей молока, есть, а затем возвращаться к коробке для другой..

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

На вашем месте я бы использовал PDO вместо этих старых функций mysql. PDOStatement :: fetchAll делает то, что вам нужно.

...