PHP之认识PHP(三)高级教程(上)

3.1、多维数组

3.1.1一维数组的创建与遍历

<?php
$array1 = array("123","456","789");
$array2[0] = "123";
$array2[1] = "456";
$array3[2] = "789";
//遍历
foreach($array1 as $x){
	echo $x."<br/>";
}
?>

结果:

结果:
123
456
789

3.1.2关联数组的创建与遍历

<?php
$array3 = array("Peter"=>"123","Ben"=>"456","Joe"=>"789");
$array4["Peter"] = "123";
$array4["Ben"] = "456";
$array4["Joe"] = "789";
//遍历
foreach($array3 as $x=>$x_value){
	echo $x."=>".$x_value."<br/>";
}
?>

结果:

Peter=>123
Ben=>456
Joe=>789

3.1.3多维数组的创建与遍历

<?php
$array5 = array
(
array("Volvo","1","2","3"),
array("BMW","4","5","6"),
array("Toyota","7","8","9")
);                            //遍历
echo "Array<br/>(<br/>";
foreach($array5 as $k=>$v){
	echo "[".$k."] => Array<br/>(<br/>";
	foreach($array5["$k"] as $index=>$value){
		echo  "[".$index."] =>";
		echo $value;
		echo "<br/>";
	}
	echo ")<br/>";
}
echo ")";
?>

结果:

Array
(
[0] => Array
(
[0] =>Volvo
[1] =>1
[2] =>2
[3] =>3
)
[1] => Array
(
[0] =>BMW
[1] =>4
[2] =>5
[3] =>6
)
[2] => Array
(
[0] =>Toyota
[1] =>7
[2] =>8
[3] =>9
)
) 

3.1.4自动分配 ID 键的多维数组


$families = array
(
	"Griffin"=>array
	(
		"Peter",
		 "Lois",
		 "Megan"
	),
	"Quagmire"=>array
	(
		 "Glenn"
	),
	"Brown"=>array
	(
		"Cleveland",
		"Loretta",
		"Junior"
	)
);                       
echo "Array<br/>(<br/>";                 //为了遍历数据更加清晰明了
foreach($families as $k=>$v){	
	echo "[".$k."] => Array<br/>(<br/>";
	foreach($families[$k] as $index=>$value){        //特别注意这一行
		echo "[".$index."] => ";
		echo $value."<br/>";
	}
	echo ")<br/>";
}
echo ")";
?>

结果:

Array
(
[Griffin] => Array
(
[0] => Peter
[1] => Lois
[2] => Megan
)
[Quagmire] => Array
(
[0] => Glenn
)
[Brown] => Array
(
[0] => Cleveland
[1] => Loretta
[2] => Junior
)
) 

3.2日期

date(format,timestamp)

参数描述
format必需。规定时间戳的格式。
timestamp

可选。规定时间戳。默认是当前的日期和时间。

3.2.1格式化日期

<?php
 echo date("Y/m/d") . "<br>";
 echo date("Y.m.d") . "<br>";
 echo date("Y-m-d");
 ?>

 结果:

2019/04/13
2019.04.13
2019-04-13 

3.2.2添加时间戳

date() 函数的第二个可选参数 timestamp 规定了一个时间戳。如果您没有提供时间戳,将使用当前的日期和时间。

mktime() 函数可为指定的日期返回 Unix 时间戳。

Unix 时间戳包含了 Unix 纪元(1970-01-01 00:00:00 GMT)和指定时间之间的秒数。

3.2.2.1mktime() 语法

mktime(hour,minute,second,month,day,year,is_dst)

如需获得某一天的时间戳,我们只要设置 mktime() 函数的 day 参数就可以了:

<?php
 $tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
 echo "Tomorrow is ".date("Y/m/d", $tomorrow);
 ?>

结果:

Tomorrow is 2019/04/14 

3.3date()函数

关于format几个常用的参数

<?php
// Prints the day
echo date("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo date("l jS \of F Y h:i:s A") . "<br>";

// Prints October 3, 1975 was on a Friday
echo "Oct 3,1975 was on a ".date("l", mktime(0,0,0,10,3,1975)) . "<br>";

// Use a constant in the format parameter
echo date(DATE_RFC822) . "<br>";

// prints something like: 1975-10-03T00:00:00+00:00
echo date(DATE_ATOM,mktime(0,0,0,10,3,1975));
?>

结果:

Saturday
Saturday 13th of April 2019 04:45:09 PM
Oct 3,1975 was on a Friday
Sat, 13 Apr 19 16:45:09 +0000
1975-10-03T00:00:00+00:00 

3.4包含

include和require语句

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

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

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

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

  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。

包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。

语法

<?php
include 'filename';
 或者
 require 'filename';
?>

提示:对于 include,在执行文件时每次都要进行读取和评估;而对于 require,文件只处理一次。

3.5文件

3.5.1打开文件

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

此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:

<?php
 $file=fopen("welcome.txt","r");
 ?>

文件可能通过下列模式来打开:

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

注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

3.5.2关闭文件

fclose() 函数用于关闭打开的文件:

<?php
 $file = fopen("test.txt","r");

 //some code to be executed

 fclose($file);
 ?>

3.5.3检测End-of-file

feof() 函数检测是否已到达文件末尾(EOF)。

在循环遍历未知长度的数据时,feof() 函数很有用。

注释:在 w 、a 和 x 模式下,您无法读取打开的文件!

<?php
if (feof($file)) echo "End of file";
?>

3.5.4逐行读取文件

fgets() 函数用于从文件中逐行读取文件。

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

<?php
 $file = fopen("welcome.txt", "r") or exit("Unable to open file!");
 //Output a line of the file until the end is reached
 while(!feof($file))
 {
 echo fgets($file). "<br>";
 }
 fclose($file);
 ?>

3.5.4逐字读取文件

fgetc() 函数用于从文件中逐字符地读取文件。

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

实例:

下面的实例逐字符地读取文件,直到文件末尾为止:

<?php
 $file=fopen("welcome.txt","r") or exit("Unable to open file!");
 while (!feof($file))
 {
 echo fgetc($file);
 }
 fclose($file);
 ?>

3.6文件上传

3.6.1创建一个文件上传表单

<?php
<form action="" method="post" enctype="multipart/form-data" >
       //enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,
        //比如文件内容,请使用 "multipart/form-data"。
	<label for="file">Filename:</label>        //for属性:与id为file进行绑定
	<input type="file" name="file" id="file"><br/>
	<input type="submit" name="submit" value="submit">
</form>
?>

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

3.6.2创建上传脚本

<?php
if($_FILES["file"]["error"]>0){
	echo "Error:".$_FILES["file"]["error"]."<br/>";
}else{
	echo "Upload:".$_FILES["file"]["name"]."<br/>";
	echo "Type:".$_FILES["file"]["type"]."<br/>";
	echo "Size".($_FILES["file"]["size"]/1024)."KB<br/>";
	echo "Stored in:".$_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"] - 由文件上传导致的错误代码

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

3.6.3创建上传限制

在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 和 .jpeg 文件,文件大小必须小于 20 kB:

<?php
 $allowedExts = array("gif", "jpeg", "jpg", "png");
 $temp = explode(".", $_FILES["file"]["name"]);    //explode()把字符串打散为数组,按.切割
 $extension = end($temp);                           //end()得到数组最后一个元素
 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"] < 20000)
	&& in_array($extension, $allowedExts)){    //in_array,在$allowedExts中寻找$extension
	if ($_FILES["file"]["error"] > 0){
		echo "Error: " . $_FILES["file"]["error"] . "<br>";
	}else{
		
		echo "Upload: " . $_FILES["file"]["name"] . "<br>";
		echo "Type: " . $_FILES["file"]["type"] . "<br>";
		echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
		echo "Stored in: " . $_FILES["file"]["tmp_name"];
	}
 }else{
	echo "Invalid file";
 }
?>

3.6.4保存被上传的文件

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。

这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

<?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"] < 20000)
 && in_array($extension, $allowedExts)){
 if ($_FILES["file"]["error"] > 0){
     echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
 }else{
     echo "Upload: " . $_FILES["file"]["name"] . "<br>";
     echo "Type: " . $_FILES["file"]["type"] . "<br>";
     echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

     if (file_exists("upload/" . $_FILES["file"]["name"])){
         echo $_FILES["file"]["name"] . " already exists. ";
     }else{
         move_uploaded_file($_FILES["file"]["tmp_name"],
         "upload/" . $_FILES["file"]["name"]);
         echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }else{
      echo "Invalid file";
  }
 ?> 

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

3.7Cookie

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制,PHP 透明地支持 HTTP cookie。

3.7.1创建cookie

setcookie() 函数用于设置 cookie。

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

<?php
 setcookie(name, value, expire, path, domain); 
?>

实例1

在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "Alex Porter"。我们也规定了此 cookie 在一小时后过期:

<?php
 setcookie("user", "Alex Porter", time()+3600);
 ?>

 <html>
 ..... 

注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)

实例2

您还可以通过另一种方式设置 cookie 的过期时间。这也许比使用秒表示的方式简单。

 <?php
 $expire=time()+60*60*24*30;
 setcookie("user", "Alex Porter", $expire);
 ?>

 <html>
 .....

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

3.7.2取回cookie

PHP 的 $_COOKIE 变量用于取回 cookie 的值。

在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:

 <?php
 // Print a cookie
 echo $_COOKIE["user"];

 // A way to view all cookies
 print_r($_COOKIE);
 ?> 

在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:

<html>
 <body>

 <?php
 if (isset($_COOKIE["user"]))
 echo "Welcome " . $_COOKIE["user"] . "!<br>";
 else
 echo "Welcome guest!<br>";
 ?>

 </body>
 </html> 

3.7.3删除cookie

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

删除的实例:

 <?php
 // set the expiration date to one hour ago
 setcookie("user", "", time()-3600);
 ?> 

3.7.4浏览器不支持cookie怎么办

如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据(有关表单和用户输入的内容,在本教程的前面章节中我们已经介绍过了)。

下面的表单在用户单点击 "Submit" 按钮时,向 "welcome.php" 提交了用户输入:

 <html>
 <body>

 <form action="welcome.php" method="post">
 Name: <input type="text" name="name">
 Age: <input type="text" name="age">
 <input type="submit">
 </form>

 </body>
 </html>

取回 "welcome.php" 文件中的值,如下所示:

 <html>
 <body>

 Welcome <?php echo $_POST["name"]; ?>.<br>
 You are <?php echo $_POST["age"]; ?> years old.

 </body>
 </html> 

3.8Session

1、Session 中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息。

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

3、您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。

PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。

Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。

3.8.1开始会话

在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

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

 <?php session_start(); ?>

 <html>
 <body>

 </body>
 </html> 

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

3.8.2储存会话

存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:

 <?php
 session_start();
 // store session data
 $_SESSION['views']=1;
 ?>

 <html>
 <body>

 <?php
 //retrieve session data
 echo "Pageviews=". $_SESSION['views'];
 ?>

 </body>
 </html> 

结果:

 Pageviews=1 

在下面的实例中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则创建 "views" 变量,并把它设置为 1:

 <?php
 session_start();

 if(isset($_SESSION['views'])){
     $_SESSION['views']=$_SESSION['views']+1;
 }else{
     $_SESSION['views']=1;
}
 echo "Views=". $_SESSION['views'];
 ?>

3.8.3销毁会话

如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。

unset() 函数用于释放指定的 session 变量:

 <?php
 session_start();
 if(isset($_SESSION['views']))
 unset($_SESSION['views']);
 ?> 

您也可以通过调用 session_destroy() 函数彻底销毁 session:

 <?php
 session_destroy();
 ?> 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值