php实战

PHP实战技巧(13)编程中的转义符,以及引发的安全问题

前言

在上文中,我们使用 “\n” 表示换行,也就是说:echo "\n" 将输出一个换行符。那如果我们希望原样输出\n 怎么办呢?

这就是今天要讲的主题:转义

什么是转义

在编程中,有大量的“特殊字符”,不仅仅包含前文说的 制表符,还有很多特殊字符,比如我们想输出一个“"”(双引号),用这样的语法 echo """,只会报错!

我们必须手动告知程序,将某个特殊字符当成普通字符处理,告知的方法就是通过:转义符。

PS:几乎所有的编程语言都需要转义符,而非PHP特有。

转义符

绝大多数情况下,它是一个“反斜杠”:\,将右侧紧邻的字符转义成普通字符,用法如下:

echo "\"";中间的双引号,被当成普通字符输出。

echo "\\n";这个看起来有点怪,连续两个\\是什么意思? 第一个\表示转义符,将第二个\转义成普通字符。

HTML中的转义字符

如果你想在网页上输出一个HTML标签,比如:比如使用转义字符,但并非 \ 而是:。\>

什么时候需要用到它?

任何时候,只要你希望原样输出“特殊字符”就要使用它。

安全问题

很多时候,特殊字符的不当使用会造成程序报错,并进一步引发安全问题。

SQL注入

select * from table where name='张三'上面的是很普通的SQL查询,但如果以 1' or 1='1作为查询条件呢?

SQL语句变成了

select * from table where name='1' or 1='1'整个SQL语义产生变化,如果这是一条敏感的查询,比如管理员登陆,那么就可能造成通用密码。

这就是最古老的SQL注入:1 or 1,SQL注入类攻击手法多样,但是归根究底就是利用了特殊字符。

xss攻击

在数据写入的过程中,将 js 代码一并写入,就可以借此造成xss攻击,xss一样利用了特殊字符,所以我们也可以通过合理的转义来解决此类问题。

常用的转义函数

转载自网上的一张表格,我看写的还算完整就直接借用了。(来自 cnblogs.com)

总结

注意:不要对字符串重复进行转义,可能会造成意想不到的结果。另外,在任何时候,都不应该相信来自用户都输入,这是每个程序员上岗第一天就应该收到的提醒。

展开
收起

PHP实战技巧(12)编程中的常见制表符

前言

今天要说的是3个符号:\r\n\t,它们是编程中最常见的几个制表符。

简介

\r 表示回车

ASCII 码:13

“回车”是一个历史遗留问题,在机械打印机时代表示将打印头定位到左边。虽然,我们键盘上有回车键(enter),但是它和真正的回车其实是有区别的。

\n 表示换行

ASCII 码:10

这才是 enter 键应该干的事情。

\t 是水平制表符

ASCII 码:9

这个是 tab 键,在编程的时候默认缩进就是“\t”,不过现在主流是用4个空格来代替它。

回车和换行有什么区别?

在打字机时代,回车是将打印头定位到左边(你可以理解为复位)换行则是将打印头向下挪一行。

打字机每次换行必须是:回车+换行,才可以。

这和我们有什么关系?

没什么关系,历史遗留问题。

今天还有遗留问题吗?

windows 系统上,enter键,依然是 回车+换行的风格,也就是:\r\n

linux、mac系统上,enter键,则只是换行,也就是 \n(仅限macos 10以后的版本)

这会造成什么后果?

linux 上敲的文本(文档、代码等),在windows 上变成一行。

我试过了,并没有变成一行

因为你使用的是专业编辑器(他们帮我们做了自动转换),要用最传统的,比如:记事本。

对编程有什么影响?

在使用PHP fopen 函数时,就有这样的提示:

PS:极为少见的提醒了两次。

了解这些制表符,对编程有什么帮助?

还是以 PHP为例:

echo "test \n test" 这样可以实现换行(如果你想在HTML中实现换行,要用<br>)

echo 'test \n test' 这样则不行。(看出和上面的区别了吗?)

当你使用 trim() 函数时,它都做了什么?

很多人都知道PHP中有一个过滤首尾空格的函数,但其实除了空格它还做了更多,包括:

" " (ASCII 32 (0x20)),普通空白字符。"\t" (ASCII 9 (0x09)), 制表符."\n" (ASCII 10 (0x0A)),换行符。"\r" (ASCII 13 (0x0D)),回车符。"\0" (ASCII 0 (0x00)), NUL空字节符。"\x0B" (ASCII 11 (0x0B)),垂直制表符。

总结

制表符位于 ASCII 码的0-31位(除了制表符还有其他,统称为控制字符),在编程中处理字符串的时候,应该要小心这些东西。

展开
收起

PHP实战技巧(11)PHP中的静态知识:facade

前言

Facade 也是一种设计模式,中文称为:外观模式,实际意义是:对复杂的接口进行一次包装,使其更容易使用。在实际开发中,能够帮助我们提高代码的简洁性、接口的易用性,以及更简单有效的测试途径。

如何使用它?

目前主流的几个框架:ThinkPHP5.1、Laravel、yii 都有它的影子(其他框架可能也有,未关注)。ThinkPHP5.1起开始提供Facade,但实现的比较简单,用官方的话说:降低上手门槛,让框架易用,是他们一贯的原则。

如果你基于上述几个框架,那么恭喜你,可以跟着框架文档学习使用即可。

Facade 的代码结构

图片为转载,来自CSDN。

又见“中间商”模式

经常看我文章的同学应该能注意到,这又是“中间商”模式。在应用程序和接口中间加了一层,就是:facade。在实际开发的过程中,我们会频繁利用“中间商”来解决问题,比如多层控制器、中间件等等。

中间商类的设计模式,具备普遍的优缺点:

优点,通过中间商来统一、简化代码行为缺点,增加代码的架构复杂度(还会稍稍降低执行效率)Facade 实现原理

接下来是给大家写的演示代码。

代码解析

Facade类

此为外观模式的管理类,负责外观模式的运转。如果你使用框架,这个类都是框架预先写好的。

App

实际想调用的目标类,我只实现了一个非静态方法:get,App::get() 这样的调用会报错。 实际开发中,所有的业务代码都写在这里。

AppFacade

App的外观类,它继承自 Facade,里边有一个方法 getFacadeAccessor(),负责指向到目标类。

使用

我们可以通过 AppFacade::get() 这样的语法,就能执行App类的get()方法,效果是一样的。

重点是:用静态语法调用了非静态方法,这也是 PHP中 Facade 模式的显著特点。

总结

就算你不知道它有什么用,但至少语法简单了,对吧。

展开
收起

PHP实战技巧(9)魔术方法 __get()和__set()

前言

继续说我们的“PHP语法技巧”,这次我们来说说

__get()

__set()

基础概念

get()

读取不可访问属性的值时,

__get($name)

会被调用。

$name 是属性名称

set()

在给不可访问属性赋值时,

__set($name, $value)

会被调用。

$name 是属性名称$value 是赋的值

简单来说

他们俩都是针对“类属性”的,读写一个不存在或者不可见的类属性时,会自动触发对应的魔术方法。

举个例子

实战意义

先看例子

例子解释

以数据查询为例,先实例化一个“模型类”,再调用不存在的类属性,会触发

__get()

动态的从数据库中取值。

常用于MVC结构中的Model层。

总结

上面的实战例子,只演示了 get 方法,set 方法也是同理,任何一个PHP框架在Model层都会有类似的设计。

还是那句话:魔术方法非常有趣,但是如何灵活使用,还要看你脑洞开的大不大。

展开
收起

PHP实战技巧(11)PHP中的静态知识:静态类属性、方法

前言

静态变量用的不多,但是静态的类属性、类方法,则是工作中必不可少的一个知识点。

基础语法

先看代码,下面逐一进行解释。

“::” 是什么?

它是两组冒号,调用静态资源专属语法,基本功能接近 ->。

定义静态方法、属性

在属性、方法前加 static 关键字,就可以将其定义为静态。

调用静态属性

必须通过 类::$属性名 的形式,不能使用 $this->属性名。

调用静态方法

可以通过 类::方法名() 的形式,也可以通过 $this->方法名() 的形式。

关于 $this 伪变量

因为静态调用没有 new 类() 的过程,所以 $this 不存在,调用就报错(参考代码16行)需改为 self::$属性(参考11行)

实战意义

不用 new,用起来省事,这是表面上最容易看到的优点。

除此之外,看一个例子

下面的代码,执行结果是什么?

会报错!因为 $x 是局部变量,离开函数后就销毁了。

看另一个例子

执行后会怎样?(SoDevel 这个类来自第一段代码)

不会报错,可以正常使用。

为什么会这样?

普通局部变量,一旦函数执行完毕就销毁,但是静态变量不会。

静态类属性就更牛了,不光不会销毁,还可以被其他局部环境所调用。(静态变量虽然没有销毁,但是只能在定义它的函数内使用)

这样有什么意义?

意义大了。

在面向对象编程中,我们主要代码都在局部环境(也就是类方法里),而在方法中定义的变量,都是局部变量。就算使用 $this->var 定义成类属性,也只能在类的内部使用。

而 静态类属性 可以无视所有规则,在任何地方都能随时进行赋值、读取操作。

你用过MVC结构的框架吗?

在控制器里定义变量,都需要用 $this->assign() 或者类似的语法,传递给模板。

如果使用静态类属性,就可以免去这个过程,模板拿来即用。

那为什么框架不这样做?

因为某些特定情况不好处理,并且会导致性能下降(静态资源直到程序执行完毕才释放)

总结

昨天少说了一句话,在PHP中 所有全局变量都存储于静态内存区(但他们并不是静态变量)。

所以,你知道全局变量在什么时候销毁吗?

预报:明天给大家讲 单例模式,它是基于静态特性实现的。

展开
收起

ThinkPHP框架实战讲解-视图解读

ThinkPHP框架常用的是MVC模式,M是模型、V是视图,C是控制器。通过MVC模式将数据从数据库中查询出来,然后传递到页面中。下面我们来说一下具体的情况;

程序

一、视图渲染

模板定位规则:当前模块/view/当前控制器名(小写)/当前操作(小写).html。在5.1.6版本后系统会以简洁模式定位模板文件位置,规则如下:当前模块/view/当前控制器(小写)_当前操作(小写).html

1、Fetch方法

fetch方式是渲染模板时最常用的方法,在使用此方法的前提是控制器类需要继承系统控制器基础类。使用方式如下:

(1)、不需要传递任何参数,框架会自动定位到模板文件;

return $this->fetch();

(2)、传递一个参数,框架会定位至当前控制器下的参数一模板文件;

return $this->fetch('edit');

(3)、传递两个参数,框架会定位至参数一控制器下的参数二模板文件;

return $this->fetch('member/read');

注意事项:在书写参数时请不要书写任何后缀,参数只是目录名称或文件名称而已。

(4)、视图根目录下文件

如果想把view文件夹内的单独文件进行渲染,可以在参数位置进行如下书写:

return $this->fetch('/menu');

(5)、特殊模板文件或特殊位置文件

如果项目中存在特殊模板文件,又不想移动位置,可以通过如下方式进行调用:

return $this->fetch('./template/menu.html');

上面书写的目录位置是相对于当前项目入口文件位置(public目录),模板文件后缀无固定要求,可以为html、php、tpl等格式

PHP代码

2、助手函数方式

如果控制器未继承系统基础控制器类,同样可以实现视图模板的输出,框架提供了助手函数view(),可以使用如下命令:

return view();

可传递参数及数据,常见的使用方式如下:

return view('模板文件路径','数据');

3、直接解析模板方式

项目中某些页面可能通过直接解析模板的方式就可以实现功能,那么我们可以通过最简单的方式对模板文件进行输出。使用如下命令:

return $this->display();

此方式会直接渲染内容,同样模板标签在视图中可以正常使用。

HTML模板

二、视图赋值

1、assign方法

在继承系统基础控制器类后可以通过如下命令进行视图赋值:

$this->assign("名","值");

批量赋值方式:

$this->assign(['名'=>'值','名'=>'值']);

2、方法传入参数方式

此方式在进行视图渲染中提及到了,通过设置模板文件位置时携带数据。命令如下:

$this->fetch('path',['名'=>'值','名'=>'值']);$this->display('path',['名'=>'值','名'=>'值']);

3、助手函数赋值方式

这种方式是项目开发过程中最常见的模式,助手函数无需继承基础控制类,相对而言代码更加精简、可读性更高。命令如下:

return view('path',['名'=>'值','名'=>'值']);

4、公共模板变量赋值方式

可以使用视图类的share静态方法进行全局公共模板变量赋值。命令如下:

use think\facade\View;// 赋值全局模板变量View::share('name','value');// 或者批量赋值View::share(['name1'=>'value','name2'=>'value2']);

视频过滤

三、视图过滤

1、局部过滤

在单独方法内进行视图过滤操作。命令如下:

// 使用视图输出过滤return $this->filter(function($content){returnstr_replace("\r\n",'<br/>',$content);})->fetch();

2、全局过滤

如果进行全局过滤方式,需要在初始化方法中进行设置。命令如下:

protected functioninitialize(){$this->view->filter(function($content){returnstr_replace("\r\n",'<br/>',$content); });}

总结:视图过滤方式可以理解过对视图模板中内容进行了替换操作,可以通过此方式减少代码空行,无用的缩进。减少代码体积。

四、模板引擎

框架中内置了模板引擎,默认可以忽略对此进行设置,同时框架支持自定义引擎模式。在配置目录(config目录)下的template.php文件中可进行配置。

默认提供了两种扩展引擎:think-angular、twig(都不是很完美,不建议使用

4、)

五、扩展

如果只想获得解析文件而不进行渲染,如果生成静态HTML文件,采用纯静态化模式。可以使用如下命令:

$html = $this->fetch()->getContent();

此方式返回字符串,可以继承文件创建方式,批量生成HTML静态文件,便于网站优化。

六、总结

1、依据场景,选择不同的渲染方式;

2、合理的进行模板赋值;

3、牢记特殊模板文件位置是基础项目入口文件位置;

4、模板文件配置目录为:config/template.php文件;

展开
收起

ThinkPHP框架实战讲解-模板解读

在开发过程中,我们需要写控制器、模型、验证代码。最后要写模板代码,如果是前后端分离项目则不用写模板了。直接在接口中返回数据就可以了。模板代码包含了很多知识,下面举例介绍一下;

代码

变量输出

1、常见的输出方式是使用大括号({ })的形式,里面写入变量名称。在runtime/temp目录下可以看到编译后的文件,括号解析成了<?php ?>的形式,并且里面包含htmlentities。命令如下(注意$ 和 { 之间不能存在空格):

{$data}

2、原样解析,如果解析富文本内容时使用,使用示例:

{$data|raw}

3、默认值,使用示例:

{$data|default='这是一个默认值'}

4、系统变量输出,主要是获取用户昵称,使用示例:

{$Think.session.name}

5、常量输出,使用示例:

{$Think.PHP_VERSION}

6、配置输出,主要是获取基础网址,使用示例:

{$Think.config.default_module}

PHP

使用函数

1、框架内置规则:

2、应用方式:

2.1、单函数应用,使用示例:

{$data.name|md5}

2.2、多函数应用,使用示例:

{$name|md5|upper|substr=0,3}

互联网开发

运算符

1、常见运算符

2、三元运算符

2.1、默认写法

{$status?'正常':'错误'}

2.2、简单写法,表示有则输出,无则输出默认值

{$name ??'默认值'}

2.3、为真写法,表示为真的时候才输出默认值

{$name?='默认值'}

2.3、真假写法、表示为真输出值,否则输出默认值

{$name ?:'NO'}

2.4、表达式写法,表达式为真则输出值一,否则输出值二

{$a==$b ?'yes':'no'}

程序代码

原样输出

原样输出使用较少,如果想让输出内容不被模板标签所解析,使用如下命令进行输出:

{literal} Hello,{$name}!{/literal}

模板注释

模板注释和代码注释是两种方式,模板注释不会在页面上查看到被注释的代码,而代码注释则可以查看的到。使用方式如下:

{/* 这是模板注释内容*/} 或 {// 这是模板注释内容 }

模板布局

模板布局总结来说就两点:配置和模板;

配置分为模块配置和应用配置,一般情况下后台多应用模板布局方式,在后台模块config/template.php文件内(默认不存在,需手动创建)设置如下代码:

'layout_on'=>true, //开启布局模式'layout_name'=>'layout', //布局文件名称,可设置为 'index/layout'目录形式'layout_item'=>'{__REPLACE__}' //输出替换变量

模板继承

在实际项目开发过程中使用较少,主要是因为继承过于麻烦。

包含文件

在实际项目开发过程中,前端页面使用较多,使用方式较为单一;

1、使用模版文件,多个文件使用逗号分隔;

{include file="public/header,public/menu"/}

2、传入参数,此方式需注意模板中变量值必须存在;

{include file="Public/header" keywords="开源WEB开发框架"/}

开发代码

输出替换

1、配置,在应用或模块配置目录下的template.php文件中进行如下代码配置:

'tpl_replace_string'=>['__STATIC__'=>'/static','__JS__'=>'/static/javascript',]

2、总结,优点:方便更改;但是不建议使用,建议在开发过程中设置好目录位置。

标签库

标签库类似于Java的Struts中的JSP标签库,每一个标签库是一个独立的标签库文件,标签库中的每一个标签完成某个功能,采用XML标签方式(包括开放标签和闭合标签)。具体内容请参考官方文档。

内置标签

1、普通循环标签,使用示例:

{volist name="list" id="vo" key="k"}{$k}.{$vo.name}{/volist}

如果没有指定key属性的话,默认使用循环变量i

2、控制输出行数,如输出其中的第5~15条记录,使用示例:

{volist name="list" id="vo" offset="5" length='10'}{$vo.name}{/volist}

3、比较标签(不常用)

4、SWITCH标签(不常用),使用示例:

{switch User.level} {case 1}value1{/case} {case 2}value2{/case} {default /}default {/switch}

5、资源文件加载(常用),使用实例:

{load href="/static/js/common.js,/static/css/style.css"/}

互联网

标签扩展

此扩展在开发过程中并不常用,使用起来较为麻烦。

展开
收起

ThinkPHP框架实战讲解-路由解读

路由是开发过程中比较重要的一环,在ThinkPHP5.1版本后路由默认开启,并且不可以关闭,足以可见它的重要性。下面我们来具体的说一下;

注意事项

1、默认开启、不可关闭;

2、优先匹配、多模式支持;

3、匹配成功,不再继续匹配;

4、默认支持数字、字母、下划线,不支持中文及特殊符号;

PHP

主要作用

1、URL链接更加规范、美观,更加适合SEO优化;

2、隐式传入额外请求参数;

3、请求方式拦截,区分GET、POST等请求方式;

4、绑定请求数据;

5、处理请求缓存,优化程序响应时间;

6、路由中间件支持(V5.1.6+版本以上支持);

SEO优化

路由定义

1、定义位置:route/route.php文件内,可以在route目录内多文件定义,最终框架会进行路由整合,建议采用域名+分组模式定义路由。

2、定义方式:

Route::get('new/:id','News/read');// 定义GET请求路由规则Route::post('new/:id','News/update');// 定义POST请求路由规则Route::put('new/:id','News/update');// 定义PUT请求路由规则Route::delete('new/:id','News/delete');// 定义DELETE请求路由规则Route::any('new/:id','News/read');// 所有请求都支持的路由规则

请注意:

1、路由匹配成功后,原链接访问方式会失效;

2、完全匹配需在尾部添加$ ;

3、变量可有可无使用[] 包裹变量;

变量规则

系统默认的变量规则设置是\w+,只会匹配字母、数字和下划线字符,并不会匹配特殊符号和中文,需要定义变量规则或者调整默认变量规则。

1、局部配置(仅在当前路由有效)

*定义GET请求路由规则 并设置name变量规则

Route::get('new/:name','News/read')->pattern(['name'=>'\w+']);

2、全局配置(全部路由有效)

*设置name变量规则(采用正则定义)

Route::pattern('name','\w+');

*支持批量添加

Route::pattern(['name'=>'\w+','id'=>'\d+',]);

3、组合变量

*组合变量的优势是路由规则中没有固定的分隔符,可以随意组合需要的变量规则和分割符

Route::get('item-<name>-<id>','product/detail')->pattern(['name'=>'\w+','id'=>'\d+']);

PHP框架

路由地址

闭包支持

实际开发过程中不常用,是一种简单直接的定义模式;

Route::rule('hello/:name',function(Request $request, $name){$method = $request->method();return'['. $method .'] Hello,'. $name;});

路由参数

互联网开发

路由缓存

在定义大量的路由时,强烈建议使用路由缓存,注意仅在部署模式下有效,开启该缓存可以明显提升路由解析性能。

开启方式,在应用配置文件app.php中设置开启:

'route_check_cache'=>true,

开启后,会自动对每次的路由请求的调度进行缓存,第二次如果是相同的请求则无需再次经过路由解析,而是直接进行请求调度。

清除命令:

>php think clear --route

跨域请求

如果某个路由或者分组需要支持跨域请求,可以使用如下代码:

Route::get('new/:id','News/read')->ext('html')->allowCrossDomain();

注解路由

此方式不建议使用,缺点路由分散不方便管理,同时书写规则要求较为严格。

代码

路由分组

强烈建议使用,下面书写一种比较完善的路由分组写法:

Route::group(['method'=>'get','ext'=>'html'],function(){Route::group('blog',function(){Route::rule('blog/:id','blog/read');Route::rule('blog/:name','blog/read');});})->pattern(['id'=>'\d+','name'=>'\w+']);

MISS路由

如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以注册一个单独的MISS路由,总结来说,可以应用于404页面,防止程序找不到路由而报错(一旦设置了MISS路由,相当于开启了强制路由模式);

Route::miss('public/miss');

资源路由

实际开发过程中不常用,不做描述。

快捷路由

此方式要求在控制器层面定义方法名称较为严格,简单做一下描述,不建议使用。

*给User控制器设置快捷路由

Route::controller('user','index/User');<?php namespace app\index\controller;class User{public functiongetInfo(){ }}

代码

路由别名

路由别名不支持变量类型和路由条件判断,单纯只是为了缩短URL地址,并且在定义的时候需要注意避免和路由规则产生混淆。设置操作方法的请求类型:

*user 别名路由到 index/user 控制器

Route::alias('user','index/user',['ext'=>'html','allow'=>'index,save,delete','method'=>['index'=>'GET','save'=>'POST','delete'=>'DELETE'],]);

路由绑定

把当前的URL绑定到模块/控制器/操作,最多支持绑定到操作级别,例如在路由配置文件中添加:

*绑定当前的URL到 index模块

Route::bind('index');

*绑定当前的URL到 index模块的blog控制器

Route::bind('index/blog');

域名路由

支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL、加快匹配的作用。

Route::domain(['blog','admin'],function(){Route::rule('new/:id','index/news/read');});

URL生成

支持路由URL地址的统一生成,并且支持所有的路由方式,但是不建议使用,直接在页面中手动设置,减少模板解析时间。

可以使用助手函数url,不需要继承框架基础控制器类即可使用,示例如下:

url('index/blog/read','id=5&name=thinkphp');

解析后为:/index.php/blog/5/name/thinkphp.html

其他配置方式不做过多讲解。请移步官方文档查看。

展开
收起

PHP实战技巧(15)通过phpinfo()了解你的PHP配置状况(一)

前言

工欲善其事,必先利其器。当你使用PHP编程,就需要对它的运行状况有所了解,否则事倍功半。

从今天起,和大家聊一聊 phpinfo() 函数所展示的信息含义。

phpinfo() 有什么用

它是一个系统函数,你可以直接编写代码 <?php phpinfo();?>,然后通过网页访问它,就能看到一个类似于这样的网页。

该网页包含了当前PHP的各种配置信息、扩展模块的信息等。以前有一种软件叫“探针”,专门用来探测服务器当前的PHP相关信息,现在随着虚拟主机的没落,已经越来越少人用啦。

如何阅读 phpinfo 的信息?

整个网页内容非常多,但主要分为四个部分

基本信息,也就是最顶部的内容。配置信息(Configuration)各种模块的信息PHP Credits,荣誉名单,记录对PHP语言有帮助的人PHP License 版权许可说明

基本配置

本文和大家说说基本信息中,各项内容的含义。(以我当前使用的PHP版本为例)

PHP 版本

最顶端:PHP Version 7.2.3,就是我们当前PHP的版本。

System

Darwin mac.local 17.5.0 Darwin Kernel Version 17.5.0: Fri Apr 13 19:32:32 PDT 2018; root:xnu-4570.51.2~1/RELEASE_X86_64 x86_64

运行此PHP的操作系统信息(我是mac机)

Build Date

Mar 19 2018 11:50:19

编译时间

Configure Command

'./configure' '--prefix=/usr/local/opt/php723' '--exec-prefix=/usr/local/opt/php723/' '--enable-debug' '--enable-fpm' '--with-iconv=/usr/' '--with-config-file-path=/usr/local/etc/php723' '--with-openssl=/usr/local/opt/openssl' '--enable-bcmath' '--with-curl' '--enable-exif' '--with-gd' '--with-mysqli' '--with-pdo-mysql' '--enable-zip' '--with-libzip' '--enable-mysqlnd' '--enable-sockets' '--enable-mbstring' '--enable-soap' '--with-freetype-dir=/usr/local/opt/freetype' '--with-xmlrpc' '--with-jpeg-dir=/usr/local/opt/jpeg' '--with-png-dir=/usr/local/opt/libpng' '--with-libxml-dir=/usr/local/opt/libxml2' '--without-gmp'

编译时,使用的各项配置信息。

Server API

FPM/FastCGI

当前采用的服务模式为 FCGI(快速通用网关接口协议),实现该协议的服务为 FPM(也就是PHP-FPM),与 NGINX 搭配的时候,基本都是通过它来进行通讯的,以后有机会和大家细聊。

Virtual Directory Support

disabled

虚拟目录支持,目前是禁用状态(disabled)也就是不支持。

Configuration File (php.ini) Path

/usr/local/etc/php723

PHP.ini 的所在目录。

Loaded Configuration File

/usr/local/etc/php723/php.ini

php.ini 所在的完整文件路径。

Scan this dir for additional .ini files

(none)

Additional .ini files parsed

(none)

PHP API

20170718

PHP核心版本,一般大版本变更时,此日期会随之变化(应该是核心版本的发布或编译日期)

其他

剩下的就不一一说明了,需要额外提醒的是,此处出现的 zend 是PHP解释器名字,你也可以认为它就是PHP核心,除此之外还有 zend框架、zend代码混淆、zend代码编辑器,注意不要把自己弄混了。

总结

今天先和大家介绍下基本信息,其中像PHP版本、configure的编译配置、php.ini的路径、php api 的版本等几项,是我们日常开发中需要用到的。其余的,大家有兴趣可以自己行了解。

明天开始,介绍第二部分:各种扩展库。

展开
收起

php实战案例制作一个用户登录功能

今天介绍一下网站里面常见的用户登录功能的实现

用户登录

我们先想一想实现思路,先帮常用的代码放在一个include文件,里面放一些链接数据库,常用函数等公用文件。然后常用的用户信息修改。我们看看需要哪些页面

代码文件

公用的头部文件和公用的底部文件单独放在一个页面,方便后期维护。然后就是登陆,注册,逻辑处理。

代码是最基础的实现原理。在原理掌握的基础长就可以进行深化,封装成class文件,简化代码和文件,我们先从最基础的实现原理来看看怎么实现。

登陆的界面

首先是基本的登陆页面。不含css,后期可以把页面美化一下。

然后看看数据提交到了loginCheck.php页面进行哪些逻辑处理

php逻辑代码处理

我们分析代码 显示引用配置文件,我们看看配置文件,也就是最基本的数据库信息,定义一个数组

数据库配置

然后在看看mysql.fun.php通过文件名称我们可以知道这是一个操作数据库的代码,我们把一些常用的数据库操作方在这个里面。然后在去调用。

数据库链接操作

注意@的用途,感兴趣的朋友去删除这个看看效果。

接着分析代码就是接受用户名和密码,执行查找数据库操作,存在这个记录就跳转到main.php页面,不存在就跳转到login.php页面。这样也就类似实现一个后台登陆管理功能的实现。登陆成功进入后台,登陆失败禁止登陆。原理是不是很简单。有兴趣的朋友快去制作一个登陆功能吧。

登陆后台模板

小编收集了一下后台界面模板和登陆界面模板,想加强这方面的也去试试吧。

网站后台管理界面

这样就实现了一个最基本的后台管理功能。

展开
收起