Source for file IsMySQLListClass.class.php
Documentation is available at IsMySQLListClass.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__
).
'/../ADBListClass.class.php';
require_once dirname(__FILE__
).
'/../IIsDBListClass.class.php';
require_once dirname(__FILE__
).
'/../IIsDBClass.class.php';
require_once dirname(__FILE__
).
'/IsMySQLClass.class.php';
* Jelen verzió már tartalmazza a listakezeléshez szükséges legalapvetőbb
* eljárásokat, tulajdonságokat. <br />
* Ebbe beleértendők a következők:<br />
* <li>Lista inicializálása: {@link init()}</li>
* <li>Egy oldal inicializálása: {@link page()}</li>
* <li>Új elem felvétele: {@link add()}</li>
* <li>Rekord törlése: {@link delete()}</li>
* <li>Listán való iteráció (foreach ciklus használata az objektumon)</li>
* require_once 'REDBObjects/REDBObjects.class.php';
* REDBObjects::uses('mysql');
* mysql_connect('localhost', 'root', 'password');
* mysql_select_db('teszt');
* $list->tableName_signal = 'T_'; //Ez az alapértelmezett is
* $list->table_field_sep = '__'; //az alapértelmezett az egy darab _ jel
* $list->page('teszt', 10);
* foreach ($list as $key => $object)
* print $object->T_teszt__id.', '.$object->field.'<br />'.PHP_EOL;
* @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
* Lista elemeit tároló tömb
* A listában tárolandó objektum típus
* A lekérdezésre illeszkedő rekordok száma
* Adott limit mellett a megjelenítéshez szükséges oldalak minimális száma
* Aktuális oldal száma, ha már lekértünk egy oldalt.
* Aktuális tábla index az iterációnál
protected $itTableIndex=
0;
* Aktuális mezőindex az iterációnál
protected $itFieldIndex=
0;
* A megvalósítandó táblák listája.
* Még a megváltoztatás előtt. (Aliasok)
* Védett táblák listája. Ezekből a táblákból nem törölhető
* rekord a {@link delete()} metódussal.
* Az sql kód from utáni része, amivel inicializálva lett a lista
* Limit, ami az inicializáláskor lett megadva
* @param array $tablelist
* @param string $className
function __construct($tablelist,$className=
'IsMySQLClass')
$this->tablelist =
$this->defaultTableList =
$tablelist;
//lekérdezi a lehetséges mezőneveket.
* @param string $sql FROM utáni sql kód (Limit nélkül)
* @param int $limit limit
//Lekérdezésre illeszkedő sorok száma limit nélkül
//Az oldalszámot ki kell számolni
* Aktuális oldalszám szerint lista inicializálása
* @param $sql FROM utáni sql kód
* @param $limit Hány rekord legyen egy oldalon
* @param int $page Oldalszém. Elhagyása esetén az url-ből veszi az oldalszámot.
public function page($sql, $limit, $page=
null)
$page =
$page !==
null ? (int)
$page :
$this->pageNumber();
else if ($page >=
$maxpage)
$offset =
($page-
1) *
$limit;
$this->init($sql, $offset, $limit);
* @param $psql FROM utáni sql kód (limit nélkül)
* @param $offset Ennyi rekordot ugrik át a listában
* @param $limit Ennyi rekordot kérdez le az offset értéktől kezdve
public function init($psql,&$offset=
0,$limit=
0)
//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]).
"`";
if ($this->page ===
null)
//lekérdezendő mezőnevek megadása
//sql lekérdezés limit nélkül
$sql =
"select $fields from $psql";
//Ha ez után az eltolás mértéke nagyobb, mint amennyi rekord van
if ($offset >=
$this->count) {
//Az eltolást az utolsó oldal első elemére állítja
$offset =
($this->pages-
1)*
$limit;
//Akkor már hozzá lehet fűzni az sql lekérdezéshez a korrigált offsettel
$sql .=
" limit $offset, $limit";
//Az ADBClass absztrakt osztály tulajdonságainak lekérdezése
$ref =
new ReflectionClass('ADBClass');
$props =
$ref->getDefaultProperties();
//A listában tárolandó objektumtípus lekérdezése a későbbi példányosítás miatt.
$IIsDBClass =
new ReflectionClass($this->className);
//Egy példány létrehozása a listában tárolandó objektumtípusból
//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])];
//Az összes olyan tulajdonság beállítása az új objektumnak, ami a lista objektummal közös
foreach ($props as $prop=>
$value) {
$record->$prop =
$this->$prop;
$record->isSqlQuery =
true;
//Új elem felvétele a listába
* Új rekordok hozzáadása több táblához
* Az add() metódus segítségével egyszerűen hozzáadhatunk az adatbázishoz egy új rekordot.<br />
* Csak egy értékekkel feltöltött, példányosított {@link IsMySQLClass} típusú objektumra van szükség.
* require_once 'REDBObjects/REDBObjects.class.php';
* REDBObjects::uses('mysql');
* mysql_connect('localhost', 'root', 'password');
* mysql_select_db('teszt');
* class MyClass extends IsMySQLClass {}
* class MyList extends IsMySQLListClass {}
* 'table1'=>array('field1','field2'),
* 'table2'=>array('field3','field4'));
* $object = new MyClass($tablelist);
* $object->keyName = 'id';
* $list = new MyList($tablelist,'MyClass');
* $object->field1 = 'value1';
* $object->field3 = 'value3';
* // A tulajdonságokat lekérdezhetővé teszi,de nem frissíti az adatbázist,
* $object->update(false);
* @param IIsDBClass $object Listához adandó objektum
* @param bool $append Ha true, nem csak adatbázisba veszi fel az elemet,
* Hanem azonnal hozzáfűzi a recordlistához. Lekérdezhetővé téve.
* @return int Autoincrement azonosító
function add(IIsDBClass $object, $append=
false)
//ciklusban végigmegy a táblákon
$props =
$object->properties;
foreach ($props as $tableName=>
&$fields)
//újabb ciklusban a mezőkön
$fields[$object->keyName] =
$object->keyValue;
foreach ($fields as $fieldName =>
$fieldValue)
//a mezőneveket és az értékeiket külön tömbbe tölti.
$fieldNames[] =
"`$fieldName`";
$fieldValues[] =
"'$fieldValue'";
//vesszővel elválasztott formátumba konvertálja az értékek és nevek tömbjeit
$fieldValues =
implode(', ',$fieldValues);
$fieldNames =
implode(', ',$fieldNames);
//felviszi a táblába az új sort a megadott mezőkkel
mysql_query("insert into `$t` ($fieldNames) values($fieldValues)");
//szükség lehet az elsődleges kulcsra, ha a kapcsoló mező auto_increment
//visszaadja a kapott objektumnak a kapcsoló mező értékét, hogy felhasználható legyen az init() metódusban
$object->keyValue =
( $object->keyName ==
key($object->priKeys[$tableName])) ?
$last_id :
$fields[$object->keyName];
* @return int Lekérdezésre illeszkedő rekordok száma
return (int)
$this->count;
* @return int Lekérdezésre illeszekőd oldalak száma a limitnek megfelelően
return (int)
$this->pages;
* {@link countPages()} aliasa
* 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;
$this->properties[$tableName][$field['Field']] =
'';
//ha az összes mezőt * karakterrel jelöltük
if (($_in =
$in) !==
false or $in =
(array_search('*',$fieldList) !==
false) )
{ //var_dump($tableName, $in , $_in,$fieldList);
//akkor törölhető a lista és felvehetők az mezőnevek egyenként
} //var_dump($field['Field']);
$this->tablelist[$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']=>
'');
}// var_dump($this->tablelist);
//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);
* Egy táblát le lehet vele védeni, hogy a megvalósított listában egy törlés
* esetén abból a táblából ne lehessen semmit sem kitörölni. Hasznos, ha például
* egy üzenetlistából törlünk felhasználói azonosító alapján a {@link delete()} -el,
* és nem szeretnénk, hogy a felhasználó is törlődjön.
* @param string $table Levédendő tábla neve. Akár {@link $tableName_signal} -al együtt
* @param string $table Feloldandó tábla neve
* Rekord törlés mezőn értéke
* $list->delete('T_tablename_fieldname','value');
* @see IIsDBListClass::delete()
* @return mixed true, ha sikeres a törlés, egyébként a MySQL hibaüzenet
public function delete($keyName,$keyValue)
//Ha a mezőnevet nem a táblanévvel együtt adtuk meg
//minden nem védett táblából a megfelelő rekordok törlése
mysql_query("delete from `".
$table.
"` where `$keyName` = '$keyValue'");
//ha konkrétan egy adott táblából kell törölni
mysql_query("delete from `$table` where `".
$field.
"`='".
$keyValue.
"'");
* Az iteráció alaphelyzetbe állítása
* Az aktuális elem visszaadása
public function current()
* Következő elem visszaadása
* Aktuális elem kulcsának visszaadása
* Iteráció kilépési feltétele
return ($this->current() !==
false);
* Létezik-e egy megadott index a listában
public function offsetExists($index)
return isset
($this->records[$index]);
* Adott indexű elem lekérdezése
public function offsetGet($index)
* Adott indexű elem értékének beállítása
public function offsetSet($index,$value)
* Adott indexű elem érvénytelenítése
public function offsetUnset($index)
public function __get($var)
if ($var ==
'tableName_signal' or $var ==
'table_field_sep')
public function __set($var, $value)
if ($var ==
'tableName_signal' or $var ==
'table_field_sep')
Documentation generated on Fri, 02 Apr 2010 17:34:19 +0200 by phpDocumentor 1.4.1