面向对象,PDO基础知识,PDO预处理,SQL事务处理

PDO:数据库抽象层

PDO特点:跨数据库,支持预处理,支持事务

PDO的基本使用

1,实例化对象
实例化对象( new PDO() )  
$pdo=new PDO(参数1,参数2,参数3);
    参数:
        1,数据库类型:主机名,数据库名,字符集,端口号(数据库类型必须小写)
        2,用户名
        3,密码
$pdo=new PDO('mysql:host=localhost;dbname=test2;charset=utf8;port=3306','root','admin');
2,发送sql语句
查询用(query),执行(增删改)用exec
    如:$pdo->query('select * from test2')
    query:返回结果集对象;
    exec:返回受影响的行数;
3,处理查询结果
foreach:遍历结果集对象,如:foreach($res as $v =>$k){}
fetch:提取一条数据,如:$rows=$res->fetch();
fetchAll:提取所有数据;$rows=$res->fetchAll();
函数
$pdo->lastInsertId();获取最后插入的id
$pdo->errorInfo();获取错误信息;

  
  
    1. <?php
    1. //使用pdo连接数据库
    2. //1,实例化对象
    3. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin') or die('数据库连接失败');
    1. //发送SQL语句,查询用query,执行(增删改)用exec()
    2. $res=$pdo->query('select *from test2');
    3. $res=$pdo->exec("update test2 set name='张三1' where id=44");
    1. //3,处理结果;
    2. //3,1 query有结果集的情况
    3. //3,1,1,foreach
    4. foreach($res as $k=>$v){
    5. var_dump($k);
    6. var_dump($v);
    7. }
    8. //3,1,2,fetch 只返回一条结果集
    9. $res->fetch();
    10. var_dump($res);
    11. //3,1,3,fetchAll返回所有的结果集
    12. $rows=$res->fetchAll();
    13. var_dump($rows);
    14. //返回查询结果总数
    15. //3,2 exec没有结果集直接返回受影响的行数
    16. echo $res;
    1. ?>

PDO预处理

1,实例化对象;$pdo=new PDO()
2,发送预处理指令;两种方法:1:?; 2:起别名:name
    $sql='select * from test2 where name=? and passwd=? ';
    $stmt=$pdo->prepare($sql);
3,绑定参数 bindValue;三种方法:1,bindValue; 2,bindParam; 3,数组
    $stmt->bindValue(1,$name);
    $stmt->bindValue(2,$passwd);
4,执行发送
    $stmt->execute();
5,处理返回结果
    $res=$stmt->fetch()

代码部分
   
   
    1. <?php
    1. //pdo预处理
    2. //1,实例化对象
    3. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;prot=3306','root','admin');
    4. //2,发送sql指令
    5. //1,?形式;
    6. $sql="select *from test2 where name=? and passwd=?";
    7. //2,: 起别名
    8. //$sql="select * from test2 where name=:name and passwd=:passwd";
    9. $stmt=$pdo->prepare($sql);
    1. //3,绑定参数
    2. //1,bindValue
    3. $stmt->bindValue(1,'张三');
    4. $stmt->bindValue(2,'admin');
    5. //2,bindParam,次方法中第二个参数不能为固定值
    6. $stmt->bindParam(1,$name);
    7. $stmt->bindParam(2,$passwd);
    8. //3,array()数组形式
    9. $arr=array('张三','admin');//?
    10. $arr=array(':name'=>'张三',':passwd'=>'admin');//:起别名
    1. //4,发送执行
    2. $stmt->execute($arr);//数组形式时在这里必须传入数组
    3. $res=$stmt->fetchAll(PDO::FETCH_NUM);
    4. var_dump($res);
    1. ?>

MySQL事务处理

将多条sql语句(增删改)作为一个操作单元,要么都成功,要么都失败;
    ps:操作表必须是innoDB
事务处理的步骤:
    $pdo->beginTransaction():开启事务
    $pdo->commit():提交一次事务
    $pdo->rollback():回滚一次事务

  代码部分
   
   
    1. <?php
    2. //mysql事务处理
    3. //实例化对象
    4. $pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin');
    5. //开启事务
    6. $pdo->begintransaction();
    1. try{
    2. //sql操作
    3. $num=$pdo->exec("update test2 set name='张三1111' where id=8");
    1. if($num <1 ){
    2. throw new PDOException('第一个失败了',10086);//抛出错误
    3. }
    1. //sql操作
    2. $num1=$pdo->exec("update test2 set name='李四2222' where id=9");
    3. if($num1 <1){
    4. throw new PDOException('第二个失败了',10010);//抛出错误
    5. }
    6. if($num>=1 && $num1 >=1){
    7. $pdo->commit();//成功的话提交事务
    8. echo "两个都成功了";
    9. }
    1. }catch(PDOException $e){
    2. $pdo->rollback();// 如果失败回滚
    3. echo $e->getMessage();
    4. echo $e->getCode();
    5. }
    1. ?>

setAttribute

设置结果集提取的类型:$pdo->setAttribute();
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MEDO,PDO::FETCH_NUM);

PDO::FETCH_ASSOC:关联数组
PDO::FETCH_NUM:索引数组

设置结果集键名的大小写:
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE:UPPER)
(PDO::ATTR_CASE,PDO::CASE:LOWER)

设置错误处理模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)

获得模式:$pdo->getAttribute(PDO::ERRMODE)
自主封装的PHP ORM框架,面向对象PDO数据库操作,API框架,支持Get/Post/Put/Delete多种请求方式。 代码示例: <?php use Models\User; require '../application.php'; require '../loader-api.php'; //适合查询,如:获取用户列表或者单个用户信息 execute_request(HttpRequestMethod::Get, function() { $action = request_action(); //判断是否存在 if ($action == 1) { list($type, $value) = filter_request(array( request_int('type', 1, 2, 3), //1.用户名 2.邮箱 3.手机号 request_string('value'))); $type_field_map = array( 1 => User::$field_username, 2 => User::$field_email, 3 => User::$field_phone ); if ($type == 2 && !is_email($value) || $type == 3 && !is_mobilephone($value)) { die_error(USER_ERROR, $type_field_map[$type]['name'] . '格式无效'); } $user = new User(); $user->set_where_and($type_field_map[$type], SqlOperator::Equals, $value); $result = $user->exists(create_pdo()); echo_result($result ? 1 : 0); //存在返回1,不存在返回0 } //查询单条信息 if ($action == 2) { list($userid) = filter_request(array( request_userid())); //查询单条数据 $user = new User($userid); //set_query_fields可以指定查询字段,下面两种写法均可 //$user->set_query_fields('userid, username, email'); //$user->set_query_fields(array(User::$field_userid, User::$field_username, User::$field_email)); //还可设置where条件进行查询 //$user->set_where_and(User::$field_status, SqlOperator::Equals, 3); //$user->set_where_and(User::$field_truename, SqlOperator::IsNullOrEmpty); //$user->set_where_and(User::$field_age, SqlOperator::In, array(27, 29)); //$user->set_where_and(User::$field_regtime, SqlOperator::LessThan, '-6 month'); //创建数据库连接 $db = create_pdo(); $result = $user->load($db, $user); //也可以用Model类的静态方法 //$result = Model::load_model($db, $user, $user); if (!$result[0]) die_error(PDO_ERROR_CODE, '获取用户信息时数据库错误'); if (!$user) di
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值