Source for file IsMySQLClass.class.php
Documentation is available at IsMySQLClass.class.php
* @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
* @copyright Copyright (C) 2010, Takács Ákos
* @license http://www.gnu.org/licenses/lgpl.html
require_once dirname(__FILE__
).
'/../ADBClass.class.php';
require_once dirname(__FILE__
).
'/../IIsDBClass.class.php';
* Adatbázis táblákat megvalósító osztály
* Az osztály, ami ezt az osztályt örökli, a konstruktorban megadott tábla, és mezőlista alapján elkészíti
* saját tulajdonságait a mezőkkel azonos néven. Lehetőség van külön jelölni azt is, hogy pontosan melyik
* tábla mezőjéről van szó, ha azonos mezőnevek is szerepelnek. Amennyiben ez nem történik meg, értékadáskor
* az összes táblában megkapja az új értéket az adott nevű mező. Érték lekérdezésekor pedig kivételt dob. <br />
* Alapesetben ilyenkor a tulajdonságot a 'T_' karakterlánccal kell kezdeni, majd a táblanevet és a
* mezőnevet egy '_' karakter választja el egymástól. Ez azonban testre szabható. A 'T_' előtag
* a {@link $tableName_signal} tulajdonságban, míg a táblát és mezőt elválasztó karakterlánc a
* {@link $table_field_sep} tulajdonságban.<br />
* <b>Az osztály helyes használata:</b><br />
* require_once 'REDBObjects/REDBObjects.class.php';
* REDBObjects::uses('mysql');
* mysql_connect('localhost', 'root', 'password');
* mysql_select_db('teszt');
* class MyClass extends IsMySQLClass {}
* $user = new MyClass(array(
* 'users'=>array('useremail','username'),
* 'profile'=>array('firstname','lastname','useremail')));
* $user->keyName = 'userid';
* $user->init(12); //Valamilyen kapcsoló mező értéke alapján
* //Vagy sql lekérdezés alapján. Ekkor a második paraméter true kell legyen.
* //Első paraméter pedig az sql lekérdezés FROM kulcsszó utáni része
* //$user->init("users left join profile where users.useremail = 'valami@ize.hu'",true);
* print "A nevem: ".$user->lastname." ".$user->firstname."<br />";
* $user->lastname = 'Új vezetéknév';
* $user->firstname 'Új keresztnév';
* //$user['lastname'] = 'Új vezetéknév';
* $user->T_profile_useremail = 'Új publikus emailcím';
* //Ez a metódus végzi el a frissítést. Enélkül nem kerül adatbázisba az új adat
* @property string $tableName_signal Táblanevet jelző prefix
* @property string $table_field_sep Táblanevet és mezőnevet elválasztó jel
* @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
* @copyright Copyright (C) 2010, Takács Ákos
* @license http://www.gnu.org/licenses/lgpl.html
* Az értékadás feltöltődő asszociatív tömb
* @var array $new_properties
* A táblákat összekapcsoló mező értéke
* Ezt a mezőt csak az {@link IsDBList} osztály használja, hogy visszaadja az utoljára hozzáadott rekord
* összekapcsoló mezőjének értékét.
* Sql kérés volt-e megadva az init() paramétereként.
* @var string $isSqlQuery
* IsMySQLClass osztály konstruktora
* @param array $tablelist Két dimenziós tömb. Formátuma:
* array('table1'=>array('field1'[,field2]...)[,'table2'=>array('field1'[,'field2']...)]... )
* @param bool $list Ha false, akkor nem kérdezi le a mezőneveket előre.
* @return int Objektum tulajdonságainak száma
* Objektum inicializálása
* Ez a metódus választja ki a táblákból azt az egy rekordot, amiből létrehozza az objektumtulajdonságokat.
* @param mixed $rowid Azonosító, ami minden táblában azonos értékű
* @param bool $bool Ha true, akkor a $rowid lehet sql utasítás ( csak a from kulcsszó utáni rész )
public function init($rowid,$bool=
false)
//ha sql lekérdezéssel inicializáljuk az objektumot
//végig kell menni a táblalistánés összeállítani a lekérdezendő mezőlistát
foreach($this->tablelist as $tableName=>
$fieldList)
//egy táblán belül az összes mező felvétele táblanevet tartalmazó aliassal
foreach ($fieldList as $field)
$afields[] =
"`$tableName`.`$field` as `$tableName.$field`";
//ha az elsődleges kulcs mezőt nem kértük le, akkor automatikusan lekérdezéshez adódik
if (!isset
($fieldList[key($this->priKeys[$tableName])])) {
$afields[] =
"`$tableName`.`".
"` as `$tableName.".
key($this->priKeys[$tableName]).
"`";
$sql =
"select $fields from $rowid";
//itt az eredményt be kell tölteni a properties tulajdonságba
foreach($this->tablelist as $tableName=>
$fieldList)
foreach ($fieldList as $field)
$this->properties[$tableName][$field] =
$fetch[$tableName.
'.'.
$field];
//az elsődleges kulcsok értékeit külön is tárolni kell egy tömbben
$fetch[$tableName.
'.'.
key($this->priKeys[$tableName])];
//Ez a rész már csak akkor fut le, ha nem sql lekérdezéssel, hanem mező értékkel inicializáltuk az objektumot
//A kapcsoló mező nevére szükség van. Ezért ha nincs megadva, kivételt kell dobni
//végig kell menni ciklusban az összes táblán, és lekérdezni a mezők értékeit
foreach ($this->tablelist as $tableName=>
$fieldList) {
$fields =
'`'.
implode('`, `',$fieldList).
'`';
$sql =
"select $fields from `$t` where `".
$this->keyName.
"` = '$rowid' limit 1";
* A táblalista szerint az összes lehetséges mező nevének lekérdezése,
* és beállítása tulajdonságnak
//a táblákat végigjárva az összes mezőjének nevét lekérdezi, így az indexek mindig léteznek,
//és az update() metódus akor is kiszűri a nem létező neveket, ha nem volt inicializálva az objektum
foreach($this->tablelist as $tableName =>
$fieldList)
$tn =
$from =
$tableName;
//ha az összes mezőt * karakterrel jelöltük
if (($_in =
$in) !==
false or ($in =
array_search('*',$fieldList)) !==
false)
//akkor törölhető a lista és felvehetők az mezőnevek egyenként
if ($_in ===
false) $this->tablelist[$tableName] =
array();
$this->tablelist[$tableName][] =
$field['Field'];
$this->properties[$tableName][$field['Field']] =
'';
//Ha ez az elsődleges kulcs mező, akkor visszaadja a primary_key
//tulajdonságnak, hogy a kapcsoló mező elsődleges kulcs
if ($this->keyName ==
$field['Field'])
//minden elsődleges kulcs mező értékét külön is tároljuk,
//ezért előtte biztositjuk a helyet neki üres értékkel
if ($field['Key'] ==
'PRI')
$this->priKeys[$tableName] =
array($field['Field']=>
'');
//Mivel elsődleges kulcs mezőkre mindenképp szükség van,
//ezért kivételt kell dobni, ha egy tábla nem tartalmaz olyan mezőt.
if ( !isset
($this->priKeys[$tableName]) )
require_once dirname(__FILE__
).
'/../exceptions/IncompatibleTable.class.php';
throw
new IncompatibleTable("Egyedi elsődleges kulcs mező használata kötelező! Tábla: ".
$tableName);
* Hozzáférés a mező értékeihez
* Ez a mágikus metódus szabályozza az értékek lekérdezését.
* @param string $var Mezőnév
public function __get($var)
$table=
''; $field=
''; $hit=
false;
//Meg kell állapítani a mező és táblanevet, ha a tulajdonság lekérdezésekor a táblanevet is megadtuk
//amennyiben tényleg megadták a táblanevet, a meghatározott mezőnevet be kell állítani
//Jöhet a táblák pásztázása egyenként
foreach ($this->tablelist as $tableName=>
$fieldList)
//ha a táblanevet is megadták, de épp nem ez az a tábla,
//akkor tovább lehet menni a következő táblára
if ($issep and $tableName !=
$table) { continue; }
//ha a lekérdezendő mezők közt van a $var változó értéke
//Akkor ha már volt ilyen mező más táblában is, kivételt dobunk
//mert nem tudni melyiket kell lekérdezni
require_once dirname(__FILE__
).
'/../exceptions/AmbiguousException.class.php';
//a visszatérési értéket be lehet állítani előre
$return =
$this->properties[$tableName][$var]; $hit=
true;
//Ha volt találat, vissza lehet adni
if ($hit) return $return;
//Ha nem volt találat, és van ilyen tulajdonsága az objektumnak, akkor azt kell visszaadni
if (isset
($this->$var)) {
//de ha még az objektumnak sincs ilyen tulajdonsága, akkor kivételt dobunk
require_once dirname(__FILE__
).
'/../exceptions/NotIssetPropertyException.class.php';
* Mezők értékeinek beállítása
* Ez a mágikus metódus szabályozza értékadáskor, hogy az értékek
* a {@link $new_properties} tömbben megfelelő helyre kerüljenek
* @param string $var Mezőnév
* @param mixed $value Mező új értéke
public function __set($var,$value)
{ $table=
''; $field=
''; $hit=
false;
//Meg kell állapítani a mező és táblanevet, ha értékadáskor a táblanevet is megadtuk
//amennyiben tényleg megadták a táblanevet, a meghatározott mezőnevet be kell állítani
//Jöhet a táblák pásztázása egyenként
foreach ($this->tablelist as $tableName=>
$fieldList)
//ha a táblanevet is megadták, de épp nem ez az a tábla,
//akkor tovább lehet menni a következő táblára
if($issep and $tableName !=
$table)
//függetlenül attól, más táblának is volt-e ilyen mezője
//átadható az érték az új értékeknek
//De ha meg volt adva a táblanév is, akkor kész vagyunk. A program leáll
//Ha volt találat, kiléphetünk a programból
//ha nem votl találat, de vagy a tableName_signal vagy a table_field_sep változó üres
if (($var ==
'tableName_signal' or $var ==
'table_field_sep') and trim($value) ==
'') {
//kivételt kell dobni, mert azok nem lehetnek sosem üresek
require_once dirname(__FILE__
).
'/../exceptions/NotIssetPropertyException.class.php';
//végül az objektum tulajdonságnak kell átadni az értéket, ha másnak nem lehetett
* Visszaadja, hogy létezik-e egy objektum tulajdonság, vagy sem
* @param mixed $var Vizsgálandó tulajdonság neve
public function __isset($var)
if (isset
($this->$var)) {
$table=
''; $field=
''; $hit=
false;
//Meg kell állapítani a mező és táblanevet, ha a tulajdonság lekérdezésekor a táblanevet is megadtuk
//amennyiben tényleg megadták a táblanevet, a meghatározott mezőnevet be kell állítani
//Jöhet a táblák pásztázása egyenként
foreach ($this->tablelist as $tableName=>
$fieldList)
//ha a táblanevet is megadták, de épp nem ez az a tábla,
//akkor tovább lehet menni a következő táblára
if ($issep and $tableName !=
$table) { continue; }
//ha a lekérdezendő mezők közt van a $var változó értéke
//Akkor ha már volt ilyen mező más táblában is, kivételt dobunk
//mert nem tudni melyiket kell lekérdezni
require_once dirname(__FILE__
).
'/../exceptions/AmbiguousException.class.php';
//a visszatérési értéket be lehet állítani előre
//Ha volt találat, vissza lehet adni
if ($hit) return $return;
* Ha a metódust a false paraméterrel hívjuk meg, Nem kerül be adatbázisba a módosítás,<br />
* csak lekérdezhetővé teszi az új értékeket
function update($refreshDB=
true)
//Az összes táblán végig kell menni
foreach ($this->tablelist as $tableName =>
$fieldList)
//ha az új értékek változó nem tömb, ki kell lépni, mert a ciklus tömböt vár
//most az új értékeken kell végigmenni
//ha nem volt ilyen mező a properties tulajdonságban, akkor átugorjuk
//egyébként escapeljük az értéket
//csak azokat az értékeket hagyjuk meg amik különböznek az eredetitől
//ha frissíteni is szeretnénk az adatbázist, nem csak az objektumot
//Akkor ha van mit frissíteni
//el kell dönteni mi az updatelés feltétele. hhez kell a keyValue, és a keyName
//most már lehet összeállítani az sql utasítást
$sql =
"update `$t` set $update where `".
$keyName.
"` = '".
$keyValue.
"'";
//ha frissíteni akartuk az adatbázist és a frissítés sikeres is lett, vagy nem akartuk frissíteni
if (!$refreshDB or $query)
//akkor beállítható a lekérdezhető tulajdonságokhoz is az érték
$this->properties[$tableName][$fieldName] =
$value;
//ha frissíteni akartuk az adatbázist, akkor törölni kell az uj értékek listáját
* Iteráció alaphelyzetbe állítása
* Az aktuális elem visszaadása
public function current()
if ($k1 ===
null or $k2 ===
null)
require_once dirname(__FILE__
).
'/../exceptions/IteratorEndException.class.php';
* Következő elem visszaadása
//Ha már nincs több mező az aktuális táblában
//akkor ha még van több tábla
//Ugrás a következő tábla első mezőjére
//Egyébként az aktuális táblában a következő mezőre ugrás
* Iteráció kilépési feltétele
require_once dirname(__FILE__
).
'/../exceptions/IteratorEndException.class.php';
* Létezik-e egy megadott index a listában
public function offsetExists($index)
* Adott indexű elem lekérdezése
public function offsetGet($index)
* Adott indexű elem értékének beállítása
* Adott indexű elem érvénytelenítése
Documentation generated on Fri, 02 Apr 2010 17:34:18 +0200 by phpDocumentor 1.4.1