之前看过PHP的基础教学视频,了解了一下,自己没有上手实践,现在为了项目需要,需要扎实学习一下,所以做一下笔记吧。 php学习笔记 1.环境1.用phpstudy搭建php环境2.搭建thin
之前看过PHP的基础教学视频,了解了一下,自己没有上手实践,现在为了项目需要,需要扎实学习一下,所以做一下笔记吧。
之前看过一个4小时的基础视频,感觉不错,没基础的可以去了解下;然后就是去phpstudy安装小皮面板,搭建服务器环境;然后安装phpstORM,可以参考这个,包括了资源安装破解汉化。记得修改hosts文件C:\windows\System32\drivers\etc
搭建成功后:
然后开始学习php进阶知识,这里我看了某博主的学习视频,开始动态网站开发的学习。首先是Hello World。
这里设置一下本地服务器的文件地址
这里之后就搁置了,没有继续学习php,不过接下来打算直接学习thinkphp5框架,至于php的知识可以看看手册了解一下。
composer create-project topthink/think=5.1.* tp5.1test
打开phpstudy(apach和Mysql),修改网站地址为你的工程文件夹的public,以后就会直接访问这里面的index文件(入口文件),如下
C:\Windows\System32\drivers\etc\hosts里面添加域名,之后就可以用Http://mytp5_study.com/访问了。
127.0.0.1 mytp5_study.com
composer update topthink/framework
系统路径 | Env参数名称 |
---|---|
应用根目录 | root_path |
应用目录 | app_path |
框架目录 | think_path |
配置目录 | config_path |
扩展目录 | extend_path |
composer 目录 | vendor_path |
运行缓存目录 | runtime_path |
路由目录 | route_path |
当前模块目录 | modu |
public/hello_world
;如果你想原样的方式访问 URL,则需要关闭配置文件中自动转换:'url_convert' => false
。app_namespace=application;
:'default_return_type' => 'json',
<?phpnamespace app\index\controller;use think\Controller;//首先要继承Controller类class Before extends Controller{ protected $beforeActionList=[//设置前置方法属性 'first', 'second' => ['except'=>'one'],//除了调用one以外的方法,都先执行seconde方法 'third'=>['only'=>'one,two']//只有one方法或者two方法,在执行前先执行third方法 ]; //受保护方法 protected function first() { echo "first
" ; } protected function second() { echo "second
"; } protected function third() { echo "third
"; } //方法 public function one() { return "one"; } public function two() { return "two"; }}
public function index(){if ($this->flag) {//如果不指定 url,则返回$_SERVER['HTTP_REFERER']$this->success('成功!', '../');} else {//自动返回前一页$this->error('失败!');}}
成功或错误有一个固定的页面模版:‘thinkphp/tpl/dispatch_jump.tpl’;在 app.php 配置文件中,我们可以更改自己个性化的跳转页面。
变量 | 说明 |
---|---|
$data | 要返回的数据 |
$msg | 页面提示信息 |
$code | 返回的 code |
$wait | 跳转等待时间 单位为秒 |
$url | 跳转页面地址 |
public function _empty($name){return '不存在当前方法:'.$name;}
当访问了一个不存在的控制器时,系统也会报错,我们可以使用 Error 类来拦截(系统默认为 Error 类,如果需要自定义,则在 app.php 配置文件中修改"empty_controller")
class Error{public function index(Request $request){return '当前控制器不存在:'.$request->controller();}}
连接:根目录的 config/database.php
设置数据库连接信息,这里的'prefix'=> 'tp_'
;然后在control里面拿到表tp_user的信息,这里有两种方式访问表:table和name
<?phpnamespace app\Index\controller;use think\Db;class Data{ public function index() { // $data = Db::table('tp_user')->select(); $data = Db::name('user')->select(); return json($data); }}
也可以创建model,然后在control中导入User_model使用:
use app\Index\model\User;,,,$data=User::select();
要调试 sql 是否正确,建议打开 app_trace,可以查看原生 SQL
2. 查询
find():只查询一条数据,没有查询到任何值,则返回 null。
findOrEmpty():查询一条数据,但在没有数据时返回一个空数组。
findOrFail():查询一条数据,在没有数据时抛出一个异常。
select():获取多列数据,查询不到任何数据时返回空数组。
selectOrFail():查询不到任何数据时抛出异常。
Db::getLastSql():得到最近一条 SQL 查询的原生语句。
where():指定数据查询(Db::table(‘tp_user’)->where(‘id’, 27)->find())。
value():查询指定字段的值(单个),没有数据返回 null。
colunm():查询指定列的值(多个),没有数据返回空数组。
order():按指定要求排序。
removeOption():清理掉上一次查询保留的值。
3.增
insert():向数据表添加一条数据, 如果新增成功,insert()方法会返回一个 1 值,如果你添加一个不存在的数据,会抛出一个异常 Exception,如果采用的是 mysql 数据库,支持replace写入,使用 data()方法来设置添加的数据数组(Db::name(‘user’)->data($data)->insert();)。
public function add() { $data=[ 'id'=>2, 'name'=>'李白', 'age'=>55, 'time'=>date('Y-m-d H:i:s') ]; Db::name('user')->insert($data); }
insertGetId():在新增成功后返回当前数据 ID。
insertAll():批量新增数据,但要保持数组结构一致;也支持 data()方法,和单独新增类似;也支持 reaplce 写入,和单独新增类似(Db::name(‘user’)->insertAll($data, true);)。
4.改
update():修改数据,修改成功返回影响行数,没有修改返回 0;或者使用 data()方法传入要修改的数组,如果两边都传入会合并;如果修改数组中包含主键,那么可以直接修改不用查询。
public function update() { $data=[ 'name'=>'苏轼' ]; $out=Db::name('user')->where('id',2)->update($data); return $out; }
inc():对字段增值。
dec():对字段减值。
exp():在字段中使用 mysql 函数。
raw():在列表中修改更新,更加容易方便;
setField():更新一个字段值;
增值 setInc()和减值 setDec(),值如果不指定第二个参数,则步长为 1。
5.删
delete():根据主键直接删除,还可以用列表删除多条,通过where()方法来删除,true 参数删除数据表所有数据(Db::name(‘user’)->delete(true))。
public function delete() { Db::name('user')->where('id',1)->delete(); }
比较查询:where(字段名,表达式,查询条件)(<>、>、<、>=、<=)。
class Search{ public function compare() { $result=Db::name('user')->where('id','<>',3)->select();#查询id不等于3的所有数据 // return Db::getLastSql();#SELECT * FROM `tp_user` WHERE `id` <> 3 return json($result); }}
区间查询:
like 表达式(模糊查询),支持数组传递进行模糊查询;whereLike()和 whereNoLike()。
Db::name('user')->where('email','like',['xiao%','wu%'], 'or')->select();SELECT * FROM `tp_user` WHERE (`email` LIKE 'xiao%' OR `email` LIKE 'wu%')
between 表达式具有两个快捷方式 whereBetween()和 whereNotBetween()。
in 表达式具有两个快捷方式 whereIn()和 whereNotIn()。
null 表达式具有两个快捷方式 whereNull()和 whereNotNull()。
exp 表达式可以自定义字段后的 SQL 语句。
8.时间查询
使用>、<、>=、<=time来筛选匹配时间的数据;
使用 between 关键字来设置时间的区间;
快捷方法 whereTime(),直接使用>、<、>=、<=;
快捷方法between 和 not between
whereBetweenTime(),如果只有一个参数就表示一天
关键字 | 说明 |
---|---|
today 或 d | 今天 |
yesterday | 昨天 |
week 或 w | 本周 |
last week | 上周 |
month 或 m | 本月 |
last month | 上月 |
year 或 y | 今年 |
last year | 去年 |
聚合查询
count():可以求出所查询数据的数量,可设置指定 id,比如有空值(Null)的 uid,不会计算数量。
max():求出所查询数据字段的最大值;求出的值不是数值,则通过第二参数强制转换(Db::name(‘user’)->max(‘price’, false))。
min(), avg(), sum()。
10.子查询
使用 fetchSql()方法,可以设置不执行 SQL,而返回 SQL 语句,默认 true;
Db::name('user')->fetchSql(true)->select();
使用 buidSql()方法,也是返回 SQL 语句,但不需要再执行 select(),且有括号;
Db::name('user')->buildSql(true);
闭包的方式执行子查询
$result = Db::name('one')->where('id', 'in', function ($query) {$query->name('two')->where('gender', '男')>field('uid');})->select();
原生查询
使用 query()方法,进行原生 SQL 查询,适用于读取操作,SQL 错误返回 false。
使用 execute 方法,进行原生 SQL 更新写入等,SQL 错误返回 false。
12.链式查询方法
where()方法:通过键值对来数组键值对匹配的查询方式;通过数组里的数组拼装方式来查询; 字符串形式传递。
field()方法:指定要查询的字段;给指定的字段设置别名;可以直接给字段设置 MySQL 函数; 使用 field()方法中字段排除,可以屏蔽掉想要不显示的字段。
alias()方法:给数据库起一个别名。
limit()方法:限制获取输出数据的个数;传递两个参数,比如从第 3 条开始显示 5 条 limit(2,5);分页模式(第几条开始,一共几条)。
page()分页方法,优化了 limit()方法,无须计算分页条数;Db::name('user')->page(1, 5)->select();
。
order()方法,可以指定排序方式,没有指定第二参数,默认 asc。
group()方法,多字段分组统计。
having,使用 group()分组之后,再使用 having()进行筛选。
定义:class User extends Model
;模型类需要去除表前缀(tp_),采用驼峰式命名;可以开启应用类后缀(class_suffix),设置完毕后,所有的控制器类名和模型类名需要加上 Controller 和 Model。
默认主键为 id,你可以设置其它主键,比如 uid:protected $pk = 'uid';
。
从控制器端调用模型操作,如果和控制器类名重复,可以设置别名;use app\model\User as UserModel
。
模型和控制器一样,也有初始化,在这里必须设置 static 静态方法:protected static function init()
。
模型操作数据和数据库操作一样,只不过不需要指定表:UserModel::select();
。
数据库操作返回的列表是一个二维数组,而模型操作返回的是一个结果集:[[]] 和 [{}]。
2.添加
首先需要实例化模型($user= new UserModel();
),然后再对模型进行数据操作。
可以先设置对象属性值,然后通过save方法保存一条数据,,save()返回布尔值。
$user->id=5; $user->username='特斯拉'; $user->age=44; $user->time=date('Y-m-d H:i:s'); $user->save();
也可以通过 save()传递数据数组的方式,来新增数据, 当新增成功后,使用$user->id,可以获得自增 ID:echo $user->id;
。
$user->save([ 'id' =>7, 'username'=>'爱因斯坦', 'age'=>84, 'time'=>date('Y-m-d H:i:s') ]);
使用 saveAll()方法,可以批量新增数据,返回批量新增的数组。
$dataAll=[ [ 'username'=>'高斯', 'age'=>54, 'time'=>date('Y-m-d H:i:s'), ], [ 'username'=>'开普勒', 'age'=>43, 'time'=>date('Y-m-d H:i:s'), ] ]; $user->saveAll($dataAll);
删除
对模型类使用get()方法,通过主键查询到对象,然后应用delet()方法删除。
$user=UserModel::get(3);$user->delete();
对模型类使用destory()方法,传入主键,删除数据
UserModel::destory([5,7]);
通过数据库类的查询条件删除;
UserModel::where('id', '>', 80)->delete();
使用闭包的方式进行删除;
UserModel::destroy(function ($query) {$query->where('id', '>', 80);});
修改
使用get()方法通过主键获取对象,然后修改对象数据,最后save()
$user = UserModel::get(118);$user->username = '李黑';$user->email = 'lihei@163.com';$user->save();
通过 where()方法结合 find()方法的查询条件获取的数据,进行修改;
$user = UserModel::where('username', '李黑')->find();$user->username = '李白';$user->email = 'libai@163.com';$user->save();
通过 saveAll()方法,可以批量修改数据,返回被修改的数据集合;批量更新 saveAll()只能通过主键 id 进行更新。
使用静态方法结合 update()方法来更新数据。
用 isUpdate()方法显示操作。
//显示更新$user->isUpdate(true)->save();//显示新增$user->isUpdate(false)->save();
模型获取器
该方法为 public,命名规范为:getFieldAttr();获取时return $user->status;
public function getStatusAttr($value){$status = [-1=>'删除', 0=>'禁用', 1=>'正常', 2=>'待审核'];return $status[$value];}
如果你定义了获取器,并且想获取原始值,可以使用 getData()方法;return $user->getData('status');
直接输出无参数的 getData(),可以得到原始值,而$user 输出是改变后的;
dump($user->getData());dump($user);
使用 WithAttr 在控制器端实现动态获取器。
6.模型修改器
模型修改器的命名规则为:setFieldAttr
7.模型搜索器
一个搜索器对应模型的一个特殊方法,该方法为 public; 方法名的命名规范为:searchFieldNameAttr();在控制器端,通过 withSearch()静态方法实现模型搜索器的调用。
8.模型数据集
数据集由all()和 select()方法返回数据集对象; 判断数据集是否为空,我们需要采用 isEmpty()方法; 使用模型方法 hidden()可以隐藏某个字段,使用 visible()显示只某个字段; 使用 append()可以添加某个获取器字段,使用 withAttr()对字段进行函数处理; 使用模型方法 filter()对筛选的数据进行过滤; 使用 diff()和 intersect()方法可以计算两个数据集的差集和交集;
9. 模型自动时间戳
系统全局开启统自动创建和更新时间戳功能在 database.php 中,设置'auto_timestamp' => true;
动时间戳开启后,会自动写入 create_time 和 update_time 两个字段;的默认的类型是 int,如果是时间类型,可以更改如下:
'auto_timestamp' => 'datetime', //或protected $autoWriteTimestamp = 'datetime'
如果只想设置某一个模型开启,需要设置特有字段:protected $autoWriteTimestamp = true;
如果业务中只需要 create_time 而不需要 update_time,可以关闭它;protected $updateTime = false
;也可以动态实现不修改 update_time:$user->isAutoWriteTimestamp(false)->save()
10.模型只读字段
模型中可以设置只读字段,就是无法被修改的字段设置:protected $readonly = ['username', 'email'];
除了在模型端设置,也可以动态设置只读字段:$user->readonly(['username', 'email'])->save()
11. 模型类型转换
系统可以通过模型端设置写入或读取时对字段类型进行转换;数据库查询读取的字段很多都是字符串类型,我们可以转换成如下类型:
integer(整型)、float(浮点型)、boolean(布尔型)、array(数组)、object(对象)、serialize(序列化)、json(json)、timestamp(时间戳)、datetime(日期)
通过var_dump($user->price);获取字段类型
模型中数据完成通过 auto、insert 和 update 三种形式完成;
12.模型查询范围和输出
来源地址:https://blog.csdn.net/weixin_38226321/article/details/129068805
--结束END--
本文标题: php和tp5学习笔记
本文链接: https://www.lsjlt.com/news/383878.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0