[php学习资料] PHP完全自学手册(文档教程)

[复制链接]
 楼主| 发表于 2019-11-19 16:07:55 | 显示全部楼层
PHP 文件处理
fopen() 函数用于在 PHP 中打开文件。

打开文件
fopen() 函数用于在 PHP 中打开文件。
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
  1. <html>
  2. <body>
  3. <?php
  4. $file=fopen("welcome.txt","r");
  5. ?>
  6. </body>
  7. </html>
复制代码

文件可能通过下列模式来打开:
模式
描述
r只读。在文件的开头开始。
r+读/写。在文件的开头开始。
w只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+读/追加。通过向文件末尾写内容,来保持文件内容。
x只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
实例
如果 fopen() 函数不能打开指定的文件,下面的实例会生成一段消息:
  1. <html>
  2. <body>
  3. <?php
  4. $file=fopen("welcome.txt","r") or exit("Unable to open file!");
  5. ?>
  6. </body>
  7. </html>
复制代码



关闭文件
fclose() 函数用于关闭打开的文件:
  1. <?php
  2. $file = fopen("test.txt","r");
  3. //执行一些代码
  4. fclose($file);
  5. ?>
复制代码



检测文件末尾(EOF)
feof() 函数检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
注释:在 w 、a 和 x 模式下,您无法读取打开的文件!
if (feof($file)) echo "文件结尾";


逐行读取文件
fgets() 函数用于从文件中逐行读取文件。
注释:在调用该函数之后,文件指针会移动到下一行。
实例
下面的实例逐行读取文件,直到文件末尾为止:
  1. <?php
  2. $file = fopen("welcome.txt", "r") or exit("无法打开文件!");
  3. // 读取文件每一行,直到文件结尾
  4. while(!feof($file))
  5. {
  6.     echo fgets($file). "<br>";
  7. }
  8. fclose($file);
  9. ?>
复制代码



逐字符读取文件
fgetc() 函数用于从文件中逐字符地读取文件。
注释:在调用该函数之后,文件指针会移动到下一个字符。
实例
下面的实例逐字符地读取文件,直到文件末尾为止:
  1. <?php
  2. $file=fopen("welcome.txt","r") or exit("无法打开文件!");
  3. while (!feof($file))
  4. {
  5.     echo fgetc($file);
  6. }
  7. fclose($file);
  8. ?>
复制代码



腾讯云
回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:09:40 | 显示全部楼层
PHP 文件上传
通过 PHP,可以把文件上传到服务器。
本章节实例在 test 项目下完成,目录结构为:
  1. test|-----upload             # 文件上传的目录|-----form.html          # 表单文件|-----upload_file.php    # php 上传代码
复制代码


创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
  1. <html><head><meta charset="utf-8"><title>阿里云大学(edu.aliyun.com)</title></head><body><form action="upload_file.php" method="post" enctype="multipart/form-data">
  2.         <label for="file">文件名:</label>
  3.         <input type="file" name="file" id="file"><br>
  4.         <input type="submit" name="submit" value="提交"></form></body></html>
复制代码

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

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

创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:
  1. <?phpif ($_FILES["file"]["error"] > 0){
  2.         echo "错误:" . $_FILES["file"]["error"] . "<br>";}else{
  3.         echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  4.         echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  5.         echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  6.         echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];}?>
复制代码

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

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

上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB:
  1. <?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)){
  2.         if ($_FILES["file"]["error"] > 0)
  3.         {
  4.                 echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  5.         }
  6.         else
  7.         {
  8.                 echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  9.                 echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  10.                 echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  11.                 echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
  12.         }}else{
  13.         echo "非法的文件格式";}?>
复制代码



保存被上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
  1. <?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)){
  2.         if ($_FILES["file"]["error"] > 0)
  3.         {
  4.                 echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  5.         }
  6.         else
  7.         {
  8.                 echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  9.                 echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  10.                 echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  11.                 echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
  12.                
  13.                 // 判断当期目录下的 upload 目录是否存在该文件
  14.                 // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
  15.                 if (file_exists("upload/" . $_FILES["file"]["name"]))
  16.                 {
  17.                         echo $_FILES["file"]["name"] . " 文件已经存在。 ";
  18.                 }
  19.                 else
  20.                 {
  21.                         // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
  22.                         move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
  23.                         echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
  24.                 }
  25.         }}else{
  26.         echo "非法的文件格式";}?>
复制代码

上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的目录下。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:11:19 | 显示全部楼层
PHP Cookie
cookie 常用于识别用户。

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

如何创建 Cookie?
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法
  1. setcookie(name, value, expire, path, domain);
复制代码

实例 1
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "aliyun"。我们也规定了此 cookie 在一小时后过期:
  1. <?php
  2. setcookie("user", "runoob", time()+3600);?><html>.....
复制代码

注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
实例 2
您还可以通过另一种方式设置 cookie 的过期时间。这也许比使用秒表示的方式简单。
  1. <?php
  2. $expire=time()+60*60*24*30;setcookie("user", "runoob", $expire);?><html>.....
复制代码

在上面的实例中,过期时间被设置为一个月(60 秒 * 60 分 * 24 小时 * 30 天)。

如何取回 Cookie 的值?
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
  1. <?php// 输出 cookie 值echo $_COOKIE["user"];// 查看所有 cookieprint_r($_COOKIE);?>
复制代码

在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:
  1. <html><head><meta charset="utf-8"><title>阿里云大学(runoob.com)</title></head><body><?phpif (isset($_COOKIE["user"]))
  2.         echo "欢迎 " . $_COOKIE["user"] . "!<br>";else
  3.         echo "普通访客!<br>";?></body></html>
复制代码



如何删除 Cookie?
当删除 cookie 时,您应当使过期日期变更为过去的时间点。
删除的实例:
  1. <?php// 设置 cookie 过期时间为过去 1 小时setcookie("user", "", time()-3600);?>
复制代码



如果浏览器不支持 Cookie 该怎么办?
如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据(有关表单和用户输入的内容,在本教程的前面章节中我们已经介绍过了)。
下面的表单在用户单点击 "Submit" 按钮时,向 "welcome.php" 提交了用户输入:
  1. <html><head><meta charset="utf-8"><title>阿里云大学(runoob.com)</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" 文件中的值,如下所示:
  1. <html><head><meta charset="utf-8"><title>阿里云大学(runoob.com)</title></head><body>欢迎 <?php echo $_POST["name"]; ?>.<br>你 <?php echo $_POST["age"]; ?> 岁了。</body></html>
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:13:19 | 显示全部楼层
PHP Session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

PHP Session 变量
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。

开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
注释:session_start() 函数必须位于 <html> 标签之前:
  1. <?php session_start(); ?><html><body></body></html>
复制代码

上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。

存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:
  1. <?php
  2. session_start();// 存储 session 数据$_SESSION['views']=1;?><html><head><meta charset="utf-8"><title>阿里云大学(edu.aliyun.com)</title></head><body><?php// 检索 session 数据echo "浏览量:". $_SESSION['views'];?></body></html>
复制代码

输出:
  1. 浏览量:1
复制代码

在下面的实例中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则创建 "views" 变量,并把它设置为 1:
  1. <?php
  2. session_start();if(isset($_SESSION['views'])){
  3.         $_SESSION['views']=$_SESSION['views']+1;}else{
  4.         $_SESSION['views']=1;}echo "浏览量:". $_SESSION['views'];?>
复制代码



销毁 Session
如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量:
  1. <?php
  2. session_start();if(isset($_SESSION['views'])){
  3.         unset($_SESSION['views']);}?>
复制代码

您也可以通过调用 session_destroy() 函数彻底销毁 session:
  1. <?php
  2. session_destroy();?>
复制代码

注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:14:44 | 显示全部楼层
PHP Secure E-mails
在上一节中的 PHP e-mail 脚本中,存在着一个漏洞。

PHP E-mail 注入
首先,请看上一章中的 PHP 代码:
  1. <html><head><meta charset="utf-8"><title>菜鸟教程(runoob.com)</title></head><body><?phpif (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
  2.         // 发送邮件
  3.         $email = $_REQUEST['email'] ;
  4.         $subject = $_REQUEST['subject'] ;
  5.         $message = $_REQUEST['message'] ;
  6.         mail("someone@example.com", $subject,
  7.         $message, "From:" . $email);
  8.         echo "邮件发送成功";} else { // 如果没有邮箱参数则显示表单
  9.         echo "<form method='post' action='mailform.php'>
  10.         Email: <input name='email' type='text'><br>
  11.         Subject: <input name='subject' type='text'><br>
  12.         Message:<br>
  13.         <textarea name='message' rows='15' cols='40'>
  14.         </textarea><br>
  15.         <input type='submit'>
  16.         </form>";}?></body></html>
复制代码

以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据。
假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?
  1. 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 会被发送到上面所有的地址!

PHP 防止 E-mail 注入
防止 e-mail 注入的最好方法是对输入进行验证。
下面的代码与上一章中的类似,不过这里我们已经增加了检测表单中 email 字段的输入验证程序:
  1. <html><head><meta charset="utf-8"><title>菜鸟教程(runoob.com)</title></head><body><?phpfunction spamcheck($field){
  2.         // filter_var() 过滤 e-mail
  3.         // 使用 FILTER_SANITIZE_EMAIL
  4.         $field=filter_var($field, FILTER_SANITIZE_EMAIL);

  5.         //filter_var() 过滤 e-mail
  6.         // 使用 FILTER_VALIDATE_EMAIL
  7.         if(filter_var($field, FILTER_VALIDATE_EMAIL))
  8.         {
  9.                 return TRUE;
  10.         }
  11.         else
  12.         {
  13.                 return FALSE;
  14.         }}if (isset($_REQUEST['email'])){
  15.         // 如果接收到邮箱参数则发送邮件

  16.         // 判断邮箱是否合法
  17.         $mailcheck = spamcheck($_REQUEST['email']);
  18.         if ($mailcheck==FALSE)
  19.         {
  20.                 echo "非法输入";
  21.         }
  22.         else
  23.         {       
  24.                 // 发送邮件
  25.                 $email = $_REQUEST['email'] ;
  26.                 $subject = $_REQUEST['subject'] ;
  27.                 $message = $_REQUEST['message'] ;
  28.                 mail("someone@example.com", "Subject: $subject",
  29.                 $message, "From: $email" );
  30.                 echo "Thank you for using our mail form";
  31.         }}else{
  32.         // 如果没有邮箱参数则显示表单
  33.         echo "<form method='post' action='mailform.php'>
  34.         Email: <input name='email' type='text'><br>
  35.         Subject: <input name='subject' type='text'><br>
  36.         Message:<br>
  37.         <textarea name='message' rows='15' cols='40'>
  38.         </textarea><br>
  39.         <input type='submit'>
  40.         </form>";}?></body></html>
复制代码

在上面的代码中,我们使用了 PHP 过滤器来对输入进行验证:
  • FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
  • FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值


回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:17:18 | 显示全部楼层
PHP 错误处理
在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。

PHP 错误处理
在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
本教程介绍了 PHP 中一些最为重要的错误检测方法。
我们将为您讲解不同的错误处理方法:
  • 简单的 "die()" 语句
  • 自定义错误和错误触发器
  • 错误报告


基本的错误处理:使用 die() 函数
第一个实例展示了一个打开文本文件的简单脚本:
  1. <?php
  2. $file=fopen("welcome.txt","r");?>
复制代码

如果文件不存在,您会得到类似这样的错误:
  1. Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:No such file or directory in /www/runoob/test/test.php on line 2
复制代码

为了避免用户得到类似上面的错误消息,我们在访问文件之前检测该文件是否存在:
  1. <?phpif(!file_exists("welcome.txt")){
  2.         die("文件不存在");}else{
  3.         $file=fopen("welcome.txt","r");}?>
复制代码

现在,如果文件不存在,您会得到类似这样的错误消息:
  1. 文件不存在
复制代码

相比之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本。
然而,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP 函数。

创建自定义错误处理器
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):
语法
  1. error_function(error_level,error_message,error_file,error_line,error_context)
复制代码

参数
描述
error_level必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
error_message必需。为用户定义的错误规定错误消息。
error_file可选。规定错误发生的文件名。
error_line可选。规定错误发生的行号。
error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
错误报告级别
这些错误报告级别是用户自定义的错误处理程序处理的不同类型的错误:
常量
描述
2E_WARNING非致命的 run-time 错误。不暂停脚本执行。
8E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256E_USER_ERROR致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512E_USER_WARNING非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024E_USER_NOTICE用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191E_ALL所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
现在,让我们创建一个处理错误的函数:
  1. function customError($errno, $errstr){
  2.         echo "<b>Error:</b> [$errno] $errstr<br>";
  3.         echo "脚本结束";
  4.         die();}
复制代码

上面的代码是一个简单的错误处理函数。当它被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本。
现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。

设置错误处理程序
PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。
可以修改错误处理程序,使其仅应用到某些错误,这样脚本就能以不同的方式来处理不同的错误。然而,在本例中,我们打算针对所有错误来使用我们自定义的错误处理程序:
  1. set_error_handler("customError");
复制代码

由于我们希望我们的自定义函数能处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。
实例
通过尝试输出不存在的变量,来测试这个错误处理程序:
  1. <?php// 错误处理函数function customError($errno, $errstr){
  2.         echo "<b>Error:</b> [$errno] $errstr";}// 设置错误处理函数set_error_handler("customError");// 触发错误echo($test);?>
复制代码

以上代码的输出如下所示:
  1. Error: [8] Undefined variable: test
复制代码



触发错误
在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 PHP 中,这个任务由 trigger_error() 函数完成。
实例
在本例中,如果 "test" 变量大于 "1",就会发生错误:
  1. <?php
  2. $test=2;if ($test>1){
  3.         trigger_error("变量值必须小于等于 1");}?>
复制代码

以上代码的输出如下所示:
  1. Notice: 变量值必须小于等于 1in /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,我们将使用我们自定义的错误处理程序并结束脚本:
  1. <?php// 错误处理函数function customError($errno, $errstr){
  2.         echo "<b>Error:</b> [$errno] $errstr<br>";
  3.         echo "脚本结束";
  4.         die();}// 设置错误处理函数set_error_handler("customError",E_USER_WARNING);// 触发错误$test=2;if ($test>1){
  5.         trigger_error("变量值必须小于等于 1",E_USER_WARNING);}?>
复制代码

以上代码的输出如下所示:
  1. Error: [512] 变量值必须小于等于 1脚本结束
复制代码

现在,我们已经学习了如何创建自己的 error,以及如何触发它们,接下来我们研究一下错误记录。

错误记录
在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。
通过 E-Mail 发送错误消息
在下面的例子中,如果特定的错误发生,我们将发送带有错误消息的电子邮件,并结束脚本:
  1. <?php// 错误处理函数function customError($errno, $errstr){
  2.         echo "<b>Error:</b> [$errno] $errstr<br>";
  3.         echo "已通知网站管理员";
  4.         error_log("Error: [$errno] $errstr",1,
  5.         "someone@example.com","From: webmaster@example.com");}// 设置错误处理函数set_error_handler("customError",E_USER_WARNING);// 触发错误$test=2;if ($test>1){
  6.         trigger_error("变量值必须小于等于 1",E_USER_WARNING);}?>
复制代码

以上代码的输出如下所示:
  1. Error: [512] 变量值必须小于等于 1已通知网站管理员
复制代码

接收自以上代码的邮件如下所示:
  1. Error: [512] 变量值必须小于等于 1
复制代码

这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:20:36 | 显示全部楼层
PHP 异常处理
异常用于在指定的错误发生时改变脚本的正常流程。

异常是什么
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
  • 当前代码状态被保存
  • 代码执行被切换到预定义(自定义)的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

我们将展示不同的错误处理方法:
  • 异常的基本使用
  • 创建自定义的异常处理器
  • 多个异常
  • 重新抛出异常
  • 设置顶层异常处理器

注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。

异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
让我们尝试抛出一个异常,同时不去捕获它:
  1. <?php// 创建一个有异常处理的函数function checkNum($number){
  2.     if($number>1)
  3.     {
  4.         throw new Exception("Value must be 1 or below");    }
  5.     return true;}
  6. // 触发异常checkNum(2);?>
复制代码

上面的代码会得到类似这样的一个错误:
  1. Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/runoob/test/test.php:7 Stack trace: #0 /www/runoob/test/test.php(13): checkNum(2) #1 {main} thrown in /www/runoob/test/test.php on line 7
复制代码

Try、throw 和 catch
要避免上面实例中出现的错误,我们需要创建适当的代码来处理异常。
适当的处理异常代码应该包括:
  • Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  • Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  • Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。

让我们触发一个异常:
  1. <?php// 创建一个有异常处理的函数function checkNum($number){
  2.     if($number>1)
  3.     {
  4.         throw new Exception("变量值必须小于等于 1");    }
  5.         return true;}
  6.     // 在 try 块 触发异常try{
  7.     checkNum(2);    // 如果抛出异常,以下文本不会输出
  8.     echo '如果输出该内容,说明 $number 变量';}// 捕获异常catch(Exception $e){
  9.     echo 'Message: ' .$e->getMessage();}?>
复制代码

上面代码将得到类似这样一个错误:
  1. Message: 变量值必须小于等于 1
复制代码

实例解释:
上面的代码抛出了一个异常,并捕获了它:
  • 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  • 在 "try" 代码块中调用 checkNum() 函数。
  • checkNum() 函数中的异常被抛出。
  • "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  • 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。

然而,为了遵循 "每个 throw 必须对应一个 catch" 的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。

创建一个自定义的 Exception 类
创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。
这个自定义的 customException 类继承了 PHP 的 exception 类的所有属性,您可向其添加自定义的函数。
我们开始创建 customException 类:
  1. <?phpclass customException extends Exception{
  2.     public function errorMessage()
  3.     {
  4.         // 错误信息
  5.         $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
  6.         .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';        return $errorMsg;    }}
  7. $email = "someone@example...com";
  8. try{
  9.     // 检测邮箱
  10.     if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  11.     {
  12.         // 如果是个不合法的邮箱地址,抛出异常
  13.         throw new customException($email);    }}
  14. catch (customException $e){//display custom messageecho $e->errorMessage();}?>
复制代码

这个新的类是旧的 exception 类的副本,外加 errorMessage() 函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception 类的方法,比如 getLine()、getFile() 和 getMessage()。
实例解释:
上面的代码抛出了一个异常,并通过一个自定义的 exception 类来捕获它:
  • customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧的 exception 类的所有属性和方法。
  • 创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一条错误消息。
  • 把 $email 变量设置为不合法的 e-mail 地址字符串。
  • 执行 "try" 代码块,由于 e-mail 地址不合法,因此抛出一个异常。
  • "catch" 代码块捕获异常,并显示错误消息。


多个异常
可以为一段脚本使用多个异常,来检测多种情况。
可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息:
  1. <?phpclass customException extends Exception{
  2.     public function errorMessage()
  3.     {
  4.         // 错误信息
  5.         $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
  6.         .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';        return $errorMsg;    }}
  7. $email = "someone@example.com";
  8. try{
  9.     // 检测邮箱
  10.     if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  11.     {
  12.         // 如果是个不合法的邮箱地址,抛出异常
  13.         throw new customException($email);    }
  14.     // 检测 "example" 是否在邮箱地址中
  15.     if(strpos($email, "example") !== FALSE)
  16.     {
  17.         throw new Exception("$email 是 example 邮箱");    }}catch (customException $e){
  18.     echo $e->errorMessage();}catch(Exception $e){
  19.     echo $e->getMessage();}?>
复制代码

实例解释:
上面的代码测试了两种条件,如果其中任何一个条件不成立,则抛出一个异常:
  • customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧的 exception 类的所有属性和方法。
  • 创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
  • 把 $email 变量设置为一个字符串,该字符串是一个有效的 e-mail 地址,但包含字符串 "example"。
  • 执行 "try" 代码块,在第一个条件下,不会抛出异常。
  • 由于 e-mail 含有字符串 "example",第二个条件会触发异常。
  • "catch" 代码块会捕获异常,并显示恰当的错误消息。

如果 customException 类抛出了异常,但没有捕获 customException,仅仅捕获了 base exception,则在那里处理异常。

重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常:
  1. <?phpclass customException extends Exception{
  2.     public function errorMessage()
  3.     {
  4.         // 错误信息
  5.         $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';        return $errorMsg;    }}
  6. $email = "someone@example.com";
  7. try{
  8.     try
  9.     {
  10.         // 检测 "example" 是否在邮箱地址中
  11.         if(strpos($email, "example") !== FALSE)
  12.         {
  13.             // 如果是个不合法的邮箱地址,抛出异常
  14.             throw new Exception($email);        }
  15.     }
  16.     catch(Exception $e)
  17.     {
  18.         // 重新抛出异常
  19.         throw new customException($email);    }}catch (customException $e){
  20.     // 显示自定义信息
  21.     echo $e->errorMessage();}?>
复制代码

实例解释:
上面的代码检测在邮件地址中是否含有字符串 "example"。如果有,则再次抛出异常:
  • customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧的 exception 类的所有属性和方法。
  • 创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
  • 把 $email 变量设置为一个字符串,该字符串是一个有效的 e-mail 地址,但包含字符串 "example"。
  • "try" 代码块包含另一个 "try" 代码块,这样就可以再次抛出异常。
  • 由于 e-mail 包含字符串 "example",因此触发异常。
  • "catch" 代码块捕获到该异常,并重新抛出 "customException"。
  • 捕获到 "customException",并显示一条错误消息。

如果在当前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。

设置顶层异常处理器
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
  1. <?phpfunction myException($exception){
  2.     echo "<b>Exception:</b> " , $exception->getMessage();}
  3. set_exception_handler('myException');
  4. throw new Exception('Uncaught Exception occurred');?>
复制代码

以上代码的输出如下所示:
  1. Exception: Uncaught Exception occurred
复制代码

在上面的代码中,不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。

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

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

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:27:41 | 显示全部楼层
PHP 过滤器
PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。

什么是 PHP 过滤器?
PHP 过滤器用于验证和过滤来自非安全来源的数据。
测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。

为什么使用过滤器?
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
您应该始终对外部数据进行过滤!
输入过滤是最重要的应用程序安全课题之一。
什么是外部数据?
  • 来自表单的输入数据
  • Cookies
  • Web services data
  • 服务器变量
  • 数据库查询结果


函数和过滤器
如需过滤变量,请使用下面的过滤器函数之一:
  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

在下面的实例中,我们用 filter_var() 函数验证了一个整数:
实例
  1. <?php$int = 123;
  2. if(!filter_var($int, FILTER_VALIDATE_INT)){
  3.     echo("不是一个合法的整数");}else{
  4.     echo("是个合法的整数");}?>
复制代码

上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,因此上面的代码将输出:
如果我们尝试使用一个非整数的变量(比如 "123abc"),则将输出:"Integer is not valid"。


Validating 和 Sanitizing
有两种过滤器:
Validating 过滤器:
  • 用于验证用户输入
  • 严格的格式规则(比如 URL 或 E-Mail 验证)
  • 如果成功则返回预期的类型,如果失败则返回 FALSE

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


选项和标志
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志。
在下面的实例中,我们用 filter_var() 和 "min_range" 以及 "max_range" 选项验证了一个整数:
实例
  1. <?php$var=300;
  2. $int_options = array(
  3.     "options"=>array
  4.     (
  5.         "min_range"=>0,        "max_range"=>256
  6.     ));
  7. if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)){
  8.     echo("不是一个合法的整数");}else{
  9.     echo("是个合法的整数");}?>
复制代码

就像上面的代码一样,选项必须放入一个名为 "options" 的相关数组中。如果使用标志,则不需在数组内。
由于整数是 "300",它不在指定的范围内,以上代码的输出将是:
  1. 不是一个合法的整数
复制代码



验证输入
让我们试着验证来自表单的输入。
我们需要做的第一件事情是确认是否存在我们正在查找的输入数据。
然后我们用 filter_input() 函数过滤输入的数据。
在下面的实例中,输入变量 "email" 被传到 PHP 页面:
实例
  1. <?phpif(!filter_has_var(INPUT_GET, "email")){
  2.     echo("没有 email 参数");}else{
  3.     if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  4.     {
  5.         echo "不是一个合法的 E-Mail";    }
  6.     else
  7.     {
  8.         echo "是一个合法的 E-Mail";    }}?>
复制代码

以上实例测试结果如下:
实例解释
上面的实例有一个通过 "GET" 方法传送的输入变量 (email):
  • 检测是否存在 "GET" 类型的 "email" 输入变量
  • 如果存在输入变量,检测它是否是有效的 e-mail 地址


净化输入
让我们试着清理一下从表单传来的 URL。
首先,我们要确认是否存在我们正在查找的输入数据。
然后,我们用 filter_input() 函数来净化输入数据。
在下面的实例中,输入变量 "url" 被传到 PHP 页面:
  1. <?phpif(!filter_has_var(INPUT_GET, "url")){
  2.         echo("没有 url 参数");}else{
  3.         $url = filter_input(INPUT_GET,
  4.         "url", FILTER_SANITIZE_URL);
  5.         echo $url;}?>
复制代码

实例解释
上面的实例有一个通过 "GET" 方法传送的输入变量 (url):
  • 检测是否存在 "GET" 类型的 "url" 输入变量
  • 如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中

假如输入变量是一个类似这样的字符串:"http://www.ruåånoøøob.com/",则净化后的 $url 变量如下所示:


过滤多个输入
表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。
在本例中,我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一个名字、一个年龄以及一个 e-mail 地址:
实例
  1. <?php$filters = array(
  2.     "name" => array
  3.     (
  4.         "filter"=>FILTER_SANITIZE_STRING
  5.     ),    "age" => array
  6.     (
  7.         "filter"=>FILTER_VALIDATE_INT,        "options"=>array
  8.         (
  9.             "min_range"=>1,            "max_range"=>120
  10.         )
  11.     ),    "email"=> FILTER_VALIDATE_EMAIL);
  12. $result = filter_input_array(INPUT_GET, $filters);
  13. if (!$result["age"]){
  14.     echo("年龄必须在 1 到 120 之间。<br>");}elseif(!$result["email"]){
  15.     echo("E-Mail 不合法<br>");}else{
  16.     echo("输入正确");}?>
复制代码

实例解释
上面的实例有三个通过 "GET" 方法传送的输入变量 (name、age 和 email):
  • 设置一个数组,其中包含了输入变量的名称和用于指定的输入变量的过滤器
  • 调用 filter_input_array() 函数,参数包括 GET 输入变量及刚才设置的数组
  • 检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入。(如果存在非法输入,在使用 filter_input_array() 函数之后,输入变量为 FALSE。)

filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。
如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。
如果该参数是一个数组,那么此数组必须遵循下面的规则:
  • 必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量)
  • 此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志和选项的数组


使用 Filter Callback
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。
您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。
将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。
在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为 ".":
实例
  1. <?phpfunction convertSpace($string){
  2.     return str_replace("_", ".", $string);}
  3. $string = "www_openketang_com!";
  4. echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));?>
复制代码

上面代码的结果如下所示:
www.openketang.com
实例解释
上面的实例把所有 "_" 转换成 "." :
  • 创建一个把 "_" 替换为 "." 的函数
  • 调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组


回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:30:26 | 显示全部楼层
PHP 高级过滤器
检测一个数字是否在一个范围内
以下实例使用了 filter_var() 函数来检测一个 INT 型的变量是否在 1 到 200 内:
实例
  1. <?php
  2. $int = 122;
  3. $min = 1;
  4. $max = 200;
  5. if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min,
  6. "max_range"=>$max))) === false) {
  7.     echo("变量值不在合法范围内");
  8. } else {
  9.     echo("变量值在合法范围内");
  10. }
  11. ?>
复制代码


运行结果:
  1. 变量值在合法范围内
复制代码


检测 IPv6 地址
以下实例使用了 filter_var() 函数来检测一个 $ip 变量是否是 IPv6 地址:
实例
  1. <?php
  2. $ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
  3. if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
  4.     echo("$ip 是一个 IPv6 地址");
  5. } else {
  6.     echo("$ip 不是一个 IPv6 地址");
  7. }
  8. ?>
复制代码


运行结果:
  1. 2001:0db8:85a3:08d3:1319:8a2e:0370:7334 是一个 IPv6 地址
复制代码


检测 URL - 必须包含QUERY_STRING(查询字符串)
以下实例使用了 filter_var() 函数来检测 $url 是否包含查询字符串:
实例
  1. <?php
  2. $url = "http://www.runoob.com";
  3. if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
  4.     echo("$url 是一个合法的 URL");
  5. } else {
  6.     echo("$url 不是一个合法的 URL");
  7. }
  8. ?>
复制代码


运行结果:
  1. http://www.runoob.com 不是一个合法的 URL
复制代码



移除 ASCII 值大于 127 的字符
以下实例使用了 filter_var() 函数来移除字符串中 ASCII 值大于 127 的字符,同样它也能移除 HTML 标签:
实例
  1. <?php
  2. $str = "<h1>Hello WorldÆØÅ!</h1>";
  3. $newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
  4. echo $newstr;
  5. ?>
复制代码


运行结果:

  1. Hello World!
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:32:25 | 显示全部楼层
PHP JSON
本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象。

环境配置
在 php5.2.0 及以上版本已经内置 JSON 扩展。

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

json_encode
PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。
语法
  1. 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 数组转换为 JSON 格式数据:
  1. <?php
  2.    $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
  3.    echo json_encode($arr);?>
复制代码

以上代码执行结果为:
  1. {"a":1,"b":2,"c":3,"d":4,"e":5}
复制代码

以下实例演示了如何将 PHP 对象转换为 JSON 格式数据:
  1. <?php   class Emp {
  2.        public $name = "";
  3.        public $hobbies  = "";
  4.        public $birthdate = "";
  5.    }
  6.    $e = new Emp();
  7.    $e->name = "sachin";
  8.    $e->hobbies  = "sports";
  9.    $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
  10.    $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));

  11.    echo json_encode($e);?>
复制代码

以上代码执行结果为:
  1. {"name":"sachin","hobbies":"sports","birthdate":"08\/05\/1974 12:20:03 pm"}
复制代码


json_decode
PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。
语法
  1. mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
复制代码

参数
  • json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
  • assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
  • depth: 整数类型的参数,它指定递归深度
  • options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。

实例
以下实例演示了如何解码 JSON 数据:
  1. <?php
  2.    $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

  3.    var_dump(json_decode($json));
  4.    var_dump(json_decode($json, true));?>
复制代码

以上代码执行结果为:
  1. object(stdClass)#1 (5) {
  2.     ["a"] => int(1)
  3.     ["b"] => int(2)
  4.     ["c"] => int(3)
  5.     ["d"] => int(4)
  6.     ["e"] => int(5)}array(5) {
  7.     ["a"] => int(1)
  8.     ["b"] => int(2)
  9.     ["c"] => int(3)
  10.     ["d"] => int(4)
  11.     ["e"] => int(5)}
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )