MySQLi扩展库
一、MySQLi扩展库安装
1. 在php.ini文件中找到extension=mysqli
去掉分号注释
2. 在php.ini文件中查看extension_dir
目录是否正确
3.检测MySQLi扩展库是否已经安装成功
var_dump(extension_loaded('mysqli'));
返回true加载成功,否则加载失败
var_dump(get_loaded_extensions());
返回所有加载项
var_dump(function_exists('mysqli_connect'));
检查指定的函数是否已经定义
二、mysqli类
1.mysqli类
mysqli类的对象主要控制PHP和MYSQL数据库服务器之间的连接,数据库选择,发送SQL语句,以及设置字符集。
2.连接数据库
$mysql = new mysqli('localhost','用户名','密码','数据库名');
//建立mysql连接,并且打开指定数据库
$mysql = @new mysqli('localhost','root','wang1111','tp5');
print_r($mysql);
3.异常错误处理
//如果数据库账号密码不对的话,就返回错误信息
if($mysqli->connect_errno){
//如果存在连接错误
//connect_errno返回最后一次的错误代码
die("CONNECT_ERROR:".$mysqli->connect_error);
//die() 函数输出一条消息,并退出当前脚本
//connect_error返回最后一次的错误信息描述
}
4.sql语句执行
$mysqli::set_charset()
设置默认的客户端字符集
$mysqli::query()
在数据库内执行查询
失败返回false,成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回TRUE。
$multi_query()
执行多条SQL语句的查询
第一条语句执行成功返回true,否则返回false,并且后面的sql语句都不会执行成功
$mysqli::prepare()
)准备(prepare)需要执行的 SQL 语句
mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 FALSE。
$mysqli::insert_id
返回上次查询中所自动生成的 ID
$mysqli::close()
关闭先前打开的数据库连接
更新数据
//- 更新一条数据
$mysql = new mysqli('localhost','root','wang1111','tp5');
if($mysql->connect_errno){
die("CONNECT_ERROR:".$mysql->connect_error);
}
$mysql->set_charset('utf8');
$sql = "UPDATE staff SET name='孙悟空' WHERE name='郭靖'";
$res = $mysql->query($sql);
var_dump($res);
//插入一条数据
$sql = "INSERT INTO user(`username`,`password`) VALUES ('Timo','Timo')";
//反引号``防止和关键字冲突
$res = $mysql->query($sql);
if($res){
echo "恭喜注册成功,您是本站的第".$mysql->insert_id."位用户";
//$mysqli::insert_id返回上次查询中所自动生成的 ID
}
//删除数据
$sql = "DELETE FROM `user` WHERE `id` >=5";
$res = $mysql->query($sql);
if($res){
echo $mysql->affected_rows.'条记录受影响<br>';
}else{
echo "ERROE:".$mysql->errno.":".$mysql->error;
}
//查询操作
/* 失败时返回 FALSE, 通过mysqli_query()
成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN
查询会返回一个mysqli_result 对象,其他查询则返回TRUE。 */
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
var_dump($res);
$mysql->close();//关闭先前打开的数据库连接
三、mysqli_result类
1.mysqli_result类
这个类的对象包含SELECT查询的结果、获取结果集中数据的成员方法,以及和查询的结果有关的成员属性。
2.mysqli_result::fetch_all()
抓取所有的结果行并且以关联数组,数值索引数组,或者两者皆有的方式返回结果集。
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_all();
print_r($a);
/* mysqli_result::fetch_all()抓取所有的结果行并且以关联数组,
数值索引数组,或者两者皆有的方式返回结果集 */
3.mysqli_result::fetch_array()
以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_array();
print_r($a);
4.mysqli_result::fetch_assoc()
以一个关联数组方式抓取一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_assoc();
print_r($a)
5.mysqli_result::fetch_row()
以一个枚举数组方式返回一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_row();
print_r($a)
6.$mysqli_result::num_rows
获取结果中行的数量
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->num_rows;
print_r($a)
7.mysqli_result::free()
释放与一个结果集相关的内存
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->num_rows;
var_dump($a);
echo '<hr>';
$b = $res->free();
var_dump($b);
四、mysqli_stmt类
1.mysqli_stmt类(预处理机制)
mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。
2.mysqli_stmt::bind_param()
绑定变量参数到 prepared 语句
//mysql预处理机制,防止sql注入
//1.建立到mysql的连接,并且打开指定的数据库
$mysqli = new mysqli('localhost','root','wang1111','tp5');
if($mysqli->connect_errno){
die("CONNECT_ERROR:".$mysqli->connect_error);
}
//2.设置字符集
$mysqli->set_charset('utf-8');
$sql = "INSERT INTO `user`(`username`,`password`,`age`) VALUES(?,?,?)";
//准备需要执行的SQL语句
//返回一个statement对象,如果发生错误返回false
$stmt = $mysqli->prepare($sql);
//var_dump($res);
//bing_param()绑定变量参数到prepared语句
$username = 'php.cn';
$password = md5('php.cn');
$age = 12;
$stmt->bind_param('ssi',$username,$password,$age);
var_dump($stmt);
3.mysqli_stmt::execute()
执行 prepared 查询
//执行预处理语句execute()
$a = $stmt->execute();
var_dump($a);
五、实战练习(表单)
1.防sql注入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>实战练习</title>
<style>
body{
margin:0;
padding: 0;
box-sizing: border-box;
background-color: gainsboro;
display:flex;
justify-content: center;
align-items: center;
}
.content{
width: 500px;
height: 300px;
border-radius: 10px;
box-shadow: 0 0 5px #888;
background-color: #fff;
position:absolute;
top:30%;
padding:10px;
}
</style>
</head>
<body>
<table class="content">
<form action="enter.php" method="post">
<tr>
<td><label for="username">账号:</label></td>
<td><input type="text" name="username" id="username"></td>
</tr>
<tr>
<td><label for="password">密码:</label></td>
<td><input type="password" name="password" id="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="sub" value="提交"></td>
</tr>
</form>
</table>
</body>
</html>
<?php
//数据接收
$username = $_POST['username'];
$password = $_POST['password'];
//连接数据库
$mysqli = @new mysqli('localhost','root','wang1111','tp5');
if($mysqli->connect_errno){
die("CONNECT_ERROR:".$mysqli->connect_error);
}
$mysqli->set_charset('utf-8');
//mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理
//使用问号参数占位符来构成预处理sql语句
$sql = "SELECT * FROM `user` WHERE `username` = ? AND `password` = ?";
//$res = $mysqli->query($sql);
//var_dump($res);
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss',$username,$password);
$stmt->execute();
//get_result()获取结果
$res = $stmt->get_result();
print_r($res->num_rows);
2.不用sql注入
<?php
//数据接收
$username = $_POST['username'];
$password = $_POST['password'];
//连接数据库
$mysqli = @new mysqli('localhost','root','wang1111','tp5');
if($mysqli->connect_errno){
die("CONNECT_ERROR:".$mysqli->connect_error);
}
$mysqli->set_charset('utf-8');
//mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理
//使用问号参数占位符来构成预处理sql语句
$sql = "SELECT * FROM `user` WHERE `username` = '{$username}' AND `password` = '{$password}'";
$res = $mysqli->query($sql);
print_r($res->num_rows);
六、学习总结:
1.mysqli类
函数名 |
描述 |
affected_rows |
获取上次mysql操作受影响的行数 |
connect_errno |
返回最后一次连接数据库的错误代码 |
connect_error |
返回最后一次连接数据库的错误描述,类型为字符串 |
errno |
返回最近一次函数调用所产生的错误代码 |
error |
返回最近一次错误代码的描述,类型是字符串 |
set_charset() |
设置默认的客户端字符集 |
select_db() |
为数据库查询设置默认数据库 |
query() |
在数据库内执行查询 |
multi_query() |
执行多条SQL语句的查询,第一条语句执行成功返回true,否则返回false |
prepare() |
准备(prepare)需要执行的 SQL 语句,返回一个 statement 对象 |
insert_id |
返回上次查询中所自动生成的 ID |
mysqli::close() |
关闭先前打开的数据库连接 |
2.mysqli_result类
函数名 |
描述 |
fetch_all() |
抓取所有的结果行并且以关联数组,数值索引数组,或者两者皆有的方式返回结果集 |
fetch_array() |
以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果 |
fetch_assoc() |
以一个关联数组方式抓取一行结果 |
fetch_row() |
以一个枚举数组方式返回一行结果 |
num_rows |
获取结果中行的数量 |
free() |
释放与一个结果集相关的内存 |
3.mysqli_stmt类
函数名 |
描述 |
affected_rows |
返回受上次执行语句影响的总行数 |
num_rows |
返回语句结果集中的行数 |
errno |
返回最近一次语句调用的错误代码 |
error |
返回最后一条语句错误的字符串描述 |
prepare() |
准备执行 SQL 语句 |
bind_param() |
绑定变量参数到 prepared 语句 |
bind_result() |
绑定变量参数到 prepared 语句,用于结果存储 |
execute() |
执行 prepared 查询 |
get_result() |
获取 prepared 语句中的结果 |
fetch() |
获取 prepared 语句中的结果, 返回true,否则返回false |
free_result() |
释放给定语句处理存储的结果集所占内存 |
4.遍历结果集
<?php
//连接数据库
$localhost = 'localhost';
$username = 'root';
$password = 'wang1111';
$database = 'tp5';
$mysqli = new mysqli($localhost,$username,$password,$database);
//判断数据库连接是否正确
if($mysqli->connect_error){
die("CONNECT_ERROR:".$mysqli->error);
}
//查询数据库staff表的所有内容
$sql = "SELECT * FROM `user`";
//执行sql语句,并将结果集赋值给$res变量
$res = $mysqli->query($sql);
//遍历$res结果集
foreach($res as $value){
echo $value['id'].'|'.$value['username'].'|'.$value['password'].'|'.$value['age'].'<br>';
}
//释放资源,关闭数据库连接
$mysqli->free;
$mysqli->close();