PHP基础知识

目录

[一.PHP 变量规则:](#一.PHP 变量规则:)

[二.变量作用域 local、global、static、parameter](#二.变量作用域 local、global、static、parameter)

三.注释格式

1.单行注释: // 或 #

[2.多行注释:/* */](#2.多行注释:/* */)

[3.文档注释:/** */](#3.文档注释:/** */)

四.字符串

1.定义

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

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

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

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

[数据类型(如 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语句)

十七.switch语句:

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

1.数值数组

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

[2.遍历数值数组 for循环](#2.遍历数值数组 for循环)

2.关联数组

foreach循环

十九:数组排序

[1.对数组进行排序 sort、rsort](#1.对数组进行排序 sort、rsort)

[2.根据数组的值,进行排序 asort、arsort](#2.根据数组的值,进行排序 asort、arsort)

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

二十:循环

1.while循环

2.do...while语句

3.for循环

4.foreach循环

二十一:函数

单参数:

多参数:

返回值:

变量函数:

[二十二:表单和用户输入 _GET、_POST](#二十二:表单和用户输入 _GET、_POST)

[1._GET 变量](#1._GET 变量)

[2._POSY 变量](#2._POSY 变量)

[3._REQUEST 变量](#3._REQUEST 变量)

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

1.下拉菜单--单选

2.下拉菜单--多选

3.单选按钮表单

[4.checkbox 复选框](#4.checkbox 复选框)

5.表单验证

二十四:多维数组

1.二维数组

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

2.三维数组

[二十五:date() 函数](#二十五:date() 函数)

1.日

2.星期

3.月

4.年

5.时间

6.时区

7.完整日期/时间

[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 语句)

2.示例一

3.示例二

4.示例四

二十七:文件处理

[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.创建一个文件上传表单

2.创建上传脚本

3.上传限制

4.保存被上传的文件

5.文件目录

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

[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() 函数)

2.自定义错误处理器

3.设置错误处理程序

[4.trigger_error() 函数](#4.trigger_error() 函数)

5.错误记录

三十三:异常处理

1.异常的基本使用

2.try、throw、catch

[3.创建一个自定义的 Exception类](#3.创建一个自定义的 Exception类)

4.多个异常

5.重新抛出异常

6.设置顶层异常处理器

7.异常的规则

三十四:过滤器

1.函数和过滤器

[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() —— 批量获取并过滤输入变量)

5.常用过滤器常量一览

​编辑

2.选项和标志

3.验证输入

4.净化输入

5.过滤多个输入

[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():用于调试打印数据结构

数据类型 (如 stringintboolarraynull 等)

值的内容

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

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

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);
?>
  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 合并运算符 ??

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>
php 复制代码
<?
php
// 输出 cookie 值
echo $_COOKIE["userId"];

// 查看所有 cookie
print_r($_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

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

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. 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"));
?>
相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端