PDO 连接资料库及查询资料及异常讯息

PDO 连接资料的方式,都是统一化,且非常简单及方便:
1.连接数据库:
PDO提供了统一的接口:PDO 对象。

<?php
$db = new PDO(
   
"driver_name:dbname=db_name;host=hostname/IP;[charset=char_type]", // (A) 连接字符串
   
"db_username", // (B) db用户名
   
"db_password" // (C) db密码
);
?>

说明:PDO 有三个参数

(A) 连接字符串:
    
driver_name 是使用的PDO 驱动,可以为:mysql, mssql, sybase, dblib, firebird, oci, odbc, pgsql, sqlite, sqlite2
   
db_name 是要连结的资料库名称;
   
hostname/IP 是指要连接到哪里,如果是本地则为localhost 或127.0.0.1
   
[charset=char_type] 是可选的,用来设置字符类型。

(B) 连接资料库的用户名

(C) 连接资料库的密码

连接范例:

<?php
$db = new PDO(
   
"mysql:dbname=test;host=localhost;charset=utf-8",
   
"testuser",
   
"testpass"
);
echo "Successfully created a PDO object";
?>

连接之前,应先确认已经加载了PDO 模块,如果试图处理一个无效的连接字符串时:

<?php
$db = new PDO(
"this_is_not_a_pdo_module:dbname=test;host=localhost",
"testuser",
"testpass"
);
echo "Successfully created a PDO object";
?>

如上 PHP 程式将会返回以下错误:
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver'
代表找不到该PDOthis_is_not_pdo_module 的PDO 驱动程式
而我们可以用一种优雅的方式来处理,即抛出PDO 异常来处理错误
<?php
try
{
$db = new PDO(
  
"this_is_not_a_pdo_modul:dbname=test;host=localhost",
  
"testuser",
  
"testpass"
  
);
}
catch( PDOException $e )
{die( $e->getMessage() );}
echo "Successfully created a PDO object";
?>
如上我们会得到如下的错误讯息
could not find driver

SQLSTATE[HY000] [7] FATAL: database "pdo2" does not exist
如果资料库不存在则不同的错误会返回不同的提示信息。

2. 设置属性
(A) PDO 有三种错误处理方式:
? PDO::ERRMODE_SILENT 不显示错误信息,只设置错误码
? PDO::ERRMODE_WARNING 显示警告错
? PDO::ERRMODE_EXCEPTION 抛出异常
可通过以下语句来设置错误处理方式为抛出异常
$db->setAttribute(PDO::ATTR_ERRMODE, );

范例:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
当设置为PDO::ERRMODE_SILENT 时可以通过调用errorCode() 或errorInfo() 来获得错误信息,当然其他情况下也可以。

(B) 因为不同数据库对返回的字段名称大小写处理不同,所以PDO 提供了PDO::ATTR_CASE 设置项
    
(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER ),来确定返回的字段名称的大小写。

(C) 通过设置 PDO::ATTR_ORACLE_NULLS 类型
   
(包括PDO::NULL_NATURAL,PDO::NULL_EMPTY_STRING,PDO::NULL_TO_STRING )来指定数据库返回的NULL 值在PHP 中对应的数值。

3. 查询资料
为了说明清楚,我们这里定义了一个test 资料表

CREATE TABLE `test` (
 
`id` smallint(6) unsigned NOT NULL auto_increment,
 
`name ` varchar(100) NOT NULL default '',
 
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf-8 AUTO_INCREMENT=1;
不使用预处理语句的方式:
<?php
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt=$db->query("select * from test");
while($f=$stmt->fetch()){
    
echo $f["id"] . " - ";
    
echo $f["name"] ." <br>";
};
/*使用foreach 获取数据 */
foreach( $db->query( "SELECT * FROM test" ) as $row )
{print_r( $row );}
?>

会得到以下结果:
1 - Bruce_Wu
Array
(
    
[id] => 1
   
[0] => 1
   
[name] => Bruce_Wu
   
[1] => Bruce_Wu
)
使用预处理语句的方式:

<?php
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt = $db->prepare( "SELECT * FROM test" );
$stmt->execute();
print_r( $stmt->fetch() );
?>

这里的,$stmt 是一个PDOStatement 对象,预处理之后会得到这样一个对象,必须execute 后才会起作用。
fetch 函数只提取了一行数据资料,如果需要读取全部数据,可换成fetchAll 函数。
绑定数据,条件是查询

<?php
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf-8',testuser','testpass');
$stmt = $db->prepare( "SELECT * FROM test WHERE name = :name" );
$name = "Bruce_Wu";
$stmt->bindParam( ":name", $name );
$stmt->execute();
while( $row = $stmt->fetch() )
{
 
print_r( $row );
}
?>
这里,bindParam 将$name 变量绑定到了:name 域,执行时会自动将改变量载入。

4.插入数据资料

<?php
$stmt = $db->prepare(
"INSERT INTO test
( id, name )
VALUES
( :id, :name )");
$stmt->execute(
array(
":id" => "2",
":name" => "david"
)
);
?>

实现插入数据资料也可以像绑定数据资料一样来quote 数据,这里给出通过在execute 中给定输入参数来自动quote的方法。

事务处理
$dbh->beginTransaction();
try {
$dbh->query("UPDATE ...");
$dbh->query("UPDATE ...");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
}

如果数据库支持事务处理,调用beginTransaction 的同时将数据库设置为非自动提交,commit 或rollBack返回自动提交状态。
5. 存储过程
<?php
$stmt = $dbh->prepare("CALL sp_set_string(?)");
$stmt->bindParam(1, $str);
$str = 'foo';
$stmt->execute();
?>

和先前的例子差不多,只是这里使用了「?」数据绑定方法,sp_set_string 是存储过程名称。
带有输出参数的存储过程

<?
$stmt = $dbh->prepare("CALL sp_get_string(?)");
$stmt->bindParam(1, $ret,PDO:ARAM_STR, 4000);
if ($stmt->execute()) {
echo "Got $ret\n";
}

绑定列输出

<?
$stmt = $dbh->prepare("SELECT extension, name from CREDITS");
if ($stmt->execute()) {
 
$stmt->bindColumn('extension', $extension);
 
$stmt->bindColumn('name', $name);
 
while ($stmt->fetch(PDO::FETCH_BOUND)) {
 
echo "Extension: $extension\n";
 
echo "Author: $name\n";
 
}
}
?>

你可能感兴趣的:(PDO 连接资料库及查询资料及异常讯息)