ThinkPHP学习之CURD操作(一)
写在前面
这周开始学习ThinkPHP,将学习的日记记录下来。不仅仅学习怎么用TP,也要从源码上来学习TP框架。
日记每天都写,但不一定都放到网上。希望自己能够坚持下去。
闲话少说,既然是阅读源码,关于TP的建立,配置等一系列操作就不去说了,官方文档有佷详细的介绍。
要同学想要学习TP的可以点击 ThinkPHP3.2.3快速入门 学习,大家一起进步。
CURD操作
什么是CURD操作?实际上是对数据库增删改查的简称。包括了create、update、read、delete四个基本操作。在TP中对CURD操作的实现是add,save,select,update。
打开Think/Library/Model.class.php,可以在其中找到这四个操作。接下来就开始来查看源码,知道运行的流程,才能够更好的运用这四个操作。
CUED操作之add方法
add方法用于数据添加,是TP对create操作的实现。注意一点的是,TPModel中也有create方法,但并不是CURD操作的一种,而是对即将插入数据库的数据的处理方法。
参数分析
add方法有三个参数(不必须传递),如下
$data 默认值'' 需要进行插入数据库的数据$option 默认值array() 表达式参数 其中存储着 所有进行过的连贯操作$replace 默认值false 是否在插入数据库时进行replace操作
返回值可能是bool(false)或数据库受影响的行数或主键值。从返回值看出该操作是必须位于连贯操作的末尾,可以看成一连套组合技中的终结技。
流程分析
我对add方法的执行流程分成了四步
- 首先,检测数据是否为空
- 其次,进行数据处理与表达式分析
- 以上都通过 进行数据插入 返回插入结果
- 对返回的结果进行分析
步骤一假设进行用户注册操作,插入数据表User,使用add方法进行操作。user字段为:
主键 user_id昵称 user_name密码 password邮箱 email
前台POST数据:
array( 'user_name' => 'xiamsahfw', 'password' => 'adhe99211' , 'confrim' => 'adhe99211' , 'email' => '221131@qq.com', 'hid' => 'register' );
在UserController类中的操作:
$data = I('post.');$User = M('User');$User->create($data);$User->add();
在add操作中,并没有给add传递任何参数,但在$User->create($data)中传递了该值,在该操作中就会自动将数据添加到Model中的$this->data中,而add会自动引用该值。
同时create方法会将自动将传递的参数与数据表的字段进行对比,将不属于表中的字段删除。
步骤二之后,add方法就会调用_facade方法对$data进行数据处理,其实在这里是二次处理$data数据,因为在create方法以及对数据进行过处理。如果在UserController中并没有调用create方法,而是直接传递$data到add方法,那么_facade就会把'confrim' => 'adhe99211' ,'hid' => 'register'删除,变成:
array( 'user_name' => 'xiamsahfw', 'password' => 'adhe99211' , 'email' => '221131@qq.com' );
为了可能的连贯操作,add会调用_parseOptions进行表达式分析。在表达式分析后即使没进行任何连贯操作,在返回的值也存在两个元素:
Array ([table] => user[model] => User)
table表示操作的数据表,model表示操作的模型名。
如果之前存在连贯操作,如where,group by等也会在该项显示。此外,传递连贯操作到add方法,也会和已经存在的操作进行合并。
步骤三以上其实都是数据插入的准备工作,准备工作完成就能够进行数据插入了。当然数据插入不属于Model的功能,在TP中需要调用Think\Driver.class.php中的insert方法。
insert方法接受三个参数
$data$option$replace
前两个参数是处理过的数据以及组合后的连贯操作表达式,第三个参数表示在插入数据库时,是否进行replace操作,默认为false。在这个方法中会将传递的数据与连贯操作表达式进行组合,形成正式的sql语句,并执行sql语句。最后返回执行结果。
步骤四虽然得到了返回结果,add并不是直接将结果返回,而是返回分析后的结论。insert返回的结果,可能有:
失败 => false成功 => 返回受影响的行数
但是实际进行中,我们可能会不仅想要得到一个插入成功的结论,而是想要得到插入后的主键值。在add方法中会对返回结果进行判断,从而返回受影响的行数(多条数据插入)或主键值(一条数据)或false。
题外话:在进行数据插入之前我注意到有这么一行代码。
if(false === $this->_before_insert($data,$options)) { return false;}
这里TP没有做任何注释,寻找之后,发现是一个空方法,解释为 插入数据前的回调方法
// 插入数据前的回调方法protected function _before_insert(&$data,$options) {}
将这个方法打印出来,结果为NULL
var_dump($this->_before_insert($data,$options)); // NULL
百度一下也没找到想要的答案,我对TP的官方文档并没有看完,可能官方会有用法的介绍。这里很纠结,我猜测是在子类继承时,可以实现这个方法进行某些特殊操作(很大可能)。与之相同的还有_after_insert方法。
总结
写了一大串,也不知道写的是不是很清晰,但是我的确是对这个方法熟悉了很多。这个方法虽然可以不传递参数,但如果之前没进行create还是会出错的,虽然内部集成了数据处理,但不是很完善,比如对数据没能进行转义,也不能够对数据字段进行验证,需要我们自己进行调用其它方法等等。知道了add的运行原理,自然能够很好的运用它,同时对自己封装模型类时也有了很大启发。
今天就写到这儿,下一篇准备写CURD中的read,也就是TP中的select。
博主大三狗,正在努力学习中,文中有错漏之处难免,欢迎指正,欢迎批评。

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Alipay PHP ...

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...
