[ luner @ 08.09.2002. 19:26 ] @
Naišao sam na jedan problem. Evo opisa:

Plan mi je da napišem funkcije za rad sa bazom podataka i da ih smestim u jedan fajl (recimo funkcije.inc.php). Nakon toga bih želeo da uradim include() tog skripta i da pozivam pojednostavljene funkcije njihovim imenima. Međutim, ovo već u start ue funkcioniše. Evo delova koda:

fajl_koji_bi_trebalo_da_includ-uje_funkcije.php:
------------------------------------------------------------
include("./etc/config.inc.php");
include("./etc/sql/${dbtype}/config.inc.php");
include("./etc/sql/${dbtype}/funkcije.inc.php");

// Povezivanje sa bazom podataka.
db-povezivanje($dbhost, $dbuser, $dbpass);
------------------------------------------------------------

U fajlu ./etc/sql/${dbtype}/config.inc.php se nalaze vrednosti za $dbhost, $dbuser i $dbpass.

Evo i fajla sa funkcijama za mysql:

funkcije.inc.php:
------------------------------------------------------------
<?

function db-povezivanje($dbhost, $dbuser, $dbpass) {
$dbc = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$dbc) {
die(Header("Location: index.php?greska=2"));
}
}

?>
------------------------------------------------------------

Medjutim, ovo ne radi. Fajl fajl_koji_bi_trebalo_da_includ-uje_funkcije.php jednostavno ne uradi ništa (čak ništa i ne ispiše mada ispod ima još koda koji bi morao da ispiše nešto ili makar da preusmeri) kada se na navedeni način pozove funkcija db-povezivanje().

Ukoliko umesto da includujem funkcije i pozivam moju funkciju db-povezivanje napišem :
------------------------------------------------------------
$dbc = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$dbc) {
die(Header("Location: index.php?greska=2"));
}
------------------------------------------------------------
direktno - sve radi kao pucka. Ali na meni zamišljeni način neće.

Gde sam napravio grešku, kako je ispraviti i da li je ovakva zamisao uopšte moguća u PHP-u?

Ovakva primena ovde deluje kao čisto komplikovanje ali je ovo samo početak koda. U redovima:

include("./etc/sql/${dbtype}/config.inc.php");
include("./etc/sql/${dbtype}/funkcije.inc.php");

se vidi promenljiva $dbtype tako da se ovaj skript jednostavno može koristiti sa svim bazama podataka uz prepisivanje funkcija za taj tip baze podataka i setovanje promenljive $dbtype.
[ -zombie- @ 09.09.2002. 06:34 ] @
lepa ideja, ali ne morash da izmisljash rupu na saksiji. sve to sto si ti zamislio zove se db apstrakcija, i vec radi PEAR klasa DB, i njene potklase (valjda DB::MySql i slicno)...

a cini mi se i da ne znash sta je to PEAR. pear je PHP Extension and Application Repository, iliti biblioteka standardnih klasa i aplikacija za rad sa svacim u php-u, nastala po uzoru na perlovu slicnu biblioteku.

o pear-u pogledaj na http://pear.php.net a doticnui DB paket potrazi na http://pear.php.net/manual/en/core.db.php

(inace, cini mi se da je bash db apstrakcija bila jedan od pokretaca za razvoj pear-a, i jedna od prvih klasa uradjenih u njemu...)


a sada da se vratim na tvoje klase. problem je sto pogresno koristish { i } u stringovima. u tvom slucaju samo ih izbaci iz stringova kao sto su "./etc/sql/$dbtype/convig.inc.php" i sve bi trebalo da proradi. ako bash oces, mozes i da koristish { i } ali onda stavi sa "string {$var} strin". inace, { i } se koriste za slozene izraze u sred stringa, tipa "string {$array[$key]} " i slicno...

josh jedan predlog bi ti bio da (bar dok razvijash aplikacije) ukljucish error_reporting() na E_ALL. zivecesh duze ;).

meni se cini da su tebi skroz iskljucene greske... ja preporucujem bash E_ALL bash zato sto prikazuje i warninge i notice-ove, jer su i to potencialne rupe u programu...
[ Goran Rakić @ 09.09.2002. 14:21 ] @
jedno pitanje u vezi sa pear-om. To je biblioteka koja mora biti dodana u php.ini kao include path i mora biti na ciljnom serveru. Da li je moguce koristiti PEAR ukoliko ga admin ne voli?
[ dwarf @ 09.09.2002. 17:09 ] @
Ja sam imao isti problem kada sam nesto razvijao i jednostavno sam pogledao sors doticne klase i samo prekopirao sve foldere i fajlove koji su potrebni za istu da radi kako bi trebalo. Sve je radilo kao zmaj. Probaj tako.

Doduse, ovo je malo veca gnjavaza i nije toliko elegantno. Ali sta ces...

P.S.: Inace, vidim da su konacno doterali dokumentaciju za doticnu klasu...Ehehe...
[ luner @ 09.09.2002. 17:17 ] @
Hehe, Go! X baš to i mene interesuje jer su administratori obično nežna i fnia bića koja ne podnose nikakvu konverzaciju sem ako to nisu pohvale :)).
[ luner @ 09.09.2002. 17:46 ] @
Uzgred, zaboravih da se zahvalim.

Uradio sam gore navedeno i sve radi kao pucka :)

Hvala gosn Zombi!
[ Goran Rakić @ 09.09.2002. 22:17 ] @
napisacu ipak svoju abstrakciju. treba mi za phplance, a moci cu da je koristim bilo gde onda.
[ bOkIcA @ 10.09.2002. 01:04 ] @

ADODB again.
http://php.weblogs.com/ADODB



Connecting to the Database
Code:

include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");


Executing the SQL
Code:

$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed"); 

.
.
.
http://php.weblogs.com/adodb_tutorial
[ -zombie- @ 10.09.2002. 04:35 ] @
Citat:
Go! X:
napisacu ipak svoju abstrakciju. treba mi za phplance, a moci cu da je koristim bilo gde onda.


ma pear moze da se koristi bilo gde.

ako bash neces da cackas/zavisish od admin-a, sve sto treba da uradish je da skinesh php sa sajta, izvadish odatle pear direktorijum (ili samo delove koje koristish), i iskopirash ga na server gde je tvoja aplikacija.

onda samo iskoristish ini_set() ( http://php.net/ini_set ) funkciju da postavish da include_path sadrzi pear dir, i gotovo.

ako ti se vec svidja pear, nema razloga da ga ne koristish. cak sta vise, pisaces kod koji ce (ako zatreba) drugi moci da nastavi da odrzava / dopunjuje...


sto se adodb-a tice, mozda je lepa klasa, ali je PEAR::DB ipak standardnija, i pisu je (izmedju ostalog) isti ljudi koji su napravili php ovako lepim jezikom kakav je...

ako bash ocesh, evo i tebi primera:

Code:

require_once "DB.php";
$dbh = DB::connect("mysql://localhost/baza");
if (DB::isError($dbh)) {
....die("greska: ".$dbh->getMessage());


i
Code:

$sth = $dbh->query("SELECT polje FROM tabela");
$row = $sth->fetchRow();
echo $row['polje'];


ovo je iz glave, ali bi trebalo da radi...
[ dwarf @ 10.09.2002. 08:14 ] @
ADODB je fin, ali meni nije bas otliko lep kao PEAR:B. Jednostavno me suvise podseca na ASP i to mi je malo depresivno...