当前位置: 首页 > news >正文

PHP基础知识

目录

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

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

打印结果为:

/*若想在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
//定义字符串
$txt="Hello world!";
echo $txt;
?>

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

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
//中间加空格
echo $txt1 . " " . $txt2;
echo PHP_EOL;
//直接连接
echo $txt1.$txt2;
?>

<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出Hello world! $x="Hello";
$x .= " world!";
echo $x; // 输出Hello world! 
?>

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

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

  1. 数据类型(如 stringintboolarraynull 等)

  2. 值的内容

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

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

<?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 
$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
var_dump(intdiv(10, 3));  //int(3)
?>

八.赋值运算符

<?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
$x=10; 
echo ++$x; // 输出11$y=10; 
echo $y++; // 输出10$z=5;
echo --$z; // 输出4$i=5;
echo $i--; // 输出5
?>

十.比较运算符

<?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
$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
// 普通写法
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
echo $username, PHP_EOL;// PHP 5.3+ 版本写法
$username = $_GET['user'] ?: 'nobody';
echo $username, PHP_EOL;
?>

<?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
echo (1 <=> 1) . "\n";        //0
echo (1 <=> 2) . "\n";        //-1
echo (2 <=> 1) . "\n";        //1echo (1.5 <=> 1.5) . "\n";    //0
echo (1.5 <=> 2.5) . "\n";    //-1
echo (2.5 <=> 1.5) . "\n";    //1echo ("a" <=> "a") . "\n";    //0
echo ("a" <=> "b") . "\n";    //-1
echo ("b" <=> "a") . "\n";    //1
?>

十五.运算符优先级

优先级: && 、= 、 and
优先级: || 、 = 、 or

十六. if else语句

if (条件) {条件成立时要执行的代码;
}
<?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
$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
$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
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
I like Volvo, BMW and Toyota.
1.count()函数:获取数组的长度
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>

打印结果:3

2.遍历数值数组 for循环
<?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
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
Peter is 35 years old.
foreach循环
<?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
$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
$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
$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
$i=1;
while($i<=5)
{echo "The number is " . $i . "<br>";$i++;
}
?>

打印结果:

2.do...while语句

<?php
$i=1;
do
{$i++;echo "The number is " . $i . "<br>";
}
while ($i<=5);
?>

打印结果:

3.for循环

<?php
for ($i=1; $i<=5; $i++)
{echo "数字为 " . $i . PHP_EOL;
}
?>

打印结果:

4.foreach循环

<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{echo $value . PHP_EOL;
}
?>

打印结果:

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

打印结果:

二十一:函数

  • 函数名称以字母或下划线开头(不能以数字开头)
<?php
function test()
{echo "这是一个函数";
}
test();
?>

单参数:

<?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
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
function add($x,$y)
{$total=$x+$y;return $total;
}echo "1 + 16 = " . add(1,16);
?>

打印:

1 + 16 = 17

变量函数:

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

//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 进行更改)。

//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 方法发送的表单数据。

//welcone.php
欢迎 <?php echo $_REQUEST["fname"]; ?>!<br>
你的年龄是 <?php echo $_REQUEST["age"]; ?>  岁。

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

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

1.下拉菜单--单选

//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
$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
$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
$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
// 二维数组:
$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
$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
// 创建三维数组
$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
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.示例一

//假设您有一个标准的页头文件,名为 "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.示例二

//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.示例四

//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
/*
第一个参数含有要打开的文件的名称,
第二个参数规定了使用哪种模式来打开文件
*/
$file = fopen("welcome.txt","r");
?>
模式:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

示例:
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>

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

<?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
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{echo fgets($file). "<br>";
}
fclose($file);
?>

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

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

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

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

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

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

//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
// 允许上传的图片后缀
$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
// 允许上传的图片后缀
$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 目录权限为 777if (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
setcookie("userId", "100086", time()+3600);
?><html>
//.....
</html>

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

<?php
$expire=time()+60*60*24*30; //过期时间30天
setcookie("user", "runoob", $expire);
?><html>
//.....
</html>

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

<?
php
// 输出 cookie 值
echo $_COOKIE["userId"];// 查看所有 cookie
print_r($_COOKIE);
?>

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

<html>
<head>
<meta charset="utf-8">
<title>判断是否存在</title>
</head>
<body><?php
if (isset($_COOKIE["userId"]))echo "用户 " . $_COOKIE["userId"] . "!<br>";
elseecho "普通访客!<br>";
?></body>
</html>

4.如何删除 cookie()

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

<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("userId", "", time()-3600);
?>

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

//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” 文件中的值

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

//向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
<?php session_start(); ?><html>
<body></body>
</html>

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

<?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
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
session_start();
if(isset($_SESSION['views']))
{unset($_SESSION['views']);
}
?>

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

<?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
$to = "someone@example.com";         // 邮件接收者
$subject = "参数邮件";                // 邮件标题
$message = "Hello! 这是邮件的内容。";  // 邮件正文
$from = "someonelse@example.com";   // 邮件发送者
$headers = "From:" . $from;         // 头部信息设置
mail($to,$subject,$message,$headers);
echo "邮件已发送";
?>

2.Mail 表单

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

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

错误报告级别:

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

3.设置错误处理程序

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

执行:

4.trigger_error() 函数 

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

<?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
// 错误处理函数
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
// 错误处理函数
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
// 创建一个有异常处理的函数
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
// 创建一个有异常处理的函数
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
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 messageecho $e->errorMessage();
}
?>

4.多个异常

可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息:

<?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
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
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
$int = 123;if(!filter_var($int, FILTER_VALIDATE_INT))
{echo("不是一个合法的整数");
}
else
{echo("是个合法的整数");
}
?>

打印:是个合法的整数。

2.filter_var_arry() ---通过多个过滤器来过滤多个变量
<?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
// 假设通过 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
// 假设 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
$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
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
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
$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
function convertSpace($string)
{return str_replace("_", ".", $string);
}$string = "www_runoob_com!";echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>

http://www.dtcms.com/a/544780.html

相关文章:

  • Obsidian 入门教程
  • 响应式购物网站模板广州网站优化电话
  • 中山 网站建设 骏域做ag视频大全网站
  • Vue二进制数据渲染成图片
  • 未来智能网联汽车的网络安全档案建立方法
  • 防止表单重复提交功能简单实现
  • 网络安全等级保护测评高风险判定实施指引(试行)--2020与2025版对比
  • Squid 可观测性最佳实践
  • 【深度学习新浪潮】DeepSeek-OCR深度解析:视觉-文本压缩驱动的新一代OCR技术革命
  • 官方网站建设投标书网站建设包含哪些
  • 相应式手机网站建设网站建设专员一定要会网站建设吗
  • 手机云台ESD整改案例-阿赛姆电子
  • 拆解ASP.NET MVC 核心优势:松耦合、易测试、SEO 友好、RESTful 实战指南
  • 远期合约和期权合约的区别是什么?
  • 2025年国内数字化档案管理软件选型速览
  • 基于FPGA的雷达信号处理设计工具包分享
  • 基于MATLAB的多机器人编队控制系统设计与实现
  • 网站建设计划表模板西安的网站设计单位
  • linux Debian 12 安装 Docker(手动)
  • 天津网站建设培训wordpress网页如何公开
  • 从零到一:用仓颉语言打造你的第一个鸿蒙应用
  • VUE的“单向数据绑定” 和 “双向数据绑定”
  • Profile-Guided Optimization(PGO):Rust 性能优化的终极武器
  • 仓颉FFI实战:C/C++互操作与性能优化
  • FAQ09934:相机prevew时候出现水印问题
  • 基于XML方式的声明式事务管理 -》某配置文件解读
  • 神领物流v2.0-day01-环境搭建与登录笔记(个人记录、含练习答案、仅供参考)
  • 网页广告多少钱wordpress4.9.8优化
  • 佛山门户网站建设公司关键词搜索量全网查询
  • 国内数字孪生公司:技术革新与产业落地的双轮驱动