Correcting teacher:Guanhui
Correction status:qualified
Teacher's comments:写的很好,前面学的前端也没忘,不过一定要多练,学会数据库操作可以写很多东西了,可以发挥想象试着写一些功能。
extension=mysqli
去掉分号注释extension_dir
目录是否正确phpinfo();
函数显示php所有配置信息var_dump(extension_loaded('mysqli'));
返回true加载成功,否则加载失败var_dump(get_loaded_extensions());
返回所有加载项var_dump(function_exists('mysqli_connect'));
检查指定的函数是否已经定义
mysqli类的对象主要控制PHP和MYSQL数据库服务器之间的连接,数据库选择,发送SQL语句,以及设置字符集。
$mysql = new mysqli('localhost','用户名','密码','数据库名');
//建立mysql连接,并且打开指定数据库
$mysql = @new mysqli('localhost','root','wang1111','tp5');
print_r($mysql);
connect_errno
返回最后一次的错误代码
connect_error
返回最后一次的错误信息描述
errno
返回最近一次的错误代码
error
返回最近一次的错误信息描述
die();
函数输出一条消息,并退出当前脚本
@
PHP中用作错误控制操作符,可以忽略错误信息
//如果数据库账号密码不对的话,就返回错误信息
if($mysqli->connect_errno){
//如果存在连接错误
//connect_errno返回最后一次的错误代码
die("CONNECT_ERROR:".$mysqli->connect_error);
//die() 函数输出一条消息,并退出当前脚本
//connect_error返回最后一次的错误信息描述
}
$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();//关闭先前打开的数据库连接
这个类的对象包含SELECT查询的结果、获取结果集中数据的成员方法,以及和查询的结果有关的成员属性。
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()抓取所有的结果行并且以关联数组,
数值索引数组,或者两者皆有的方式返回结果集 */
mysqli_result::fetch_array()
以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_array();
print_r($a);
mysqli_result::fetch_assoc()
以一个关联数组方式抓取一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_assoc();
print_r($a)
mysqli_result::fetch_row()
以一个枚举数组方式返回一行结果
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->fetch_row();
print_r($a)
$mysqli_result::num_rows
获取结果中行的数量
$sql = "SELECT `username`,`password` FROM `user`";
$res = $mysql->query($sql);
$a = $res->num_rows;
print_r($a)
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类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。
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);
mysqli_stmt::execute()
执行 prepared 查询
//执行预处理语句execute()
$a = $stmt->execute();
var_dump($a);
<!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);
<?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);
函数名 | 描述 |
---|---|
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() | 关闭先前打开的数据库连接 |
函数名 | 描述 |
---|---|
fetch_all() | 抓取所有的结果行并且以关联数组,数值索引数组,或者两者皆有的方式返回结果集 |
fetch_array() | 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果 |
fetch_assoc() | 以一个关联数组方式抓取一行结果 |
fetch_row() | 以一个枚举数组方式返回一行结果 |
num_rows | 获取结果中行的数量 |
free() | 释放与一个结果集相关的内存 |
函数名 | 描述 |
---|---|
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() | 释放给定语句处理存储的结果集所占内存 |
<?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();