目录

一.PHP 变量规则:

二.变量作用域 local、global、static、parameter

三.注释格式

1.单行注释: // 或 #

2.多行注释:/* */

3.文档注释:/** */

四.字符串

1.定义

2.并置运算符:用于把两个字符串连接到一起

3.strlen()函数:获取字符串长度

4.strpos()函数:用于从字符串中查找一个字符或一段文本

​编辑五.var_dump():用于调试打印数据结构

数据类型(如 string、int、bool、array、null 等)

值的内容

如果是字符串,还会显示长度

如果是数组或对象,会递归展开结构

六.算数运算符: +加 -减 *乘 /除 %模 ~取反

七. intdiv():a除b并向下取整    (php7+版本新增)

八.赋值运算符​编辑

九.递增/递减运算符

十.比较运算符

十一.逻辑运算符: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

十二.数组运算符: +、==、=== 、!=、<>、!==

十三.三元运算符: a?b:c 或 a?:b 或 a??b

十四.组合比较符:$c = $a <=> $b;

十五.运算符优先级

十六. if else语句

十七.switch语句:

十八.数组 $cars = array("aa","bb","cc");

1.数值数组

1.count()函数:获取数组的长度

2.遍历数值数组 for循环

2.关联数组

foreach循环

十九:数组排序

1.对数组进行排序  sort、rsort

2.根据数组的值,进行排序  asort、arsort

3.根据数组的键,对数组进行排序

二十:循环

1.while循环

2.do...while语句

3.for循环

4.foreach循环

二十一:函数

单参数:

多参数:

返回值:

变量函数:

二十二:表单和用户输入 $_GET、$_POST

1.$_GET 变量

2.$_POSY 变量

3.$_REQUEST 变量

二十三:获取下拉菜单的数据

1.下拉菜单--单选

2.下拉菜单--多选

3.单选按钮表单

4.checkbox 复选框

5.表单验证

二十四:多维数组

1.二维数组

指定键(关联数组)的二维数组

2.三维数组

二十五:date() 函数

1.日

2.星期

3.月

4.年

5.时间

6.时区

7.完整日期/时间

8.Runtime 配置

9.PHP 5 Date/Time 函数

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

二十六:包含文件

1.include 和 require 语句

2.示例一

3.示例二

4.示例四

二十七:文件处理

1.fopen() 函数 ---用于在PHP中打开文件

模式:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

示例:

2.fclose() 函数---用于关闭打开的文件

3.feof() 函数 ---检测是否已到达文件末尾(EOF)。

4. fgets() 函数---用于从文件中逐行读取文件

5. fgetc() 函数 ---从文件中逐字符读取文件

6.PHP 5 FIlesystem 函数

1.Runtime 配置

2.Unix / Windows 兼容性

3.PHP 5 Filesystem 函数

二十八:文件上传

1.创建一个文件上传表单

2.创建上传脚本

3.上传限制

4.保存被上传的文件

5.文件目录

二十九:Cookie--常用于识别用户

1. setcookie()函数--用于创建cookie.

2. $_COOKIE 变量---用于取回 cookie 的值。

3.用 isset() 函数 ---来确认是否已设置了 cookie

4.如何删除 cookie()

5.如果浏览器不支持Cookie ---通过表单中的submit按钮传递数据

三十: Session变量--存储关于用户会话(session)的信息

1.开始 PHP Session

2.$_SESSION 变量 -- 存储和取回 session变量

3.销毁或删除某些 Session数据--可以使用 unset() 或 session_destroy() 函数

三十一:发送电子邮件--mail() 函数用于从脚本中发送电子邮件

1.简易 E-Mail

2.Mail 表单

3.E-Mail 注入

4.防止 E-Mail 注入

三十二:错误处理

1.使用die() 函数

2.自定义错误处理器

3.设置错误处理程序

4.trigger_error() 函数 

5.错误记录

三十三:异常处理

1.异常的基本使用

2.try、throw、catch

3.创建一个自定义的 Exception类

4.多个异常

5.重新抛出异常

6.设置顶层异常处理器

7.异常的规则

三十四:过滤器

1.函数和过滤器

1.filter_var() --通过一个指定的过滤器来过滤单一的变量

2.filter_var_arry() ---通过多个过滤器来过滤多个变量

3.filter_input() -- 获取一个输入变量,并对它进行过滤

4.filter_input_array() —— 批量获取并过滤输入变量

5.常用过滤器常量一览

​编辑

2.选项和标志

3.验证输入

4.净化输入

5.过滤多个输入

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 函数内部声明的变量是局部变量,仅能在函数内部访问。

测试函数内变量:

"; echo "变量 x 为: $x"; echo "
"; //回车 //或 //echo PHP_EOL; // 换行符 //echo ($y)."\n" //换行 echo "变量 y 为: $y"; } myTest(); /*

xxxxxx

html中的段标签 浏览器会自动在段落前后添加一定的上下边距(margin),形成视觉上的分段。 */ echo "

测试函数外变量:

"; echo "变量 x 为: $x"; echo "
"; echo "变量 y 为: $y"; ?>

打印结果为:

/*若想在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'];
/////////////////////////////////////////////////////////////

三.注释格式

1.单行注释: // 或 #

2.多行注释:/* */

3.文档注释:/** */

四.字符串

1.定义

2.并置运算符:用于把两个字符串连接到一起

3.strlen()函数:获取字符串长度

";
$txt2="What a nice day!";
echo strlen($txt2);
echo PHP_EOL;
echo $txt1 . " " . $txt2;
echo PHP_EOL;
echo strlen($txt1."".$txt2);
?>

4.strpos()函数:用于从字符串中查找一个字符或一段文本

如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。


五.var_dump():用于调试打印数据结构

  1. 数据类型(如 stringintboolarraynull 等)

  2. 值的内容

  3. 如果是字符串,还会显示长度

  4. 如果是数组或对象,会递归展开结构

六.算数运算符: +加 -减 *乘 /除 %模 ~取反

';  // 换行
echo ($x - $y); // 输出4
echo '
'; // 换行 echo ($x * $y); // 输出60 echo '
'; // 换行 echo ($x / $y); // 输出1.6666666666667 echo '
'; // 换行 echo ($x % $y); // 输出4 echo '
'; // 换行 echo -$x; ?>

七. intdiv():a除b并向下取整    (php7+版本新增)

八.赋值运算符

九.递增/递减运算符

十.比较运算符

";
var_dump($x === $y);    //bool(false)
echo "
"; var_dump($x != $y); //bool(false) echo "
"; var_dump($x !== $y); //bool(true) echo "
"; $a=50; $b=90; var_dump($a > $b); //bool(false) echo "
"; 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

十二.数组运算符: +、==、=== 、!=、<>、!==

 "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);
?>

1. x+y x和y的集合

2. x == y 相等:如果x 和 y 有相同的键值对,则返回true

3. x === y 恒等:如果x和y有相同的键值对,且顺序相同、类型相同,则返回true

4. x !=  y 不相等:如果x不等于y,  则返回true

5. 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 合并运算符 ??

十四.组合比较符:$c = $a <=> $b;

PHP7+ 支持组合比较符(combined comparison operator)也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。

语法格式如下:

$c = $a <=> $b;

解析如下:

  • 如果 $a > $b, 则 $c 的值为 1
  • 如果 $a == $b, 则 $c 的值为 0
  • 如果 $a < $b, 则 $c 的值为 -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 (条件) {
	条件成立时要执行的代码;
}

///////////////////////////////////////////////

if elseif else语句

if (条件) {
    if 条件成立时执行的代码;
} elseif (条件) {
    elseif 条件成立时执行的代码;
} else {
    条件不成立时执行的代码;
}

十七.switch语句:

十八.数组 $cars = array("aa","bb","cc");

定义:
$cars = array("Volvo","BMW","Toyota");
自动分配 ID 键(ID 键总是从 0 开始):

在 PHP 中,有三种类型的数组:

  • 数值数组 - 带有数字 ID 键的数组
  • 关联数组 - 带有指定的键的数组,每个键关联一个值
  • 多维数组 - 包含一个或多个数组的数组

1.数值数组

I like Volvo, BMW and Toyota.
1.count()函数:获取数组的长度

打印结果:3

2.遍历数值数组 for循环
";
}
?>

打印结果:

2.关联数组

这里有两种创建关联数组的方法:

$age = array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

或:

$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";

"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
Peter is 35 years old.
foreach循环
"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "
"; } ?>

十九:数组排序

  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列

1.对数组进行排序  sort、rsort

升序 

"; sort($cars); for($i=0;$i降序

"; rsort($cars); for($i=0;$i升序

"; sort($numbers); for($i=0;$i降序

"; rsort($numbers); for($i=0;$i

打印结果:

2.根据数组的值,进行排序  asort、arsort

"35","Ben"=>"37","Joe"=>"43");
echo "

值升序

"; asort($age); foreach ($age as $name => $value) { echo "$name: $value\n"; } print_r($age); echo PHP_EOL; var_dump($age); echo "

值降序

"; arsort($age); foreach ($age as $name => $value) { echo "$name: $value\n"; } print_r($age); echo PHP_EOL; var_dump($age); ?>

打印结果:

3.根据数组的键,对数组进行排序

"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循环

";
    $i++;
}
?>

打印结果:

2.do...while语句

";
}
while ($i<=5);
?>

打印结果:

3.for循环

打印结果:

4.foreach循环

打印结果:

"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
    echo "key  为 " . $key . ",对应的 value 为 ". $value . PHP_EOL;
}
?>

打印结果:

二十一:函数

  • 函数名称以字母或下划线开头(不能以数字开头)

单参数:

";
}
echo "My name is ";
writeName("Kai Jim");
echo "My sister's name is ";
writeName("Hege");
echo "My brother's name is ";
writeName("Stale");
?>

打印结果:

多参数:

";
}
echo "My name is ";
writeName("Kai Jim",".");
echo "My sister's name is ";
writeName("Hege","!");
echo "My brother's name is ";
writeName("Ståle","?");
?>

打印结果:

返回值:

打印:

1 + 16 = 17

变量函数:

变量函数是指在 PHP 中,将一个变量作为函数名来调用的函数。

变量函数可以让我们在运行时动态地决定调用哪个函数。

\n";
}
function bar($arg = '')
{
    echo "In bar(); argument was '$arg'.
\n"; } // 使用 echo 的包装函数 function echoit($string) { echo $string; } $func = 'foo'; $func(); // 调用 foo() $func = 'bar'; $func('test'); // 调用 bar() $func = 'echoit'; $func('test'); // 调用 echoit() ?>

打印:

也可以用变量函数的语法来调用一个对象的方法。

$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 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。

//form.html



Get变量


名字: 年龄:
//welcome.php 欢迎 !
你的年龄是 岁。

当用户点击 "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 进行更改)。

//form.html



post变量


名字: 年龄:
//----------------------------------------------------------------- //welcome.php 欢迎 !
你的年龄是 岁。

当用户点击 "提交" 按钮时,URL 类似如下所示:

http://www.runoob.com/welcome.php

何时使用 method="post"?

从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。

然而,由于变量不显示在 URL 中,所以无法把页面加入书签。

3.$_REQUEST 变量

预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。

$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。

//welcone.php
欢迎 !
你的年龄是 岁。

二十三:获取下拉菜单的数据

以下实例我们设置了下拉菜单三个选项,表单使用 GET 方式获取数据,action 属性值为空表示提交到当前脚本,我们可以通过 select 的 name 属性获取下拉菜单的值:

1.下拉菜单--单选

//php_form_select.php
http://www.baidu.com';
        } else if($q =='GOOGLE') {
                echo '谷歌
http://www.google.com'; } else if($q =='TAOBAO') { echo '淘宝
http://www.taobao.com'; } } else { ?>

2.下拉菜单--多选

 '百度: 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 {
?>

3.单选按钮表单

http://www.baidu.com';
        } else if($q =='GOOGLE') {
                echo '谷歌
http://www.google.com'; } else if($q =='TAOBAO') { echo '淘宝
http://www.taobao.com'; } } else { ?>
Baidu Google Taobao

4.checkbox 复选框

 '百度: http://www.baidu.com',
            'GOOGLE' => '谷歌: http://www.google.com',
            'TAOBAO' => '淘宝: http://www.taobao.com',
    );
    foreach($q as $val) {
        echo $sites[$val] . PHP_EOL;
    }
} else {
?>
Baidu
Google
Taobao

5.表单验证

我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的压力。

如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单的数据传给当前页面(异步提交的方式更好),而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。

二十四:多维数组

多维数组是包含一个或多个数组的数组。

在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。

一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组,依照这种方式,我们可以创建二维或者三维数组。

1.二维数组

自动分配键值,从 0 开始:

array (
    array (elements...),
    array (elements...),
    ...
)

指定键(关联数组)的二维数组
array
    (
        "百度",
        "http://www.baidu.com"
    ),
    "google"=>array
    (
        "谷歌",
        "http://www.google.com"
    ),
    "taobao"=>array
    (
        "淘宝",
        "http://www.taobao.com"
    )
);
//print("
"); // 格式化输出数组
//print_r($sites);
//print("
"); 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...),
        ...
    ),
    ...
)

二十五:date() 函数

date() 函数可把时间戳格式化为可读性更好的日期和时间。

时间戳是一个字符序列,表示一定的事件发生的日期/时间。

语法
string date ( string $format [, int $timestamp ] )

  • d - 代表月中的天 (01 - 31)
  • m - 代表月 (01 - 12)
  • Y - 代表年 (四位数)
";
echo date("Y.m.d") . "
"; 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.示例一

//假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:



菜鸟教程(runoob.com)



欢迎来到我的主页!

一些文本。

3.示例二

//menu.php
echo '主页
HTML 教程
PHP 教程';
//-----------------------------------------------------



引用菜单文件


欢迎来到我的主页!

一些文本。

4.示例四

//vars.php

//-----------------------------------------------------



调用自定义文件


欢迎来到我的主页!

二十七:文件处理

1.fopen() 函数 ---用于在PHP中打开文件

模式:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

示例:

2.fclose() 函数---用于关闭打开的文件

3.feof() 函数 ---检测是否已到达文件末尾(EOF)。

在循环遍历未知长度的数据时,feof() 函数很有用。

if (feof($file)) echo "文件结尾";

注释:在 w 、a 和 x 模式下,您无法读取打开的文件!

4. fgets() 函数---用于从文件中逐行读取文件

注释:在 w 、a 和 x 模式下,您无法读取打开的文件!

";
}
fclose($file);
?>

5. fgetc() 函数 ---从文件中逐字符读取文件

注释:在调用该函数之后,文件指针会移动到下一个字符。

//逐字符地读取文件,直到文件末尾为止

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" 属性规定了应该把输入作为文件来处理。
  • 举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

// form.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"] - 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。

//upload_file.php
 0)
{
	echo "错误:" . $_FILES["file"]["error"] . "
"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "
"; echo "文件类型: " . $_FILES["file"]["type"] . "
"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]; } ?>

3.上传限制

限制用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB:

 0)
	{
		echo "错误:: " . $_FILES["file"]["error"] . "
"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "
"; echo "文件类型: " . $_FILES["file"]["type"] . "
"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]; } } else { echo "非法的文件格式"; } ?>

4.保存被上传的文件

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。

这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

 0)
	{
		echo "错误:: " . $_FILES["file"]["error"] . "
"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "
"; echo "文件类型: " . $_FILES["file"]["type"] . "
"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB
"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "
"; // 判断当前目录下的 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() 函数必须位于  标签之前。
2. 在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。
(为防止 URL 编码,请使用 setrawcookie() 取而代之。)

示例1:创建名为 "userId" 的 cookie,并为它赋值 "100086"。且cookie 在一小时后过期



//.....

示例2:通过另一种方式设置 cookie 的过期时间。



//.....

2. $_COOKIE 变量---用于取回 cookie 的值。

3.用 isset() 函数 ---来确认是否已设置了 cookie




判断是否存在


";
else
	echo "普通访客!
"; ?>

4.如何删除 cookie()

当删除 cookie 时,您应当使过期日期变更为过去的时间点。

5.如果浏览器不支持Cookie ---通过表单中的submit按钮传递数据

//form.html



使用submit提交


名字: 年龄:

取回 “welcome.php” 文件中的值




菜鸟教程(runoob.com)


欢迎 .
你 岁了。

三十: 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> 标签之前:

//向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。




2.$_SESSION 变量 -- 存储和取回 session变量





存储和取回session




示例:创建一个简单的 page-view计数器

3.销毁或删除某些 Session数据--可以使用 unset() 或 session_destroy() 函数

注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据。

unset() 函数用于释放指定的 session 变量:

通过调用 session_destroy() 函数彻底销毁 session:

三十一:发送电子邮件--mail() 函数用于从脚本中发送电子邮件

语法:mail(to,subject,message,headers,parameters)

注释:PHP 运行邮件函数需要一个已安装且正在运行的邮件系统(如:sendmail、postfix、qmail等)。所用的程序通过在 php.ini 文件中的配置设置进行定义。

1.简易 E-Mail

声明变量($to, $subject, $message, $from, $headers),然后我们在 mail() 函数中使用这些变量来发送了一封 E-mail

2.Mail 表单

向指定的 e-mail 地址发送了一条文本消息:




向指定地址发送一条文本消息



	Email: 
Subject:
Message:

"; } ?>

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 过滤器验证电子邮件地址的值



防止注入



	Email: 
Subject:
Message:

"; } ?>

三十二:错误处理

不同的错误处理方法:

  • 简单的 "die()" 语句
  • 自定义错误和错误触发器
  • 错误报告

1.使用die() 函数

2.自定义错误处理器

该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):

语法:

error_function(error_level,error_message,error_file,error_line,error_context)

错误报告级别:

function customError($errno, $errstr)
{
	echo "Error: [$errno] $errstr
"; echo "脚本结束"; die(); }

3.设置错误处理程序

set_error_handler("customError");
Error: [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
?>

执行:

4.trigger_error() 函数 

在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。

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 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
Error: [$errno] $errstr
"; 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 发送错误信息:

Error: [$errno] $errstr
"; 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" (未捕获异常)的错误消息。

让我们尝试抛出一个异常,同时不去捕获它:

1)
    {
        throw new Exception("Value must be 1 or below");
    }
    return true;
}
// 触发异常
checkNum(2);
?>

2.try、throw、catch

适当的处理异常代码应该包括:

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
1)
    {
        throw new Exception("变量值必须小于等于 1");
    }
        return true;
}
// 在 try 块 触发异常
try
{
    checkNum(2);
    echo '如果抛出异常,此文本不会输出';
}
// 捕获异常
catch(Exception $e)
{
    echo 'Message: ' .$e->getMessage();
}
?>

3.创建一个自定义的 Exception类

getLine().'
in '.$this->getFile() .':
'.$this->getMessage().'

不是一个合法的 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 类,并返回不同的错误消息:

getLine().' in '.$this->getFile()
        .': '.$this->getMessage().' 不是一个合法的 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" 代码块中再次抛出异常。

脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常:

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设置顶层异常处理器,

所有未被捕获的异常都会触发顶层的异常处理程序。

Exception: " , $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() --通过一个指定的过滤器来过滤单一的变量

打印:是个合法的整数。

2.filter_var_arry() ---通过多个过滤器来过滤多个变量
 '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 "所有数据都有效!
"; echo "邮箱: " . $filtered['email'] . "
"; echo "年龄: " . $filtered['age'] . "
"; echo "网址: " . $filtered['url']; } else { echo "有数据无效!"; } ?>

3.filter_input() -- 获取一个输入变量,并对它进行过滤
";
    echo "年龄: " . $age;
} else {
    echo "输入数据不合法!";
}
?>
4.filter_input_array() —— 批量获取并过滤输入变量
 FILTER_VALIDATE_EMAIL,
    'age'   => FILTER_VALIDATE_INT,
    'url'   => FILTER_VALIDATE_URL
]);
if ($inputs['email'] && $inputs['age'] && $inputs['url']) {
    echo "数据验证成功:
"; echo "邮箱: " . $inputs['email'] . "
"; echo "年龄: " . $inputs['age'] . "
"; echo "网址: " . $inputs['url']; } else { echo "部分数据无效!"; } ?>
5.常用过滤器常量一览

两种过滤器:.Validating(验证) 和 Sanitizing(清理)

Validating 过滤器:

  • 用于验证用户输入
  • 严格的格式规则(比如 URL 或 E-Mail 验证)
  • 如果成功则返回预期的类型,如果失败则返回 FALSE

Sanitizing 过滤器:

  • 用于允许或禁止字符串中指定的字符
  • 无数据格式规则
  • 始终返回字符串

2.选项和标志

选项和标志用于向指定的过滤器添加额外的过滤选项。

不同的过滤器有不同的选项和标志

在下面的实例中,我们用 filter_var() 和 "min_range" 以及 "max_range" 选项验证了一个整数:

array
    (
        "min_range"=>0,
        "max_range"=>256
    )
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
    echo("不是一个合法的整数");
}
else
{
    echo("是个合法的整数");
}
?>

3.验证输入

4.净化输入

5.过滤多个输入

表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。

 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 之间。
"); } elseif(!$result["email"]) { echo("E-Mail 不合法
"); } else { echo("输入正确"); } ?>

6.Filter Callback 过滤器

使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。

"convertSpace"));
?>