php之pdo扩展库

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开始。




例子:

 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 "
"; } */ /* $stmt -> bindColumn( "user", $user, PDO::PARAM_STR); $stmt -> bindColumn( "password", $passowrd ); while( $stmt -> fetch() ){ echo "$user------$password
"; } */ $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']."
"; } }catch(PDOException $e){ echo $e->getMessage(); } ?>

你可能感兴趣的:(php)