pdo操作数据库

pdo对象的方法:

exec()         执行一条sql语句,并返回其受影响的行数
query()     执行一条sql语句,返回一个 PDOStatement 对象
prepare()     准备要执行的sql语句,返回 PDOStatement 对象
quote()     返回一个添加引号的字符串,用于 SQL语句中
lastInsertId()     返回最后插入行的ID
setAttribute()  设置一个语句属性
getAttribute()     得到一个语句属性
errorCode()     获取跟数据库句柄上一次操作相关的 SQLSTATE
errorInfo()     获取跟数据库句柄上一次操作的错误信息    //返回的错误信息的数组,数组中包含3个单元,0=>SQLSTATE,1=>CODE,2=>INFO
execute()         执行一条预处理语句
rowCount()         返回上一个 SQL语句影响的行数
fetch()         从结果集中获取一行
fetchAll()         返回一个包含结果集中所有行的数组
fetchColumn()     从结果集中的下一行返回单独的一列
fetchObject()     获取下一行并作为一个对象返回
bindParam()     绑定一个参数到指定的变量名
bindValue()     把一个值绑定到一个参数
bindColumn()     绑定一列到一个 php 变量
getColumnMeta() 返回结果集中一列的元数据
columnCount()     返回结果集中的列数
debugDumpParams() 打印一条SQL预处理命令
nextRowset()     在一个多行集语句句柄中推进到下一个行集


1、pdo连接数据库

// 1、通过参数形式连接数据库
try{
	$dsn='mysql:host=localhost;dbname=test';
	$username='root';
	$passwd='';
	$pdo=new PDO($dsn, $username, $passwd);
	var_dump($pdo);
}catch(PDOException $e){
	echo $e->getMessage();
}

// 2、通过uri的形式连接数据库
try{
    //dsn.txt里面填写 mysql:dbname=test;host=localhost
    $dsn='uri:file://G:\phpdev\apache\htdocs\imooc\pdo\dsn.txt';
  $username='root';
  $passwd='';
  $pdo=new PDO($dsn,$username,$passwd);
  var_dump($pdo);
}catch(PDOException $e){
   echo $e->getMessage();
}


2、pdo操作数据库

query主要用于select;可以返回结果集;当把select语句应用到 exec 时,总是返回 0    || exec用来处理有返回影响行数的(int)

header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
  //exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的记录,他返回0
    //exec对于select没有作用
    $sql=<<<EOF
    	CREATE TABLE IF NOT EXISTS user(
	id INT UNSIGNED AUTO_INCREMENT KEY,
	username VARCHAR(20) NOT NULL UNIQUE,
	password CHAR(32) NOT NULL,
	email VARCHAR(30) NOT NULL
	);
EOF;
    $res=$pdo->exec($sql);
    var_dump($res);
    $sql='INSERT user(username,password,email) VALUES("king","'.md5('king').'","imooc@qq.com")';
    //echo $sql;
    $res=$pdo->exec($sql);
    echo '受影响的记录的条数为:'.$res;        //受影响的记录的条数
    echo '最后插入的ID号为'.$pdo->lastInsertId();//得到新插入记录的ID号

    $sql='select id,username,email from user';
    $stmt=$pdo->query($sql);    //执行SQL语句,返回PDOStatement对象
    foreach($stmt as $row){
    	//print_r($row);
    	echo '编号:'.$row['id'];
    	echo '用户名:'.$row['password'];
    	echo '邮箱:'.$row['email'];
    }
}catch(PDOException $e){
	echo $e->getMessage();
}


3、预处理

PDOStatement::bindParam — 绑定一个参数到指定的变量名。
    绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。 不同于 PDOStatement::bindValue() ,此变量作为引用
被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值。
PDOStatement::bindValue — 把一个值绑定到一个参数。
    绑定一个值到用作预处理的 SQL 语句中的对应命名占位符或问号占位符。
    
header('content-type:text/html;charset=utf-8');
    try{
        $pdo=new PDO('mysql:host=localhost;dbname=test','root','');
        $sql='select * from test';
        $stmt=$pdo->prepare($sql);            //准备SQL语句
        $res=$stmt->execute();                //执行预处理语句
        // if($res){                // 有数据,返回 true
        //     while($row=$stmt->fetch()){        //fetch():得到结果集中的一条记录;
        //         print_r($row);
        //     }
        // }
        //参数PDO::FETCH_ASSOC(关联数组),PDO::FETCH_NUM(数字索引数组),PDO::FETCH_BOTH(两者数组形式都有,这是默认的),PDO::FETCH_OBJ(对象的形式,类似mysql_fetch_object()函数)
        $stmt->setFetchMode(PDO::FETCH_ASSOC);        //动态设置fetch() 、fetchAll() 的参数
        $rows=$stmt->fetchAll();    //fetchAll():得到结果集中的所有数据
        var_dump($rows);
        $sql='SELECT id,title FROM test';
        $stmt=$pdo->prepare($sql);
        $stmt->execute();
        echo '结果集中的列数一共有:'.$stmt->columnCount();
        var_dump($stmt->getColumnMeta(0));
        $stmt->bindColumn(1, $id);
        $stmt->bindColumn('title',$title);
        while($row = $stmt->fetch(PDO::FETCH_BOUND)){
            echo '用户名:'.$id.'-密码:'.$title;
        }
        $sql='SELECT id,title FROM test';
        $stmt=$pdo->query($sql);
        echo $stmt->fetchColumn(1);        //从结果集中的下一行返回单独的一列
        echo $stmt->fetchColumn(0);
        $pdo=new PDO('mysql:host=localhost;dbname=test', 'root', '');
        echo '自动提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
        echo 'PDO默认的错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
        $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
        /**第一种预处理方式**/
                $sql="INSERT user(username,password,email) VALUES(:username,:password,:email)";
            $stmt=$pdo->prepare($sql);
            $stmt->bindParam(":username",$username,PDO::PARAM_STR);
            $stmt->bindParam(":password",$password,PDO::PARAM_STR);
            $stmt->bindParam(":email",$email);
            $username='imooc1';
            $password='imooc1';
            $email='imooc1@imooc.com';
            $stmt->execute();
                echo $stmt->rowCount();        //返回受上一个 SQL 语句影响的行数
        /**第二种预处理方式**/
            $sql='INSERT user(username,password,email) VALUES(?,?,?)';
            $stmt=$pdo->prepare($sql);
            $username='imooc_king';
            $password='imooc_king';
            $stmt->bindValue(1,$username);
            $stmt->bindValue(2,$password);
            $stmt->bindValue(3,'imooc@imooc.com');
            $stmt->execute();
            echo $stmt->rowCount();
    }catch(PDOException $e){
        echo $e->getMessage();
    }

    
header('content-type:text/html;charset=utf-8');
    $username=$_POST['username'];
    $password=$_POST['password'];
    try{
        $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');    
        //echo $pdo->quote($username);
        //$sql="select * from user where username='{$username}' and password='{$password}'";
        //echo $sql;
        //通过quote():返回带引号的字符串,过滤字符串中的特殊字符
        $username=$pdo->quote($username);
        $sql="select * from user where username={$username} and password='{$password}'";
        echo $sql;
        $stmt=$pdo->query($sql);
        //PDOStatement对象的方法:rowCount():对于select操作返回的结果集中记录的条数,
        //对于INSERT、UPDATE、DELETE返回受影响的记录的条数
        echo $stmt->rowCount();
    }catch(PDOException $e){
        echo $e->getMessage();
    }

冷暖自知一抹茶ck

4、PDO事务

 header('content-type:text/html;charset=utf-8');
    try{
        $dsn='mysql:host=localhost;dbname=test';
        $username='root';
        $passwd='';
        $options=array(PDO::ATTR_AUTOCOMMIT,0);
        $pdo=new PDO($dsn, $username, $passwd, $options);
        var_dump($pdo->inTransaction());            //$pdo->inTransaction() 检查当前事务是否开启
        //开启事务
        $pdo->beginTransaction();
        var_dump($pdo->inTransaction());
        
        $res1=$pdo->exec('UPDATE test SET title="我是第一个" WHERE id=1');
        if($res1==0){
            throw new PDOException('id 1 更新失败');
        }
        $res2=$pdo->exec('UPDATE test SET title="我是第二个" WHERE id=2');
        if($res2==0){
            throw new PDOException('id 2 更新失败');
        }
        //提交事务
        $pdo->commit();
        echo "更新成功";
    }catch(PDOException $e){
        //回滚事务
        $pdo->rollBack();
        echo $e->getMessage();
    }


5、打印一条 SQL 预处理命令

try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','');
    $sql='INSERT test(title) VALUES(?)';
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(1, $username,PDO::PARAM_STR);
    $username='testParam';
    $stmt->execute();
    $stmt->debugDumpParams();
}catch(PDOException $e){
    echo $e->getMessage();
}


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论