찾다

"Web 2.0 Development in Practice"의 저자인 Quentin Zervaas는 책에서 간단한 PHP 데이터 액세스 개체를 언급했습니다.
  1. /**
  2. * DatabaseObject
  3. *
  4. * 데이터베이스 테이블의 데이터를 쉽게 조작하는 데 사용되는 추상 클래스
  5. * 간단한 로드/저장/삭제 방법을 통해
  6. */
  7. 추상 클래스 DatabaseObject
  8. {
  9. const TYPE_TIMESTAMP = 1;
  10. const TYPE_BOOLEAN = 2;
  11. protected static $types = array(self::TYPE_TIMESTAMP, self::TYPE_BOOLEAN);
  12. private $_id = null;
  13. private $_properties = array();
  14. protected $_db = null;
  15. protected $_table = '';
  16. protected $_idField = '';
  17. 공용 함수 __construct(Zend_Db_Adapter_Abstract $db, $ 테이블, $idField)
  18. {
  19. $this->_db = $db;
  20. $this->_table = $table;
  21. $this->_idField = $idField;
  22. }
  23. 공용 함수 로드($id, $field = null)
  24. {
  25. if (strlen($field) == 0)
  26. $field = $this->_idField ;
  27. if ($field == $this->_idField) {
  28. $id = (int) $id;
  29. if ($id return false ;
  30. }
  31. $query = sprintf('%s에서 %s 선택, 여기서 %s = ?',
  32. Join(', ', $this->getSelectFields()),
  33. $this->_table,
  34. $field);
  35. $query = $this->_db->quoteInto($query, $id);
  36. return $this->_load($query);
  37. }
  38. 보호 함수 getSelectFields($prefix = '')
  39. {
  40. $fields = array($prefix . $this->_idField);
  41. foreach ($this->_properties as $k => $v)
  42. $fields[] = $prefix . $k;
  43. return $fields;
  44. }
  45. 보호 함수 _load($query)
  46. {
  47. $result = $this->_db->query ($query);
  48. $row = $result->fetch();
  49. if (!$row)
  50. return false;
  51. $this->_init($row );
  52. $this->postLoad();
  53. return true;
  54. }
  55. 공개 함수 _init($row)
  56. {
  57. foreach ($this->_properties as $k => $v) {
  58. $val = $row[$k];
  59. 스위치($v['type']) {
  60. case self::TYPE_TIMESTAMP:
  61. if (!is_null($val))
  62. $val = strtotime($val);
  63. break;
  64. case self::TYPE_BOOLEAN:
  65. $val = (bool) $val;
  66. break;
  67. }
  68. $this->_properties[$k]['value'] = $val;
  69. }
  70. $this ->_id = (int) $row[$this->_idField];
  71. }
  72. 공개 함수 save($useTransactions = true)
  73. {
  74. $update = $this->isSaved();
  75. if ($useTransactions)
  76. $this->_db->beginTransaction();
  77. if ($update)
  78. $commit = $this->preUpdate();
  79. else
  80. $commit = $this->preInsert();
  81. if (!$commit) {
  82. if ( $useTransactions)
  83. $this->_db->rollback();
  84. return false;
  85. }
  86. $row = array();
  87. foreach( $this->_properties as $k => $v) {
  88. if ($update && !$v['updated'])
  89. 계속;
  90. 스위치 ($v['type']) {
  91. 케이스 자체:: TYPE_TIMESTAMP:
  92. if (!is_null($v['value'])) {
  93. if ($this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql)
  94. $v['value'] = date('Y-m-d H :i:sO', $v['value']);
  95. else
  96. $v['value'] = date('Y-m-d H:i:s', $v['value']);
  97. }
  98. break;
  99. case self::TYPE_BOOLEAN:
  100. $v['value'] = (int) ((bool) $v['value']);
  101. break;
  102. }
  103. $row[$k] = $v['value'];
  104. }
  105. if (count($row) > 0) {
  106. // 삽입/업데이트 수행
  107. if ($update) {
  108. $this->_db->update($this->_table, $row, sprintf('%s = %d ', $this->_idField, $this->getId()));
  109. }
  110. else {
  111. $this->_db->insert($this->_table, $row);
  112. $this->_id = $this->_db->lastInsertId ($this->_table, $this->_idField);
  113. }
  114. }
  115. // 내부 ID 업데이트
  116. if ($commit) {
  117. if ($update)
  118. $commit = $this->postUpdate();
  119. else
  120. $commit = $this->postInsert();
  121. }
  122. if ($useTransactions) {
  123. if ($commit)
  124. $this->_db->commit();
  125. else
  126. $this->_db->rollback();
  127. }
  128. return $commit;
  129. }
  130. 공개 함수 delete($useTransactions = true)
  131. {
  132. if (!$this->isSaved() )
  133. false 반환;
  134. if ($useTransactions)
  135. $this->_db->beginTransaction();
  136. $commit = $this->preDelete( );
  137. if ($commit) {
  138. $this->_db->delete($this->_table, sprintf('%s = %d', $this-> _idField, $this->getId()));
  139. }
  140. else {
  141. if ($useTransactions)
  142. $this->_db->rollback();
  143. return false;
  144. }
  145. $commit = $this->postDelete();
  146. $this->_id = null;
  147. if ($useTransactions) {
  148. if ($commit)
  149. $this->_db->commit();
  150. else
  151. $this->_db->rollback();
  152. }
  153. return $commit;
  154. }
  155. 공개 함수 isSaved()
  156. {
  157. return $this->getId() > 0;
  158. }
  159. 공용 함수 getId()
  160. {
  161. return (int) $this->_id;
  162. }
  163. 공용 함수 getDb()
  164. {
  165. return $this->_db;
  166. }
  167. 공개 함수 __set($name, $value)
  168. {
  169. if (array_key_exists($name, $ this->_properties)) {
  170. $this->_properties[$name]['value'] = $value;
  171. $this->_properties[$name]['updated'] = true ;
  172. true 반환;
  173. }
  174. false 반환;
  175. }
  176. 공개 함수 __get($name)
  177. {
  178. return array_key_exists($name, $this->_properties) ? $this->_properties[$name]['value'] : null;
  179. }
  180. 보호 함수 add($field, $default = null, $type = null)
  181. {
  182. $this->_properties[$field] = array('value' => $default,
  183. 'type' => in_array($type, self::$types) ? $type : null,
  184. 'updated' => false);
  185. }
  186. 보호 함수 preInsert()
  187. {
  188. return true;
  189. }
  190. 보호 함수 postInsert ()
  191. {
  192. true 반환;
  193. }
  194. 보호 함수 preUpdate()
  195. {
  196. true 반환;
  197. }
  198. 보호 함수 postUpdate ()
  199. {
  200. true 반환;
  201. }
  202. 보호 함수 preDelete()
  203. {
  204. true 반환;
  205. }
  206. 보호 함수 postDelete ()
  207. {
  208. true 반환;
  209. }
  210. 보호 함수 postLoad()
  211. {
  212. true 반환;
  213. }
  214. 공개 정적 함수 BuildMultiple($db, $class, $data)
  215. {
  216. $ret = array();
  217. if (!class_exists($class))
  218. throw new Exception('정의되지 않은 클래스 지정됨: ' . $class);
  219. $testObj = new $class($db);
  220. if (!$testObj instanceof DatabaseObject)
  221. throw new Exception('클래스는 DatabaseObject에서 확장되지 않습니다.' );
  222. foreach ($data as $row) {
  223. $obj = new $class($db);
  224. $obj->_init($row);
  225. $ret[$obj->getId()] = $obj;
  226. }
  227. return $ret;
  228. }
  229. }
제조대码
  1. class DatabaseObject_User 확장 DatabaseObject
  2. {
  3. static $userTypes = array('member' => 'Member',
  4. ' 관리자' => '관리자');
  5. 공개 $profile = null;
  6. 공개 $_newPassword = null;
  7. 공개 함수 __construct($db)
  8. {
  9. parent::__construct($db, 'users', 'user_id');
  10. $this->add('username');
  11. $this->add('password') ;
  12. $this->add('user_type', 'member');
  13. $this->add('ts_created', time(), self::TYPE_TIMESTAMP);
  14. $this- >add('ts_last_login', null, self::TYPE_TIMESTAMP);
  15. $this->profile = new Profile_User($db);
  16. }
  17. 보호 함수 preInsert( )
  18. {
  19. $this->_newPassword = Text_Password::create(8);
  20. $this->password = $this->_newPassword;
  21. return true;
  22. }
  23. 보호된 함수 postLoad()
  24. {
  25. $this->profile->setUserId($this->getId());
  26. $this->profile-> ;load();
  27. }
  28. 보호 함수 postInsert()
  29. {
  30. $this->profile->setUserId($this->getId());
  31. $this->profile->save(false);
  32. $this->sendEmail('user-register.tpl');
  33. return true;
  34. }
  35. 보호 함수 postUpdate()
  36. {
  37. $this->profile->save(false);
  38. true 반환;
  39. }
  40. 보호 함수 preDelete()
  41. {
  42. $this->profile->delete();
  43. true를 반환합니다.
  44. }
  45. 공개 함수 sendEmail($tpl)
  46. {
  47. $templater = new Templater();
  48. $templater->user = $this;
  49. // 이메일 본문 가져오기
  50. $body = $templater->render('email /' . $tpl);
  51. // 첫 번째 줄에서 제목 추출
  52. list($subject, $body) = preg_split('/r|n/', $body, 2);
  53. // 이제 이메일을 설정하고 보냅니다.
  54. $mail = new Zend_Mail();
  55. // '받는 사람' 줄에 받는 사람 주소와 사용자의 전체 이름을 설정합니다
  56. $mail->addTo($this->profile->email,
  57. Trim($this->profile->first_name . ' ' .
  58. $this->profile-> last_name));
  59. // 구성에서 관리자 'from' 세부정보 가져오기
  60. $mail->setFrom(Zend_Registry::get('config')->email->from- >email,
  61. Zend_Registry::get('config')->email->from->name);
  62. // 제목과 본문을 설정하고 메일을 보냅니다
  63. $mail->setSubject(trim($subject));
  64. $mail->setBodyText(trim($body));
  65. $mail->send();
  66. }
  67. 공개 함수 createAuthIdentity()
  68. {
  69. $identity = new stdClass;
  70. $identity->user_id = $this->getId();
  71. $identity->username = $this->username;
  72. $identity->user_type = $this->user_type;
  73. $identity->first_name = $this->profile->first_name;
  74. $identity ->last_name = $this->profile->last_name;
  75. $identity->email = $this->profile->email;
  76. return $identity;
  77. }
  78. 공개 함수 loginSuccess()
  79. {
  80. $this->ts_last_login = time();
  81. unset($this->profile->new_password);
  82. unset($this->profile->new_password_ts);
  83. unset($this->profile->new_password_key);
  84. $this->save();
  85. $ message = sprintf('%s 사용자 %s의 성공적인 로그인 시도',
  86. $_SERVER['REMOTE_ADDR'],
  87. $this->username);
  88. $logger = Zend_Registry:: get('logger');
  89. $logger->notice($message);
  90. }
  91. 정적 공개 함수 LoginFailure($username, $code = '')
  92. {
  93. 스위치($code) {
  94. 케이스 Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
  95. $reason = '알 수 없는 사용자 이름';
  96. break;
  97. case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
  98. $reason = '이 사용자 이름으로 여러 사용자를 찾았습니다.';
  99. break;
  100. case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
  101. $reason = ' 잘못된 비밀번호';
  102. break;
  103. 기본값:
  104. $reason = '';
  105. }
  106. $message = sprintf('%s 사용자 %s의 로그인 시도 실패',
  107. $_SERVER['REMOTE_ADDR'],
  108. $username);
  109. if (strlen($reason) > 0)
  110. $message .= sprintf(' (%s)' , $reason);
  111. $logger = Zend_Registry::get('logger');
  112. $logger->warn($message);
  113. }
  114. 공개 함수 fetchPassword()
  115. {
  116. if (!$this->isSaved())
  117. return false;
  118. // 새 비밀번호 속성 생성
  119. $this->_newPassword = Text_Password::create(8);
  120. $this->profile->new_password = md5($this->_newPassword);
  121. $this->profile->new_password_ts = time();
  122. $this->profile->new_password_key = md5(uniqid() .
  123. $this->getId() .
  124. $this->_newPassword);
  125. / / 프로필에 새 비밀번호를 저장하고 이메일을 보냅니다
  126. $this->profile->save();
  127. $this->sendEmail('user-fetch-password.tpl');
  128. return true;
  129. }
  130. public function verifyNewPassword($key)
  131. {
  132. // 유효한 비밀번호 재설정 데이터가 설정되었는지 확인
  133. if (!isset($ this->프로필->new_password)
  134. || !isset($this->profile->new_password_ts)
  135. || !isset($this->profile->new_password_key)) {
  136. return false;
  137. }
  138. // 하루 안에 비밀번호가 확인되는지 확인
  139. if (time() - $this->profile->new_password_ts > 86400)
  140. return false;
  141. // 키가 올바른지 확인
  142. if ($this-> profile->new_password_key != $key)
  143. return false;
  144. // 모든 것이 유효합니다. 이제 새 비밀번호를 사용하도록 계정을 업데이트하세요
  145. // 다음과 같이 로컬 설정자를 우회합니다. new_password는 이미 md5입니다
  146. parent::__set('password', $this->profile->new_password);
  147. unset($this->profile->new_password);
  148. unset($this->profile->new_password_ts);
  149. unset($this->profile->new_password_key);
  150. // 마지막으로 업데이트된 사용자 기록을 저장하고 업데이트된 프로필
  151. return $this->save();
  152. }
  153. 공개 함수 usernameExists($username)
  154. {
  155. $query = sprintf('select count(*) %s의 숫자로, 여기서 사용자 이름 = ?',
  156. $this->_table);
  157. $result = $this->_db->fetchOne($query, $username);
  158. $result > 반환 0;
  159. }
  160. 정적 공개 함수 IsValidUsername($username)
  161. {
  162. $validator = new Zend_Validate_Alnum();
  163. return $validator->isValid($username);
  164. }
  165. 공개 함수 __set($name, $value)
  166. {
  167. 스위치($name) {
  168. case 'password':
  169. $value = md5($ value);
  170. break;
  171. case 'user_type':
  172. if (!array_key_exists($value, self::$userTypes))
  173. $value = 'member';
  174. break;
  175. }
  176. return parent::__set($name, $value);
  177. }
  178. }
  179. ?>
复代码


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 세션이 실패 할 수있는 몇 가지 일반적인 문제는 무엇입니까?PHP 세션이 실패 할 수있는 몇 가지 일반적인 문제는 무엇입니까?Apr 25, 2025 am 12:16 AM

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP의 세션 관련 문제를 어떻게 디버그합니까?PHP의 세션 관련 문제를 어떻게 디버그합니까?Apr 25, 2025 am 12:12 AM

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

session_start ()가 여러 번 호출되면 어떻게됩니까?session_start ()가 여러 번 호출되면 어떻게됩니까?Apr 25, 2025 am 12:06 AM

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

PHP에서 세션 수명을 어떻게 구성합니까?PHP에서 세션 수명을 어떻게 구성합니까?Apr 25, 2025 am 12:05 AM

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구