批改状态:合格
老师批语:代码风格受我的影响比较大
<?php// 连接参数return [// 类型'type' => $type ?? 'mysql',// 先问下,没有的情况下再默认。默认数据库主机名(IP)'host' => $host ?? 'localhost',// 默认数据库名'dbname' => $type ?? 'phpedu',// 默认字符编码集'charset' => $type ?? 'utf8',// 默认端口号'port' => $type ?? '3306',// 默认用户名'username' => $username ?? 'root',// 默认用户的密码'password' => $password ?? 'root'];
<?php// 连接数据库// 导入配置参数,就是一个数组。因为在上一级目录,因此有..$config = require __DIR__ . '/../config.php';// 关联数组 ===> 独立变量extract($config);// 创建连接对象: 连接数据库$mysqli = new mysqli($host, $username, $password, $dbname);// 检测错误if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error);// 字符编码$mysqli->set_charset($charset);
// mysqli新增操作// 1. 连接require 'connect.php';// 2. 操作// sql语句, ?:匿名占位符$sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';// 第一步: 将sql语句转为sql语句对象: stmt对象,预处理对象, 预编译语句对象$stmt = $mysqli->prepare($sql);// 给sql语句中的占位符?,绑定变量分二步// 1. 给占位符绑定一个变量名(变量标识符)$stmt->bind_param('sss', $name,$email,$password);//sss代表三个string字符串占位// 2. 将变量名与一个具体的值进行绑定: 变量赋值// $name = 'admin';// $email = 'admin@php.cn';// sha1():生成40位由16进制字母组成的随机字符串// $password = sha1('123');// 第二步:执行// $stmt->execute() or die($stmt->error);// printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);//也可以用这种方式。// $data = [// 'name'=> 'peter',// 'email'=> 'peter@php.cn',// 'password' => sha1('123456'),// ];// 将关联数组解构到一组独立变量中// extract($data);// // 执行// $stmt->execute() or die($stmt->error);// printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);// 通过遍历一个二维数组,可以实现一次性插入多条记录$users = [['name'=> '小燕子','email'=>'xyz@php.cn', 'password'=>sha1('123456')],['name'=> '紫薇','email'=>'zw@php.cn', 'password'=>sha1('123456')],['name'=> '五阿哥','email'=>'wag@php.cn', 'password'=>sha1('123456')],['name'=> '尔康','email'=>'ek@php.cn', 'password'=>sha1('123456')],['name'=> '金锁','email'=>'js@php.cn', 'password'=>sha1('123456')],];foreach ($users as $user) {extract($user);if ($stmt->execute())printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);//$s为string占位符,%d为数字占位符。elseexit(sprintf('新增失败 , $d: %s', $stmt->errno, $stmt->error ));}// 第三步:关闭$mysqli->close();
<?php// mysqli删除操作// 1. 连接require 'connect.php';// 2. 操作$sql = 'DELETE FROM `users` WHERE `id` = ?;';// sql语句对象$stmt = $mysqli->prepare($sql);// 占位符与变量名绑定$stmt->bind_param('i',$id);// 变量赋值$id=14;//执行更新$stmt->execute();printf('删除了 %s 条记录', $stmt->affected_rows);// 3. 关闭$mysqli->close();
<?php// mysqli更新操作// 1. 连接require 'connect.php';// 2. 操作$sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';// sql语句对象$stmt = $mysqli->prepare($sql);// 占位符与变量名绑定$stmt->bind_param('sssi', $name, $email, $password, $id);// 变量赋值$user = ['name'=>'皇后','email'=>'hh@php.cn', 'password'=>sha1('888'), 'id'=>14 ];//展开为独立变量给sql语句模板中的与占位符对应的变量名赋值extract($user);//执行更新$stmt->execute();printf('更新了 %s 条记录', $stmt->affected_rows);// 3. 关闭$mysqli->close();
<?php// mysqli查询1: fetch_assoc() + while()// 1. 连接require 'connect.php';// 2. 操作$sql = 'SELECT * FROM `users` WHERE `id` > ?';// sql语句对象$stmt = $mysqli->prepare($sql);$stmt->bind_param('i', $id);$id = 15;$stmt->execute() or die($stmt->error);// 获取结果集$result = $stmt->get_result();if ($result->num_rows === 0) exit('结果为空');// fetch_assoc():以关联数组方式返回一个记录// 循环遍历while ($user=$result->fetch_assoc()) {vprintf('%d: %s | %s <br>', $user);}// 3. 释放结果$result->free();// 4. 关闭连接$mysqli->close();
$sql = 'SELECT * FROM `users` WHERE `id` > ?';// sql语句对象$stmt = $mysqli->prepare($sql);$stmt->bind_param('i', $id);$id = 15;$stmt->execute() or die($stmt->error);// 获取结果集$result = $stmt->get_result();if ($result->num_rows === 0) exit('结果为空');// fetch_all():以二维关联数组方式返回一个满足查询条件的所有记录集合$users=$result->fetch_all(MYSQLI_ASSOC);// 循环遍历foreach ($users as $user) {vprintf('%d: %s ******* | %s <br>', $user);//中间的*****只是为了区别于前面,可以不加。}
$sql = 'SELECT `id`, `name`,`email` FROM `users` WHERE `id` > ?';// sql语句对象$stmt = $mysqli->prepare($sql);$stmt->bind_param('i', $id);$id = 15;$stmt->execute() or die($stmt->error);// 字段与变量的绑定$stmt->bind_result($id, $name, $email);// 因为当前操作不涉及结果集对象,如果要获取结果集中的数量,用以下二行代码$stmt->store_result();if ($stmt->num_rows === 0) exit('没有内容');// 循环遍历while ($stmt->fetch()) {printf('%d: %s ----| %s <br>', $id, $name, $email);}
// pdo连接数据库// 导入配置参数,就是一个数组$config = require __DIR__ . '/../config.php';// 关联数组 ===> 独立变量extract($config);// 创建连接对象: 连接数据库。下面这个直接也可以,当然也可以用下面的try catch。// $dsn: 数据源名称// $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';//不过这里只是示例try {$dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);$pdo = new PDO($dsn, $username, $password);// 设置结果集的默认获取模式: 只关心关联数组部分$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);} catch (PDOException $e) {exit('Connection Error: ' . $e->getMessage());}
<?php// pdo 新增操作// 1. 连接require 'connect.php';// 2. 操作$sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';// sql语句对象$stmt = $pdo->prepare($sql);// 1. ? 与 变量名绑定, 引用绑定// $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);// $stmt->bindParam(2, $email, PDO::PARAM_STR, 100);// $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);// 最后的数字为字段长短。// 2. 变量名与值绑定(赋值)// $name = '大飞111';// $email = 'df111@php.cn';// $password = sha1('df111');// 执行// $stmt->execute();// $name = '大飞99999';// $email = 'df1118888@php.cn';// $password = sha1('df111');// 执行// $stmt->execute();// rowCount():返回表中受影响的记录数量,当前是新增的记录数量// if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();// 值绑定,变量必须先赋值,否则放在后面的不发挥作用。但变量引用绑定则不要紧。// $name = '蛋蛋';// $email = 'dd2@php.cn';// $password = sha1('dd999');// $stmt->bindValue(1, $name, PDO::PARAM_STR);// $stmt->bindValue(2, $email, PDO::PARAM_STR);// $stmt->bindValue(3, $password, PDO::PARAM_STR);// 执行// $stmt->execute() or die(print_r($stmt->errorInfo(),true));// $name = '蛋蛋888';// $email = 'dd2888@php.cn';// $password = sha1('dd999');// $stmt->bindValue(1, $name, PDO::PARAM_STR);// $stmt->bindValue(2, $email, PDO::PARAM_STR);// $stmt->bindValue(3, $password, PDO::PARAM_STR);// 执行// $stmt->execute() or die(print_r($stmt->errorInfo(),true));// rowCount():返回表中受影响的记录数量,当前是新增的记录数量// if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();// bindParam(): 引用绑定,只需要绑定一次即可(直接绑定到模板上)// bindValue(): 值绑定, 实时映射,变量的变化或在实时的映射到占位符上,因此每一次都必须重新赋值// 值绑定实时性,直观好理解,但是操作非常麻烦,可以给execute()传参来简化它。----- 最后这种事最简化的值绑定。$stmt->execute(['小花','xh@php.cn', sha1('567')]);if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();// 3. 关闭// $pdo = null;unset($pdo);
<?php// pdo删除操作// 1. 连接require 'connect.php';// 2. 操作$sql = 'DELETE FROM `users` WHERE `id` = ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute([42]);if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';// 3. 关闭$pdo = null;
<?php// pdo更新操作// 1. 连接require 'connect.php';// 2. 操作$sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute(['小龙人','xlr@php.cn', sha1('1234567'), 42]);if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';// 3. 关闭$pdo = null;
<?php// pdo查询操作: fetch() + while()// 1. 连接require 'connect.php';// 2. 操作$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute([30]);while ($user = $stmt->fetch()) {vprintf('<li>%s: %s | %s</li>', $user);}// 3. 关闭$pdo = null;
$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute([40]);$users = $stmt->fetchAll();foreach ($users as $user) {vprintf('<li>%s: %s | %s</li>', $user);}
$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute([30]);// 将三个字段与三个变量绑定,变量名自己定义。$stmt->bindColumn('id', $id);$stmt->bindColumn('name', $name);$stmt->bindColumn('email', $email);while ($stmt->fetch(PDO::FETCH_BOUND)) {printf('<li>%s: %s | %s</li>',$id, $name, $email);}// 获取记录数量比较难,可以用下面的方式来实现。// echo $stmt->rowCount();$sql = 'SELECT COUNT(`id`) AS `count` FROM `users` WHERE `id` >= ?;';$stmt = $pdo->prepare($sql);// 将值直接绑定到匿名占位符?上面$stmt->execute([30]);$stmt->bindColumn('count', $count);$stmt->fetch(PDO::FETCH_BOUND);echo '满足条件的记录数量'. $count;
| 序号 | 步骤 | 描述 |
|---|---|---|
| 1 | 连接数据库 | 创建数据库连接对象的过程$mysqli或$pdo |
| 2 | 操作数据表 | SELECT查询/INSERT新增/UPDATE更新/DELETE删除 |
| 3 | 释放结果集[可选] | 仅针对查询操作有效,清空查询结果的过程 |
| 4 | 关闭数据库连接 | 实际上是销毁数据库连接对象的过程 |
| 序号 | 参数 | 描述 |
|---|---|---|
| 1 | type |
数据库类型 |
| 2 | host |
默认数据库主机名 |
| 3 | dbname |
默认数据库名称 |
| 4 | charset |
默认字符集 |
| 5 | port |
默认端口号 |
| 6 | username |
默认用户名 |
| 7 | password |
默认用户密码 |
仅介绍 mysqli 面向对象 + 预处理
mysqli接口| 序号 | 属性/方法 | 描述 |
|---|---|---|
| 1 | connect_errno |
连接错误编码 |
| 2 | connect_error |
连接错误信息 |
| 3 | set_charset |
设置字符集 |
| 4 | prepare |
创建mysqli_stmt对象 |
mysqli_stmt接口| 序号 | 属性/方法 | 描述 |
|---|---|---|
| 1 | bind_param() |
占位符与变量绑定 |
| 2 | bind_result() |
字段与变量绑定 |
| 3 | execute() |
执行 SQL 语句 |
| 4 | get_result() |
创建mysqli_result 对象 |
| 5 | fetch() |
遍历变量中的字段 |
| 6 | close() |
关闭预处理查询 |
| 7 | affected_rows |
受影响记录数量 |
| 8 | insert_id |
新增记录主键 id |
| 9 | errno |
错误编号 |
| 10 | error |
错误信息 |
mysqli_result接口| 序号 | 属性/方法 | 描述 |
|---|---|---|
| 1 | fetch_assoc() |
以关联数组返回一条记录 |
| 2 | fetch_all() |
获取全部记录 |
| 3 | num_rows |
结果集记录数量 |
| 4 | free() |
释放结果集 |
仅介绍 pdo 预处理
PDO接口| 序号 | 属性/方法 | 描述 |
|---|---|---|
| 1 | setAttribute() |
设置属性 |
| 2 | lastInsertId() |
最后插入记录的主键 id |
| 3 | prepare() |
创建PDOStatement对象 |
PDOStatement接口它的实例与一条预处理语句对应, 上面定义了许多实用的方法
| 序号 | 属性/方法 | 描述 |
|---|---|---|
| 1 | setAttribute() |
设置属性 |
| 2 | lastInsertId() |
最后插入记录的主键 id |
| 3 | prepare() |
创建PDOStatement对象 |

![
]

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号