Получение значений базы данных в объекты - PullRequest
4 голосов
/ 30 апреля 2009

Дело в том, что у вас есть классы, а затем у вас есть данные базы данных. Когда вы создаете объект, как установить свойства объектов, чтобы они содержали данные в базе данных?

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

В этом примере при создании объекта вы передаете идентификатор в качестве параметра, а затем запускаете запрос к базе данных с идентификатором и присваиваете возвращенные значения свойствам объекта. У меня нет большого опыта PHP и я не видел, чтобы это использовалось много.

Является ли это приемлемым способом достижения этой цели? Есть ли лучший или более приемлемый способ?

public function __construct($id = null){
    if($id != null){
        $sql = "SELECT *
        FROM users
        WHERE user_id = $id";

        $res = Db::returnRow($sql);

        // $res contains an associative array with database columns and values

        if($res){
            $this->user_id = $res['user_id'];
            $this->user_name = $res['user_name'];
            //and so on...
        }
    }
}

Может ли кто-нибудь предоставить пример кода или псевдокода, чтобы проиллюстрировать, как правильно это сделать?

Ответы [ 4 ]

4 голосов
/ 30 апреля 2009

Это может быть приемлемым способом для домашней работы, может быть. Но архитектурно это не так.

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

Заключение: Я бы предложил прочитать некоторые ресурсы по шаблону проектирования (в вашей ситуации взгляните на шаблон DAO);) Подсказка: один из серии Head First чрезвычайно доступен и приятен.

2 голосов
/ 30 апреля 2009

Вы можете создать функцию, которая сделает это автоматически, зацикливая пары ключ / значение ассоциативного массива. Или вы можете использовать библиотеку ORM .

1 голос
/ 30 апреля 2009

Да, вы можете полуавтоматизировать это, имея родительский класс, от которого наследуются все объекты. При загрузке он запрашивает «SHOW FIELDS FROM [my tablename]» и заполняет ассоциативный массив именами. Если идентификатор передан, он ищет действительный объект в этой таблице с этим идентификатором и присваивает значения массиву.

Примечание: не передавайте свой идентификатор прямо в ваш запрос. Параметризовать sql и обернуть функцию вокруг любого пользовательского ввода для его очистки.

0 голосов
/ 01 мая 2009

Если это mysql, вы можете просто сделать:

$obj = mysql_fetch_object($query);

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

$pdo->query($stmt, PDO::FETCH_CLASS, "MyClass", array('foo'=>'bar'));

... где последний параметр содержит аргументы для вашего конструктора класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...