«

PDO相关操作

时间:2023-3-1 21:08     作者:wen     分类: PHP


<?php 
//PDO(PHP Data Object)是PHP操作数据库的一个扩展
    //对mysql,mysqlI的优势
    //1.PDO为我们操作数据库提供了轻量级,一致性的借口,使用PDO不仅可以操作mysql数据库,还能操作oracle,mssql等数据库,因为PDO将访问不同数据库的方法封装了起来
    //2.PDO扩展对执行SQL语句的安全性,效率方面都有一定的提升
    //3.PHP官方推荐使用
    //初始化PDO对象
    $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
    //mysql:链接数据库类型
    //host:主机地址
    //port:端口
    //dbname:数据库名
    //charset:字符集
    $username = 'root';
    $password = "root";
    $PDO = new PDO($dsn,$username,$password);
    var_dump($PDO);
//使用PDO操作数据库
      //增
      $sql = "INSERT INTO study VALUES(null,0006,'admin',32,'语文',100)";
      $result = $PDO->exec($sql);

      //删
      $sql = "DELETE from study where id=1";
      $result = $PDO->exec($sql);

      //改
      $sql = "UPDATE study SET name='张三' WHERE id=2";
      $result = $PDO->exec($sql);

      //查
      $sql = "SELECT * FROM study";
      $result = $PDO->query($sql);//返回PDOStatement对象,从该对象的方法中查询数据
      //查询一条记录
      $res = $result->fetch(PDO::FETCH_ASSOC);

    $PDO->fetch(); //查询一条数据
    $PDO->fetchAll(); //查询说有数据
    $PDO->fetchColumn();  //从结果集中的下一行返回单独的一列。
    $PDO->quote(); //将字符串中的引号转义,并使用单引号包裹

    /*PDO::FETCH_ASSOC 返回索引数组
    PDO::FETCH_BOTH(默认) 返回关联和索引数组
    PDO::FETCH_NUM 返回关联数组*/

//PDO异常
    //获得异常信息函数

      $error = $PDO->errorInfo();//返回错误代码和错误信息
      $errCode = $PDO->errorCode();//返回错误代码

//PDO事物相关
    //事物:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败

    $PDO->beginTransaction(); //开启事物
    $PDO->commit();//提交
    $PDO->rollBack();//回滚

   //开启事物,下面转账的操作才属于事物

      $PDO->beginTransaction();
      //开始转账
      $sql = "UPDATE study set money=money-300 where name = '张三'";
      $res = $PDO->exec($sql);
      $sql = "UPDATE study set money=money+300 where name='李四'";
      $res1 = $PDO->exec($sql);
      if($res && $res1){
          $PDO->commit();
          echo '转账成功';
      }else{
          $PDO->rollBack();
          echo "转账失败";
      }

//预处理

      $PDO->lastInsetId(); //返回上一次插入语句的主键值
      $PDO->prepare();
      //预处理(编译sql语句),作用将SQL语句的结构固定住
      //占位符(?,:id)
      $sql = "DELETE FROM user where id=?";
      //返回PDOStatement对象
      $PDOStatement = $PDO->prepare($sql);
      //使用真实的 数据替换之前的占位符,参数1代表的是第1个占位符
      $PDOStatement->bindValue(1,'$value');
      //执行,没有参数
      $result = $PDO->execute();

//PDOStatement 对象的方法
    //PDOStatement 对象,可以通过2种方法获得
    /*1.通过执行$PDO->query();
    2.通过执行$PDO->perpare();

  1.$PDOStatement->fetchAll() 获得所有数据
  2.$PDOStatement->fetch() 获取一条数据
  3.$PDOStatement->fetchColumn(index) 获取一条记录的某个字段的值
  4.$PDOStatement->closeCursor() 关闭游标,指针,通常当我们查询完数据后,要将游标恢复到初始位置上,便于下一次查询
  5.$PDOStatement->bindVaue() 绑定数据
  6.$PDOStatement->execute() 执行预处理SQL语句
  7.$PDOStatement->errorInfo() 错误信息
  8.$PDOStatement->errorCode() 错误代码
  9.$PDOStatement->rowCount() 增删改受影响的记录数  */

//PDO异常处理
    //自定义异常处理
    class MyException extends Exception
    {
        //自定义异常类,提供备用方案
        function __construct($argument)
        {
            # code...
        }
    }

?>

PDO链接数据库

<?php
$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名
$dbName='test';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";

try {
   $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
   echo "连接成功<br/>";
   /*你还可以进行一次搜索操作
   foreach ($dbh->query('SELECT * from FOO') as $row) {
      print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
   }
   */
   $dbh = null;
} catch (PDOException $e) {
   die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

PDO 查询

如果成功,PDO::query()返回PDOStatement对象,如果失败返回 FALSE 。

<?php
function getFruit($conn) {
   $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
   foreach ($conn->query($sql) as $row) {
      print $row['name'] . "\t";
      print $row['color'] . "\t";
      print $row['calories'] . "\n";
   }
}

PDOStatement::fetch — 从结果集中获取下一行

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* 运用 PDOStatement::fetch 风格 */
print("PDO::FETCH_ASSOC: ");
print("Return next row as an array indexed by column name\n");
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
print("\n");

print("PDO::FETCH_BOTH: ");
print("Return next row as an array indexed by both column name and number\n");
$result = $sth->fetch(PDO::FETCH_BOTH);
print_r($result);
print("\n");

print("PDO::FETCH_LAZY: ");
print("Return next row as an anonymous object with column names as properties\n");
$result = $sth->fetch(PDO::FETCH_LAZY);
print_r($result);
print("\n");

print("PDO::FETCH_OBJ: ");
print("Return next row as an anonymous object with column names as properties\n");
$result = $sth->fetch(PDO::FETCH_OBJ);
print $result->NAME;
print("\n");

PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* 获取结果集中所有剩余的行 */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();
print_r($result);

fetch_style 控制下一行如何返回给调用者

PDO::exec — 执行一条 SQL 语句,并返回受影响的行数

<?php
$dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

/*  删除 FRUIT 数据表中满足条件的所有行 */
$count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'");

/* 返回被删除的行数 */
print("Deleted $count rows.\n");

PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象

使用命名(:name)参数来准备SQL语句

<?php
/* 通过数组值向预处理语句传递值 */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

使用问号(?)参数来准备SQL语句

<?php
/* 通过数组值向预处理语句传递值 */
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();

标签: mysql