扩展PDO语句类
答
您可以设置类PDO::setAttribute()
:
PDO :: ATTR_STATEMENT_CLASS:从PDOStatement对象导出设置用户提供的语句类。不能与持久性PDO实例一起使用。需要数组(字符串classname,数组(混合constructor_args))。
例子:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Custom', array($pdo)));
答
这是由用户在PHP手册中回答PDO下:在本页面 'smileaf':
class Database extends PDO {
function __construct($dsn, $username="", $password="", $driver_options=array()) {
parent::__construct($dsn,$username,$password, $driver_options);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement {
public $dbh;
protected function __construct($dbh) {
$this->dbh = $dbh;
}
}
您可以通过搜索找到了他原来的答案:https://php.net/manual/en/book.pdo.php
答
这是我的代码将选择查询的结果作为插入语句保存到文本文件中。 我第一次延长PDOStatement对象类添加自定义方法saveResultAsInsertStatement:
<?php
class MyPDOStatement extends PDOStatement {
protected $pdo;
protected function __construct($pdo) {
$this->pdo = $pdo;
}
public function saveResultAsInsertStatement($filename) {
$result = '';
$columnData = $this->fetchAll(PDO::FETCH_ASSOC);
if ($columnData != null) {
$fieldCount = count($columnData[0]);
$rowsCount = count($columnData);
$columnsName = array_keys($columnData[0]);
$result = "INSERT INTO %s (\n";
$result .= join(",\n", $columnsName);
$result .= ") VALUES\n";
$r = 0;
foreach ($columnData as $row) {
$result .= "(";
$c = 0;
foreach ($row as $key => $field) {
$result .= $this->pdo->quote($field);
$result .= (++$c < $fieldCount) ? ', ' : '';
}
$result .= ")";
$result .= (++$r < $rowsCount) ? ',' : '';
$result .= "\n";
}
}
$f = fopen($filename, "w");
fwrite($f, $result);
fclose($f);
}
}
?>
然后我扩展PDO类设置属性PDO :: ATTR_STATEMENT_CLASS
<?php
class MyPDO extends PDO {
public function __construct(... PDO constructor parameters here ...) {
parent::__construct(... PDO construct parameters here ...);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
}
}
?>
那么,我可以这样写:
<?php
$conn = new MyPDO(... PDO constructor parameters here ...);
$sql = ... your select statement here...
$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
?>
请注意,默认的构造函数不需要一个参数(所以没有'array($ pdo)'那里)。此外,对于在命名空间中的使用,您可以使用'Custom :: class'而不是''Custom'',它可以为您提供有关当前'use'导入的全限定类名。 – bodo 2016-05-27 17:25:44