PHP

PHP

1.php标记

  • <?php 可以让代码进入“PHP 模式”
  • ?> 可以让代码退出“PHP 模式”

2.输出类容方式

**2.1 echo **

可以输出字符串,它可以同时输出多个字符串,以,分隔

注意:echo 后面紧跟着一个空格

<?php
echo 'hello wrold','<br>xiaoming';
?>

2.2 print

它也可以输出字符串,它只能输出一个值

<?php
print 'hello wrold';
?>

2.3 print_r()

更多的用来输出复杂类型:它可以输出复杂数据的key和值

<?php
print_r([1,2,3]);//Array ( [0] => 1 [1] => 2 [2] => 3 ) 
?>

**2.4 var_dump() **

可以输出复杂类型,它可以输出复杂类型数据的key和value,同时还可以获取value的长度

<?php
var_dump(["abc","a","qq"]);//array(3) { [0]=> string(3) "abc" [1]=> string(1) "a" [2]=> string(2) "qq" }
?>

3.与 HTML 混编

  • 普通嵌入
<p><?php echo 'hello'; ?></p>
  • 语句混编
<?php if ($age >= 18) { ?>
  <p>成年人</p>
<?php } else { ?>
  <p>小朋友</p>
<?php } ?>

<?php
    if(true) {
        echo '结果为真';
    }
    ?>

也可以这样

<?php if ($age > 18): ?>
  <p>成年人</p>
<?php else: ?>
  <p>小朋友</p>
<?php endif ?>

4.注释

  • 单行注释
<?php
// 这是一条单行注释
# 井号也可以做注释(不要用,有点生僻)
$foo = 'hello';
?>
  • 多行注释
<?php
/*
......
这里可以添加任意行数的注释内容
......
*/
?>

5.语法

5.1变量

声明变量 :

特点:

1.所有变量的声明必须以$符号做为前缀

2.变量名区分大小写

3…变量名的组成由字符,数字,下划线构成

<?php
var age = 20;
    类似js中的弱类型,php在声明变量的时候无需关注类型,系统会根据值进行自动的判断
    $age = 20; //声明变量并同时赋值
    echo $age;
    $name = 'jack';
    echo $name;
    $gender; //相当于变量的声明
    // 在php中如果声明变量没有赋值,那么这个值默认为null
    // 在php代码的语句最后建议都添加分号,如果不加,除非是最后一行,否则就会报错
    echo $gender;
    echo 123;
?>
常用函数
  1. isset():判断变量是否定义了,同时它还可以判断变量的值是否为null,如果定义了且值不为null,则返回true,echo输出为1;否则返回false,echo输出为null。
  2. empty():判断变量是否为空值,为空的值有:"" 0 “0”,null,false,array().如果值为以上中的某一个,则返回值
  3. unset():删除变量
    • 如果删除一个变量,那么变量的值会置为null
    • 可以同时删除多个变量
    • 如果在函数中删除全局变量,那么并不会真正的将全局变量删除(以后再说)

5.2数据类型

常见的 PHP 数据类型与 JavaScript 基本一致:

  • string(字符串) 重点
  • integer(整型)—— 只能存整数
  • float(浮点型)—— 可以存带小数位的数字
  • boolean(布尔型)
  • array(数组) 重点
  • object(对象)
  • NULL(空)

数据类型的分类:

  • 基本数据类型:string(字符串) integer(整型) float(浮点型) boolean(布尔型)
  • 复合数据类型: array(数组) object(对象)
  • 特殊数据类型:NULL(空) 资源

判断数据类型:

  • is_string():判断当前变量是否是字符串类型
  • is_bool():判断当前变量是否是布尔类型
  • is_int():判断当前变量是否是整形类型
  • is_float():判断当前变量是否是浮点类型
  • is_array():判断当前变量是否是数组类型
  • is_object():判断当前变量是否是对象类型
字符串

在php中,+只能运算符,意味着当出现+的时候,系统会自动的将+两边的数据转换为数值

在php中字符串连接符使用.

<?php
    $name = "jack";
	echo '我的名字叫'.$name;
?>

PHP 有多种创建字符串的方式:单引号、双引号等。

  • 单引号字符串
    • 它不能解析变量,如果在’'中包含的变量,变量会被当成普通字符串原样输出
    • 它支持转义,如\ ’
  • 双引号字符串
    • ""中可以来解析变量。
      1. 如果在变量名后面紧接着其它的合法字符(中文,a-z A-Z 0-9 _),那么系统会将整个变量及后面的字符串当成一个变量进行解析
      2. 如果需要在这种情况下正确的解析变量,可以将变量包含在{}中
    • 支持的转义字符:" \ \n \t $
<?php
$name = "jack";
echo '我的名字叫$name';
echo "我的名字叫{$name}\n我的\"年龄\"是20";
?>
数组

PHP 中数组可以分为两类:

  • 索引数组

与 JavaScript 中的数组基本一致

<?php
// 定义一个索引数组
$arr = array(1, 2, 3, 4, 5);
var_dump($arr);

// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = [1, 2, 3, 4, 5];
var_dump($arr2);

//遍历索引数组--for
// 在php中需要使用count(数组对象)来获取数组的长度
    for($i =0;$i < count($arr);$i++){
        echo $arr[$i].' ';
    }
?>
  • 关联数组

有点类似于 JavaScript 中的对象

<?php
// 注意:键只能是`integer`或者`string`
$arr = array('key1' => 'value1', 'key2' => 'value2');
var_dump($arr);

// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = ['key1' => 'value1', 'key2' => 'value2'];
var_dump($arr2);

$arr = array(
        "name" => "jack",
        "age" => 20,
        "gender" => true
    );

// 遍历关联数组 foreach
    // foreach(数组对象  as 键 => 值){

    // }
    // foreach(数组对象 as 值){

    // }
    foreach($arr as $key => $value){
        echo $key .":".$value.'<br>';
    }
    // foreach($arr as $value){
    //     echo $value.'<br>';
    // }
?>

php中的混合数组:综合了索引数组和关联数组的特点,意味着它里面包含索引和关联两种形式

特点:

​ 1.如果添加元素的时候设置key,那么就没有索引

​ 2.如果没有设置key,那么系统自动生成索引

​ 3.下载索引和key不会互相影响。如果没有指定key,那么索引会取到之前的最大的索引下载+1

与数组相关的常用函数

unset():它也可以用来删除数组中的某个成员。但是删除了数组的元素之后,并不会对数组元素的索引产生影响,元素还会保留之前的索引。意味着它只是删除了索引位置的元素,并没有动态的改变数组的长度。

<?php
$arr = [1,2,3,4,5];
    print_r($arr);
    unset($arr[2]);
    echo '<hr>';
    print_r($arr);
?>
php中的深度数组:二维数组
<?php
$arr = array( //索引数组
        // 描述第一个学生对象的数据
        "first" => array( //关联数组--类似于js中的对象
            "name" => "jack",
            "age" => 20
        ),
        array(
            "name" => "rose",
            "age" => 18
        )
    );
    print_r($arr);
    echo '<hr>';
    foreach($arr as $key => $value){
        // 二维数组的遍历需要考虑使用嵌套循环
        foreach($value as $subkey => $subvalue){
            echo $subkey .":".$subvalue ."<br>";
        }
    }
    ?>

5.3数据类型转换

<?php
$str = '132';
// 将一个内容为数字的字符串强制转换为一个整形的数字
$num = (int)$str;
// 将一个数字强制转换为布尔值
$flag = (bool)$num;
?>

5.4运算符

+只能是算术运算符,系统会自动的将+两边的变量转换为数组,如果可以转换,就进行转换,否则返回这个数据类型的默认值 int >0 object > null bool>false float:0.0

在php中字符串连接符使用.

算术运算符: + - * 、 % ++ –

赋值运算符:= += -= *= /=

逻辑运算符:! && ||

比较运算符:> >= < <= == === !=

三元运算符:a>b ? “” : “”

5.5指令式写法

<?php
// if($age >= 18):
    //     echo '你已成年';
    // else:
    //     echo '你未成年';
    // endif;
    
// $score = 25; //A B C D E F 
    // if($score >= 90):
    //     echo 'A';
    // elseif($score >= 80):
    //     echo 'B';
    // elseif($score >= 70):
    //     echo 'C';
    // elseif($score >= 60):
    //     echo 'D';
    // else:
    //     echo 'E';
    // endif;
?>

5.6函数

在php中函数内部无法使用函数外部的成员

如果一个变量没有赋值或者这个变量不存在,那么转换为int之后的结果默认为0

<?php
    $num = 100;
    function cal(){
        // 如果想在函数内部使用函数外部声明的全局变量,那么就可以使用关键字:global
        // global就是用来添加对外部成员的引用
        // 注意点:不能在引用的同时对变量赋值,如果想赋值,则需要换下一行赋值
        global $num;
        // 如果在函数内部修改了全局变量的值,那么这个修改也会影响后面的使用
        $num = 10;
        $sum =0;
        for($i =0;$i<=$num;$i++){
            // $sum = $sum + $i;
            $sum += $i;
        }
        return $sum;
    }
    $result = cal(100); //55
    echo $result;
    echo '<hr>';
    echo $num;
?>
function cal($num){
        $sum =0;
        for($i =0;$i<=$num;$i++){
            // $sum = $sum + $i;
            $sum += $i;
        }
        return $sum;
    }
    // 调用:通过函数名称调用
    $result = cal(100); //5050
    echo $result;

implode

它可以将关联的数据以指定分隔符连接,转换为字符串

<?php

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

// Empty string when using an empty array:
var_dump(implode('hello', array())); // string(0) ""

?> 

explode

explode:它可以将字符串以指定的分隔符分隔,生成关联数组

<?php
// 示例 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
?>

时间函数

<?php
    // time():从 Unix 纪元(格林威治时间 1970-01-01 00:00:00)到当前时间的秒数
    // echo time();
    // 默认情况下这个函数获取的是格林威志时间,如果想获取中国时区的时间,就需要进行配置文件的修改
    // php-ini >date.timezone = PRC|Asia/shanghai|Asia/chongqin
    echo date("Y-m-d H:i:s");

    // strtotime()输入时间距离1970-1-1的时间戳,中间差8小时
    echo "<hr>";
    echo strtotime("1970-1-2");
?>

6.变量作用域

6.1超全局变量
  • $GLOBALS — 引用全局作用域中可用的全部变量
  • $_SERVER — 获取服务端相关信息
  • $_REQUEST — 获取提交参数
  • $_POST — 获取 POST 提交参数
  • $_GET — 获取 GET 提交参数
  • $_FILES — 获取上传文件
  • $_ENV — 操作环境变量
  • $_COOKIE — 操作 Cookie
  • $_SESSION — 操作 Session

$GLOBALS

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

<?php
$x = 75;
$y = 25;

function foo () {
  $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}

foo();
echo $z;
// => 100
?>
6.2常量定义与使用
<?php
    // 定义常量的语法:define(常量名称,常量值,标记是否对大小写敏感false)
    // define(name,value,insensitive):insensitive:不敏感的,麻木不仁的,
    // 默认情况下常量对大小写敏感--区分大小写
    // 定义常量:一般情况下常量的名称使用大写字符
    define("PI",3.14,true);
    // 使用常量.常量的使用和变量没有区别,只要注意前面不需要再添加$符号了
    echo PI;
    echo '<hr>';
    echo pi;
    echo '<hr>';

    // php中的魔术常量的使用:魔术常量的意思是指这个常量值会根据不同的使用场合返回不同的值
    // __LINE__:可以获取当前的代码行
    echo __LINE__;
    echo '<hr>';
    // __FILE__:它可以获取当前文件的路径 :目录+文件名
    echo __FILE__;
    echo '<hr>';
    // __DIR__:它可以获取当前文件的目录
    echo __DIR__;
    echo '<hr>';
    // __FUNCTION__:它可以获取当前魔术常量所在的函数
    function test()
    {
        echo __FUNCTION__;
    }
    test();
?>

7.载入其他文件:文件包含

通常情况下,当一个文件中的代码过长,自然会想到要拆分到多个文件中。随着开发经验的积累,慢慢的会发现,除了文件过程应该拆分文件,更应该做的事情是根据用途去划分。

不管你是怎样想的,核心问题都是一样:怎么将代码拆分到多个文件中?

PHP 中引入其他 PHP 文件有四种方式:

  • require
  • require_once
  • include
  • include_once

四种方式的对比:

requirerequire_onceincludeinclude_once
被载入文件如果不存在是否影响继续运行YYNN
多次调用是否会重复执行被载入的文件YNYN

总结来说:

  • 横向分为两类:require 和 include 两种,区别在于 require 会因为载入文件不存在而停止当前文件执行,而 include 不会。
  • 纵向分为两类:xxx 和 xxx_once,区别在于代码中每使用一次 xxx 就执行一次载入的文件,而 xxx_once 只会在第一次使用是执行。

使用层面:

  • include 一般用于载入公共文件,这个文件的存在与否不能影响程序后面的运行
  • require 用于载入不可缺失的文件
  • 至于是否采用一次载入(once)这种方式取决于被载入的文件

8.文件操作

file_get_contents() 将文件读入字符串

读取文件内容,如果读取成功,就会返回一个字符串类型的值(文件内容),如果读取失败,就会返回false

**file_put_contents(**文件路径,需要写入的内容,FILE_APPEND ) 将文件读入字符串

将指定的内容写入到文件,同时返回当前成功写入的字符的数量

FILE_APPEND:设置当前的写入方式为追加

<?php
    // 设置当前页面的返回值的类型是图片格式,意味着后期浏览器接收了返回值之后,会按照图片格式进行解析
    // header("Content-Type:text/html");
    // // $res = file_get_contents("data.txt");
    // // var_dump($res);
    
    // header("Content-Type:image/jpeg");
    // $res = file_get_contents("./images/monkey.png");
    // echo $res;

    // file_put_contents(文件路径,需要写入的内容,FILE_APPEND ):将指定的内容写入到文件,同时返回当前成功写入的字符的数量
    // FILE_APPEND:设置当前的写入方式为追加(用双引号,单引号不能转译n)
    $count = file_put_contents("data.txt","这是我写\n入的内容",FILE_APPEND);
    echo $count;
?>

9.GET与POST

9.1GET请求

1.1常见的发起GET请求的方式

  • 地址栏访问
  • src/href
  • 表单

1.2网页中有许多效果使用的就是GET请求:

  • 各种搜索框
  • 各种详情页面
  • 大部分超链接

1.3GET方式提交数据的格式

  1. 格式:index.php?userName=jack&password=123
  2. 参数名与参数值之间没有空格
  3. 参数值不需要使用单双引号包括

1.4GET方式提交数据的特点:

  1. get方式在url后面拼接参数,只能以文本的形式传递数据
  2. 传递的数据量小,4KB左右(不同浏览器会有差异)
  3. 安全性低,会将数据显示在地址栏
  4. 速度快,通常用于对安全性要求不高的请求

9.2POST请求

2.1特点

1-post 方式 安全性比较高

2-传递数据量大,请求对数据长度没有要求

3-请求不会被缓存,也不会保留在浏览器历史记录中

用于:密码等安全性要求比较高的场合,提交的数据量比较大:发布文章,上传文件。

POST方式提交数据上限默认为8M(可以在PHP的配置文件post_max_size选项中修改)

10.表单处理

10.1表单基本使用

HTML 中有一个专门用于提交数据的标签:<form>,通过这个标签可以很容易的收集用户输入。

form 标签有两个必要属性:

  • action:表单提交地址(填完了,交给谁)
  • method:表单以什么方式提交(get|post)

PHP 中有三个超全局变量专门用来获取表单提交内容:

  • $_GET:用于获取以 GET 方式提交的内容,更标准的说法:接收 URL 地址问号参数中的数据

  • $_POST:用于获取以 POST 方式提交的内容,更标准的说法:接收 请求体 中的数据

  • $_REQUEST:用于获取 GET 或 POST 方式提交的内容,但是我们不用,为什么,有两个原因

  • 1.效率更低下

    2.它的取值受配置文件的影响:它的取值有一个顺序,在同名的情况下,后面所取的值会将前面所取的值覆盖,所以它不安全

    建议:能不用就不用

提交地址

action 提交地址指的是这个表单填写完成过后点击提交,发送请求的请求地址是什么。

从便于维护的角度考虑,一般我们最常见的都是提交给当前文件,然后在当前文件中判断是否是表单提交请求:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // 表单提交请求
}
?>

另外,建议使用 $_SERVER['PHP_SELF'] 动态获取当前页面访问路径,这样就不用因为文件重命名或者网站目录结构调整而修改代码了:

<!-- 这样写死 action 地址,当文件重命名就需要修改代码 -->
<form action="/foo/login.php">
  <!-- ... -->
</form>
<!-- 通过 `$_SERVER['PHP_SELF']` 获取路径,可以轻松避免这个问题 -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- ... -->
</form>

提交方式

method 可以用于设置表单提交的方式,目前我们所认识的就是最常见两种表单提交方式:GETPOST

从效果上来看,两者都可以将数据提交到服务端,但是从实现提交的原理上两者有很大的不同:

  • GET
    • 表单数据是通过 URL 中的 ? 参数传递到服务端的
    • 可以在地址栏中看到提交的内容
    • 数据长度有限制,因为 URL 地址长度有限(2000个字符)
  • POST
    • 表单数据是通过请求体传递到服务端的,我们在界面上看不到
    • 可以提交任何类型的数据,包括文件
    • 由于界面上看不见,浏览器也不储存,所以更安全

至于什么情况下应该选用哪种方式,这个需要结合业务场景和这两种方式各自的特点来决定,没有绝对的答案,只能给出一些原则:

  • 绝不能使用 GET 来发送密码或其他敏感信息!!!
  • 应该想清楚这次请求到底主要是去拿东西,还是去送东西

10.2常见表单元素处理

至于表单元素中的文本框文本域一类的元素,都是直接将元素的 name 属性值作为键,用户填写的信息作为值,发送到服务端。

但是表单元素中还有一些比较特殊的表单元素需要单独考虑:

单选按钮

<!-- 最终只会提交选中的那一项的 value -->
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">

复选按钮

<!-- 没有设置 value 的 checkbox 选中提交的 value 是 on -->
<input type="checkbox" name="agree">
<!-- 设置了 value 的 checkbox 选中提交的是 value 值 -->
<input type="checkbox" name="agree" value="true">

如果需要同时提交多个选中项,可以在 name 属性后面 跟上 []

<input type="checkbox" name="funs[]" value="football">
<input type="checkbox" name="funs[]" value="basketball">
<input type="checkbox" name="funs[]" value="world peace">

最终提交到服务端,通过 $_POST 接收到的是一个索引数组。

选择框

<select name="subject">
  <!-- 设置 value 提交 value -->
  <option value="1">语文</option>
  <!-- 没有设置 value 提交 innerText -->
  <option>数学</option>
</select>

10.3文件上传

表单注意事项

  1. form 表单数据的编码类型由enctype决定,默认为application/x-www-form-urlencoded方式编码。文件上传时属性值必须设置为multipart/form-data

    application/x-www-form-urlencoded:会把表单中发送的数据编码为名称/值对,标准编码格式

    multipart/form-data,这个是专门用来传输特殊类型数据的,比如文件、mp3

  2. 数据提交方式:POST方式

<?php
    // 在php中,文件上传之后的相关信息都存储在$_FILES中
    // Array
    // (
    //     [myfile] => Array
    //         (
    //             [name] => 跨域攻击.png:源文件的名称
    //             [type] => image/png:源文件的类型
    //             [tmp_name] => C:\Windows\phpE412.tmp:这是文件在服务器的临时路径
    //             [error] => 0:错误信息,0代表没有错误
    //             [size] => 256436:文件的大小
    //         )
    // )
    // 1.判断用户是否提交
    if(!empty($_FILES)){
        print_r($_FILES);
        // echo $_FILES["myfile"]["tmp_name"];
        // 判断文件类型是否满足需要
        $type = $_FILES["myfile"]["type"];
        // strpos(源字符串,搜索字符串):可以获取指定字符串在源字符串中第一次出现的索引值,索引从0开始
        // if(strpos($type,"image/") === 0){
        $filename = $_FILES["myfile"]["name"];
        // 获取当前文件的扩展名 strrchr(源字符串,指定搜索的字符)
        $extension = strrchr($filename,".");
        // 生成一个随机的文件名称:获取到一个唯一值
        $myname = time().rand(1000,9999).$extension;
        move_uploaded_file($_FILES["myfile"]["tmp_name"],"./upload/".$myname);  
        // }else{
        //     echo '你选择不是图片';
        // }
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
        文件选择:<input type="file" name="myfile"><br>
        <input type="submit">
    </form>
</body>
</html>

10.6$_FILES数组详解

type 属性为 fileinput 元素可以通过表单提交文件(上传文件),服务端 PHP 可以通过 $_FILES 获取上传的文件信息。

$_FILES 同样也是一个关联数组,键为表单的 name,内容如下:

array(1) {
  ["avatar"]=>
  array(5) {
    ["name"]=>
    string(17) "demo.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(27) "C:\Windows\Temp\php786C.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(29501)
  }
}

文件上传后,文件信息自动保存在预定义变量$_FILES数组中。假设myFile为文件域的name属性值。

1) [$_FILES[‘myFile’][‘name’]

​ 文件的原始名称。

2) $_FILES[‘myFile’][‘tmp_name’]

​ 文件的临时路径,默认为c:/windows/temp(运行窗口—>temp)。没有直接将文件上传至Apache服务器的根目录

[3) $_FILES[‘myFile’][‘type’]]

​ 文件的内容类型。
​ 常见的文件类型: image/jpeg,image/png,image/gif,text/html,text/javascript

[4) $_FILES[‘myFile’]’error’]

​ 文件上传的错误代号。0代表没有发生错误。

[5) $_FILES[‘myFile’]size’]

​ 文件大小(单位为byte,字节)

<?php
    // Array
    // (
    //     [myfile] => Array
    //         (
    //             [name] => Array
    //                 (
    //                     [0] => qq.png
    //                     [1] => 程序员的理解.jpg
    //                 )

    //             [tmp_name] => Array
    //                 (
    //                     [0] => C:\Windows\phpC51.tmp
    //                     [1] => C:\Windows\phpC62.tmp
    //                 )

    //         )

    // )
    if(!empty($_FILES)){      
        // 1.获取扩展名
        $nameArr = $_FILES["myfile"]["name"];
        $pathArr = $_FILES["myfile"]["tmp_name"];
        foreach($pathArr as $key => $value){
            // $nameArr[0]
            // 2.获取唯一的图片名称
            $name = time().rand(1000,9999).strrchr($nameArr[$key],".");
            // 3.将文件存储到永久目录:move_uploaded_file
            move_uploaded_file($value,"./upload/".$name);
        }
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
        <!-- 文件选择:<input type="file" name="myfile[]" multiple><br> -->
        文件选择: 
        <input type="file" name="myfile[]">
        <input type="file" name="myfile[]">
        <input type="submit">
    </form>
</body>
</html>

11.HTTP:HTTP协议

定义

HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种协议规范了通讯内容的格式以及各项内容的含义

约定形式

  1. 客户端通过随机端口与服务端某个固定端口(一般为80)建立连接 三次握手
    1. 客户端向服务器发送一个连接请求
    2. 服务器向客户端返回一个确认信息
    3. 客户端将请求及这个确认信息发送服务器
  2. 客户端通过这个连接发送请求到服务端(这里的请求是名词)
  3. 服务端监听端口得到的客户端发送过来的请求
  4. 服务端通过连接响应给客户端状态和内容(响应报文)

约定内容

  • 请求 / 响应报文格式
  • 请求方式 —— GET / POST / etc.
  • 响应状态 —— 200 / 404 / 302 / 304 / etc.
  • 预设的请求 / 响应头

11.1请求报文

请求报文的常见格式

请求报文包含 请求行–请求头–请求空行–请求体
在这里插入图片描述
在这里插入图片描述

请求行

GET /demo.php HTTP/1.1

请求方式 + 空格 + 请求路径 + 空格 + HTTP 协议版本

请求头

客户端想要告诉服务端的一些额外信息,以下为常见的请求头:

Host请求的主机
Cache-Control控制缓存(例如:max-age=60 缓存60秒)
Accept客户端想要接收的文档类型,逗号分隔
User-Agent标识什么客户端帮你发送的这次请求
Referer这次请求的来源
Accept-Encoding可以接受的压缩编码
Cookie客户端本地的小票信息
Connection设置当前请求结束之后,连接是否断开 keep-alive(保持)close(断开)

请求体

​ 客户端需要向服务端发送的内容

  • get请求,会把基本的参数拼接到url的后面,所以基本使用不上请求体
  • post请求使用请求体会比较频繁

get请求
在这里插入图片描述
get请求没有请求体,因为都在url的问号后面

post请求
在这里插入图片描述
如果上传文件的话
在这里插入图片描述

GETPOST
后退按钮/刷新无害数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签可收藏为书签不可收藏为书签
缓存能被缓存不能缓存
编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史参数保留在浏览器历史中。参数不会保存在浏览器历史中。
对数据长度的限制是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。无限制。
对数据类型的限制只允许 ASCII 字符。没有限制。也允许二进制数据。
安全性与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性数据在 URL 中对所有人都是可见的。数据不会显示在 URL 中。

11.2响应报文

状态行 - 响应行 -响应空行- 响应体
在这里插入图片描述
状态行

HTTP/1.1 200 OK

HTTP 协议版本 + 空格 + 状态码 + 空格 + 状态描述

响应头
在这里插入图片描述

服务端想要告诉客户端的一些额外信息,常见的有以下:

Date响应时间
Server服务器信息
Content-Type响应体的内容类型
Content-Length响应的内容大小
Set-Cookie让客户端设置一个小票

如果需要在程序中设置自定义的响应头(不是预设的),建议使用 X-<Property-Name> 规则

响应体

​ 响应体一般来说是HTML,也可以是css或者javascript

​ 注意:返回什么类型文件,就修改响应头里的响应类型

11.3应用场景

请求css文件

​ 虽然要请求的是css文件,但是link的是php文件

​ 由于php是后台文件,最终是在php中返回内容给浏览器,并且可以设置当前的文件类型

<link rel="stylesheet" href="css.php" />

设置响应文件类型

header('Content-Type: text/css');

(注意:常见的 HTTP MIME type:

Content-Type:text/css

Content-Type:text/html

Content-Type:text/javascript

Content-Type:image/jpeg

Content-Typeimage/png

Content-Type:image/gif

Content-Type:application/x-www-form-urlencoded)

header方法发送重定向操作

​ 页面跳转

<a href="data.php">点击重定向</a>

​ 在data.php中完成跳转

<?php
  	// 立马做出跳转
  	// header("Location:01-getsmt.php");
  
  	// 在指定的时间之后跳转
  	header("refresh:3;url=01-getsmt.php");
?>

header方法实现下载功能

<?php
  	// 实现当前页面的自动下载
  	header("Content-Type:application/octet-stream");

	// 指定文件名称, 自动下载,设置下载名称
	header("Content-Disposition:attachment;filename=tmp.php");
  
?>

设置请求头制作图片防盗链

<?php
  	// 获取请求报文数据
  	// print_r(getallheaders());
  
  	$refer = getallheaders()["Referer"];
	echo $referer; // http:127.0.0.1/day04/03-test.html

	// 获取url中各个部分的值
	print_r(parse_url($referer));

	/*
		Array(
			[scheme] => http
			[host] => 127.0.0.1
			[path] => /day04/03-test.html
		)
	*/

?>

12.状态码

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  • 1xx:指示信息 —— 表示请求已接收,继续处理。
  • 2xx:成功 —— 表示请求已被成功接收、理解、接受。
  • 3xx:重定向 —— 要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误 —— 请求有语法错误或请求无法实现。
  • 5xx:服务器端错误 —— 服务器未能实现合法的请求。

常见状态代码、状态描述的说明如下。

  • 200 OK:客户端请求成功。
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

13. HTTP协议无状态

HTTP会话

​ 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话

HTTP无状态

​ HTTP协议,本来是进行共享多个计算机之间的文件而产生的文件传输协议

​ 而请求的时候,服务器没有记录当前的信息

14.Cookie

用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

内容cookielocalStoragesessionStorage
生命周期一般由服务器生成,可设置失效的时间,如果在浏览器端生成cookie,默认关闭浏览器后失效除非被删除,否则永久保存仅在当前会话下有效,关闭页面或者浏览器后被删除
数据大小4k20M5M
与服务器端通信携带在http请求头中,若保存cookie过多数据会带来性能问题仅在客户端即浏览器中保存,不参与和服务器的通信仅在客户端即浏览器中保存,不参与和服务器的通信
易用性需要程序员自己封装原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持

14.1创建cookie

<?php
  	// 创建cookie
  	// setcookie("username", "tylor");  // 可以在请求头中查看
  
	// 判断是否拥有某个指定名称的cookie值 -- $_COOKIE
	if(isset($_COOKIE["username"])) {
      	echo "欢迎回来,朕的小仙女";
	}else {
		echo "大人头一回来,是打尖儿还是住店呀~";
      	setcookie("username", "tylor");
    }
  
?>

cookie的参数

​ cookie的有效期

<?php
    // 时间是秒, 时间参照php的默认起始时间(1970-1-1)
    // setcookie("username", "tylor", 100);
    setcookie("username", "tylor", time() + 10);

	// 设置永久的时间
	setcookie("username", "tylor", PHP_INT_MAX);

?>

​ cookie的有效目录

<?php
    // 在不同的文件夹输出cookie中的键
  	echo $_COOKIE["username"];

	// 通过path可以设置访问权限,参照网站根目录
	setcookie("username", "tylor", PHP_INT_MAX, "/day05/down");
	// 设置父级目录,子目录可以访问,设置子目录,上层不能访问  "/" 代表整站可以访问
	// Domain: 域名  path: 路径   secure:只有在https这类安全的协议下才会发送
	

	// 某网站中显示的cookie
	// set-cookie: ds_user_id=3265153328; Domain=.instagram.com; expires=Wed, 13-Feb-2019 14:19:35 GMT; Max-Age=7776000; Path=/; Secure

?>

14.2删除cookie

<?php
  	// 处理删除cookie的php文件
  
  	// 1.0 怎么创建的就怎么删除的
  	// setcookie("username", "");  如果开始不是这样设置的,这样删除就不行
  	setcookie("username", "", PHP_INT_MAX, "/day05/down");
	echo "ok";

	// 2.0 设置一个过期时间,也是可以删除的 
?>

14.3关于cookie的缺陷

  • Cookie会被附加在每个HTTP请求中,所以无形中增加了流量
  • 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS
  • Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的

15.关于JSON的小补充

15.1JSON数据格式

[
    {
        "title":"李四之歌",
        "singer":"李四",
        "album":"李四的音乐世界",
        "src":"./upload/aa.mp3"
    },
    {
        "title":"李四之歌",
        "singer":"李四",
        "album":"李四的音乐世界",
        "src":"./upload/aa.mp3"
    }
]

15.2JSON的特点

  • 在json格式的文件中,不允许写任何的注释
  • 属性和值,必须要使用双引号包含,值为数值或者非字符,没有undefined
  • 对应关系
    • 对象 => { } 后期可以将其转换为一个对象
    • 数组 => [ ] 后期可以将其转换为一个数组
  • 单个json的数据用对象表示,多个就是上面见到的数组的格式,这种数据类型以后会经常见到

15.3JSON的方法

json_encode()

可以将php数组或者对象转换为json格式的字符串

json_decode()

可以将json格式的字符串转换为数组或者对象

16.Session

16.1session的优点:

  • SESSION也是一种会话技术;
  • SESSION数据存在服务器端,相对于比较安全;
  • 服务器将SESSION数据保存在服务器上,而将SESSION的用户id存储在客户端电脑上。
  • SESSION存储的数据类型,除了资源外的数据类型都可以;
  • SESSION文件没有大小限制;

16.2session原理分析

  • 客户端第一次请求服务器时,服务器开启一个session,生成一个唯一标识(sessionid:存储的数据与此sessionid关联),并以响应头的Set-Cookie属性响应到客户端
  • 客户端的后续请求会一直通过请求头的Cookie属性携带sessionid(客户端与服务器通过此id维持状态)
    在这里插入图片描述

16.3session基本操作

  • 设置session
session_start();
$_SESSION['user'] = array('username'=>'lisi','age'=>'12');
  • 读取
session_start();
$user = $_SESSION['user'];
  • 删除一个session信息
session_start();
unset($_SESSION['user']);
  • 删除所有session信息
session_start();
unset($_SESSION);
$_SESSION = []
  • 销毁session
session_start();
session_destroy();

16.4session与cookie的关系

  • session可以借助cookie实现状态维持,也可以不依赖cookie(URL重写)
区别cookiesession
存储位置浏览器服务器
浏览器携带的数据量少(只携带session-id)
存储的数据类型只能是字符串任意类型
安全性较低较高
默认的有效路径当前路径及其子路径整站有效
数据的传输量有限制4K,不能超过20个无限制

17.MySQL

17.1基础操作

mysql> show databases;  -- 显示全部数据库
mysql> create database <db-name>;  -- 创建一个指定名称的数据库
mysql> use <db-name>;  -- 使用一个数据库,相当于进入指定的数据库
mysql> show tables;  -- 显示当前数据库中有哪些表
mysql> create table <table-name> (id int, name varchar(20), age int);  -- 创建一个指定名称的数据表,并添加 3 个列
mysql> desc <table-name>;  -- 查看指定表结构
mysql> source ./path/to/sql-file.sql  -- 执行本地 SQL 文件中的 SQL 语句
mysql> drop table <table-name>;  -- 删除一个指定名称的数据表
mysql> drop database <db-name>;  -- 删除一个指定名称的数据库
mysql> exit|quit;  -- 退出数据库终端

17.2基本查询语句

查询

-- 查询在这张表里面的所有id列和name列
select id,name from mytable

-- 带条件的查询
select * from mytable where id = 3

-- 查询年龄小于20岁的
select * from mytable where age < 20

-- 查询年龄小于20岁,性别为女生
-- and or not
select * from mytable where age < 20 and gender = 0

增加

-- 表名后没有指定字段,那么必须设置对应数量的值,并且主键不能重复
insert into mytable values('lili', 30, 0) -- 没有id的值,所以报错

-- 如果有标识列,一般可以给null值,系统会自动生成
insert into mytable values(null, 'lili', 30, 0)

-- 指定需要添加数据的字段
insert into mytable(name, age, gender) values('lili', 30, 0)

-- 对于值为null的值,可以不写
insert into mytable(name) values("ok")

-- 非空字段需要赋值,否则系统也不会自动为其生成默认值
insert into mytable(age,gender) values(40, 1) -- 虽然可以,但是不建议漏掉非空字段

修改

-- 修改的语法 update 表名  set 字段1 = 值1, 字段2 = 值2 ...
update mytable set age = age + 1 -- 会把所有的都改变

-- 带条件的写法,只会改变第5条
update mytable set age = age + 10 where id = 5

-- 同样支持  or  and  not

-- 修改多个内容
update mytable set age = age + 1,gender = 1 where id = 5 or id = 6

删除

不要轻易删除内容

-- 删除语句的语法 delete [from] 表名 where 条件
-- 删除的操作不能还原,要删除的话,就需要提前备份
delete from mytable where id = 8

-- 同时删除多个
delete from mytable where id in(4,5)

17.3常见的函数说明

总条数 count

-- 查询可以满足条件的记录数
select count(*) from mytable

-- 选择符合条件的记录数
select count(id) from mytable

-- 如果当前空值,不会对null值进行计算

最大值、最小值 max min

-- max 获取最大值  min  获取最小值
select max(age) from mytable

-- 如果是字符,按照字符的ascll码来排序

平均值 avg

-- 一般都是数值
select svg(age) from mytable

**排序 order by **

select * | 字段列表 form 表列表 where order by asc 升序 desc 降序

select * from mytable

-- 降序
select * from mytable order by id desc

-- 按照name排序  a-z
select * from mytable order by name

-- null值会排在前面

-- 实现按照性别,再按照年龄
select * from mytable order by gender,age

获取指定范围内的数据limit

获取指定的前n条记录 只有一个参数

-- 前面3条数据
select * from mytable limit 3

-- 后面五条
-- 先做降序,然后再去筛选,并且一定要先排序,再获取,不然会报错
select * from mytable order by id desc limit 5

-- 中间范围的记录   n 偏移量从0开始, m 能够获取的记录数
select * from mytable limit 2,2

-- 第2种写法,和上面的一样
select * from mytable limit 4 offset 2

制作分页

int pageSize = 10;
int pagecount = 1;

select * from mytable pageSize 4 offset (pagecount - 1* pageSize

多表查询

-- 返回初始的数据,没有内部关联的数据
select * from student

-- 用户需要的是最终的结果
-- 1.0 采用from where的方式
select * from student,class where student.cid = class.classid  -- where后面的这个 = 表示判断

-- 简写
select studentId,studentName,age,gender,className from student,class where student.cid = class.classid 

-- 2.0  join 和 inner join都是一样的   on和where的意思也是差不多的
select * from student inner join class on student.cid = class.classid


-- left join   如果对应不上的时候,自动让对应的值为空   right join 与之相反
select * from student left join class on student.cid = class.classid

17.4PHP建立数据库连接

建立与服务器的连接

<?php
	// 有效
  	header("Content-Type:text/html;chartset=utf-8");

  	// 设置主机,用户名,密码,想操作的数据库
  	// 这个函数会自动打开连接
  	// 如果连接失败,返回false   如果连接成功就返回一个连接对象
  	$conn = mysqli_connect("localhost", "root", "root", "mybase");

	var_dump($conn); // 出来一堆东西证明连接成功
	
	// 假如出错了,错误信息会给详细的提示
	//失败的情况:
    // Unknown database 'mybase1':数据库找不到,请注意名称是否正确
    // Access denied for user 'root'@'localhost' (using password: YES):密码错误
    // Access denied for user 'root1'@'localhost' (using password: YES):用户名错误
    // mysqli_connect()::这种错误一般是服务器相关的错误
    
	// 为了保证服务器返回值的编码与当前php编码一致,我们可以设置服务器的返回数据的编码
    // mysqli_set_charset(连接对象,编码格式字符串)
    //无效
    mysqli_set_charset($conn,"utf8");
    
	if(!$conn) {
      	// echo "连接失败";
      	// return;
      	die("连接失败");
      	// exit();
	} else {
      	echo "连接成功";
	}
	
	echo "这是连接之后的代码,如果有错误,将不会执行到这里";
?>

PHP操作sql增加、修改和删除

增加

<?php
  	// 新增数据 创建sql语句
  	$sql = "insert into mytable value(null, '张三', 30, 1)";
  
	// 执行sql语句  mysqli_query(连接对象, sql语句)
	// 有返回值
	$result = mysqli_query($conn, sql);

	var_dump($result); // bool(true)    |    bool(false)

	if($result) {
      	echo "新增成功";
	} else {
      	echo "新增失败<br>";
      	
      	// 输出具体的报错信息,它可以输出最近一条sql语句在执行时所产生的错误信息
      	echo mysqli_error($conn); 
	}

	// 获取更加详细的信息
	
?>

修改

<?php
  
  	// 修改操作
  	$sql = "update mytable set age = 20 where id = 3";
  
	$result = mysqli_query($conn, sql);

	if($result) {
      	echo "修改功";
	} else {
      	echo "修改失败<br>";
      
      	// 输出具体的报错信息
      	echo mysqli_error($conn); 
	}
?>

删除

<?php
  
  	// 修改操作
  	$sql = "delete from mytable where id = 4";
  
	$result = mysqli_query($conn, sql);

	if($result) {
      	echo "删除成功";
	} else {
      	echo "删除失败<br>";
      
      	// 输出具体的报错信息
      	echo mysqli_error($conn); 
	}
?>

php查询结果集

<?php
  	// 1.0 设置响应头
  	header("Content-Type:text/html;chartset=utf-8");

	// 2.0 创建数据库连接
	$conn = mysqli_connect("localhost", "root", "root", "mybase");

	// 3.0 设置编码
	// mysqli_set_chartset($conn, "utf8");
	mysqli_query($conn, "set name as utf-8"); // 设置编码格式为utf-8

	if(!$conn) {
      	die("连接失败");
	} 

	// 4.0 创建sql语句
	$sql = "select * from mytable";
	
	// 5.0 执行sql语句   
	$result = mysqli_query($conn, $sql);

	var_dump($result);  // 获取到大致信息,几行几列,但是并不是具体的数据
	
?>

判断当前返回结果集的状态

<?php
  	if(!$result) {
      	die("查询失败");
	} else if(mysqli_num_rows($result) == 0) {
      	die("结果集为空");
	} else {
      	var_dump($result);
	}
  	
  	// 1, 如果查询失败, 会返回false
  	// 2,如果成功,有结果集,但是没有数据,     有结果集有数据
  	// !!!! 判断当前结果集中是否有数据
  	// mysqli_num_rows($result);
  	
?>

展示结果集中的内容

获取数据的函数:

<?php
  	// 1.0   mysqli_fetch_array
  	$arr = mysqli_fetch_array($result);
	
  	print_r($arr); // 关联数组和索引数组,两份
	// 数据以数组的方式返回
 
  	// 2.0   mysqli_fetch_assoc
	$arr1 = mysqli_fetch_assoc($result);

	print_r($arr1); // 关联数组
	// 数据以数组的方式返回
  
  	// 3.0   mysqli_fetch_row
	$arr2 = mysqli_fetch_row($result);

	print_r($arr2); // 索引数组
	// 数据以数组的方式返回
?>

读取全部的数据

<?php
  	// 上面的函数都只会读取一行数据,但是在读取完毕之后,会将指针指向下一行 
  	// 如果需要获取多行,则需要重复调用相同的方法,如果没有数据,则返回NULL
  	
  	// !!!!而数据到底有多少,则未可以,所以循环的话并不知道何时停止,while循环就比较适合
  	while ($arr = mysqli_fetch_assoc($result)) {
      	$res[] = $arr;
  	}
  	
	print_r($res);
?>
方法说明
mysqli_connect(“主机名称”, “用户名”, “密码”, “数据库名”)php连接MYSQL数据库
mysqli_set_charset(连接对象,“utf8”);设置数据库和服务器编码相同
mysqli_query($conn, “set name as utf-8”);设置数据库和服务器编码的另一种方式
mysqli_query(连接对象,sql语句)执行sql语句
mysqli_num_rows(结果集[执行完sql语句之后的值])返回结果集的条数
mysqli_fetch_array(结果集,MYSQL_ASSOC)提取查询语句之后的内容,需要循环
mysqli_fetch_assoc(结果集)提取到查询语句之后的关联数组
mysqli_fetch_row(结果集)提取到查询语句之后的索引数组
mysqli_error(连接对象)返回具体的连接错误信息
die(”提示错误信息“)终止操作,提示错误信息

18PHP操作数据库的封装

18.1封装代码

<?php
  	header("Content-type:text/html;charset=utf-8");
    // 1.0  封装增加、删除和修改的操作
    function opt($sql) {
  		// 创建连接
    	$conn = mysqli_connect("localhost", "root", "root", "mytable");
  		// 如果连接成功返回连接对象,如果不成功,返回false
  		if(!$conn) {
          	die("数据库连接失败~");
  		}
  		// 设置编码
  		mysqli_set_chartset($conn, "utf8");
  		// 执行$sql语句,接收返回值
  		$res = mysqli_query($conn, $sql);
  		// 及时关闭连接
  		mysqli_close($conn);
  		// 返回结果
  		return $res;
    }
    // 2.0  封装查询操作
  	function select() {
      	// 创建连接
    	$conn = mysqli_connect("localhost", "root", "root", "mytable");
  		// 如果连接成功返回连接对象,如果不成功,返回false
  		if(!$conn) {
          	die("数据库连接失败~");
      		}
  		// 设置编码
  		mysqli_set_chartset($conn, "utf8");
  		// 查询语句的返回值,成功返回资源(结果集),不成功返回false
  		$res = mysqli_query($conn, $sql);
      	if(!$res) {
          	echo "查询失败";
      	} else if (mysqli_num_rows($res) == 0) {
          	echo "没有查找到数据~";
      	} else {
          	// 有结果集也有数据行
          	while($arr = mysqli_fetch_assoc($res)) {
              	$result = $arr;
          	}
          	// 及时关闭连接
  			mysqli_close($conn);
          	return $return;
      	}
      
      	// 操作完毕,关闭连接
  		mysqli_close($conn);
  	}
?>

18.2测试调用

<?php
  	header("Content-type:text/html;charset=utf-8");
  
  	// 载入封装的文件
  	include_once "./common.php";

	$res = opt("insert into mytable values(null, '张三', 28, '男', 1112334)");
	// 如果有限制唯一的值,注意在写入的时候会报错

	if($res) {
      	echo "新增成功";
	} else {
      	echo "新增失败";
	}
?>
           | 提取到查询语句之后的索引数组       |
| mysqli_error(连接对象)                                     | 返回具体的连接错误信息             |
| die(”提示错误信息“)                                        | 终止操作,提示错误信息             |

## 18PHP操作数据库的封装

### 18.1封装代码

```php
<?php
  	header("Content-type:text/html;charset=utf-8");
    // 1.0  封装增加、删除和修改的操作
    function opt($sql) {
  		// 创建连接
    	$conn = mysqli_connect("localhost", "root", "root", "mytable");
  		// 如果连接成功返回连接对象,如果不成功,返回false
  		if(!$conn) {
          	die("数据库连接失败~");
  		}
  		// 设置编码
  		mysqli_set_chartset($conn, "utf8");
  		// 执行$sql语句,接收返回值
  		$res = mysqli_query($conn, $sql);
  		// 及时关闭连接
  		mysqli_close($conn);
  		// 返回结果
  		return $res;
    }
    // 2.0  封装查询操作
  	function select() {
      	// 创建连接
    	$conn = mysqli_connect("localhost", "root", "root", "mytable");
  		// 如果连接成功返回连接对象,如果不成功,返回false
  		if(!$conn) {
          	die("数据库连接失败~");
      		}
  		// 设置编码
  		mysqli_set_chartset($conn, "utf8");
  		// 查询语句的返回值,成功返回资源(结果集),不成功返回false
  		$res = mysqli_query($conn, $sql);
      	if(!$res) {
          	echo "查询失败";
      	} else if (mysqli_num_rows($res) == 0) {
          	echo "没有查找到数据~";
      	} else {
          	// 有结果集也有数据行
          	while($arr = mysqli_fetch_assoc($res)) {
              	$result = $arr;
          	}
          	// 及时关闭连接
  			mysqli_close($conn);
          	return $return;
      	}
      
      	// 操作完毕,关闭连接
  		mysqli_close($conn);
  	}
?>

18.2测试调用

<?php
  	header("Content-type:text/html;charset=utf-8");
  
  	// 载入封装的文件
  	include_once "./common.php";

	$res = opt("insert into mytable values(null, '张三', 28, '男', 1112334)");
	// 如果有限制唯一的值,注意在写入的时候会报错

	if($res) {
      	echo "新增成功";
	} else {
      	echo "新增失败";
	}
?>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值