当前位置 : 主页 > 手机开发 > harmonyos >

Web_PHP_基础高级语法概述;

来源:互联网 收集:自由互联 发布时间:2023-08-26
一、基础教程1、php简介PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名),是一种服务器端的脚本语言,类似 ASP,在服务器上执行,支持很多数据库(MySQL,Oracle等


一、基础教程
1、php简介
PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名),是一种服务器端的脚本语言,类似 ASP,在服务器上执行,支持很多数据库(MySQL,Oracle等),属于开源软件项目;

2、什么是 PHP 文件?
PHP 文件可包含文本、HTML 标签以及脚本,她向浏览器返回纯粹的 HTML文件,文件后缀是 ".php"、".php3" 或 ".phtml";

3、什么是 MySQL?
MySQL 是一种数据库服务器,支持标准的 SQL,可在许多平台上编译,也是开源软件项目;

4、PHP + MySQL
PHP 与 MySQL 的组合是跨平台的(意思是您可以在 Windows 环境进行开发,而在 Unix 平台上提供服务);

5、为什么要使用 PHP?
PHP 可在不同的平台上运行(Windows、Linux、Unix),与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS 等),而且易于学习,并可高效地运行在服务器端,可从官方的 PHP 资源免费下载:www.php.net;

6、从何处开始?
在 Windows 或者 Linux 机器上安装 Apache 服务器、PHP以及MySQL。当然在这里推荐使用XAMPP软件集合包。

7、下载
PHP5安装教程:http://www.php.net/manual/en/install.php;
下载PHP:http://www.php.net/downloads.php;
下载MySQL:http://www.mysql.com/downloads/;
下载 Apache:http://httpd.apache.org/download.cgi;

一、语法
说明:您无法在浏览器中通过查看源文档的方式来查看 PHP 的源代码 - 您只能看到 PHP 文件的输出,即纯粹的 HTML。这是因为在结果返回浏览器之前,脚本就已经在服务器执行。

1、基本语法
(1)、PHP脚本块
PHP 的脚本块以 <?php 开始,以 ?> 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。当然,在支持简写的服务器上,您可以使用 <? 和 ?> 来开始和结束脚本块。不过,为了达到最好的兼容性,我们推荐您使用标准形式 (<?php),而不是简写形式。
(2)、PHP文件
PHP 文件通常会包含 HTML 标签,就像一个 HTML 文件,以及一些 PHP 脚本代码。
示例:输出文本 "Hello World"
<html>
<body>

<?php
// 有两种通过 PHP 来输出文本的基础指令:echo 和 print;
echo "Hello World";
?>

</body>
</html>
说明:PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。有两种通过 PHP 来输出文本的基础指令:echo 和 print。

2、PHP注释
在 PHP 中,我们使用 // 来编写单行注释,或者使用 /* 和 */ 来编写大的注释块。
示例:单行、多行注释,
<html>
<body>

<?php

//This is a comment

/*
This is
a comment
block
*/

?>

</body>
</html>

3、PHP变量:变量用于存储值,比如数字、字符串、数组或函数的结果,这样我们就可以在脚本中多次使用它们;
<语言类型>:PHP 是一门松散类型的语言(Loosely Typed Language);在 PHP 中,不需要在设置变量之前声明该变量;PHP 会自动地把变量转换为正确的数据类型;在强类型的编程语言中,您必须在使用前声明变量的类型和名称;在 PHP 中,变量会在使用时被自动声明;
<语法>:PHP 中的所有变量都是以 $ 符号开始的,如$var_name = value;
<变量命名规则>:变量名必须以字母或下划线 "_" 开头;变量名只能包含字母数字字符以及下划线;变量名不能包含空格,如果变量名由多个单词组成,那么应该使用下划线进行分隔(比如 $my_string),或者以大写字母开头(比如 $myString);

4、PHP 字符串
<说明>:字符串变量用于存储并处理文本片段;字符串变量用于包含字符串的值;
<操作>:A、并置运算符(Concatenation Operator),在 PHP 中,只有一个字符串运算符,并置运算符 (.) 用于把两个字符串值连接起来;B、strlen()函数,用于计算字符串的长度;C、strpos()函数,用于在字符串内检索一段字符串或一个字符;如果在字符串中找到匹配,该函数会返回第一个匹配的位置,如果未找到匹配,则返回 FALSE,如<?php echo strpos("Hello world!","world");?> ;

5、PHP 运算符
<说明>:运算符用于对值进行运算;
<算数运算符>:+(Addition)、-(Subtraction)、*(Multiplication)、/(Division)、%(Modulus (division remainder))、++(Increment)、--(Decrement);
<赋值运算符>:=、+=、-=、*=、/=、.=、%=;
<比较运算符>:==、!=、>、<、>=、<=;
<逻辑运算符>:&&(and)、||(or)、!(not);

6、PHP If...Else 语句
<说明>:if、elseif 以及 else 语句用于执行基于不同条件的不同动作;
<语法>:
if (condition){
  code to be executed if condition is true;
}
elseif (condition){
      code to be executed if condition is true;
}
else{
  code to be executed if condition is false;
}

7、PHP Switch 语句
<说明>:PHP 中的 Switch 语句用于执行基于多个不同条件的不同动作;使用 Switch 语句可以避免冗长的 if..elseif..else 代码块;
<语法>:
switch (expression)
{
case label1:
  code to be executed if expression = label1;
  break;  
case label2:
  code to be executed if expression = label2;
  break;
default:
  code to be executed
  if expression is different
  from both label1 and label2;
}
<工作原理>:对表达式(通常是变量)进行一次计算;把表达式的值与结构中 case 的值进行比较;如果存在匹配,则执行与 case 关联的代码;代码执行后,break 语句阻止代码跳入下一个 case 中继续执行;如果没有 case 为真,则使用 default 语句;

8、PHP 数组
<说明>:数组能够在单独的变量名中存储一个或多个值;
<类型>:A、值数组:带有数字 ID 键(index)的数组;B、关联数组:数组中的每个 ID 键关联一个值;C、多维数组:包含一个或多个数组的数组;
<数值数组>:数值数组存储的每个元素都带有一个数字 ID 键(也就是通常说的数组下标(index));
示例:
$names = array("Peter","Quagmire","Joe");
或者
$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";
<关联数组>:采用我们熟知的键值对形式,关联数组,它的每个 ID 键(这里不是指数组下标index)都关联一个值;在存储有关具体命名的值的数据时,使用数值数组不是最好的做法;通过关联数组,我们可以把值作为键,并向它们赋值;
示例:使用关联数组把年龄分配给不同的人;
$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);
或者
$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";

9、多维数组
<说明>:在多维数组中,主数组中的每个元素也是一个数组。在子数组中的每个元素也可以是数组,以此类推;
<示例>:
$families = array
(
  "Griffin"=>array
  (
  "Peter",
  "Lois",
  "Megan"
  ),
  "Quagmire"=>array
  (
  "Glenn"
  ),
  "Brown"=>array
  (
  "Cleveland",
  "Loretta",
  "Junior"
  )
);
如果输出这个数组的话,应该类似这样:
Array
(
[Griffin] => Array
  (
  [0] => Peter
  [1] => Lois
  [2] => Megan
  )
[Quagmire] => Array
  (
  [0] => Glenn
  )
[Brown] => Array
  (
  [0] => Cleveland
  [1] => Loretta
  [2] => Junior
  )
)

10、PHP 循环
<说明>:PHP 中的循环语句用于执行相同的代码块指定的次数;
(1)、while循环:只要指定的条件成立,则循环执行代码块;
<语法>:
while (condition){
    code to be executed;
}
<示例>:
<html>
<body>
<?php
$i=1;
while($i<=5)
  {
  echo "The number is " . $i . "<br />";
  $i++;
  }
?>
</body>
</html>
(2)、do...while循环:首先执行一次代码块,然后在指定的条件成立时重复这个循环;
<语法>:
do
{
code to be executed;
}
while (condition);
<示例>:
<html>
<body>
<?php
$i=0;
do
  {
  $i++;
  echo "The number is " . $i . "<br />";
  }
while ($i<5);
?>
</body>
</html>
(3)、for循环:循环执行代码块指定的次数;
<语法>:
for (initialization; condition; increment)
{
  code to be executed;
}
<示例>:
<html>
<body>
<?php
for ($i=1; $i<=5; $i++)
{
  echo "Hello World!<br />";
}
?>
</body>
</html>
(4)、foreach:根据数组中每个元素来循环代码块;通常用于循环遍历数组,每进行一次循环,当前数组元素的值就会被赋值给 value 变量(数组指针会逐一地移动) - 以此类推;
<语法>:
foreach (array as value)
{
    code to be executed;
}
<示例>:
<html>
<body>
<?php
$arr=array("one", "two", "three");

foreach ($arr as $value)
{
  echo "Value: " . $value . "<br />";
}
?>
</body>
</html>

11、PHP 函数
<引言>:PHP 的真正威力源自于它的函数;在 PHP 中,提供了超过 700 个内建的函数;
<说明>:函数是一种可以在任何被需要的时候执行的代码块;
<创建 PHP 函数>:所有的函数都使用关键词 "function()" 来开始;命名函数 - 函数的名称应该提示出它的功能,函数名称以字母或下划线开头;添加 "{" - 开口的花括号之后的部分是函数的代码;插入函数代码;添加一个 "}" - 函数通过关闭花括号来结束;
示例:
<html>
<body>

<?php
function add($x,$y)
  {
  $total = $x + $y;
  return $total;
  }

echo "1 + 16 = " . add(1,16);
?>

</body>
</html>

12、PHP 表单和用户输入
<说明>:PHP 的 $_GET 和 $_POST 用于检索表单中的值,比如用户输入;
<示例>:
HTML页面:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
welcome.php页面:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.
</body>
</html>
<表单验证>:应该在任何可能的时候对用户输入进行验证。客户端的验证速度更快,并且可以减轻服务器的负载;不过,任何流量很高以至于不得不担心服务器资源的站点,也有必要担心站点的安全性。如果表单访问的是数据库,就非常有必要采用服务器端的验证;在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误;

13、PHP $_GET
<说明>:$_GET 变量用于收集来自 method="get" 的表单中的值;
<$_GET 变量>:$_GET 变量是一个数组,内容是由 HTTP GET 方法发送的变量名称和值;$_GET 变量用于收集来自 method="get" 的表单中的值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符);
<参数URL>:类似http://www.w3school.com.cn/welcome.php?name=Peter&age=37;
<为什么使用 $_GET?>:在使用 $_GET 变量时,所有的变量名和值都会显示在 URL 中。所以在发送密码或其他敏感信息时,不应该使用这个方法;不过,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面;在某些情况下,这是很有用的;HTTP GET 方法不适合大型的变量值;值是不能超过 100 个字符的;
<$_REQUEST 变量>:PHP 的 $_REQUEST 变量包含了 $_GET, $_POST 以及 $_COOKIE 的内容;PHP 的 $_REQUEST 变量可用来取得通过 GET 和 POST 方法发送的表单数据的结果;

14、PHP $_POST
(1)、说明:$_POST 变量用于收集来自 method="post" 的表单中的值;
(2)、$_POST 变量:$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值;$_POST 变量用于收集来自 method="post" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制;
(3)、为什么使用 $_POST?通过 HTTP POST 发送的变量不会显示在 URL 中;变量没有长度限制;不过,由于变量不显示在 URL 中,所以无法把页面加入书签;
(4)、$_REQUEST 变量:PHP 的 $_REQUEST 变量包含了 $_GET, $_POST 以及 $_COOKIE 的内容;PHP 的 $_REQUEST 变量可用来取得通过 GET 和 POST 方法发送的表单数据的结果;

二、高级教程
1、PHP Date()日期:PHP 的 date() 函数用于格式化时间或日期,它能把时间戳格式化为可读性更好的日期和时间;
(1)、语法:date(format,timestamp);参数format必需,规定时间戳的格式;timestamp可选,规定时间戳,默认是当前的日期和时间;
(2)、什么是时间戳(Timestamp)?时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数。它也被称为 Unix 时间戳(Unix Timestamp);
(3)、格式化日期:date() 函数的第一个参数规定了如何格式化日期/时间。它使用字母来表示日期和时间的格式。这里列出了一些可用的字母,d - 月中的天 (01-31);m - 当前月,以数字计 (01-12);Y - 当前的年(四位数);可以在字母之间插入其他字符,比如 "/"、"." 或者 "-",这样就可以增加附加格式;
示例:
<?php
echo date("Y/m/d");
echo "<br />";
echo date("Y.m.d");
echo "<br />";
echo date("Y-m-d");
?>
(4)、添加时间戳:date() 函数的第二个参数规定了一个时间戳。此参数是可选的。如果您没有提供时间戳,当前的时间将被使用;在我们的例子中,我们将使用 mktime() 函数为明天创建一个时间戳;mktime() 函数可为指定的日期返回 Unix 时间戳;
示例:获取明天时间
mktime(hour,minute,second,month,day,year,is_dst);// mktime函数产出时间戳来产出日期;
<?php
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "明天是 ".date("Y/m/d", $tomorrow);
?>

2、PHP Include 文件:服务器端包含 (SSI_Server Side Include) 用于创建可在多个页面重复使用的函数、页眉、页脚或元素;
(1)、PHP include 和 require 语句
在 PHP 中,您能够在服务器执行 PHP 文件之前把该文件插入另一个 PHP 文件中;include 和 require 语句用于在执行流中向其他文件插入有用的的代码;include 和 require 很相似,除了在错误处理方面的差异:require 会产生致命错误 (E_COMPILE_ERROR),并停止脚本;include 只会产生警告 (E_WARNING),脚本将继续;因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下;包含文件省去了大量的工作。这意味着您可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可;
(2)、语法:include 'filename';或者require 'filename';
(3)示例:应用标准菜单文件;
"menu.php"菜单文件:
echo '<a href="/default.php">Home</a>
<a href="/tutorials.php">Tutorials</a>
<a href="/references.php">References</a>
<a href="/examples.php">Examples</a>
<a href="/about.php">About Us</a>
<a href="/contact.php">Contact Us</a>';
HTML页面:
<html>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>Welcome to my home page.</h1>
<p>Some text.</p>
</body>
</html>
(4)、引用变量文件
变量文件:
<?php
$color='red';
$car='BMW';
?>
页面调用:
<html>
<body>
<h1>Welcome to my home page.</h1>
<?php include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>

3、PHP 文件处理
(1)、打开文件:
fopen() 函数用于在 PHP 中打开文件,此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:r只读,在文件的开头开始;r+读/写,在文件的开头开始;w只写,打开并清空文件的内容,如果文件不存在,则创建新文件;w+ 读/写,打开并清空文件的内容,如果文件不存在,则创建新文件;a追加,打开并向文件的末端进行写操作,如果文件不存在,则创建新文件;a+读/追加,通过向文件末端写内容,来保持文件内容;x只写,创建新文件,如果文件已存在,则返回 FALSE;x+读/写,创建新文件,如果文件已存在,则返回 FALSE 和一个错误;切记,如果 fopen() 无法打开指定文件,则返回 0 (false)。
示例:
<html>
<body>
<?php
// exit为推出程序;
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
(2)、关闭文件:fclose() 函数用于关闭打开的文件;
示例:
<?php
$file = fopen("test.txt","r");
//some code to be executed
fclose($file);
?>
(3)、检测 End-of-file
feof() 函数检测是否已达到文件的末端 (EOF);在循环遍历未知长度的数据时,feof() 函数很有用;切记,在 w 、a 以及 x 模式,您无法读取打开的文件!
示例:if (feof($file)) echo "End of file";
(4)、逐行读取文件
fgets() 函数用于从文件中逐行读取文件,切记,在调用该函数之后,文件指针会移动到下一行;
示例:
<?php
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file))
  {
  echo fgets($file). "<br />";
  }
fclose($file);
?>
(5)、逐字符读取文件
fgetc() 函数用于从文件逐字符地读取文件;切记,在调用该函数之后,文件指针会移动到下一个字符;

4、PHP 文件上传
说明:通过 PHP,可以把文件上传到服务器;
(1)、创建文件上传表单:允许用户从表单上传文件是非常有用的;
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
解说:enctype 属性,规定了在提交表单时要使用哪种内容类型,在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data";type="file" 属性,规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮;切记,允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作;
(2)、创建上传脚本:
"upload_file.php" 文件含有供上传文件的代码:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  }
?>
解说:通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件;
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
    $_FILES["file"]["name"] - 被上传文件的名称;
    $_FILES["file"]["type"] - 被上传文件的类型;
    $_FILES["file"]["size"] - 被上传文件的大小,以字节计;
    $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称;
    $_FILES["file"]["error"] - 由文件上传导致的错误代码;
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制;
(3)、上传限制:用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb;
<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }

?>
切记,对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg;
(4)、保存上传文件:上面的例子在服务器的 PHP 临时文件夹创建一个被上传文件的临时副本;这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置;
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

5、PHP Cookies:cookie 常用于识别用户;
(1)、什么是 Cookie?
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
(2)、如何创建 cookie?setcookie() 函数用于设置 cookie;注释:setcookie() 函数必须位于 <html> 标签之前;
语法:setcookie(name, value, expire, path, domain);
示例:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之);
<?php
// 1小时后过期;
setcookie("user", "cyb_23", time()+3600);
?>
<html>
<body>
</body>
</html>
(3)、如何取回 Cookie 的值?PHP 的 $_COOKIE 变量用于取回 cookie 的值;
示例:输出cooki值:
<?php
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
示例:使用 isset() 函数来确认是否已设置cookie:
<html>
<body>
<?php
if (isset($_COOKIE["user"]))
  echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
  echo "Welcome guest!<br />";
?>
</body>
</html>
(4)、如何删除 cookie?当删除 cookie 时,您应当使过期日期变更为过去的时间点;
<?php
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>
(5)、如果浏览器不支持 cookie 该怎么办?
如果您的应用程序涉及不支持 cookie 的浏览器,您就不得不采取其他方法在应用程序中从一张页面向另一张页面传递信息。一种方式是从表单传递数据(有关表单和用户输入的内容,稍早前我们已经在本教程中介绍过)。

6、PHP Sessions
说明:PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用;
(1)、PHP Session 变量:当您运行一个应用程序时,您会打开它,做些更改,然后关闭它,这很像一次会话,计算机清楚你是谁,它知道你何时启动应用程序,并在何时终止,但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态;通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除,如果您需要永久储存信息,可以把数据存储在数据库中;Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导;
(2)、开始 PHP Session:在您把用户信息存储到 PHP session 中之前,首先必须启动会话;切记,session_start() 函数必须位于 <html> 标签之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
解说,上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID;
(3)、存储 Session 变量:存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:
<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<html>
<body>
<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
</body>
</html>
示例:计数器,创建简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则我们创建 "views" 变量,并把它设置为 1:
<?php
session_start();
if(isset($_SESSION['views']))
  $_SESSION['views']=$_SESSION['views']+1;
else
  $_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>
(4)终结 Session:如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数:
unset() 函数用于释放指定的 session 变量:
<?php
unset($_SESSION['views']);
?>
通过 session_destroy() 函数彻底终结 session:
<?php
session_destroy();
?>
切记,session_destroy() 将重置 session,您将失去所有已存储的 session 数据;

7、PHP 发送电子邮件:PHP 允许您从脚本直接发送电子邮件;
(1)、语法:mail(to,subject,message,headers,parameters);参数:to必需,规定 email 接收者;subject必需,规定 email 的主题,切记,该参数不能包含任何新行字符;message必需,定义要发送的消息,应使用 LF (\n) 来分隔各行;headers可选,规定附加的标题,比如 From、Cc 以及 Bcc,应当使用 CRLF (\r\n) 分隔附加的标题;parameters可选,对邮件发送程序规定额外的参数;
解说:PHP 需要一个已安装且正在运行的邮件系统,以便使邮件函数可用。所用的程序通过在 php.ini 文件中的配置设置进行定义。请在我们的 PHP Mail 参考手册阅读更多内容;
(2)、PHP 简易 E-Mail:通过 PHP 发送电子邮件的最简单的方式是发送一封文本 email;
示例:
<?php
$to = "someone@example.com";
$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = "someonelse@example.com";
$headers = "From: $from";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";
?>
(3)、反馈表单_PHP Mail Form
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
  {
  //send email
  $email = $_REQUEST['email'] ;
  $subject = $_REQUEST['subject'] ;
  $message = $_REQUEST['message'] ;
  mail( "someone@example.com", "Subject: $subject",
  $message, "From: $email" );
  echo "Thank you for using our mail form";
  }
else
//if "email" is not filled out, display the form
  {
  echo "<form method='post' action='mailform.php'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

8、PHP 安全的电子邮件
引言:在上一节中的 PHP e-mail 脚本中,存在着一个漏洞;
(1)、PHP E-mail 注入:
HTML页面:
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
  {
  //send email
  $email = $_REQUEST['email'] ;
  $subject = $_REQUEST['subject'] ;
  $message = $_REQUEST['message'] ;
  mail("someone@example.com", "Subject: $subject",
  $message, "From: $email" );
  echo "Thank you for using our mail form";
  }
else
//if "email" is not filled out, display the form
  {
  echo "<form method='post' action='mailform.php'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>
解说,以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据;
假如,用户在表单中的输入框内加入这些文本,会出现什么情况呢?%0A为换行;
someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com
与往常一样,mail() 函数把上面的文本放入邮件头部,那么现在头部有了额外的 Cc:, Bcc: 以及 To: 字段。当用户点击提交按钮时,这封 e-mail 会被发送到上面所有的地址!
(2)、PHP 防止 E-mail 注入:防止 e-mail 注入的最好方法是对输入进行验证;
<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() sanitizes the e-mail
  //address using FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
 
  //filter_var() validates the e-mail
  //address using FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }

if (isset($_REQUEST['email']))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST['email'] ;
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
    mail("someone@example.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
  {//if "email" is not filled out, display the form
  echo "<form method='post' action='mailform.php'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>
解说,PHP 过滤器来对输入进行验证:FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符;FILTER_VALIDATE_EMAIL 验证电子邮件地址;

9、PHP 错误处理
引言:在 PHP 中,默认的错误处理很简单。一条消息会被发送到浏览器,这条消息带有文件名、行号以及一条描述错误的消息;在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门;
(1)、基本的错误处理:使用 die() 函数:
示例:
HTML文件:
<?php
$file=fopen("welcome.txt","r");
?>
报错信息:Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2;
代码改进:<?php
if(!file_exists("welcome.txt"))
 {
 die("File not found");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>
报错信息:File not found;
解说,比起之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本;不过,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP 函数;
(2)、创建自定义错误处理器:
引言:
创建自定义的错误处理器非常简单,我们很简单地创建一个专用函数,可以在 PHP 中发生错误时调用该函数;该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context)。
语法:
error_function(error_level,error_message,error_file,error_line,error_context),参数error_level必需,为用户定义的错误规定错误报告级别必须是一个值数;error_message必需,为用户定义的错误规定错误消息;error_file可选,规定错误在其中发生的文件名;error_line可选,规定错误发生的行号;error_context可选,规定一个数组,包含当错误发生时在用的每个变量以及它们的值;
创建:
function customError($errno, $errstr)
 {
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Ending Script";
 die();
 }
解说,上面代码是一个简单的错误处理函数。当它被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本;现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数;
(3)、Set Error Handler:错误监听程序
PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序;可以修改错误处理程序,使其仅应用到某些错误,这样脚本就可以不同的方式来处理不同的错误。不过,在本例中,我们打算针对所有错误来使用我们的自定义错误处理程序:set_error_handler("customError");由于我们希望我们的自定义函数来处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别;
示例:通过尝试输出不存在的变量,来测试这个错误处理程序,
<?php
//error handler function
function customError($errno, $errstr)
 {
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
输出,Error: [8] Undefined variable: test;
(4)、触发错误
引言:在脚本中用户输入数据的位置,当用户的输入无效时触发错误的很有用的。在 PHP 中,这个任务由 trigger_error() 完成。
示例:如果 "test" 变量大于 "1",就会发生错误,
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>
输出,Notice: Value must be 1 or below in C:\webfolder\test.php on line 6;您可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误级别。
(5)、可能的错误类型:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断;
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断;
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生;
示例:如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本,
<?php
//error handler function
function customError($errno, $errstr)
 {
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Ending Script";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>
输出,Error: [512] Value must be 1 or below Ending Script;
(6)、错误记录
默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录;通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法;
示例:通过 E-Mail 发送错误消息,如果特定的错误发生,我们将发送带有错误消息的电子邮件,并结束脚本,
<?php
//error handler function
function customError($errno, $errstr)
{
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Webmaster has been notified";
 error_log("Error: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>
输出,Error: [512] Value must be 1 or below Webmaster has been notified;
邮件,Error: [512] Value must be 1 or below;
切记,这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录;

10、PHP 异常处理
定义:异常(Exception)用于在指定的错误发生时改变脚本的正常流程;
(1)、当异常被触发时,通常会发生:
当前代码状态被保存;代码执行被切换到预定义的异常处理器函数;根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本;
(2)、错误处理方法
异常基本使用;创建自定义异常处理器;多个异常;重新抛出异常;设置顶层异常处理器;
(3)、异常基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块;如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息;
<?php
//创建可抛出一个异常的函数
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//在 "try" 代码块中触发异常
try
 {
 checkNum(2);
 //If the exception is thrown, this text will not be shown
 echo 'If you see this, the number is 1 or below';
 }

//捕获异常
catch(Exception $e)
 {
 echo 'Message: ' .$e->getMessage();
 }
?>
输出->Message: Value must be 1 or below;
解说->为遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误;
(4)、创建自定义异常处理器<创建自定义Exception 类>
<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  return $errorMsg;
  }
 }

$email = "someone@example...com";

try
 {
 //check if
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>
解说->这个新的类是旧的 exception 类的副本,外加 errorMessage() 函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage();
(5)、多个异常
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}

$email = "someone@example.com";

try
 {
 //check if
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 //check for "example" in mail address
 if(strpos($email, "example") !== FALSE)
  {
  throw new Exception("$email is an example e-mail");
  }
 }

catch (customException $e)
 {
 echo $e->errorMessage();
 }

catch(Exception $e)
 {
 echo $e->getMessage();
 }
?>
(6)、重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理,可以在一个 "catch" 代码块中再次抛出异常;脚本应该对用户隐藏系统错误,对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣,为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常;
<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }

$email = "someone@example.com";

try
 {
 try
  {
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE)
   {
   //throw exception if email is not valid
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //re-throw exception
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>
(7)、设置顶层异常处理器(Top Level Exception Handler):set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数;
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>
解说->在上面的代码中,不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常;
(8)、异常规则需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常;每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块;使用多个 catch 代码块可以捕获不同种类的异常;可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常;简而言之:如果抛出了异常,就必须捕获它;

11、PHP 过滤器(Filter):PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入;
(1)、什么是 PHP 过滤器?
PHP 过滤器用于验证和过滤来自非安全来源的数据;验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分;设计 PHP 的过滤器扩展的目的是使数据过滤更轻松快捷;
(2)、为什么使用过滤器?
几乎所有 web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务);通过使用过滤器,您能够确保应用程序获得正确的输入类型;您应该始终对外部数据进行过滤;输入过滤是最重要的应用程序安全课题之一;
(3)、什么是外部数据?
表单输入数据;Cookies;服务器变量;数据库查询结果;
(4)、函数、过滤器
如需过滤变量,请使用下面的过滤器函数之一:filter_var() - 通过一个指定的过滤器来过滤单一的变量;filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量;filter_input - 获取一个输入变量,并对它进行过滤;filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤;
(5)、示例:验证整数
<?php
$int = 123;
// 使用FILTER_VALIDATE_INT过滤器
if(!filter_var($int, FILTER_VALIDATE_INT))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>
(6)、Validating 和 Sanitizing
Validating 过滤器:用于验证用户输入;严格的格式规则(比如 URL 或 E-Mail 验证);如果成功则返回预期的类型,如果失败则返回 FALSE;Sanitizing 过滤器:用于允许或禁止字符串中指定的字符;无数据格式规则;始终返回字符串;
(7)、选项和标志:选项和标志用于向指定的过滤器添加额外的过滤选项;不同的过滤器有不同的选项和标志;
示例->用 filter_var() 和 "min_range" 以及 "max_range" 选项验证整数
<?php
$var=300;

$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>
(8)、验证输入
思路:让我们试着验证来自表单的输入;我们需要作的第一件事情是确认是否存在我们正在查找的输入数据;然后我们用 filter_input() 函数过滤输入的数据;
示例:输入变量 "email" 被传到 PHP 页面
<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("Input type does not exist");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "E-Mail is not valid";
  }
 else
  {
  echo "E-Mail is valid";
  }
 }
?>
解说->上面的例子有一个通过 "GET" 方法传送的输入变量 (email):检测是否存在 "GET" 类型的 "email" 输入变量;如果存在输入变量,检测它是否是有效的邮件地址;
(9)净化URL输入
<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("Input type does not exist");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>
解说->上面的例子有一个通过 "POST" 方法传送的输入变量 (url):检测是否存在 "POST" 类型的 "url" 输入变量;如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中;假如输入变量类似这样:"http://www.W3非o法ol.com.c字符n/",则净化后的 $url 变量应该是这样的:http://www.W3School.com.cn/;
(10)、过滤多个输入
示例:使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一个名字、一个年龄以及一个邮件地址
<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );

$result = filter_input_array(INPUT_GET, $filters);

if (!$result["age"])
 {
 echo("Age must be a number between 1 and 120.<br />");
 }
elseif(!$result["email"])
 {
 echo("E-Mail is not valid.<br />");
 }
else
 {
 echo("User input is valid");
 }
?>
解说->上面例子有三个通过 "GET" 方法传送的输入变量 (name, age and email),设置一个数组,其中包含输入变量的名称,以及用于指定的输入变量的过滤器;调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组;检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入;filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID;如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值;如果该参数是一个数组,那么此数组必须遵循下面的规则:必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量);此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志以及选项的数组;
(11)、使用 Filter Callback
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用,这样,我们就拥有了数据过滤的完全控制权;您可以创建自己的自定义函数,也可以使用已有的 PHP 函数;规定您准备用到过滤器函数的方法,与规定选项的方法相同;
示例:自定义函数把所有 "_" 转换为空格
<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>




上一篇:DedeCMS_如何加入自定义函数?
下一篇:没有了
网友评论