对不起,如果这是错误的或令人困惑的我是非常新的使用类,我想开始学习更多关于使用PDO与mysql。
以下是来自php.net的示例代码
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();
?>
通常只使用常规的mysql扩展,我喜欢将所有默认方法包装到我自己的方法中,例如当我不使用PDO时我有一个类
数据库类
当我这样称呼这个班级时......
$db = new Database;
$db->execute('SQL QUERY GOES HERE');
在我的执行方法中,我会运行一个regualr查询,但也检查我是否是管理员,如果我是管理员并运行查询,那么我将页面上的查询计算到会话并显示它。
所以使用PDO类,我怎么能将它的所有方法都包装到我自己的类中,这样我就可以做一些事情来计算某些用户在页面上运行的查询?
答案 0 :(得分:1)
您可以扩展内置PDO类。
<?php
class Database extends PDO {
// your methods and properties here
}
答案 1 :(得分:1)
已经提到了扩展PDO和PDOStatement,这是一个(*咳嗽*未记录)的例子:
class MyPDOStatement extends PDOStatement {
public $logExecution = false;
protected $listeners = array();
public function execute($input_parameters=array()) {
foreach( $this->listeners as $cb ) {
call_user_func($cb);
}
return parent::execute($input_parameters);
}
public function addListener($cb) {
$this->listeners[] = $cb;
}
}
class MyPDO extends PDO {
const ATTR_LOG_QUERIES = 'MyPDO_ATTR_LOG_QUERIES';
public function prepare($statement, $driver_options=array()) {
echo "MyPDO::prepare()\n";
// tell PDO::prepare to create an instance of MyPDOStatement as the statement object
$driver_options[PDO::ATTR_STATEMENT_CLASS] = array('MyPDOStatement');
$stmt = parent::prepare($statement, $driver_options);
if ( isset($driver_options[MyPDO::ATTR_LOG_QUERIES]) ) {
$stmt->addListener($driver_options[MyPDO::ATTR_LOG_QUERIES]);
}
return $stmt;
}
}
class Foo {
public $counter = 0;
public function onBar() {
echo "Foo::onBar()\n";
$this->counter += 1;
}
}
$pdo = new MyPDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('CREATE TABLE foo ( x INTEGER, y INTEGER)');
$foo = new Foo;
$stmt = $pdo->prepare(
'INSERT INTO foo (x,y) VALUES (?,?)',
array(MyPDO::ATTR_LOG_QUERIES=>array($foo, 'onBar'))
);
echo 'class($stmt)=', get_class($stmt), "\n";
$stmt->execute(array(1,1));
$stmt->execute(array(2,2));
echo 'counter=', $foo->counter;
打印
MyPDO::prepare()
class($stmt)=MyPDOStatement
Foo::onBar()
Foo::onBar()
counter=2
答案 2 :(得分:1)
为什么不使用PDO CRUD类?
答案 3 :(得分:-1)
不完全相关,但我设法wrap the most common functions of PDO inside a function但是,您应该follow Mike advice。 =)