学习目标

本期接上期继续学习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="#">&laquo;</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="#">&raquo;</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. 前端学习从入门到高级全程记录之1 (HTML基础知识)

    本次学习目标 掌握HTML的基本知识,能够写出简单的页面. 1. 开发工具 1.浏览器(chrome(谷歌浏览器),IE浏览器,火狐浏览器,QQ浏览器等等). 2.代码编辑器(sublime,HBui ...

  2. 前端学习从入门到高级全程记录之41 (PHP基础Ⅳ)

    学习目标 本期接上期内容继续学习php基础知识. HTTP 1. 概要 1.1. 定义 HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通 ...

  3. 前端学习从入门到高级全程记录之16(CSS高级技巧)

    本期目标 本期我们继续学习一些CSS的高级技巧. 1.CSS W3C 统一验证工具 CssStats 是一个在线的 CSS 代码分析工具,可以分析你写的代码到底好不好,哪里出错. 网址是: http: ...

  4. 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)

    本期学习目标 本期我们将学习PS的基本使用并且运用以前所学的CSS和HTML的技术来完成一个综合案例. 1.Photoshop基本使用 早在第一期我就让大家去安装PS,不知道安装了没有,没有安装的尽快 ...

  5. 前端学习从入门到高级全程记录之12 (CSS高级技巧)

    学习目标 本期主要学习字体,内容较少.下一期我们将做一个京东的项目,用到的知识将会非常多,非常的有综合性. 1.Web字体 字体格式 不同浏览器所支持的字体格式是不一样的,我们有必要了解一下有关字体格 ...

  6. 前端学习从入门到高级全程记录之11 (云道页面例子后续)

    本期目标 本期学习的主要目标是:1.前几期"云道页面例子"的完善.2.CSS高级技巧的学习 1.云道页面完善 在前2期的云道案例中,我们完成了一半的布局,后面的内容需要用到定位等知 ...

  7. 前端学习从入门到高级全程记录之35(jQuery②)

    学习目标 本期继续学习jQuery,引入的jQuery文件用的还是上一期的. 1.jQuery操作样式 1.1 css操作 功能:设置或者修改样式,操作的是style属性  设置单个样式 //nam ...

  8. 前端学习从入门到高级全程记录之13 (京东项目一)

    学习目的 本期将会学习一个京东项目,综合知识非常多.首先我们要先了解一下这个项目的知识. 1.京东项目(一) 项目名称:京东网 项目描述:京东首页公共部分的头部和尾部制作,京东首页中间部分. 项目背景 ...

  9. 前端学习从入门到高级全程记录之39 (PHP基础Ⅱ)

    学习目标 本期我们将继续学习php的相关知识,在了解了上一期的PHP的一些基本语法和方法,接下来就是实战做做小例子.如果还不会配置php的运行环境的,可以参考我的上一期内容.如果上一期内容看不懂的,可 ...

  10. 前端学习从入门到高级全程记录之45 (ajax---1)

    学习目标 本期开始我们学习Ajax. AJAX 1. 概述 Web程序最初的目的就是将信息(数据)放到公共的服务器,让所有网络用户都可以通过浏览器访问. 在此之前,我们可以通过以下几种方式让浏览器发出 ...

最新文章

  1. 机器学习训练中常见的问题和挑战!
  2. 如何快速将微信公众号留言嵌入到CSDN博文中?
  3. Python应用实战-sql操作groupby常用技巧
  4. 从零开始学习jQuery (五) 事件与事件对象
  5. (八)webStorage使用实例——利用storage事件实时监视webStorage中的数据
  6. QtCreator中的Sysroot的含义及坑
  7. java学习(26):switch
  8. tensorrt安装_利用TensorRT对深度学习进行加速
  9. 链接标签(HTML)
  10. python 拟合分布_如何使用python将weibull分布拟合到数据?
  11. Android OpenCv实现拍照搜题功能实现步骤
  12. HBuilderX连接安卓模拟器
  13. HTML文档属于哪种数据结构,三种常见的数据结构
  14. 综述:环境中的噬菌体宿主互作
  15. 使用img标签能使用background-size:conver一样的效果
  16. html中表格实现在页面居中显示,html中怎么把表格居中
  17. 总结:线程间频繁切换为什么耗费资源?
  18. 3D数据---未来数字世界的物质基础
  19. 看懂了一点傅里叶变换的原理
  20. Echarts 折线图 渐变色 不堆叠

热门文章

  1. STM32驱动步进电机
  2. 档案计算机管理软件,档案管理软件系统
  3. c语言求解一元二次方程的复根,c语言 求一元二次方程的根(含复根)
  4. ip domain-lookup命令解释
  5. ios 画带有箭头的线_iOS 箭头类型视图的几点心得
  6. 上传Android library到JitPack
  7. 免费微信公众号专用h5在线电影票API
  8. 数据评估:SD(标准差), 方差, 方差分析(ANOVA)
  9. java基于ssm的房屋租赁管理系统
  10. 中国公有云厂商2017年收入利润综合排名