php-3(进阶)

1.多维数据循环和遍历

<?php
// 二维数组:
$cars = array
(
    array("Volvo",100,96),
    array("BMW",60,59),
    array("Toyota",110,100)
);
for ($i=0;$i<sizeof($cars);$i++){
    $a=$cars[$i];
    for ($x=0;$x<sizeof($a);$x++){
    echo($a[$x].PHP_EOL);
    }
    echo("<br>");
    date_default_timezone_set("Etc/GMT-8");//php默认时间少8小时,设置北京时间
    echo(date("Y-m-d H:i:s"));
}

?>

2.php时间函数date()

<?php

      //Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次為重慶,上海,烏魯木齊)
       //港台地區可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次為澳門,香港,台北)
       //台灣地区可設為:date.timezone = "Asia//Taipei"
      //還有新加坡:Asia/Singapore
    date_default_timezone_set("Etc/GMT-8");//php默认时间少8小时,设置北京时间
    echo(date("Y-m-d H:i:s"));

?>
format 字符 说明 返回值例子
--- ---
d 月份中的第几天,有前导零的 2 位数字 0131
D 星期中的第几天,文本表示,3 个字母 MonSun
j 月份中的第几天,没有前导零 131
l("L"的小写字母) 星期几,完整的文本格式 SundaySaturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 stndrd 或者 th。可以和 j 一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0365
星期 --- ---
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
--- ---
F 月份,完整的文本格式,例如 January 或者 March JanuaryDecember
m 数字表示的月份,有前导零 0112
M 三个字母缩写表示的月份 JanDec
n 数字表示的月份,没有前导零 112
t 给定月份所应有的天数 2831
--- ---
L 是否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:19992003
y 2 位数字表示的年份 例如:9903
时间 --- ---
a 小写的上午和下午值 ampm
A 大写的上午和下午值 AMPM
B Swatch Internet 标准时 000999
g 小时,12 小时格式,没有前导零 112
G 小时,24 小时格式,没有前导零 023
h 小时,12 小时格式,有前导零 0112
H 小时,24 小时格式,有前导零 0023
i 有前导零的分钟数 0059>
s 秒数,有前导零 0059>
u 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 示例: 654321
时区 --- ---
e 时区标识(PHP 5.1.0 新加) 例如:UTCGMTAtlantic/Azores
I 是否为夏令时 如果是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 例如:+0200
P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00
T 本机所在的时区 例如:ESTMDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -4320043200
完整的日期/时间 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time()

3.php包含文件includ和require

nclude 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

include 和 require 的区别

  • require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件;
  • include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。
  • require 引入的文件有错误时,执行会中断,并返回一个致命错误;
  • include 引入的文件有错误时,会继续执行,并返回一个警告。

语法:

include 'filename';


require 'filename';

4.文件处理

fopen() 函数用于在 PHP 中打开文件。

fgets()函数,获取文件内容。第一个参数为文件流,第二个为长度

fclose()关闭操作的文件

<?php
//fopen操作的文件路径,第一个参数 为文件路径和名称,第二个为操作类型
//or exit当文件无效时打印提示
$f=fopen("C:/Users/Administrator/Desktop/test.txt", "r") or exit("Unable to open file!");
//fgets()函数,逐行读取文件。第一个参数为文件流,第二个为长度。在调用该函数之后,文件指针会移动到下一行。
//fgetc() 函数用于从文件中逐字符地读取文件。在调用该函数之后,文件指针会移动到下一个字符
while(!feof($f))
{
    echo fgets($f). "<br>";
    echo fgetc($f). "<br>";
}
fclose($f)
?>

文件操作类型:

模式 描述
r 只读。在文件的开头开始。
r+ 读/写。在文件的开头开始。
w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+ 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+ 读/追加。通过向文件末尾写内容,来保持文件内容。
x 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+ 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

5.文件上传

  • <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
  • <input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

upload.php

<?php 
header("content-type:text/html;charset=GBK");
?>
<html>
<head>
<meta charset="GBK">
<title>upload</title>
</head>
<body>

<form action="upload1.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>

upload1.php

<?php 
header("content-type:text/html;charset=GBK");
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
//explode把字符串打散维数组
$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检查数组中是否包含某个值
&& 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 目录是否存在该文件,若没有则创建
        if(!(file_exists("upload"))){
            mkdir(__DIR__."/upload");
        }
        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 "非法的文件格式";
}
?>

6.cookie

cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

setcookie() 函数用于设置 cookie。

setcookie() 函数必须位于 <html> 标签之前。

语法:setcookie(name, value, expire, path, domain);

设置、取出及删除cookie

<?php 
header("content-type:text/html;charset=GBK");
//设置cookie
setcookie("user", "runoob", time()+3600);
?>
<html>
<head>
<meta charset="GBK">
<title>cookie</title>
</head>
<body>
<?php 
//根据名称取出cookie
echo $_COOKIE["user"];
echo("<br>");
//取出所有cookie
print_r($_COOKIE);
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
echo $_COOKIE["user"]."------";
?>

</body>
</html>

7.session

session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

在使用 session 之前,首先必须启动会话。

session_start() 函数必须位于 <html> 标签之前

例:session的创建及销毁

<?php 
header("content-type:text/html;charset=GBK");
//启动session
session_start();
//存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量
if(isset($_SESSION['num'])){
    $_SESSION['num']=$_SESSION['num']+1;
}else{
 $_SESSION['num']=1;
}
?>
<html>
<head>
<meta charset="GBK">
<title>cookie</title>
</head>
<body>
<?php 
//取出session
echo $_SESSION["num"];
echo("<br>");
//释放指定session
unset($_SESSION['num']);
//释放所有session
session_destroy();
?>

</body>
</html>

8.php发送email

配置方式有多种,以xampp环境发送qq邮箱为例,利用stmp mail()函数发送邮件

1.配置php.ini

  sendmail_path =D:\xampp\sendmail\sendmail.exe -t(只需要配置这一个)

2.配置sendemail.ini

smtp_server=smtp.qq.com

smtp_port=25

smtp_ssl=auto

error_logfile=error.log

auth_username=发送者QQ邮箱@qq.com
auth_password=你的授权码(设置第三步时,会返给你授权码)

force_sender=发送者QQ邮箱@qq.com

3.去邮箱设置允许stmp邮件收发

4.编写测试php代码

<?php
header("content-type:text/html;charset=GBK");
$to = "接收者@qq.com";         // 邮件接收者
$subject = "php邮件";                // 邮件标题
$message = "Hello word!。";  // 邮件正文
$from = "发送者@qq.com";   // 邮件发送者
$headers = "From:" . $from;         // 头部信息设置
mail($to,$subject,$message,$headers);
echo "邮件已发送";
?>

9.错误处理

自定义错误处理器

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

语法:error_function(error_level,error_message, error_file,error_line,error_context)

参数含义:

参数 描述
error_level 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
error_message 必需。为用户定义的错误规定错误消息。
error_file 可选。规定错误发生的文件名。
error_line 可选。规定错误发生的行号。
error_context 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

    error_level级别:

常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
<?php
header("content-type:text/html;charset=GBK");
function customError($errno, $errstr,$error_file,$error_line,$error_context)
{
    echo("错误级别:".$errno."<br>");
    echo("错误信息:".$errstr."<br>");
    echo("文件名称:".$error_file."<br>");
    echo("行数:".$error_line."<br>");
    echo(sizeof($error_context));
    for ($i=1;$i<=sizeof($error_context);$i++){
        echo($error_context[$i]."<br>");
    } 
}


// 设置错误处理函数
set_error_handler("customError" );
//trigger_error("变量值必须小于等于 1");

// 触发错误
echo($test);
?>

10.exception异常

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。

Try、throw 和 catch:

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
<?php
header("content-type:text/html;charset=GBK");
// 创建一个有异常处理的函数
function checkNum($number)
{
    if($number!=1)
    {
        throw new Exception("数值不等于1");
    }
    return true;
}

// 在 try 块 触发异常
try
{
    checkNum(3);
    // 如果抛出异常,以下文本不会输出
    echo '如果输出该内容,说明 $number 变量';
}
// 捕获异常
catch(Exception $e)
{
    echo 'Message: ' .$e->getMessage();
}
?>
  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 "try" 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出。
  4. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。

11.过滤器

PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。

PHP 过滤器用于验证和过滤来自非安全来源的数据。

测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。

PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。

几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。

您应该始终对外部数据进行过滤!

  • 来自表单的输入数据
  • Cookies
  • Web services data
  • 服务器变量
  • 数据库查询结果

函数:

如需过滤变量,请使用下面的过滤器函数之一:

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

Validating 和 Sanitizing:

Validating 过滤器:

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

Sanitizing 过滤器:

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

filter_var()实例:

<?php 
header("content-type:text/html;charset=GBK");
$int = 123; // 无额外过滤选项 只判定是否为整数 
if(!filter_var($int, FILTER_VALIDATE_INT)) {
    // 输出:Integer is valid 
    echo "不是整数"."<br>"; 
} else { 
    echo "是整数"."<br>"; 
} 
// 选项和标志,属于额外过滤选项 
$int_options = array( 
    "options" => array(
    // 'options' 固定
    "min_range" => 0, 
    // 最小值 
    "max_range" => 100 
    // 最大值 'min_range'和'max_range' 也固定
    )
    ); 
    // 过滤单一变量 即$int 增加额外过滤选项
    if(!filter_var($int, FILTER_VALIDATE_INT, $int_options)) {
        // 输出:Integer is not valid 
        echo "不在范围内"."<br>"; 
    } else { 
        echo "在范围内"."<br>"; 
    }
?>

filter_has_var() 和 filter_input()

filter_has_var(type, variable) 两个参数必填

参数一:

INPUT_GET

INPUT_POST

INPUT_COOKIE

INPUT_SERVER

INPUT_ENV

参数二:表单里的命名变量 filter_input(input_type, variable, filter, options) 前两个参数必填,后两个可选填,第三个不填则使用默认过滤条件,只判断是否为字符串。
 

<hr> 
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   Email : <input type="text" name="email"> 
   Url: <input type="text" name="url"> 
   <input type="submit" name="submit" value="提交"> 
   </form> 
   <hr> 
   <?php 
   header("content-type:text/html;charset=GBK");
    // 检查提交表单中是否含 "email"
    if (!filter_has_var(INPUT_POST, "email")) {
        echo "email不可为空<br>";
    } else {
        // 检查是否为有效邮箱地址
        if (!filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL)) {
            echo "email不是合法邮箱<br>";
        } else {
            echo "email是合法邮箱<br>";
        }
    }
    //filter_has_var判断post请求参数是否存在
    if (!filter_has_var(INPUT_POST, "url")) {
        echo "url不可为空<br>";
    } else {
        if (!filter_input(INPUT_POST, "url", FILTER_VALIDATE_URL)) {
            echo "url不是合法url<br>";
        } else {
            echo "url是合法url<br>";
        }
    }
 ?>

filter_input_array()过滤多输入

可能的选项或标志:

  • FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
  • FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
  • FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
  • FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
  • FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
  • FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 &amp;
  <!--filter_input_array函数-->
   <?php 
   header("content-type:text/html;charset=GBK");
   $name=$age=$email="";
  $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, ); 
   // 符合过滤条件返回原变量否则返回false 'INPUT_GET' 对应表单提交的 method 
   $result = filter_input_array(INPUT_GET, $filters); 
   $name=$result["name"];
   $age=$result["age"];
   $email=$result["email"];
   if (!$result["age"]) {
    echo "Age应该位于 1到120之间.<br>"; 
    } else { 
    echo "age是有效的.<br>";
     } if (!$result["email"]) {
      echo "Email是无效的.<br>"; 
      } else { 
          echo "Email是有效的.<br>"; 
      } if (!$result["name"]) {
       echo "User是无效的.<br>"; 
       } else { 
       echo "User是有效的.<br>"; 
       }
       ?>
  
  
<form method="get" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
 Name: <input type="text" name="name" value="<?php echo $name;?>">
 Age: <input type="text" name="age" value="<?php echo $age;?>">
 Email: <input type="text" name="email" value="<?php echo $email;?>">
  <input type="submit" name="submit" value="提交"> 
  </form> 

自定义过滤器callback:

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

您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。

<?php 
//filter_var函数
header("content-type:text/html;charset=GBK");
function convertSpace($string)
{
    return str_replace("_", ".", $string);
}

$string = "www_baidu_com!";

echo filter_var($string, FILTER_CALLBACK,
    array("options"=>"convertSpace"));
?>

12.json

函数 描述
json_encode 对变量进行 JSON 编码
json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
json_last_error 返回最后发生的错误

 son_encode:

PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。

语法:

string json_encode ( $value [, $options = 0 ] )

参数:

  • value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
  • options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
<?php 
header("content-type:text/html;charset=GBK");
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>

 json_decode:

PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。

语法:

mixed json_decode ($json_string [,$assoc = false [, $depth = 512 [, $options = 0 ]]])

参数:

  • json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据

  • assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。

  • depth: 整数类型的参数,它指定递归深度

  • options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。


<?php
   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

   var_dump(json_decode($json));
   var_dump(json_decode($json, true));
?>

猜你喜欢

转载自blog.csdn.net/weixin_42071232/article/details/85011938