To je zato sto ne koristis klase pa ti je kod toliko tvrd (nefleksibilan). Zamisli da hoces da promenis nesto, ili recimo zamisli da umesto mysql (vidim da prenosis globalnu varijablu $db_link) hoces da koristis pgsql - ceo kod pišeš ponovo.
Zar nije bolje da napraviš abstraktnu klasu koja radi sa bazom podataka pa onda za svaku novu klasu imaš varijablu $dbclass ili tako nešto i jednostavni manipulišeš sa bazom podataka... hajde da pokušam da objasnim kako ja to radim (ako nekoga interesuje)
imam klasu Database:
Code:
class Database
{
function Database ($dbHost, $dbName, $dbUser, $dbPass, $connect = true)
{
$this->dbHost = $dbHost;
$this->dbName = $dbName;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
....
onda je extendujem sa mysq_database
Code:
class SQLDatabase extends Database
{
var $resultType = MYSQL_ASSOC;
function SQLDatabase ($dbHost, $dbName, $dbUser, $dbPass, $connect = true)
{
parent::Database ($dbHost, $dbName, $dbUser, $dbPass, $connect);
}
function query ($query_string)
{
...
a onda svaku novu klasu deklarisem kao
Code:
class Users
{
var $dbClass;
/* Constructor */
function Users (&$dbClass)
{
$this->dbClass = $dbClass;
}
...
i kada iz klase radim query, samo zovem
Code:
$this->dbClass->query ($query_string)
Zato, ako hocu recimo da radim sa PG, ceo kod ostaje isti samo izaberem drugu db klasu koja radi sa pgsql, a pošto su nazivi funkcija isti, ostatak koda se ne menja.
Još bolje, dodati neku konstantu kojom definišeš sa kojom bazom radiš pa onda u odnosu na vrednost te konstante include-uješ odgovarajući file.
Code:
if (!defined('SQL_DB'))
define('SQL_DB', 'mysql4');
switch(SQL_DB)
{
case 'postgres':
case 'postgres7':
require_once "class.postgres7.database.php";
break;
case 'mysql4':
default:
require_once "class.mysql.database.php";
break;
}
a obe klase se zovu SQLDatabase pa kada uradim
$dbclass = new SQLDatabase (...)
sve jedno je koja je DB
Napominjem da verovatno postoje i druga kvalitetn(ij)a rešenja, ali ja ovako radim zato što rezultati koje dobijem iz querija mogu odmah da koristim sa smarty.
Mozda odstupam od teme, ali je to zbog ideje da bi ovo nekome moglo da koristi, a u decembru sam imao jedan projekat gde je trebalo da prepravim postojeci kod koji je neko drugi pisao, pa sam naisao na gomilu problema zbog koda koji je pisan u funkcijama u kojoj svaka pocinje sa mysql_connect (samo primer) i jednostavno moras da ides fajl po fajl, funkciju po funkciju i da menjas sve isto, slaba vajda cak i od search-replace...
onda u vezi global, covek je pravio globalne varijable:
global $HTTP_POST_VARS
pa kada sa search-replace zamenim $HTTP_POST_VARS za $_POST moram jos da idem funkciju po funkciju i brisem ovo iz global... Hocu da kazem, gomila problema samo zbog koda koji je pisan bez plana....
Goran Pilipović fka bluesman