PHP 数据对象
- 简介
- 安装/配置
- 预定义常量
- 连接与连接管理
- 事务与自动提交
- 预处理语句与存储过程
- 错误与错误处理
- 大对象 (LOB)
- PDO — PDO 类
- PDO::beginTransaction — 启动一个事务
- PDO::commit — 提交一个事务
- PDO::connect — Connect to a database and return a PDO subclass for drivers that support it
- PDO::__construct — 创建一个表示数据库连接的 PDO 实例
- PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
- PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
- PDO::exec — 执行 SQL 语句,并返回受影响的行数
- PDO::getAttribute — 取回一个数据库连接的属性
- PDO::getAvailableDrivers — 返回一个可用驱动的数组
- PDO::inTransaction — 检查是否在事务内
- PDO::lastInsertId — 返回最后插入行的ID或序列值
- PDO::prepare — 预处理要执行的语句,并返回语句对象
- PDO::query — 预处理并执行没有占位符的 SQL 语句
- PDO::quote — 为 SQL 查询里的字符串添加引号
- PDO::rollBack — 回滚事务
- PDO::setAttribute — 设置属性
- PDOStatement — PDOStatement 类
- PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
- PDOStatement::bindParam — 绑定一个参数到指定的变量名
- PDOStatement::bindValue — 把一个值绑定到一个参数
- PDOStatement::closeCursor — 关闭游标,使语句能再次被执行
- PDOStatement::columnCount — 返回结果集中的列数
- PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
- PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
- PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
- PDOStatement::execute — 执行预处理语句
- PDOStatement::fetch — 从结果集中获取下一行
- PDOStatement::fetchAll — 从结果集中获取剩余的行
- PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列
- PDOStatement::fetchObject — 获取下一行并作为一个对象返回
- PDOStatement::getAttribute — 检索语句属性
- PDOStatement::getColumnMeta — 返回结果集中一列的元数据
- PDOStatement::getIterator — Gets result set iterator
- PDOStatement::nextRowset — 在一个多行集合语句句柄中推进到下一个行集合
- PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
- PDOStatement::setAttribute — 设置一个语句属性
- PDOStatement::setFetchMode — 为语句设置默认的获取模式
- PDORow — The PDORow class
- PDOException — PDOException 异常类
- PDO 驱动
- CUBRID PDO Driver — CUBRID PDO Driver (PDO_CUBRID)
- MS SQL Server PDO Driver — Microsoft SQL Server and Sybase PDO Driver (PDO_DBLIB)
- Pdo\Dblib — The Pdo\Dblib class
- Firebird PDO Driver — Firebird PDO Driver (PDO_FIREBIRD)
- Pdo\Firebird — The Pdo\Firebird class
- IBM PDO Driver — IBM PDO Driver (PDO_IBM)
- Informix PDO Driver — Informix PDO Driver (PDO_INFORMIX)
- MySQL PDO Driver — MySQL PDO Driver (PDO_MYSQL)
- Pdo\Mysql — The Pdo\Mysql class
- MS SQL Server PDO Driver — Microsoft SQL Server PDO Driver (PDO_SQLSRV)
- Oracle PDO Driver — Oracle PDO Driver (PDO_OCI)
- ODBC and DB2 PDO Driver — ODBC and DB2 PDO Driver (PDO_ODBC)
- Pdo\Odbc — The Pdo\Odbc class
- PostgreSQL PDO Driver — PostgreSQL PDO Driver (PDO_PGSQL)
- Pdo\Pgsql — The Pdo\Pgsql class
- SQLite PDO Driver — SQLite PDO Driver (PDO_SQLITE)
- Pdo\Sqlite — The Pdo\Sqlite class
+添加备注
用户贡献的备注 5 notes
djlopez at gmx dot de ¶
18 years ago
Please note this:
Won't work:
$sth = $dbh->prepare('SELECT name, colour, calories FROM ? WHERE calories < ?');
THIS WORKS!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');
The parameter cannot be applied on table names!!
wiserufferto at gmail dot com ¶
4 years ago
This is a little late... but I'm old and slow.......
Regarding Extending PDOStatement and PDO I found that sending the PDOExtended class by reference helps:
In the constructor after parent::__construct() :
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}
And in
class PDOStatementExtended extends \PDOStatement
{
protected function __construct
(
\PDO &$PDO,
)
pokojny at radlight dot com ¶
18 years ago
I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:
<?php
/**
* PHP Document Object plus
*
* PHP Document Object plus is library with functionality of PDO, entirely written
* in PHP, so that developer can easily extend it's classes with specific functionality,
* such as providing database usage statistics implemented in v1.0b
*
* @author Peter Pokojny
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
class PDOp {
protected $PDO;
public $numExecutes;
public $numStatements;
public function __construct($dsn, $user=NULL, $pass=NULL, $driver_options=NULL) {
$this->PDO = new PDO($dsn, $user, $pass, $driver_options);
$this->numExecutes = 0;
$this->numStatements = 0;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDO, $func), $args);
}
public function prepare() {
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'prepare'), $args);
return new PDOpStatement($this, $PDOS);
}
public function query() {
$this->numExecutes++;
$this->numStatements++;
$args = func_get_args();
$PDOS = call_user_func_array(array(&$this->PDO, 'query'), $args);
return new PDOpStatement($this, $PDOS);
}
public function exec() {
$this->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDO, 'exec'), $args);
}
}
class PDOpStatement implements IteratorAggregate {
protected $PDOS;
protected $PDOp;
public function __construct($PDOp, $PDOS) {
$this->PDOp = $PDOp;
$this->PDOS = $PDOS;
}
public function __call($func, $args) {
return call_user_func_array(array(&$this->PDOS, $func), $args);
}
public function bindColumn($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindColumn($column, $param);
else
$this->PDOS->bindColumn($column, $param, $type);
}
public function bindParam($column, &$param, $type=NULL) {
if ($type === NULL)
$this->PDOS->bindParam($column, $param);
else
$this->PDOS->bindParam($column, $param, $type);
}
public function execute() {
$this->PDOp->numExecutes++;
$args = func_get_args();
return call_user_func_array(array(&$this->PDOS, 'execute'), $args);
}
public function __get($property) {
return $this->PDOS->$property;
}
public function getIterator() {
return $this->PDOS;
}
}
?>
Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.
From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.
dougwilbourne at gmail dot com ¶
2 months ago
Now that current versions of MySQL are forcing users to authenticate with caching_sha2_password instead of mysql_native_driver, I wanted to get PDO to send passwords that way. I think the only way to do it is to make the connection over SSL. Setting up your web server and database server for SSL is way beyond the scope of this note, but after you do, remember that you will need to add an options array as the last argument in your PDO connection arguments. At a minimum, you will need to supply the server certificate. In a development environment with a self-signed server certificate, you will also want to bypass verification that your server certificate is 'real'. So your options array would look like this
$opts = [ PDO::MYSQL_ATTR_SSL_CA => $server_cert_file_path, PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false];
Hope it helps!
www.navin.biz ¶
19 years ago
Below is an example of extending PDO & PDOStatement classes:
<?php
class Database extends PDO
{
function __construct()
{
parent::__construct('mysql:dbname=test;host=localhost', 'root', '');
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement
{
public $dbh;
protected function __construct($dbh)
{
$this->dbh = $dbh;
$this->setFetchMode(PDO::FETCH_OBJ);
}
public function foundRows()
{
$rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
$rows->execute();
$rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
$rows->closeCursor();
return $rowsCount;
}
}
?>