一. Cookie操作

1.Cookie

Cookie 是一种在客户端存储数据并用这些数据来跟踪和识别用户的机制。

Cookie 在 Web 服务器端产生,并以文本文件的形式存储在了客户端电脑的硬盘上。

Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成

Cookie的作用:

HTTP协议本身是无状态的。

什么是无状态呢,即服务器无法判断用户身份。

Cookie实际上是一小段的文本信息(key-value格式)。

客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。

客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。

服务器检查该Cookie,以此来辨认用户状态。

打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。

Cookie 通常用于以下几个方面:

1)记录用户信息,如上次登陆的用户名等。

2)页面之间传递参数。

3)将HTML页面存储在 Cookie 中,提高页面浏览速度。

4)实现记录用户个人信息的功能

注意:

Cookie是不可以跨域名的,隐私安全机制禁止网站非法获取其他网站的Cookie。

比如: 淘宝的 cookie 信息, 京东是不能使用的,也不允许获取.

2. 设置Cookie信息 setcookie()

  1. setcookie(string $name, string $value = "", array $options = []): bool

setcookie() 定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 请在产生任何输出之前(包括 和 或者空格)调用本函数。

一旦设置 Cookie 后,下次打开页面时可以使用 $_COOKIE 读取。 Cookie 值同样也存在于 $_REQUEST。

常见创建 Cookie 的语法格式,有以下两种:

创建 Cookie 语法格式一:

bool setcookie(名称 , 值)

注意:Cookie 会在会话结束(浏览器整体关闭)时失效。

header("content-type:text/html;charset=utf-8");
// 设置多个Cookie 信息
setcookie("username","tom");
setcookie("passwd","123");
setcookie("address","beijing");

echo "设置Cookie成功";

查看 Cookie 信息,可以在浏览器地址栏前面的 叹号中查看

创建 Cookie 语法格式二:

bool setcookie(名称 , 值 , 有效期)

注意:Cookie 会在有效期过后失效。

header("content-type:text/html;charset=utf-8");
// 设置多个Cookie 信息
setcookie("username","tom", time()+60);
setcookie("passwd","123", time()+60);
setcookie("address","beijing", time()+60);

echo "设置Cookie成功";

3. 获取 Cookie信息 $_COOKIE

通过 HTTP Cookies 方式传递给当前脚本的变量的数组。用法和 $_GET, $_POST 等全局变法相同.

$username = $_COOKIE["username"];
$passwd = $_COOKIE["passwd"];
$address = $_COOKIE["address"];

echo "Cookie 信息如下 :<br>";
echo "username:" . $username . "<br>";
echo "passwd:" . $passwd . "<br>";
echo "address:" . $address . "<br>";

4. 删除 Cookie 信息

setcookie("userName","");

通过 setcookie() 函数,将名称为 “userName” 的 Cookie 值删除。

二. 文件读写操作

1 .文件操作

在 PHP 中,提供了一系列的系统函数,用于读写文本文件的内容。

2. 文件打开 fopen()

fopen(
    string $filename,
    string $mode,
    bool $use_include_path = false,
    resource $context = ?
): resource

fopen()filename 指定的名字资源绑定到一个流上,打开文件或者 URL。

  • 参数一 filename
    要打开的文件名,以字符串方式指定 ,可以是绝对路径 ,也可以是相对路径 .
  • 参数二 mode
    mode 参数指定了所要求到该流的访问类型。可以是以下值:
    | mode | 说明 | | —- | —- | | 'r' | 只读方式打开,将文件指针指向文件头。read | | 'r+' | 读写方式打开,将文件指针指向文件头。 read+ | | 'w' | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。write | | 'w+' | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 | | 'a' | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 Append | | 'a+' | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |

  • 示例:

    $file = fopen('test.txt', "r");
    

3. 文件关闭 fclose()

fclose(resource $handle): bool

关闭一个已打开的文件指针,成功时返回 **true**, 或者在失败时返回 **false**

在文件操作中,关闭文件操作虽然看不到明显的效果,但是一定要关闭,否则可能会产生内存泄露.

fcolse($file);

4. 读取一个字符 fgetc()

从文件句柄中获取一个字符,也就是读取一个字节。

返回一个包含有一个字符的字符串,该字符从 handle 指向的文件中得到。 碰到 EOF 则返回 **false**

fgetc(resource $handle): string
   $file = fopen("test.txt", "w+");
   // 如果是英文,一次读取一个字符
   // 如果是中文 ,UTF8 编码,需要读取三次才能拼接成一个汉字, GBK 需要读取两次
   // 注意,中文时,每次都要读取完马上输出,可以拼接成汉字后,即会显示
   $content = fgetc($file);  //get_file_character
   echo $content;

   $content = fgetc($file);
   echo $content;

   $content = fgetc($file);
   echo $content;
  • 练习: 读取文件中所有内容
    <?php
    $file = fopen("test.txt", "r");
    do{
       $content = fgetc($file);
       echo $content;
    // 判断读取的内容是不是空字符串,如果是空串,表示已经读取到文件最后  
     // }while($content != "");
     }while($content);
     fclose($file);
    ?>
    

5. 文件结束判断 feof()

feof(resource $handle): bool

feof — 测试文件指针是否到了文件结束的位置

如果文件指针到了 EOF 或者出错时则返回 **true**,否则返回一个错误(包括 socket 超时),其它情况则返回 **false**

上面的练习可以改为:

<?php
   $file = fopen("test.txt", "r");
   do{
      $content = fgetc($file);
      echo $content;
   // 判断 文件 是否结束,如果结束就跳出循环,否则继续读取
   }while(!feof($file));
     fclose($file);
?>

6. 读取一行内容 fgets()

fgets(resource $handle, int $length = ?): string

fgets — 从文件指针中读取一行

从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。

碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。

如果没有指定 length,则默认为 1K,或者说 1024 字节。

<?php
   $file = fopen("test.txt", "r");
   do{
      // 一次读取一行,默认是 1024字节
      $content = fgets($file);
      // 指定读取 字节数
      // $content = fgets($file,5);
      echo $content . "<br>";
   }while(!feof($file));
   fclose($file);
?>

7. 读取一行内容,并过滤 HTML 标记 fgetss()

fgetss(resource $handle, int $length = ?, string $allowable_tags = ?): string

fgetss — 从文件指针中读取一行并过滤掉 HTML 标记

allowable_tags可以用可选的第三个参数指定哪些标记不被去掉。

<?php
   $file = fopen("https://www.baidu.com", "r");
   do{
      // 一次读取一行,默认是 1024字节
      $content = fgetss($file);
      echo $content . "<br>";
   }while(!feof($file));
   fclose($file);
?>

8. 读取指定大小内容 fread()

fread(resource $handle, int $length): string

fread — 读取文件(可安全用于二进制文件)

fread() 从文件指针 handle 读取最多 length 个字节。 该函数在遇上以下几种情况时停止读取文件:

  • 读取了 length 个字节
  • 到达了文件末尾(EOF)
<?php
   $file = fopen("test.txt", "r");
   do{
      // 一次读取文件中的10个字节
      $content = fread($file, 10);
      echo $content . "<br>";
   }while(!feof($file));
   fclose($file);
?>

9. 获取文件大小 filesize()

filesize(string $filename): int

filesize — 取得文件大小,返回文件大小的字节数

注意一: 参数是测试文件的路径

注意二: 因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果。

<?php
   // test.txt: 1024 bytes
   $filename = 'test.txt';
   echo $filename . ': ' . filesize($filename) . ' bytes';
?>
<?php
   $file = fopen("test.txt", "r");
   // 获取文件大小,一次性读取出来
   $content = fread($file, filesize("test.txt"));
   echo $content;
   fclose($file);
?>

10. 将整个文件读取出为一个字符串 file_get_contents()

file_get_contents(
    string $filename,
    bool $use_include_path = false,
    resource $context = ?,
    int $offset = 0,
    int $length = ?
): string|false

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。

如果操作系统支持还会使用内存映射技术来增强性能。

<?php
   $content = file_get_contents("test.txt");
   echo $content;
?>

11. 将整个文件读取出并保存为一个数组 file()

file(string $filename, int $flags = 0, resource $context = ?): array

返回数组形式的文件内容。数组的每个元素对应于文件中的一行(结尾会附加换行符)。 失败时,file() 返回 **false**

<?php
   $content = file("test.txt");
   var_dump($content);
?>

12. 向文件写入一个字符串 fwrite()

fwrite(resource $handle, string $string, int $length = ?): int

fwrite()string 的内容写入 文件指针 handle 处。

注意一: 文件必须以写入或读写方式打开才可以进行写入操作

注意二: 在写入时,文件被创建所在的目录,也必须要有写入的权限才可以.否则不能创建文件

<?php
   $file = fopen("1.txt", 'w');
   fwrite($file, "hello\n");
   fwrite($file, "world");
   fclose($file);
?>

13. fpus()

fputs(resource $handle, string $string, int $length = ?): int

此函数是该函数的别名:fwrite()

<?php
   $file = fopen("2.txt", 'w');
     // 使用 fputs 写入
   fputs($file, "hello\n");
   // 使用 fwrite 写入
   fwrite($file, "world");
   fclose($file);
?>

14. file_put_contents()

file_put_contents(
    string $filename,
    mixed $data,
    int $flags = 0,
    resource $context = ?
): int

和依次调用 fopen()fwrite() 以及 fclose() 功能一样。

参数 data 可以是数组(但不能为多维数组).

<?php

   $animals = ["chicken", "duck", "goose",'dog','pig'];
   file_put_contents('1.txt', $animals);

?>

1. 数组介绍

数组是一组数据的集合,这组数据按照一定的规则组织起来,形成一个可操作的整体。

PHP 中的 array 实际上是一个有序映射。

映射是一种把 values 关联到 keys 的类型。

此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表hash table(映射的实现)、字典、集合、堆栈、队列等等。

由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。

2. PHP数组分类

根据数组下标不同,PHP中的数组可以分为两类

  • 索引数组
  • 关联数组

索引数组就是传统的数组定义方式 . 通过下标的方式保存和操作数组中的元素.

关联数组更像是其它语言中的字典,或对象, 使用键值对的方式保存和操作数组中的元素.

以下笔记 中,都按对比的方式 , 讲解两种数组的操作.

3. 数组的定义

  • 定义空数组
    在定义空数组时,不会区分数组是索引数组还是关联数据,完全看后期的使用方式

    <?php
    header("content-type:text/html;charset=utf-8");
    // 定义空数组
    $arr1 = array();
    echo gettype($arr1);
    echo "<br>";
    
    $arr2 = [];
    echo gettype($arr2);
    echo "<br>";
    ?>
    
  • 定义带元素的数组

    • 索引数组
      ```php <?php // 定义带元素的数组 $arr3 = array(1,2,3,4); var_dump($arr3); echo “
      “;

    // 由于PHP是弱类型语言,数组中的元素可以是任意类型 $arr4 = [“cat”, “dog”,”pig”]; var_dump($arr4); echo “
    “;

?>


   -  关联数组<br />key 可以是 integer 或者 string。value 可以是任意类型。  
```php
<?php

   header("content-type:text/html;charset=utf-8");
   // 
   // 定义带元素的数组
   $arr1 = array( "Monday"=>"星期一",
                  "Tuesday"=>"星期二",
                  "Wednesday"=>"星期三",
                  "Thursday"=>"星期四",
                  "Friday"=>"星期五",
                  "Saturday"=>"星期六",
                  "Sunday"=>"星期日");
   var_dump($arr1);
   echo "<br>";

   // 由于PHP是弱类型语言,数组中的元素可以是任意类型
   $arr2 = ["Monday"=>"星期一",
            "Tuesday"=>"星期二",
            "Wednesday"=>"星期三",
            "Thursday"=>"星期四",
            "Friday"=>"星期五",
            "Saturday"=>"星期六",
            "Sunday"=>"星期日"];
   var_dump($arr2);
   echo "<br>";

   // 定义

4.向数组中添加元素

  • 索引数组

    <?php
    
    header("content-type:text/html;charset=utf-8");
    // 
    $arr1 = array();
    var_dump($arr1);
    echo "<br>";
    
    // 指定下标方式添加数据
    $arr1[0] = 111;
    var_dump($arr1);
    echo "<br>";
    
    $arr1[1] = 222;
    var_dump($arr1);
    echo "<br>";
    
    // 不指定下标,追加到最后
    $arr1[] = 333;
    var_dump($arr1);
    echo "<br>";
    
    $arr1[5] = 555;
    var_dump($arr1);
    echo "<br>";
    // 这个元素的下标是多少?
    $arr1[] = 666;
    var_dump($arr1);
    echo "<br>";
    ?>
    
  • 关联数组

    <?php
    
    header("content-type:text/html;charset=utf-8");
    
    // 由于PHP是弱类型语言,数组中的元素可以是任意类型
    $arr2 = [];
    
    var_dump($arr2);
    echo "<br>";
    
    $arr2["one"] = 111;
    var_dump($arr2);
    echo "<br>";
    
    $arr2["two"] = 222;
    var_dump($arr2);
    echo "<br>";
    
    // 关联数组中允许使用混合key, 但是只能是int 或string
    // 如果不写key, 默认从 0 开始存放,如果前面有数字key,则接续保存
    $arr2[] = 333;
    var_dump($arr2);
    echo "<br>";
    
    $arr2[] = 444;
    var_dump($arr2);
    echo "<br>";
    ?>
    

5. 获取数组中元素个数

count(Countable|array $value, int $mode = COUNT_NORMAL): int

统计出数组里的所有元素的数量

<?php

   header("content-type:text/html;charset=utf-8");
   $arr1 = array( "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

   echo count($arr1);
   echo "<br>";

   // 由于PHP是弱类型语言,数组中的元素可以是任意类型
   $arr2 = ["Monday"=>"星期一",
      "Tuesday"=>"星期二",
      "Wednesday"=>"星期三",
      "Thursday"=>"星期四",
      "Friday"=>"星期五",
      "Saturday"=>"星期六",
      "Sunday"=>"星期日"];

   echo count($arr2);

?>

6. 获取数组中的元素

对数组进行取值时,不区分数组类型

数组名[索引/下标];
<?php

   header("content-type:text/html;charset=utf-8");
   $arr1 = array( "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

   echo $arr1[0];
   echo "<br>";

   echo $arr1[5];
   echo "<br>";
   // 索引数组在访问下标越界时,会报错
   // echo $arr1[10];
   // echo "<br>";

   // 由于PHP是弱类型语言,数组中的元素可以是任意类型
   $arr2 = ["Monday"=>"星期一",
      "Tuesday"=>"星期二",
      "Wednesday"=>"星期三",
      "Thursday"=>"星期四",
      "Friday"=>"星期五",
      "Saturday"=>"星期六",
      "Sunday"=>"星期日"];

   echo $arr2["Monday"];
   echo "<br>";

   echo $arr2["Saturday"];
   echo "<br>";

   // 关联数组在使用一个未定义的key取值时会报错
   // echo $arr2["xxx"];
   // echo "<br>";
?>

7. 修改数组中的元素值

数组名[索引/下标] = 值;

修改数据和添加数组类似,如果指定 的索引或 key 不存在,就是添加, 存在就是修改.

<?php

   header("content-type:text/html;charset=utf-8");
   $arr1 = array( "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

   var_dump($arr1);
   echo "<br>";

   $arr1[0] = "星期一";
   var_dump($arr1);
   echo "<br>";

   $arr1[0] = "周一";
   var_dump($arr1);
   echo "<br>";


   $arr2 = ["Monday"=>"星期一",
      "Tuesday"=>"星期二",
      "Wednesday"=>"星期三",
      "Thursday"=>"星期四",
      "Friday"=>"星期五",
      "Saturday"=>"星期六",
      "Sunday"=>"星期日"];

      var_dump($arr2);
      echo "<br>";

      $arr2["Monday"] = "星期一";
      var_dump($arr2);
      echo "<br>";

      $arr2["Monday"] = "周一";
      var_dump($arr2);
      echo "<br>";
?>

8. 删除数组/数组中的元素

在php中, 可以使用 unset() 函数来删除数组或数组中元素的值.

<?php

   header("content-type:text/html;charset=utf-8");
   $arr1 = array( "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

   var_dump($arr1);
   echo "<br>";

   unset($arr1[0]);
   var_dump($arr1);
   echo "<br>";

      // 删除之后再使用会报错
   unset($arr1);
   var_dump($arr1);
   echo "<br>";


   $arr2 = ["Monday"=>"星期一",
      "Tuesday"=>"星期二",
      "Wednesday"=>"星期三",
      "Thursday"=>"星期四",
      "Friday"=>"星期五",
      "Saturday"=>"星期六",
      "Sunday"=>"星期日"];

      var_dump($arr2);
      echo "<br>";

      unset($arr2["Monday"]);
      var_dump($arr2);
      echo "<br>";

      // 删除之后再使用会报错
      unset($arr2);
      var_dump($arr2);
      echo "<br>";
?>

9. 遍历数组

foreach 语法结构提供了遍历数组的简单方式。

foreach (iterable_expression as $value)
    statement
foreach (iterable_expression as $key => $value)
    statement

第一种格式遍历给定的 iterable_expression 迭代器。每次循环中,当前单元的值被赋给 $value

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key

<?php

   header("content-type:text/html;charset=utf-8");
   $arr1 = array( "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

   // 不带下标遍历
   foreach ($arr1 as  $val) {
      echo "值:" . $val . "<br>";
   }
   // 带下标遍历
   foreach ($arr1 as $i => $val) {
      echo "下标:" . $i . "-> 值:" . $val . "<br>";
   }

   echo "<hr>";

   $arr2 = ["Monday"=>"星期一",
      "Tuesday"=>"星期二",
      "Wednesday"=>"星期三",
      "Thursday"=>"星期四",
      "Friday"=>"星期五",
      "Saturday"=>"星期六",
      "Sunday"=>"星期日"];

    // 不带下标遍历
    foreach ($arr2 as  $val) {
      echo "值:" . $val . "<br>";
   }
   // 带下标遍历
   foreach ($arr2 as $key => $val) {
      echo "key:" . $key . "-> value:" . $val . "<br>";
   }

?>

10. 多维数组

在 PHP 中,一个数组中的值可以是另一个数组,另一个数组中的值也可以是一个数组,也就是说数组可以嵌套。

一维数组:没有发生嵌套的普通数组。

二维数组:两层数组的嵌套。

三维数组:三层数组的嵌套。

多维数组:多层数组的嵌套。

  • 定义二维数组

    $arr = array(
    array("id"=>1,"userName"=>"张三","sex"=>"男","age"=>15),
    array("id"=>2,"userName"=>"李四","sex"=>"女","age"=>14),
    array("id"=>3,"userName"=>"王五","sex"=>"女","age"=>16),
    array("id"=>4,"userName"=>"赵六","sex"=>"男","age"=>15),
    array("id"=>5,"userName"=>"田七","sex"=>"女","age"=>16)
    );
    
  • 二维数组取值

    echo $arr[0][id];
    echo $arr[3]["username"];