PHP PDO 安装使用

PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll之类的了。PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、 PostgreSQL、MS SQL Server、SQLite,同样的,我们必须借助 ADOdb、PEAR::DB、PHPlib::DB之类的数据库抽象类来帮助我们,无比烦琐和低效,毕竟,php代码的效率怎么能够我们直接用 C/C++写的扩展斜率高捏?所以嘛,PDO的出现是必然的,大家要平静学习的心态去接受使用,也许你会发现能够减少你不少功夫哦。

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。

PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。(类似python DB-2 API).

从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。

启用PDO,打开php.ini文件,去掉下面的注释:

php.ini 中的 php_pdo.dll后面启用。例如:

extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll 各种PHP PDO的驱动,能给加上的全给加上,不过后面的php_pdo_oci8.dll,因为我没有安装Oralce数据库,所以没有这个,就使用分号注释掉它。然后重启我们的Web服务器。
简单使用例子:
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

(php中unset()是用来销毁变量的,但很多时候,这个函数只把变量给销毁了,内存中存放的该变量的值仍然没有销毁,也就是没能达到我们想要的释放内存的效果。这里我建议大家用 $变量=null 的方法来释放其内存)。

注意:如果出现乱码,我们最好设置utf-8:

$pdo->query('set names utf8');

还有,在foreach中可以$pdo->query;此时得到的并不是list,而是statement对象。

获取list数据

$pdo->query($list)->fectchAll()

注意,默认包含关联和数值数组:

'id' => '4',
0 => '4',

、完全不必要,设置PDO::FETCH_ASSOC

$pdo->query($list)->fectchAll(PDO::FETCH_ASSOC)

http://php.net/manual/en/pdostatement.fetchall.php

Example #4 持久化连接

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

Note:

如果想使用持久连接,必须在传递给 PDO 构造函数的驱动选项数组中设置 PDO::ATTR_PERSISTENT 。如果是在对象初始化之后用 PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久连接。

$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PWD);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->query("set names utf8");

PDO常用方法及其应用 

PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作 
PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作 
PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)
PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID 
PDOStatement::fetch() 是用来获取一条记录 
PDOStatement::fetchAll() 是获取所有记录集到一个集合 
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段
PDOStatement::rowCount() :主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。

操作实例:

if($pdo -> exec("insert into db_demo(name,content) values('title','content')")){ 
echo "插入成功!"; 
echo $pdo -> lastinsertid(); 

$rs = $pdo -> query("select * from test");
$rs->setFetchMode(PDO::FETCH_ASSOC); //关联数组形式
//$rs->setFetchMode(PDO::FETCH_NUM); //数字索引数组形式
while($row = $rs -> fetch()){
print_r($row);

PDOStatement::rowCount()。

统计有多少行数据:

$sql="select count(*) from test";
$num = $dbh->query($sql)->fetchColumn();
fetchColumn(columNumber)默认为0,显示第一行数据的第1列,我们可以传递column index给他。
 不想每次设置:
我们看里面的记录,数字索引和关联索引都有,浪费资源,我们只需要关联索引的:
PHP PDO 安装使用<?php
PHP PDO 安装使用$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
PHP PDO 安装使用$rs = $db->query("SELECT * FROM foo");
PHP PDO 安装使用$rs->setFetchMode(PDO::FETCH_ASSOC);
PHP PDO 安装使用$result_arr = $rs->fetchAll();
PHP PDO 安装使用print_r($result_arr);
PHP PDO 安装使用?>

看上面的代码,setAttribute() 方法是设置部分属性,主要属性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等等,我们这里需要设置的是PDO::ATTR_CASE,就是我们使用关联索引获取数据集的时候,关联索引是大写还是小写,有几个选择:

PDO::CASE_LOWER -- 强制列名是小写
PDO::CASE_NATURAL -- 列名按照原始的方式
PDO::CASE_UPPER -- 强制列名为大写

我们使用setFetchMode方法来设置获取结果集的返回值的类型,同样类型还有:

PDO::FETCH_ASSOC -- 关联数组形式
PDO::FETCH_NUM -- 数字索引数组形式
PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()

当然,一般情况下我们是使用PDO::FETCH_ASSOC,具体使用什么,按照你自己的需要,其他获取类型参考手册。

insert插入:

//数据插入
//准备SQL语句
$sql = "INSERT INTO `test`(`name`) VALUES (:name)"; //调用prepare方法准备查询
$stmt = $pdo->prepare($sql); //传递一个数组为预处理查询中的命名参数绑定值,并执行SQL
$stmt->execute(array(':name' => '王五')); //获取最后一个插入数据的ID值
echo $pdo->lastInsertId() . '<br />'; 或者:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

 <?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
   FROM fruit
   WHERE calories < :calories AND colour = :colour');
// instead of:
//     $sth->execute(array(':calories' => $calories, ':colour' => $colour));
// this works fine, too:
$sth->execute(array('calories' => $calories, 'colour' => $colour));
?>

批量插入:
foreach($line as $l){
$stmt->bindParam(':title', $l['title']);
$stmt->bindParam(':content', $l['content']);
$stmt->bindParam(':created', $l['created']);
$stmt->excute();
} stmt->execute()可能执行失败,要检查返回值

$flag=$stmt->execute();
if(!$flag)
{
echo '<h1 style="color:red;font-weight:bold">插入数据库错误!!!!!!!!!!!.</h1><br/>';
$errorInfoArr=$stmt->errorInfo();
print_r($errorInfoArr);
}

执行某条语句一直失败,为什么?最后终于找到原因

,因为字段名name,group是mysql关键字,换个字段名或用`name`括起来。


$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE,\PDO::FETCH_OBJ);
$rawSql="select * from users where id=:id";

$sth=$pdo->prepare($rawSql);
$id=1;

$sth->bindParam(':id',$id);
$flag= $sth->execute();
$row=$sth->fetch();


批量插入:http://www.jb51.net/article/51975.htm 。

http://www.2cto.com/database/201211/166238.html

http://ryan-d.iteye.com/blog/1543225

上一篇:【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA


下一篇:mysql的索引key_len计算方法,及个字段所占字节数