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 "邮件已发送"; ?>
通过 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>
未经授权的用户可通过输入表单在邮件头部插入数据。
假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?
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 会被发送到上面所有的地址!
防止 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。
在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。
我们在访问文件之前检测该文件是否存在:
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?> 它采用了一个简单的错误处理机制在错误之后终止了脚本。
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (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(); }
以修改错误处理程序,使其仅应用到某些错误,这样脚本就能以不同的方式来处理不同的错误。然而,在本例中,我们打算针对所有错误来使用我们自定义的错误处理程序:
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"; ?>
在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 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
可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误类型。
可能的错误类型:
如果 "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 脚本结束
在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
异常用于在指定的错误发生时改变脚本的正常流程。
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "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 ?>
我们简单地创建了一个专门的类,当 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(); } ?>
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
<?php function myexception($e){ echo "<b>Exception:</b>".$e->getMessage(); } set_exception_handler("myexception"); throw new Exception("未发现的错误"); ?>
简而言之:如果抛出了异常,就必须捕获它。
过滤器用于验证和过滤来自非安全来源的数据。
测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
应该始终对外部数据进行过滤!
输入过滤是最重要的应用程序安全课题之一。
什么是外部数据?
如需过滤变量,请使用下面的过滤器函数之一:
<?php $int=123; if(filter_var($int ,FILTER_VALIDATE_INT)){ echo "这是一个合法的整数"; }else{ echo "这不是一个合法的整数"; } ?>
Validating 过滤器:
Sanitizing 过滤器:
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志。
在下面的实例中,我们用 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 "这是一个合法的整数"; } ?>
在浏览器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:
让我们试着清理一下从表单传来的 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变量"; } ?>
表单通常由多个输入字段组成。为了避免对 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):
filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。
如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。
如果该参数是一个数组,那么此数组必须遵循下面的规则:
通过使用 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 "变量不存在"; } ?>
<?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 "是一个合法的整数"; } ?>
<?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地址";
}
?>
<?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不存在!"; } ?>
<?php $str="qbrewhfbjv<html>"; $new_str=filter_var($str,FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_HIGH); ECHO $new_str; ?>
使用了 filter_var() 函数来移除字符串中 ASCII 值大于 127 的字符,同样它也能移除 HTML 标签
json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。
string json_encode ( $value [, $options = 0 ] )
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"}
<?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":"小火锅米线"}
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) "小火锅米线" }