批改状态:合格
老师批语:namespace MYSQLi; 命名空间不要使用这样的关键字, 有可能出现一些难以察觉的错误, 下次注意
一.MySQLi是什么
-MySQLi是PHP内置的操作MySQL数据库的扩展,默认为开启。
-MySQLi提供了面向过程和面向对象的两种方式操作数据库
二.MySQLi操作数据库的基本步骤
-连接数据库
创建一个MySQLi类实例,需要传入(主机名,用户名,密码,数据库名),设置字符集
-操作数据库
-1.新增
例
<?php//新增操作namespace MYSQLi;use mysqli;// 1连接数据库// MYSQLI连接数据库需要主机,用户名,密码,数据库名$mysqli = new mysqli('localhost','root','root','phpedu');// 创建SQL语句 ,每个字段需要用逗号隔开 ?为占位符$sql = 'INSERT `test` SET `name`=?,`age`=?, `email`=?;';// 使用预处理方式,防止SQL注入$stmt = $mysqli->stmt_init();// 创建SQL语句对象$stmt = $mysqli->prepare($sql);// 创建数据数组,然后使用使用bind_param与占位符进行绑定$user = ['马超',22,'machao@php.cn'];list($name,$age,$email) = $user;$stmt->bind_param('sis',$name,$age,$email);// 执行SQL语句$stmt->execute();echo $stmt->affected_rows ===1 ? '新增成功' : '新增失败';//关闭数据库$stmt->close();
-2.更新
例:步骤类似,稍微改下SQL语句就能用了
<?php//更新操作namespace MYSQLi;use mysqli;// 1连接数据库// MYSQLI连接数据库需要主机,用户名,密码,数据库名$mysqli = new mysqli('localhost','root','root','phpedu');// 创建SQL语句,修改邮箱,如果需要更新多个字段,每个字段需要用逗号隔开 ?为占位符$sql = 'UPDATE `test` SET `email`=? WHERE `name`=?;';$stmt = $mysqli->stmt_init();// 创建SQL语句对象$stmt ->prepare($sql);// 创建数据数组,然后使用使用bind_param与占位符进行绑定$user = ['machao@admin.cn','马超'];list($email,$name) = $user;$stmt->bind_param('ss',$email,$name);// 执行SQL语句$stmt->execute();echo $stmt->affected_rows ===1 ? '更新成功' : '更新失败';//关闭数据库$stmt->close();
-3.删除
例
<?php//删除操作namespace MYSQLi;use mysqli;// 1连接数据库// MYSQLI连接数据库需要主机,用户名,密码,数据库名$mysqli = new mysqli('localhost','root','root','phpedu');// 创建SQL语句 ?为占位符$sql = 'DELETE FROM `test` WHERE `name`=?;';$stmt = $mysqli->stmt_init();// 创建SQL语句对象$stmt ->prepare($sql);// 创建数据,然后使用使用bind_param与占位符进行绑定$name = '马超';$stmt->bind_param('s',$name);// 执行SQL语句$stmt->execute();echo $stmt->affected_rows ===1 ? '删除成功' : '删除失败';//关闭数据库$stmt->close();
-4.查询
例
<?php//查询操作(使用结果集查看)namespace MYSQLi;use mysqli;// 1连接数据库// MYSQLI连接数据库需要主机,用户名,密码,数据库名$mysqli = new mysqli('localhost','root','root','phpedu');// 创建SQL语句 如果需要更新多个字段,每个字段需要用逗号隔开 ?为占位符$sql = 'SELECT * FROM `test` WHERE `id`>?;';// 使用预处理方式,防止SQL注入$stmt = $mysqli->stmt_init();// 创建SQL语句对象$stmt ->prepare($sql);// 创建数据数组,然后使用使用bind_param与占位符进行绑定$id = 3;$stmt->bind_param('i',$id);// 执行SQL语句$stmt->execute();// 处理结果,获取结果集$result = $stmt->get_result();// 一条一条查看,fetch_assoc:显示结果中的关联部分(常用)// $user = $result->fetch_assoc();// 使用while循环 遍历出所有结果// while($user = $result->fetch_assoc()){// echo "id={$user['id']}:name={$user['name']}:age={$user['age']}:email={$user['email']}<br>";// }//一次查询所有满足条件的结果$users = $result->fetch_all(MYSQLI_ASSOC);// print_r($users);//使用foreach 遍历出所有结果foreach($users as $user){echo "id={$user['id']}:name={$user['name']}:age={$user['age']}:email={$user['email']}<br>";}// 释放结果集$stmt->free_result();//关闭数据库$stmt->close();
-最后就是关闭数据库 close()
<?phpnamespace DETAIL;//创建一个接口,里面都是数据库连接常量interface iParam{const MYSQL='mysql';const HOST='localhost';const USERNAME='root';const PASSWORD='root';const DBNAME='phpedu';}// 创建一个接口,表示需要使用构造方法interface iDBlink{public function __construct(array $link);}//创建一个接口,表示数据的操作interface iCURD extends iDBlink,iParam{//新增操作public function insert(array $data);// 更新操作public function update(array $data,string $where);//查询操作public function select(string $where='');//删除操作public function delete(string $where);//关闭操作public function close();}
<?phpnamespace DETAIL;//导入PDOuse PDO;class DB_PDO implements iCURD{private $pdo;//实现接口的构造方法,需要传入一个数组参数,数组里面包括(PDO数据源,数据库用户名,密码)public function __construct(array $links){list($dsn, $username, $password) = $links;$this->pdo = new pdo($dsn, $username, $password);}//实现接口的新增方法,需要传入一个数组参数,数组里面包括(姓名,年龄,邮箱)例('张三',20,'zhangsan@php.cn')public function insert(array $data){$sql = 'INSERT `test` SET `name`=?,`age`=?,`email`=?';$stmt = $this->pdo->prepare($sql);$stmt->execute($data);return $stmt->rowCount() === 1 ? '新增成功' : '新增失败';}// 实现接口更新操作,需要传入一个更新参数数组// 再传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")public function update(array $data, string $where = ''){//因为更新参数都为字符串,要先创建一个空变量$params = '';//遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$paramsforeach ($data as $key => $value) {$params .= "`{$key}`='{$value}',";}//去掉最右边的逗号$params = rtrim($params, ',');$sql = "UPDATE `test` SET {$params} WHERE {$where}";$stmt = $this->pdo->prepare($sql);$stmt->execute();return $stmt->rowCount() === 1 ? '更新成功' : '更新失败';}//实现接口查询操作//传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")public function select(string $where = ''){//查询的时候条件可以为空,所以要判断$where时候为空,如果为空就查询整张数据表//如果不为空,就把后面拼接的赋值给$where组成完整的SQL语句$where = empty($where) ? $where : ' WHERE ' . $where;$sql = "SELECT * FROM `test` {$where}";$stmt = $this->pdo->prepare($sql);$stmt->execute();return $stmt->fetchall(PDO::FETCH_ASSOC);}//实现接口删除操作public function delete(string $where){$sql = "DELETE FROM `test` WHERE {$where}";$stmt = $this->pdo->prepare($sql);$stmt->execute();return $stmt->rowCount() === 1 ? '删除成功' : '删除失败';}//关闭数据库public function close(){return $this->pdo = null;}}
<?phpnamespace DETAIL;use MYSQLi;class DB_MYSQLI implements iCURD{private $mysqli;//连接数据库//实现接口的构造方法,需要传入一个数组参数,数组里面包括(数据库主机名,数据库用户名,密码,数据库名)public function __construct(array $links){list($host, $username, $password, $dbname) = $links;$this->mysqli = new MYSQLI($host, $username, $password, $dbname);//设置默认字符集,防止有乱码出现$this->mysqli->set_charset('uft8');}//实现接口的新增方法,需要传入一个数组参数,数组里面包括(姓名,年龄,邮箱)例('张三',20,'zhangsan@php.cn')public function insert(array $data){//创建SQL语句$sql = 'INSERT `test` SET `name`=?,`age`=?,`email`=?';$stmt = $this->mysqli->prepare($sql);list($name, $age, $email) = $data;$stmt->bind_param('sis', $name, $age, $email);$stmt->execute();return $stmt->affected_rows === 1 ? '新增成功' : '新增失败';}// 实现接口更新操作,需要传入一个更新参数数组// 再传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")public function update(array $data, string $where){//创建SQL语句//因为更新参数都为字符串,要先创建一个空变量$params = '';//遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$paramsforeach ($data as $key => $value) {$params .= "`{$key}`='{$value}',";}$params = rtrim($params, ',');$sql = "UPDATE `test` SET {$params} WHERE {$where}";$stmt = $this->mysqli->prepare($sql);$stmt->execute();return $stmt->affected_rows === 1 ? '更新成功' : '更新失败';}//实现接口查询操作//传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")public function select(string $where = ''){//查询的时候条件可以为空,所以要判断$where时候为空,如果为空就查询整张数据表//如果不为空,就把后面拼接的赋值给$where组成完整的SQL语句$where = empty($where) ? $where : ' WHERE ' . $where;$sql = "SELECT * FROM `test` WHERE {$where}";$stmt = $this->mysqli->prepare($sql);$stmt->execute();$result = $stmt->get_result();return $result->fetch_all(MYSQLI_ASSOC);}//删除操作public function delete(string $where){$sql = "DELETE FROM `test` WHERE {$where}";$stmt = $this->mysqli->prepare($sql);$stmt->execute();return $stmt->affected_rows === 1 ? '删除成功' : '删除失败';}//关闭数据库public function close(){return $this->mysqli->close();}}
<?phpnamespace DETAIL;//创建数据操作通用类class DB{//通用操作,$db为操作语言(传入$DB_PDO实例就是PDO,传入$DB_MYSQLI实例就是mysqli语言)public function insert(iCURD $db,array $data){return $db->insert($data);}public function update(iCURD $db,array $data,string $where){return $db->update($data,$where);}public function select(iCURD $db,string $where=''){return $db->select($where);}public function delete(iCURD $db,string $where){return $db->delete($where);}public function close(iCURD $db){return $db->close();}}
<?phpnamespace DETAIL;//导入接口文件require 'demo4.php';//导入MYSQLI类,接口实现方法require 'demo6.php';//导入数据库查询通用类require 'demo7.php';//创建MYSQLI数据源$links = [iParam::HOST,iParam::USERNAME,iParam::PASSWORD,iParam::DBNAME];//实例化MYSQLI$db_mysqli = new DB_MYSQLI($links);//实例化通用类$db =new db;//新增测试// echo $db->insert($db_mysqli,['孙权',28,'sunquan@php.cn']);//更新测试// echo $db->update($db_mysqli,['age'=>38],'id=25');//查询测试// echo '<pre>'.print_r($db->select($db_mysqli,'`id`>2'),true).'</pre>';//删除测试// echo $db->delete($db_mysqli,"`name`='孙权'");//关闭数据库echo $db->close($db_mysqli);
笔记1
笔记2
实战练习的时候,感觉错误还是很多(主要写少了),都是写完整了一个方法就测试,有问题马上修改,就是怕如果全部写完了在测试会找不到错误在哪里!一边写一边改,不太会查找BUG,很多时候都是一行一行的自己慢慢找。输入法错误也有,有时候明明看上去正确的代码,就因为输入法变成全角了而错误
然后注释是个好东西,建议和我一样初学的,一定要习惯写注释,帮助学习有好处
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号