使用msqli操作MySQL数据库
使用mysqli链接MySQL数据库
- mysqli连接参数
- 数据库主机名: host
- 用户名: username
- 密码: password
- 默认数据库: dbname
- 端口号: port
// db_config.php
namespace config;
$config = [
// 数据库主机
'host' => $host ?? 'localhost',
// 默认数据库
'dbname' => $dbname ?? 'phpedu',
// 默认字符编码
'charset' => $charset ?? 'utf8',
// 默认端口号
'port' => $port ?? '3306',
// 默认用户名
'username' => $username ?? 'root',
// 默认用户密码
'password' => $password ?? 'root',
];
- 连接数据库
// connect.php
require_once('config/db_config.php');
// 1. 使用exact()函数解构数组中的参数
// 如果是vs storm编辑器,则需要写下面的注释, 否则用extract()会报错.
/**
* @var string $host
* @var string $username
* @var string $password
* @var string $dbname
* 略...
*/
extract($config);
// 2. 连接数据库
$mysqli = new mysqli($host, $username, $password, $dbname, $port);
// 3.判断是否连接成功(若连接失败, errorno会有值)
if ($mysqli->connect_errno) {
die($mysqli->connect_errno);
}
// 4. 设置客户端默认字符编码集
$mysqli->set_charset($charset);
// 5. 测试是否连接数据库成功
dumpbr($mysqli);
2. 使用mysqli执行CURD操作
- 创建库表和示例数据
创建库表
DROP DATABASE IF EXISTS `phpedu`;
CREATE DATABASE `phpedu` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `phpedu`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`realname` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL,
`in_use` int(11) NOT NULL DEFAULT '1',
`create_time` int(11) NOT NULL,
`update_time` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建示例数据
- 数据库CURD操作
require '../out.php';
/* 打印用户信息 */
function showUserInfo($user)
{
$update_time = date('Y-m-d H:i:s', $user['update_time']);
$create_time = date('Y-m-d H:i:s', $user['create_time']);
$status = ($user['in_use'] == 1) ? '使用中' : '停用';
echobr("ID: {$user['id']}, 用户名: {$user['username']}, 姓名: {$user['realname']}, 使用状态: {$status}, 创建时间: {$create_time}, 更新时间: {$update_time}");
}
// 1. 连接数据库
require_once('connect.php');
// 2. 执行CURD操作
// 2.1 查询一条记录
/* SQL语句 */
$sql = "SELECT * FROM `user` WHERE `in_use` = 1";
/* 执行查询, 并获取返回的结果集对象 */
$mysqli_result = $mysqli->query($sql);
/* fetch_array()方法: 一次输出一条记录, 并自动下移指针;
参数:
MYSQLI_ASSOC: 只获取关联部分数组元素.
MYSQLI_BOTH: 默认参数, 同时获取关联部分和索引部分元素.
MYSQLI_NUM: 值获取索引部分元素.
*/
/* mysqli_fetch_assoc() 等效于 $mysqli_result->fetch_array(MYSQLI_ASSOC) */
/* $mysqli_result->fetch_row() 等效于 $mysqli_result->fetch_array(MYSQLI_NUM) */
$user = $mysqli_result->fetch_array(MYSQLI_ASSOC);
showUserInfo($user);
/* 若要输出下一条记录, 则再调用一次fetch_array()方法. */
/* 结果集指针复位方法: $mysqli_result->data_seek(0); */
echo '<hr>';
// 2.2 查询多条记录
/* SQL语句 */
$sql = "SELECT * FROM `user` WHERE `in_use` = 1";
/* 执行查询, 并获取返回的结果集对象 */
$mysqli_result = $mysqli->query($sql);
/* 判断返回结果集是否有记录 */
if ($mysqli_result && $mysqli_result->num_rows > 0) {
$users = $mysqli_result->fetch_all(MYSQLI_ASSOC);
/* 循环输出结果记录 */
foreach ($users as $user) {
showUserInfo($user);
}
}
/* result:
ID: 1, 用户名: zhangsan, 姓名: 张三, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:34, 更新时间: 2020-05-07 00:45:34
ID: 2, 用户名: lisi, 姓名: 李四, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:55, 更新时间: 2020-05-07 00:45:55
ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
ID: 7, 用户名: bajie, 姓名: 八戒, 使用状态: 使用中, 创建时间: 2020-05-07 21:27:54, 更新时间: 2020-05-07 21:27:54
*/
echo '<hr>';
// 2.3 新增一条记录
$newUser = ['username' => 'chenjiu', 'password' => md5('123456'), 'realname' => '陈九', 'in_use' => 1, 'create_time' => time(), 'update_time' => time()];
/* 给字符串字段加上引号 */
array_walk($newUser, function (&$value, $key) {
if (gettype($value) === 'string') {
$value = "'$value'";
}
});
/* 解构数组记录参数 */
extract($newUser);
/* 拼出SQL */
$sql = "INSERT `user` SET `username` = {$username}, `password` = {$password}, `realname` = {$realname}, `in_use` = {$in_use}, `create_time` = {$create_time}, `update_time` = {$update_time}";
/* 插入操作的返回值是插入结果(成功/失败) */
if ($mysqli->query($sql)) {
if ($mysqli->affected_rows > 0) {
echobr('成功添加了' . $mysqli->affected_rows . '条记录, 新增记录主键: ' . $mysqli->insert_id);
} else {
echobr('没有添加新纪录');
}
} else {
/* 实际项目中会把错误信息写到日志中 */
echobr('插入失败:' . $mysqli->errno . '->' . $mysqli->error);
}
/* result: 成功添加了1条记录, 新增记录主键: 24 */
/* 2.4 更新一条记录 */
$id = $mysqli->insert_id;
$update_time = time();
$sql = "UPDATE `user` SET `in_use` = 0, `update_time` = {$update_time} WHERE `id` = {$id}";
echobr($sql);
/* 更新操作的返回值也是更新结果(成功/失败) */
if ($mysqli->query($sql)) {
if ($mysqli->affected_rows > 0) {
echobr('成功更新了' . $mysqli->affected_rows . '条记录.');
} else {
echobr('没有更新任何数据');
}
} else {
echobr('更新失败:' . $mysqli->erro . '->' . $mysqli->error);
}
/* result: 成功更新了1条记录. */
// 2.5 删除一条记录
/* $id变量值现在还是指向刚才插入的记录 */
$sql = "DELETE FROM `user` WHERE `id` = {$id}";
if ($mysqli->query($sql)) {
if ($mysqli->affected_rows > 0) {
echobr('成功删除了' . $mysqli->affected_rows . '条记录');
}
} else {
echobr('删除失败:' . $mysqli->erro . '->' . $mysqli->error);
}
/* result: 成功删除了1条记录 */
学习心得
- 先学习PDO,再学习mysqli,感觉mysqli不太安全,SQL语句是以拼接字符串的形式创建,是不是会遭受SQL注入攻击?好在以后也不用mysqli,熟悉它的用法,能读懂代码就好.