Для чего это стоит, у меня была такая же проблема, и вот как я подошел к ней.Я разделил функции базы данных на два разных класса: База данных и Запрос.Я настраиваю и открываю базу данных в моей функции init, а затем вызываю экземпляры моего класса Query по всей странице, закрывая запросы каждый раз, когда я закончу.Наконец, я закрываю базу данных.
В реальных классах, которые я использую, есть еще проверка ошибок и другие вещи, которые я специально, но вот черновики, которые я использую, когда собираю схему.Может быть, это будет вам полезно.
Класс базы данных:
<?php
class Database {
private $db, $dbserver, $dbport, $dbname, $dbuser, $dbpassword;
//----------------------------------------------------------------------------------------------------------
//Function: __construct()
//----------------------------------------------------------------------------------------------------------
public function __construct($idbserver, $idbport, $idbname, $idbuser, $idbpassword)
{
$this->dbserver = $idbserver;
$this->dbport = $idbport;
$this->dbname = $idbname;
$this->dbuser = $idbuser;
$this->dbpassword = $idbpassword;
}
//----------------------------------------------------------------------------------------------------------
//Function: openDatabase()
//----------------------------------------------------------------------------------------------------------
public function openDatabase()
{
/* Create a new user db object with persistent database connection parameters */
try {
$this->db = new PDO("mysql:host=".$this->dbserver.";dbname=".$this->dbname.";port=".$this->dbport, $this->dbuser, $this->dbpassword, array(
PDO::ATTR_PERSISTENT => true
));
return true;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
//----------------------------------------------------------------------------------------------------------
//Function: getDB
//----------------------------------------------------------------------------------------------------------
public function getDB()
{
//return the database
return $this->db;
}
//----------------------------------------------------------------------------------------------------------
//Function: getDBName
//----------------------------------------------------------------------------------------------------------
public function getDBName()
{
//return the database
return $this->dbname;
}
//----------------------------------------------------------------------------------------------------------
//Function: closeUserDatabase
//----------------------------------------------------------------------------------------------------------
public function closeDatabase()
{
//close the database
$this->db=null;
}
}
?>
Тогда мой класс запросов:
<?php
class Query {
private $db, $sql, $qresult;
//----------------------------------------------------------------------------------------------------------
//Function: __construct
//----------------------------------------------------------------------------------------------------------
public function __construct($idb, $isql)
{
$this->db = $idb;
$this->sql = $isql;
}
//----------------------------------------------------------------------------------------------------------
//Function: openQuery
//----------------------------------------------------------------------------------------------------------
public function openQuery($param)
{
/* assemble and run a query and return a result object */
//prepare the sql statement
//get the db object
$tempdb= $this->db->getDB();
$this->qresult = $tempdb->prepare($this->sql);
//bind parameters to the prepared statement
foreach ($param as $key => $value) {
$this->qresult->bindValue($key,$value);
}
return $this->qresult->execute();
}
//----------------------------------------------------------------------------------------------------------
//Function: fetchAssociative
//----------------------------------------------------------------------------------------------------------
public function fetchAssociative()
{
return $this->qresult->fetch(PDO::FETCH_ASSOC);
}
//----------------------------------------------------------------------------------------------------------
//Function: closeQuery
//----------------------------------------------------------------------------------------------------------
public function closeQuery()
{
$this->qresult = null;
}
}
?>
Затем я настроил базу данных в моей функции инициализации:
//initialize the user database with buffered set true so we can use nested queries
$usrdb = new Database($udbserver, $udbport, $udbname, $udbuser, $udbpassword, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
//open the database
$usrdb->openDatabase();
Затем я вызываю свой запрос на странице:
//set up the sql
$sql = "SELECT * FROM Blah WHERE blahid = :filter";
//create the parameter array
$params = array(':filter'=>$filter);
//craetea new query
$q = new Query($usrdb, $sql);
//run the query
if ($q->openQuery($params)) {
//get the results if there are any
while ($row=$q->fetchAssociative()) {
$viewData['blahid']=$row['blahid'];
}
}
//clean up the query
$q->closeQuery();
После этого я работаю с результатами, как всегда.