php
静态页面交互
PHP是一种服务器端语言,服务器运行一个PHP脚本时,最终结果都是纯HTML和CSS
PHP脚本必须放在一个Web服务器上运行,否则将无法工作
PHP基本规则
- PHP开始和结束与HTML格式一样,
中间的PHP代码用 <?php 和 ?> 包围
- 每个PHP语句都必须以一个分号(;)结束
- 如果Web页面上有PHP代码,最好将Web服务器上的文件命名为拓展名是.php而不是.html
PHP变量名总是以一个美元符号($)开头
- 变量名长度至少一个字符,第一个字母必须是下划线或字母,后面只能是是数字、字母、下划线
变量名区分大小写
,命令不区分大小写
"."用于连接两个字符串
$_POST
- $_POST是一个特殊的变量,称为超级全局变量,它是一个存储位置集合,用于存储来自Web表单的数据
- $_POST是一个数组,当有人提交表单时,表单中的数据就会存储在$_POST数组中,这个数组的任务就是把数据传送到脚本
echo
echo命令用于将额外的信息作为HTML内容输入到浏览器,在后面加上<br>标记加就会在HTML中加上换行
<html>
<head>
<title>xxxxxx</title>
</head>
<body>
<h2>xxxxx</h2>
<?php
$when_it_happened = $_POST['whenithappened'];
$how_long = $_POST['howlong'];
$alien_description = $_POST['aliendescription'];
$fang_spotted = $_POST['fangspotted'];
$email = $_POST['email'];
echo 'Thanks for submitting the form.<br />';
echo 'You were abducted' . $when_it_happened;
echo ' and were gone for ' . $show_long . '<br />';
echo 'Describe them: ' . $alien_descroption . '<br />';
echo 'Was Fang there?' . $fang_spotted . '<br />';
echo 'Your email address is' . $email;
?>
</body>
</html>
纯文本排版
换行使用 \n ,但必须在双引号中使用
,单引号字符串只支持 \' 和 \\
$msg = “$name was abducted $when_it_happened and was gone for $show_long.\n”
mail函数
mail函数能够发送email消息
mail ($to , $subject , $mag );
三者为必要参数,$to表示发送的email地址,$subject表示消息主题,$msg表示消息体
- 指定email发送者的地址时必须将文本’from’追加在email地址前
mail($to, $subject, $mag, ‘from:’
.
$email);
连接到MYSQL
用PHP脚本插入数据
使用PHP函数与数据库通信
mysqli_connect()
:连接数据库,参数提供服务器位置、用户名、口令
来得到与Mysql数据库交互的许可,另外还要提供数据库名
,与一个特定数据库连接数据库位置可以是域名、IP地址或者localhost
参数名要用单引号括起来
第四个参数可选,可以另外用
mysqli_select_db($连接名,'数据库名');
创建一个SQL查询,并把它作为一个串存储在一个PHP变量中
mysqli_query()
:执行查询,与MySQL数据库服务器通信,向表中增加数据,需要传入第一步创建的连接名和第二部中存放查询的变量名
mysqli_close() : 关闭数据库连接
,传入连接名
die( ) : 如果出问题就发回一个消息,并中止所有工作
<?php
$dbc = mysqli_connect('数据库位置','用户名','口令','数据库名')
or die('Error connecting to MySQL serve.');
$query = "INSERT INTO aliens_abduction (first_name,last_name,when_it_happened,how_long,".
"how_many,alien_description,what_they_did,fang_spotted,other,email)".
"VALUES ('Sally','Jones','3 days ago','1 day','four','green with six tentacles',".
"'We just talked and played with a dog','yes','I may have seen your dog.Contact me.',".
"'sally@gregs-list.net')";
$result = mysqli_query($dbc,$query)
or die ('Error querying database.');
mysqli_close($dbc);
?>
使用PHP获取数据库表的数据
使用
mysqli_fetch_array( )获取查询结果
$row = mysqli_fetch_array($result);
mysqli_fetch_array()函数将一个数据行存储在一个数组中
每次只能获取到查询结果中
一行数据
,反复调用会逐个往下读取
WHILE循环
while(true) {
循环迭代内容;
}
while循环可以调用mysqli_fetch_array()检查结果数据的各行,一次处理一行,直到达到数据的末尾
- 如果mysqli_fetch_array()查询不到结果,就会返回false
while($row= mysqli_fetch_array($result)) {
echo $row['first_name'] . ' ' . $row['last_name'] . ' ' . $row['email'] . '<br/>';
}
现实实际应用
if语句
if(测试条件) {
执行语句;
}
else{
执行语句;
}
- 测试条件中可以比较字符串,根据字母表,
a被认为小于z
0和空字符串会计算相等
验证变量的PHP函数
isset( )函数:测试一个变量是否已经赋值
empty( )函数:确定一个变量是否包含空值(0,空串(' '或" "),false,NULL),包含时返回true
若一个变量不存在,则empty( )会返回true
- 非操作符(!)
- 逻辑与(&&)和逻辑或(||),如果第一个条件结果已经足够,不会再算下一个
可以根据需要开始和结束PHP代码块,在PHP脚本中输出HTML代码
- HTML代码放在
两个<?php ?>之间
引用自身表单
HTMl表单作为PHP脚本的一部分,而该PHP脚本将处理这个表单,那么这个表单就称为自引用表单
将表单动作指向脚本
<form action="sendemail.php" method="POST">
<form>标记的action属性将一个表单与处理该表单的一个脚本相连接,在这里正是包含该表单的同一个sendmai.php脚本
可以利用PHP内置的
超级全局变量$_SERVER['PHP_SELF']
,其中存储了当前脚本的名字,必须使用echo回显输出它的值作为HTML代码的一部分
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
如果表单能够记住上一次提交时输入的正确数据则称为一个粘性表单
可以input标记的value属性设置输入表单域,
用echo从一个PHP变量为value属性生成一个值
<input name=”subject” type=”text” value=”“
<?php
if (isset($_POST['submit'])) { //检查$_POST['submit']的值,如果表单从未提交过,则该变量未设置
$from = 'elmer@makmeelvieis.com';
$subject = $_POST['subject'];
$text = $_POST['elvismail'];
$output_form = false;
if (empty($subject) && empty($text)){
//都没有输入
echo 'You forgot the email subject and body text.<br />';
$output_form = true;
}
if (empty($subject) && (!empty($text))){
//值只输入了text
echo 'You forgot the email subject.<br />';
$output_form = true;
}
if ((!empty($subject)) && empty($text)){
echo 'You forgot the email body text.<br />';
$output_form = true;
}
if ((!empty($subject)) && (!empty($text))) {
//发送邮件
}
}
else {
$output_form = true;
}
if (putput_form) {
?> //结束PHP语句,开始HTML语句
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<label for="subject">Subject of email:</label><br />
<input id="subject" name="subject" type="text" size="30" value="<?php echo $subject; ?>"/><br />
<label for="elvismail">Body of email:</label><br />
<textarea id="elvismail" name="elvisamil" rows="8" cols="40"><?php echo $text ?></textarea><br />
<input type="submit" name="submit" value="Submit"/>
</form>
<?php
}
?>
foreach循环
foreach循环取一个数组,并循环处理数组中的每个元素而无需测试条件或训环计数器
foreach ($customers as $customer) {
echo $customer/执行语句;
};
第一个参数为希望循环处理的数组
第二个参数:指定一个变量,随着循环逐个处理数组中的每一个元素,会将该元素临时存储在这个变量中
循环内部可以用echo访问各个元素或使用执行语句
foreach($_POST['todelete'] as $delete_id) {
$query = "DELETE FROM email_list WHERE id=$delete_id";
mysql_query($dbc,$query)
or die("Error querying database.");
echo '<input type="checkbox" value=" '. $row['id'] . '" name="todelete[]">'
}
上面代码中的tolerate[],方括号会让$_POST创建一个数组
使用存储在文件中的数据
把照片等存储在文件中,在数据表中增加一个文件名的列
用户提交表单时,二进制图像文件上传到服务器,服务器上的一个文件夹接收并存储这个图像文件
$_FILES内置超级全局变量
允许访问上传文件的有关信息:screenshot为input中file对应的name- $_FILES[‘screenshot’][‘name’]:上传文件的文件名
- $_FILES[‘screenshot’][‘type’]:上传文件的类型
- $_FILES[‘screenshot’][‘size’]:上传文件的大小(字节数)
- $_FILES[‘screenshot’][‘tmp_name’]:上传文件在服务器上的临时位置
- $_FILES[‘screenshot’][‘error’]:文件上传的错误码,0表示成功,其他值表示失败
is_file()函数
:用于查看一个文件是否确实存在
filesize()函数
:用于检查并确保文件不是空文件,空文件返回0
move_uploaded_file()函数
:接收一个文件的源位置
和目标位置
,然后负责完成文件移动
move_uploaded_file($_FILES[‘screenshot’][‘tmp_name’],$target);
通常把文件夹建在www中即可
为防止文件名相同,可以在文件名前面加上当前服务器时间
$target = GW_UPLOADPATH . time( ) . $screenshot
define用于创建常量
define ('常量名','常量的值');
<?php
define('GW_UPLOADPATH','images/');
if (isset($_POST['submit]')) {
$name = $_POST['name'];
$score = $_POST['score'];
$screenshot = $_FILES['screenshot']['name'];
if(!empty($name) && !empty($score) && !empty($screenshot)) {
$target = GW_UPLOADPATH . $screenshot;
if(move_uploaded_file($_FILES['screenshot']['tmp_name'],$target) {
$bcd = mysqli_connect('位置','用户名','密码','表名');
$query = "INSERT INTO guitarwars VALUES (0,NOW(),'$name','$score','$screnshot')";
mysqli_query($dbc,$query);
echo '<p>Thanks for adding your new high score!</p>';
echo '<p><strong>Name:</strong>' . $name . '<br />';
echo '<strong>Score:</strong>' . $score . '<br />';
acho '<img src="' . GW_UPLOADPATH . $screenshot . '" alt="Score image"/></p>';
echo '<p><a href="index.php"><< Back to high scored</a></p>';
}
}
}
利用包含文件共享脚本数据
require_once语句负责将一个脚本包含在另一个脚本中
require_once(‘xxxx.php’);
- 如果未找到包含文件,require_once会产生一个错误
- once保证它文件不会被意外包含多次
unlink()函数从服务器删除一个文件,用@以防在文件上传未成功时显示错误报告
@ 能屏蔽掉出错信息
规划管理页面和用户页面
超级全局变量$_GET数组
:脚本的URL可以用于将数据作为一个GET请求传递- GET与POST区别:
POST请求只能从表单发出,而GET请求可以打包为URL
GET通常用于从服务器获取数而不对服务器造成任何影响,而POST适用于那些影响服务器状态的请求,如发送一个改变数据库的INSERT或DELETE语句
GET传递的数据在URL是可见的,而POST数据是不可见的
- 可以在一个脚本里对GET和POST请求做出响应,比如:脚本可以显示确认页面,作为对GET数据的响应,在提交表单时使用POST,但
此时<form action ="脚本名">,不能使用$_SERVER['PHP_SELF'],因为它会包含作为GET通过URL查询串传递的所有数据,要确保没有GET数据
保证应用安全
首部
所有Web页面都需要借助于首部来传递,首部是一个短小的文本信息,包含所请求或传送的特定指令
- 大多数首部由一个名/值对组成,名与值之间用冒号分隔
GET /index.php HTTP/1.1 (第一个首部不是一个名/值对,这是页面的GET请求)
HOST: www.guitarwars.net
User-Agent: Mozilla/5.0......(这个首部指定了发出请求的浏览器)
HTTP/1.1 200 OK (这个首部是服务器的HTTP响应)
content-Type : text/html(这个首部告诉浏览器,页面内容是HTML代码,而不是纯文本)
在PHP中可以利用
header()函数将首部从服务器发送给浏览器的首部
header()函数允许从php脚本创建和发送首部
这个函数必须在
向浏览器发送任何具体内容之前调用
,在首部之前即使只是发送一个空格或字符,浏览器也会报错,所以header()函数要放在PHP脚本的所有PHP代码之前
header(‘Content-Type:text/html’);
需要两个特定的首部来请求一个Web页面的认证
这个首部让浏览器知道用户没有得到查看页面的授权
HTTP/1.1 401 Unauthorized
这个首部要求浏览器尝试提示用户输入一个用户名和口令来进行验证
WWW-Authenticate: Basic realm= "Guitar Wars"
(Basic realm(基本域)用于唯一标识这个特定认证的一个短语,它会出现在认证窗口)
基本域定义了一个特定用户名和口令所保护的安全区,一旦输入对应一个给定域的用户名和口令,后续不再需要认证
- 如果认证失败,使用PHP的
exit()函数来显示一个消息,并立即退出脚本
exit (' <h2>Guitar Wars </h2>Sorry, you must enter a valid'. 'user name and password to access this page.');
$_SERVER超级全局变量存储了输入到验证窗口的用户名还有密码
$_SERVER['PHP_AUTH_USER'/'PHP_AUTH_PW']
其他一些首部
1.
<?php
header('Location: http://www.guitarwars.net/about.php');
?>
这个首部称为一个位置首部,将当前页面重定向到另一个网站上
<?php
header('Refresh: 5;url=http://www.guitarwars.net/about.php');
echo 'In 5 seconds you will be taken to the About page.';
?>
这个首部称为刷新首部,会在经过一段时间后刷新页面
3.
<?php
header('Content-Type:text/plain');
echo 'This <strong>text</strong> won't actually be bold.';
?>
这个首部称为内容型首部,输出到浏览器的文本完全原样显示而无任何特殊的格式化
<?php
//在脚本最前面将用户名和口令存储在变量中
$username = 'rock';
$password = 'roll';
//利用$_SERVER超级全局变量可以访问用户在认证窗口输入的用户名和口令
if (!isset($_SERVER['PHP_AUTH_USER'])||!isset($_SERVER['PHP_AUTH_PW'])
||($_SERVER['PHP_AUTH_USER']!=$username)||
($_SERVER['PHP_AUTH_PW']!=$password)) {
//两个head函数调用会将这些首部发送到浏览器
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="Guitar Wars" ');
exit('<h2>Guitar Wars</h2>Sorry,you must enter a valid user name and password to' .
'access this page.');
}
?>
//只有在首部已经发送并得到处理之后,才可能向浏览器传送HTML代码
<html>
...
</html>
避免SQL注入
- PHP内置函数
trim( )
,能够去除表单数据的前导或末尾的空格
mysqli_real_escape_string()
:能够对特殊字符进行转义,从而无法影响SQL查询
$name = mysqli_real_escape_string($dbc, trim($_POST['name']));
$score = mysqli_real_escape_string($dbc, trim($_POST['score']));
$screnshot = mysqli_real_escape_string($dbc, trim($_FILES['screenshot']['name']));
mysqli_real_escape_string()被认为是一种数据库函数,
需要传入一个数据库连接位置
- PHP
is_numeric( )函数
:如果传入的是数字,返回true,否则返回falseis_numeric(‘$score’)
构建个性化的Web应用
PHP加密函数
shal( ) 和md5( )
mysqli_num_rows()用于返回相应参数的行的数量
用户注册
如果用户输入的用户名已经存在,使用$username=””清空$usename变量
使用HTTP认证在浏览器关闭或用户手工清除HTTP认证之前,用户永远不会注销,HTTP认证将数据永久存储在客户端,但工作结束时不允许将其删除
Cookie
cookie是浏览器存储在用户计算机上的一小段数据,在关闭浏览器之后仍然存在,但可以根据需要删除,可以跨脚本、多个浏览器存在
cookie可以有一个到期日期,达到到期日期之后,cookie就会被销毁,如果创建一个没有到期日期的cookie,它会在浏览器关闭时被销毁
- 用PHP使用cookie
PHP通过一个名为setcookie()
函数和一个名为 $_COOKIE
的超级全局变量提供对cookie的访问;setcookie()函数用于设置一个cookie的值以及一个可选的到期日期
,$_COOKIE用于获取一个cookie的值
setcookie('cookie的名','cookie的值',(可选的参数,到期日期));
cookie总是作为文本存储,所以即使用户的值一个数字,也要使用单引号('')
$_COOKIE('cookie的名')
:获取相对应的的cookie的值
$_SERVER['HTTP_HOST']
:返回服务器地址dirname( )
:返回去掉文件名的目录名- 要删除一个cookie,只需要把时间设置为
过去的一个时间(以秒为单位)
setcookie('username','sidneyk',time()+/-(60*60*8));
<?php
require_once('connectvars.php');
//错误消息存储在一个变量中
$error_msg = "";
//检查use_id cookie,查看用户是否登录
if (!isset($_COOKIE['user_id'])){
//如果没有登录,检查是否已经提交登录数据
if(isset($_POST['submit'])){
//连接数据库
$dbc = mysql_connect(地址,用户名,密码,数据表名)
$user_username = mysqli_real_escape_string($dbc,trim($_POST['username']));
$user_password = mysqli_real_escape_string($dbc,trim($_POST['password']));
if (!empty($user_username) && !empty($user_password)) {
$query = "SELECT user_id,username FROM 表名 WHERE username = '$user_username' AND " .
"password = SHA('$user_password')";
$data = mysqli_query($dbc, $query);
if(mysqli_num_rows($data) ` 1) {
$row = mysqli_fetch_array($data);
// 通过设置user_id和username cookie完成用户登录
setcookie('user_id',$row['user_id']);
setcookie('username',$row['username']);
$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELE']) . '/index.php';
//登陆成功时将用户重新定向到主页
header('Location:' . $home_url);
}
else {
$error_msg = 'Sorry,you must enter a valid username and password to log in.';
}
}
else{
$error_msg = 'Sorry,you must enter your username and psaaword to log in.';
}
}
}
?>
<html>
<head>
<title>Mismatch - Log In</title>
<link rel="styleshet" type="text/css" href="style.css" />
</head>
<body>
<h3>Mismatch - Log In</h3>
<?php
//如果用户此时仍未登录,继续提醒错误消息
if (empty($_COOKIE['user_id'])){
echo '<p class = "error">' . $error_msg . '</p>';
?>
//这是表单内容
<form method ="post" action ="<?php echo $_SERVER['PHP_SELF'];?>">
<fieldset>
<legend>Log In</legend>
<label for ="username">Username:</label>
<input type ="text" id="username" name="username"
value="<?php if (!empty($user_username)) echo $user_username; ?>" /><br />
<label for="password">Password:</label>
<input type="text" id="password" name="password"/>
</fieldset>
<input type="submit" value="Log In" name="submit" />
</form>
<?php
}
else{
echo('<p class="login">You are logged in as' . $_COOKIE['username'] . '.</p>');
}
</body>
</html>
<?php
//只有登陆了才能注销用户
if(isset($_COOKIE['user_id']) {
setcookie('user_id','',time()-3600);
setcookie('username','',time()-3600);
}
//重定向到主页,构造一个绝对URL
$home_url = 'http://' . $_SERVER['HTTP_POST'] . dirname($_SERVER['PHP_SELF']). '/index.php';
header('Location:' .$home_url);
?>
会话
会话允许将一小段数据持久的存储在服务器上,而不依赖于客户端,由于都存储在服务器上,更加安全可靠
可以在任意时刻删除一个会话变量
会话往往在用户关闭浏览器时就结束,会自动消除会话变量
PHP session_start()函数开始一个会话,并允许在会话变量中存储数据
PHP session_destroy()函数结束一个会话
用$_SESSION超级变量设置会话变量
$_SESSION[‘username’]=’要存储的值’;(要存储的值直接赋给$_SESSION超级全局变量)
删除会话变量
使用session_destroy()结束会话时,不会销毁会话变量,如果要在关闭浏览器之前清空会话变量,`把$_SESSION超级全局变量设置成一个空数组$_SESSION = array( );
这个代码会清除当前会话中的所有会话变量如果浏览器启用cookie,会话在后台实际上会使用cookie临时存储会话的ID,所以要关闭会话,还要删除浏览器自动创建的cookie,如果会话使用cookie来帮助记住会话ID,这个ID会存储在以会话命名的一个cookie中
cookie的名可以使用
session_name()函数得到
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time()-3600);
}
- 如果没启用cookie,则通过每个页面的URL传递ID
在页面中同时使用cookie和会话
$_SESSION['user_id']=$row['user_id'];
setcookie('user_id',$row['user_id'],time()+(60*60*24*30));
$_SESSION = array();
setcookie(session_name(),'',time()-3600);
setcookie('user_id',$row['user_id'],time()-3600);
$_SESSION['user_id'] = $_COOKIE['user_id'];
消除重复代码
- 模板:一个包含文件的集合
收获数据
模式:对数据库中的数据(表和列)以及其他相关对象和它们如何连接的描述称为一个模式
array_push()函数
:将一个新元素追加到数组后面
,是数组大小增加1array_push($topicIDs,$row[‘topic_id’]);
三元运算符:( 条件 ?A:B )
for循环
count()函数返回数组中元素的个数
搜索MySQL数据库表的一行的结果存储在一个数组中,则某一行的某一列的值表示为:
$数组名[某一行i][ 某一列的列名]
array_slice():用于抽取函数的一片,第一个参数指定数组,第二个参数指定从哪个元素开始,第三个指定个数(默认到结尾)
array_slice($a,1,3)
:从第二个元素开始,返回三个
串与定制函数
explode()函数
:可以将一个串分解为单独的子串数组,explode()函数根据一个指定符号将一个串分解为一个子串数组,第一个参数指定由什么符号,可以指定一个或多个,第二个参数为文本
$search_words = explode(‘ ‘,’Tipper Cow’) ;
implode()函数
:取一个数组,并把这些数组连接起来,可以在连接中间指定一个定界符,各串之间会增加这个符号$where_clause = implode(‘OR’ ,$where_list);
.
=:这个运算符会把一个串连接到另一个,类似于+=[ ]
:与array_push作用相当,会把新增元素增加到数组末尾
$search_array = "SELECT * FROM riskyjobs";
$where_list = array();
$user_search = $_GET['usersearch'];
$search_words = explode(' ',$user_search);
foreach($search_words as $word){
$where_list[] = "description LIKE '%$word%'";
}
$where_clause = implode('OR',$where_list);
if (!empty($where_clause)) {
$search_query .= "WHERE $where_clause";
}
str_replace()函数
:能够将指定串中某个字符替换为指定字符,第一个参数指定希望替换掉的子串,第二个参数指定要取代它的串,第三个参数指定要修改的字符串
substr()函数
:抽取串的一部分,第一个参数为所要抽取的串,第二个参数指定从哪开始,第三个参数指定返回的串的字符个数(默认取到末尾)
substr($job_desc,-4,3) 负数表示从倒数第几个开始
switch语句,包好一系列case标签,与c一样
定制函数
自定义函数以function开头,之后加函数名,参数,用大括号加函数定义
function replace_commas($str) {
$new_str = str_replace(',',' ',$str);
return $new_str;
}
分页技术
query()函数
:将一个数向上取整为最接近的整数
正则表达式
正则表达式是一种规则,用于匹配一个或多个串中的模式,所有正则表达式以斜线开头和结尾
^表示从串的开始处,以指定字符开头
$表示串必须结束
\d代表数字,表示串中该位置必须是一个数字
,用d{10}表示十个数字
/^\d\d\d\d\d\d\d\d\d\d$/
\w代表任何字母数字字符
\s代表空白符,包括制表符、换行符、回车、空格等
. 表示除换行符以外的任意一个字符
量词
大括号相当于一个量词
- {10}:表示一个字符必须出现10次;
- {min,max}:分别为两个数字,
指定最少出现次数和最多出现次数
- +:
前面
的字符或元字符必须`重复出现一次或多次 - ?:
前面
的字符或元字符必须出现1次或者根本不出现
- * :
字符或元字符可以出现1次或者多次,或者根本不出现
应用量词的部分用括号包围
字符类
用中括号表示范围
[0-2]:表示只能是0.1.2三个数
[A-D]:表示只能是ABCD
在一个字符类中,^表示‘不匹配’
[^b-f] : 匹配除bcdef以外的所有字符
- 可以在正则表达式中
使用 | 来指示一组选项,可以从中选择
preg_match()用于取一个正则表达式和一个文本串,如果没有匹配就返回false,匹配返回true
$regex = '/^\d{3}-\d{2}-\d{4}$/';
$my_string = '555-02-9983';
preg_match($regex,$my_string);
preg_match('/^\d{3}-\d{2}-\d{4}$/','555-02-9983');
preg_repale(不想要的字符,想要替换的字符,要查找的字符串)
$new_year = preg_replace(‘/200[0-9]/‘,’2010’,’The year is 2009.’);
checkdnsrr()函数用来检查一个域是否合法
验证码机制
rand()函数在两个参数指定的范围内返回一个随机数
chr()函数将一个数字ASCII字符码转换成为一个真正的字符
$pass_phrase = "";
for ($i=0;$i<CAPTCHA_NUMCHARS;$i++) {
$pass_phrase .= chr(rand(97,122));
}
GD图像函数
imagecreatetruecolor()
:在内存中创建一个空图像,有两个参数,分别为宽度和高度,返回一个图像标识符,其他绘制函数都需要这个标识符才能在具体图像上完成绘制imagecolorallocate()
:使用这个函数分配颜色,第一个参数为图像标识符,后面三个函数表示RGB颜色值的三个分量,返回值是一个颜色标识符,可以在其他绘制函数中用来控制所用的颜色imagesetpixel()
: 在图像中一个指定坐标上绘制一个像素,坐标的左上角为0.0,向右向下递增imageline()
:在函数的两个坐标之间画一条连线,坐标是相对于图像的左上角指定的,直线采用作为函数最后一个参数传入的颜色来绘制imagerectangle()
:用某种指定的颜色从一个点开始到另一个点结束绘制一个矩形imagefilledrectangle()
:这个函数绘制一个矩形,内部用指定的颜色填充imageellipse()
:用于绘制圆和椭圆,接收一个中心点和一个宽度和高度作为参数,圆或椭圆的轮廓颜色做为函数的最后一个参数传入,第一个参数指定标识符,第二、三个为宽度和高度,第四、五个为中心点坐标imagefilledellipse()
:绘制圆或椭圆同时填充圆或椭圆的内部颜色imagefilledellipse($img,0,0,320,240,$color);
imagepng()
:完成图像绘制时,调用这个函数把它直接传到Web浏览器,或者输出到服务器上的一个文件,不论哪种方式,最终结果都是有个图像,可以利用HTML<img>标记在一个Web界面里,如果没有使用第二个参数指定文件名,那么函数会在内存中升成一个图像,通过一个首部传回浏览器imagedestroy()
:使用GD库处理图像需要占用系统内存,这个函数负责在处理完图像后进行清理imagestring()
:采用指定的颜色使用PHP的内置字体绘制一个文本串,除了图像资源标识符,还要为这个函数传入字体的大小,这是一个介于1到5的数字,另外要提供串左上角的坐标以及串本身,最后提供颜色imagestring($img,3,75,75,’Sample text’,$color);
imagestringup()
:它会垂直绘制文本,就好像逆时针旋转90°imagettftext()
:在服务器上放置一个Truetype字体文件,然后该文件作为最后一个参数,可以指定文本字体imagettftext($img,字体大小18,字体角度(指定为逆时针),文本左下角xy坐标,$text_color,字体文件名,具体文本);
shal()
:加密函数
<?php
define('CAPTCHA_WIDTH',100);
define('CAPTCHA_HEIGHT',25);
$img = imagecreatetruecolor(CAPTCHA_WODTH,CAPTCHA_HEIGHT);
$gb_color = imagecolorallocate($img,255,255,255);
$text_color = imagecolorallcate($img,0,0,0);
$graphic_color = imagecolorallocate($img,64,64,64);
imagefilledrectangle($img,0,0,CAPTCHA_WIDTH,CAPCHA_HEIGHT,$bg_color);
for ($i=0;$i<5;$i++) {
imageline($img,0,rand() % CAPTCHA_HEIGHT,CAPTCHA_WIDTH,
rand() % CAPTCHA_HEIGHT,$graphic_color);
}
for ($i=0;$i<50;$i++) {
imagesetpixel($img,rand() % CAPTCHA_WIDTH,
rand() % CAPTCHA_HEIGHT,$graphic_color);
}
imagettftext($img,18,0,5,CAPTCHA_HEIGHT-5,'文件名',$pass_phrase)
header("Content-type:image/png");
imagepng($img);
?>
基础知识点补充
- 函数:在函数内部不能调用外部定义的变量,除非作为参数传递,或者是在函数内使用
global 变量名
- 数组
- 一些和数组相关的函数
each()和list(): 在遍历一个数组并返回其键和值的应用中,两个经常一起出现
<?php
foreach ($characters as $c) {
whlie (list($k,$v) = each($c)){
echo "$k...$v<br/>";
}
}
?>
/*将输出数组的全部键值对*/
3. 使用PHP格式化字符串
- printf()函数
(1) 填充指示符填充输出:可以使用0或者空格,使用其他的要在指定字符前面加上'
<?php
printf("%04d",36);//printfs "0036"
printf("% 4d",36);//printfs " 36"
printf("%'x4d",36);//printfs "xx36"
?>
(2) 参数转换:用于指定先输出哪个参数,%后面紧跟指定第几个参数,在加上\$
,后面加上格式指定
<?php
printf("%02d/%02d/%d",24,6,2018);//printfs "24/6/2018"
/*使用参数转换*/
printf("%2\$02d/%1\$02d/%3\$d",24,6,2018);//printfs "6/24/2018"
?>
- sprintf():输出的同时返回输出的内容
- PHP中的字符串操作函数
- strstr(“被查找的字符串”,”要查找的字符”)
若没有要找的子字符串,返回false,否则返回以查找的字符串开始的一部分,
区分大小写
- substr(“源字符串”,”开始索引”,”(可选参数)返回字符串长度的整数”)
提取字符串中的一部分,若以负数作为第二个参数,将从末尾开始计算,
不区分大小写
- strpos(“源字符串”,”查找的子字符串”,”(可选参数)从哪开始找的索引”)
若没用找到,返回false,否则返回查找到的索引值,注意:判断时使用===,防止返回的索引也是0
<?php
$a = "abcdefghijklmn";
if(strpos($a,"abc") === 0){
echo "等同运算符,只有左右两边操作数相等并且类型相同时才算等于";
}
?>
- strtok(“源字符串”,”分隔字符串的分隔符”)
分解一个字符串,在第一次调用后,源字符串会放入缓存,第二次调用
只需要传分隔符
,它会从上一次的位置继续往下找,当到达末尾时返回false
<?php
$test = "http:xiao-ming9.github.io";
$delims = "-.";
$word = strtok($test,$delims);
while(is_string($word)){
//避免当某一行中包含两个分隔符,当遇到分隔符中的第一个的时候,返回空字符串
if($word){
echo $word."<br/>";
}
$word = strtok($delims);//不再需要传入源字符串
}
?>
- substr_replace(“要修改的字符串”,”添加的文本”,”开始索引”,”(可选参数)长度”)
替换字符串中的一部分,返回修改后的整个字符串
<?php
$membership = "zm10cyh";
$mwmbership = substr_replace($menbership,"12",2,2);
echo $menbership;//sprints "zm12cyh";
?>
- str_replace(“查找字符串”,”替换字符串”,”子字符串”)
替换字符串中指定内容,参数可以是数组
- strtoupper():把全部转化成大写
- strtolower():把全部转化成小写
- ucwords():把每个单词第一个字符转成大写
- ucfirst():把字符串的第一个字母转化成大写
- wordwrap(“源字符串”,”(可选参数)每行最大字符数”,”(可选参数)用来表示一行结束的字符”,”(可选参数)一个正整数”)
在字符串指定位置换行,默认每75个分一行,默认不会断开单词,第4个参数表示用正整数强制断开
- nl2br():把字符串的换行符转换成HTML分段
- explode(“分隔标记”,”源字符串”,”(可选参数)最多分为多少部分”)
返回一个数组
4. PHP中的日期和时间函数
- time()获取单前的时间戳,返回从GMT 1970年1月1日开始流逝的秒数
- getdate():转换时间戳,省略参数默认返回time()当前时间戳,返回数组,键为一下列表
键 | 说明
—|—|—
sceonds | 一分钟里里已经过去的秒数(059)59)
minutes | 一小时中已经过去的分钟数(0
hours | 一天中的小时数(023)31)
mday | 一月中的天数(1
wday | 一周中的天数(06)12)
mon | 一年中的月数(1
year | 年份(四位数)
yday | 一年中的天数(0~365)
weekday | 星期几(名字)
month | 一年中的月份(名字)
0 | 时间戳
<?php
$date_array = getdate();
foreach ($date_array as $key => $value){
echo "$key => $value\n";
}
echo "<p>Today's date: ".$date_array['mon'] . "/".$date_array['mday']."/".
$date_array['year']."</p>";
?>
- date():转换一个时间戳
date的格式化代码
<?php
$time = time();
echo date("m/d/y G:i:s e",$time);
echo "<br>";
echo "Today is ";
/*对于要输出的字母使用转义符,特殊的比如换行符,制表符等要用\\*/
echo date("js \of F Y ,\a\\t g:ia \i\\n e",$time)
?>
"06/24/2018 17:13:30 Chian/Shanghai
Today is 24th of June 2018, at 5:13pm in Chian/Shanghai"
- mktime(小时,分钟,秒,月份,日期,年份):创建时间戳