我写了一个类来加载数据并通过MySQLi导出为SMARTY格式
public function myRow($sql)
{
$this->connect();
$rec = $this->conn->query($sql);
$this->recordCount = $rec->num_rows;
if ($this->makeRecordCount) {
$this->totalRecordCount = $this->recordCount;
}
if ($this->recordCount > 0) {
$names = array();
$result = array();
$temp = array();
$count = $rec->field_count;
// Get fields name
while ($fields = mysqli_fetch_field($rec)) {
$names[] = $fields->name;
}
while ($row = $rec->fetch_assoc()) {
foreach ($names as $name) {
$temp[$name] = $row[$name];
}
array_push($result, $temp);
}
} else {
$result = null;
}
$this->conn->close();
return $result;
}
然后我可以像
那样$sql = "SELECT * FROM `table`";
$datas = $class->myRow($sql);
$smarty->assign('datas', $datas);
可能有很多数据需要在一个页面中加载,我只想连接一次数据库,但我想在课堂上做这一切,我不想做像
这样的事情$class->connect();
$sql = "SELECT * FROM `table`";
$datas = $class->myRow($sql);
$smarty->assign('datas', $datas);
$sql = "SELECT * FROM `table2`";
$datas = $class->myRow($sql);
$smarty->assign('data2s', $data2s);
$class->close();
我觉得它很难看,但如果我在课堂上这样做,那意味着我在每个数据加载时打开和关闭连接,如何更美观?
答案 0 :(得分:1)
也许我错了,但你不需要强制关闭mysql连接,因为如果连接不是persistent
,那么php garbage collector
会关闭所有连接脚本执行后。
所以我建议你不要强制关闭mysql,让garbage collector
处理这个任务,如果你确定不再需要mysql事务,那么只能自己关闭连接。
答案 1 :(得分:1)
您根本不需要(并且不应该)打开/关闭myRow()
功能内的连接。
选项1(天真的方法):在班级处理连接
class MyDAOClass {
private static $connection = null;
public function __construct() {
if (self::$connection === null) {
// establish connection here
}
}
public function myRow(...) {
// use self::$connection here
}
}
选项2:
从类外部处理连接(可能在单例类中),因为应用程序中的所有对象可能共享同一个对象。
答案 2 :(得分:0)
你的第二个建议是我会做的。
$class->connect();
$sql = "SELECT * FROM `table`";
$datas = $class->myRow($sql);
$smarty->assign('datas', $datas);
$sql = "SELECT * FROM `table2`";
$datas = $class->myRow($sql);
$smarty->assign('data2s', $data2s);
$class->close();
您连接到数据库一次。由于PHP是单线程的,您将加载第一个结果,然后立即加载第二个结果。一切都完成后,关闭连接。没有任何连接可以保持比它更长的时间,这很好。
我通常做的是使与Smarty相关联的方法也关闭我的数据库连接。这样我就不用担心关闭它了。
这样的事情:
<?php
// Store reference to Smarty in Class
$class->setSmarty($smarty);
[...]
// Done with all database fetching, now display the template
$class->display('my_template.tpl');
[...]
// Example inplementation of the class
Class YourClass {
private $smarty;
public function setSmarty($smarty) {
$this->smarty = &$smarty;
}
public function display($tpl) {
$this->close();
$this->smarty->display($tpl);
}
}
?>