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()
接口与多态实例练习
1.先创建接口文件
<?php
namespace 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();
}
2.根据接口规范,创建PDO与MYSQLI两个文件来实现接口
PDO
<?php
namespace DETAIL;
//导入PDO
use 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 = '';
//遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$params
foreach ($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;
}
}
MYSQLI
<?php
namespace 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 = '';
//遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$params
foreach ($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();
}
}
最后创建一个通用类文件
<?php
namespace 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();
}
}
最后调用
<?php
namespace 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,很多时候都是一行一行的自己慢慢找。输入法错误也有,有时候明明看上去正确的代码,就因为输入法变成全角了而错误
然后注释是个好东西,建议和我一样初学的,一定要习惯写注释,帮助学习有好处