<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>验证码 &#8211; 个人随笔</title>
	<atom:link href="/label/%E9%AA%8C%E8%AF%81%E7%A0%81/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 09 Jun 2018 01:13:36 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>验证码 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>TP 3.2 （四）模型, 统计方法、连表查询、Session 机制、分类、验证码、电商后台</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/3732.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/3732.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 13:05:47 +0000</pubDate>
				<category><![CDATA[TP3.2]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Session 机制]]></category>
		<category><![CDATA[分类]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[电商后台]]></category>
		<category><![CDATA[统计方法]]></category>
		<category><![CDATA[连表查询]]></category>
		<category><![CDATA[验证码]]></category>
		<guid isPermaLink="false">/?p=3732</guid>

					<description><![CDATA[TP中的模型(三) 1.1、AR模式 AR模式ActiveRecords模式的ORM模型，采用了非标准的ORM [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>TP中的模型(三)</h1>
<h2>1.1、AR模式</h2>
<p>
  AR模式ActiveRecords模式的ORM模型，采用了非标准的ORM模型。模型对应数据表，对象对应数据行，属性对应数据字段。AR模式是采用面向对象思想(OOP)。对于此方式新的框架中都是采用的ORM模式
</p>
<h3>1.1.1、演示数据的写入</h3>
<p>
  ①创建测试方法
</p>
<p><img fetchpriority="high" decoding="async" width="1045" height="507" src="/wp-content/uploads/2018/05/word-image-3283.png" class="wp-image-3733" srcset="/wp-content/uploads/2018/05/word-image-3283.png 1045w, /wp-content/uploads/2018/05/word-image-3283-300x146.png 300w, /wp-content/uploads/2018/05/word-image-3283-768x373.png 768w, /wp-content/uploads/2018/05/word-image-3283-1024x497.png 1024w" sizes="(max-width: 1045px) 100vw, 1045px" /></p>
<p>
  ②访问查看写入数据
</p>
<p><img decoding="async" width="513" height="520" src="/wp-content/uploads/2018/05/word-image-3284.png" class="wp-image-3734" srcset="/wp-content/uploads/2018/05/word-image-3284.png 513w, /wp-content/uploads/2018/05/word-image-3284-296x300.png 296w" sizes="(max-width: 513px) 100vw, 513px" /></p>
<h3>1.1.2、演示数据查询</h3>
<p>
  ①创建测试方法
</p>
<p><img decoding="async" width="845" height="367" src="/wp-content/uploads/2018/05/word-image-3285.png" class="wp-image-3735" srcset="/wp-content/uploads/2018/05/word-image-3285.png 845w, /wp-content/uploads/2018/05/word-image-3285-300x130.png 300w, /wp-content/uploads/2018/05/word-image-3285-768x334.png 768w" sizes="(max-width: 845px) 100vw, 845px" /></p>
<p>
  ②查看结果
</p>
<p><img loading="lazy" decoding="async" width="765" height="156" src="/wp-content/uploads/2018/05/word-image-3286.png" class="wp-image-3736" srcset="/wp-content/uploads/2018/05/word-image-3286.png 765w, /wp-content/uploads/2018/05/word-image-3286-300x61.png 300w" sizes="(max-width: 765px) 100vw, 765px" /><br />
<img loading="lazy" decoding="async" width="611" height="170" src="/wp-content/uploads/2018/05/word-image-3287.png" class="wp-image-3737" srcset="/wp-content/uploads/2018/05/word-image-3287.png 611w, /wp-content/uploads/2018/05/word-image-3287-300x83.png 300w" sizes="(max-width: 611px) 100vw, 611px" /></p>
<p>
  ③根据条件进行查询
</p>
<p><img loading="lazy" decoding="async" width="897" height="355" src="/wp-content/uploads/2018/05/word-image-3288.png" class="wp-image-3738" srcset="/wp-content/uploads/2018/05/word-image-3288.png 897w, /wp-content/uploads/2018/05/word-image-3288-300x119.png 300w, /wp-content/uploads/2018/05/word-image-3288-768x304.png 768w" sizes="(max-width: 897px) 100vw, 897px" /><br />
<img loading="lazy" decoding="async" width="775" height="297" src="/wp-content/uploads/2018/05/word-image-3289.png" class="wp-image-3739" srcset="/wp-content/uploads/2018/05/word-image-3289.png 775w, /wp-content/uploads/2018/05/word-image-3289-300x115.png 300w, /wp-content/uploads/2018/05/word-image-3289-768x294.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<h2>1.2、TP中的统计方法</h2>
<p><img loading="lazy" decoding="async" width="700" height="379" src="/wp-content/uploads/2018/05/word-image-3290.png" class="wp-image-3740" srcset="/wp-content/uploads/2018/05/word-image-3290.png 700w, /wp-content/uploads/2018/05/word-image-3290-300x162.png 300w" sizes="(max-width: 700px) 100vw, 700px" /><br />
<img loading="lazy" decoding="async" width="978" height="515" src="/wp-content/uploads/2018/05/word-image-3291.png" class="wp-image-3741" srcset="/wp-content/uploads/2018/05/word-image-3291.png 978w, /wp-content/uploads/2018/05/word-image-3291-300x158.png 300w, /wp-content/uploads/2018/05/word-image-3291-768x404.png 768w" sizes="(max-width: 978px) 100vw, 978px" /><br />
<img loading="lazy" decoding="async" width="826" height="325" src="/wp-content/uploads/2018/05/word-image-3292.png" class="wp-image-3742" srcset="/wp-content/uploads/2018/05/word-image-3292.png 826w, /wp-content/uploads/2018/05/word-image-3292-300x118.png 300w, /wp-content/uploads/2018/05/word-image-3292-768x302.png 768w" sizes="(max-width: 826px) 100vw, 826px" /></p>
<h2>1.3、连表查询</h2>
<p><img loading="lazy" decoding="async" width="799" height="311" src="/wp-content/uploads/2018/05/word-image-3293.png" class="wp-image-3743" srcset="/wp-content/uploads/2018/05/word-image-3293.png 799w, /wp-content/uploads/2018/05/word-image-3293-300x117.png 300w, /wp-content/uploads/2018/05/word-image-3293-768x299.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<h3>1.3.1、inner join使用</h3>
<p>
  ①创建数据表并且写入测试数据
</p>
<p><img loading="lazy" decoding="async" width="528" height="432" src="/wp-content/uploads/2018/05/word-image-3294.png" class="wp-image-3744" srcset="/wp-content/uploads/2018/05/word-image-3294.png 528w, /wp-content/uploads/2018/05/word-image-3294-300x245.png 300w" sizes="(max-width: 528px) 100vw, 528px" /></p>
<p>
  ②连接查询
</p>
<p><img loading="lazy" decoding="async" width="1018" height="468" src="/wp-content/uploads/2018/05/word-image-3295.png" class="wp-image-3745" srcset="/wp-content/uploads/2018/05/word-image-3295.png 1018w, /wp-content/uploads/2018/05/word-image-3295-300x138.png 300w, /wp-content/uploads/2018/05/word-image-3295-768x353.png 768w" sizes="(max-width: 1018px) 100vw, 1018px" /></p>
<p>
  ③查看效果
</p>
<p><img loading="lazy" decoding="async" width="801" height="502" src="/wp-content/uploads/2018/05/word-image-3296.png" class="wp-image-3746" srcset="/wp-content/uploads/2018/05/word-image-3296.png 801w, /wp-content/uploads/2018/05/word-image-3296-300x188.png 300w, /wp-content/uploads/2018/05/word-image-3296-768x481.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<p>
  ④使用field指定字段信息
</p>
<p><img loading="lazy" decoding="async" width="1019" height="431" src="/wp-content/uploads/2018/05/word-image-3297.png" class="wp-image-3747" srcset="/wp-content/uploads/2018/05/word-image-3297.png 1019w, /wp-content/uploads/2018/05/word-image-3297-300x127.png 300w, /wp-content/uploads/2018/05/word-image-3297-768x325.png 768w" sizes="(max-width: 1019px) 100vw, 1019px" /><br />
<img loading="lazy" decoding="async" width="749" height="472" src="/wp-content/uploads/2018/05/word-image-3298.png" class="wp-image-3748" srcset="/wp-content/uploads/2018/05/word-image-3298.png 749w, /wp-content/uploads/2018/05/word-image-3298-300x189.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<h3>1.3.1、left join 使用</h3>
<p><img loading="lazy" decoding="async" width="1037" height="563" src="/wp-content/uploads/2018/05/word-image-3299.png" class="wp-image-3749" srcset="/wp-content/uploads/2018/05/word-image-3299.png 1037w, /wp-content/uploads/2018/05/word-image-3299-300x163.png 300w, /wp-content/uploads/2018/05/word-image-3299-768x417.png 768w, /wp-content/uploads/2018/05/word-image-3299-1024x556.png 1024w" sizes="(max-width: 1037px) 100vw, 1037px" /><br />
<img loading="lazy" decoding="async" width="718" height="413" src="/wp-content/uploads/2018/05/word-image-3300.png" class="wp-image-3750" srcset="/wp-content/uploads/2018/05/word-image-3300.png 718w, /wp-content/uploads/2018/05/word-image-3300-300x173.png 300w" sizes="(max-width: 718px) 100vw, 718px" /></p>
<h2>1.4、原生sql语句</h2>
<p>
  Query：执行查询的sql语句。返回结果集
</p>
<p>
  Execute：执行写入(增加、修改、删除)的SQL语句。返回受影响行数
</p>
<h3>1.4.1、演示query方法使用</h3>
<p><img loading="lazy" decoding="async" width="833" height="386" src="/wp-content/uploads/2018/05/word-image-3301.png" class="wp-image-3751" srcset="/wp-content/uploads/2018/05/word-image-3301.png 833w, /wp-content/uploads/2018/05/word-image-3301-300x139.png 300w, /wp-content/uploads/2018/05/word-image-3301-768x356.png 768w" sizes="(max-width: 833px) 100vw, 833px" /><br />
<img loading="lazy" decoding="async" width="668" height="407" src="/wp-content/uploads/2018/05/word-image-3302.png" class="wp-image-3752" srcset="/wp-content/uploads/2018/05/word-image-3302.png 668w, /wp-content/uploads/2018/05/word-image-3302-300x183.png 300w" sizes="(max-width: 668px) 100vw, 668px" /></p>
<h3>1.4.2、演示execute方法使用</h3>
<p><img loading="lazy" decoding="async" width="979" height="403" src="/wp-content/uploads/2018/05/word-image-3303.png" class="wp-image-3753" srcset="/wp-content/uploads/2018/05/word-image-3303.png 979w, /wp-content/uploads/2018/05/word-image-3303-300x123.png 300w, /wp-content/uploads/2018/05/word-image-3303-768x316.png 768w" sizes="(max-width: 979px) 100vw, 979px" /><br />
<img loading="lazy" decoding="async" width="722" height="404" src="/wp-content/uploads/2018/05/word-image-3304.png" class="wp-image-3754" srcset="/wp-content/uploads/2018/05/word-image-3304.png 722w, /wp-content/uploads/2018/05/word-image-3304-300x168.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></p>
<h2>1.5、TP中的事物</h2>
<p>
  事物是mysql提供的一项功能。只针对innodb引擎的数据表。事物需要开启
</p>
<p>
  事物处理方法：
</p>
<p>
  startTrans：开启事物
</p>
<p>
  Rollback：回滚事物
</p>
<p>
  Commit：提交事物
</p>
<p>
  ①代码
</p>
<p><img loading="lazy" decoding="async" width="971" height="678" src="/wp-content/uploads/2018/05/word-image-3305.png" class="wp-image-3755" srcset="/wp-content/uploads/2018/05/word-image-3305.png 971w, /wp-content/uploads/2018/05/word-image-3305-300x209.png 300w, /wp-content/uploads/2018/05/word-image-3305-768x536.png 768w" sizes="(max-width: 971px) 100vw, 971px" /></p>
<p>
  ②结果
</p>
<p><img loading="lazy" decoding="async" width="1285" height="385" src="/wp-content/uploads/2018/05/word-image-3306.png" class="wp-image-3756" srcset="/wp-content/uploads/2018/05/word-image-3306.png 1285w, /wp-content/uploads/2018/05/word-image-3306-300x90.png 300w, /wp-content/uploads/2018/05/word-image-3306-768x230.png 768w, /wp-content/uploads/2018/05/word-image-3306-1024x307.png 1024w" sizes="(max-width: 1285px) 100vw, 1285px" /></p>
<h1>TP中的cookie与session</h1>
<h2>2.1、cookie与session的区别</h2>
<ol>
<li>
  cookie是存在客户端
</li>
<li>
  Session是存储在服务端
</li>
<li>
  Cookie保存的数据量有限
</li>
<li>
  session安全性更高
</li>
<li>
  session基于cookie之上的
</li>
</ol>
<h2>2.2、session机制</h2>
<p><img loading="lazy" decoding="async" width="1158" height="508" src="/wp-content/uploads/2018/05/word-image-3307.png" class="wp-image-3757" srcset="/wp-content/uploads/2018/05/word-image-3307.png 1158w, /wp-content/uploads/2018/05/word-image-3307-300x132.png 300w, /wp-content/uploads/2018/05/word-image-3307-768x337.png 768w, /wp-content/uploads/2018/05/word-image-3307-1024x449.png 1024w" sizes="(max-width: 1158px) 100vw, 1158px" /></p>
<h2>2.3、TP中session使用</h2>
<p>
  在TP中对于session的所有处理都通过使用session()函数进行处理。
</p>
<p>
  在框架载入时session就已经启动
</p>
<p><img loading="lazy" decoding="async" width="818" height="552" src="/wp-content/uploads/2018/05/word-image-3308.png" class="wp-image-3758" srcset="/wp-content/uploads/2018/05/word-image-3308.png 818w, /wp-content/uploads/2018/05/word-image-3308-300x202.png 300w, /wp-content/uploads/2018/05/word-image-3308-768x518.png 768w" sizes="(max-width: 818px) 100vw, 818px" /><br />
<img loading="lazy" decoding="async" width="840" height="658" src="/wp-content/uploads/2018/05/word-image-3309.png" class="wp-image-3759" srcset="/wp-content/uploads/2018/05/word-image-3309.png 840w, /wp-content/uploads/2018/05/word-image-3309-300x235.png 300w, /wp-content/uploads/2018/05/word-image-3309-768x602.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></p>
<p>
  效果如下
</p>
<p>
  设置session
</p>
<p><img loading="lazy" decoding="async" width="629" height="312" src="/wp-content/uploads/2018/05/word-image-3310.png" class="wp-image-3760" srcset="/wp-content/uploads/2018/05/word-image-3310.png 629w, /wp-content/uploads/2018/05/word-image-3310-300x149.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></p>
<p>
  获取session
</p>
<p><img loading="lazy" decoding="async" width="738" height="294" src="/wp-content/uploads/2018/05/word-image-3311.png" class="wp-image-3761" srcset="/wp-content/uploads/2018/05/word-image-3311.png 738w, /wp-content/uploads/2018/05/word-image-3311-300x120.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></p>
<p>
  删除session
</p>
<p><img loading="lazy" decoding="async" width="595" height="226" src="/wp-content/uploads/2018/05/word-image-3312.png" class="wp-image-3762" srcset="/wp-content/uploads/2018/05/word-image-3312.png 595w, /wp-content/uploads/2018/05/word-image-3312-300x114.png 300w" sizes="(max-width: 595px) 100vw, 595px" /></p>
<p>
  再次查看session
</p>
<p><img loading="lazy" decoding="async" width="684" height="212" src="/wp-content/uploads/2018/05/word-image-3313.png" class="wp-image-3763" srcset="/wp-content/uploads/2018/05/word-image-3313.png 684w, /wp-content/uploads/2018/05/word-image-3313-300x93.png 300w" sizes="(max-width: 684px) 100vw, 684px" /></p>
<h2>2.4、cookie的使用</h2>
<p><img loading="lazy" decoding="async" width="1024" height="590" src="/wp-content/uploads/2018/05/word-image-3314.png" class="wp-image-3764" srcset="/wp-content/uploads/2018/05/word-image-3314.png 1024w, /wp-content/uploads/2018/05/word-image-3314-300x173.png 300w, /wp-content/uploads/2018/05/word-image-3314-768x443.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><br />
<img loading="lazy" decoding="async" width="866" height="625" src="/wp-content/uploads/2018/05/word-image-3315.png" class="wp-image-3765" srcset="/wp-content/uploads/2018/05/word-image-3315.png 866w, /wp-content/uploads/2018/05/word-image-3315-300x217.png 300w, /wp-content/uploads/2018/05/word-image-3315-768x554.png 768w" sizes="(max-width: 866px) 100vw, 866px" /></p>
<p>
  查看现有的cookie内容
</p>
<p><img loading="lazy" decoding="async" width="651" height="186" src="/wp-content/uploads/2018/05/word-image-3316.png" class="wp-image-3766" srcset="/wp-content/uploads/2018/05/word-image-3316.png 651w, /wp-content/uploads/2018/05/word-image-3316-300x86.png 300w" sizes="(max-width: 651px) 100vw, 651px" /></p>
<p>
  设置cookie
</p>
<p><img loading="lazy" decoding="async" width="672" height="140" src="/wp-content/uploads/2018/05/word-image-3317.png" class="wp-image-3767" srcset="/wp-content/uploads/2018/05/word-image-3317.png 672w, /wp-content/uploads/2018/05/word-image-3317-300x63.png 300w" sizes="(max-width: 672px) 100vw, 672px" /></p>
<p>
  再次查看结果
</p>
<p><img loading="lazy" decoding="async" width="723" height="251" src="/wp-content/uploads/2018/05/word-image-3318.png" class="wp-image-3769" srcset="/wp-content/uploads/2018/05/word-image-3318.png 723w, /wp-content/uploads/2018/05/word-image-3318-300x104.png 300w" sizes="(max-width: 723px) 100vw, 723px" /></p>
<p>
  删除cookie
</p>
<p><img loading="lazy" decoding="async" width="651" height="179" src="/wp-content/uploads/2018/05/word-image-3319.png" class="wp-image-3770" srcset="/wp-content/uploads/2018/05/word-image-3319.png 651w, /wp-content/uploads/2018/05/word-image-3319-300x82.png 300w" sizes="(max-width: 651px) 100vw, 651px" /></p>
<p>
  再次查看cookie中的内容
</p>
<p><img loading="lazy" decoding="async" width="727" height="228" src="/wp-content/uploads/2018/05/word-image-3320.png" class="wp-image-3771" srcset="/wp-content/uploads/2018/05/word-image-3320.png 727w, /wp-content/uploads/2018/05/word-image-3320-300x94.png 300w" sizes="(max-width: 727px) 100vw, 727px" /></p>
<h1>验证码</h1>
<p>
  使用验证码一定注意PHP环境当中的gd库的扩展是否开启，并且需要注意到验证码功能是否能够正常使用
</p>
<p>
  TP验证码源码位置：ThinkPHP\Library\Think\Verify.class.php
</p>
<p>
  使用方式：直接实例化类对象调用方法即可
</p>
<h2>3.1、验证码基本使用</h2>
<p><img loading="lazy" decoding="async" width="998" height="396" src="/wp-content/uploads/2018/05/word-image-3321.png" class="wp-image-3772" srcset="/wp-content/uploads/2018/05/word-image-3321.png 998w, /wp-content/uploads/2018/05/word-image-3321-300x119.png 300w, /wp-content/uploads/2018/05/word-image-3321-768x305.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<p>
  效果如下
</p>
<p><img loading="lazy" decoding="async" width="966" height="487" src="/wp-content/uploads/2018/05/word-image-3322.png" class="wp-image-3773" srcset="/wp-content/uploads/2018/05/word-image-3322.png 966w, /wp-content/uploads/2018/05/word-image-3322-300x151.png 300w, /wp-content/uploads/2018/05/word-image-3322-768x387.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<h2>3.2、查看验证码使用方式</h2>
<p>
  ①查看验证码类的属性配置
</p>
<p><img loading="lazy" decoding="async" width="1064" height="678" src="/wp-content/uploads/2018/05/word-image-3323.png" class="wp-image-3774" srcset="/wp-content/uploads/2018/05/word-image-3323.png 1064w, /wp-content/uploads/2018/05/word-image-3323-300x191.png 300w, /wp-content/uploads/2018/05/word-image-3323-768x489.png 768w, /wp-content/uploads/2018/05/word-image-3323-1024x653.png 1024w" sizes="(max-width: 1064px) 100vw, 1064px" /></p>
<p>
  ②查看构造方法的使用
</p>
<p><img loading="lazy" decoding="async" width="1090" height="363" src="/wp-content/uploads/2018/05/word-image-3324.png" class="wp-image-3775" srcset="/wp-content/uploads/2018/05/word-image-3324.png 1090w, /wp-content/uploads/2018/05/word-image-3324-300x100.png 300w, /wp-content/uploads/2018/05/word-image-3324-768x256.png 768w, /wp-content/uploads/2018/05/word-image-3324-1024x341.png 1024w" sizes="(max-width: 1090px) 100vw, 1090px" /></p>
<p>
  ③查看check方法
</p>
<p><img loading="lazy" decoding="async" width="1029" height="666" src="/wp-content/uploads/2018/05/word-image-3325.png" class="wp-image-3776" srcset="/wp-content/uploads/2018/05/word-image-3325.png 1029w, /wp-content/uploads/2018/05/word-image-3325-300x194.png 300w, /wp-content/uploads/2018/05/word-image-3325-768x497.png 768w, /wp-content/uploads/2018/05/word-image-3325-1024x663.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /></p>
<p>
  ④查看生产验证码的方法
</p>
<p><img loading="lazy" decoding="async" width="1112" height="658" src="/wp-content/uploads/2018/05/word-image-3326.png" class="wp-image-3777" srcset="/wp-content/uploads/2018/05/word-image-3326.png 1112w, /wp-content/uploads/2018/05/word-image-3326-300x178.png 300w, /wp-content/uploads/2018/05/word-image-3326-768x454.png 768w, /wp-content/uploads/2018/05/word-image-3326-1024x606.png 1024w" sizes="(max-width: 1112px) 100vw, 1112px" /></p>
<h2>3.3、生产验证码并且校验</h2>
<p><img loading="lazy" decoding="async" width="1037" height="691" src="/wp-content/uploads/2018/05/word-image-3327.png" class="wp-image-3778" srcset="/wp-content/uploads/2018/05/word-image-3327.png 1037w, /wp-content/uploads/2018/05/word-image-3327-300x200.png 300w, /wp-content/uploads/2018/05/word-image-3327-768x512.png 768w, /wp-content/uploads/2018/05/word-image-3327-1024x682.png 1024w" sizes="(max-width: 1037px) 100vw, 1037px" /></p>
<p>
  效果如下
</p>
<p>
  生产验证码
</p>
<p><img loading="lazy" decoding="async" width="950" height="408" src="/wp-content/uploads/2018/05/word-image-3328.png" class="wp-image-3779" srcset="/wp-content/uploads/2018/05/word-image-3328.png 950w, /wp-content/uploads/2018/05/word-image-3328-300x129.png 300w, /wp-content/uploads/2018/05/word-image-3328-768x330.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>
  比对验证码
</p>
<p><img loading="lazy" decoding="async" width="904" height="150" src="/wp-content/uploads/2018/05/word-image-3329.png" class="wp-image-3780" srcset="/wp-content/uploads/2018/05/word-image-3329.png 904w, /wp-content/uploads/2018/05/word-image-3329-300x50.png 300w, /wp-content/uploads/2018/05/word-image-3329-768x127.png 768w" sizes="(max-width: 904px) 100vw, 904px" /></p>
<h1>数据分页</h1>
<h2>4.1、分页实现方式</h2>
<ol>
<li>
  计算总的记录数
</li>
<li>
  设置每一页多少条数据
</li>
<li>
  获取当前的页码
</li>
<li>
  根据当前的页码获取对应的数据本质就是处理limit
</li>
<li>
  计算出分页的导航信息
</li>
</ol>
<h2>4.2、查看分页类的使用方式</h2>
<p>
  关于分页类的源码地址：ThinkPHP\Library\Think\page.class.php
</p>
<p>
  ①查看配置信息
</p>
<p><img loading="lazy" decoding="async" width="1058" height="664" src="/wp-content/uploads/2018/05/word-image-3330.png" class="wp-image-3781" srcset="/wp-content/uploads/2018/05/word-image-3330.png 1058w, /wp-content/uploads/2018/05/word-image-3330-300x188.png 300w, /wp-content/uploads/2018/05/word-image-3330-768x482.png 768w, /wp-content/uploads/2018/05/word-image-3330-1024x643.png 1024w" sizes="(max-width: 1058px) 100vw, 1058px" /></p>
<p>
  ②构造方法
</p>
<p><img loading="lazy" decoding="async" width="1166" height="678" src="/wp-content/uploads/2018/05/word-image-3331.png" class="wp-image-3782" srcset="/wp-content/uploads/2018/05/word-image-3331.png 1166w, /wp-content/uploads/2018/05/word-image-3331-300x174.png 300w, /wp-content/uploads/2018/05/word-image-3331-768x447.png 768w, /wp-content/uploads/2018/05/word-image-3331-1024x595.png 1024w" sizes="(max-width: 1166px) 100vw, 1166px" /></p>
<p>
  ③查看show方法
</p>
<p><img loading="lazy" decoding="async" width="1029" height="640" src="/wp-content/uploads/2018/05/word-image-3332.png" class="wp-image-3783" srcset="/wp-content/uploads/2018/05/word-image-3332.png 1029w, /wp-content/uploads/2018/05/word-image-3332-300x187.png 300w, /wp-content/uploads/2018/05/word-image-3332-768x478.png 768w, /wp-content/uploads/2018/05/word-image-3332-1024x637.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /></p>
<h2>4.3、使用分类</h2>
<p>
  ①创建方法
</p>
<p><img loading="lazy" decoding="async" width="1054" height="690" src="/wp-content/uploads/2018/05/word-image-3333.png" class="wp-image-3784" srcset="/wp-content/uploads/2018/05/word-image-3333.png 1054w, /wp-content/uploads/2018/05/word-image-3333-300x196.png 300w, /wp-content/uploads/2018/05/word-image-3333-768x503.png 768w, /wp-content/uploads/2018/05/word-image-3333-1024x670.png 1024w" sizes="(max-width: 1054px) 100vw, 1054px" /></p>
<p>
  ②处理模板
</p>
<p><img loading="lazy" decoding="async" width="1025" height="656" src="/wp-content/uploads/2018/05/word-image-3334.png" class="wp-image-3785" srcset="/wp-content/uploads/2018/05/word-image-3334.png 1025w, /wp-content/uploads/2018/05/word-image-3334-300x192.png 300w, /wp-content/uploads/2018/05/word-image-3334-768x492.png 768w, /wp-content/uploads/2018/05/word-image-3334-1024x655.png 1024w" sizes="(max-width: 1025px) 100vw, 1025px" /></p>
<p>
  ③效果如下
</p>
<p><img loading="lazy" decoding="async" width="685" height="246" src="/wp-content/uploads/2018/05/word-image-3335.png" class="wp-image-3786" srcset="/wp-content/uploads/2018/05/word-image-3335.png 685w, /wp-content/uploads/2018/05/word-image-3335-300x108.png 300w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<h1>5、案例-电商后台登录</h1>
<h2>5.1、分析实现过程</h2>
<ol>
<li>
  创建控制器方法显示登录界面
</li>
<li>
  需要显示出验证码
</li>
<li>
  用户提交数据、接受并且比对(1、比对验证码2、比对用户名3、比对密码)
</li>
<li>
  登录完成，保存用户的登录状态(session或者cookie)。需要跳转到后台首页
</li>
<li>
  防止直接翻墙
</li>
</ol>
<h2>5.2、显示登录到的界面</h2>
<h3>5.1.1、显示登录页</h3>
<p>
  ①创建控制器方法加载模板
</p>
<p><img loading="lazy" decoding="async" width="898" height="629" src="/wp-content/uploads/2018/05/word-image-3336.png" class="wp-image-3787" srcset="/wp-content/uploads/2018/05/word-image-3336.png 898w, /wp-content/uploads/2018/05/word-image-3336-300x210.png 300w, /wp-content/uploads/2018/05/word-image-3336-768x538.png 768w" sizes="(max-width: 898px) 100vw, 898px" /></p>
<p>
  ②拷贝登录模板
</p>
<p><img loading="lazy" decoding="async" width="1284" height="484" src="/wp-content/uploads/2018/05/word-image-3337.png" class="wp-image-3788" srcset="/wp-content/uploads/2018/05/word-image-3337.png 1284w, /wp-content/uploads/2018/05/word-image-3337-300x113.png 300w, /wp-content/uploads/2018/05/word-image-3337-768x289.png 768w, /wp-content/uploads/2018/05/word-image-3337-1024x386.png 1024w" sizes="(max-width: 1284px) 100vw, 1284px" /></p>
<p>
  ③修改登录模板的资源地址
</p>
<p><img loading="lazy" decoding="async" width="1050" height="687" src="/wp-content/uploads/2018/05/word-image-3338.png" class="wp-image-3789" srcset="/wp-content/uploads/2018/05/word-image-3338.png 1050w, /wp-content/uploads/2018/05/word-image-3338-300x196.png 300w, /wp-content/uploads/2018/05/word-image-3338-768x502.png 768w, /wp-content/uploads/2018/05/word-image-3338-1024x670.png 1024w" sizes="(max-width: 1050px) 100vw, 1050px" /></p>
<h3>5.1.2、显示验证码</h3>
<p>
  ①修改模板使用验证码
</p>
<p><img loading="lazy" decoding="async" width="1094" height="616" src="/wp-content/uploads/2018/05/word-image-3339.png" class="wp-image-3790" srcset="/wp-content/uploads/2018/05/word-image-3339.png 1094w, /wp-content/uploads/2018/05/word-image-3339-300x169.png 300w, /wp-content/uploads/2018/05/word-image-3339-768x432.png 768w, /wp-content/uploads/2018/05/word-image-3339-1024x577.png 1024w" sizes="(max-width: 1094px) 100vw, 1094px" /></p>
<p>
  ②创建方法生成验证码
</p>
<p><img loading="lazy" decoding="async" width="849" height="442" src="/wp-content/uploads/2018/05/word-image-3340.png" class="wp-image-3791" srcset="/wp-content/uploads/2018/05/word-image-3340.png 849w, /wp-content/uploads/2018/05/word-image-3340-300x156.png 300w, /wp-content/uploads/2018/05/word-image-3340-768x400.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>
  ③修改模板引入jQuery
</p>
<p><img loading="lazy" decoding="async" width="938" height="513" src="/wp-content/uploads/2018/05/word-image-3341.png" class="wp-image-3792" srcset="/wp-content/uploads/2018/05/word-image-3341.png 938w, /wp-content/uploads/2018/05/word-image-3341-300x164.png 300w, /wp-content/uploads/2018/05/word-image-3341-768x420.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<p>
  ④对验证码绑定点击事件
</p>
<p><img loading="lazy" decoding="async" width="1071" height="573" src="/wp-content/uploads/2018/05/word-image-3342.png" class="wp-image-3793" srcset="/wp-content/uploads/2018/05/word-image-3342.png 1071w, /wp-content/uploads/2018/05/word-image-3342-300x161.png 300w, /wp-content/uploads/2018/05/word-image-3342-768x411.png 768w, /wp-content/uploads/2018/05/word-image-3342-1024x548.png 1024w" sizes="(max-width: 1071px) 100vw, 1071px" /></p>
<h2>5.3、实现登录对比</h2>
<h3>5.3.1、创建数据表</h3>
<p><img loading="lazy" decoding="async" width="638" height="275" src="/wp-content/uploads/2018/05/word-image-3343.png" class="wp-image-3794" srcset="/wp-content/uploads/2018/05/word-image-3343.png 638w, /wp-content/uploads/2018/05/word-image-3343-300x129.png 300w" sizes="(max-width: 638px) 100vw, 638px" /></p>
<h3>5.3.2、添加测试账户</h3>
<p>
  ①创建生成密码的函数
</p>
<p>
  由于增加测试用户时不能确定密码。需要用代码生成密码。由于后期会经常使用该方式进行密码校验等处理。因此封装成为函数
</p>
<p><img loading="lazy" decoding="async" width="1009" height="555" src="/wp-content/uploads/2018/05/word-image-3344.png" class="wp-image-3795" srcset="/wp-content/uploads/2018/05/word-image-3344.png 1009w, /wp-content/uploads/2018/05/word-image-3344-300x165.png 300w, /wp-content/uploads/2018/05/word-image-3344-768x422.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /></p>
<p>
  ③创建一个测试方法生成密码
</p>
<p><img loading="lazy" decoding="async" width="905" height="487" src="/wp-content/uploads/2018/05/word-image-3345.png" class="wp-image-3796" srcset="/wp-content/uploads/2018/05/word-image-3345.png 905w, /wp-content/uploads/2018/05/word-image-3345-300x161.png 300w, /wp-content/uploads/2018/05/word-image-3345-768x413.png 768w" sizes="(max-width: 905px) 100vw, 905px" /></p>
<p>
  ④访问测试方法生成密码
</p>
<p><img loading="lazy" decoding="async" width="542" height="108" src="/wp-content/uploads/2018/05/word-image-3346.png" class="wp-image-3797" srcset="/wp-content/uploads/2018/05/word-image-3346.png 542w, /wp-content/uploads/2018/05/word-image-3346-300x60.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<p>
  ⑤根据生产的密码写入测试账户
</p>
<p><img loading="lazy" decoding="async" width="1116" height="394" src="/wp-content/uploads/2018/05/word-image-3347.png" class="wp-image-3798" srcset="/wp-content/uploads/2018/05/word-image-3347.png 1116w, /wp-content/uploads/2018/05/word-image-3347-300x106.png 300w, /wp-content/uploads/2018/05/word-image-3347-768x271.png 768w, /wp-content/uploads/2018/05/word-image-3347-1024x362.png 1024w" sizes="(max-width: 1116px) 100vw, 1116px" /></p>
<h3>5.3.3、创建模型</h3>
<p>
  ①创建自定义的模型
</p>
<p><img loading="lazy" decoding="async" width="803" height="548" src="/wp-content/uploads/2018/05/word-image-3348.png" class="wp-image-3799" srcset="/wp-content/uploads/2018/05/word-image-3348.png 803w, /wp-content/uploads/2018/05/word-image-3348-300x205.png 300w, /wp-content/uploads/2018/05/word-image-3348-768x524.png 768w, /wp-content/uploads/2018/05/word-image-3348-220x150.png 220w" sizes="(max-width: 803px) 100vw, 803px" /></p>
<p>
  ②定义字段信息
</p>
<p><img loading="lazy" decoding="async" width="1046" height="585" src="/wp-content/uploads/2018/05/word-image-3349.png" class="wp-image-3800" srcset="/wp-content/uploads/2018/05/word-image-3349.png 1046w, /wp-content/uploads/2018/05/word-image-3349-300x168.png 300w, /wp-content/uploads/2018/05/word-image-3349-768x430.png 768w, /wp-content/uploads/2018/05/word-image-3349-1024x573.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<p>
  ③定义字段映射
</p>
<p><img loading="lazy" decoding="async" width="1028" height="665" src="/wp-content/uploads/2018/05/word-image-3350.png" class="wp-image-3801" srcset="/wp-content/uploads/2018/05/word-image-3350.png 1028w, /wp-content/uploads/2018/05/word-image-3350-300x194.png 300w, /wp-content/uploads/2018/05/word-image-3350-768x497.png 768w, /wp-content/uploads/2018/05/word-image-3350-1024x662.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" /></p>
<p>
  ④修改模板使用假名
</p>
<p><img loading="lazy" decoding="async" width="1060" height="595" src="/wp-content/uploads/2018/05/word-image-3351.png" class="wp-image-3802" srcset="/wp-content/uploads/2018/05/word-image-3351.png 1060w, /wp-content/uploads/2018/05/word-image-3351-300x168.png 300w, /wp-content/uploads/2018/05/word-image-3351-768x431.png 768w, /wp-content/uploads/2018/05/word-image-3351-1024x575.png 1024w" sizes="(max-width: 1060px) 100vw, 1060px" /></p>
<p>
  ⑤编写自动验证规则
</p>
<p><img loading="lazy" decoding="async" width="1007" height="645" src="/wp-content/uploads/2018/05/word-image-3352.png" class="wp-image-3803" srcset="/wp-content/uploads/2018/05/word-image-3352.png 1007w, /wp-content/uploads/2018/05/word-image-3352-300x192.png 300w, /wp-content/uploads/2018/05/word-image-3352-768x492.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<h3>5.3.4、控制器调用方法进行对比</h3>
<p>
  ①修改控制器login方法
</p>
<p><img loading="lazy" decoding="async" width="1070" height="699" src="/wp-content/uploads/2018/05/word-image-3353.png" class="wp-image-3804" srcset="/wp-content/uploads/2018/05/word-image-3353.png 1070w, /wp-content/uploads/2018/05/word-image-3353-300x196.png 300w, /wp-content/uploads/2018/05/word-image-3353-768x502.png 768w, /wp-content/uploads/2018/05/word-image-3353-1024x669.png 1024w" sizes="(max-width: 1070px) 100vw, 1070px" /></p>
<p>
  ②创建模型方法实现登录
</p>
<p><img loading="lazy" decoding="async" width="1087" height="701" src="/wp-content/uploads/2018/05/word-image-3354.png" class="wp-image-3805" srcset="/wp-content/uploads/2018/05/word-image-3354.png 1087w, /wp-content/uploads/2018/05/word-image-3354-300x193.png 300w, /wp-content/uploads/2018/05/word-image-3354-768x495.png 768w, /wp-content/uploads/2018/05/word-image-3354-1024x660.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="1076" height="589" src="/wp-content/uploads/2018/05/word-image-3355.png" class="wp-image-3806" srcset="/wp-content/uploads/2018/05/word-image-3355.png 1076w, /wp-content/uploads/2018/05/word-image-3355-300x164.png 300w, /wp-content/uploads/2018/05/word-image-3355-768x420.png 768w, /wp-content/uploads/2018/05/word-image-3355-1024x561.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" /></p>
<h3>5.3.5、控制翻墙</h3>
<p>
  ①在后台首页中的index方法进行判断
</p>
<p><img loading="lazy" decoding="async" width="975" height="574" src="/wp-content/uploads/2018/05/word-image-3356.png" class="wp-image-3807" srcset="/wp-content/uploads/2018/05/word-image-3356.png 975w, /wp-content/uploads/2018/05/word-image-3356-300x177.png 300w, /wp-content/uploads/2018/05/word-image-3356-768x452.png 768w" sizes="(max-width: 975px) 100vw, 975px" /></p>
<p>
  对于此方式，由于后台中除了登录之外。其他的都需要进行是否登录判断。此方式不合理。可以在创建一个公共控制器在构造方法中进行验证。对于除了登录控制器之外其他的控制器都继承公共控制器
</p>
<p>
  ②创建公共控制器
</p>
<p><img loading="lazy" decoding="async" width="1043" height="703" src="/wp-content/uploads/2018/05/word-image-3357.png" class="wp-image-3808" srcset="/wp-content/uploads/2018/05/word-image-3357.png 1043w, /wp-content/uploads/2018/05/word-image-3357-300x202.png 300w, /wp-content/uploads/2018/05/word-image-3357-768x518.png 768w, /wp-content/uploads/2018/05/word-image-3357-1024x690.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<p>
  ③修改Index控制器的继承关系
</p>
<p><img loading="lazy" decoding="async" width="898" height="474" src="/wp-content/uploads/2018/05/word-image-3358.png" class="wp-image-3809" srcset="/wp-content/uploads/2018/05/word-image-3358.png 898w, /wp-content/uploads/2018/05/word-image-3358-300x158.png 300w, /wp-content/uploads/2018/05/word-image-3358-768x405.png 768w" sizes="(max-width: 898px) 100vw, 898px" /></p>
<p>
  可能common控制器中有很多公共方法，对于登录有可能会使用到。需要修改login继承common控制器。但是直接继承会出现故障
</p>
<p>
  ④修改Login控制器的继承关系
</p>
<p><img loading="lazy" decoding="async" width="896" height="497" src="/wp-content/uploads/2018/05/word-image-3359.png" class="wp-image-3810" srcset="/wp-content/uploads/2018/05/word-image-3359.png 896w, /wp-content/uploads/2018/05/word-image-3359-300x166.png 300w, /wp-content/uploads/2018/05/word-image-3359-768x426.png 768w" sizes="(max-width: 896px) 100vw, 896px" /></p>
<p>
  ⑤修改公共\\
</p>
<p><img loading="lazy" decoding="async" width="981" height="695" src="/wp-content/uploads/2018/05/word-image-3360.png" class="wp-image-3811" srcset="/wp-content/uploads/2018/05/word-image-3360.png 981w, /wp-content/uploads/2018/05/word-image-3360-300x213.png 300w, /wp-content/uploads/2018/05/word-image-3360-768x544.png 768w" sizes="(max-width: 981px) 100vw, 981px" /></p>
<h2>5.4、实现退出登录</h2>
<p>
  ①修改模板连接地址
</p>
<p><img loading="lazy" decoding="async" width="1064" height="400" src="/wp-content/uploads/2018/05/word-image-3361.png" class="wp-image-3812" srcset="/wp-content/uploads/2018/05/word-image-3361.png 1064w, /wp-content/uploads/2018/05/word-image-3361-300x113.png 300w, /wp-content/uploads/2018/05/word-image-3361-768x289.png 768w, /wp-content/uploads/2018/05/word-image-3361-1024x385.png 1024w" sizes="(max-width: 1064px) 100vw, 1064px" /></p>
<p>
  ②创建退出的方法
</p>
<p><img loading="lazy" decoding="async" width="970" height="424" src="/wp-content/uploads/2018/05/word-image-3362.png" class="wp-image-3813" srcset="/wp-content/uploads/2018/05/word-image-3362.png 970w, /wp-content/uploads/2018/05/word-image-3362-300x131.png 300w, /wp-content/uploads/2018/05/word-image-3362-768x336.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/3732.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>博客项目（二）显示登录信息、权限、Cookie存储信息、验证码、Session防翻墙</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2862.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2862.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 06:15:30 +0000</pubDate>
				<category><![CDATA[后台框架]]></category>
		<category><![CDATA[源码Blog项目]]></category>
		<category><![CDATA[Cookie存储信息]]></category>
		<category><![CDATA[Session防翻墙]]></category>
		<category><![CDATA[显示登录信息]]></category>
		<category><![CDATA[权限]]></category>
		<category><![CDATA[验证码]]></category>
		<guid isPermaLink="false">/?p=2862</guid>

					<description><![CDATA[博客项目（二） 显示登录的信息 登录成功后，在管理员页面显示登录的信息。 用户的登录信息保存在会话中，从会话中 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>博客项目（二）</h1>
<h2>显示登录的信息</h2>
<p>
  登录成功后，在管理员页面显示登录的信息。
</p>
<p>
  用户的登录信息保存在会话中，从会话中取出对应的值就可以了。
</p>
<p><img loading="lazy" decoding="async" width="1029" height="137" src="/wp-content/uploads/2018/05/word-image-2516.png" class="wp-image-2863" srcset="/wp-content/uploads/2018/05/word-image-2516.png 1029w, /wp-content/uploads/2018/05/word-image-2516-300x40.png 300w, /wp-content/uploads/2018/05/word-image-2516-768x102.png 768w, /wp-content/uploads/2018/05/word-image-2516-1024x136.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /><br />
<img loading="lazy" decoding="async" width="1032" height="159" src="/wp-content/uploads/2018/05/word-image-2517.png" class="wp-image-2864" srcset="/wp-content/uploads/2018/05/word-image-2517.png 1032w, /wp-content/uploads/2018/05/word-image-2517-300x46.png 300w, /wp-content/uploads/2018/05/word-image-2517-768x118.png 768w, /wp-content/uploads/2018/05/word-image-2517-1024x158.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="1359" height="356" src="/wp-content/uploads/2018/05/word-image-2518.png" class="wp-image-2865" srcset="/wp-content/uploads/2018/05/word-image-2518.png 1359w, /wp-content/uploads/2018/05/word-image-2518-300x79.png 300w, /wp-content/uploads/2018/05/word-image-2518-768x201.png 768w, /wp-content/uploads/2018/05/word-image-2518-1024x268.png 1024w" sizes="(max-width: 1359px) 100vw, 1359px" /></p>
<h2>退出和安全退出</h2>
<p>
  退出：退出不销毁会话
</p>
<p>
  安全退出：退出并销毁会话
</p>
<ol>
<li>
  在LoginController控制器中，添加安全退出的方法
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1171" height="252" src="/wp-content/uploads/2018/05/word-image-2519.png" class="wp-image-2866" srcset="/wp-content/uploads/2018/05/word-image-2519.png 1171w, /wp-content/uploads/2018/05/word-image-2519-300x65.png 300w, /wp-content/uploads/2018/05/word-image-2519-768x165.png 768w, /wp-content/uploads/2018/05/word-image-2519-1024x220.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /></p>
<ol>
<li>
  点击top.html页面中安全退出，跳转到logout()方法上
</li>
</ol>
<p><img loading="lazy" decoding="async" width="815" height="93" src="/wp-content/uploads/2018/05/word-image-2520.png" class="wp-image-2867" srcset="/wp-content/uploads/2018/05/word-image-2520.png 815w, /wp-content/uploads/2018/05/word-image-2520-300x34.png 300w, /wp-content/uploads/2018/05/word-image-2520-768x88.png 768w" sizes="(max-width: 815px) 100vw, 815px" /></p>
<h2>不同级别的用户显示不同的导航</h2>
<p><img loading="lazy" decoding="async" width="797" height="318" src="/wp-content/uploads/2018/05/word-image-2521.png" class="wp-image-2868" srcset="/wp-content/uploads/2018/05/word-image-2521.png 797w, /wp-content/uploads/2018/05/word-image-2521-300x120.png 300w, /wp-content/uploads/2018/05/word-image-2521-768x306.png 768w" sizes="(max-width: 797px) 100vw, 797px" /></p>
<p>
  测试：
</p>
<ol>
<li>
  用管理员身份登录
</li>
</ol>
<p><img loading="lazy" decoding="async" width="602" height="257" src="/wp-content/uploads/2018/05/word-image-2522.png" class="wp-image-2869" srcset="/wp-content/uploads/2018/05/word-image-2522.png 602w, /wp-content/uploads/2018/05/word-image-2522-300x128.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></p>
<ol>
<li>
  用普通身份登录
</li>
</ol>
<p><img loading="lazy" decoding="async" width="747" height="283" src="/wp-content/uploads/2018/05/word-image-2523.png" class="wp-image-2870" srcset="/wp-content/uploads/2018/05/word-image-2523.png 747w, /wp-content/uploads/2018/05/word-image-2523-300x114.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></p>
<h2>记住密码</h2>
<p>
  登录成功后，将用户信息保存到客户端，后面登录的时候就不需要再输入用户信息。
</p>
<p><img loading="lazy" decoding="async" width="642" height="310" src="/wp-content/uploads/2018/05/word-image-2524.png" class="wp-image-2871" srcset="/wp-content/uploads/2018/05/word-image-2524.png 642w, /wp-content/uploads/2018/05/word-image-2524-300x145.png 300w" sizes="(max-width: 642px) 100vw, 642px" /></p>
<h3>代码实现</h3>
<ol>
<li>
  在配置文件中添加秘钥
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1015" height="273" src="/wp-content/uploads/2018/05/word-image-2525.png" class="wp-image-2872" srcset="/wp-content/uploads/2018/05/word-image-2525.png 1015w, /wp-content/uploads/2018/05/word-image-2525-300x81.png 300w, /wp-content/uploads/2018/05/word-image-2525-768x207.png 768w" sizes="(max-width: 1015px) 100vw, 1015px" /></p>
<ol>
<li>
  在UserModel模型中，将用户信息记录在cookie中
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1104" height="288" src="/wp-content/uploads/2018/05/word-image-2526.png" class="wp-image-2873" srcset="/wp-content/uploads/2018/05/word-image-2526.png 1104w, /wp-content/uploads/2018/05/word-image-2526-300x78.png 300w, /wp-content/uploads/2018/05/word-image-2526-768x200.png 768w, /wp-content/uploads/2018/05/word-image-2526-1024x267.png 1024w" sizes="(max-width: 1104px) 100vw, 1104px" /></p>
<p>
  脚下留心：不能直接将用户名和密码记录在cookie中，不安全（可以直接在浏览器中查看）。
</p>
<ol>
<li>
  在UserModel模型中，通过cookie的值获取用户的信息
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1332" height="426" src="/wp-content/uploads/2018/05/word-image-2527.png" class="wp-image-2874" srcset="/wp-content/uploads/2018/05/word-image-2527.png 1332w, /wp-content/uploads/2018/05/word-image-2527-300x96.png 300w, /wp-content/uploads/2018/05/word-image-2527-768x246.png 768w, /wp-content/uploads/2018/05/word-image-2527-1024x327.png 1024w" sizes="(max-width: 1332px) 100vw, 1332px" /></p>
<ol>
<li>
  登录成功后，如果选择了记录密码就将信息保存到cookie中
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1165" height="314" src="/wp-content/uploads/2018/05/word-image-2528.png" class="wp-image-2875" srcset="/wp-content/uploads/2018/05/word-image-2528.png 1165w, /wp-content/uploads/2018/05/word-image-2528-300x81.png 300w, /wp-content/uploads/2018/05/word-image-2528-768x207.png 768w, /wp-content/uploads/2018/05/word-image-2528-1024x276.png 1024w" sizes="(max-width: 1165px) 100vw, 1165px" /></p>
<ol>
<li>
  请求登录页面并且不是从其他页面跳转过来，就试图通过cookie获取用户
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1277" height="378" src="/wp-content/uploads/2018/05/word-image-2529.png" class="wp-image-2876" srcset="/wp-content/uploads/2018/05/word-image-2529.png 1277w, /wp-content/uploads/2018/05/word-image-2529-300x89.png 300w, /wp-content/uploads/2018/05/word-image-2529-768x227.png 768w, /wp-content/uploads/2018/05/word-image-2529-1024x303.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<h2>验证码</h2>
<p><img loading="lazy" decoding="async" width="814" height="180" src="/wp-content/uploads/2018/05/word-image-2530.png" class="wp-image-2877" srcset="/wp-content/uploads/2018/05/word-image-2530.png 814w, /wp-content/uploads/2018/05/word-image-2530-300x66.png 300w, /wp-content/uploads/2018/05/word-image-2530-768x170.png 768w" sizes="(max-width: 814px) 100vw, 814px" /></p>
<h3>思路</h3>
<p>
  第一步：生成随机字符串
</p>
<p>
  第二步：将字符串写到图片资源上
</p>
<p>
  第三步：显示图片
</p>
<h3>代码实现</h3>
<ol>
<li>
  在Lib文件夹下创建Captcha.class.php页面
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  namespace Lib;
</p>
<p>
  class Captcha{
</p>
<p>
      private $len;   //验证码位数
</p>
<p>
      private $font;  //内置字体 1,2,3,4,5
</p>
<p>
      public function __construct($len=4,$font=5) {
</p>
<p>
          $this-&gt;len=$len;
</p>
<p>
          $this-&gt;font=$font;
</p>
<p>
      }
</p>
<p>
      //生成随机字符串
</p>
<p>
      private function createRandomString(){
</p>
<p>
         $char_array=  array_merge(range(&#8216;a&#8217;, &#8216;z&#8217;),  range(&#8216;A&#8217;, &#8216;Z&#8217;),  range(0, 9));
</p>
<p>
         $index=array_rand($char_array,  $this-&gt;len); //随机取出字符串，返回下标数组
</p>
<p>
         shuffle($index); //打乱数组
</p>
<p>
         $str=&#8221;;
</p>
<p>
         foreach($index as $i){
</p>
<p>
             $str.=$char_array[$i];
</p>
<p>
         }
</p>
<p>
         $_SESSION[&#8216;verify&#8217;]=$str;
</p>
<p>
         return $str;
</p>
<p>
      }
</p>
<p>
      //创建验证码
</p>
<p>
      public function createVerify(){
</p>
<p>
          $str=  $this-&gt;createRandomString();
</p>
<p>
          $image=  imagecreate(80, 30);
</p>
<p>
          imagecolorallocate($image, 255, 255, 255);
</p>
<p>
          $color=  imagecolorallocate($image, 255, 0, 0);
</p>
<p>
          $x=(imagesx($image)-imagefontwidth($this-&gt;font)*$this-&gt;len)/2;
</p>
<p>
          $y=(imagesy($image)-imagefontheight($this-&gt;font))/2;
</p>
<p>
          imagestring($image, $this-&gt;font, $x, $y, $str, $color);
</p>
<p>
          header(&#8216;Content-Type:image/png&#8217;);
</p>
<p>
          imagepng($image);
</p>
<p>
          imagedestroy($image);
</p>
<p>
      }
</p>
<p>
      //检查验证码是否正确
</p>
<p>
      public function checkVerify($code){
</p>
<p>
          return strtoupper($code)==strtoupper($_SESSION[&#8216;verify&#8217;]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<ol>
<li>
  调用生成验证码类
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1030" height="260" src="/wp-content/uploads/2018/05/word-image-2531.png" class="wp-image-2878" srcset="/wp-content/uploads/2018/05/word-image-2531.png 1030w, /wp-content/uploads/2018/05/word-image-2531-300x76.png 300w, /wp-content/uploads/2018/05/word-image-2531-768x194.png 768w, /wp-content/uploads/2018/05/word-image-2531-1024x258.png 1024w" sizes="(max-width: 1030px) 100vw, 1030px" /></p>
<ol>
<li>
  在login.html页面中显示验证码
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1114" height="95" src="/wp-content/uploads/2018/05/word-image-2532.png" class="wp-image-2879" srcset="/wp-content/uploads/2018/05/word-image-2532.png 1114w, /wp-content/uploads/2018/05/word-image-2532-300x26.png 300w, /wp-content/uploads/2018/05/word-image-2532-768x65.png 768w, /wp-content/uploads/2018/05/word-image-2532-1024x87.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /></p>
<ol>
<li>
  验证输入的验证码
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1270" height="306" src="/wp-content/uploads/2018/05/word-image-2533.png" class="wp-image-2880" srcset="/wp-content/uploads/2018/05/word-image-2533.png 1270w, /wp-content/uploads/2018/05/word-image-2533-300x72.png 300w, /wp-content/uploads/2018/05/word-image-2533-768x185.png 768w, /wp-content/uploads/2018/05/word-image-2533-1024x247.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /></p>
<h2>session入库</h2>
<p>
  将会话保存到数据库中
</p>
<h3>创建会话表</h3>
<p>
  drop table if exists `session`;
</p>
<p>
  create table `session`(
</p>
<p>
         sess_id varchar(50) primary key comment &#8216;会话id&#8217;,
</p>
<p>
         sess_value varchar(2000) comment &#8216;会话的值&#8217;,
</p>
<p>
         sess_time int not null comment &#8216;会话产生的时间&#8217;
</p>
<p>
  )engine=memory charset=utf8 comment &#8216;会话表&#8217;;
</p>
<p>
  表结构
</p>
<p><img loading="lazy" decoding="async" width="769" height="82" src="/wp-content/uploads/2018/05/word-image-2534.png" class="wp-image-2881" srcset="/wp-content/uploads/2018/05/word-image-2534.png 769w, /wp-content/uploads/2018/05/word-image-2534-300x32.png 300w, /wp-content/uploads/2018/05/word-image-2534-768x82.png 768w" sizes="(max-width: 769px) 100vw, 769px" /></p>
<h3>代码实现</h3>
<p>
  1、在Lib文件下创建Session.class.php页面
</p>
<p>
  &lt;?php
</p>
<p>
  /*
</p>
<p>
   * session入库
</p>
<p>
   */
</p>
<p>
  namespace Lib;
</p>
<p>
  class Session{
</p>
<p>
      private $mypdo;
</p>
<p>
      public function __construct() {
</p>
<p>
          //设置会话存储方式
</p>
<p>
          session_set_save_handler(
</p>
<p>
              array($this,&#8217;open&#8217;),
</p>
<p>
              array($this,&#8217;close&#8217;),
</p>
<p>
              array($this,&#8217;read&#8217;),
</p>
<p>
              array($this,&#8217;write&#8217;),
</p>
<p>
              array($this,&#8217;destroy&#8217;),
</p>
<p>
              array($this,&#8217;gc&#8217;)
</p>
<p>
          );
</p>
<p>
          session_start();    //开启会话
</p>
<p>
      }
</p>
<p>
      public function open(){
</p>
<p>
          $this-&gt;mypdo=  \Core\MyPDO::getInstance($GLOBALS[&#8216;config&#8217;][&#8216;database&#8217;]);
</p>
<p>
      }
</p>
<p>
      public function close(){
</p>
<p>
          return true;
</p>
<p>
      }
</p>
<p>
      public function read($sess_id){
</p>
<p>
          $sql=&#8221;select sess_value from `session` where sess_id=&#8217;$sess_id'&#8221;;
</p>
<p>
          return $this-&gt;mypdo-&gt;fetchColumn($sql);
</p>
<p>
      }
</p>
<p>
      public function write($sess_id,$sess_value){
</p>
<p>
          $time=  time();
</p>
<p>
          $sql=&#8221;insert into `session` values (&#8216;$sess_id&#8217;,&#8217;$sess_value&#8217;,$time) on duplicate key update sess_value=&#8217;$sess_value'&#8221;;
</p>
<p>
          return $this-&gt;mypdo-&gt;exec($sql);
</p>
<p>
      }
</p>
<p>
      public function destroy($sess_id){
</p>
<p>
          $sql=&#8221;delete from `session` where sess_id=&#8217;$sess_id'&#8221;;
</p>
<p>
          return $this-&gt;mypdo-&gt;exec($sql);
</p>
<p>
      }
</p>
<p>
      public function gc($maxlifetime){
</p>
<p>
          $expires=time()-$maxlifetime;   //过期时间的临界点
</p>
<p>
          $sql=&#8221;delete from `session` where sess_time&lt;$expires&#8221;;
</p>
<p>
          return $this-&gt;mypdo-&gt;exec($sql);
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  2、在Controller控制器中实例化session入库类
</p>
<p><img loading="lazy" decoding="async" width="875" height="376" src="/wp-content/uploads/2018/05/word-image-2535.png" class="wp-image-2882" srcset="/wp-content/uploads/2018/05/word-image-2535.png 875w, /wp-content/uploads/2018/05/word-image-2535-300x129.png 300w, /wp-content/uploads/2018/05/word-image-2535-768x330.png 768w" sizes="(max-width: 875px) 100vw, 875px" /></p>
<p>
  查看数据库中的会话
</p>
<p><img loading="lazy" decoding="async" width="882" height="72" src="/wp-content/uploads/2018/05/word-image-2536.png" class="wp-image-2883" srcset="/wp-content/uploads/2018/05/word-image-2536.png 882w, /wp-content/uploads/2018/05/word-image-2536-300x24.png 300w, /wp-content/uploads/2018/05/word-image-2536-768x63.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<ol>
<li>
  能够完成后台登录的验证码功能
</li>
<li>
  能够完成添加文章分类的增删改功能
</li>
<li>
  能够以递归方式树状显示文章分类列表
</li>
<li>
  能够完成文章的增删改和显示功能
</li>
<li>
  能够完成文章列表的翻页功能
</li>
<li>
  能够实现博客前台首页显示功能
</li>
<li>
  能够实现博客前台文章列表功能
</li>
<li>
  能够实现博客前台显示文章详情功能
</li>
<li>
  能够实现博客文章的踩赞功能
</li>
<li>
  能够实现博客文章的上一篇下一篇功能
</li>
<li>
  能够实现博客文章的评论功能
</li>
<li>
  能够实现博客文章的搜索功能
</li>
<li>
  能够实现博客文章的标签功能
</li>
<li>
  能够理解博客项目的主要功能
</li>
<li>
  能够根据功能要求画出有关数据表的ER图
</li>
<li>
  能够针对项目要求设计适当的数据表
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2862.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP 核心编程（五）GD 库、 图片颜色填充、 水印、 缩略图、 验证码</title>
		<link>/php/php%e6%a0%b8%e5%bf%83%e7%bc%96%e7%a8%8b/1363.html</link>
					<comments>/php/php%e6%a0%b8%e5%bf%83%e7%bc%96%e7%a8%8b/1363.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 18 May 2018 09:35:08 +0000</pubDate>
				<category><![CDATA[PHP核心编程]]></category>
		<category><![CDATA[GD 库]]></category>
		<category><![CDATA[图片颜色填充]]></category>
		<category><![CDATA[水印]]></category>
		<category><![CDATA[缩略图]]></category>
		<category><![CDATA[验证码]]></category>
		<guid isPermaLink="false">/?p=1363</guid>

					<description><![CDATA[GD图像处理 GD库简介 GD库是专门做图像处理的。比如验证码，缩略图，图片水印等效果 PHP操作GD库的原理 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>GD图像处理</h1>
<h2>GD库简介</h2>
<p>GD库是专门做图像处理的。比如验证码，缩略图，图片水印等效果</p>
<p><img loading="lazy" decoding="async" width="616" height="91" class="wp-image-1365" src="/wp-content/uploads/2018/05/word-image-1205.png" srcset="/wp-content/uploads/2018/05/word-image-1205.png 616w, /wp-content/uploads/2018/05/word-image-1205-300x44.png 300w" sizes="(max-width: 616px) 100vw, 616px" /><br />
<img loading="lazy" decoding="async" width="873" height="263" class="wp-image-1366" src="/wp-content/uploads/2018/05/word-image-1206.png" srcset="/wp-content/uploads/2018/05/word-image-1206.png 873w, /wp-content/uploads/2018/05/word-image-1206-300x90.png 300w, /wp-content/uploads/2018/05/word-image-1206-768x231.png 768w" sizes="(max-width: 873px) 100vw, 873px" /><br />
<img loading="lazy" decoding="async" width="574" height="203" class="wp-image-1367" src="/wp-content/uploads/2018/05/word-image-1207.png" srcset="/wp-content/uploads/2018/05/word-image-1207.png 574w, /wp-content/uploads/2018/05/word-image-1207-300x106.png 300w" sizes="(max-width: 574px) 100vw, 574px" /></p>
<h2>PHP操作GD库的原理</h2>
<p>第一步：创建图片资源</p>
<p>第二步：对图片进行操作</p>
<p>第三步：输出图片资源</p>
<p>第四步：销毁图片资源</p>
<h2>引入GD库</h2>
<p>默认情况下，PHP不支持对图片的处理，必须引入GD扩展才能实现对图片的操作</p>
<p><img loading="lazy" decoding="async" width="629" height="61" class="wp-image-1368" src="/wp-content/uploads/2018/05/word-image-1208.png" srcset="/wp-content/uploads/2018/05/word-image-1208.png 629w, /wp-content/uploads/2018/05/word-image-1208-300x29.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></p>
<p>开启GD库后，以image开头的函数都可以使用了。</p>
<p><img loading="lazy" decoding="async" width="344" height="385" class="wp-image-1369" src="/wp-content/uploads/2018/05/word-image-1209.png" srcset="/wp-content/uploads/2018/05/word-image-1209.png 344w, /wp-content/uploads/2018/05/word-image-1209-268x300.png 268w" sizes="(max-width: 344px) 100vw, 344px" /></p>
<h2>创建图片</h2>
<h3>知识点</h3>
<ol>
<li>imagecreate()：创建图片资源</li>
<li>imagecolorallocate()：给图片资源分配一个颜色</li>
<li>imagejpeg()：图片按jpeg格式显示或保存</li>
<li>imagegif()：图片按gif格式显示或保存</li>
<li>imagepng()：图片按png格式显示或保存</li>
<li>imagedestroy()：销毁图片</li>
</ol>
<h3>代码</h3>
<p><img loading="lazy" decoding="async" width="1101" height="161" class="wp-image-1370" src="/wp-content/uploads/2018/05/word-image-1210.png" srcset="/wp-content/uploads/2018/05/word-image-1210.png 1101w, /wp-content/uploads/2018/05/word-image-1210-300x44.png 300w, /wp-content/uploads/2018/05/word-image-1210-768x112.png 768w, /wp-content/uploads/2018/05/word-image-1210-1024x150.png 1024w" sizes="(max-width: 1101px) 100vw, 1101px" /></p>
<p>脚下留心：如果图片保存就不需要写header().</p>
<h3>imagecolorallocate()</h3>
<p>给图片分配颜色，默认第一个分配的颜色是背景色，返回的是颜色的编号</p>
<p><img loading="lazy" decoding="async" width="998" height="143" class="wp-image-1371" src="/wp-content/uploads/2018/05/word-image-1211.png" srcset="/wp-content/uploads/2018/05/word-image-1211.png 998w, /wp-content/uploads/2018/05/word-image-1211-300x43.png 300w, /wp-content/uploads/2018/05/word-image-1211-768x110.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<p>返回的是颜色的索引编号</p>
<p><img loading="lazy" decoding="async" width="820" height="107" class="wp-image-1372" src="/wp-content/uploads/2018/05/word-image-1212.png" srcset="/wp-content/uploads/2018/05/word-image-1212.png 820w, /wp-content/uploads/2018/05/word-image-1212-300x39.png 300w, /wp-content/uploads/2018/05/word-image-1212-768x100.png 768w" sizes="(max-width: 820px) 100vw, 820px" /></p>
<h2>画图</h2>
<h3>直线</h3>
<p><img loading="lazy" decoding="async" width="636" height="109" class="wp-image-1373" src="/wp-content/uploads/2018/05/word-image-1213.png" srcset="/wp-content/uploads/2018/05/word-image-1213.png 636w, /wp-content/uploads/2018/05/word-image-1213-300x51.png 300w" sizes="(max-width: 636px) 100vw, 636px" /></p>
<p>例题</p>
<p><img loading="lazy" decoding="async" width="1068" height="138" class="wp-image-1374" src="/wp-content/uploads/2018/05/word-image-1214.png" srcset="/wp-content/uploads/2018/05/word-image-1214.png 1068w, /wp-content/uploads/2018/05/word-image-1214-300x39.png 300w, /wp-content/uploads/2018/05/word-image-1214-768x99.png 768w, /wp-content/uploads/2018/05/word-image-1214-1024x132.png 1024w" sizes="(max-width: 1068px) 100vw, 1068px" /></p>
<h3>矩形</h3>
<p><img loading="lazy" decoding="async" width="840" height="109" class="wp-image-1375" src="/wp-content/uploads/2018/05/word-image-1215.png" srcset="/wp-content/uploads/2018/05/word-image-1215.png 840w, /wp-content/uploads/2018/05/word-image-1215-300x39.png 300w, /wp-content/uploads/2018/05/word-image-1215-768x100.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></p>
<p>代码</p>
<p><img loading="lazy" decoding="async" width="856" height="208" class="wp-image-1376" src="/wp-content/uploads/2018/05/word-image-1216.png" srcset="/wp-content/uploads/2018/05/word-image-1216.png 856w, /wp-content/uploads/2018/05/word-image-1216-300x73.png 300w, /wp-content/uploads/2018/05/word-image-1216-768x187.png 768w" sizes="(max-width: 856px) 100vw, 856px" /></p>
<h3>圆弧</h3>
<p><img loading="lazy" decoding="async" width="913" height="138" class="wp-image-1377" src="/wp-content/uploads/2018/05/word-image-1217.png" srcset="/wp-content/uploads/2018/05/word-image-1217.png 913w, /wp-content/uploads/2018/05/word-image-1217-300x45.png 300w, /wp-content/uploads/2018/05/word-image-1217-768x116.png 768w" sizes="(max-width: 913px) 100vw, 913px" /></p>
<p>例题1</p>
<p><img loading="lazy" decoding="async" width="1068" height="137" class="wp-image-1378" src="/wp-content/uploads/2018/05/word-image-1218.png" srcset="/wp-content/uploads/2018/05/word-image-1218.png 1068w, /wp-content/uploads/2018/05/word-image-1218-300x38.png 300w, /wp-content/uploads/2018/05/word-image-1218-768x99.png 768w, /wp-content/uploads/2018/05/word-image-1218-1024x131.png 1024w" sizes="(max-width: 1068px) 100vw, 1068px" /></p>
<p>例题2</p>
<p><img loading="lazy" decoding="async" width="882" height="149" class="wp-image-1379" src="/wp-content/uploads/2018/05/word-image-1219.png" srcset="/wp-content/uploads/2018/05/word-image-1219.png 882w, /wp-content/uploads/2018/05/word-image-1219-300x51.png 300w, /wp-content/uploads/2018/05/word-image-1219-768x130.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<p>例题3</p>
<p><img loading="lazy" decoding="async" width="879" height="174" class="wp-image-1380" src="/wp-content/uploads/2018/05/word-image-1220.png" srcset="/wp-content/uploads/2018/05/word-image-1220.png 879w, /wp-content/uploads/2018/05/word-image-1220-300x59.png 300w, /wp-content/uploads/2018/05/word-image-1220-768x152.png 768w" sizes="(max-width: 879px) 100vw, 879px" /></p>
<h3>曲线</h3>
<p>曲线是由多个像素点组成，画曲线就是画许多像素点</p>
<p><img loading="lazy" decoding="async" width="629" height="153" class="wp-image-1381" src="/wp-content/uploads/2018/05/word-image-1221.png" srcset="/wp-content/uploads/2018/05/word-image-1221.png 629w, /wp-content/uploads/2018/05/word-image-1221-300x73.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></p>
<p>例题</p>
<p><img loading="lazy" decoding="async" width="978" height="198" class="wp-image-1382" src="/wp-content/uploads/2018/05/word-image-1222.png" srcset="/wp-content/uploads/2018/05/word-image-1222.png 978w, /wp-content/uploads/2018/05/word-image-1222-300x61.png 300w, /wp-content/uploads/2018/05/word-image-1222-768x155.png 768w" sizes="(max-width: 978px) 100vw, 978px" /></p>
<h2>验证码</h2>
<p>验证码可以防止暴力破解，通过排列组合的方式破解用户名和密码。</p>
<p>验证码由背景图和随机数组成</p>
<h3>知识点</h3>
<ol>
<li>imagestring()</li>
</ol>
<p><img loading="lazy" decoding="async" width="914" height="93" class="wp-image-1383" src="/wp-content/uploads/2018/05/word-image-1223.png" srcset="/wp-content/uploads/2018/05/word-image-1223.png 914w, /wp-content/uploads/2018/05/word-image-1223-300x31.png 300w, /wp-content/uploads/2018/05/word-image-1223-768x78.png 768w" sizes="(max-width: 914px) 100vw, 914px" /></p>
<ol>
<li>字符串居中</li>
</ol>
<p><img loading="lazy" decoding="async" width="502" height="151" class="wp-image-1384" src="/wp-content/uploads/2018/05/word-image-1224.png" srcset="/wp-content/uploads/2018/05/word-image-1224.png 502w, /wp-content/uploads/2018/05/word-image-1224-300x90.png 300w" sizes="(max-width: 502px) 100vw, 502px" /></p>
<ul>
<li>
<ol>
<li>Imagesx()：获取图片宽度</li>
<li>Imagesy()：获取图片高度</li>
<li>Imagefontwidth()：获取图片内置字体的宽度</li>
<li>Imagefontheight()：获取图片内置字体的高度</li>
</ol>
</li>
</ul>
<h3>代码</h3>
<p>&lt;?php</p>
<p>//第一步：生成随机字符串</p>
<p>$char_array=array_merge(range(&#8216;a&#8217;,&#8217;z&#8217;),range(&#8216;A&#8217;,&#8217;Z&#8217;),range(0,9)); //字母和数字的数组</p>
<p>$indexes=array_rand($char_array,4); //随机抽取4个字符，返回字符下标数组</p>
<p>shuffle($indexes); //打乱数组</p>
<p>$str=&#8221;;</p>
<p>foreach($indexes as $i) {</p>
<p>$str.=$char_array[$i];</p>
<p>}</p>
<p>//第二步：将字符串写到背景图</p>
<p>$img=imagecreate(200,100);</p>
<p>imagecolorallocate($img,255,0,0); //背景色</p>
<p>$color=imagecolorallocate($img,255,255,255); //前景色</p>
<p>$img_w=imagesx($img); //图片宽度</p>
<p>$img_h=imagesy($img); //图片高度</p>
<p>$font=5; //内置的5号字体</p>
<p>$font_w=imagefontwidth($font); //字符宽度</p>
<p>$font_h=imagefontheight($font); //字符高度</p>
<p>$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标</p>
<p>$y=($img_h-$font_h)/2; //起始点y坐标</p>
<p>imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上</p>
<p>//输出图片</p>
<p>header(&#8216;Content-Type:image/png&#8217;);</p>
<p>imagepng($img);</p>
<p>运行结果</p>
<p><img loading="lazy" decoding="async" width="465" height="176" class="wp-image-1385" src="/wp-content/uploads/2018/05/word-image-1225.png" srcset="/wp-content/uploads/2018/05/word-image-1225.png 465w, /wp-content/uploads/2018/05/word-image-1225-300x114.png 300w" sizes="(max-width: 465px) 100vw, 465px" /></p>
<h2>中文验证码</h2>
<p>Imagestring()不能做中文的验证码，要使用中文做验证码需要使用<a href="mk:@MSITStore:F:\\帮助文档\\php_manual_zh.chm::/res/function.imagettftext.html">imagettftext()</a>。</p>
<p><img loading="lazy" decoding="async" width="860" height="77" class="wp-image-1386" src="/wp-content/uploads/2018/05/word-image-1226.png" srcset="/wp-content/uploads/2018/05/word-image-1226.png 860w, /wp-content/uploads/2018/05/word-image-1226-300x27.png 300w, /wp-content/uploads/2018/05/word-image-1226-768x69.png 768w" sizes="(max-width: 860px) 100vw, 860px" /></p>
<p>将字体拷贝到站点下</p>
<p><img loading="lazy" decoding="async" width="774" height="219" class="wp-image-1387" src="/wp-content/uploads/2018/05/word-image-1227.png" srcset="/wp-content/uploads/2018/05/word-image-1227.png 774w, /wp-content/uploads/2018/05/word-image-1227-300x85.png 300w, /wp-content/uploads/2018/05/word-image-1227-768x217.png 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<h3>知识点</h3>
<p>获取字体的范围</p>
<p><img loading="lazy" decoding="async" width="662" height="121" class="wp-image-1388" src="/wp-content/uploads/2018/05/word-image-1228.png" srcset="/wp-content/uploads/2018/05/word-image-1228.png 662w, /wp-content/uploads/2018/05/word-image-1228-300x55.png 300w" sizes="(max-width: 662px) 100vw, 662px" /></p>
<p>返回值</p>
<p><img loading="lazy" decoding="async" width="515" height="206" class="wp-image-1389" src="/wp-content/uploads/2018/05/word-image-1229.png" srcset="/wp-content/uploads/2018/05/word-image-1229.png 515w, /wp-content/uploads/2018/05/word-image-1229-300x120.png 300w" sizes="(max-width: 515px) 100vw, 515px" /></p>
<h3>代码</h3>
<p>基线</p>
<p><img loading="lazy" decoding="async" width="536" height="137" class="wp-image-1390" src="/wp-content/uploads/2018/05/word-image-1230.png" srcset="/wp-content/uploads/2018/05/word-image-1230.png 536w, /wp-content/uploads/2018/05/word-image-1230-300x77.png 300w" sizes="(max-width: 536px) 100vw, 536px" /></p>
<p>代码</p>
<p>&lt;?php</p>
<p>$img=imagecreate(200,100);</p>
<p>imagecolorallocate($img,255,0,0); //背景色</p>
<p>$color=imagecolorallocate($img,255,255,255); //前景色</p>
<p>//生成随机中文字符串</p>
<p>$char_array=[&#8216;锄&#8217;,&#8217;禾&#8217;,&#8217;日&#8217;,&#8217;当&#8217;,&#8217;午&#8217;,&#8217;汗&#8217;,&#8217;滴&#8217;,&#8217;禾&#8217;,&#8217;下&#8217;,&#8217;土&#8217;,&#8217;我&#8217;,&#8217;爱&#8217;,&#8217;北&#8217;,&#8217;京&#8217;,&#8217;天&#8217;,&#8217;安&#8217;,&#8217;门&#8217;];</p>
<p>$indexes=array_rand($char_array,4); //随机抽取4个字符，返回字符下标数组</p>
<p>shuffle($indexes); //打乱数组</p>
<p>$str=&#8221;;</p>
<p>foreach($indexes as $i) {</p>
<p>$str.=$char_array[$i];</p>
<p>}</p>
<p>//字体参数</p>
<p>$size=20; //字号</p>
<p>$angle=0; //角度</p>
<p>$fontfile=&#8217;./fonts/simhei.ttf&#8217;; //字体</p>
<p>//获取字体范围</p>
<p>$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4</p>
<p>$x=(imagesx($img)-($info[4]-$info[6]))/2; //起始X轴</p>
<p>$y=imagesy($img)/2+($info[1]-$info[7])/3; //起始y轴(字体基线的位置，不是字符的最底端。)</p>
<p>//将中文写到图片上</p>
<p>imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);</p>
<p>//输出图片</p>
<p>header(&#8216;Content-Type:image/png&#8217;);</p>
<p>imagepng($img);</p>
<p>运行结果</p>
<p><img loading="lazy" decoding="async" width="307" height="181" class="wp-image-1391" src="/wp-content/uploads/2018/05/word-image-1231.png" srcset="/wp-content/uploads/2018/05/word-image-1231.png 307w, /wp-content/uploads/2018/05/word-image-1231-300x177.png 300w" sizes="(max-width: 307px) 100vw, 307px" /></p>
<h2>打开已有图片实现验证码</h2>
<h3>打开已经存在的图片创建画布</h3>
<ol>
<li>imagecreatefromgif()：打开gif图创建画布</li>
<li>imagecreatefromjpeg()：打开jpeg图创建画布</li>
<li>imagecreatefrompng()：打开png图创建画布</li>
</ol>
<h3>代码</h3>
<p>&lt;?php</p>
<p>//第一步：生成随机字符串</p>
<p>$char_array=array_merge(range(&#8216;a&#8217;,&#8217;z&#8217;),range(&#8216;A&#8217;,&#8217;Z&#8217;),range(0,9)); //字母和数字的数组</p>
<p>$indexes=array_rand($char_array,4); //随机抽取4个字符，返回字符下标数组</p>
<p>shuffle($indexes); //打乱数组</p>
<p>$str=&#8221;;</p>
<p>foreach($indexes as $i) {</p>
<p>$str.=$char_array[$i];</p>
<p>}</p>
<p>//第二步：将字符串写到图片上</p>
<p>$path=&#8217;./captcha/captcha_bg&#8217;.rand(1,5).&#8217;.jpg&#8217;; //图片路径</p>
<p>$img=imagecreatefromjpeg($path); //打开已经存在的jpeg图</p>
<p>$color=imagecolorallocate($img,255,0,0); //分配红色</p>
<p>if(rand(1,2)==1) {</p>
<p>$color=imagecolorallocate($img,0,255,100); //分配白色</p>
<p>}</p>
<p>$img_w=imagesx($img); //图片宽度</p>
<p>$img_h=imagesy($img); //图片高度</p>
<p>$font=5; //内置的5号字体</p>
<p>$font_w=imagefontwidth($font); //字符宽度</p>
<p>$font_h=imagefontheight($font); //字符高度</p>
<p>$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标</p>
<p>$y=($img_h-$font_h)/2; //起始点y坐标</p>
<p>imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上</p>
<p>//输出图片</p>
<p>header(&#8216;Content-Type:image/png&#8217;);</p>
<p>imagepng($img);</p>
<p>运行结果</p>
<p><img loading="lazy" decoding="async" width="356" height="92" class="wp-image-1392" src="/wp-content/uploads/2018/05/word-image-1232.png" srcset="/wp-content/uploads/2018/05/word-image-1232.png 356w, /wp-content/uploads/2018/05/word-image-1232-300x78.png 300w" sizes="(max-width: 356px) 100vw, 356px" /></p>
<h2>添加水印</h2>
<p>添加水印的目的为了防止被盗图。</p>
<h3>添加文字水印</h3>
<p>&lt;?php</p>
<p>$img=imagecreatefromjpeg(&#8216;./face.jpg&#8217;); //打开原图</p>
<p>$color=imagecolorallocate($img,255,0,0); //分配颜色</p>
<p>//字体参数</p>
<p>$size=40; //字号</p>
<p>$angle=0; //角度</p>
<p>$fontfile=&#8217;./fonts/simhei.ttf&#8217;; //字体</p>
<p>//获取字体范围</p>
<p>$str=&#8217;传智播客版权&#8217;;</p>
<p>$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4</p>
<p>$x=imagesx($img)-($info[4]-$info[6]); //起始X轴</p>
<p>$y=imagesy($img)-($info[1]-$info[7])/3; //起始y轴(字体基线的位置，不是字符的最底端。)</p>
<p>//将中文写到图片上</p>
<p>imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);</p>
<p>//输出图片</p>
<p>header(&#8216;Content-Type:image/png&#8217;);</p>
<p>imagepng($img);</p>
<p><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img loading="lazy" decoding="async" width="641" height="212" class="wp-image-1393" src="/wp-content/uploads/2018/05/word-image-1233.png" srcset="/wp-content/uploads/2018/05/word-image-1233.png 641w, /wp-content/uploads/2018/05/word-image-1233-300x99.png 300w" sizes="(max-width: 641px) 100vw, 641px" /></p>
<h3>添加图片水印</h3>
<p><img loading="lazy" decoding="async" width="945" height="114" class="wp-image-1394" src="/wp-content/uploads/2018/05/word-image-1234.png" srcset="/wp-content/uploads/2018/05/word-image-1234.png 945w, /wp-content/uploads/2018/05/word-image-1234-300x36.png 300w, /wp-content/uploads/2018/05/word-image-1234-768x93.png 768w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<h3>代码</h3>
<p><img loading="lazy" decoding="async" width="965" height="259" class="wp-image-1395" src="/wp-content/uploads/2018/05/word-image-1235.png" srcset="/wp-content/uploads/2018/05/word-image-1235.png 965w, /wp-content/uploads/2018/05/word-image-1235-300x81.png 300w, /wp-content/uploads/2018/05/word-image-1235-768x206.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></p>
<h2>生成缩略图</h2>
<p>将大图自动的生成小缩略图</p>
<p>原图的参数：起始x，起始y，拷贝宽度，拷贝高度</p>
<p><img loading="lazy" decoding="async" width="583" height="290" class="wp-image-1396" src="/wp-content/uploads/2018/05/word-image-1236.png" srcset="/wp-content/uploads/2018/05/word-image-1236.png 583w, /wp-content/uploads/2018/05/word-image-1236-300x149.png 300w" sizes="(max-width: 583px) 100vw, 583px" /></p>
<p>目标图的参数：目标图x，目标图y，目标宽度，目标高度</p>
<p><img loading="lazy" decoding="async" width="581" height="339" class="wp-image-1397" src="/wp-content/uploads/2018/05/word-image-1237.png" srcset="/wp-content/uploads/2018/05/word-image-1237.png 581w, /wp-content/uploads/2018/05/word-image-1237-300x175.png 300w" sizes="(max-width: 581px) 100vw, 581px" /></p>
<p>使用函数</p>
<p><img loading="lazy" decoding="async" width="748" height="123" class="wp-image-1398" src="/wp-content/uploads/2018/05/word-image-1238.png" srcset="/wp-content/uploads/2018/05/word-image-1238.png 748w, /wp-content/uploads/2018/05/word-image-1238-300x49.png 300w" sizes="(max-width: 748px) 100vw, 748px" /></p>
<p>脚下留心：imagecreatetruecolor()和imagecreate()区别</p>
<p>imagecreatetruecolor()新建一个真彩色图像(RGB模式)，默认背景色黑色</p>
<p>imagecreate():新建一个基于调色板的图像，只支持256种颜色，默认背景白色</p>
<p><img loading="lazy" decoding="async" width="1116" height="340" class="wp-image-1399" src="/wp-content/uploads/2018/05/word-image-1239.png" srcset="/wp-content/uploads/2018/05/word-image-1239.png 1116w, /wp-content/uploads/2018/05/word-image-1239-300x91.png 300w, /wp-content/uploads/2018/05/word-image-1239-768x234.png 768w, /wp-content/uploads/2018/05/word-image-1239-1024x312.png 1024w" sizes="(max-width: 1116px) 100vw, 1116px" /></p>
<h2>给图片填充颜色</h2>
<p><img loading="lazy" decoding="async" width="764" height="390" class="wp-image-1400" src="/wp-content/uploads/2018/05/word-image-1240.png" srcset="/wp-content/uploads/2018/05/word-image-1240.png 764w, /wp-content/uploads/2018/05/word-image-1240-300x153.png 300w" sizes="(max-width: 764px) 100vw, 764px" /></p>
<p>深入理解imagefill()</p>
<p><img loading="lazy" decoding="async" width="867" height="85" class="wp-image-1401" src="/wp-content/uploads/2018/05/word-image-1241.png" srcset="/wp-content/uploads/2018/05/word-image-1241.png 867w, /wp-content/uploads/2018/05/word-image-1241-300x29.png 300w, /wp-content/uploads/2018/05/word-image-1241-768x75.png 768w" sizes="(max-width: 867px) 100vw, 867px" /></p>
<p>例题</p>
<p><img loading="lazy" decoding="async" width="799" height="198" class="wp-image-1402" src="/wp-content/uploads/2018/05/word-image-1242.png" srcset="/wp-content/uploads/2018/05/word-image-1242.png 799w, /wp-content/uploads/2018/05/word-image-1242-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1242-768x190.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<h2>关于图片处理的改错</h2>
<h3>第一：如果报错，就按报错的信息更改</h3>
<p><img loading="lazy" decoding="async" width="1048" height="197" class="wp-image-1403" src="/wp-content/uploads/2018/05/word-image-1243.png" srcset="/wp-content/uploads/2018/05/word-image-1243.png 1048w, /wp-content/uploads/2018/05/word-image-1243-300x56.png 300w, /wp-content/uploads/2018/05/word-image-1243-768x144.png 768w, /wp-content/uploads/2018/05/word-image-1243-1024x192.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /></p>
<h3>第二：不报错，但是图片显示不出来</h3>
<p><img loading="lazy" decoding="async" width="855" height="202" class="wp-image-1404" src="/wp-content/uploads/2018/05/word-image-1244.png" srcset="/wp-content/uploads/2018/05/word-image-1244.png 855w, /wp-content/uploads/2018/05/word-image-1244-300x71.png 300w, /wp-content/uploads/2018/05/word-image-1244-768x181.png 768w" sizes="(max-width: 855px) 100vw, 855px" /></p>
<p>注释header()，查看错误</p>
<p><img loading="lazy" decoding="async" width="1019" height="197" class="wp-image-1405" src="/wp-content/uploads/2018/05/word-image-1245.png" srcset="/wp-content/uploads/2018/05/word-image-1245.png 1019w, /wp-content/uploads/2018/05/word-image-1245-300x58.png 300w, /wp-content/uploads/2018/05/word-image-1245-768x148.png 768w" sizes="(max-width: 1019px) 100vw, 1019px" /></p>
<p>第三：注释header()如果没有报错，就查看源码</p>
<p><img loading="lazy" decoding="async" width="1154" height="264" class="wp-image-1406" src="/wp-content/uploads/2018/05/word-image-1246.png" srcset="/wp-content/uploads/2018/05/word-image-1246.png 1154w, /wp-content/uploads/2018/05/word-image-1246-300x69.png 300w, /wp-content/uploads/2018/05/word-image-1246-768x176.png 768w, /wp-content/uploads/2018/05/word-image-1246-1024x234.png 1024w" sizes="(max-width: 1154px) 100vw, 1154px" /><br />
<img loading="lazy" decoding="async" width="1127" height="246" class="wp-image-1407" src="/wp-content/uploads/2018/05/word-image-1247.png" srcset="/wp-content/uploads/2018/05/word-image-1247.png 1127w, /wp-content/uploads/2018/05/word-image-1247-300x65.png 300w, /wp-content/uploads/2018/05/word-image-1247-768x168.png 768w, /wp-content/uploads/2018/05/word-image-1247-1024x224.png 1024w" sizes="(max-width: 1127px) 100vw, 1127px" /></p>
<h3>第三：终极一招，ob_clean()</h3>
<p>如果上面的方法都没有效果，可以尝试ob_clean()</p>
<p>原理：图片输出之前不能有任何字符的输出，ob_clean()情况缓存中所有输出。</p>
<p><img loading="lazy" decoding="async" width="873" height="238" class="wp-image-1408" src="/wp-content/uploads/2018/05/word-image-1248.png" srcset="/wp-content/uploads/2018/05/word-image-1248.png 873w, /wp-content/uploads/2018/05/word-image-1248-300x82.png 300w, /wp-content/uploads/2018/05/word-image-1248-768x209.png 768w" sizes="(max-width: 873px) 100vw, 873px" /></p>
<h2>思考题</h2>
<p>制作等比缩略图</p>
]]></content:encoded>
					
					<wfw:commentRss>/php/php%e6%a0%b8%e5%bf%83%e7%bc%96%e7%a8%8b/1363.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
