php和tp5学习笔记

之前看过php的基础教学视频,了解了一下,自己没有上手实践,现在为了项目需要,需要扎实学习一下,所以做一下笔记吧。

1.环境

1.用phpstudy搭建php环境

之前看过一个4小时的基础视频,感觉不错,没基础的可以去了解下;然后就是去phpstudy安装小皮面板,搭建服务器环境;然后安装phpstorm,可以参考这个,包括了资源安装破解汉化。记得修改hosts文件C:\Windows\System32\drivers\etc
搭建成功后:在这里插入图片描述
然后开始学习php进阶知识,这里我看了某博主的学习视频,开始动态网站开发的学习。首先是Hello World。
在这里插入图片描述
这里设置一下本地服务器的文件地址
在这里插入图片描述
在这里插入图片描述
这里之后就搁置了,没有继续学习php,不过接下来打算直接学习thinkphp5框架,至于php的知识可以看看手册了解一下。

2.搭建thinkphp环境

  1. 安装启动phpstudy.
  2. composer官网下载安装,composer类似于python里的pip,是php的安装包管理器,安装地址选择如下:
    在这里插入图片描述
  3. 在目录C:\phpstudy_pro\WWW下打开cmd,下载tp5.1到你的工程tp5.1test下
composer create-project topthink/think=5.1.* tp5.1test
  1. 打开phpstudy(apach和mysql),修改网站地址为你的工程文件夹的public,以后就会直接访问这里面的index文件(入口文件),如下
    在这里插入图片描述

  2. C:\Windows\System32\drivers\etc\hosts里面添加域名,之后就可以用http://mytp5_study.com/访问了。

127.0.0.1     mytp5_study.com
  1. 如果要更新项目版本,直接进入项目根目录,然后直接如下代码:
composer update topthink/framework

2.知识点

2.1 URL

  1. http://serverName/index.php/模块名/控制器名/方法名/参数名/参数值…
  2. 默认public 目录内的 index.php 为入口文件
  3. 在config 目录下的 app.php里面有设置默认模块名,默认控制器名和默认操作名。

2.2 模块

  1. ThinkPHP5.1 默认是多模块架构,也可以设置为单模块操作;
  2. 所有模块的命名空间以 app 这三个字母作为根命名空间(可通过环境变量更改);
  3. 模块下的类库文件命名空间统一为:app\模块名
  4. ThinkPHP5.1 提供了一个类库 Env 来获取环境变量;return Env::get(‘app_path’)
系统路径Env参数名称
应用根目录root_path
应用目录app_path
框架目录think_path
配置目录config_path
扩展目录extend_path
composer 目录vendor_path
运行缓存目录runtime_path
路由目录route_path
当前模块目录modu

2.3 控制器

  1. 类名和文件名大小写保持一致,并采用驼峰式(首字母大写);
  2. 如果创建的是双字母组合,比如 class HelloWorld;URL 访问时必须为:public/hello_world;如果你想原样的方式访问 URL,则需要关闭配置文件中自动转换:'url_convert' => false
  3. 如果想改变根命名空间 app 为其它,可以在根目录下创建.env 文件;然后写上配对的键值对即可,app_namespace=application;
  4. ThinkPHP 直接采用方法内 return 返回的方式直接就输出了;使用 json 输出array,直接采用 json 函数;
  5. 使用 view输出模版,默认输出方式为 html 格式输出,可以更改配置文件里的默认输出类型:'default_return_type' => 'json',
  6. 如果继承了基类控制器,那么可以定义控制器初始化方法:initialize();initialize()方法会在调用控制器方法之前执行,initialize()方法不需要任何返回值,输出用 PHP 方式,return 无效。
  7. 前置操作:继承 Controller 类后可以设置一个$beforeActionList 属性来创建前置方法;
<?php
namespace 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<br/>" ;
    }
    protected function second()
    {
        echo "second<br/>";
    }
    protected function third()
    {
        echo "third<br/>";
    }
    //方法
    public function one()
    {
        return "one";
    }
    public function two()
    {
        return "two";
    }
}
  1. 跳转和重定向:. Controller 类提供了两个跳转的方法,success(msg,url)和 error(msg);
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跳转页面地址
  1. 空方法和空控制器
    当访问了一个不存在的方法时,系统会报错,我们可以使用_empty()来拦截;
public function _empty($name)
{
return '不存在当前方法:'.$name;
}

当访问了一个不存在的控制器时,系统也会报错,我们可以使用 Error 类来拦截(系统默认为 Error 类,如果需要自定义,则在 app.php 配置文件中修改"empty_controller")

class Error
{
public function index(Request $request)
{
return '当前控制器不存在:'.$request->controller();
}
}

2.4 数据库

1.连接:根目录的 config/database.php 设置数据库连接信息,这里的'prefix'=> 'tp_';然后在control里面拿到表tp_user的信息,这里有两种方式访问表:table和name

<?php
namespace 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();
   }

6.比较查询: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);
    }
}

7.区间查询:
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去年

9.聚合查询
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();

11.原生查询
使用 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()进行筛选。

2.5 模型

1.定义: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);

3.删除
对模型类使用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);});

4.修改
使用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();

5.模型获取器
该方法为 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.模型查询范围和输出

2.6 模板

2.7 路由

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小z呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值