0830作业
实例
echo '
echo '
//连接数据库
require 'demo1.php';
//准备SQL语句
$sql = "SELECT `id`,`name`,`age` ,`salary` FROM `staff` WHERE `age` > ? && `salary` > ?;";
// 创建预处理对象,mysqli_stmt_init() 函数初始化声明并返回 mysqli_stmt_prepare() 使用的对象。
$stmt = $mysqli->stmt_init();
if ($stmt->prepare($sql)) {
//绑定参数,绑定一个参数到指定的变量名,将用户数组与sql语句的占位符进行绑定
$stmt->bind_param('ii', $age,$salary);
//设置参数
$age =25;
$salary=8000;
if ($stmt->execute()) {
//获取结果集并放到缓存区
$stmt->store_result();
//将结果集中的列绑定到变量上
$stmt->bind_result($id,$name,$age, $salary);
//结果集是否不为空,只有不为空的时候才遍历
if ($stmt->num_rows > 0) {
// 循环遍历结果集,fetch()每次获取一条记录,并将指针自动下移
while ($stmt->fetch())
{
echo '
id:'.$id.'---姓名:' .$name.'---年龄:' .$age.'---工资:' .$salary.'
'.'}
}
else
{
exit('
当前表中没有数据
');}
// 释放结果集
$stmt->free_result();
}
else
{
//返回执行阶段的出错信息,$stmt->errno出错代码,出错描述
exit($stmt->errno. ': ' . $stmt->error);
}
}
else
{
//返回sql语句检测阶段的出错信息
exit($stmt->errno. ': ' . $stmt->error);
}
//注销stmt对象
$stmt->close();
//关闭连接
$mysqli->close();
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.问答:PDO的优势?
PDO有非常多的操作却是MySQL扩展库所不具备的:
1、PDO真正的以底层实现的统一接口数库操作接口,不管后端使用的是何种数据库,
如果代码封装好了以后,应用层调用基本上差不多的,当后端数据库更换了以后,应用层代码基本不用修改.
2、PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3、PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级.
4、PDO可以防止SQL注入,确保数据库更加安全使用语句预处理将帮助你免于SQL注入攻击。
总之就是,PDO应用的比mysqli较广泛,使用起来较方便,PDO可以使用相同的sql语句执行不同的数据库,
而mysqli只能执行mysql一种数据库。并且PDO有预处理,一条预处理语句是一条预编译的 SQL 语句,它可以被使用多次,
每次只需将数据传至服务器。而且可以对使用占位符的数据进行安全处理,防止SQL注入攻击。
实例
/**
* PDO PHP数据对象,是PHP操作所有数据库的抽象层,提供了一个统一的访问接口
*/
echo '
// 数据源:设置数据库的类型,以及数据库服务器和默认的数据库
$dsn = 'mysql:host=127.0.0.1; dbname=php';
//用户名
$user = 'root';
//密码
$pass = 'root';
//实例化PDO类,创建pdo对象,并完成了数据库的连接
try {
//代码区
$pdo = new PDO($dsn, $user, $pass);
//echo '
}
catch (PDOException $e)
{
//异常处理
die('Connect ERROR! :'. $e->getMessage());
}
// 关闭连接
//$pdo = null;
//unset($pdo);
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
/**
* 新增记录
*/
echo '
//1连接数据库
$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
//2.准备SQL语句,占位符我们不再用?,用"命名占位符"
$sql = "INSERT `user` SET `name`= :name , `email`= :email, `password`= sha1(:password)";
//3.创建预处理对象
$stmt = $pdo->prepare($sql);
//4.执行添加
$stmt->execute(['name'=>'周芷若1','email'=>'[email protected]','password'=>'66896']);
$stmt->execute(['name'=>'周芷若2','email'=>'[email protected]','password'=>'66698']);
$stmt->execute(['name'=>'周芷若3','email'=>'[email protected]','password'=>'80666']);
$stmt->execute(['name'=>'周芷若4','email'=>'[email protected]','password'=>'69780']);
$stmt->execute(['name'=>'周芷若5','email'=>'[email protected]','password'=>'12676']);
echo '
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
echo '
//连接数据库
$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
//准备SQL语句,占位符我们不再用?,用"命名占位符"
$sql = "UPDATE `user` SET `name`= :name ,`email`= :email WHERE `id` = :id";
//创建预处理对象
$stmt = $pdo->prepare($sql);
$stmt->execute(['name'=>'赵敏','email'=>'[email protected]','id'=>90]);
echo '
$stmt = null;
// 关闭连接
$pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
/**
* 删除记录
*/
echo '
//连接数据库
$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
//准备SQL语句,占位符我们不再用?,用"命名占位符"
$sql = "DELETE FROM `user` WHERE `id`>:id";
//创建预处理对象
$stmt = $pdo->prepare($sql);
if ($stmt->execute(['id'=>2]))
{
// rowCount(): 返回受影响的记录数量
echo '
}
else
{
echo '
// errorInfo() 返回一个关于上一次语句句柄执行操作的错误信息的数组
// 0 SQLSTATE 错误码, 1具体驱动错误码, 2具体驱动错误信息。
print_r($stmt->errorInfo());
exit();
}
$stmt = null;
// 关闭连接
$pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
echo '
//连接数据库
$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
//准备SQL语句,占位符我们不再用?,用"命名占位符"
$sql = "SELECT `name`,`email` FROM `user` WHERE `id`>:id";
//创建预处理对象
$stmt = $pdo->prepare($sql);
//执行查询
$stmt->execute(['id'=>88]);
// 一次性取出
//$rows = $stmt->fetchAll();
//foreach ($rows as $row) {
// echo 'name: ',$row['name'],', email: ',$row['email'],'
';
//}
//因为fetch()取出来的数据,包括索引数组和关联数组
//PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组,就是结果只显示关联数组部分
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo var_export($row),'
';
}
运行实例 »
点击 "运行实例" 按钮查看在线实例
8.问答:获取结果集记录数量的正确方式是什么?
方式1、使用count()来计算查询结果集转换为数组后的单元数再用fetchColumn()来获取结果集
方式2、rowCount()是返回SQL语句执行后影响的行数,结果看上去是正确的,但是是有问题的
总之,方式1 使用count()再用fetchColumn()来获取结果集记录数量的正确方式。