2024 年 PHP 日本大会

PHP 数据对象

添加注释

用户贡献的注释 4 条注释

djlopez at gmx dot de
18 年前
请注意这一点

不起作用
$sth = $dbh->prepare('SELECT name, colour, calories FROM ? WHERE calories < ?');

这个有效!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');

参数不能应用于表名!!
wiserufferto at gmail dot com
3 年前
这有点晚了……但我年纪大了,反应慢了……
关于扩展 PDOStatement 和 PDO,我发现通过引用发送 PDOExtended 类有所帮助
在构造函数中,在 parent::__construct() 之后
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}

以及在
class PDOStatementExtended extends \PDOStatement
{

protected function __construct
(
\PDO &$PDO,
)
pokojny at radlight dot com
18 年前
我想扩展 PDO 类来存储数据库用量统计信息,但我遇到了一些问题。我想统计创建的语句数量及其执行次数。因此,PDOStatement 应该与创建它的 PDO 链接并存储统计信息。问题是我不知道 PDO 如何创建 PDOStatement(构造函数参数等等),所以我创建了这两个类

<?php
/**
* PHP 文档对象增强版
*
* PHP 文档对象增强版是一个库,具有 PDO 的功能,完全用 PHP 编写,因此开发人员可以轻松地用特定功能扩展其类,
* 例如在 v1.0b 中实现的数据库使用统计
*
* @author Peter Pokojny
* @license http://opensource.org/licenses/gpl-license.php GNU 通用公共许可证
*/
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;
}
}
?>

类具有原始 PDO 和 PDOStatement 对象的属性,这些对象提供了 PDOp 和 PDOpStatement 的功能。
从外部来看,PDOp 和 PDOpStatement 看起来像 PDO 和 PDOStatement,但也提供了所需的信息。
www.navin.biz
18 年前
下面是扩展 PDO 和 PDOStatement 类的示例

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

?>
To Top