Webprogramozás arr PHP info PHP PDO Osztály Kiterjesztése
(#2) RimElek 2013.05.27. 18:55

RimElek
RimElek
VIP

Helló

Először is a PDO nem driver, hanem kiterjesztés. Esetleg osztálykönyvtár. Amit használhatsz különböző driverekkel:
http://www.php.net/manual/en/pdo.drivers.php



Te igazából teljesen feleslegesen örököltetsz a PDO osztályból, ugyanis sehol sem használod ki az öröklés tényét. Csak létrehozod a leszármazott osztály konstruktorában a PDO példányát és elmented egy "link" tulajdonságba. Miközben azzal, hogy példányosítod a Database osztályodat, már létrejött egy PDO példány, amire a $this kulcsszóval tudsz hivatkozni.

Saját konstruktorra így nem is lenne szükséged, de ha a kivételt mindenképpen el akarod kapni konstruktorban, akkor is elég a

1
parent::__construct($dsn, $username, $password, $options)


Nem kell semmilyen változónak átadni már semmit. Ezzel csak a szülő konstruktorát hívod. Ami azért kell, mert a saját konstruktoroddal elfedted az eredetit. Külön kell hivatkozni rá.

További tulajdonságokat is feleslegesen tárolsz. A kapcsolódási adatokra nincs is máshol szükséged, mint a konstruktorban.

PDO-tól független, de hibás, hogy ilyen ellenőrzésed van:

1
if (is_array($array['where']) && $array['where'] != '') {


Először megnézed, hogy tömb-e. De például mi van, ha nem is létezik a 'where' index? Az "isset"-tel tudnád ellenőrizni, hogy létezik-e. És még minden más művelet előtt kell. Az && utáni rész akkor fut csak le, ha az előző feltétel igaz volt. Vagyis a fenti példában, ha tömb volt az $array['where'], csak akkor nézed meg, hogy véletlenül nem egy üres string-e. Miközben tudod, hogy nem. Mindig igazat fog adni. Azt, hogy a tömb üres-e, nem így vizsgáljuk, hanem az "empty"-vel, vagy nézheted a hosszát a "count" függvénnyel, vagy nézheted, hogy egyenlő-e az üres tömbbel: array()

Így készíthetsz egyébként default értékeket, hogy mindenképpen létezzenek a használt indexek:

1
2
3
4
5
6
7
8
$array = $array + array(
   'select' => '',
   'from' => '',
   'where' => array(),
   'like' => '',
   'order' => '',
   'limit' => '' 
);


Így csak azt kell nézni, hogy értelmes-e az értékük. Persze még mindig lehet, hogy eleve nem is tömböt adtál át.
Ha használod a "type hinting" -et a paraméterátadásnál ( osztályneveket és az "array" kulcsszót használhatod csak ), akkor át se adhatsz mást, mint tömböt:

1
public function dbSelect(array $array = array()) {


Amit pedig te "operand"-nak hívsz, az nem operandus, hanem logikai operátor.

A dbSelect értékében és értelmében nem vagyok biztos. Csak akkor készíts külön metódust valamire, ha az tényleg segíteni fog neked! Amíg a tömbödet feltöltöd, addig az sql-t is megírod. Nem lesz sokkal rövidebb a kódod és hibalehetőség se lesz sokkal kevesebb. A mezőneveket továbbra is elírhatod és nehezebb debugolni is, ha nem látod a készített sql-t. Ezért majd hiba esetén írhatsz print-eket, hogy lásd az sql-t.

Egyféle kapcsolatot tudsz a feltételek között megadni. Vagy AND vagy OR. Nincs lehetőség felváltva vagy zárójelezésre. A speciálisabb összehasonlításokról és függvényekről nem is beszélve.

Csak az inner join-t tudod szimulálni táblák összekapcsolásához több tábla felsorolásával a select-ben. De a táblanevek köré írható "backtick" -et ( `tablaneve` ) kézzel kell úgyis beírnod. Ha nem teszed, egy foglalt szóval gondok lehetnek.

A vagdosós stringes megoldást is át lehetne gondolni, de az nem akkora probléma. Csak a kódolvasást teszi nehezebbé. Pl ha nem rakod bele a where kulcsszót az sql-be előre, akkor hozzátoldhatod, amikor már tudod, hogy lesz feltétel. És nem kell ellenkező esetben visszavágnod a stringet.

Tudom, hogy ez csak kezdeti próbálkozás, de ha ezt egy éles rendszerre írod, akkor inkább próbáld úgy elkészíteni, hogy előbb átgondolod, hogy milyen sql-ekre lesz szükséged. És az azokhoz szükséges általánosítást leprogramozhatod. Nem feltétlenül kell az alap select-ig lemenni. Vagy pedig sokkal profibbat kell írnod, ami viszont már lehet, hogy sokkal több tanulást is igényel. És vannak erre kész megoldások. Csak az alkalmazásuk is sokkal bonyolultabb.


Utoljára szerkesztette: RimElek 2013.05.27. 19:02