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();
}
?>