2009-04-30 5 views
4

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

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

В этом примере, когда объект создан, вы передаете идентификатор в качестве параметра, а затем запускаете запрос в базу данных с идентификатором и вы возвращаете возвращаемые значения в свойства объекта. У меня мало опыта работы с 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... 
     } 
    } 
} 

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

ответ

2

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

4

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

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

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

+0

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

+0

Есть ли какие-либо другие шаблоны дизайна для этого? – kevin

1

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

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

0

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

$obj = mysql_fetch_object($query); 

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

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

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

Смежные вопросы