SQLiteEntity.class.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <?php
  2. /*
  3. @nom: SQLiteEntity
  4. @auteur: Idleman (idleman@idleman.fr)
  5. @description: Classe parent de tous les modèles (classe entitées) liées a la base de donnée,
  6. cette classe est configuré pour agir avec une base SQLite, mais il est possible de redefinir ses codes SQL pour l'adapter à un autre SGBD sans affecter
  7. le reste du code du projet.
  8. */
  9. class SQLiteEntity extends SQLite3
  10. {
  11. private $debug = false;
  12. function __construct($tag="rw"){
  13. switch($tag){
  14. case 'r' : $tag = SQLITE3_OPEN_READONLY; break;
  15. default: $tag = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE; break;
  16. }
  17. $this->open(__ROOT__.'/'.DB_NAME,$tag);
  18. }
  19. function __destruct(){
  20. $this->close();
  21. }
  22. function sgbdType($type){
  23. $return = false;
  24. switch($type){
  25. case 'string':
  26. case 'timestamp':
  27. case 'date':
  28. $return = 'VARCHAR(255)';
  29. break;
  30. case 'longstring':
  31. $return = 'longtext';
  32. break;
  33. case 'key':
  34. $return = 'INTEGER NOT NULL PRIMARY KEY';
  35. break;
  36. case 'object':
  37. case 'integer':
  38. $return = 'bigint(20)';
  39. break;
  40. case 'boolean':
  41. $return = 'INT(1)';
  42. break;
  43. default;
  44. $return = 'TEXT';
  45. break;
  46. }
  47. return $return ;
  48. }
  49. public function closeDatabase(){
  50. $this->close();
  51. }
  52. // GESTION SQL
  53. /**
  54. * Verifie l'existence de la table en base de donnée
  55. * @author Valentin CARRUESCO
  56. * @category manipulation SQL
  57. * @param <String> créé la table si elle n'existe pas
  58. * @return true si la table existe, false dans le cas contraire
  59. */
  60. public function checkTable($autocreate = false){
  61. $query = 'SELECT count(*) as numRows FROM sqlite_master WHERE type="table" AND name="'.MYSQL_PREFIX.$this->TABLE_NAME.'"';
  62. $statement = $this->query($query);
  63. if($statement!=false){
  64. $statement = $statement->fetchArray();
  65. if($statement['numRows']==1){
  66. $return = true;
  67. }
  68. }
  69. if($autocreate && !$return) $this->create();
  70. return $return;
  71. }
  72. /**
  73. * Transforme l'objet en tableau attribut -> valeur
  74. * @author Valentin CARRUESCO
  75. * @return retourne un array attribut -> valeur correspondant à l'objet
  76. */
  77. public function toArray(){
  78. $array = array();
  79. foreach($this->object_fields as $field=>$type)
  80. $array[$field] = $this->$field;
  81. return $array;
  82. }
  83. /**
  84. * Transforme le tableau fournis en objet, le nommage attribut -> valeur doit être respecté
  85. * @author Valentin CARRUESCO
  86. * @param <Array> tableau contenant les clé/valeur de l'objet
  87. * @return retourne un objet attribut -> valeur correspondant à l'array fournis
  88. */
  89. public function fromArray($array){
  90. $object = new $this->CLASS_NAME();
  91. foreach($this->object_fields as $field=>$type)
  92. $object->$field = $array[$field];
  93. return $object;
  94. }
  95. /**
  96. * Methode de creation de l'entité
  97. * @author Valentin CARRUESCO
  98. * @category manipulation SQL
  99. * @param <String> $debug='false' active le debug mode (0 ou 1)
  100. * @return Aucun retour
  101. */
  102. public function create($debug='false'){
  103. $query = 'CREATE TABLE IF NOT EXISTS `'.MYSQL_PREFIX.$this->TABLE_NAME.'` (';
  104. $i=false;
  105. foreach($this->object_fields as $field=>$type){
  106. if($i){$query .=',';}else{$i=true;}
  107. $query .='`'.$field.'` '. $this->sgbdType($type).' NOT NULL';
  108. }
  109. $query .= ');';
  110. if($this->debug)echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query;
  111. if(!$this->exec($query)) echo $this->lastErrorMsg();
  112. }
  113. public function drop($debug='false'){
  114. $query = 'DROP TABLE `'.MYSQL_PREFIX.$this->TABLE_NAME.'`;';
  115. if($this->debug)echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query;
  116. if(!$this->exec($query)) echo $this->lastErrorMsg();
  117. }
  118. public function massiveInsert($events,$forceId = false){
  119. $query = 'INSERT INTO `'.MYSQL_PREFIX.$this->TABLE_NAME.'`(';
  120. $i=false;
  121. foreach($this->object_fields as $field=>$type){
  122. if($type=='key' && !$forceId) continue;
  123. if($i){$query .=',';}else{$i=true;}
  124. $query .='`'.$field.'`';
  125. }
  126. $query .=') select';
  127. $u = false;
  128. foreach($events as $event){
  129. if($u){$query .=' union select ';}else{$u=true;}
  130. $i=false;
  131. foreach($event->object_fields as $field=>$type){
  132. if($type=='key' && !$forceId) continue;
  133. if($i){$query .=',';}else{$i=true;}
  134. $query .='"'.eval('return htmlentities($event->'.$field.');').'"';
  135. }
  136. }
  137. $query .=';';
  138. //echo '<i>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  139. if(!$this->exec($query)) echo $this->lastErrorMsg().'</i>';
  140. }
  141. /**
  142. * Methode d'insertion ou de modifications d'elements de l'entité
  143. * @author Valentin CARRUESCO
  144. * @category manipulation SQL
  145. * @param Aucun
  146. * @return Aucun retour
  147. */
  148. public function save(){
  149. if(isset($this->id)){
  150. $query = 'UPDATE `'.MYSQL_PREFIX.$this->TABLE_NAME.'`';
  151. $query .= ' SET ';
  152. $i = false;
  153. foreach($this->object_fields as $field=>$type){
  154. if($i){$query .=',';}else{$i=true;}
  155. $id = eval('return htmlentities($this->'.$field.');');
  156. $query .= '`'.$field.'`="'.$id.'"';
  157. }
  158. $query .= ' WHERE `id`="'.$this->id.'";';
  159. }else{
  160. $query = 'INSERT INTO `'.MYSQL_PREFIX.$this->TABLE_NAME.'`(';
  161. $i=false;
  162. foreach($this->object_fields as $field=>$type){
  163. if($type!='key'){
  164. if($i){$query .=',';}else{$i=true;}
  165. $query .='`'.$field.'`';
  166. }
  167. }
  168. $query .=')VALUES(';
  169. $i=false;
  170. foreach($this->object_fields as $field=>$type){
  171. if($type!='key'){
  172. if($i){$query .=',';}else{$i=true;}
  173. $query .='"'.eval('return htmlentities($this->'.$field.');').'"';
  174. }
  175. }
  176. $query .=');';
  177. }
  178. if($this->debug)echo '<i>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  179. //var_dump ($query);
  180. if(!$this->exec($query)) echo $this->lastErrorMsg().'</i>';
  181. $this->id = (!isset($this->id)?$this->lastInsertRowID():$this->id);
  182. }
  183. /**
  184. * Méthode de modification d'éléments de l'entité
  185. * @author Valentin CARRUESCO
  186. * @category manipulation SQL
  187. * @param <Array> $colonnes=>$valeurs
  188. * @param <Array> $colonnes (WHERE) =>$valeurs (WHERE)
  189. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  190. * @param <String> $debug='false' active le debug mode (0 ou 1)
  191. * @return Aucun retour
  192. */
  193. public function change($columns,$columns2=null,$operation='=',$debug='false'){
  194. $query = 'UPDATE `'.MYSQL_PREFIX.$this->TABLE_NAME.'` SET ';
  195. $i=false;
  196. foreach ($columns as $column=>$value){
  197. if($i){$query .=',';}else{$i=true;}
  198. $query .= '`'.$column.'`="'.$value.'" ';
  199. }
  200. if($columns2!=null){
  201. $query .=' WHERE ';
  202. $i=false;
  203. foreach ($columns2 as $column=>$value){
  204. if($i){$query .='AND ';}else{$i=true;}
  205. $query .= '`'.$column.'`'.$operation.'"'.$value.'" ';
  206. }
  207. }
  208. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  209. if(!$this->exec($query)) echo $this->lastErrorMsg();
  210. }
  211. /**
  212. * Méthode de selection de tous les elements de l'entité
  213. * @author Valentin CARRUESCO
  214. * @category manipulation SQL
  215. * @param <String> $ordre=null
  216. * @param <String> $limite=null
  217. * @param <String> $debug='false' active le debug mode (0 ou 1)
  218. * @return <Array<Entity>> $Entity
  219. */
  220. public function populate($order='null',$limit='null',$debug='false'){
  221. eval('$results = '.$this->CLASS_NAME.'::loadAll(array(),\''.$order.'\','.$limit.',\'=\','.$debug.');');
  222. return $results;
  223. }
  224. /**
  225. * Méthode de selection multiple d'elements de l'entité
  226. * @author Valentin CARRUESCO
  227. * @category manipulation SQL
  228. * @param <Array> $colonnes (WHERE)
  229. * @param <Array> $valeurs (WHERE)
  230. * @param <String> $ordre=null
  231. * @param <String> $limite=null
  232. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  233. * @param <String> $debug='false' active le debug mode (0 ou 1)
  234. * @return <Array<Entity>> $Entity
  235. */
  236. public function loadAll($columns,$order=null,$limit=null,$operation="=",$debug='false',$selColumn='*'){
  237. $objects = array();
  238. $whereClause = '';
  239. if($columns!=null && sizeof($columns)!=0){
  240. $whereClause .= ' WHERE ';
  241. $i = false;
  242. foreach($columns as $column=>$value){
  243. if($i){$whereClause .=' AND ';}else{$i=true;}
  244. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  245. }
  246. }
  247. $query = 'SELECT '.$selColumn.' FROM `'.MYSQL_PREFIX.$this->TABLE_NAME.'` '.$whereClause.' ';
  248. if($order!=null) $query .='ORDER BY '.$order.' ';
  249. if($limit!=null) $query .='LIMIT '.$limit.' ';
  250. $query .=';';
  251. $execQuery = $this->query($query);
  252. if(!$execQuery)
  253. echo $this->lastErrorMsg();
  254. while($queryReturn = $execQuery->fetchArray() ){
  255. $object = new $this->CLASS_NAME();
  256. foreach($this->object_fields as $field=>$type)
  257. if(isset($queryReturn[$field])) $object->$field= html_entity_decode( addslashes($queryReturn[$field]));
  258. $objects[] = $object;
  259. unset($object);
  260. }
  261. return $objects;
  262. }
  263. public function loadAllOnlyColumn($selColumn,$columns,$order=null,$limit=null,$operation="=",$debug='false'){
  264. eval('$objects = $this->loadAll($columns,\''.$order.'\',\''.$limit.'\',\''.$operation.'\',\''.$debug.'\',\''.$selColumn.'\');');
  265. if(count($objects)==0)$objects = array();
  266. return $objects;
  267. }
  268. /**
  269. * Méthode de selection unique d'élements de l'entité
  270. * @author Valentin CARRUESCO
  271. * @category manipulation SQL
  272. * @param <Array> $colonnes (WHERE)
  273. * @param <Array> $valeurs (WHERE)
  274. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  275. * @param <String> $debug='false' active le debug mode (0 ou 1)
  276. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  277. */
  278. public function load($columns,$operation='=',$debug='false'){
  279. eval('$objects = $this->loadAll($columns,null,\'1\',\''.$operation.'\',\''.$debug.'\');');
  280. if(!isset($objects[0]))$objects[0] = false;
  281. return $objects[0];
  282. }
  283. /**
  284. * Méthode de selection unique d'élements de l'entité
  285. * @author Valentin CARRUESCO
  286. * @category manipulation SQL
  287. * @param <Array> $colonnes (WHERE)
  288. * @param <Array> $valeurs (WHERE)
  289. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  290. * @param <String> $debug='false' active le debug mode (0 ou 1)
  291. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  292. */
  293. public function getById($id,$operation='=',$debug='false'){
  294. return $this->load(array('id'=>$id),$operation,$debug);
  295. }
  296. /**
  297. * Methode de comptage des éléments de l'entité
  298. * @author Valentin CARRUESCO
  299. * @category manipulation SQL
  300. * @param <String> $debug='false' active le debug mode (0 ou 1)
  301. * @return<Integer> nombre de ligne dans l'entité'
  302. */
  303. public function rowCount($columns=null)
  304. {
  305. $whereClause ='';
  306. if($columns!=null){
  307. $whereClause = ' WHERE ';
  308. $i=false;
  309. foreach($columns as $column=>$value){
  310. if($i){$whereClause .=' AND ';}else{$i=true;}
  311. $whereClause .= '`'.$column.'`="'.$value.'"';
  312. }
  313. }
  314. $query = 'SELECT COUNT(id) FROM '.MYSQL_PREFIX.$this->TABLE_NAME.$whereClause;
  315. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  316. $execQuery = $this->querySingle($query);
  317. //echo $this->lastErrorMsg();
  318. return (!$execQuery?0:$execQuery);
  319. }
  320. /**
  321. * Méthode de supression d'elements de l'entité
  322. * @author Valentin CARRUESCO
  323. * @category manipulation SQL
  324. * @param <Array> $colonnes (WHERE)
  325. * @param <Array> $valeurs (WHERE)
  326. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  327. * @param <String> $debug='false' active le debug mode (0 ou 1)
  328. * @return Aucun retour
  329. */
  330. public function delete($columns,$operation='=',$debug='false',$limit=null){
  331. $whereClause = '';
  332. $i=false;
  333. foreach($columns as $column=>$value){
  334. if($i){$whereClause .=' AND ';}else{$i=true;}
  335. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  336. }
  337. $query = 'DELETE FROM `'.MYSQL_PREFIX.$this->TABLE_NAME.'` WHERE '.$whereClause.' '.(isset($limit)?'LIMIT '.$limit:'').';';
  338. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  339. if(!$this->exec($query)) echo $this->lastErrorMsg();
  340. }
  341. public function customExecute($request){
  342. $this->exec($request);
  343. }
  344. public function customQuery($request){
  345. return $this->query($request);
  346. }
  347. // ACCESSEURS
  348. /**
  349. * Méthode de récuperation de l'attribut debug de l'entité
  350. * @author Valentin CARRUESCO
  351. * @category Accesseur
  352. * @param Aucun
  353. * @return <Attribute> debug
  354. */
  355. public function getDebug(){
  356. return $this->debug;
  357. }
  358. /**
  359. * Méthode de définition de l'attribut debug de l'entité
  360. * @author Valentin CARRUESCO
  361. * @category Accesseur
  362. * @param <boolean> $debug
  363. */
  364. public function setDebug($debug){
  365. $this->debug = $debug;
  366. }
  367. public function getObject_fields(){
  368. return $this->object_fields;
  369. }
  370. }
  371. ?>