"Web 2.0 Development in Practice"의 저자인 Quentin Zervaas는 책에서 간단한 PHP 데이터 액세스 개체를 언급했습니다.
- /**
- * DatabaseObject
- *
- * 데이터베이스 테이블의 데이터를 쉽게 조작하는 데 사용되는 추상 클래스
- * 간단한 로드/저장/삭제 방법을 통해
- */
- 추상 클래스 DatabaseObject
- {
- const TYPE_TIMESTAMP = 1;
- const TYPE_BOOLEAN = 2;
- protected static $types = array(self::TYPE_TIMESTAMP, self::TYPE_BOOLEAN);
- private $_id = null;
- private $_properties = array();
- protected $_db = null;
- protected $_table = '';
- protected $_idField = '';
- 공용 함수 __construct(Zend_Db_Adapter_Abstract $db, $ 테이블, $idField)
- {
- $this->_db = $db;
- $this->_table = $table;
- $this->_idField = $idField;
- }
-
- 공용 함수 로드($id, $field = null)
- {
- if (strlen($field) == 0)
- $field = $this->_idField ;
-
- if ($field == $this->_idField) {
- $id = (int) $id;
- if ($id <= 0)
- return false ;
- }
- $query = sprintf('%s에서 %s 선택, 여기서 %s = ?',
- Join(', ', $this->getSelectFields()),
- $this->_table,
- $field);
-
- $query = $this->_db->quoteInto($query, $id);
-
- return $this->_load($query);
- }
-
- 보호 함수 getSelectFields($prefix = '')
- {
- $fields = array($prefix . $this->_idField);
- foreach ($this->_properties as $k => $v)
- $fields[] = $prefix . $k;
-
- return $fields;
- }
-
- 보호 함수 _load($query)
- {
- $result = $this->_db->query ($query);
- $row = $result->fetch();
- if (!$row)
- return false;
-
- $this->_init($row );
-
- $this->postLoad();
-
- return true;
- }
-
- 공개 함수 _init($row)
- {
- foreach ($this->_properties as $k => $v) {
- $val = $row[$k];
-
- 스위치($v['type']) {
- case self::TYPE_TIMESTAMP:
- if (!is_null($val))
- $val = strtotime($val);
- break;
- case self::TYPE_BOOLEAN:
- $val = (bool) $val;
- break;
- }
-
- $this->_properties[$k]['value'] = $val;
- }
- $this ->_id = (int) $row[$this->_idField];
- }
-
-
- 공개 함수 save($useTransactions = true)
- {
- $update = $this->isSaved();
-
- if ($useTransactions)
- $this->_db->beginTransaction();
-
- if ($update)
- $commit = $this->preUpdate();
- else
- $commit = $this->preInsert();
-
- if (!$commit) {
- if ( $useTransactions)
- $this->_db->rollback();
- return false;
- }
-
- $row = array();
-
- foreach( $this->_properties as $k => $v) {
- if ($update && !$v['updated'])
- 계속;
-
- 스위치 ($v['type']) {
- 케이스 자체:: TYPE_TIMESTAMP:
- if (!is_null($v['value'])) {
- if ($this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql)
- $v['value'] = date('Y-m-d H :i:sO', $v['value']);
- else
- $v['value'] = date('Y-m-d H:i:s', $v['value']);
- }
- break;
-
- case self::TYPE_BOOLEAN:
- $v['value'] = (int) ((bool) $v['value']);
- break;
- }
-
- $row[$k] = $v['value'];
- }
-
- if (count($row) > 0) {
- // 삽입/업데이트 수행
- if ($update) {
- $this->_db->update($this->_table, $row, sprintf('%s = %d ', $this->_idField, $this->getId()));
- }
- else {
- $this->_db->insert($this->_table, $row);
- $this->_id = $this->_db->lastInsertId ($this->_table, $this->_idField);
- }
- }
-
- // 내부 ID 업데이트
-
- if ($commit) {
- if ($update)
- $commit = $this->postUpdate();
- else
- $commit = $this->postInsert();
- }
-
- if ($useTransactions) {
- if ($commit)
- $this->_db->commit();
- else
- $this->_db->rollback();
- }
-
- return $commit;
- }
-
- 공개 함수 delete($useTransactions = true)
- {
- if (!$this->isSaved() )
- false 반환;
-
- if ($useTransactions)
- $this->_db->beginTransaction();
-
- $commit = $this->preDelete( );
-
- if ($commit) {
- $this->_db->delete($this->_table, sprintf('%s = %d', $this-> _idField, $this->getId()));
- }
- else {
- if ($useTransactions)
- $this->_db->rollback();
- return false;
- }
-
- $commit = $this->postDelete();
-
- $this->_id = null;
-
- if ($useTransactions) {
- if ($commit)
- $this->_db->commit();
- else
- $this->_db->rollback();
- }
-
- return $commit;
- }
-
- 공개 함수 isSaved()
- {
- return $this->getId() > 0;
- }
-
- 공용 함수 getId()
- {
- return (int) $this->_id;
- }
-
- 공용 함수 getDb()
- {
- return $this->_db;
- }
-
- 공개 함수 __set($name, $value)
- {
- if (array_key_exists($name, $ this->_properties)) {
- $this->_properties[$name]['value'] = $value;
- $this->_properties[$name]['updated'] = true ;
- true 반환;
- }
-
- false 반환;
- }
-
- 공개 함수 __get($name)
- {
- return array_key_exists($name, $this->_properties) ? $this->_properties[$name]['value'] : null;
- }
-
- 보호 함수 add($field, $default = null, $type = null)
- {
- $this->_properties[$field] = array('value' => $default,
- 'type' => in_array($type, self::$types) ? $type : null,
- 'updated' => false);
- }
-
- 보호 함수 preInsert()
- {
- return true;
- }
-
- 보호 함수 postInsert ()
- {
- true 반환;
- }
-
- 보호 함수 preUpdate()
- {
- true 반환;
- }
-
- 보호 함수 postUpdate ()
- {
- true 반환;
- }
-
- 보호 함수 preDelete()
- {
- true 반환;
- }
-
- 보호 함수 postDelete ()
- {
- true 반환;
- }
-
- 보호 함수 postLoad()
- {
- true 반환;
- }
-
- 공개 정적 함수 BuildMultiple($db, $class, $data)
- {
- $ret = array();
-
- if (!class_exists($class))
- throw new Exception('정의되지 않은 클래스 지정됨: ' . $class);
-
- $testObj = new $class($db);
-
- if (!$testObj instanceof DatabaseObject)
- throw new Exception('클래스는 DatabaseObject에서 확장되지 않습니다.' );
-
- foreach ($data as $row) {
- $obj = new $class($db);
- $obj->_init($row);
-
- $ret[$obj->getId()] = $obj;
- }
-
- return $ret;
- }
- }
-
제조대码
- class DatabaseObject_User 확장 DatabaseObject
- {
- static $userTypes = array('member' => 'Member',
- ' 관리자' => '관리자');
-
- 공개 $profile = null;
- 공개 $_newPassword = null;
-
- 공개 함수 __construct($db)
- {
- parent::__construct($db, 'users', 'user_id');
-
- $this->add('username');
- $this->add('password') ;
- $this->add('user_type', 'member');
- $this->add('ts_created', time(), self::TYPE_TIMESTAMP);
- $this- >add('ts_last_login', null, self::TYPE_TIMESTAMP);
-
- $this->profile = new Profile_User($db);
- }
-
- 보호 함수 preInsert( )
- {
- $this->_newPassword = Text_Password::create(8);
- $this->password = $this->_newPassword;
- return true;
- }
-
- 보호된 함수 postLoad()
- {
- $this->profile->setUserId($this->getId());
- $this->profile-> ;load();
- }
-
- 보호 함수 postInsert()
- {
- $this->profile->setUserId($this->getId());
- $this->profile->save(false);
-
- $this->sendEmail('user-register.tpl');
- return true;
- }
-
- 보호 함수 postUpdate()
- {
- $this->profile->save(false);
- true 반환;
- }
-
- 보호 함수 preDelete()
- {
- $this->profile->delete();
- true를 반환합니다.
- }
-
- 공개 함수 sendEmail($tpl)
- {
- $templater = new Templater();
- $templater->user = $this;
-
- // 이메일 본문 가져오기
- $body = $templater->render('email /' . $tpl);
-
- // 첫 번째 줄에서 제목 추출
- list($subject, $body) = preg_split('/r|n/', $body, 2);
-
- // 이제 이메일을 설정하고 보냅니다.
- $mail = new Zend_Mail();
-
- // '받는 사람' 줄에 받는 사람 주소와 사용자의 전체 이름을 설정합니다
- $mail->addTo($this->profile->email,
- Trim($this->profile->first_name . ' ' .
- $this->profile-> last_name));
-
- // 구성에서 관리자 'from' 세부정보 가져오기
- $mail->setFrom(Zend_Registry::get('config')->email->from- >email,
- Zend_Registry::get('config')->email->from->name);
-
- // 제목과 본문을 설정하고 메일을 보냅니다
- $mail->setSubject(trim($subject));
- $mail->setBodyText(trim($body));
- $mail->send();
- }
-
- 공개 함수 createAuthIdentity()
- {
- $identity = new stdClass;
- $identity->user_id = $this->getId();
- $identity->username = $this->username;
- $identity->user_type = $this->user_type;
- $identity->first_name = $this->profile->first_name;
- $identity ->last_name = $this->profile->last_name;
- $identity->email = $this->profile->email;
-
- return $identity;
- }
-
- 공개 함수 loginSuccess()
- {
- $this->ts_last_login = time();
- unset($this->profile->new_password);
- unset($this->profile->new_password_ts);
- unset($this->profile->new_password_key);
- $this->save();
-
- $ message = sprintf('%s 사용자 %s의 성공적인 로그인 시도',
- $_SERVER['REMOTE_ADDR'],
- $this->username);
-
- $logger = Zend_Registry:: get('logger');
- $logger->notice($message);
- }
- 정적 공개 함수 LoginFailure($username, $code = '')
- {
- 스위치($code) {
- 케이스 Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
- $reason = '알 수 없는 사용자 이름';
- break;
- case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
- $reason = '이 사용자 이름으로 여러 사용자를 찾았습니다.';
- break;
- case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
- $reason = ' 잘못된 비밀번호';
- break;
- 기본값:
- $reason = '';
- }
-
- $message = sprintf('%s 사용자 %s의 로그인 시도 실패',
- $_SERVER['REMOTE_ADDR'],
- $username);
-
- if (strlen($reason) > 0)
- $message .= sprintf(' (%s)' , $reason);
-
- $logger = Zend_Registry::get('logger');
- $logger->warn($message);
- }
-
- 공개 함수 fetchPassword()
- {
- if (!$this->isSaved())
- return false;
-
- // 새 비밀번호 속성 생성
- $this->_newPassword = Text_Password::create(8);
- $this->profile->new_password = md5($this->_newPassword);
- $this->profile->new_password_ts = time();
- $this->profile->new_password_key = md5(uniqid() .
- $this->getId() .
- $this->_newPassword);
-
- / / 프로필에 새 비밀번호를 저장하고 이메일을 보냅니다
- $this->profile->save();
- $this->sendEmail('user-fetch-password.tpl');
-
- return true;
- }
-
- public function verifyNewPassword($key)
- {
- // 유효한 비밀번호 재설정 데이터가 설정되었는지 확인
- if (!isset($ this->프로필->new_password)
- || !isset($this->profile->new_password_ts)
- || !isset($this->profile->new_password_key)) {
-
- return false;
- }
-
- // 하루 안에 비밀번호가 확인되는지 확인
- if (time() - $this->profile->new_password_ts > 86400)
- return false;
-
- // 키가 올바른지 확인
- if ($this-> profile->new_password_key != $key)
- return false;
-
- // 모든 것이 유효합니다. 이제 새 비밀번호를 사용하도록 계정을 업데이트하세요
-
- // 다음과 같이 로컬 설정자를 우회합니다. new_password는 이미 md5입니다
- parent::__set('password', $this->profile->new_password);
-
- unset($this->profile->new_password);
- unset($this->profile->new_password_ts);
- unset($this->profile->new_password_key);
-
- // 마지막으로 업데이트된 사용자 기록을 저장하고 업데이트된 프로필
- return $this->save();
- }
-
- 공개 함수 usernameExists($username)
- {
- $query = sprintf('select count(*) %s의 숫자로, 여기서 사용자 이름 = ?',
- $this->_table);
-
- $result = $this->_db->fetchOne($query, $username);
-
- $result > 반환 0;
- }
-
- 정적 공개 함수 IsValidUsername($username)
- {
- $validator = new Zend_Validate_Alnum();
- return $validator->isValid($username);
- }
-
- 공개 함수 __set($name, $value)
- {
- 스위치($name) {
- case 'password':
- $value = md5($ value);
- break;
-
- case 'user_type':
- if (!array_key_exists($value, self::$userTypes))
- $value = 'member';
- break;
- }
-
- return parent::__set($name, $value);
- }
- }
- ?>
复代码
|