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
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每一个数据库驱动能够公开具体数据库的特性做为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。html
PDO 提供了一个 数据访问 抽象层,这意味着,无论使用哪一种数据库,均可以用相同的函数(方法)来查询和获取数据。 PDO 不不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。若是须要的话,应该使用一个成熟的抽象层。(相似python DB-2 API).python
从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是做为一个 PECL 扩展使用。 PDO 须要PHP 5 核心的新 OO 特性,所以不能在较早版本的 PHP 上运行。mysql
启用PDO,打开php.ini文件,去掉下面的注释:sql
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()。
统计有多少行数据:
咱们使用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 。