php基础不断更新中

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
一、 PHP简介php环境

php-cli command line interface php在命令行运行的接口,区分于在web服务器上运行的php环境(php-cgi,isapi),php不单可以写前台网页,也可以用来写后台的程序。swoole

认识PHP
  1. PHP Hypertext Preprecessor 超文本预处理器 可以嵌入到html代码中的

  2. PHP通用开源动态脚本语言,运行在服务端,适合高效快捷的进行web开发

  3. 通常用于创建动态生成的网页,支持常用的数据库 MySql, mariaDB ,Oracle, MongoDB

php发展史
  1. PHP Personal Home Page 1994 Perl Rasmus Lerdorf 来统计个人网站访问量的程序,C重写后,1995 php1 php2 加入了对mysql

  2. php5 2004-7 引入了面向对象编程 5.4 trait 5.6

  3. php7 2015-12 性能是 php5.6提高了2倍
    php7.4 提供了pre-loading预加载机制,实现了部分程序的常驻内存

4 2020-11 PHP8.0问世 高效的JIT just-in-time(即使编译)运算支持,PHP 已经应用到 websocket服务,高性能web,物联网,即时通讯,游戏,微服务等非web领域的系统开发

PHP 工作运行原理

image.png

二、 PHP语法第一课PHP include request区别(1)、include 遇到错误还继续,非常适合模版(2)、request遇到错误就停止

include: 加载失败不中断 常用于加载模板或页面
require: 加载失败中断,常用于加载对象或数据

PHP 函数不区分大小写、php变量大小敏感索引数组关联数组

image.png

二维数组遍历for

image.png

foreach

image.png

image.png

list()数组找那个的值赋给一组变量

image.png

extract

image.png

php 变量1. 数据类型转换 转换方式 函数 临时转换 (int),(string),(array),(object)… 自动转换 根据操作符对操作数的类型要求进行 强制转换 settype()

PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:

(int)、(integer):转换成整形

(float)、(double)、(real):转换成浮点型

(string):转换成字符串

(bool)、(boolean):转换成布尔类型

(array):转换成数组

(object):转换成对象

第一种转换方式: (int) (bool) (float) (string) (array) (object)

$num1=3.14;

$num2=(int)$num1;

var_dump($num1); //输出float(3.14)

var_dump($num2); //输出int(3)

?>

第二种转换方式: intval() floatval() strval()

$str=”123.9abc”;

$int=intval($str); //转换后数值:123

$float=floatval($str); //转换后数值:123.9

$str=strval($float); //转换后字符串:”123.9”

?>

第三种转换方式: settype();

$num4=12.8;

$flg=settype($num4,”int”);

var_dump($flg); //输出bool(true)

var_dump($num4); //输出int(12)

?>

2. 类型检测 转换方式 函数 标量 is_int(),is_string(),is_bool()… 复合 is_array(),is_object() 特殊 is_null(),is_resource()

PHP有很多资源类型:数据库连接、结果、图像、PDF等

is_resource():判断一个变量是否是一个资源类型

null讲解

image.png

@var_dump 有错误可以忽略不在页面显示null 类型不等于下面任何:

false(布尔值) 0(数字类型) ‘’(字符串)

如何能获得null 三种方法

1、直接赋值$var =nul
2、unset($fp)
3、var_dump($emp) $emp 不存在

3. 变量命名
  • 仅允许使用: 英文字母(a-z,A-Z),数字(0-9),下划线(_)或他们的组合
  • 不允许使用数字开头
  • 必须使用”$”美元符为前缀
  • 严格区分大小写
  • 驼峰命名法
4. 常量
  • define(): 函数
  • const: 关键字
    1. 固定的值(圆周率), 常量不能重新被定义 或者取消定义
    1. 常量的命名前不能加 $
    1. 常量推荐全部大写,多个单词之间用下划线连接_
    1. 变量不属于全局成员, 常量、类、接口、函数属于全局成员 不受作用域限制
  • 5、类常量只能用const定义

常量类型
系统常量 魔术常量 DIR

  1. const APP_PATH = '/phpEnv/www/chloe.io/0302';
  2. echo APP_PATH;
  3. define('NATION', '中国');
  4. echo NATION;
  5. printf('国籍:%s', NATION);
  6. class User
  7. {
  8. //类常量只能用const定义
  9. const APP_PATH = '/phpEnv/www/chloe.io/0302';
  10. }
  11. // 常量必须初始化赋值
  12. $height;
  13. const HEIGHT = '183cm';
  14. ob_clean();
  15. // 系统常量
  16. // print_r(get_defined_constants(true));
  17. // 魔术常量
  18. echo __FILE__; //当前执行PHP脚本的完整路径和文件名, 绝对路径
  19. echo dirname(__FILE__); //当前执行PHP脚本的完整路径
  20. echo __DIR__;//当前执行PHP脚本的完整路径
5. 全局变量 无法在函数内部直接调用

image.png
//系统预定义变量
// 超全局变量: 数组,任何地方都可以访问,不受作用域限制
// $GLOBALS: 引用全局作用域中可用的全部变量
// $_SERVER: 服务器和执行环境信息
// $_GET :通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组
// $_POST:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本
// $_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组
// $_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组
// $_SESSION:当前脚本可用 SESSION 变量的数组
// $_REQUEST: 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组
// $_ENV: 通过环境方式传递给当前脚本的变量的数组

流程控制1. 单一条件分支结构

if (1 == 1) {
echo 111;
}

2.双向条件分支结构 if…else

if(条件表达式)
{

  1. #满足条件执行的代码块

} else{

不满足条件执行的代码块

}

3. 多向条件分支结构
  1. $age = 85;
  2. $gender = '女';
  3. if ($gender == '女' && $age < 55) :
  4. echo "您好女士,距离您退休还有" . (55 - $age) . "年<br>";
  5. elseif ($gender == '女' && $age > 55) :
  6. echo "您好女士,您已经退休" . ($age - 55) . "年了<br>";
  7. elseif ($gender == '男' && $age < 60) :
  8. echo "先生您好,距离您退休还有" . (60 - $age) . "年<br>";
  9. elseif ($gender == '男' && $age > 60) :
  10. echo "先生您好 ,您已经退休" . ($age - 60) . "年了<br>";
  11. else :
  12. echo '很抱歉,您输入的信息不正确';
  13. endif;
  14. ob_clean();
  15. $d = date("w"); //0-6
  16. switch ($d):
  17. case 1:
  18. echo '今天是工作日星期一';
  19. break;
  20. case 2:
  21. echo '今天是工作日星期二';
  22. break;
  23. case 3:
  24. echo '今天是工作日星期三';
  25. break;
  26. case 4:
  27. echo '今天是工作日星期四';
  28. break;
  29. case 5:
  30. echo '今天是工作日星期五';
  31. break;
  32. default:
  33. echo "今天休息!";
  34. endswitch;
  35. // break 退出当前循环 continue 跳过此次循环,进入下一轮循环
php 模版
  1. $nav = '';
  2. for ($i = 0; $i < count($navs); $i++) {
  3. $nav .= "<a href='{$navs[$i]['url']}' style='padding: 0 15px' >{$navs[$i]['name']}</a>";
  4. }

js 模版

  1. // 商品信息模板
  2. const tr = `
  3. <tr>
  4. <td><input type="checkbox" name="" class="check" checked /></td>
  5. <td>${item.id}</td>
  6. <td>${item.name}</td>
  7. <td>${item.unit}</td>
  8. <td class="price">${item.price}</td>
  9. <td><input type="number" name="" value="${item.num}" min="1"></td>
  10. <td class="money">${item.money}</td>
  11. </tr>
  12. `
运算符
  1. <?php
  2. /**
  3. * ; php指令分隔符
  4. * php 功能执行语句 必须以;结束
  5. * 结构定义语句
  6. *
  7. */
  8. //! PHP运算符
  9. function demo()
  10. {
  11. }
  12. class demo
  13. {
  14. }
  15. // 算数运算符 + - * / % 去余
  16. // 能被4整除但不能被100整除的都是闰年,其余的年份均为平年
  17. $year = date("Y");
  18. // echo $year;
  19. if ($year % 4 == 0 && $year % 100 !== 0) {
  20. echo "{$year}是闰年";
  21. } else {
  22. echo "{$year}是平年";
  23. }
  24. // 控制随机数的范围 0-50
  25. // echo mt_rand() % 50;
  26. echo mt_rand(0, 50);
  27. // 比较运算符 返回布尔型 用在流程控制语句
  28. var_dump(11 > 10);
  29. // 逻辑运算符 || && ! 返回布尔型 用在流程控制语句
  30. /**
  31. * || 或 两边的表达式只要一个为true 返回true
  32. *
  33. * && 且 两边的表达式全部为true 返回true
  34. *
  35. * !
  36. * */
  37. /**
  38. * = 赋值运算符
  39. * == 值比较
  40. * === 严格比较 值 类型
  41. */
  42. var_dump(1 > 0 || 4 > 5);
  43. var_dump(0 === '0');
  44. $username = 'admin';
  45. if (isset($username) && $username === 'admin') {
  46. echo "欢迎管理员{$username}回来";
  47. }
  48. $email = $_GET['email'];
  49. if (isset($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
  50. echo '邮箱验证通过';
  51. } else {
  52. echo '请输入有效的邮箱';
  53. }
  54. ob_clean();
  55. //三元运算符 表达式 ? :
  56. // $pwd = sha1('wwwphpcn');
  57. $pwd = isset($pwd) ? $pwd : 'root';
  58. // 检测页码
  59. // $page = isset($_GET['p']) ? $_GET['p'] : 1;
  60. // ?? null合并运算符 告别isset()
  61. $page = @$_GET['p'] ?? 1;
  62. echo $page;
  63. 以前的写法
  64. $info = isset($_GET[’email’]) ? $_GET[’email’] : ‘noemail’;
  65. 现在直接这样写就可以了
  66. $info = $_GET[’email’] ?? noemail;
循环
  1. <?php
  2. // ! 循环 while
  3. $cities = ['合肥', '南京', '杭州', '苏州', '上海', '北京'];
  4. next($cities);
  5. next($cities);
  6. next($cities);
  7. next($cities);
  8. reset($cities);
  9. // echo current($cities);
  10. // while循环 入口判断型循环
  11. // while ($city = current($cities)) {
  12. // echo $city . '<br>';
  13. // next($cities);
  14. // }
  15. // while ($city = current($cities)) :
  16. // echo $city . '<br>';
  17. // next($cities);
  18. // endwhile;
  19. // do..while出口型判断循环
  20. // $i = 0;
  21. // do {
  22. // echo $cities[$i];
  23. // $i++;
  24. // } while ($i < count($cities));
  25. // for 计数型循环
  26. // for ($i = 0; $i < count($cities); $i++) {
  27. // // break 提前结束循环
  28. // if ($i > 2) break;
  29. // echo $cities[$i];
  30. // }
  31. // continue 跳出某一轮循环 选择性输出
  32. for ($i = 0; $i < count($cities); $i++) {
  33. if ($i == 2 || $i == 3) continue;
  34. echo $cities[$i];
  35. }
  36. foreach ($cities as $k => $v) {
  37. }
session cokioo

http: 无状态

cookie 储存用户信息在客户端

<img src="cookie.png">

cookie特点
  1. 保存在客户端,容易被篡改(删除、禁用)
  2. 保存的数据大小受限,本身最大4kb
session 储存用户信息在服务端

<img src="session.png">

  • 会话 ID: 服务器设置,保存在客户端cookie
3. php 会话流程
  1. 客户端->服务器: http 请求
  2. 服务器->客户端: 设置会话 ID(cookie)
  3. 客户端->服务器: http 请求(会话 ID)
  4. 服务器->客户端: 验证会话,状态保持
格式化输出
  1. /**
  2. * 格式化输出
  3. * 1. printf(format,a,b,...): 打印(离散参数)
  4. * 2. vprintf(format,array): 打印(数组参数)
  5. * 3. sprintf(format,a,b,...): 只返回不打印
  6. * 4. vsprintf(format,array): 只返回不打印
  7. * 速记法:
  8. * s: 只返回不打印
  9. * v: 数组参数
  10. */
  11. // printf('format',a,b,c);
  12. printf('<div style="color:red">%s</div>', '海外运维网');
  13. echo sprintf('<div style="color:red">%s</div>', '海外运维网');
函数相关1. 函数
  1. 声明
  2. 调用
  3. 参数
  4. 返回值
    ```
    function add($a, $b, $c)
    {
    return $a + $b + $c;
    }

$num=[2, 3];
echo add(1, …$num); //6

function boo(…$args)
{
// var_dump(func_get_args());
// var_dump(func_num_args());
// var_dump(func_get_arg(3));
// if (func_num_args() >= 2) echo “第二个参数是” . func_get_arg(1);
return array_sum($args);
}
boo(15, 25, 57, 256, 89);

// 引用变量传递是地址
$d = &$c;
echo $d; //20;

$c = 30;
echo $d; //30

$d = 40;
ob_clean();
echo $c;

  1. ### 2. 特殊形式的函数
  2. #### 1. 匿名函数

$loo = function ($i) {

  1. echo "插入数据{$i}\n";
  2. return true;

}
$loo(5)

  1. #### 2. 回调函数
  2. 所谓的回调函数,就是指调用函数时并不是向函数中传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中,这个作为参数的函数就是回调函数。
  3. 通俗的来说,回调函数也是一个我们定义的函数,但是不是我们直接来调用的,而是通过另一个函数来调用的,这个函数通过接收回调函数的名字和参数来实现对它的调用。
  4. 当函数名或参数, 可能是由任意表达式生成或来自网络请求时非常有用, 例如类方法, 高阶函数,随机参数或参数来自一个web请求等的场景下, 别外, 如果需要对传参预处理时, 也比直接调用更简洁灵活
  5. call_user_func()
  6. call_user_func_array()
  7. func_get_args()
  8. func_num_args()
  9. func_get_arg(3)

function boo(…$args)
{
// var_dump(func_get_args());
// var_dump(func_num_args());
// var_dump(func_get_arg(3));
// if (func_num_args() >= 2) echo “第二个参数是” . func_get_arg(1);
return array_sum($args);
}
boo(15, 25, 57, 256, 89);
/ //$b=’今天’;
// function boo (…$a) {
// //echo $a ;
// var_dump($a);

// };
// call_user_func(‘boo’,[15, 25, 57, 256, 89]); //展开
// echo call_user_func_array(‘boo’, [15, 25, 57, 256, 89]); //展开

  1. #### 3. 递归函数
  2. 自己调用自己就是递归函数。老师说数状结构 文件夹访问就是
  3. 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出

// ! 递归函数
// 递归函数是指直接或间接的调用函数自身的函数
// ! 必须有一个终止处理或计算的准则;

function demo($a = 1)
{
if ($a <= 5) {
echo “第{$a}次执行<br>“;
$a++;
demo($a);
}
}

demo();

/**

  • 需要删除的目录请实现备份,否则永不可复原
    */
    function delete_dir_file($dir)
    {

    //声明一个初始状态 默认情况下缓存未被删除
    $res = false;
    if (is_dir($dir)) {

    1. //成功打开目录流
    2. if ($handle = opendir($dir)) {
    3. while (($file = readdir($handle)) !== false) {
    4. if ($file != '.' && $file != '..') {
    5. if (is_dir($dir . '\\' . $file)) {
    6. delete_dir_file($dir . '\\' . $file);
    7. } else {
    8. //unlink只能删除一个文件
    9. unlink($dir . '\\' . $file);
    10. }
    11. }
    12. }
    13. }
    14. //关闭目录句柄
    15. closedir($handle);
    16. //目录只有为空的情况下才能被直接删除
    17. if (rmdir($dir)) {
    18. $res = true;
    19. }

    }
    return $res;
    }

$apppath = _DIR;
// delete_dir_file($app_path);

  1. #### 4. 箭头函数
  2. // 箭头函数 fn
  3. //! 箭头函数会自动捕获父作用域变量进行值拷贝
  4. $x = 1;
  5. $fn = fn ($a, $b) => $a + $b + $x;
  6. echo $fn(10, 20);
  7. # 三、 PHP项目实例
  8. ![image.png](https://note.youdao.com/yws/res/2614/WEBRESOURCE8682de03447aefcfc9a0331341231c09)
  9. ## 目录结构
  10. ### config/common.php 存储各种复杂路径,都用常量表示
  11. ### data存储是数据
  12. ### template\public存储是网页头、网页底公共模版,都是用include 引用
  13. ### static存储js css等
  14. ### lib/user/check.php 用户登录界面后台验证
  15. lib/user/check.php

<?php
// 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json

// json当成文本流原始数据来接收
$json = file_get_contents(‘php://input’);
// echo $json;

// $json并非php能识别的数据类型,它只是json格式的字符串而已
// json -> php.array , true: 数组
$user = json_decode($json, true);
// var_dump($user);

echo json_encode($user);

  1. config\common.php

<?php

// 根路径

// date() 格式化一个时间戳

// echo date(“Y-m-d”, time());
define(‘DAY’, date(‘/md’, time()));
define(‘ROOT_PATH’, $_SERVER[‘DOCUMENT_ROOT’] . DAY . ‘/web’);
// echo ROOT_PATH;

// 数据路径
define(‘DATA_PATH’, ROOT_PATH . ‘/data’);

// 模板路径
define(‘TMPL_PATH’, ROOT_PATH . ‘/template’);

// 公共模板路径
define(‘TMPL_PATH_PUBLIC’, TMPL_PATH . ‘/public’);

// 静态资源路径
define(‘STATIC_PATH’, ROOT_PATH . ‘/static’);

// css
define(‘STATIC_CSS_PATH’, STATIC_PATH . ‘/css’);

// js
define(‘STATIC_JS_PATH’, STATIC_PATH . ‘/js’);
// images
define(‘STATIC_IMG_PATH’, STATIC_PATH . ‘/images’);

  1. login.php

<!-- 引入页眉 -->

<?php include ‘template/public/header.php’ ?>

<!-- 主体 -->

<main>
<!-- 用户登录 -->
<form class="login">
<table>
<caption>
用户登录
</caption>
<tbody>
<tr>
<td><label for="email">邮箱:</label></td>
<td><input type="email" name="email" id="email" /></td>
</tr>
<tr>
<td><label for="password">密码:</label></td>
<td><input type="password" name="password" id="password" /></td>
</tr>

  1. <tr>
  2. <td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
  3. </tr>
  4. </tbody>
  5. </table>

</form>

<p>
<a href="register.php">没有帐号,请先注册</a>
</p>
</main>

<script>
async function doLogin(obj) {

// console.log(obj.form.email.value);
const email = obj.form.email.value;
const password = obj.form.password.value;

// 非空验证
if (email.length > 0 && password.length > 0) {
// 异步提交 fetch API
const response = await fetch(‘./lib/user/check.php’, {
// 请求方法
method: ‘POST’,
// 请求头
headers: {
‘Content-Type’: ‘application/json;charset=utf-8’
},
body: JSON.stringify({
email,
password
})

});

// 解析数据
const result = await response.json();
console.log(result);
} else {
alert(‘邮箱或密码不能为空’);
}
}
</script>
<!-- 引入页脚 -->
<?php include ‘template/public/footer.php’ ?>
template\public 头部底部模板如下

头部模板

<!DOCTYPE html>
<html lang="zh-CN">

<head>

<?
$arr = require ‘data/data.php’;
$navs = require ‘data/nav.php’;

?>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="<?= $arr['keywords'] ?>" />
<meta name="description" content="<?= $arr['des'] ?>" />
<link rel="stylesheet" href="static/css/style.css" />
<title><?= $arr[‘title’] ?></title>
</head>



<body>



<!-- 页眉 -->
<!-- 修改php.ini open_short_tag On-->
<header>
<nav>
<a href="index.php">首页</a>
<? foreach ($navs as $k => $v) : ?>
<a href="news.php"><?= $v[‘name’] ?></a>
<? endforeach; ?>

</nav>
</header>



``` <!-- 页脚 --> <footer> <div>海外运维网&copy;版权所有(2022-2025)</div> </footer> </body> </html>



data存储是数组
return [ ["id" => 1, 'name' => '新闻'], ["id" => 2, 'name' => '产品'], ["id" => 3, 'name' => '联系'], ["id" => 4, 'name' => '登录'], ]; return array("keywords" => "新闻,产品,合肥", "des" => "专业生产中高档办公家具,行业畅销20年", "title" => "首頁");


首页如下
<!-- 引入页眉 --> <?php include 'template/public/header.php' ?> <!-- 主体 --> <main> <!-- 新闻列表 --> <div class="news"> <h3>新闻列表</h3> <div class="list"> <a href="">切实做好高风险岗位从业人员疫情防控。</a> <a href="">切实做好高风险岗位从业人员疫情防控。</a> <a href="">切实做好高风险岗位从业人员疫情防控。</a> <a href="">切实做好高风险岗位从业人员疫情防控。</a> <a href="">切实做好高风险岗位从业人员疫情防控。</a> </div> </div> <!-- 产品列表 --> <div class="items"> <h3>产品列表</h3> <div class="list"> <div class="item"> <img src="static/images/item1.jpeg" alt="" /> <a href="">最新产品1</a> </div> <div class="item"> <img src="static/images/item2.jpeg" alt="" /> <a href="">最新产品2</a> </div> <div class="item"> <a href=""><img src="static/images/item3.jpeg" alt="" /></a> <a href="">最新产品3</a> </div> <div class="item"> <img src="static/images/item4.jpeg" alt="" /> <a href="">最新产品4</a> </div> </div> </div> </main> <!-- 引入页脚 --> <?php include 'template/public/footer.php' ?>


# 重点例子代码

fetch的使用 注意await async

```
<form class="login">
<table>
<caption>
用户登录
</caption>
<tbody>
<tr>
<td><label for="email">邮箱:</label></td>
<td><input type="email" name="email" id="email" /></td>
</tr>
<tr>
<td><label for="password">密码:</label></td>
<td><input type="password" name="password" id="password" /></td>
</tr>

<tr>
<td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
</tr>
</tbody>
</table>
</form>

<script>
async function doLogin(obj) {

// console.log(obj.form.email.value);
const email = obj.form.email.value;
const password = obj.form.password.value;

// 非空验证
if (email.length > 0 && password.length > 0) {
// 异步提交 fetch API
const response = await fetch(‘./lib/user/check.php’, {
// 请求方法
method: ‘POST’,
// 请求头
headers: {
‘Content-Type’: ‘application/json;charset=utf-8’
},
body: JSON.stringify({
email,
password
})

});

// 解析数据
const result = await response.json();
console.log(result);
} else {
alert(‘邮箱或密码不能为空’);
}
}
</script>

后端代码

<?php
// 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json

// json当成文本流原始数据来接收
$json = file_get_contents(‘php://input’);
// echo $json;

// $json并非php能识别的数据类型,它只是json格式的字符串而已
// json -> php.array , true: 数组
$user = json_decode($json, true);
// var_dump($user);

echo json_encode($user);

  1. 登录判断使用 登录退出 全部写入到一个函数中

/ 获取对用户的操作动作
$action = strtolower($_GET[‘action’]);
$prompt = false;

switch ($action):
case ‘login’:
$json = file_get_contents(‘php://input’);
$user = json_decode($json, true);

  1. $email = $user['email'];
  2. $salt = 'wwwphpcn';
  3. $password = md5($user['password'] . $salt);
  4. $result = array_filter($users, function ($user) use ($email, $password) {
  5. return $user['email'] === $email && $user['password'] === $password;
  6. });
  7. $result = array_values($result);
  8. if (count($result) === 1) {
  9. $prompt = true;
  10. $_SESSION['user']['email'] = $result[0]['email'];
  11. $_SESSION['user']['name'] = $result[0]['name'];
  12. }
  13. break;
  14. case 'logout':
  15. if (session_destroy()) {
  16. $prompt = true;
  17. }
  18. case 'register':

<?php if (!isset($_SESSION[‘user’])) : ?>
<a href="login.php">登录</a>
<?php else : ?>
<a href="javascript:;" onclick="logout()"><?= $_SESSION[‘user’][‘name’] ?>退出</a>

  1. <?php endif ?>
  2. </nav>
  3. </header>
  4. <script>
  5. async function logout() {
  6. if (confirm('是否退出')) {
  7. const response = await fetch('./lib/userHandle.php?action=logout')
  8. const result = await response.json();
  9. if (result) {
  10. location.href = 'index.php';
  11. } else {
  12. alert('退出失败');
  13. }
  14. }
  15. }
  16. </script>

```

【感谢: 龙石数据大数据分析平台技术支撑 http://www.longshidata.com/pages/government.html, 】