数据库连接
<?php
namespace pdo_edu;
use PDO;
// 1、读操作 select
//2、 写操作 insert update delete
// DURD 增删改查
// 三步走
// 1、连接数据库
// 2、执行操作 DURD 增删改查
// 3、关闭;连接
// 1、连接数据库
$dsn = 'mysql:host:localhost;dbname=bittel;port:3306;charset=utf8';
$username = 'root';
$password = 'root';
$db = new PDO( $dsn,$username,$password );
// 打印确认是否连接成功
var_dump($db);
// 2、执行操作 DURD 增删改查
// UNSIGINED 无符号 只能正数
// PRIMARY 主键
// CHAR 固定的宽度
// VARCHAR 可变的宽度
// TINYINT 较小的整数
// innoDB支持杭锁 列所 支持全文检索 论坛 强互动的 主流
// MySAM 查询速度超快 文章系统去查询
// CREATE TABLE `bittel`.`staff` ( `id` INT UNSIGNED NOT NULL COMMENT '主键' ,
// `name` VARCHAR(30) NOT NULL COMMENT '姓名' , `sex` TINYINT(1) NOT NULL
// DEFAULT '1' COMMENT '性别1是女 0是男' , `email` VARCHAR(100) NOT NULL COMMENT '邮箱' ) ENGINE = InnoDB;
// 3、关闭;连接(可选,建议写)
// 销毁连接对象
// $db =null; 或
// unset($db)
数据库插入-1
<?php
namespace pdo_edu;
use PDO;
use ValueError;
// 插入
// 三步走
// 1、连接数据库
// 2、执行操作 DURD 增删改查
// 3、关闭;连接
// 1、连接数据库
require __DIR__.'/config/connect.php';
// 打印确认是否连接成功
var_dump($db);
echo '<hr>';
// 2、执行操作 DURD 增删改查
// 新增
// 列表1
// INSERT INFO 表明 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)
// 简化
// INSERT 表名 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)
// 如果mysql 且单条 还可以简化 建议
// INSERT 表名 SET 字段名1=值1,字段名2=值2,。。。
// 查询
// SELECT * FROM `staff` WHERE `id`
// 1、SQL 关键字全部大写
// 2、 表名、字段名必须加 反引号 防和关键字冲突
// 主键不能写
// $sql = 'INSERT `staff` SET `id`';
$sql = "INSERT `staff` SET `name`='admin',`sex`=1,`email`='123@qq.com'";
// 创建 sql 语句对象
// 方式一
// new PDOSlatement
// 方式二 推荐 准备阶段
$stmt = $db -> prepare($sql);
// 打印确认
// var_dump( $stmt);
// 执行sql
if ($stmt->execute()){
echo '插入成功';
}
// 3、关闭;连接(可选,建议写)
// 销毁连接对象
// $db =null; 或
// unset($db)
数据库插入-2
<?php
// pdo 预处理
// 预处理的本质:sql 语句 中的数据,是动态绑定的
// 动态绑定:只有在执行sql时,才绑定真实的数据
// 静态绑定:数据直接写到sql中
// 1、静态 select * from staff where id >10
// 2、动态(预处理):select * from staff where id >?
// 1、匿名参数 ? +索引数组 [ ]
namespace pdo_edu;
use PDO;
// 连接
$db = new PDO('mysql:dbname=bittel','root','root');
// CURD :INSERT 插入
// $sql ='INSERT `staff` set `name`="admin", `sex`=1,`email`="123@qq.cpom"';
$sql ='INSERT `staff` SET `id`=?,name`=?, `sex`=?,`email`=?;';
// sql 对象语句 ——> sql 语句 模板对象 ——> 预处理对象
// 执行完会产生一个对象 惯例
$stmt =$db->prepare($sql);
// sql 语句中的占位符 ? ,给他绑定真实数据 绑定关系必须是一 一对应
$data = [22,'小狗',0,'123@qq.com'];
// 执行 sql 的方法
$stmt->execute($data);
// echo $stmt;
echo '<hr>';
// print_r($stmt);
//验证:打印的sql预处理命令 调试常用的方法
// $stmt->debugDumpParams();
// 输出
echo '新增成功,id='.$db->lastInsertId().'<hr>';
数据库插入-3
<?php
// pdo: 预处理
// 预处理的本质: sql语句中的数据,是动态绑定
// 动态绑定: 只有在执行sql时,才绑定真实的数据
// 静态绑定: 数据直接写到sql中
// 1. 静态: select * from staff where id > 10
// 2. 动态(预处理): select * from staff where id > ?
// 2、命名参数 + 关联数组
namespace pdo_edu;
use PDO;
// 连接
$db = new PDO('mysql:dbname=bittel', 'root', 'root');
// CURD: INSERT
// 匿名参数: ?
$sql = 'INSERT `staff` SET `name`=:name,`sex`=:sex,`email`=:email;';
// sql语句->sql语句模板对象->预处理对象
$stmt = $db->prepare($sql);
// 关联数组
// $data = [':name'=>'小猫',':sex'=>'0',':email'=>'456@qq.com',];
// 简写 数据来源不写死
$data = ['name'=>'小猫','sex'=>'0','email'=>'456@qq.com',];
// 执行sql
// $stmt->execute($data);
// var_dump( $stmt->execute($data));
if($stmt->execute($data)){
echo '新增成功ID:'.$db->lastInsertId();
}else{
echo '执行失败';
$stmt->debugDumpParams();
print_r($stmt->errorInfo());
}
// 验证: 打印sql预处理命令
// echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
// 用哪个?
// 1. ? : 代码少, 结合上下文才知道语义
// 2. ":name": 语义化,可读性
// 我用第一个: ?
//
参数绑定-值绑定
<?php
// 3 参数绑定: 值绑定 bindValue()
/**
* 为什么要单独设置参数,而不是在execute()时传参?
* 1. execute()默认参数都是字符类型
* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
* 3. 但是在分页操作时,会导致错误
* 4. 所在,在参数绑定时, 强制类型限制,就很有必要
*/
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
// $stmt = $db->prepare($sql);
// 太长的语法 用 heredoc 语法
// CURD: INSERT
// $sql = 'INSERT `staff` SET `name`= ?,`sex`= ?,`email`= ?;';
$sql = <<< SQL
INSERT `staff`
SET `name`= ?,`sex`= ?,`email`= ?;
SQL;
// $stmt = $db->prepare($sql);
$stmt = $db->prepare($sql);
// bindValue( ) 值绑定,静态绑定,所以参数必须要 有一个确定的值
// bindValue(key,value,type(默认字符串),size): 匿名占位符 ,索引是从1开始的
// $stmt->bindValue(1, '悟空', PDO::PARAM_STR);
// $stmt->bindValue(2, 1, PDO::PARAM_INT);
// $stmt->bindValue(3, 'wukong@qq.com', PDO::PARAM_STR);
// 一 一 绑定 // 达不到 给出不数据自动更新
// list($name,$sex,$email)=['小牛',0,'901@qq.com'];
// $stmt->bindValue(1, $name, PDO::PARAM_STR);
// $stmt->bindValue(2, $sex, PDO::PARAM_INT);
// $stmt->bindValue(3, $email, PDO::PARAM_STR);
// list($name,$sex,$email)=['小龙',0,'901@qq.com'];
// $stmt->bindValue(1, $name, PDO::PARAM_STR);
// $stmt->bindValue(2, $sex, PDO::PARAM_INT);
// $stmt->bindValue(3, $email, PDO::PARAM_STR);
// 执行sql
$stmt->execute();
echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
// print_r($stmt->execute());
// if($stmt->execute()){
// echo '新增成功,id='.$db->lastInsertId();
// }else{echo'执行失败';}
参数绑定-引用绑定
<?php
// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
/**
* 为什么要单独设置参数,而不是在execute()时传参?
* 1. execute()默认参数都是字符类型
* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
* 3. 但是在分页操作时,会导致错误
* 4. 所在,在参数绑定时, 强制类型限制,就很有必要
*/
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
$sql = <<< SQL
INSERT `staff`
SET `name`= ?,`sex`= ?,`email`= ?;
SQL;
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
$stmt = $db->prepare($sql);
// print_r($stmt);
// 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名
$stmt->bindParam(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$sex,PDO::PARAM_INT);
$stmt->bindParam(3,$email,PDO::PARAM_STR);
list($name,$sex,$email) = ['小马',0,'123@qqq.com'];
// 新增一条 覆盖上面一条 模板更新 $stmt->bindParam(1,$name,PDO::PARAM_STR);
list($name,$sex,$email) = ['小猴',0,'123@qqq.com'];
// 执行sql
if ($stmt->execute()) {
echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
}else{echo '执行失败';}
// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
// 以后只要传入不同数据,就可以执行不同的操作了、
// 以后建议只用 引用绑定
参数绑定-引用绑定-别名绑定
<?php
// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
// 同时插入多条数据 zuoye6 每次直插入一条数据
/**
* 为什么要单独设置参数,而不是在execute()时传参?
* 1. execute()默认参数都是字符类型
* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
* 3. 但是在分页操作时,会导致错误
* 4. 所在,在参数绑定时, 强制类型限制,就很有必要
*/
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
$sql = <<< SQL
INSERT `staff`
SET `name`= ?,`sex`= ?,`email`= ?;
SQL;
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
$stmt = $db->prepare($sql);
// print_r($stmt);
// 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名
$stmt->bindParam(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$sex,PDO::PARAM_INT);
$stmt->bindParam(3,$email,PDO::PARAM_STR);
// 准备多条数据 使用二维数组来模拟
$data = [
['小蛇',1,'123@qq.com'],
['小龙',0,'456@qq.com'],
['小黑',1,'789@qq.com'],
];
// 使用 foreach 循环 来获取每组数据 ,然后使用 list() 进行解构获取每组数据的值
foreach($data as list($name,$sex,$email) ){
// 然后每组数据进行执行 数据库插入操作
// 执行sql
$stmt->execute();
echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
}
// 执行sql
// if ($stmt->execute()) {
// echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
// }else{echo '执行失败';}
// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
// 以后只要传入不同数据,就可以执行不同的操作了、
// 以后建议只用 引用绑定
参数绑定-引用绑定-
<?php
// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
// 同时插入多条数据 zuoye6 每次直插入一条数据
// 检测数据是否插入成功、
/**
* 为什么要单独设置参数,而不是在execute()时传参?
* 1. execute()默认参数都是字符类型
* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
* 3. 但是在分页操作时,会导致错误
* 4. 所在,在参数绑定时, 强制类型限制,就很有必要
*/
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
$sql = <<< SQL
INSERT `staff`
SET `name`= ?,`sex`= ?,`email`= ?;
SQL;
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
$stmt = $db->prepare($sql);
$data = ['小鸡',1,'123@qq.com'];
// 然后每组数据进行执行 数据库插入操作
// 读:select
// 写 :insert updata delete 成功后 会返回 表中受影响的记录数据量
// rowCount()返回受影响的记录数量 判断是否新增成功
// 执行sql
// $stmt->execute($data)? true :false;
if ($stmt->execute($data)) {
if($stmt->rowCount() >0){
echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
}else{
echo '新增失败';
}
}else{
echo 'sql执行失败';
print_r( $stmt->errorInfo());
}
// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
// 以后只要传入不同数据,就可以执行不同的操作了、
// 以后建议只用 引用绑定
/**背下来
* tips:
* 1. else : 应该用于开发调试阶段, 生产环境中应该将错误信息集中写到日志文件中
* 2. sql执行失败很常见,通常是语法错误,例如字段name写成了name1
* 3. 新增失败通常是权限不足,如没有插入权限或当前表被锁定只读等,也可能是磁盘空间满了
*/
数据库更新
<?php
// 更新操作
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
// 更新操作 UPDATA -- 更新条件 必写
$sql = <<< SQL
UPDATE `staff`
SET `name`= ?,`sex`= ?,`email`= ?
WHERE `id`=?;
SQL;
// 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句
// strpos ,stripos 忽略大小写
if(false ===stripos($sql,'where')){
// 执行结束当前脚本 不会越过此条语句
exit('禁止无条件更新');
}
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
$stmt = $db->prepare($sql);
$data = ['小红',1,'090@qq.com',33];
if($stmt->execute($data)){
if($stmt->rowCount()>0){
echo '更新成功记录,数量:'.$stmt->rowCount();
}else{
// 主要用于检测是否重复执行 再次执行时就会执行到这儿
echo '更新失败';
print_r($stmt->errorInfo());
}
}else{
echo 'sql执行失败';
print_r($stmt->errorInfo());
}
数据库删除操作
<?php
// 删除操作
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
// 删除操作 DELETE FROM -- 更新条件 必写
// $sql = 'DELETE FROM `staff` WHERE `id`=?;';
$sql = 'DELETE FROM `staff` WHERE `id` = ?;';
// 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句
// strpos ,stripos 忽略大小写
if(false ===stripos($sql,'where')){
// 执行结束当前脚本 不会越过此条语句
exit('禁止无条件删除');
}
// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
$stmt = $db->prepare($sql);
$data = [34];
if($stmt->execute($data)){
if($stmt->rowCount()>0){
echo '删除成功记录,数量:'.$stmt->rowCount();
}else{
// 主要用于检测是否重复执行 再次执行时就会执行到这儿
echo '删除失败';
print_r($stmt->errorInfo());
}
}else{
echo 'sql执行失败';
print_r($stmt->errorInfo());
}
数据库查询操作 fetch+while·
<?php
// 查询操作 fetch() + while()
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
// 查询 select
$sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';
$stmt = $db->prepare($sql);
// 执行sqL
// if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值
// 因此需要变更下数据类型
// $num =5;
// $stmt->bindParam(1,$num,PDO::PARAM_INT);
// 简化 因为查询条件是一个 所以值绑定合适
$stmt->bindValue(1,5,PDO::PARAM_INT);
if($stmt->execute()){
echo '查询成功记录,数量:';
$stmt->debugDumpParams();
// 使用 fetch()逐条 获取,指针自动后移指向下一条
// 获取模式的过滤器: PDO::FETCH_ASSOC 只返回关联部分数组
// $staff = $stmt->fetch();
// 第一个
// $staff = $stmt->fetch(PDO::FETCH_ASSOC);
// if($staff){
// printf('<pre>%s<pre>',print_r( $staff,true));
// }else{
// echo '没有了';
// }
// 第二个 依次查询,可以使用while 循环
// $staff = $stmt->fetch(PDO::FETCH_ASSOC);
// if($staff){
// printf('<pre>%s<pre>',print_r( $staff,true));
// }else{
// echo '没有了';
// }
while( $staff = $stmt->fetch(PDO::FETCH_ASSOC)){
printf('<pre>%s<pre>',print_r( $staff,true));
}
}else{
echo 'sql执行失败';
print_r($stmt->errorInfo());
}
数据库查询操作 fetchALL() + foreach()
<?php
// 查询操作 fetchALL() + foreach()
namespace pdo_edu;
use PDO ;
// 连接
$db = new PDO( 'mysql:dbname=bittel','root','root');
// 查询 select
$sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';
$stmt = $db->prepare($sql);
// 执行sqL
// if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值
// 因此需要变更下数据类型
// $num =5;
// $stmt->bindParam(1,$num,PDO::PARAM_INT);
// 简化 因为查询条件是一个 所以值绑定合适
$stmt->bindValue(1,5,PDO::PARAM_INT);
if($stmt->execute()){
$staffs =$stmt->fetchAll(PDO::FETCH_ASSOC);
// 二维数组打印
print_r($staffs).'<br>';
echo '<hr>';
foreach($staffs as $staff){
printf('<pre>%s</pre>',print_r($staff,true));
}
}else{
echo 'sql执行失败';
print_r($stmt->errorInfo());
}