【发布时间】:2011-08-20 05:43:30
【问题描述】:
到目前为止
class PDOExtender
{
private $_DBO;
public function openConnection()
{
$dsn = "mysql:host=".DB_HOST.";dbname=".DB_NAME;
$this->_DBO = new PDO($dsn, DB_USER, DB_PASS, array(PDO::ATTR_PERSISTENT => true));
}
}
我知道这个类实际上并没有扩展 pdo 对象,我不知道我为什么这么称呼它。
我的问题
我需要添加这个类,以便我可以进行一些查询,特别是使用准备好的语句。有人可以给我反馈一下要添加什么来实现这一点。
我目前正在从另一个这样的类中调用这个类,
$this->_siteRegistry = Registry::singleton();
$this->_siteRegistry->storeObject("PDOExtender", "DBO");
$this->_DBO = $this->_siteRegistry->getObject("DBO");
try {
$this->_DBO->openConnection();
} catch(Exception $e) {
throw new Exception("server");
}
我的老路,没有 PDO
在我的旧项目中,我只使用了 mysql,但我自己创建了代码,我确信它不是完成工作的最佳方式,所以我宁愿不只使用集成了 pdo 的代码。
就是这样,
public function runQuery($query, $functionArray = array(), $needResults)
{
$stmtParam = "";
$parameters = array();
$results = array();
foreach ($functionArray as $v) {
$stmtParam .= "s";
}
array_unshift($functionArray, $stmtParam);
$stmt = $this->_dbConnection->prepare($query);
call_user_func_array(array($stmt, 'bind_param'), $functionArray);
$stmt->execute();
if($needResults) {
$meta = $stmt->result_metadata();
while ( $field = $meta->fetch_field() ) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $parameters);
while ( $stmt->fetch() ) {
$x = array();
foreach( $row as $key => $val ) {
$x[$key] = $val;
}
$results[] = $x;
}
return $results;
} else return true;
}
完成
我需要帮助我将旧代码转换为与 pdo 一起使用。
如果有人知道任何展示如何做到这一点的优秀教程,请链接它们,我确实看过但找不到。
感谢您的宝贵时间
克里斯
【问题讨论】:
-
1.你有什么不工作的? 2. 为什么你觉得有必要将 PDO - 一个类 - 包装在另一个类中?您打算添加哪些功能?
-
@Erick 我认为他现在使用单例模式这一事实将提高性能,因为他不会为每个查询初始化连接。干杯!
-
@pleasedontbelong 如果您需要为每个查询初始化连接,那么您只是 做错了 (tm)。此外,singletons are evil.
-
@teresko 这就是我所说的 =) 初始化连接是 web 开发人员(至少我知道的那些)的一个常见问题。该视频主要适用于 Java 开发,您可以在其中拥有 Application Wide 的实例。而在 Php 中,每个请求都是“main()”.. 就像视频中所说的“拥有某个事物的单个实例并没有错,当它与全局状态紧密相关时,它会成为一个问题”.. 我猜 DB 连接是单例模式的一个很好的候选者:) 至少在 php 中
-
@pleasedontbelong 没有什么适合单例的。您应该为构造函数中需要它的所有对象提供相同的连接对象。