PHP教程

php高级学习--2

本文主要是介绍php高级学习--2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.发送电子邮件

1.1mail() 函数

mail(to,subject,message,headers,parameters)

通过 PHP 发送电子邮件的最简单的方式是发送一封文本 email。

在下面的实例中,我们首先声明变量($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 "邮件已发送";
?>

1.2Mail 表单

通过 PHP,能够在自己的站点制作一个反馈表单。下面的实例向指定的 e-mail 地址发送了一条文本消息:

 <html>
<header>
</header>
<body>
<?php
if(isset($_REQUEST["email"])){
    $emali=$_REQUEST["email"];
    $subject=$_REQUEST["subject"];
    $message=$_REQUEST["message"];
    mail("40450748.qq.com",$subject,$message,"From".$email);
    echo "邮件发送成功";
    
}else{
    echo "<form method='post' action='formemail.php'>
    email:<input type='text' name='email'><br><br>
    subject:<input type='text' name='subject'><br><br>
    message:<Textarea name='message' rows='15' cols='45'></Textarea><br><br>
    <input type='submit' value='提交'>
    </form>
    ";
}
?>
</body>
</html>

2.Secure E-mails

未经授权的用户可通过输入表单在邮件头部插入数据。

假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ATo:person6@example.com

与往常一样,mail() 函数把上面的文本放入邮件头部,那么现在头部有了额外的 Cc:、Bcc: 和 To: 字段。当用户点击提交按钮时,这封 e-mail 会被发送到上面所有的地址!

 

2.1防止 E-mail 注入

防止 e-mail 注入的最好方法是对输入进行验证。

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

}

在上面的代码中,我们使用了 PHP 过滤器来对输入进行验证:

filter_var() 函数通过指定的过滤器过滤一个变量。

如果成功,则返回被过滤的数据。如果失败,则返回 FALSE。

  • FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
  • FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值
 

3.错误处理

 在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。
  • 简单的 "die()" 语句
  • 自定义错误和错误触发器
  • 错误报告

3.1基本的错误处理:使用 die() 函数

我们在访问文件之前检测该文件是否存在:

<?php
if(!file_exists("welcome.txt"))
{
    die("文件不存在");
}
else
{
    $file=fopen("welcome.txt","r");
}
?>

它采用了一个简单的错误处理机制在错误之后终止了脚本。
 

3.2创建自定义错误处理器

创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。

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

3.2.1语法

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.2.2设置错误处理程序

以修改错误处理程序,使其仅应用到某些错误,这样脚本就能以不同的方式来处理不同的错误。然而,在本例中,我们打算针对所有错误来使用我们自定义的错误处理程序:

set_error_handler("customError",[option:错误级别]);

由于我们希望我们的自定义函数能处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。


<?php

function customerror($error,$error_str){
    echo "<b>error:</b> ['$error'] $error_str<br>";
}
set_error_handler("customerror");
echo "$ss";

?>

3.2.3触发错误

在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 PHP 中,这个任务由 trigger_error(,【option:错误类型】) 函数完成。

在本例中,如果 "test" 变量大于 "1",就会发生错误:

<?php
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

以上代码的输出如下所示:

Notice: 变量值必须小于等于 1
in /www/test/runoob.php on line 5
 可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误类型。

可能的错误类型:

  • E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
  • E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
  • E_USER_NOTICE - 默认。用户生成的 run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。

如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们自定义的错误处理程序并结束脚本:

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

以上代码的输出如下所示:

Error: [512] 变量值必须小于等于 1
脚本结束


3.3错误记录

 在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。

 

4.异常处理

异常用于在指定的错误发生时改变脚本的正常流程。

4.1异常的基本使用

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

Try、throw 和 catch

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
 1 <?php
 2 function checknum($num){
 3     if($num>1){
 4         throw new Exception ("变量值必须小于1");
 5     }else{
 6         return true;
 7     }
 8 }
 9 try{
10     $a=2;
11     if(checknum($a)){
12 
13     }
14 
15 }catch(Exception $e){
16     echo "error:".$e->getMessage();
17 }
18 
19 ?>

 

 

4.2创建一个自定义的 Exception 类

 我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。
这个自定义的 customException 类继承了 PHP 的 exception 类的所有属性,可向其添加自定义的函数。

<?php
class CustomException extends Exception{
    function error_message(){
        $error_str= '错误行数:'.$this->getLine().'错误文件名:'.$this->getFile()."<b>".$this->getMessage()."</b>这不是一个合法的邮箱地址";
        return $error_str;

    }
}
$email=231323;
try{
    if((filter_var($email,FILTER_VALIDATE_EMAIL))===false){
        throw new CustomException();
    }
}
catch(CustomException $e){
    echo $e->error_message();

}
?>

 

 

4.3设置顶层异常处理器

set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。

 <?php
 function myexception($e){
	 echo "<b>Exception:</b>".$e->getMessage();
 }

 set_exception_handler("myexception");
 throw new Exception("未发现的错误");
 ?>

 

4.4异常的规则

  • 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
  • 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
  • 使用多个 catch 代码块可以捕获不同种类的异常。
  • 可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。

简而言之:如果抛出了异常,就必须捕获它。

5.过滤器

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

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

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

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

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

输入过滤是最重要的应用程序安全课题之一。

什么是外部数据?

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

 

5.1函数和过滤器

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

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
<?php
$int=123;
if(filter_var($int ,FILTER_VALIDATE_INT)){
    echo "这是一个合法的整数";
}else{
    echo "这不是一个合法的整数";

}
?>

 

 

5.2Validating 和 Sanitizing

 

Validating 过滤器:

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

Sanitizing 过滤器:

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

5.3选项和标志

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

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

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

选项必须放入一个名为 "options" 的相关数组中

<?php
$int=11111;
$option_range=array(
        "options"=>array(
        "min_range"=>0,
        "max_range"=>300
        ));
if(!filter_var($int,FILTER_VALIDATE_INT,$option_range)){
    echo "这不是一个合法的整数";

}else{
    echo "这是一个合法的整数";
}
?>

5.4验证输入

在浏览器url后输入email变量的值或不输入

<?php
if(!filter_has_var(INPUT_GET,"email")){
    echo "变量不存在";
}else{
    if(!filter_input(INPUT_GET,"email",FILTER_VALIDATE_EMAIL)){
        echo "输入的邮箱地址不合法";
    }else{
        echo "输入的邮箱地址合法";
    }
}
?>

 

filter_input() 函数从脚本外部获取输入(比如表单输入),并进行过滤。

filter_input(input_type, variable(变量名), filter(过滤器), options(可选项:过滤))

filter_has_var() 函数检查是否存在指定输入类型的变量。
filter_has_var(type, variable)
type:
  • INPUT_GET
  • INPUT_POST
  • INPUT_COOKIE
  • INPUT_SERVER
  • INPUT_ENV

5.5净化输入

让我们试着清理一下从表单传来的 URL。

首先,我们要确认是否存在我们正在查找的输入数据。

然后,我们用 filter_input() 函数来净化输入数据。

在下面的实例中,输入变量 "url" 被传到 PHP 页面:

<?php
if(filter_has_var(INPUT_GET,"url")){
    $url=filter_input(INPUT_GET,"url",FILTER_SANITIZE_URL);
    echo $url;
    
}else{
    echo "不存在url变量";
}
?>

5.6过滤多个输入

 表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。
<?PHP
$filters=array(
    "name"=>FILTER_SANITIZE_STRING,
    "age"=>array(
    "options"=>array(
    min_range=>0,
    max_range=>100
    ),
    "filter"=>FILTER_VALIDATE_INT
    ),
    "email"=>FILTER_VALIDATE_EMAIL
);
$result=filter_input_array(INPUT_GET,$filters);
if(!$result["age"]){
    echo "年龄不合法!";
}elseif(!$result["email"]){
    echo "邮箱地址不合法!";
}
else{
    echo "输入正确";
}
?>

上面的实例有三个通过 "GET" 方法传送的输入变量 (name、age 和 email):

  1. 设置一个数组,其中包含了输入变量的名称和用于指定的输入变量的过滤器
  2. 调用 filter_input_array() 函数,参数包括 GET 输入变量及刚才设置的数组
  3. 检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入。(如果存在非法输入,在使用 filter_input_array() 函数之后,输入变量为 FALSE。)

filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。

如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。

如果该参数是一个数组,那么此数组必须遵循下面的规则:

  • 必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量)
  • 此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志和选项的数组

 


5.7Filter Callback

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

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

将准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options",指定的函数必须存入名为 "options" 的关联数组中。

在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为 ".":

 
<?php
if($_GET['url']){
$url=$_GET['url'];
function convert($url){
    return  str_replace("-",".",$url);
}
    echo  filter_var($url, FILTER_CALLBACK,array("options"=>"convert"));
}else{
    echo "变量不存在";
}

?>

 



6.高级过滤器

6.1检测一个数字是否在一个范围内

<?php
$num=123;
$min_num=0;
$max_num=444;
if(!filter_var($num,FILTER_VALIDATE_INT,array("options"=>array("min_range"=>$min_num,"$max_num"=>$max_num)))){
    echo "不是一个合法的整数";
}else{
    echo "是一个合法的整数";

}
?>

 

 

6.2检测 IPv6 地址

<?php
$ip1="2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
if(!filter_var($ip1,FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)){
    echo "不是一个合法的IPv6地址";
}else{
    echo "是一个合法的IPv6地址";

}
?>

 

6.3检测 URL - 必须包含QUERY_STRING(查询字符串)

<?php
if(isset($_REQUEST['url'])){
    $url1=$_REQUEST['url'];
    if(!filter_var($url1,FILTER_VALIDATE_URL,FILTER_FLAG_QUERY_STRING)){//附加过滤FILTER_FLAG_QUERY_STRING
        echo "变量不合法";
    }else{
        echo "变量合法";
    }
}else{
    echo "变量url不存在!";
}
?>

 

6.4移除 ASCII 值大于 127 的字符

<?php
$str="qbrewhfbjv<html>";
$new_str=filter_var($str,FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_HIGH);
ECHO $new_str;
?>

 

使用了 filter_var() 函数来移除字符串中 ASCII 值大于 127 的字符,同样它也能移除 HTML 标签

 

7.JSON

7.1json_encode

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, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR。

    要注意的是 JSON_UNESCAPED_UNICODE 选项,如果我们不希望中文被编码,可以添加该选项。
 将 PHP 数组转换为 JSON 格式数据:
<?php
$arr=array("1"=>"a","2"=>"r","3"=>"4");
echo json_encode($arr);
?>

 

{"1":"a","2":"r","3":"4"}

将 PHP 对象转换为 JSON 格式数据:

<?php
class people{
    public $name="";
    public $gender="";
    public $height="";
    public $age="";

}
$li=new people();
$li->name="xioali";
$li->gender="male";
$li->height="1.7m";
$li->age="18";
echo json_encode($li);
?>

{"name":"xioali","gender":"male","height":"1.7m","age":"18"}

 

7.2使用 JSON_UNESCAPED_UNICODE 选项

<?php
$arrr=array("q"=>"小笼包子","w"=>"香菇肉酱面","s"=>"藤椒鸡排","d"=>"小火锅米线");
echo json_encode($arrr)."<br>";
echo json_encode($arrr,JSON_UNESCAPED_UNICODE);

?>

{"q":"\u5c0f\u7b3c\u5305\u5b50","w":"\u9999\u83c7\u8089\u9171\u9762","s":"\u85e4\u6912\u9e21\u6392","d":"\u5c0f\u706b\u9505\u7c73\u7ebf"}
{"q":"小笼包子","w":"香菇肉酱面","s":"藤椒鸡排","d":"小火锅米线"}

 

7.3json_decode

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='{"q":"小笼包子","w":"香菇肉酱面","s":"藤椒鸡排","d":"小火锅米线"}';
var_dump(json_decode($json,true))."<br>";//true输出数组
var_dump(json_decode($json));//false输出对象
?>

array(4) { ["q"]=> string(12) "小笼包子" ["w"]=> string(15) "香菇肉酱面" ["s"]=> string(12) "藤椒鸡排" ["d"]=> string(15) "小火锅米线" }

object(stdClass)#2 (4) { ["q"]=> string(12) "小笼包子" ["w"]=> string(15) "香菇肉酱面" ["s"]=> string(12) "藤椒鸡排" ["d"]=> string(15) "小火锅米线" }

 

 

这篇关于php高级学习--2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!