目录
[一.PHP 变量规则:](#一.PHP 变量规则:)
[二.变量作用域 local、global、static、parameter](#二.变量作用域 local、global、static、parameter)
[2.多行注释:/* */](#2.多行注释:/* */)
[3.文档注释:/** */](#3.文档注释:/** */)
4.strpos()函数:用于从字符串中查找一个字符或一段文本
[数据类型(如 string、int、bool、array、null 等)](#数据类型(如 string、int、bool、array、null 等))
[六.算数运算符: +加 -减 *乘 /除 %模 ~取反](#六.算数运算符: +加 -减 *乘 /除 %模 ~取反)
[七. intdiv():a除b并向下取整 (php7+版本新增)](#七. intdiv():a除b并向下取整 (php7+版本新增))
十一.逻辑运算符:and与、or或、xor异或、&&与、||或、!非
[1. and 、&& 与: :x、y都为true ,则返回true](#1. and 、&& 与: :x、y都为true ,则返回true)
[2. or 、|| 或:x、y有true,则返回true](#2. or 、|| 或:x、y有true,则返回true)
[3. xor 异或:x、y只有1个true ,才返回true](#3. xor 异或:x、y只有1个true ,才返回true)
[4. ! 非:取反。x为false ,则返回true](#4. ! 非:取反。x为false ,则返回true)
[十二.数组运算符: +、==、=== 、!=、<>、!==](#十二.数组运算符: +、==、=== 、!=、<>、!==)
[十三.三元运算符: a?b:c 或 a?:b 或 a??b](#十三.三元运算符: a?b:c 或 a?:b 或 a??b)
[十四.组合比较符:c = a <=> b;](#十四.组合比较符:c = a <=> b;)
[十六. if else语句](#十六. if else语句)
[十八.数组 cars = array("aa","bb","cc");](#十八.数组 cars = array("aa","bb","cc");)
[2.遍历数值数组 for循环](#2.遍历数值数组 for循环)
[1.对数组进行排序 sort、rsort](#1.对数组进行排序 sort、rsort)
[2.根据数组的值,进行排序 asort、arsort](#2.根据数组的值,进行排序 asort、arsort)
[二十二:表单和用户输入 _GET、_POST](#二十二:表单和用户输入 _GET、_POST)
[1._GET 变量](#1._GET 变量)
[2._POSY 变量](#2._POSY 变量)
[3._REQUEST 变量](#3._REQUEST 变量)
[4.checkbox 复选框](#4.checkbox 复选框)
[二十五:date() 函数](#二十五:date() 函数)
[8.Runtime 配置](#8.Runtime 配置)
[9.PHP 5 Date/Time 函数](#9.PHP 5 Date/Time 函数)
[10.PHP 5 预定义的 Date/Time 常量](#10.PHP 5 预定义的 Date/Time 常量)
[1.include 和 require 语句](#1.include 和 require 语句)
[1.fopen() 函数 ---用于在PHP中打开文件](#1.fopen() 函数 ---用于在PHP中打开文件)
[模式:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。](#模式:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。)
[2.fclose() 函数---用于关闭打开的文件](#2.fclose() 函数---用于关闭打开的文件)
[3.feof() 函数 ---检测是否已到达文件末尾(EOF)。](#3.feof() 函数 ---检测是否已到达文件末尾(EOF)。)
[4. fgets() 函数---用于从文件中逐行读取文件](#4. fgets() 函数---用于从文件中逐行读取文件)
[5. fgetc() 函数 ---从文件中逐字符读取文件](#5. fgetc() 函数 ---从文件中逐字符读取文件)
[6.PHP 5 FIlesystem 函数](#6.PHP 5 FIlesystem 函数)
[1.Runtime 配置](#1.Runtime 配置)
[2.Unix / Windows 兼容性](#2.Unix / Windows 兼容性)
[3.PHP 5 Filesystem 函数](#3.PHP 5 Filesystem 函数)
[1. setcookie()函数--用于创建cookie.](#1. setcookie()函数--用于创建cookie.)
[2. _COOKIE 变量---用于取回 cookie 的值。](#2. _COOKIE 变量---用于取回 cookie 的值。)
[3.用 isset() 函数 ---来确认是否已设置了 cookie](#3.用 isset() 函数 ---来确认是否已设置了 cookie)
[4.如何删除 cookie()](#4.如何删除 cookie())
[5.如果浏览器不支持Cookie ---通过表单中的submit按钮传递数据](#5.如果浏览器不支持Cookie ---通过表单中的submit按钮传递数据)
[三十: Session变量--存储关于用户会话(session)的信息](#三十: Session变量--存储关于用户会话(session)的信息)
[1.开始 PHP Session](#1.开始 PHP Session)
[2._SESSION 变量 -- 存储和取回 session变量](#2._SESSION 变量 -- 存储和取回 session变量)
[3.销毁或删除某些 Session数据--可以使用 unset() 或 session_destroy() 函数](#3.销毁或删除某些 Session数据--可以使用 unset() 或 session_destroy() 函数)
[三十一:发送电子邮件--mail() 函数用于从脚本中发送电子邮件](#三十一:发送电子邮件--mail() 函数用于从脚本中发送电子邮件)
[1.简易 E-Mail](#1.简易 E-Mail)
[2.Mail 表单](#2.Mail 表单)
[3.E-Mail 注入](#3.E-Mail 注入)
[4.防止 E-Mail 注入](#4.防止 E-Mail 注入)
[1.使用die() 函数](#1.使用die() 函数)
[4.trigger_error() 函数](#4.trigger_error() 函数)
[3.创建一个自定义的 Exception类](#3.创建一个自定义的 Exception类)
[1.filter_var() --通过一个指定的过滤器来过滤单一的变量](#1.filter_var() --通过一个指定的过滤器来过滤单一的变量)
[2.filter_var_arry() ---通过多个过滤器来过滤多个变量](#2.filter_var_arry() ---通过多个过滤器来过滤多个变量)
[3.filter_input() -- 获取一个输入变量,并对它进行过滤](#3.filter_input() -- 获取一个输入变量,并对它进行过滤)
[4.filter_input_array() ------ 批量获取并过滤输入变量](#4.filter_input_array() —— 批量获取并过滤输入变量)
[6.Filter Callback 过滤器](#6.Filter Callback 过滤器)
<?php
//打印php版本
echo phpversion();
?>
一.PHP 变量规则:
■ 变量以 $ 符号开始,后面跟着变量的名称
■ 变量名必须以字母或者下划线字符开始
■ 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
■ 变量名不能包含空格
■ 变量名是区分大小写的(y 和 Y 是两个不同的变量)
二.变量作用域 local、global、static、parameter
变量的作用域是脚本中变量可被引用/使用的部分。
PHP 有四种不同的变量作用域:
local ----局部作用域
global ----要在一个函数中访问一个全局变量,需要使用 global 关键字
static ----static可以使某个局部变量的不被删除(保留变量定义和他最新的值)。
parameter ----参数
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。
除了函数外,全局变量可以被脚本中的任何部分访问。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。
php
<?php
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
echo "<p>测试函数内变量:<p>";
echo "变量 x 为: $x";
echo "<br>"; //回车
//或
//echo PHP_EOL; // 换行符
//echo ($y)."\n" //换行
echo "变量 y 为: $y";
}
myTest();
/*<p>xxxxxx</p>
html中的段标签
浏览器会自动在段落前后添加一定的上下边距(margin),形成视觉上的分段。
*/
echo "<p>测试函数外变量:</p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
打印结果为:

php
/*若想在myTest方法中打印出$x的值,
需要在方法中使用global声明
或
使用 $GLOBALS 数组
*/
function myTest()
{
global $x; // 声明使用全局变量 $x
$y = 10;
echo "变量 x 为: $x"; // 现在可以访问了
//或
echo "变量 x 为: " .$GLOBALS['x'];
echo "变量 y 为: $y";
}
/////////////////////////////////////////////////////////////
//或 参数传递
function myTest($x)
{
$y = 10;
echo "变量 x 为: $x";
echo "变量 y 为: $y";
}
myTest($x); // 把全局变量传入函数
/////////////////////////////////////////////////////////////
//或返回值
function myTest()
{
$y = 10;
return ['x' => $GLOBALS['x'], 'y' => $y];
}
$result = myTest();
echo "变量 x 为: " . $result['x'];
echo "变量 y 为: " . $result['y'];
/////////////////////////////////////////////////////////////
<?php
$x=5;
$y=10;
function myTest()
{
//global $x,$y;
//$y=$x+$y;
//或
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出 15
?>

三.注释格式
1.单行注释: // 或
2.多行注释:/* */
3.文档注释:/** */
四.字符串
1.定义
php
<?php
//定义字符串
$txt="Hello world!";
echo $txt;
?>
2.并置运算符:用于把两个字符串连接到一起
php
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
//中间加空格
echo $txt1 . " " . $txt2;
echo PHP_EOL;
//直接连接
echo $txt1.$txt2;
?>

php
<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出Hello world!
?>
3.strlen()函数:获取字符串长度
php
<?php
$txt1="Hello world!";
echo strlen($txt1);
echo "<br>";
$txt2="What a nice day!";
echo strlen($txt2);
echo PHP_EOL;
echo $txt1 . " " . $txt2;
echo PHP_EOL;
echo strlen($txt1."".$txt2);
?>

4.strpos()函数:用于从字符串中查找一个字符或一段文本
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
php
<?php
echo strpos("Hello world!","world");
echo PHP_EOL;
echo strpos("Hello world!","l");
echo PHP_EOL;
echo var_dump(strpos("Hello world!","abc"));
?>
五.var_dump():用于调试打印数据结构
数据类型 (如 string、int、bool、array、null 等)
值的内容
如果是字符串,还会显示长度
如果是数组或对象,会递归展开结构
php
<?php
$bool = false;
$int = 42;
$str = "hello";
$null = null;
var_dump($bool); // bool(false)
var_dump($int); // int(42)
var_dump($str); // string(5) "hello"
var_dump($null); // NULL
?>
六.算数运算符: +加 -减 *乘 /除 %模 ~取反

php
<?php
$x=10;
$y=6;
echo ($x + $y); // 输出16
echo '<br>'; // 换行
echo ($x - $y); // 输出4
echo '<br>'; // 换行
echo ($x * $y); // 输出60
echo '<br>'; // 换行
echo ($x / $y); // 输出1.6666666666667
echo '<br>'; // 换行
echo ($x % $y); // 输出4
echo '<br>'; // 换行
echo -$x;
?>

七. intdiv():a除b并向下取整 (php7+版本新增)
php
<?php
var_dump(intdiv(10, 3)); //int(3)
?>
八.赋值运算符

php
<?php
$x=10;
echo $x; // 输出10
$y=20;
$y += 100;
echo $y; // 输出120
$z=50;
$z -= 25;
echo $z; // 输出25
$i=5;
$i *= 6;
echo $i; // 输出30
$j=10;
$j /= 5;
echo $j; // 输出2
$k=15;
$k %= 4;
echo $k; // 输出3
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出Hello world!
?>
九.递增/递减运算符

php
<?php
$x=10;
echo ++$x; // 输出11
$y=10;
echo $y++; // 输出10
$z=5;
echo --$z; // 输出4
$i=5;
echo $i--; // 输出5
?>
十.比较运算符

php
<?php
$x=100;
$y="100";
var_dump($x == $y); //bool(true)
echo "<br>";
var_dump($x === $y); //bool(false)
echo "<br>";
var_dump($x != $y); //bool(false)
echo "<br>";
var_dump($x !== $y); //bool(true)
echo "<br>";
$a=50;
$b=90;
var_dump($a > $b); //bool(false)
echo "<br>";
var_dump($a < $b); //bool(true)
?>
十一.逻辑运算符:and与、or或、xor异或、&&与、||或、!非

1. and 、&& 与: :x、y都为true ,则返回true
2. or 、|| 或:x、y有true,则返回true
3. xor 异或:x、y只有1个true ,才返回true
4. ! 非:取反。x为false ,则返回true
十二.数组运算符: +、==、=== 、!=、<>、!==

php
<?php
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$z = $x + $y; // $x 和 $y 数组合并
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>

-
x+y x和y的集合
-
x == y 相等:如果x 和 y 有相同的键值对,则返回true
-
x === y 恒等:如果x和y有相同的键值对,且顺序相同、类型相同,则返回true
-
x != y 不相等:如果x不等于y, 则返回true
-
x <> y 不相等:如果x不等于y., 则返回true
6.x !=== 不恒等:如果x不等于y,则返回true
!=和<>是类型转换后比较值是否相等(宽松比较)!==是严格比较,不仅比值,还比类型
十三.三元运算符: a?b:c 或 a?:b 或 a??b
1.语法格式: (expr1) ? (expr2) : (expr3)2.自 PHP 5.3 起,可以省略三元运算符中间那部分。
表达式 expr1 ?: expr3
在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
3.在 PHP7+ 版本多了一个 NULL 合并运算符 ??
php
<?php
// 普通写法
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
echo $username, PHP_EOL;
// PHP 5.3+ 版本写法
$username = $_GET['user'] ?: 'nobody';
echo $username, PHP_EOL;
?>

php
<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
echo $username,PHP_EOL;
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
echo $username;
?>

十四.组合比较符:c = a <=> $b;
PHP7+ 支持组合比较符 (combined comparison operator)也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。
语法格式如下:
$c = $a <=> $b;解析如下:
- 如果**a \> b** , 则 $c 的值为 1。
- 如果 a == b , 则 $c 的值为 0。
- 如果 a \< b , 则 $c 的值为 -1。
php
<?php
echo (1 <=> 1) . "\n"; //0
echo (1 <=> 2) . "\n"; //-1
echo (2 <=> 1) . "\n"; //1
echo (1.5 <=> 1.5) . "\n"; //0
echo (1.5 <=> 2.5) . "\n"; //-1
echo (2.5 <=> 1.5) . "\n"; //1
echo ("a" <=> "a") . "\n"; //0
echo ("a" <=> "b") . "\n"; //-1
echo ("b" <=> "a") . "\n"; //1
?>
十五.运算符优先级

优先级: && 、= 、 and
优先级: || 、 = 、 or
十六. if else语句
if (条件) { 条件成立时要执行的代码; }
php
<?php
$t=date("H");//当前时间
if ($t<"20") {
echo "Have a good day!";
}
?>
///////////////////////////////////////////////
<?php
$t=date("H");
if ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>
if elseif else语句
if (条件) { if 条件成立时执行的代码; } elseif (条件) { elseif 条件成立时执行的代码; } else { 条件不成立时执行的代码; }
php
<?php
$t=date("H");
if ($t<"10") {
echo "Have a good morning!";
} elseif ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>
十七.switch语句:
php
<?php
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!";
break;
case "blue":
echo "你喜欢的颜色是蓝色!";
break;
case "green":
echo "你喜欢的颜色是绿色!";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}
?>
十八.数组 $cars = array("aa","bb","cc");
定义:
$cars = array("Volvo","BMW","Toyota");
自动分配 ID 键(ID 键总是从 0 开始):
在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
1.数值数组
php
<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
I like Volvo, BMW and Toyota.
1.count()函数:获取数组的长度
php
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>
打印结果:3
2.遍历数值数组 for循环
php
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
打印结果:
2.关联数组
这里有两种创建关联数组的方法:
$age = array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
或:
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
php
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
Peter is 35 years old.
foreach循环
php
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
十九:数组排序
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
1.对数组进行排序 sort、rsort
php
<?php
$cars=array("Volvo","BMW","Toyota");
echo "<p>升序 </p>";
sort($cars);
for($i=0;$i<count($cars);$i++){
echo $cars[$i],PHP_EOL;
}
echo "<p>降序 </p>";
rsort($cars);
for($i=0;$i<count($cars);$i++){
echo $cars[$i],PHP_EOL;
}
$numbers=array(4,6,2,22,11);
echo "<p>升序 </p>";
sort($numbers);
for($i=0;$i<count($numbers);$i++){
echo $numbers[$i],PHP_EOL;
}
echo "<p>降序 </p>";
rsort($numbers);
for($i=0;$i<count($numbers);$i++){
echo $numbers[$i],PHP_EOL;
}
?>
打印结果:
2.根据数组的值,进行排序 asort、arsort
php
<?php
$age = array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "<p>值升序</p>";
asort($age);
foreach ($age as $name => $value) {
echo "$name: $value\n";
}
print_r($age);
echo PHP_EOL;
var_dump($age);
echo "<p>值降序</p>";
arsort($age);
foreach ($age as $name => $value) {
echo "$name: $value\n";
}
print_r($age);
echo PHP_EOL;
var_dump($age);
?>
打印结果:
3.根据数组的键,对数组进行排序
php
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "键升序 \n";
ksort($age);
print_r($age);
echo PHP_EOL;
echo "键降序 \n";
krsort($age);
print_r($age);
?>
打印结果:
二十:循环
- while- 只要指定的条件成立,则循环执行代码块
- do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
- for- 循环执行代码块指定的次数
- foreach- 根据数组中每个元素来循环代码块
1.while循环
php
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
?>
打印结果:
2.do...while语句
php
<?php
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=5);
?>
打印结果:
3.for循环
php
<?php
for ($i=1; $i<=5; $i++)
{
echo "数字为 " . $i . PHP_EOL;
}
?>
打印结果:
4.foreach循环
php
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value . PHP_EOL;
}
?>
打印结果:
php
<?php
$x=array(1=>"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
echo "key 为 " . $key . ",对应的 value 为 ". $value . PHP_EOL;
}
?>
打印结果:
二十一:函数
- 函数名称以字母或下划线开头(不能以数字开头)
php
<?php
function test()
{
echo "这是一个函数";
}
test();
?>
单参数:
php
<?php
function writeName($fname)
{
echo $fname . " Refsnes.<br>";
}
echo "My name is ";
writeName("Kai Jim");
echo "My sister's name is ";
writeName("Hege");
echo "My brother's name is ";
writeName("Stale");
?>
打印结果:
多参数:
php
<?php
function writeName($fname,$punctuation)
{
echo $fname . " Refsnes" . $punctuation . "<br>";
}
echo "My name is ";
writeName("Kai Jim",".");
echo "My sister's name is ";
writeName("Hege","!");
echo "My brother's name is ";
writeName("Ståle","?");
?>
打印结果:
返回值:
php
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
?>
打印:
1 + 16 = 17
变量函数:
变量函数是指在 PHP 中,将一个变量作为函数名来调用的函数。
变量函数可以让我们在运行时动态地决定调用哪个函数。
php
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // 调用 foo()
$func = 'bar';
$func('test'); // 调用 bar()
$func = 'echoit';
$func('test'); // 调用 echoit()
?>
打印:
也可以用变量函数的语法来调用一个对象的方法。
php
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // 调用 Bar() 方法
}
function Bar()
{
echo "This is Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // 调用 $foo->Variable()
?>
执行结果:
This is Bar
二十二:表单和用户输入 _GET、_POST
PHP 中的 _GET 和 _POST 变量用于检索表单中的信息,比如用户输入。
1.$_GET 变量
预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
php
//form.html
<html>
<head>
<meta charset="utf-8">
<title>Get变量</title>
</head>
<body>
<form action="welcome.php" method="get">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
//welcome.php
欢迎 <?php echo $_GET["fname"]; ?>!<br>
你的年龄是 <?php echo $_GET["age"]; ?> 岁。
当用户点击 "Submit" 按钮时,发送到服务器的 URL 如下所示:
http://www.runoob.com/welcome.php?fname=Runoob\&age=3
何时使用 method="get"?
在 HTML 表单中使用 method="get" 时,所有的变量名和值都会显示在 URL 中。
**注释:**所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
**注释:**HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
2.$_POSY 变量
预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
**注释:**然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
php
//form.html
<html>
<head>
<meta charset="utf-8">
<title>post变量</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
//-----------------------------------------------------------------
//welcome.php
欢迎 <?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"]; ?> 岁。

当用户点击 "提交" 按钮时,URL 类似如下所示:
http://www.runoob.com/welcome.php何时使用 method="post"?
从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
然而,由于变量不显示在 URL 中,所以无法把页面加入书签。
3.$_REQUEST 变量
预定义的 _REQUEST 变量包含了 _GET、_POST 和 _COOKIE 的内容。
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
php
//welcone.php
欢迎 <?php echo $_REQUEST["fname"]; ?>!<br>
你的年龄是 <?php echo $_REQUEST["age"]; ?> 岁。
二十三:获取下拉菜单的数据
以下实例我们设置了下拉菜单三个选项,表单使用 GET 方式获取数据,action 属性值为空表示提交到当前脚本,我们可以通过 select 的 name 属性获取下拉菜单的值:
1.下拉菜单--单选
php
//php_form_select.php
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '百度<br>http://www.baidu.com';
} else if($q =='GOOGLE') {
echo '谷歌<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?>
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>

2.下拉菜单--多选
php
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'BAIDU' => '百度: http://www.baidu.com',
'GOOGLE' => '谷歌: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
?>
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">选择一个站点:</option>
<option value="BAIDU">Baodu</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>

3.单选按钮表单
php
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='BAIDU') {
echo '百度<br>http://www.baidu.com';
} else if($q =='GOOGLE') {
echo '谷歌<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?><form action="" method="get">
<input type="radio" name="q" value="BAIDU" />Baidu
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form>
<?php
}
?>

4.checkbox 复选框
php
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'BAIDU' => '百度: http://www.baidu.com',
'GOOGLE' => '谷歌: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
echo $sites[$val] . PHP_EOL;
}
} else {
?><form action="" method="post">
<input type="checkbox" name="q[]" value="BAIDU"> Baidu<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
<?php
}
?>

5.表单验证
我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的压力。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单的数据传给当前页面(异步提交的方式更好),而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。
二十四:多维数组
多维数组是包含一个或多个数组的数组。
在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。
一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组,依照这种方式,我们可以创建二维或者三维数组。
1.二维数组
自动分配键值,从 0 开始:
array ( array (elements...), array (elements...), ... )

php
<?php
// 二维数组:
$cars = array
(
array("Volvo",100,96),
array("BMW",60,59),
array("Toyota",110,100)
);
echo $cars[0][0]."\n";
echo $cars[1][0]."\n";
echo $cars[2][0]."\n";
?>

指定键(关联数组)的二维数组
php
<?php
$sites = array
(
"baidu"=>array
(
"百度",
"http://www.baidu.com"
),
"google"=>array
(
"谷歌",
"http://www.google.com"
),
"taobao"=>array
(
"淘宝",
"http://www.taobao.com"
)
);
//print("<pre>"); // 格式化输出数组
//print_r($sites);
//print("</pre>");
echo $sites["baidu"][0].$sites["baidu"][1]."\n";
echo $sites["google"][0].$sites["google"][1]."\n";
echo $sites["taobao"][0].$sites["taobao"][1]."\n";
?>

2.三维数组
array ( array ( array (elements...), array (elements...), ... ), array ( array (elements...), array (elements...), ... ), ... )

php
<?php
// 创建三维数组
$myarray = array(
array(
array(1, 2),
array(3, 4),
),
array(
array(5, 6),
array(7, 8),
),
);
// 输出数组信息
//print_r($myarray);
echo $myarray[0][0][0]."\n"; //1
echo $myarray[0][0][1]."\n"; //2
echo $myarray[0][1][0]."\n"; //3
echo $myarray[0][1][1]."\n"; //4
echo $myarray[1][0][0]."\n"; //5
echo $myarray[1][0][1]."\n"; //6
echo $myarray[1][1][0]."\n"; //7
echo $myarray[1][1][1]; //8
?>
二十五:date() 函数
date() 函数可把时间戳格式化为可读性更好的日期和时间。
时间戳是一个字符序列,表示一定的事件发生的日期/时间。
语法
string date ( string format \[, int timestamp ] )

- d - 代表月中的天 (01 - 31)
- m - 代表月 (01 - 12)
- Y - 代表年 (四位数)
php
<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>

1.日

2.星期

3.月

4.年

5.时间

6.时区

7.完整日期/时间

8.Runtime 配置

9.PHP 5 Date/Time 函数


10.PHP 5 预定义的 Date/Time 常量

二十六:包含文件
1.include 和 require 语句
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法:include 'filename'; 或 require 'filename';
2.示例一
php
//假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<?php include 'header.php'; ?>
<h1>欢迎来到我的主页!</h1>
<p>一些文本。</p>
</body>
</html>
3.示例二
php
//menu.php
echo '<a href="/">主页</a>
<a href="/html">HTML 教程</a>
<a href="/php">PHP 教程</a>';
//-----------------------------------------------------
<html>
<head>
<meta charset="utf-8">
<title>引用菜单文件</title>
</head>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>欢迎来到我的主页!</h1>
<p>一些文本。</p>
</body>
</html>
4.示例四
php
//vars.php
<?php
$color='red';
$car='BMW';
?>
//-----------------------------------------------------
<html>
<head>
<meta charset="utf-8">
<title>调用自定义文件</title>
</head>
<body>
<h1>欢迎来到我的主页!</h1>
<?php
include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>
二十七:文件处理
1.fopen() 函数 ---用于在PHP中打开文件
php
<?php
/*
第一个参数含有要打开的文件的名称,
第二个参数规定了使用哪种模式来打开文件
*/
$file = fopen("welcome.txt","r");
?>
**模式:**如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

示例:
php
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
2.fclose() 函数---用于关闭打开的文件
php
<?php
$file = fopen("test.txt","r");
//执行一些代码
fclose($file);
?>
3.feof() 函数 ---检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
if (feof($file)) echo "文件结尾";
**注释:**在 w 、a 和 x 模式下,您无法读取打开的文件!
4. fgets() 函数---用于从文件中逐行读取文件
**注释:**在 w 、a 和 x 模式下,您无法读取打开的文件!
php
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
5. fgetc() 函数 ---从文件中逐字符读取文件
**注释:**在调用该函数之后,文件指针会移动到下一个字符。
php
//逐字符地读取文件,直到文件末尾为止
<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
6.PHP 5 FIlesystem 函数
1.Runtime 配置
Filesystem 函数的行为受到 php.ini 中设置的影响。

2.Unix / Windows 兼容性
当在 Unix 平台上规定路径时,正斜杠 (/) 用作目录分隔符。而在 Windows 平台上,正斜杠 (/) 和反斜杠 (\) 均可使用。
3.PHP 5 Filesystem 函数



二十八:文件上传
1.创建一个文件上传表单
有关 HTML 表单的一些注意项列举如下:
- <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。
- 在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
- <input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。
- 举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
**注释:**允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
php
// form.html
<html>
<head>
<meta charset="utf-8">
<title>文件上传</title>
</head>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
2.创建上传脚本
通过使用 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"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。
php
//upload_file.php
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>
3.上传限制
限制用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB:
php
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
4.保存被上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
php
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
5.文件目录


二十九:Cookie--常用于识别用户
cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
1. setcookie()函数--用于创建cookie.
语法:
setcookie(name, value, expire, path, domain); 注释: 1. setcookie() 函数必须位于 <html> 标签之前。 2. 在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。 (为防止 URL 编码,请使用 setrawcookie() 取而代之。)
示例1:创建名为 "userId" 的 cookie,并为它赋值 "100086"。且cookie 在一小时后过期
php
<?php
setcookie("userId", "100086", time()+3600);
?>
<html>
//.....
</html>
示例2:通过另一种方式设置 cookie 的过期时间。
php
<?php
$expire=time()+60*60*24*30; //过期时间30天
setcookie("user", "runoob", $expire);
?>
<html>
//.....
</html>
2. $_COOKIE 变量---用于取回 cookie 的值。
php
<?
php
// 输出 cookie 值
echo $_COOKIE["userId"];
// 查看所有 cookie
print_r($_COOKIE);
?>
3.用 isset() 函数 ---来确认是否已设置了 cookie
php
<html>
<head>
<meta charset="utf-8">
<title>判断是否存在</title>
</head>
<body>
<?php
if (isset($_COOKIE["userId"]))
echo "用户 " . $_COOKIE["userId"] . "!<br>";
else
echo "普通访客!<br>";
?>
</body>
</html>
4.如何删除 cookie()
当删除 cookie 时,您应当使过期日期变更为过去的时间点。
php
<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("userId", "", time()-3600);
?>
5.如果浏览器不支持Cookie ---通过表单中的submit按钮传递数据
php
//form.html
<html>
<head>
<meta charset="utf-8">
<title>使用submit提交</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="name">
年龄: <input type="text" name="age">
<input type="submit">
</form>
</body>
</html>
取回 "welcome.php" 文件中的值
php
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
欢迎 <?php echo $_POST["name"]; ?>.<br>
你 <?php echo $_POST["age"]; ?> 岁了。
</body>
</html>
三十: Session变量--存储关于用户会话(session)的信息
1.您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。
2.然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
3.PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
1.开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
**注释:**session_start() 函数必须位于 <html> 标签之前:
php
//向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
<?php session_start(); ?>
<html>
<body>
</body>
</html>
2.$_SESSION 变量 -- 存储和取回 session变量
php
<?php
session_start();
// 存储 session 数据
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>存储和取回session</title>
</head>
<body>
<?php
// 检索 session 数据
echo "浏览量:". $_SESSION['views'];
?>
</body>
</html>
示例:创建一个简单的 page-view计数器
php
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>
3.销毁或删除某些 Session数据--可以使用 unset() 或 session_destroy() 函数
**注释:**session_destroy() 将重置 session,您将失去所有已存储的 session 数据。
unset() 函数用于释放指定的 session 变量:
php
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
通过调用 session_destroy() 函数彻底销毁 session:
php
<?php
session_destroy();
?>
三十一:发送电子邮件--mail() 函数用于从脚本中发送电子邮件
语法:mail(to,subject,message,headers,parameters)
**注释:**PHP 运行邮件函数需要一个已安装且正在运行的邮件系统(如:sendmail、postfix、qmail等)。所用的程序通过在 php.ini 文件中的配置设置进行定义。

1.简易 E-Mail
声明变量(to, subject, message, from, $headers),然后我们在 mail() 函数中使用这些变量来发送了一封 E-mail
php
<?php
$to = "someone@example.com"; // 邮件接收者
$subject = "参数邮件"; // 邮件标题
$message = "Hello! 这是邮件的内容。"; // 邮件正文
$from = "someonelse@example.com"; // 邮件发送者
$headers = "From:" . $from; // 头部信息设置
mail($to,$subject,$message,$headers);
echo "邮件已发送";
?>
2.Mail 表单
向指定的 e-mail 地址发送了一条文本消息:
php
<html>
<head>
<meta charset="utf-8">
<title>向指定地址发送一条文本消息</title>
</head>
<body>
<?php
if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
// 发送邮件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", $subject,
$message, "From:" . $email);
echo "邮件发送成功";
} else { // 如果没有邮箱参数则显示表单
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>
3.E-Mail 注入
以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据。
假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?
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 会被发送到上面所有的地址!
4.防止 E-Mail 注入
防止 e-mail 注入的最好方法是对输入进行验证。
下面的代码中我们使用了 PHP 过滤器来对输入进行验证:
- FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
- FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值
php
<html>
<head>
<meta charset="utf-8">
<title>防止注入</title>
</head>
<body>
<?php
function spamcheck($field)
{
// filter_var() 过滤 e-mail
// 使用 FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
//filter_var() 过滤 e-mail
// 使用 FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}
if (isset($_REQUEST['email']))
{
// 如果接收到邮箱参数则发送邮件
// 判断邮箱是否合法
$mailcheck = spamcheck($_REQUEST['email']);
if ($mailcheck==FALSE)
{
echo "非法输入";
}
else
{
// 发送邮件
$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
{
// 如果没有邮箱参数则显示表单
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>
三十二:错误处理
不同的错误处理方法:
- 简单的 "die()" 语句
- 自定义错误和错误触发器
- 错误报告
1.使用die() 函数
php
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
2.自定义错误处理器
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):
语法:
error_function(error_level,error_message,error_file,error_line,error_context)

错误报告级别:

php
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
3.设置错误处理程序
set_error_handler("customError");
php
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
?>
执行:
4.trigger_error() 函数
在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。
php
<?php
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1");
}
?>
打印:
Notice: 变量值必须小于等于 1 in /box/script.php on line 5
可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误类型。
可能的错误类型:
- E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
- E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
- E_USER_NOTICE - 默认。用户生成的 run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
php
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>
5.错误记录
1.在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。
2.通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
3.通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。
通过email 发送错误信息:
php
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "已通知网站管理员";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);
// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>
这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录。
三十三:异常处理
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
- 当前代码状态被保存
- 代码执行被切换到预定义(自定义)的异常处理器函数
- 根据情况,处理器也许会从保存的代码状态重新开始执行代码、终止脚本执行或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:
- 异常的基本使用
- 创建自定义的异常处理器
- 多个异常
- 重新抛出异常
- 设置顶层异常处理器
**注释:**异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。
1.异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
让我们尝试抛出一个异常,同时不去捕获它:
php
<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
// 触发异常
checkNum(2);
?>

2.try、throw、catch
适当的处理异常代码应该包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
php
<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("变量值必须小于等于 1");
}
return true;
}
// 在 try 块 触发异常
try
{
checkNum(2);
echo '如果抛出异常,此文本不会输出';
}
// 捕获异常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
3.创建一个自定义的 Exception类
php
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().'<br> in '.$this->getFile()
.': <b><br>'.$this->getMessage().'</b> <br>不是一个合法的 E-Mail 地址';
return $errorMsg;
}
}
$email = "someone@example...com";
try
{
// 检测邮箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new customException($email);
}
}catch (customException $e){
//display custom message
echo $e->errorMessage();
}
?>

4.多个异常
可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息:
php
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
// 检测邮箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new customException($email);
}
// 检测 "example" 是否在邮箱地址中
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email 是 example 邮箱");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
5.重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常:
php
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
// 检测 "example" 是否在邮箱地址中
if(strpos($email, "example") !== FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new Exception($email);
}
}
catch(Exception $e)
{
// 重新抛出异常
throw new customException($email);
}
}
catch (customException $e)
{
// 显示自定义信息
echo $e->errorMessage();
}
?>
6.设置顶层异常处理器
使用set_exception_handler设置顶层异常处理器,
所有未被捕获的异常都会触发顶层的异常处理程序。
php
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
7.异常的规则
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch 代码块可以捕获不同种类的异常。
- 可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。
三十四:过滤器
PHP 过滤器用于验证和过滤来自非安全来源的数据。
测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
什么是外部数据?
- 来自表单的输入数据
- Cookies
- Web services data
- 服务器变量
- 数据库查询结果
1.函数和过滤器
PHP 提供了强大的过滤系统,用于验证和过滤数据(尤其是用户输入),防止 XSS、SQL 注入等安全问题。
如需过滤变量,请使用下面的过滤器函数之一:
- filter_var() -
- filter_var_array() -
- filter_input -
- filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

1.filter_var() --通过一个指定的过滤器来过滤单一的变量
php
<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("不是一个合法的整数");
}
else
{
echo("是个合法的整数");
}
?>
打印:是个合法的整数。
2.filter_var_arry() ---通过多个过滤器来过滤多个变量
php
<?php
$data = [
'email' => 'user@example.com',
'age' => '25',
'url' => 'https://example.com'
];
$filtered = filter_var_array($data, [
'email' => FILTER_VALIDATE_EMAIL,
'age' => FILTER_VALIDATE_INT,
'url' => FILTER_VALIDATE_URL
]);
if ($filtered['email'] && $filtered['age'] && $filtered['url']) {
echo "所有数据都有效!<br>";
echo "邮箱: " . $filtered['email'] . "<br>";
echo "年龄: " . $filtered['age'] . "<br>";
echo "网址: " . $filtered['url'];
} else {
echo "有数据无效!";
}
?>

3.filter_input() -- 获取一个输入变量,并对它进行过滤
php
<?php
// 假设通过 GET 请求传入参数:?email=user@example.com&age=25
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
if ($email && $age) {
echo "邮箱: " . $email . "<br>";
echo "年龄: " . $age;
} else {
echo "输入数据不合法!";
}
?>
4.filter_input_array() ------ 批量获取并过滤输入变量
php
<?php
// 假设 POST 数据:
// email: user@example.com
// age: 25
// url: https://example.com
$inputs = filter_input_array(INPUT_POST, [
'email' => FILTER_VALIDATE_EMAIL,
'age' => FILTER_VALIDATE_INT,
'url' => FILTER_VALIDATE_URL
]);
if ($inputs['email'] && $inputs['age'] && $inputs['url']) {
echo "数据验证成功:<br>";
echo "邮箱: " . $inputs['email'] . "<br>";
echo "年龄: " . $inputs['age'] . "<br>";
echo "网址: " . $inputs['url'];
} else {
echo "部分数据无效!";
}
?>
5.常用过滤器常量一览
两种过滤器:.Validating(验证) 和 Sanitizing(清理)
Validating 过滤器:
- 用于验证用户输入
- 严格的格式规则(比如 URL 或 E-Mail 验证)
- 如果成功则返回预期的类型,如果失败则返回 FALSE
Sanitizing 过滤器:
- 用于允许或禁止字符串中指定的字符
- 无数据格式规则
- 始终返回字符串
2.选项和标志
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志
在下面的实例中,我们用 filter_var() 和 "min_range" 以及 "max_range" 选项验证了一个整数:
php
<?php
$var=300;
$int_options = array(
"options"=>array
(
"min_range"=>0,
"max_range"=>256
)
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
echo("不是一个合法的整数");
}
else
{
echo("是个合法的整数");
}
?>
3.验证输入
php
<?php
if(!filter_has_var(INPUT_GET, "email"))
{
echo("没有 email 参数");
}
else
{
if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
{
echo "不是一个合法的 E-Mail";
}
else
{
echo "是一个合法的 E-Mail";
}
}
?>
4.净化输入
php
<?php
if(!filter_has_var(INPUT_GET, "url"))
{
echo("没有 url 参数");
}
else
{
$url = filter_input(INPUT_GET,
"url", FILTER_SANITIZE_URL);
echo $url;
}
?>
5.过滤多个输入
表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。
php
<?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("年龄必须在 1 到 120 之间。<br>");
}
elseif(!$result["email"])
{
echo("E-Mail 不合法<br>");
}
else
{
echo("输入正确");
}
?>
6.Filter Callback 过滤器
使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。
php
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_runoob_com!";
echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>

