php之pdo扩展库

来源:互联网 发布:金十网数据官网 编辑:程序博客网 时间:2024/05/20 06:28

1.安装pdo扩展库

linux: 安装php5.1以上版本时 添加  --with-pdo-mysql=/usr/local/mysql;                   //其中/usr/local/mysql为mysql服务器安装目录

windows:将这俩个扩展库打开 extention = php_pdo.dll;     extention = php_pdo_mysql.dll; //如果是其他数据库则打开对应的扩展库


2.三个类 和 大量常量

PDO类:和数据库连接有关的类(连接,执行sql语句)

PDOStatement类:准备语句,处理结果集。编译一次多次执行提高效率高,有效避免sql注入提高安全性。  推荐使用

PDOException类:处理异常


PDO类

1.__construct( $dsn, $username, $password  [, $options ] );

$dsn ( data source name ) :  'mysql: host = localhost; port = 3306; dbname = test'

$dsn 也可为在文件中:         'uri: file:///usr/local/dbconnect' 

$dsn 也可通过php.ini来设置,为dsn指定别名,在代码中可直接调用别名:

[ PDO ]

pdo.dsn.msyqlpdo = ' mysql: host = localhost; dbname = test' ;


$dbh = new pdo("mysqlpdo", "test", "password");


$options调优有关的参数:

设置选项名为下标组成的关联数组,作为驱动程序特定的连接选项




2.执行sql语句exec(), query(), prepare()

exec()用来执行有影响行数的 insert/update/delete/other,返回的是影响的行数

query()用来执行查询语句 ,返回PDOStatement预处理的对象



3.错误处理模式

PDO::ERRMODE_SILENT              默认是此模式,不会输出任何错误信息,可以通过errorCode()和errorInfo()方法来获取错误信息

PDO::ERRMODE_WARNING         警告模式,开启此模式后会直接输出警告信息,当然也可以通过errorInfo()来获取错误信息

PDO::ERRMODE_EXCEPTION      异常模式,开启此模式后可以通过异常来获取错误信息。 该模式为最常用的方式,推荐此方式。


4.事务处理

$pdo -> set Attribute( PDO::ATTR_AUTOCOMMIT, 0 );   关闭自动提交

beginTransaction()   开启事务处理

commit() 提交事务

rollback() 回滚事务



PDOStatement类

1.准备语句 

$stmt = prepare($sql);

/**支持俩种占位符号

  *?参数     -----------    索引数组,按索引顺序使用  

  *索引参数------------   关联数组,按名称使用,和顺序无关,用:var_name方式使用

  *

  */


2.绑定参数 

$stmt -> bindParam( 1, $var1 [, PDO::PARAM_STR|PDO::PARAM_INT ]); 

$stmt -> bindParam( :var1, $var1 );

$stmt -> bindParam( :var2, $var2 ); 


3.执行语句

$stmt -> execute()

可以不绑定而直接执行此语句,只需加入一个数组参数

array( :name => "root", :password => "password" );  对应名字参数

array("root", "password"); 对应?参数


4.操作结果集

$stmt -> fetch( [ PDO::FETCH_ASSOC | PDO::FETCH_NUM | PDO::FETCH_BOTH ] );   //一次获取一行数据,默认同时返回关联和索引的数组,可通过参数来设置返回的数组类型

$stmt -> setFetchMode( PDO::FETCH_ASSOC | PDO::FETCH_NUM | PDO::FETCH_BOTH );  //可以通过此方式来设置,那样每次获取就不需要在另外设置

$stmt -> fetchAll(  );    //一次获取全部数据

$stmt -> bindColumn( "columnName", $varname [ ,PDO::PARAM_STR | PDO::PARAM_INT ] );   //通过绑定列来获取数据


$stmt -> rowCount();   //获取查询到的总记录数

$stmt -> columnCount(); //获取查询到数据的总字段数

$stmt -> getColumnMeta( $i ); //获取列的信息(包括列名name 长度len  table表名等),$i列号,默认从0开始。




例子:

<?php//创建pdo对象try{    $options = array(        PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,  //可以在option设置错误模式        PDO::ATTR_AUTOCOMMIT => true,             //开启自动提交     );    $pdo = new pdo ( "mysql: host = localhost; port = 3306; dbname = test", "root", "password", $options);    $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );    //也可以通过方法来设置错误模式}catch(PDOException $e){    echo "数据库连接失败:".$e->getMessage();    exit;}//使用exec方法try{    $sql = "INSERT INTO t_user (user, password) VALUES ("root", "password")";    $affected_rows = $pdo -> exec( $sql );    echo "最后插入的自动增长的ID:".$pod -> lastInsertId();}catch(PDOException $e){    echo "sql语句执行错误:".$e->getMessage();}//使用事务处理try{    $pdo -> setAttribute( PDO::ATTR_AUTOCOMMIT, 0 );  //关闭自动提交以支持事务处理    $pdo -> beginTransaction();    $price = 500;    $sql1 = "UPDATE t_account SET price = price - { $price } WHERE id = 1";        $affected_rows = $pdo -> exec( $sql1 );    if($affected_rows < 1){        throw new PDOException("转出失败");    }    $sql2 = "UPDATE t_account SET price = price + { $price } WHERE id = 2";    $affected_rows = $pdo -> exet( $sql2 );     echo "交易成功";    if($affected_rows < 1){        throw new PDOException("转入失败");    }        $pdo -> commit();}catch(PDOException $e){    echo "sql语句执行错误".$e->getMessage();    $pdo -> rollback();}$pdo -> setAttribute( PDO::ATTR_AUTOCOMMIT, 1 );  //使用完事务处理后打开自动提交//使用query方法try{    $sql = "SELECT user, passowrd FROM t_user";    $stmt = $pdo->query( $sql );    }catch(PDOException $e){    echo "sql语句执行错误:".$e->getMessage();}//使用PDOStatement类处理非查询语句try{    //$sql = "INSERT into t_user (user, passowrd) VALUES (?, ?)";    $sql = "INSERT into t_user (user, passowrd) VALUES (:user, :password)";    $stmt = $pdo->prepare( $sql );         //绑定名字参数    $user = "root";    $password = "password";    $stmt -> bindParam( :user, $user );    $stmt -> bindParam( :password, $password );    //绑定?参数        //$stmt -> bindParam( 1, $user);    //$stmt -> bindParam( 2, $password);        //也可以不绑定直接执行 $stmt->execute( array( :name=>"root", :password=>"password" ) );    if($stmt->execute()){       echo "执行成功!";       echo "最后插入的ID:".$pdo->lastInsertId();        }else{       echo "执行失败!";    }   }catch(PDOException $e){    echo "sql语句执行错误:".$e->getMessage();}//使用PDOStatement处理查询语句try{    $sql = "SELECT user, password FROM t_user WHERE id > :id";    $stmt = $pdo -> prepare( $sql );    $stmt -> execute( array( :id=>"100" ) );        $stmt -> setFetchMode(PDO::FETCH_ASSOC);    /*    while( $row = $stmt->fetch() ){        print_r( $row );        echo "<br/>";    }    */        /*    $stmt -> bindColumn( "user", $user, PDO::PARAM_STR);    $stmt -> bindColumn( "password", $passowrd );     while( $stmt -> fetch() ){        echo "$user------$password <br/>";    }    */    $data = $stmt -> fetchAll( PDO::FETCH_ASSOC );    echo "总记录数:".$stmt -> rowCount();    echo "总字段数:".$stmt -> columnCount();    for( $i = 0; $i < $stmt->columnCount(); $i++){        $field = $stmt -> getColumnMeta($i);        echo $file['name']."<br/>";    }}catch(PDOException $e){    echo $e->getMessage();}?>