前端学习从入门到高级全程记录之43 (PHP基础Ⅵ)
学习目标
本期接上期继续学习php和MySQL的基本知识。
1.通过mysqli扩展建立与数据库的连接
首先我们使用Navicat操作建立新连接
填入相应的信息:
点击左下角连接测试,看看是否成功,成功后点击确定。
然后右击连接名新建数据库:
字符集肯定是选择uft-8,如果你的版本比较新,可能没有utf-8,会utf8,都是一样的。排序规则我们选择普通,因为在其他国家可能中文的排序会不同,这里选择普通就行了。
建立好就应该是这样子:
我们首先使用mysqli_connect这个方法连接试一试,看会不会报错:
<?php
//能通过PHP代码执行一个SQL语句得到查询结果//1.建立与数据库服务器之间的连接
// 类似于之前的宽字符集函数问题,mysqli是一个额外的扩展
//如果想要使用这个扩展提供的函数,必须在php.ini中开启扩展,找到mysqli这个扩展,把前面的分号去掉,这个方法前几期讲了很多次,这里就不再赘述了。
$connection=mysqli_connect('localhost','root','root','demo2');
var_dump($connection);
这样就算成功了。
失败的话会返回false。
把主机名改为不存在的名字,我们判断一下:
<?php
//能通过PHP代码执行一个SQL语句得到查询结果//1.建立与数据库服务器之间的连接
// 类似于之前的宽字符集函数问题,mysqli是一个额外的扩展
//如果想要使用这个扩展提供的函数,必须在php.ini中开启扩展,找到mysqli这个扩展,把前面的分号去掉,这个方法前几期讲了很多次,这里就不再赘述了。
$connection=mysqli_connect('a','root','root','demo2');
var_dump($connection);if(!$connection){//取非//连接数据库失败exit('连接数据库失败');
}
但是错误信息会把本机敏感信息:主机名、密码、用户名等显示出来,这样不太好,有一个方法可以忽略警告“warning”。
<?php
//能通过PHP代码执行一个SQL语句得到查询结果//1.建立与数据库服务器之间的连接
// 类似于之前的宽字符集函数问题,mysqli是一个额外的扩展
//如果想要使用这个扩展提供的函数,必须在php.ini中开启扩展,找到mysqli这个扩展,把前面的分号去掉,这个方法前几期讲了很多次,这里就不再赘述了。
//如果需要在调用函数时忽略错误或者警告可以在函数名之前加上@
$connection=@mysqli_connect('a','root','root','demo2');
var_dump($connection);if(!$connection){//连接数据库失败exit('连接数据库失败');
}
但是我们在开发阶段还是希望出现的,所以这种方法适用于生产阶段。当然,php.ini中的display_error也是可以隐藏活着开启警告的,这个之前讲过。
接下来创建表:
然后查询一下,测试测试:
mysql.php:
<?php
//能通过PHP代码执行一个SQL语句得到查询结果//1.建立与数据库服务器之间的连接
// 类似于之前的宽字符集函数问题,mysqli是一个额外的扩展
//如果想要使用这个扩展提供的函数,必须在php.ini中开启扩展,找到mysqli这个扩展,把前面的分号去掉,这个方法前几期讲了很多次,这里就不再赘述了。
//如果需要在调用函数时忽略错误或者警告可以在函数名之前加上@
$connection=@mysqli_connect('localhost','root','root','demo2');
// var_dump($connection);if(!$connection){//连接数据库失败exit('<h1>连接数据库失败</h1>');
}//基于刚刚创建的连接对象执行一次查询操作
//得到的是一个查询对象,这个查询对象可以用来到数据一行一行拿数据
$query=mysqli_query($connection,'select * from users;');
//取数据
$row=mysqli_fetch_assoc($query);
var_dump($row);
结果是拿到了第一行的数据:
取第二行数据就再写一次
<?php
//能通过PHP代码执行一个SQL语句得到查询结果//1.建立与数据库服务器之间的连接
// 类似于之前的宽字符集函数问题,mysqli是一个额外的扩展
//如果想要使用这个扩展提供的函数,必须在php.ini中开启扩展,找到mysqli这个扩展,把前面的分号去掉,这个方法前几期讲了很多次,这里就不再赘述了。
//如果需要在调用函数时忽略错误或者警告可以在函数名之前加上@
$connection=@mysqli_connect('localhost','root','root','demo2');
// var_dump($connection);if(!$connection){//连接数据库失败exit('<h1>连接数据库失败</h1>');
}//基于刚刚创建的连接对象执行一次查询操作
//得到的是一个查询对象,这个查询对象可以用来到数据一行一行拿数据
$query=mysqli_query($connection,'select * from users;');
//取第一行数据
$row=mysqli_fetch_assoc($query);
var_dump($row);
//再写一次,取第二行数据,一次类推
$row=mysqli_fetch_assoc($query);
var_dump($row);
可以看出,这样非常麻烦。如果有100行数据就要写100次。所以我们用其他的方法。
mysql2.php:
<?php
//1.建立与数据库服务器之间的连接
$connection=mysqli_connect('localhost','root','root','demo2');if(!$connection){//连接数据库失败exit('<h1>连接数据库失败</h1>');
}//基于刚刚创建的连接对象执行一次查询操作
$query=mysqli_query($connection,'select * from users;');
if(!$query){exit('<h1>查询失败</h1>');
}
//遍历结果
while($row=mysqli_fetch_assoc($query)){var_dump($row);
}
//释放查询结果集
mysqli_free_result($query);//关闭连接
mysqli_close($connection);
删除语句:
mysql3.php:
<?php
//增删改语句
//1.建立与数据库服务器之间的连接
$connection=mysqli_connect('localhost','root','root','demo2');if(!$connection){//连接数据库失败exit('<h1>连接数据库失败</h1>');
}//基于刚刚创建的连接对象执行一次查询操作
$query=mysqli_query($connection,'delete from users where id=4;');
if(!$query){exit('<h1>查询失败</h1>');
}
//如何拿到受影响行
//传入的一定是连接对象
$rows=mysqli_affected_rows($connection);
var_dump($rows);
//关闭连接
mysqli_close($connection);
结果为:int(1)
注意 :有的人可能查询中文内容会出现问号等乱码,这可能是你创建数据库没有设置编码集或者php.ini配置文件没用设置编码,可以尝试以上方法修复。或者还有更直接的方法:
//必须在查询数据之前设置,传入连接对象和编码
mysqli_set_charset($connection,'utf8');
附上php查询数据库原理图:
2.例子
2.1 数据库基本操作流程
首先我们新建一个数据库“demo”,新建查询,运行以下SQL语句,学习各个查询语句怎么使用:
-- phpMyAdmin SQL Dump
-- version 4.7.2
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: 2017-07-11 04:21:14
-- 服务器版本: 5.7.18
-- PHP Version: 5.6.30SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;--
-- Database: `baixiu`
---- ----------------------------------------------------------
-- 表的结构 `categories`
--CREATE TABLE `categories` (`id` int(11) NOT NULL COMMENT '主键',`slug` varchar(200) NOT NULL COMMENT '别名',`name` varchar(200) NOT NULL COMMENT '分类名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `categories`
--INSERT INTO `categories` (`id`, `slug`, `name`) VALUES
(1, 'uncategorized', '未分类'),
(2, 'funny', '奇趣事'),
(3, 'living', '会生活'),
(4, 'travel', '爱旅行');-- ----------------------------------------------------------
-- 表的结构 `comments`
--CREATE TABLE `comments` (`id` int(11) NOT NULL COMMENT '主键',`author` varchar(100) NOT NULL COMMENT '作者',`email` varchar(200) NOT NULL COMMENT '邮箱',`created` datetime NOT NULL COMMENT '创建时间',`content` varchar(1000) NOT NULL COMMENT '内容',`status` varchar(20) NOT NULL COMMENT '状态(held/approved/rejected/trashed)',`post_id` int(11) NOT NULL COMMENT '文章 ID',`parent_id` int(11) DEFAULT NULL COMMENT '父级 ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `comments`
--INSERT INTO `comments` (`id`, `author`, `email`, `created`, `content`, `status`, `post_id`, `parent_id`) VALUES
(1, '汪磊', 'w@zce.me', '2017-07-04 12:00:00', '这是一条测试评论,欢迎光临', 'approved', 1, NULL),
(2, '嘿嘿', 'ee@gmail.com', '2017-07-05 09:10:00', '想知道香港回归的惊人内幕吗?快快与我取得联系', 'rejected', 1, NULL),
(3, '小右', 'www@gmail.com', '2017-07-06 14:10:00', '你好啊,交个朋友好吗?', 'held', 1, NULL),
(4, '汪磊', 'www@gmail.com', '2017-07-09 22:22:00', '不好', 'held', 1, 3),
(5, '汪磊', 'w@zce.me', '2017-07-09 18:22:00', 'How are you?', 'held', 1, 3),
(6, '小右', 'www@gmail.com', '2017-07-11 22:22:00', 'I am fine thank you and you?', 'held', 1, 5),
(7, '哈哈', 'hh@gmail.com', '2017-07-22 09:10:00', '一针见血', 'approved', 1, NULL);-- ----------------------------------------------------------
-- 表的结构 `options`
--CREATE TABLE `options` (`id` int(11) NOT NULL COMMENT '主键',`key` varchar(200) NOT NULL COMMENT '属性键',`value` text NOT NULL COMMENT '属性值'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `options`
--INSERT INTO `options` (`id`, `key`, `value`) VALUES
(1, 'site_url', 'http://localhost'),
(2, 'site_logo', '/static/assets/img/logo.png'),
(3, 'site_name', '阿里百秀 - 发现生活,发现美!'),
(4, 'site_description', '阿里百秀同阿里巴巴有咩关系,答案当然系一啲都冇'),
(5, 'site_keywords', '生活, 旅行, 自由, 诗歌, 科技'),
(6, 'site_footer', '<p>© 2016 XIU主题演示 本站主题由 themebetter 提供</p>'),
(7, 'comment_status', '1'),
(8, 'comment_reviewed', '1'),
(9, 'nav_menus', '[{\"icon\":\"fa fa-glass\",\"text\":\"奇趣事\",\"title\":\"奇趣事\",\"link\":\"/category/funny\"},{\"icon\":\"fa fa-phone\",\"text\":\"潮科技\",\"title\":\"潮科技\",\"link\":\"/category/tech\"},{\"icon\":\"fa fa-fire\",\"text\":\"会生活\",\"title\":\"会生活\",\"link\":\"/category/living\"},{\"icon\":\"fa fa-gift\",\"text\":\"美奇迹\",\"title\":\"美奇迹\",\"link\":\"/category/travel\"}]'),
(10, 'home_slides', '[{\"image\":\"/static/uploads/slide_1.jpg\",\"text\":\"轮播项一\",\"link\":\"https://zce.me\"},{\"image\":\"/static/uploads/slide_2.jpg\",\"text\":\"轮播项二\",\"link\":\"https://zce.me\"}]');-- ----------------------------------------------------------
-- 表的结构 `posts`
--CREATE TABLE `posts` (`id` int(11) NOT NULL COMMENT '主键',`slug` varchar(200) NOT NULL COMMENT '别名',`title` varchar(200) NOT NULL COMMENT '标题',`feature` varchar(200) DEFAULT NULL COMMENT '特色图像',`created` datetime NOT NULL COMMENT '创建时间',`content` text COMMENT '内容',`views` int(11) NOT NULL DEFAULT '0' COMMENT '浏览数',`likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',`status` varchar(20) NOT NULL COMMENT '状态(drafted/published/trashed)',`user_id` int(11) NOT NULL COMMENT '用户 ID',`category_id` int(11) NOT NULL COMMENT '分类 ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `posts`
--INSERT INTO `posts` (`id`, `slug`, `title`, `feature`, `created`, `content`, `views`, `likes`, `status`, `user_id`, `category_id`) VALUES
(1, 'hello-world', '世界,你好', '/uploads/2017/hello-world.jpg', '2017-07-01 08:08:00', '欢迎使用阿里百秀。这是您的第一篇文章。编辑或删除它,然后开始写作吧!', 222, 111, 'published', 1, 1),
(2, 'simple-post-2', '第一篇示例文章', NULL, '2017-07-01 09:00:00', '欢迎使用阿里百秀。这是一篇示例文章', 123, 10, 'drafted', 1, 1),
(3, 'simple-post-3', '第二篇示例文章', NULL, '2017-07-01 12:00:00', '欢迎使用阿里百秀。这是一篇示例文章', 20, 120, 'drafted', 1, 2),
(4, 'simple-post-4', '第三篇示例文章', NULL, '2017-07-01 14:00:00', '欢迎使用阿里百秀。这是一篇示例文章', 40, 100, 'drafted', 1, 3);-- ----------------------------------------------------------
-- 表的结构 `users`
--CREATE TABLE `users` (`id` int(11) NOT NULL COMMENT '主键',`slug` varchar(200) NOT NULL COMMENT '别名',`email` varchar(200) NOT NULL COMMENT '邮箱',`password` varchar(200) NOT NULL COMMENT '密码',`nickname` varchar(100) DEFAULT NULL COMMENT '昵称',`avatar` varchar(200) DEFAULT NULL COMMENT '头像',`bio` varchar(500) DEFAULT NULL COMMENT '简介',`status` varchar(20) NOT NULL COMMENT '状态(unactivated/activated/forbidden/trashed)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `users`
--INSERT INTO `users` (`id`, `slug`, `email`, `password`, `nickname`, `avatar`, `bio`, `status`) VALUES
(1, 'admin', 'admin@zce.me', 'wanglei', '管理员', '/static/uploads/avatar.jpg', NULL, 'activated'),
(2, 'zce', 'w@zce.me', 'wanglei', '汪磊', '/static/uploads/avatar.jpg', NULL, 'activated'),
(3, 'ice', 'ice@wedn.net', 'wanglei', '汪磊', '/static/uploads/avatar.jpg', NULL, 'activated');--
-- Indexes for dumped tables
----
-- Indexes for table `categories`
--
ALTER TABLE `categories`ADD PRIMARY KEY (`id`),ADD UNIQUE KEY `slug` (`slug`);--
-- Indexes for table `comments`
--
ALTER TABLE `comments`ADD PRIMARY KEY (`id`);--
-- Indexes for table `options`
--
ALTER TABLE `options`ADD PRIMARY KEY (`id`),ADD UNIQUE KEY `name` (`key`);--
-- Indexes for table `posts`
--
ALTER TABLE `posts`ADD PRIMARY KEY (`id`),ADD UNIQUE KEY `slug` (`slug`);--
-- Indexes for table `users`
--
ALTER TABLE `users`ADD PRIMARY KEY (`id`),ADD UNIQUE KEY `slug` (`slug`),ADD UNIQUE KEY `email` (`email`);--
-- 在导出的表使用AUTO_INCREMENT
----
-- 使用表AUTO_INCREMENT `categories`
--
ALTER TABLE `categories`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=15;
--
-- 使用表AUTO_INCREMENT `comments`
--
ALTER TABLE `comments`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=504;
--
-- 使用表AUTO_INCREMENT `options`
--
ALTER TABLE `options`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=11;
--
-- 使用表AUTO_INCREMENT `posts`
--
ALTER TABLE `posts`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=315;
--
-- 使用表AUTO_INCREMENT `users`
--
ALTER TABLE `users`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=5;COMMIT;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
2.2 基于数据的列表查询
我们例子的整个项目的框架为下图:
数据库设计:
结合前面所学知识,尝试用查询语句完成数据库表的设计。
index.html:
<?php// 1. 建立连接
$conn = mysqli_connect('localhost', 'root', 'root', 'test');if (!$conn) {exit('<h1>连接数据库失败</h1>');
}// 2. 开始查询
$query = mysqli_query($conn, 'select * from users;');if (!$query) {exit('<h1>查询数据失败</h1>');
}?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>XXX管理系统</title><link rel="stylesheet" href="assets/css/bootstrap.css"><link rel="stylesheet" href="assets/css/style.css">
</head>
<body><nav class="navbar navbar-expand navbar-dark bg-dark fixed-top"><a class="navbar-brand" href="#">XXX管理系统</a><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="index.html">用户管理</a></li><li class="nav-item"><a class="nav-link" href="#">商品管理</a></li></ul></nav><main class="container"><h1 class="heading">用户管理 <a class="btn btn-link btn-sm" href="add.php">添加</a></h1><table class="table table-hover"><thead><tr><th>#</th><th>头像</th><th>姓名</th><th>性别</th><th>年龄</th><th class="text-center" width="140">操作</th></tr></thead><tbody><?php while ($item = mysqli_fetch_assoc($query)): ?><tr><th scope="row"><?php echo $item['id'] ?></th><td><img src="<?php echo $item['avatar']; ?>" class="rounded" alt="<?php echo $item['name']; ?>"></td><td><?php echo $item['name']; ?></td><td><?php echo $item['gender'] == 0 ? '♀' : '♂'; ?></td><td><?php echo $item['birthday']; ?></td><td class="text-center"><a class="btn btn-info btn-sm" href="edit.php">编辑</a><a class="btn btn-danger btn-sm" href="delete.php?id=<?php echo $item['id'] ?>">删除</a></td></tr><?php endwhile ?></tbody></table><ul class="pagination justify-content-center"><li class="page-item"><a class="page-link" href="#">«</a></li><li class="page-item"><a class="page-link" href="#">1</a></li><li class="page-item"><a class="page-link" href="#">2</a></li><li class="page-item"><a class="page-link" href="#">3</a></li><li class="page-item"><a class="page-link" href="#">»</a></li></ul></main>
</body>
</html>
css文件包括bootstrap.css(自行去官网下载)和style.css
style.css:
body {padding-top: 3.5rem;
}main {padding-top: 2rem;
}.heading {margin-bottom: 2rem;/*padding-bottom: 9px;*//*border-bottom: 1px solid #eee;*/font-weight: 300;
}.table th,
.table td {vertical-align: middle;
}.table td img {height: 60px;
}
img文件包括两个图片:
icon-08.png:
icon-40.png:
效果图:
2.3 删除功能
delete.php
<?php// 接收要删除的数据 ID
if (empty($_GET['id'])) {exit('<h1>必须传入指定参数</h1>');
}$id = $_GET['id']; // 1. 建立连接
$conn = mysqli_connect('localhost', 'root', '123456', 'test');if (!$conn) {exit('<h1>连接数据库失败</h1>');
}// 2. 开始查询
$query = mysqli_query($conn, 'delete from users where id in (' . $id . ');');if (!$query) {exit('<h1>查询数据失败</h1>');
}$affected_rows = mysqli_affected_rows($conn);if ($affected_rows <= 0) {exit('<h1>删除失败</h1>');
}header('Location: index.php');
2.4 添加数据
<?phpfunction add_user() {// 验证非空if (empty($_POST['name'])) {$GLOBALS['error_message'] = '请输入姓名';return;}if (!(isset($_POST['gender']) && $_POST['gender'] !== '-1')) {$GLOBALS['error_message'] = '请选择性别';return;}if (empty($_POST['birthday'])) {$GLOBALS['error_message'] = '请输入日期';return;}// 取值$name = $_POST['name'];$gender = $_POST['gender'];$birthday = $_POST['birthday'];// 接收文件并验证if (empty($_FILES['avatar'])) {$GLOBALS['error_message'] = '请上传头像';return;}$ext = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);// => 结果为jpg$target = '../uploads/avatar-' . uniqid() . '.' . $ext;//字符串拼接路径if (!move_uploaded_file($_FILES['avatar']['tmp_name'], $target)) {$GLOBALS['error_message'] = '上传头像失败';return;}$avatar = substr($target, 2);// var_dump($name);// var_dump($gender);// var_dump($birthday);// var_dump($avatar);// 保存// 1. 建立连接$conn = mysqli_connect('localhost', 'root', 'root', 'test');if (!$conn) {$GLOBALS['error_message'] = '连接数据库失败';return;}// var_dump("insert into users values (null, '{$name}', {$gender}, '{$birthday}', '{$avatar}');");// 2. 开始查询$query = mysqli_query($conn, "insert into users values (null, '{$name}', {$gender}, '{$birthday}', '{$avatar}');");if (!$query) {$GLOBALS['error_message'] = '查询过程失败';return;}$affected_rows = mysqli_affected_rows($conn);if ($affected_rows !== 1) {$GLOBALS['error_message'] = '添加数据失败';return;}// 响应header('Location: index.php');
}if ($_SERVER['REQUEST_METHOD'] === 'POST') {add_user();
}?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>XXX管理系统</title><link rel="stylesheet" href="assets/css/bootstrap.css"><link rel="stylesheet" href="assets/css/style.css">
</head>
<body><nav class="navbar navbar-expand navbar-dark bg-dark fixed-top"><a class="navbar-brand" href="#">XXX管理系统</a><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="index.html">用户管理</a></li><li class="nav-item"><a class="nav-link" href="#">商品管理</a></li></ul></nav><main class="container"><h1 class="heading">添加用户</h1><?php if (isset($error_message)): ?><div class="alert alert-warning"><?php echo $error_message; ?></div><?php endif ?><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" autocomplete="off"><div class="form-group"><label for="avatar">头像</label><input type="file" class="form-control" id="avatar" name="avatar"></div><div class="form-group"><label for="name">姓名</label><input type="text" class="form-control" id="name" name="name"></div><div class="form-group"><label for="gender">性别</label><select class="form-control" id="gender" name="gender"><option value="-1">请选择性别</option><option value="1">男</option><option value="0">女</option></select></div><div class="form-group"><label for="birthday">生日</label><input type="date" class="form-control" id="birthday" name="birthday"></div><button class="btn btn-primary">保存</button></form></main>
</body>
</html>
2.5 编辑功能
<?php// 接收要修改的数据 ID
if (empty($_GET['id'])) {exit('<h1>必须传入指定参数</h1>');
}$id = $_GET['id'];// 1. 建立连接
$conn = mysqli_connect('localhost', 'root', 'root', 'test');if (!$conn) {exit('<h1>连接数据库失败</h1>');
}// 2. 开始查询
// 因为 ID 是唯一的 那么找到第一个满足条件的就不用再继续了 limit 1
$query = mysqli_query($conn, "select * from users where id = {$id} limit 1;");if (!$query) {exit('<h1>查询数据失败</h1>');
}$user = mysqli_fetch_assoc($query);if (!$user) {exit('<h1>找不到你要编辑的数据</h1>');
}?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>XXX管理系统</title><link rel="stylesheet" href="assets/css/bootstrap.css"><link rel="stylesheet" href="assets/css/style.css">
</head>
<body><nav class="navbar navbar-expand navbar-dark bg-dark fixed-top"><a class="navbar-brand" href="#">XXX管理系统</a><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="index.html">用户管理</a></li><li class="nav-item"><a class="nav-link" href="#">商品管理</a></li></ul></nav><main class="container"><h1 class="heading">编辑“<?php echo $user['name']; ?>”</h1><form><div class="form-group"><label for="avatar">头像</label><input type="file" class="form-control" id="avatar"></div><div class="form-group"><label for="name">姓名</label><input type="text" class="form-control" id="name" value="<?php echo $user['name']; ?>"></div><div class="form-group"><label for="gender">性别</label><select class="form-control" id="gender"><option value="-1">请选择性别</option><option value="1"<?php echo $user['gender'] === '1' ? ' selected': ''; ?>>男</option><option value="0"<?php echo $user['gender'] === '0' ? ' selected': ''; ?>>女</option></select></div><div class="form-group"><label for="birthday">生日</label><input type="date" class="form-control" id="birthday" value="<?php echo $user['birthday']; ?>"></div><button class="btn btn-primary">保存</button></form></main>
</body>
</html>
需要传入参数时暂时用地址栏手写传参:
自动传参需要设置提交id:
<?php// 接收要修改的数据 ID
if (empty($_GET['id'])) {exit('<h1>必须传入指定参数</h1>');
}$id = $_GET['id'];// 1. 建立连接
$conn = mysqli_connect('localhost', 'root', '123456', 'test');if (!$conn) {exit('<h1>连接数据库失败</h1>');
}// 2. 开始查询
// 因为 ID 是唯一的 那么找到第一个满足条件的就不用再继续了 limit 1
$query = mysqli_query($conn, "select * from users where id = {$id} limit 1;");if (!$query) {exit('<h1>查询数据失败</h1>');
}// 已经查询到的当前数据
$user = mysqli_fetch_assoc($query);if (!$user) {exit('<h1>找不到你要编辑的数据</h1>');
}function edit () {global $user;// 验证非空if (empty($_POST['name'])) {$GLOBALS['error_message'] = '请输入姓名';return;}if (!(isset($_POST['gender']) && $_POST['gender'] !== '-1')) {$GLOBALS['error_message'] = '请选择性别';return;}if (empty($_POST['birthday'])) {$GLOBALS['error_message'] = '请输入日期';return;}// 取值$user['name'] = $_POST['name'];$user['gender'] = $_POST['gender'];$user['birthday'] = $_POST['birthday'];// 有上传就修改if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {// 用户上传了新头像 -> 用户希望修改头像$ext = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);$target = '../uploads/avatar-' . uniqid() . '.' . $ext;if (!move_uploaded_file($_FILES['avatar']['tmp_name'], $target)) {$GLOBALS['error_message'] = '上传头像失败';return;}$user['avatar'] = substr($target, 2);}// $user => 修改过后的信息// TODO: 将数据更新回数据库
}if ($_SERVER['REQUEST_METHOD'] === 'POST') {edit();
}?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>XXX管理系统</title><link rel="stylesheet" href="assets/css/bootstrap.css"><link rel="stylesheet" href="assets/css/style.css">
</head>
<body><nav class="navbar navbar-expand navbar-dark bg-dark fixed-top"><a class="navbar-brand" href="#">XXX管理系统</a><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="index.html">用户管理</a></li><li class="nav-item"><a class="nav-link" href="#">商品管理</a></li></ul></nav><main class="container"><h1 class="heading">编辑“<?php echo $user['name']; ?>”</h1><form action="<?php echo $_SERVER['PHP_SELF']; ?>?id=<?php echo $user['id']; ?>" method="post" enctype="multipart/form-data"><!-- <input type="hidden" id="id" value="<?php echo $user['id']; ?>"> --><img src="<?php echo $user['avatar']; ?>" alt=""><div class="form-group"><label for="avatar">头像</label><!-- 文件域不能设置默认值 --><input type="file" class="form-control" id="avatar" name="avatar"></div><div class="form-group"><label for="name">姓名</label><input type="text" class="form-control" id="name" name="name" value="<?php echo $user['name']; ?>"></div><div class="form-group"><label for="gender">性别</label><select class="form-control" id="gender" name="gender"><option value="-1">请选择性别</option><option value="1"<?php echo $user['gender'] === '1' ? ' selected': ''; ?>>男</option><option value="0"<?php echo $user['gender'] === '0' ? ' selected': ''; ?>>女</option></select></div><div class="form-group"><label for="birthday">生日</label><input type="date" class="form-control" id="birthday" name="birthday" value="<?php echo $user['birthday']; ?>"></div><button class="btn btn-primary">保存</button></form></main>
</body>
</html>
总结
本期学习到此结束。
前端学习从入门到高级全程记录之43 (PHP基础Ⅵ)相关推荐
- 前端学习从入门到高级全程记录之1 (HTML基础知识)
本次学习目标 掌握HTML的基本知识,能够写出简单的页面. 1. 开发工具 1.浏览器(chrome(谷歌浏览器),IE浏览器,火狐浏览器,QQ浏览器等等). 2.代码编辑器(sublime,HBui ...
- 前端学习从入门到高级全程记录之41 (PHP基础Ⅳ)
学习目标 本期接上期内容继续学习php基础知识. HTTP 1. 概要 1.1. 定义 HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通 ...
- 前端学习从入门到高级全程记录之16(CSS高级技巧)
本期目标 本期我们继续学习一些CSS的高级技巧. 1.CSS W3C 统一验证工具 CssStats 是一个在线的 CSS 代码分析工具,可以分析你写的代码到底好不好,哪里出错. 网址是: http: ...
- 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)
本期学习目标 本期我们将学习PS的基本使用并且运用以前所学的CSS和HTML的技术来完成一个综合案例. 1.Photoshop基本使用 早在第一期我就让大家去安装PS,不知道安装了没有,没有安装的尽快 ...
- 前端学习从入门到高级全程记录之12 (CSS高级技巧)
学习目标 本期主要学习字体,内容较少.下一期我们将做一个京东的项目,用到的知识将会非常多,非常的有综合性. 1.Web字体 字体格式 不同浏览器所支持的字体格式是不一样的,我们有必要了解一下有关字体格 ...
- 前端学习从入门到高级全程记录之11 (云道页面例子后续)
本期目标 本期学习的主要目标是:1.前几期"云道页面例子"的完善.2.CSS高级技巧的学习 1.云道页面完善 在前2期的云道案例中,我们完成了一半的布局,后面的内容需要用到定位等知 ...
- 前端学习从入门到高级全程记录之35(jQuery②)
学习目标 本期继续学习jQuery,引入的jQuery文件用的还是上一期的. 1.jQuery操作样式 1.1 css操作 功能:设置或者修改样式,操作的是style属性 设置单个样式 //nam ...
- 前端学习从入门到高级全程记录之13 (京东项目一)
学习目的 本期将会学习一个京东项目,综合知识非常多.首先我们要先了解一下这个项目的知识. 1.京东项目(一) 项目名称:京东网 项目描述:京东首页公共部分的头部和尾部制作,京东首页中间部分. 项目背景 ...
- 前端学习从入门到高级全程记录之39 (PHP基础Ⅱ)
学习目标 本期我们将继续学习php的相关知识,在了解了上一期的PHP的一些基本语法和方法,接下来就是实战做做小例子.如果还不会配置php的运行环境的,可以参考我的上一期内容.如果上一期内容看不懂的,可 ...
- 前端学习从入门到高级全程记录之45 (ajax---1)
学习目标 本期开始我们学习Ajax. AJAX 1. 概述 Web程序最初的目的就是将信息(数据)放到公共的服务器,让所有网络用户都可以通过浏览器访问. 在此之前,我们可以通过以下几种方式让浏览器发出 ...
最新文章
- 机器学习训练中常见的问题和挑战!
- 如何快速将微信公众号留言嵌入到CSDN博文中?
- Python应用实战-sql操作groupby常用技巧
- 从零开始学习jQuery (五) 事件与事件对象
- (八)webStorage使用实例——利用storage事件实时监视webStorage中的数据
- QtCreator中的Sysroot的含义及坑
- java学习(26):switch
- tensorrt安装_利用TensorRT对深度学习进行加速
- 链接标签(HTML)
- python 拟合分布_如何使用python将weibull分布拟合到数据?
- Android OpenCv实现拍照搜题功能实现步骤
- HBuilderX连接安卓模拟器
- HTML文档属于哪种数据结构,三种常见的数据结构
- 综述:环境中的噬菌体宿主互作
- 使用img标签能使用background-size:conver一样的效果
- html中表格实现在页面居中显示,html中怎么把表格居中
- 总结:线程间频繁切换为什么耗费资源?
- 3D数据---未来数字世界的物质基础
- 看懂了一点傅里叶变换的原理
- Echarts 折线图 渐变色 不堆叠