这本书之前看了一部分,趁过年放假完整看一遍,顺便记录一下要点。持续更新...
第一章
- PHP的作用:动态地生成HTML Web页面。在服务器上运行一个PHP脚本,它可以根据需要改变或生成HTML代码。仍会向浏览器传送一个HTML Web页面,不过浏览器并不知道也不关心PHP已经介入其中,并且修改了服务器上的HTML。
- PHP代码在服务器上运行,它们存储在PHP脚本中,PHP脚本的文件扩展名通常是.php。服务器运行一个PHP脚本时,最终结果都是纯HTML和CSS,所以一旦PHP脚本在服务器上运行结束,每一个PHP脚本最终都会转换为HTML和CSS。
- 表单通过form元素的action属性与一个PHP脚本连接,从而在提交表单时导致脚本运行,不论为action属性设置什么文件名,表单提交时Web服务器都会用所设置的这个文件来处理表单。如果PHP脚本名为report.php,将它与表单相连接的<form>标记则如下所示:
<form action="report.php" method ="post"> - PHP是一个缩写,原来代表Personal Home Pages(个人主页)。不过在后来的发展过程中,这个缩写变为表示PHP:Hypertext Processor(PHP超文本处理器)。
- 网站的所有文件都存储在服务器上——.html、.css、.php等。不过,它们并非都由服务器处理。HTML和CSS文件以及图像文件会直接发送到客户浏览器,而不会操心其中具体包含什么。PHP文件有所不同,因为PHP文件中包含要由Web服务器处理并在服务器上运行的代码。并非将PHP代码发送到浏览器,而是会发送运行PHP代码的结果,这些结果正是纯HTML和CSS。
- <?php 标记是一段PHP代码的开始,?>结束一段PHP代码。即PHP代码处于<?php和?>之间。
- 每个PHP语句必须以一个分号结束。
- 如果Web页面中有PHP代码,建议文件后缀名取.php。
- PHP变量名以一个美元符$开头,区分大小写,长度至少为一个字符;美元符后第一个字符必须是字母或者下划线,此后可以包含字母、数字和下划线。
- 建议变量名使用小写字母,以下划线分割单词。
- 大多数情况下,PHP命令不区分大小写,不过最好保证大小写一致。
- $_POST是一个PHP内置的超级全局变量,也是一个数组,用于储存浏览器提交的表单数据。如$_POST['howlong'],howlong来自HTML表单中一个<input>元素的name属性,如
<input type="text" name="howlong" />
- .(点号)可以将多个文本串粘合为一个串,称为连接。
- echo命令用于将信息作为HTML内容输出到浏览器。echo命令是PHP能够动态生成HTML和CSS代码的关键所在。
- PHP中的串可以用双引号或单引号包围,不过PHP会将双引号中的变量替换为相应的变量值,单引号中则不做任何替换。
- PHP mail()函数可以从脚本发送一个email消息。
$to指定收件人地址,$subject为消息主题,$msg为消息体,“From”.$email为非必要参数,指定发件人地址,必须将“From”追加在email地址前。mail($to, $subject, $msg, "From".$email)
- MySQL允许将数据储存在数据库和数据库表中,可以使用SQL语言插入和获取信息。
- SQL是一种查询语言,用于与MySQL之类的数据库应用交互。
第二章
- CREATE DATABASE 用于创建数据库。语法:
database_name为数据库名。CREATE DATABASE database_name
- CREATE TABLE 用于创建数据库表。语法:
table_name为表名,column_name为列名,data_type为数据类型。CREATE TABLE table_name( column_name1 date_type1, column_name2 date_type2, ... )
- INSERT INTO用于向数据库表添加新记录。语法:
INSERT INTO table_name(column_name1,column_name2,...) VALUES('value1','value2',...)
value必须与列名顺序相同。
-
在PHP代码中使用SQL语句不以分号结束。
-
SELECT语句用于从数据库中选取数据。语法:
SELECT column_names FROM table_name 或 SELECT column_name1,column_name2,... FROM table_name
返回多列时,列名需用逗号隔开。列名改为一个星号则返回所有列。
-
PHP脚本向一个MySQL数据库插入数据或从中获取数据之前,必须先连接到这个数据库。有3个主要的PHP函数用于与MySQL数据库通信:mysqli_connect()、mysqli_query()和mysqli close()。
-
mysqli_connect()用于与数据库建立连接。语法:
mysqli_connect(servername, username, password, database);
servername为数据库服务器地址,username和password为用户名和密码,database为数据库名。所有参数皆为串,需要使用引号引起。该函数如果执行成功,则返回一个数据库连接,否则返回False。database是可选参数,如果省略,则要求使用mysqli_select_db()函数选择数据库。
-
PHP die()函数会终止一个PHP脚本,并提供失败代码的反馈。
-
mysqli_query()函数向服务器发送各种SQL语句。语法:
mysqli_query(database_connection, query);
database_connection为mysqli_connect()函数的返回值,query为一个SQL语句,以串的形式传入,需要用引号包含。
-
mysqli close()用于关闭数据库连接。一旦用完连接应当将其关闭。
mysqli_close(database_connection);
-
数据库服务器同时只允许有一定数目的可用连接,所以要尽可能地节省。关闭一个连接时,它会释放这个连接,这样就可以创建一个新的连接。
-
SQL SELECT语句允许追加一个子句来控制查询返回的数据,这个子句名为WHERE。如:
SELECT * FROM table_name WHERE name = 'abc'
这个语句会返回表中name值为‘abc’的数据。
第三章
- Web应用是一个设计用来满足用户某个特定目标的动态网站。
- 数据库是一种以结构化方式存储数据的容器。
- 数据库包含数据库表。数据库表以行和列的表格方式存储数据。
- 在MySQL终端运行SQL命令时,一定要在最后加分号。通过PHP函数mysqli_query()执行SQL查询则不需要加分号。这是因为,终端能够运行多条SQL语句,而在PHP中,一次只能提交一条语句。
- 创建一个表时,必须告诉MySQL服务器每一列将存放何种数据类型。数据类型对于所有MySQL列都是必要的,一个表中的每一列都保存一个特定类型的数据。
- 创建表列时使用合适的数据类型非常重要,这样才能保证你的数据库表准确而高效。
- 认识一些数据类型
这些是常用数据类型,并非全部。CHAR或CHARACTER 储存定长数据 INT或INTEGER 储存整数 BLOB 储存大块的二进制数据 TEXT 储存大量文本数据 DATE 储存日期 VARCHAR 储存长度可变的数据 DEC 储存小数 DATETIME或TIMESTAMP 储存时间和日期 - DEC(10, 2) 10表示总共可以存储10位数字,2表示包含2位小数。是十进制数。
- CHAR(2) 固定储存2个字符的定长数据。
- VARCHAR(60) 包含的数据最大为60个字符。
- USE命令选择一个数据库作为后续SQL语句的默认数据库。使用数据库之前应该先执行USE命令。
USE database_name
- DESCRIBE命令会分析一个表的结构,并显示一个列表,其中包括列名、数据类型以及其他信息。
DESCRIBE table_name
- 一旦创建了一个表,它就会一直存在,而且不会被一个新的CREATE TABLE查询所覆盖。
- DROP TABLE命令用于从数据库中删除一个表。它会删除这个表以及其中存储的所有数据。
DROP TABLE table_name
-
WHERE后可以跟不止一个条件。
SELECT * FROM table_name WHERE name = 'abc' AND age = '20'
-
如果将mysqli_query()函数的返回值输出,结果类似于:Resource id #3
这是一个MySQL资源的id号,而不是具体数据。执行该函数后,MySQL服务器会临时保存查询的结果,并为之提供一个资源号来标识。然后可以在使用mysqli_fetch_array()函数时,利用这个资源ID获取数据,即一次获取一个数据行。
- mysqli_fetch_array()函数将一个数据行存储在一个数组中。示例:
$db = mysqli_connect('localhost', 'user', 'mypassword', 'database'); $query = "SELECT * FROM table_name"; $result = mysqli_query($db, $query); $row = mysqli_fetch_array($result);
-
使用while循环和mysqli_fetch_array()函数遍历数据行。
while($row = mysqli_fetch_array($result)) { echo $row['first_name'] . $row['last_name'] . '<br/>'; }
如果数据已经返回完,则返回False。
-
DELETE命令会从一个数据库表删除数据行。使用时要特别当心,因为它完全能够在眨眼之间将填满数据的一个表完全清空。
DELETE FROM table_name
如果不加限定符,DELETE FROM table_name会清空一个表中的所有数据。
-
通过在DELETE命令中使用WHERE子旬,可以准确地指定要删除的特定数据行,而不是清空整个表。
DELETE FROM table_name WHERE name = 'dog_egg'
所有name为'dog_egg'的数据行都会被删除。
第四章
- isset()函数测试一个变量是否存在。当变量已赋值时返回True,包括空值。
- empty()函数确定变量是否为空值。PHP空值有0、空串、false和NULL,变量为空值时返回True。
- 可以根据需要开始和结束PHP代码块,在PHP脚本中输出HTML代码。
- HTML表单作为PHP脚本的一部分,而该PHP脚本将处理这个表单,并那么这个表单就称为自引用表单。
- 内置的PHP超级全局变量$_SERVER['PHP_SELF']存储了当前脚本的名字。
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
自引用表单。
-
$_POST超级全局变量允许查看一个表单是否提交。
if(isset($_POST['submit'])) { .../*表单提交时执行这段代码*/ }
-
如果数据库表中没有一个列包含真正唯一的值,就应当创建这样一个列。MySQL提供了一种方法可以为表中的每个数据行增加一个唯一的整数列,也称为一个主键。
-
ALTER TABLE命令可以在现存的数据库表中创建一个新列。以下是ALTER TABLE语句为表增加一个新列的一般形式:
ALTER TABLE table_name ADD column_name column_type
-
ALTER TABLE 更完整的形式:
ALTER TABLE table_name ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY(id)
NOT NULL告诉MySQL:id列中必须要有一个值,绝对不能让它为空。AUTO_INCREMENT会自动将新添加的数据行中的id值增1。最后,PRIMARY KEY告诉MySOL:id列中的各个值是唯一的,不过其意义还不仅仅在于唯一。
-
主键的五个原则:
- 主键中的数据不能重复。两个数据行的主键绝对不能有相同的数据。对此绝无例外,给定表中主键总有唯一的值。
- 主键必须有一个值。如果一个主键为空(NULL),那么它可能并不唯一,因为其他行的主键也可能为NULL。一定要将主键设置为唯一的值!
- 插入新行时必须设置主键。如果可以插入一行而没有主键,就会存在风险,最终有可能出现NULL主键,而且表中有可能出现重复的行,这就会破坏我们的目标。
- 主键必须尽可能高效。主键应当只包含保证唯一性所需的信息而不含其他多余的内容。正是因为这个原因,整数很适合用作为主键,它们支持唯一性而不需要太多的存储空间。
- 主键值不能改变。如果可以改变主键的值,就有可能不小心将它设置为一个已经使用的值。要记住,要尽一切可能保证唯一。
- foreach可以循环处理数组。
foreach($array as $var) { echo $var; //$array是希望处理的数组,$var是一个变量 }
第五章
- ALTER语句用于修改一个数据库的结构。
ALTER TABLE table_name DROP COLUMN column_name //删除一列 ALTER TABLE table_name ADD COLUMN column_name data_type //为数据库表增加一个新列,在ADD COLUMN后面指定列名及其类型 ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name new_data_type //修改一列的列名和数据类型,在CHANGE COLUMN后面指定原列名、新列名以及新列的数据类型 ALTER TABLE table_name MODIFY COLUMN column_name data_type [FIRST | AFTER column_name] //修改一个数据库表中某一列的数据类型或位置只需在MODIFY COLUMN后面指定列名和新的数据类型。 要修改一列的位置,需要指定列名及其具体位置(只有一个选项FIRST),或者可以指定一个相对位置 (指定AFTER和另一个原有的列,该列按名指定)。
-
MySQL NOW()函数用于插入当时日期、时间。
-
INSERT INTO命令如果不指定列名,那么给出的值将按表中列的顺序依次插入。
-
$_FILES内置超级全局变量允许访问上传文件的有关信息。它是一个数组。
$_FILES['file_name']['name']//上传文件的文件名 $_FILES['file_name']['type']//上传文件的类型 $_FILES['file_name']['size']//上传文件的大小(字节数) $_FILES['file_name']['tmp_name']//文件在服务器上的临时储存位置 $_FILES['file_name']['error']//文件上传的错误码,0表示成功,其他值表示失败
file_name为HTML表单中<input>元素的name属性的值。
-
在Web页面上放置一个图像只需要该图像文件的一个引用(图像文件名)。
-
用户从计算机中上传的文件会上传到服务器上的一个临时文件夹中。这个临时文件夹会在服务器上自动创建,通常有一个奇怪的名字,包含一堆随机的字母和数字。
-
文件上传后可以把文件移动到另一个位置。PHP函数move_uploaded_file()接受一个文件的源位置和目标位置,然后负责完成文件移动。
move_uploaded_file($_FILES['screenshot']['tmp_name'],$target);
-
上传到服务器的文件最好移出临时文件夹,放入专门的文件夹。
-
time()函数返回服务器上的当前时间,表示为秒数。这个数字是唯一的,并且一直在增加。
-
define()用于创建常量。
define('constant_name', 'constant_value');
-
共享的脚本数据需要在整个应用中都能访问,而无需代码重复。
-
require_once语句负责将一个脚本包含在另一个脚本中。
-
require_once和include类似。二者的区别在于,如果未找到包含文件,require_once会产生一个错误,而include在未找到包含文件时不会显示任何错误。另外,requir_once中的“once”一词表示它保证文件不会被意外包含多次。PHP还提供了include_once和require语句,这是require_once和include的变型。
-
ORDER BY语句可以对查询结果排序。
SELECT * FROM table_name ORDER BY column_name ASC|DESC //ASC表示升序,DESC表示降序 SELECT * FROM table_name ORDER BY column_name1 ASC, column_name2 DESC //如果column_name1有两个数据相同,则这两个数据之间根据 column_name2 进行排序
-
unlink()函数从Web服务器删除一个文件。
-
可以在任何PHP函数前加上@来抑制其错误报告。
-
Web应用通常包括一些可以公共访问的页面,另外也包括一些只用于网站维护的页面。
-
GET和POST真正的差别在于请求的目的不同。GET主要用于从服务器获取数据而不影响服务器上的任何其他方面。POST通常会向服务器发送数据,而且在此之后服务器的状态往往会有某种程度的改变来响应所发送的数据。
-
POST:用于向服务器发送数据,从而以某种方式导致服务器上状态的改变,如在数据库中插入数据。数据还可以在响应中返回。不同于GET,POST请求只能通过Web表单的动作完成。另外与GET不同,POST请求中发送的数据是隐藏不可见的。
-
GET:一般用于数据获取,而不会使服务器有任何改变。对于少量的数据,GET非常有用,可以直接在URL中向服务器发送数据。与POST不同,GET主要适用于发送少量的数据。
-
用LIMIT控制删除数量。
DELETE FROM table_name WHERE name='amo' AND age = '20' LIMIT 1
第六章
第七章
- MySQL SHA()函数会把一段文本加密为唯一的40字符的十六进制编码。
- SHA()函数提供单向加密,无法对已经加密的数据解密。
- SHA()代表安全散列算法(Secure Hash Algorithm)。“散列”(hash)是一个编程术语,表示唯一的固定长度串,可以唯一表示一个文本串。对于SHA(),散列就是40字符的十六进制加密文本串,它唯一表示原始口令。
- MySQL提供了另一个与SHA()类似的函数,名为MD5(),它会完成类似的加密。不过一般认为SHA()算法比MD5()更安全一些,所以最好使用SHA()。PHP也提供了等价的函数(sha1()和md5())如果需要在PHP代码中(而不是在SQL查询中)完成加密,可以使用这些PHP函数。
- Cookie允许将小段数据持久地存储在客户端,这些数据可以跨脚本存在,而且可以根据需要删除。
- cookie在一个唯一的名之下存储了一小段数据,这非常类似于PHP中的变量。但与变量不同,cookie可以有一个到期日期。达到这个到期日期时,这个cookie就会被销毁。可以创建一个没有到期日期的cookie,在这种情况下,它就类似于一个PHP变量,会在浏览器关闭时被销毁。
- PHP通过一个名为setcookie()的函数和一个名为$_COOKIE的超级全局变量提供对cookie的访问。setcookie()函数用于设置一个cookie的值以及一个可选的到期日期,$_COOKIE超级全局变量用于获取一个cookie的值。
setcookie('username', 'sidneyk'); //第一个参数是cookie的名。 //第二个参数是存储在cookie中的值。 //该函数还接受可选的第三个参数,即设置cookie的到期日期,达到这个日期时cookie会自动删除。
-
setcookie('username', 'sidneky', time()+(60*60*8));
这个代码设置到期日期为将来的8小时以后,这说明cookie会在8小时后自动删除。要立即删除一个cookie,只需将到期日期设置为过去的一个时间。具体过去多长时间并不重要,只需选择一个任意的时间量。如:
setcookie('username', 'sidneky', time()-3600);
-
会话允许将小段数据持久地存储在服务器上,而不依赖于客户端。
-
由于会话数据都存储在服务器上,这比存储在cookie中更安全,也更可靠。
-
会话无法对一个会话变量将数据存储多久做太多控制。会话一结束就会自动地销毁会话变量,而会话往往在用户关闭浏览器时结束。
-
PHP session_start()函数开始一个会话并允许在会话变量中存储数据。
-
session_destroy()函数结束一个会话。
-
会话开始时,会话设置一个会话ID唯一标识这个会话。只要会话不结束就不会销毁会话ID,浏览器关闭或者调用了session_destroy()函数时会话才会结束。如果利用这个的函数自行关闭一个会话,它不会自动销毁你存储的任何会话变量。
-
会话的用法与cookie非常相似。一旦用一个session_start()调用开始一个会话,就可以用$_SESSION超级全局变量设置会话变量。
-
$_SESSION['username'] = 'sidneyk'; //会话变量的名用作$_SESSJON超级全局变量中的索引。 //要存储的值直接赋给$_SESSION超级全局变量
-
销毁一个会话的所有会话变量有一种快速有效的方法,即把$_SESSION超级全局变量设置为一个空数组。
$_SESSION = array(); //这个代码会清除当前会话中的所有会话变量。
-
如果浏览器支持cookie,会话可能会设置一个cookie临时存储会话ID。所以要通过PHP代码完全关闭一个会话,还必须删除可能在浏览器上自动创建来存储会话ID的所有cookie。
第八章
- 对数据库中的数据(表和列)以及所有其他相关对象和它们如何连接的描述称为一个模式。
- 创建表的一个结构化图表可以保证表的设计与表中的数据分离。
- 外键是一个表中的一列,它引用了另一个表的主键。
- 如果没有外键,将很难将一个表中的数据与另一个表中的数据相关联,通过将数据分散到多个表中,我们就能消除重复数据,得到一个高效的数据库。所以,即使是最简单的数据库模式中,外键也有着很重要的地位。
- 通过用主键和外键建立表的关联,使我们可以采用一种一致的方式连接这些表中的数据。甚至可以将数据库建构为要求主键和其相应外键必须匹配。这称为引用完整性(referential integrity),这是表示所有键引用都必须合法的另一种说法。
- 从一个设计良好的数据库起步,就能更容易地构建和组装应用的各个其他部分。开始设计应用时如果能够正确地设计数据库,这是保证开发过程顺利进行的最好的准备。
- array_push()函数将一个新元素追加到数组最后,使数组大小增1。
- ? : 三元操作符用于以一种更紧凑的形式编写if-else语句。
TestExpression ? Statement1 : Statement2; //如果TestExpression为true,则执行Statement1。 //如果TestExpression为false,则执行Statement2。
-
规范化是指设计数据库来减少重复数据,并改进数据之间的关系。
-
原子数据就是分解为给定数据库所需最小形式的数据。
-
让数据具有原子性是创建一个规范表的第一步。
-
保证数据原子性是指,把它分解为创建一个高效表所需的最小部分,而不是尽可能小的部分。不要矫枉过正而将数据过分分解。如果不需要额外的列,就不要只是为了分解数据而增加列。
-
规范化很有好处,具体来说就是数据库的规模和速度会得到改进。规范表不会有重复数据,这会缩小数据库的规模;要搜索的数据更小,查询也会更快。
-
规范化一个数据库需要严格地遵循一系列设计步骤。
-
规范化数据库的3大步骤:
-
确保列具有原子性。要让一个列真正做到原子性,该列中就不能有数据类型相同的多个值。类似地,也不能有多个有相同数据类型的列。
-
每个表有自己的主键。主键对于确保唯一地访问表中的数据非常重要,主键是一个列,理想情况下是数值数据类型,这样可以尽可能高效地完成查询。
-
确保非键的列不相互依赖。这是规范化数据库时最有难度的一个需求,这一条并不总是要求严格遵循。你需要更仔细地查看一个给定表中的数据列相互之间的关系。
第九章
- 搜索项的大小写不重要。因为默认情况下MySQL WHERE子句是不区分大小写的。
SELECT job_id,title,description FROM riskyjobsWHERE title = 'Bull Fighter Matador'
- 利用关键字LIKE,可以查找与引号中的词不完全相等的匹配…… 而且仍然是不区分大小写的。
SELECT job_id,title,description FROM riskyjobs WHERE title LIKE '%fighter%' -- %是通配符,代表这个词之前或之后的所有其他字符。
-
LIKE子句通常与通配符结合使用,通配符代表所匹配数据中的字符。在SQL中,百分号(%)可以代表0个或多个字符。
-
SQL还有一个可以与LIKE一同使用的通配符即下划线(_),它表示1个字符。
LIKE '____fighter%'
这就是说:要查找串'fighter’,它前面有4个字符,后面有任意多个字符。这会与“bullfighter”和“firefighter”匹配,但是与“streetfighter”不匹配。
-
explode()函数将一个串分解为一个子串数组。
$search_words = explode(' ', 'Tipper Cow'); //$search_words变量存储了搜索项数组,这些搜索项将输入到一个SQL查询中。 //第一个参数告诉explode()由什么符号分隔串中的子串,在这里就是一个空格。 //这个分隔符可以指定一个或多个字符,也称为定界符。 //第二个参数是我们希望分解的文本。
-
implode()由子串构造一个串。
$where_clause = implode('OR', $where_list); //implode()函数返回一个串. //第一个参数为界定符,将各个串合并为一个串时,各串之间会增加这个定界符。 //第二个参数必须是希望合并的一个串数组。
-
通过预处理数据可以删除我们不想要的字符,使数据更易于处理。
-
PHP的str_replace()函数可以实现文本替换操作,只需提供3个参数:要查找的文本,希望替换为哪个文本,以及要完成这种“查找一替换”处理的串。
$clean_search = str_replace('thousands', 'hundreds', 'Make thousands of dollars your very first month. Apply now!'); //将"thousands"替换为"hundreds"
-
PHP substr()函数允许抽取一个串的一部分。
substr(string,start,length) //第一个参数是原始串,希望从中抽取子串。 //第二个参数指定了从哪里开始取子串。 //第三个参数是要返回的串的字符个数。
省略第三个参数,表示取至串尾。负数表示倒数。
-
分页将查询结果分组,并分别在单独的Web页面上显示名组结果。
-
LIMIT控制一个SQL查询返回多少行以及哪些行。可以向LIMIT增加两个参数,第一个参数控制跳过多少行,第二个参数控制返回多少行。
LIMIT 10,5
-
ceil()函数将一个数向上取整为最接近的整数,即不小于它的最小整数。
第十章
- PHP有一个strlen()函数,它会告诉你一个串中有多少个字符。
- 以下是一个正则表达式,要查找一行中的10位数字。
/^\d\d\d\d\d\d\d\d\d\d$/
^表示从串的开始处开始匹配。\d代表数字,串中的第一个字符必须是一个数字。总共有10个数字。美元符表示串必须结束。
-
还可以采用一种更简洁的方法重写这个正则表达式,这里要用到大括号。大括号用于指示重复:
/^\d{10}$/
这与上面的模式表示同样的含义。{10}是表示10个数字的一种简写形式。
-
正则表达式是一些规则,用于匹配一个或多个串中的模式。
-
利用元字符可以在正则表达式中描述文本模式。
\d 这个元字符要查找一个数字。这会匹配0到9之间的任何数字,\d本身只匹配一位数字,所以如果希望匹配一个两位数,则要使用\d\d或\d{2}。 \w 查找任何字母数字字符。可以是一个字母或者一个数字。它会匹配以下范围内的任意一个字符,包括a-z和A-Z(大写和小写字母),以及0-9(类似于\d)。 \s 查找空白符。这不只是按下空格键在屏幕上显示的空格字符;\s还能匹配制表符、换行或回车符。同样地,要记住\s一次只匹配一个这样的字符。如果希望匹配一行中的两个空格字符,则需要使用\s\s或\s{2}。 ^ 它会查找一个串的开始位置,所以可以用它指示必须从一个文本串的起始位置开始匹配,而不是串中的任何其他位置。例如,正则表达式/^\d{3}/能匹配串“300applications但不能匹配“Wereceived300 applications" . 点元字符可以匹配除换行符以外的任意一个字符。它能匹配字母或数字(类似于\w),还可以匹配空格或制表符(类似于\s) $ 查找串尾。可以结合^使用这个$元字符确定匹配的范围,指定匹配究竟从哪里开始到哪里结束。例如,/^\w{5}\s\d{3}$/能匹配“Nanny411”但不能匹配“Nanny 411is great”或“Call Nanny411”。 -
量词指定了一个元字符应当出现多少次。
{min,max} 如果大括号里有两个数字,并用一个逗号分隔,这指示了前面的字符或元字符重复次数的范围。{2,4}就是要求应当在一行中出现2、3或4次。 + 前面的字符或元字符必须重复1次或多次。 * 字符或元字符可以出现1次或多次,或者根本不出现。 ? 前面的字符或元字符必须出现1次或者根本不出现。 -
字符类是一组匹配单个字符的规则。利用字符类,可以匹配一个特定值集合中的字符。可以使用字符类查找一个数字范围,还可以查找一个值集合。例如:[0-2] 这与一个数字范围匹配,它会匹配0、1或2。[A-D] 这会匹配A,B,C或D。[^b-f] 在字符类中使用^时有一个特殊的含义,这个^表示“匹配除……以外的所有字符”,这会匹配除b,c,d,e或f以外的所有字符。
-
字符类[m-zM-Z]将匹配字母表后半部分中的任何字母,包括大写和小写。字符类中指定的字符或范围之间不需要加空格或逗号。
-
如果希望一个量词应用到连续的一组字符(但这些字符不在一个字符类中),可以用小括号包围这些字符,指示它们应当归为一组。举例来说,正则表达式/(hello)+/将匹配文本串中一个或多个连续的单词“hello”。
-
可以在正则表达式中使用竖线字符(|)来指示一组选项,可以从中选择。所以,正则表达式/(ketchup|catsup|catchup)/将匹配这3个单词中的任意一个。
-
如果希望在正则表达式中使用保留字符,需要对它们转义。
在正则表达式语法中,有为数不多的一组指定了特殊含义的字符,因为它们用来指示元字符、量词和字符类。这包括点号(.)、问号(?)、加号(+)开始中括号([),开始和结束小括号、补字号(^)、美元符($)、竖线字符(|)、反斜线(\)、前斜线(/)和星号(*)。
如果希望在正则表达式中使用这些字符来表示它们的原义,而不是作为它们通常表示的元字符或量词,需要在前面加一个反斜线对它们“转义”。 -
用preg_match()检查模式。这个函数取一个正则表达式模式和一个文本串。如果没有匹配,函数会返回false,如果匹配,则返回true。
preg_match($regex,$my_string); //$regex为一个正则表达式。函数希望收到一个串,这说明正则表达式应当用单引号包围。 //$my_string是要检查的串(查看是否存在匹配)。
-
preg_replace()函数在使用正则表达式完成模式匹配方面比preg_match()函数更进一步。除了确定一个给定模式是否与一个给定文本串匹配外,它还允许提供一个替换模式取代串中的匹配文本。
preg_replace($pattern,$replacement,$my_string) //$pattern:需要查找这些不想要的字符。 //$replacement:找到一个不想要的字符时,希望把它替换为这个模式。 //$my_string:要完成查找一替换的串。 $new_year = preg_replace('/200[0-9]/','2010','The year is 2009.'); //每次在串中找到一个2000~2009的年份时,会替换为2010.
-
PHP提供了checkdnsrr()函数来检查一个域是否合法。
checkdnsrr('headfirstlabs.com') //checkdnsrr()接收一个包含域名的串,这是@符号后面的所有内容。 //如果这是一个真实的域则返回1,否则返回0。
第十一章
- CAPTCHA是使用某种测试保护网站避免遭到自动化机器人攻击的一个程序。要检验一个表单所面对的是一个真正的人,这种测试称为CAPTCHA,这代表“完全自动化公共图灵测试以区分计算机和人类”(Completely Automated Public Turing Test to Tell Computers and Humans Apart)。
- PHP提供了图像功能,可以动态地生成图像,然后使用HTML代码显示借助于一个名为GD(Graphics Draw)的图形库,PHP脚本可以采用流行的格式(如GIF、JPEG和PNG)动态生成图像,可以把图像返回到web浏览器来显示,或者也可以将图像写至服务器上的一个文件。
- rand(),这个内置函数返回一个随机整数,可能在一个指定范围内,或者介于0到内置常量RAND_MAX(依赖于服务器)之间。要得到某个范围内的一个随机数,只需将这个范围的上下界作为两个参数传入rand()。
- chr(),这个内置函数将一个数转换为与其对应的ASCII字符。举例来说,数字97就是小写字母'a'的ASCII码。所以调用chr(97)会得到一个字符'a'。
- GD图像函数:
- imagecreatetruecolor();这个函数在内存中创建一个空图像,准备由其他GD函数在它之上进行绘制。
$img = imagecreatetruecolor(CAPTCHA_WIDTH,CAPTCHA_HEIGHT); 这个函数返回一个图像标识符,其他绘制函数都需要这个标识符才能具体在团像上完成绘制. 两个参数分别是图像的宽度和高度.
-
imagecolorallocate();可以使用这个函数分配一个颜色,以便在其他绘制函数中使用。
$text_color = imagecolorallocate($img,0,0,0); 第一个参数是图像资源标识符, 后面3个参数分别表示RGB(红-绿-蓝)颜色值的3个数值分量。每个值都在0~255的范围内。 返回值是一个颜色标识符,可以在其他绘制函数中用于指定一种颜色,通常会作为最后一个参数。
- imagesetpixel();这个函数在图像中一个指定的坐标上绘制一个像素。坐标从图像左上角的0,0开始,向右向下递增。
imagesetpixel($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color); 第二、三个参数为像素相对于图像左上角的XY坐标,在这里会得到CAPTCHA图像中的一个随机位置。 $graphic_color为像素的颜色(标识符)。
- imageline();调用这个函数在两个坐标(x1,y1和 x2,y2)之间画一条直线。坐标是相对于图像左上角指定的,直线采用作为函数最后一个参数传入的颜色来绘制。
imageline($img, 0,rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT,$graphic_color); 第二、三个参数为直线起始点的XY坐标,在这里这个点位于CAPTCHA图像的左边界上。 第四、五个参数直线终点的XY坐标,在这里这个点位于CAPTCHA图像的右边界。
-
imagerectangle();用某种指定的颜色从一个点(x1,y1)开始到另一个点(x2,y2)结束绘制一个矩形。这两个点和绘制颜色分别作为函数的第2到第6个参数提供,第一个参数是图像标识符。
- imagefilledrectangle();与imagerectangle()类似,这个数绘制一个矩形,内部用指定的颜色填充。
imagefilledrectangle($img, 0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $bg_color); 第二到五个参数为起点和终点的XY坐标,在这里会填充整个CAPTCHA图像。
imagerectangle()函数与imagefilledrectangle()的参数完全相同。
-
imageellipse();这个函数用于绘制圆和椭圆,接受一个中心点和一个宽度和高度作为参数。圆就是宽度和高度相等的椭圆。椭圆/圆的颜色作为函数的最后一个参数传入。
-
imagefilledellipse();可以填充一个椭圆。
imagefilledellipse(img, 0, 0, 320, 240, color); 第二、三个参数为椭圆的宽度和高度。 第四、五个参数为椭圆中心点的XY坐标。
imageellipse()和imagefilledellipse()有同样的参数。
-
imagepng();完成图像的绘制时,可以调用这个函数把它直接输出到客户Web浏览器,或者输出到服务器上的一个文件。不论何种方式,最终结果都是一个图像,可以利用HTML<img>标记在一个Web页面上显示。如果选择直接在内存中生成PNG图像(也就是说,没有文件名),那么还必须调用header()函数通过一个首部把它传送到浏览器。
imagepng($img); 这个函数根据图像是否成功创建返回true或false。 可以传递一个文件名作为第二个参数(可选), 如果没有这个参数,函数会在内存中生成一个图像,通过一个首部传回浏览器。
-
imagedestroy();使用GD库处理图像需要占用系统资源,这个函数负责在你处理完图像后进行清理。只需在用imagepng()输出图像之后调用这个函数来完成清理。
imagedestroy($img); 与imagepng()类似,这个函数在成功时返回true,否则返回false。 一定要保证对于所创建的每一个图像都有这样一个调用,确保撤销所有图像。
一旦输出了图像,一定要用imagedestroy()释放内存中的图像。
-
imagestring();这个函数采用指定的颜色使用PHP的内置字体绘制一个文本串。除了图像资源标识符,还要为这个函数传入字体的大小,这是一个介于1到5的数字,另外要提供串左上角的坐标以及串本身,最后还要提供颜色。
imagestring($img, 3, 75, 75, 'Sample text', $color); 第二个参数是串的宇体大小,范围在1到5以内。 第三、四个参数是串左上角的XY坐标。 第五个参数是要绘制的文本串。 第六个参数是文本的颜色。
-
imagestringup();与imagestring()类似,这个的数使用内置字体绘制一个文本串,不过它会垂直地绘制文本,就好像逆时针旋转了90度。调用这个函数时与imagestring()有完全相同的参数。
-
可以使用imagettftext()函数利用你自己的TrueType字体绘制高度定制的文本。
imagettftext($img, 18, 0, 5, CAPTCHA_HEIGHT-5, $text_color, 'Courier New Bold.ttf', $pass_phrase); 第二个参数是字体的大小,通常按“点数”指定。 第三个参数是字体的角度,指定为逆时针度数(0对应常规文本)。 第四、五个参数是文本左下角的XY坐标。 必须将True Type字体文件放置在你的Web服务器上,以便GD图形库找到它。 $pass_phrase是所要绘制的具体文本。