Blogger Information
Blog 21
fans 0
comment 1
visits 10954
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php基础笔记不断补充中
手机用户1620888567
Original
331 people have browsed it

一、 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: 无状态

<img src="cookie.png">

  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>', 'php中文网');
  13. echo sprintf('<div style="color:red">%s</div>', 'php中文网');

函数相关

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. 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出
  4. 补充知识点
  5. 1. opendir($path) 打开目录句柄,如果成功则返回目录句柄的 resource 或者在失败时返回 false
  6. 2. readdir($dir_handle)从目录句柄中读取条目,目录句柄的 resource,之前由 opendir() 打开,成功则返回条目名 或者在失败时返回 false
  7. 3. closedir($dir_handle) 关闭目录句柄,没有返回值。
  8. 4. is_dir($filename)判断给定文件名是否是一个目录,如果文件名存在,并且是个目录,返回 true,否则返回false
  9. 5. unlink($filename) 删除文件,成功时返回 true 或者在失败时返回 false
  10. 6. rmdir($directory) 尝试删除 directory 所指定的目录。 该目录必须是空的,而且要有相应的权限。 失败时会产生一个 E_WARNING 级别的错误。成功时返回 true 或者在失败时返回 false

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

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

demo();

/**

  • 函数是完成特定功能的代码块
    */
    // 递归函数

/**

  • delete_dir_file 删除指定目录
  • params: 指定需要删除的目录路径
  • return:返回布尔值 成功true 失败false
  • */

if (!function_exists(‘delete_dir_file’)) {
function delete_dir_file($dir)
{
//声明一个初始状态 默认情况下缓存未被删除
$flag = false;
if (is_dir($dir)) {
if ($handle = opendir($dir)) {
// 遍历目录
while (($file = readdir($handle)) !== false) {
echo $file . ‘<br>‘;
if ($file != ‘.’ && $file != ‘..’) {
// var_dump(is_dir($dir . DIRECTORY_SEPARATOR . $file));
// die;
if (is_dir($dir . DIRECTORY_SEPARATOR . $file)) {
delete_dir_file($dir . DIRECTORY_SEPARATOR . $file);
} else {
unlink($dir . DIRECTORY_SEPARATOR . $file);
}
}
};
}

  1. closedir($handle);
  2. if (rmdir($dir)) {
  3. $flag = true;
  4. }
  5. }
  6. return $flag;
  7. }

}

$delpath = _DIR . DIRECTORY_SEPARATOR . ‘0307’;
// echo $del_path;

if (delete_dir_file($del_path)) {
echo json_encode([‘msg’ => ‘缓存删除成功/‘, ‘code’ => 0], 320);
} else {
echo json_encode([‘msg’ => ‘缓存删除失败/‘, ‘code’ => 1], 256);
}

  1. #### 4. 箭头函数
  2. // 箭头函数 fn
  3. //! 箭头函数会自动捕获父作用域变量进行值拷贝
  4. $x = 1;
  5. $fn = fn ($a, $b) => $a + $b + $x;
  6. echo $fn(10, 20);
  7. ### 递归函数,删除指定目录
  8. #### 字符串操作函数
  9. 1. 字符串拆分/合并 implode, explode
  10. 2. 字符串替换 str_replace
  11. 3. 字符串查找 substr()、mt_substr()

<?php
$arr = array(‘Hello’,’World!’,’I’,’love’,’Shanghai!’);
echo implode(“ “,$arr);
?>

//输出:

//Hello World! I love Shanghai!

<?php
$data = “foo:*:1023:1000::/home/foo:/bin/sh”;
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(“:”, $data);
echo $user; // foo
echo $pass; // 1023
?>

//输出:

//foo 1023

  1. ```
  2. <?php
  3. // !字符串操作函数
  4. // 拆分 合并
  5. // implode join 数组->字符串
  6. $url = "https://chloe.io/0308/user/index/demo2.html";
  7. // echo implode(",", ['html', 'css', 'uniapp', 'vue', 'electron']);
  8. // explode 字符串 ->数组
  9. $pathinfo = $_SERVER['DOCUMENT_URI'];
  10. var_dump($pathinfo);
  11. $arr = explode("/", $pathinfo);
  12. var_dump($arr);
  13. array_pop($arr);
  14. var_dump($arr);
  15. $action = array_pop($arr);
  16. $controller = array_pop($arr);
  17. echo $controller, $action;
  18. list($localhost, $username, $password) = explode(",", 'localhost,root,wwwphpcn,utf8,3306');
  19. echo "dsn=mysql:host={$localhost},username={$username},pwd={$password}";
  20. die;
  21. // 字符串替换函数 str_replace()
  22. $search = ['交友', '广告', '转账', '直播', '带货', '陪聊', '异性'];
  23. $flag = ['***', '----', '&&&', '00000', '+++++++', '@@@@@@'];
  24. $news = '本公司承接各类广告代理,提供直播和带货教学,提供异性交友陪聊服务...';
  25. // $news = 'php中文网';
  26. str_replace($search, $flag, $news, $count);
  27. // echo $count;
  28. if ($count !== 0) {
  29. echo "聊天内容包含敏感词,请保护好个人财产";
  30. }
  31. // 字符串查找函数 substr针对英文字符的截取 mb_substr针对中文的截取
  32. // echo md5(rand());
  33. // 生成随机颜色
  34. $color = '#' . substr(md5(rand()), 0, 6);
  35. ?>
  36. <p style="color:<?= $color ?>">你好</p>
  37. <?php
  38. echo mb_substr('你放弃了吗', 0, 2);

url函数

  1. parse_url
  2. http_build_query
  3. urlencode
  4. urldecode
  5. base64_encode
  6. base64_decode

parse_url 不会把地址转换为数组

  1. $url = "https://www.php.net/manual/zh/ref.strings.php?email=9526678@qq.com&id=1&gender=男";
  2. parse_url($url);
  3. //输出 是个数组 ["scheme"]=> string(5) "https" ["host"]=> string(11) "www.php.net" ["path"]=> string(26) "/manual/zh/ref.strings.php" ["query"]=> string(36) "email=9526678@qq.com&id=1&gender=男" }

http_build_query

  1. $params = [
  2. 'city' => '苏州', // 要查询的城市
  3. 'key' => 'uwehqwjuehjbsdsdhk232323'
  4. ];
  5. $paramsString = http_build_query($params);
  6. var_dump($paramsString);
  7. //输出结果city=%E8%8B%8F%E5%B7%9E&key=uwehqwjuehjbsdsdhk232323

urlencode
urldecode
为了网址符合规范,网址中带有中文需要进行编码处理了

url网址只能是英文之类,中文等都算特殊符号,不能用在网址上,必须通过urlencode编码成符合 要求 网址形式 这个就这两编码的意义,具体使用如下

  1. 网页是不能显示二进制数据,可以base64_encod 把二进制转换成字符串,就可以在网页传播显示
  2. 上述处理过程主要用途有:
  3. 1、接口传输
  4. 主要适用于通过WEB接口将文件从一个站点向另一个站点传输,可以用于XML信息。
  5. 2、存入数据库
  6. 当然,将图片等文件信息保存到数据库中完全可以不用这么做,但这种方式依然适用。对于数据库新手来说这种方式更可接受。因为这完全是一个字符串。
  7. 3、文件加密
  8. 文件加密可大家用得比较少,举个例子,假如我们有一套PHP程序需要保护,必须有授权码的用户才能正常运行,那么我们可能使用授权码来对文件进行加密,即将上述编码后的字符串再次加工。运行过程需要授权码才可运行。
  9. 当然还有其它用途,根据各人的需要灵活使用
  1. <?php
  2. // 5. base64_encode 使用 mime base64 对 string 进行编码 设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。在计算机中,所有颜色都可以映射到一个二进制值。存储图像时,图像上的每个点都有自己的颜色值。
  3. // header('content-type:image/jpeg');
  4. $file = file_get_contents("https://images.shobserver.com/news/690_390/2023/3/8/0e75818d99a949b5b763a504c62987cc.jpg");
  5. //$file 是二进制数据,网页无法显示二进制数据,只能转换为base64编码,用特别方式才能显示
  6. $img = base64_encode($file);
  7. ?>
  8. <img src="data:image/jpeg;base64,<?= $img ?>" alt="模特">

三、 PHP项目实例

image.png

目录结构

config/common.php 存储各种复杂路径,都用常量表示

data存储是数据

template\public存储是网页头、网页底公共模版,都是用include 引用

static存储js css等

lib/user/check.php 用户登录界面后台验证

lib/user/check.php

  1. <?php
  2. // 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
  3. // json当成文本流原始数据来接收
  4. $json = file_get_contents('php://input');
  5. // echo $json;
  6. // $json并非php能识别的数据类型,它只是json格式的字符串而已
  7. // json -> php.array , true: 数组
  8. $user = json_decode($json, true);
  9. // var_dump($user);
  10. echo json_encode($user);

config\common.php

  1. <?php
  2. // 根路径
  3. // date() 格式化一个时间戳
  4. // echo date("Y-m-d", time());
  5. define('DAY', date('/md', time()));
  6. define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT'] . DAY . '/web');
  7. // echo ROOT_PATH;
  8. // 数据路径
  9. define('DATA_PATH', ROOT_PATH . '/data');
  10. // 模板路径
  11. define('TMPL_PATH', ROOT_PATH . '/template');
  12. // 公共模板路径
  13. define('TMPL_PATH_PUBLIC', TMPL_PATH . '/public');
  14. // 静态资源路径
  15. define('STATIC_PATH', ROOT_PATH . '/static');
  16. // css
  17. define('STATIC_CSS_PATH', STATIC_PATH . '/css');
  18. // js
  19. define('STATIC_JS_PATH', STATIC_PATH . '/js');
  20. // images
  21. define('STATIC_IMG_PATH', STATIC_PATH . '/images');

login.php

  1. <!-- 引入页眉 -->
  2. <?php include 'template/public/header.php' ?>
  3. <!-- 主体 -->
  4. <main>
  5. <!-- 用户登录 -->
  6. <form class="login">
  7. <table>
  8. <caption>
  9. 用户登录
  10. </caption>
  11. <tbody>
  12. <tr>
  13. <td><label for="email">邮箱:</label></td>
  14. <td><input type="email" name="email" id="email" /></td>
  15. </tr>
  16. <tr>
  17. <td><label for="password">密码:</label></td>
  18. <td><input type="password" name="password" id="password" /></td>
  19. </tr>
  20. <tr>
  21. <td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
  22. </tr>
  23. </tbody>
  24. </table>
  25. </form>
  26. <p>
  27. <a href="register.php">没有帐号,请先注册</a>
  28. </p>
  29. </main>
  30. <script>
  31. async function doLogin(obj) {
  32. // console.log(obj.form.email.value);
  33. const email = obj.form.email.value;
  34. const password = obj.form.password.value;
  35. // 非空验证
  36. if (email.length > 0 && password.length > 0) {
  37. // 异步提交 fetch API
  38. const response = await fetch('./lib/user/check.php', {
  39. // 请求方法
  40. method: 'POST',
  41. // 请求头
  42. headers: {
  43. 'Content-Type': 'application/json;charset=utf-8'
  44. },
  45. body: JSON.stringify({
  46. email,
  47. password
  48. })
  49. });
  50. // 解析数据
  51. const result = await response.json();
  52. console.log(result);
  53. } else {
  54. alert('邮箱或密码不能为空');
  55. }
  56. }
  57. </script>
  58. <!-- 引入页脚 -->
  59. <?php include 'template/public/footer.php' ?>

template\public 头部底部模板如下

  1. 头部模板
  2. <!DOCTYPE html>
  3. <html lang="zh-CN">
  4. <head>
  5. <?
  6. $arr = require 'data/data.php';
  7. $navs = require 'data/nav.php';
  8. ?>
  9. <meta charset="UTF-8" />
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  12. <meta name="keywords" content="<?= $arr['keywords'] ?>" />
  13. <meta name="description" content="<?= $arr['des'] ?>" />
  14. <link rel="stylesheet" href="static/css/style.css" />
  15. <title><?= $arr['title'] ?></title>
  16. </head>
  17. <body>
  18. <!-- 页眉 -->
  19. <!-- 修改php.ini open_short_tag On-->
  20. <header>
  21. <nav>
  22. <a href="index.php">首页</a>
  23. <? foreach ($navs as $k => $v) : ?>
  24. <a href="news.php"><?= $v['name'] ?></a>
  25. <? endforeach; ?>
  26. </nav>
  27. </header>
  1. <!-- 页脚 -->
  2. <footer>
  3. <div>php中文网&copy;版权所有(2022-2025)</div>
  4. </footer>
  5. </body>
  6. </html>

data存储是数组

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

首页如下

  1. <!-- 引入页眉 -->
  2. <?php include 'template/public/header.php' ?>
  3. <!-- 主体 -->
  4. <main>
  5. <!-- 新闻列表 -->
  6. <div class="news">
  7. <h3>新闻列表</h3>
  8. <div class="list">
  9. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  10. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  11. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  12. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  13. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  14. </div>
  15. </div>
  16. <!-- 产品列表 -->
  17. <div class="items">
  18. <h3>产品列表</h3>
  19. <div class="list">
  20. <div class="item">
  21. <img src="static/images/item1.jpeg" alt="" />
  22. <a href="">最新产品1</a>
  23. </div>
  24. <div class="item">
  25. <img src="static/images/item2.jpeg" alt="" />
  26. <a href="">最新产品2</a>
  27. </div>
  28. <div class="item">
  29. <a href=""><img src="static/images/item3.jpeg" alt="" /></a>
  30. <a href="">最新产品3</a>
  31. </div>
  32. <div class="item">
  33. <img src="static/images/item4.jpeg" alt="" />
  34. <a href="">最新产品4</a>
  35. </div>
  36. </div>
  37. </div>
  38. </main>
  39. <!-- 引入页脚 -->
  40. <?php include 'template/public/footer.php' ?>

重点例子代码

fetch的使用 注意await async

  1. <form class="login">
  2. <table>
  3. <caption>
  4. 用户登录
  5. </caption>
  6. <tbody>
  7. <tr>
  8. <td><label for="email">邮箱:</label></td>
  9. <td><input type="email" name="email" id="email" /></td>
  10. </tr>
  11. <tr>
  12. <td><label for="password">密码:</label></td>
  13. <td><input type="password" name="password" id="password" /></td>
  14. </tr>
  15. <tr>
  16. <td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
  17. </tr>
  18. </tbody>
  19. </table>
  20. </form>
  21. <script>
  22. async function doLogin(obj) {
  23. // console.log(obj.form.email.value);
  24. const email = obj.form.email.value;
  25. const password = obj.form.password.value;
  26. // 非空验证
  27. if (email.length > 0 && password.length > 0) {
  28. // 异步提交 fetch API
  29. const response = await fetch('./lib/user/check.php', {
  30. // 请求方法
  31. method: 'POST',
  32. // 请求头
  33. headers: {
  34. 'Content-Type': 'application/json;charset=utf-8'
  35. },
  36. body: JSON.stringify({
  37. email,
  38. password
  39. })
  40. });
  41. // 解析数据
  42. const result = await response.json();
  43. console.log(result);
  44. } else {
  45. alert('邮箱或密码不能为空');
  46. }
  47. }
  48. </script>
  49. 后端代码
  50. <?php
  51. // 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
  52. // json当成文本流原始数据来接收
  53. $json = file_get_contents('php://input');
  54. // echo $json;
  55. // $json并非php能识别的数据类型,它只是json格式的字符串而已
  56. // json -> php.array , true: 数组
  57. $user = json_decode($json, true);
  58. // var_dump($user);
  59. echo json_encode($user);

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

  1. / 获取对用户的操作动作
  2. $action = strtolower($_GET['action']);
  3. $prompt = false;
  4. switch ($action):
  5. case 'login':
  6. $json = file_get_contents('php://input');
  7. $user = json_decode($json, true);
  8. $email = $user['email'];
  9. $salt = 'wwwphpcn';
  10. $password = md5($user['password'] . $salt);
  11. $result = array_filter($users, function ($user) use ($email, $password) {
  12. return $user['email'] === $email && $user['password'] === $password;
  13. });
  14. $result = array_values($result);
  15. if (count($result) === 1) {
  16. $prompt = true;
  17. $_SESSION['user']['email'] = $result[0]['email'];
  18. $_SESSION['user']['name'] = $result[0]['name'];
  19. }
  20. break;
  21. case 'logout':
  22. if (session_destroy()) {
  23. $prompt = true;
  24. }
  25. case 'register':
  26. <?php if (!isset($_SESSION['user'])) : ?>
  27. <a href="login.php">登录</a>
  28. <?php else : ?>
  29. <a href="javascript:;" onclick="logout()"><?= $_SESSION['user']['name'] ?>退出</a>
  30. <?php endif ?>
  31. </nav>
  32. </header>
  33. <script>
  34. async function logout() {
  35. if (confirm('是否退出')) {
  36. const response = await fetch('./lib/userHandle.php?action=logout')
  37. const result = await response.json();
  38. if (result) {
  39. location.href = 'index.php';
  40. } else {
  41. alert('退出失败');
  42. }
  43. }
  44. }
  45. </script>
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:笔记内容可以发表到“博客”,作业内容需要单独提交
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post