SQLiteEntity.class.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. /*
  3. @nom: SQLiteEntity
  4. @auteur: Valentin CARRUESCO (valentincarruesco@yahoo.fr)
  5. @date de création: 16/04/2012 02:34:15
  6. @description: Classe parent de tous les modèles (classe entitées) liées a la base de donnée,
  7. 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
  8. le reste du code du projet.
  9. */
  10. class SQLiteEntity extends SQLite3
  11. {
  12. private $debug = false;
  13. function __construct(){
  14. $this->open('database.db');
  15. }
  16. function __destruct(){
  17. $this->close();
  18. }
  19. function sgbdType($type){
  20. $return = false;
  21. switch($type){
  22. case 'string':
  23. case 'timestamp':
  24. case 'date':
  25. $return = 'VARCHAR(255)';
  26. break;
  27. case 'longstring':
  28. $return = 'longtext';
  29. break;
  30. case 'key':
  31. $return = 'INTEGER NOT NULL PRIMARY KEY';
  32. break;
  33. case 'object':
  34. case 'integer':
  35. $return = 'bigint(20)';
  36. break;
  37. case 'boolean':
  38. $return = 'INT(1)';
  39. break;
  40. default;
  41. $return = 'TEXT';
  42. break;
  43. }
  44. return $return ;
  45. }
  46. public function closeDatabase(){
  47. $this->close();
  48. }
  49. // GESTION SQL
  50. /**
  51. * Methode de creation de l'entité
  52. * @author Valentin CARRUESCO
  53. * @category manipulation SQL
  54. * @param <String> $debug='false' active le debug mode (0 ou 1)
  55. * @return Aucun retour
  56. */
  57. public function create($debug='false'){
  58. $query = 'CREATE TABLE IF NOT EXISTS `'.$this->TABLE_NAME.'` (';
  59. $end = end(array_keys($this->object_fields));
  60. foreach($this->object_fields as $field=>$type){
  61. $query .='`'.$field.'` '. $this->sgbdType($type).' NOT NULL';
  62. if($field != $end)$query .=',';
  63. }
  64. $query .= ');';
  65. if($this->debug)echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query;
  66. if(!$this->exec($query)) echo $this->lastErrorMsg();
  67. }
  68. /**
  69. * Methode d'insertion ou de modifications d'elements de l'entité
  70. * @author Valentin CARRUESCO
  71. * @category manipulation SQL
  72. * @param Aucun
  73. * @return Aucun retour
  74. */
  75. public function save(){
  76. if(isset($this->id)){
  77. $query = 'UPDATE `'.$this->TABLE_NAME.'`';
  78. $query .= ' SET ';
  79. $end = end(array_keys($this->object_fields));
  80. foreach($this->object_fields as $field=>$type){
  81. $id = eval('return $this->'.$field.';');
  82. $query .= '`'.$field.'`="'.$id.'"';
  83. if($field != $end)$query .=',';
  84. }
  85. $query .= ' WHERE `id`="'.$this->id.'";';
  86. }else{
  87. $query = 'INSERT INTO `'.$this->TABLE_NAME.'`(';
  88. $end = end(array_keys($this->object_fields));
  89. foreach($this->object_fields as $field=>$type){
  90. if($type!='key'){
  91. $query .='`'.$field.'`';
  92. if($field != $end)$query .=',';
  93. }
  94. }
  95. $query .=')VALUES(';
  96. $end = end(array_keys($this->object_fields));
  97. foreach($this->object_fields as $field=>$type){
  98. if($type!='key'){
  99. $query .='"'.eval('return htmlentities($this->'.$field.');').'"';
  100. if($field != $end)$query .=',';
  101. }
  102. }
  103. $query .=');';
  104. }
  105. if($this->debug)echo '<i>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  106. if(!$this->exec($query)) echo $this->lastErrorMsg().'</i>';
  107. $this->id = (!isset($this->id)?$this->lastInsertRowID():$this->id);
  108. }
  109. /**
  110. * Méthode de modification d'éléments de l'entité
  111. * @author Valentin CARRUESCO
  112. * @category manipulation SQL
  113. * @param <Array> $colonnes=>$valeurs
  114. * @param <Array> $colonnes (WHERE) =>$valeurs (WHERE)
  115. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  116. * @param <String> $debug='false' active le debug mode (0 ou 1)
  117. * @return Aucun retour
  118. */
  119. public function change($columns,$columns2=null,$operation='=',$debug='false'){
  120. $query = 'UPDATE `'.$this->TABLE_NAME.'` SET ';
  121. $end = end(array_keys($columns));
  122. foreach ($columns as $column=>$value){
  123. $query .= '`'.$column.'`="'.$value.'" ';
  124. if($column != $end)$query .=',';
  125. }
  126. if($columns2!=null){
  127. $query .=' WHERE ';
  128. $end = end(array_keys($columns2));
  129. foreach ($columns2 as $column=>$value){
  130. $query .= '`'.$column.'`'.$operation.'"'.$value.'" ';
  131. if($column != $end)$query .='AND ';
  132. }
  133. }
  134. if($this->debug)echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  135. if(!$this->exec($query)) echo $this->lastErrorMsg();
  136. }
  137. /**
  138. * Méthode de selection de tous les elements de l'entité
  139. * @author Valentin CARRUESCO
  140. * @category manipulation SQL
  141. * @param <String> $ordre=null
  142. * @param <String> $limite=null
  143. * @param <String> $debug='false' active le debug mode (0 ou 1)
  144. * @return <Array<Entity>> $Entity
  145. */
  146. public function populate($order='null',$limit='null',$debug='false'){
  147. eval('$results = '.$this->CLASS_NAME.'::loadAll(array(),\''.$order.'\','.$limit.',\'=\','.$debug.');');
  148. return $results;
  149. }
  150. /**
  151. * Méthode de selection multiple d'elements de l'entité
  152. * @author Valentin CARRUESCO
  153. * @category manipulation SQL
  154. * @param <Array> $colonnes (WHERE)
  155. * @param <Array> $valeurs (WHERE)
  156. * @param <String> $ordre=null
  157. * @param <String> $limite=null
  158. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  159. * @param <String> $debug='false' active le debug mode (0 ou 1)
  160. * @return <Array<Entity>> $Entity
  161. */
  162. public function loadAll($columns,$order=null,$limit=null,$operation="=",$debug='false'){
  163. $objects = array();
  164. $whereClause = '';
  165. if(sizeof($columns)!=0){
  166. $whereClause .= ' WHERE ';
  167. $start = reset(array_keys($columns));
  168. foreach($columns as $column=>$value){
  169. if($column != $start)$whereClause .= ' AND ';
  170. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  171. }
  172. }
  173. $query = 'SELECT * FROM `'.$this->TABLE_NAME.'` '.$whereClause.' ';
  174. if($order!=null) $query .='ORDER BY `'.$order.'` ';
  175. if($limit!=null) $query .='LIMIT '.$limit.' ';
  176. $query .=';';
  177. if($this->debug) echo '<br>'.__METHOD__.' : Requete --> '.$query.'<br>';
  178. $execQuery = $this->query($query);
  179. if(!$execQuery) echo $this->lastErrorMsg();
  180. while($queryReturn = $execQuery->fetchArray() ){
  181. $object = eval(' return new '.$this->CLASS_NAME.'();');
  182. foreach($this->object_fields as $field=>$type){
  183. eval('$object->'.$field .'= html_entity_decode(\''. addslashes($queryReturn[$field]).'\');');
  184. }
  185. $objects[] = $object;
  186. unset($object);
  187. }
  188. return $objects;
  189. }
  190. /**
  191. * Méthode de selection unique d'élements de l'entité
  192. * @author Valentin CARRUESCO
  193. * @category manipulation SQL
  194. * @param <Array> $colonnes (WHERE)
  195. * @param <Array> $valeurs (WHERE)
  196. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  197. * @param <String> $debug='false' active le debug mode (0 ou 1)
  198. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  199. */
  200. public function load($columns,$operation='=',$debug='false'){
  201. eval('$objects = $this->loadAll($columns,null,\'1\',\''.$operation.'\',\''.$debug.'\');');
  202. if(!isset($objects[0]))$objects[0] = false;
  203. return $objects[0];
  204. }
  205. /**
  206. * Méthode de selection unique d'élements de l'entité
  207. * @author Valentin CARRUESCO
  208. * @category manipulation SQL
  209. * @param <Array> $colonnes (WHERE)
  210. * @param <Array> $valeurs (WHERE)
  211. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  212. * @param <String> $debug='false' active le debug mode (0 ou 1)
  213. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  214. */
  215. public function getById($id,$operation='=',$debug='false'){
  216. return $this->load(array('id'=>$id),$operation,$debug);
  217. }
  218. /**
  219. * Methode de comptage des éléments de l'entité
  220. * @author Valentin CARRUESCO
  221. * @category manipulation SQL
  222. * @param <String> $debug='false' active le debug mode (0 ou 1)
  223. * @return<Integer> nombre de ligne dans l'entité'
  224. */
  225. public function rowCount($columns=null)
  226. {
  227. $whereClause ='';
  228. if($columns!=null){
  229. $whereClause = ' WHERE ';
  230. $start = reset(array_keys($columns));
  231. foreach($columns as $column=>$value){
  232. if($column != $start)$whereClause .= ' AND ';
  233. $whereClause .= '`'.$column.'`="'.$value.'"';
  234. }
  235. }
  236. $query = 'SELECT COUNT(id) FROM '.$this->TABLE_NAME.$whereClause;
  237. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  238. $execQuery = $this->querySingle($query);
  239. //echo $this->lastErrorMsg();
  240. return (!$execQuery?0:$execQuery);
  241. }
  242. /**
  243. * Méthode de supression d'elements de l'entité
  244. * @author Valentin CARRUESCO
  245. * @category manipulation SQL
  246. * @param <Array> $colonnes (WHERE)
  247. * @param <Array> $valeurs (WHERE)
  248. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  249. * @param <String> $debug='false' active le debug mode (0 ou 1)
  250. * @return Aucun retour
  251. */
  252. public function delete($columns,$operation='=',$debug='false'){
  253. $whereClause = '';
  254. $start = reset(array_keys($columns));
  255. foreach($columns as $column=>$value){
  256. if($column != $start)$whereClause .= ' AND ';
  257. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  258. }
  259. $query = 'DELETE FROM `'.$this->TABLE_NAME.'` WHERE '.$whereClause.' ;';
  260. if($this->debug)echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  261. if(!$this->exec($query)) echo $this->lastErrorMsg();
  262. }
  263. // ACCESSEURS
  264. /**
  265. * Méthode de récuperation de l'attribut debug de l'entité
  266. * @author Valentin CARRUESCO
  267. * @category Accesseur
  268. * @param Aucun
  269. * @return <Attribute> debug
  270. */
  271. public function getDebug(){
  272. return $this->debug;
  273. }
  274. /**
  275. * Méthode de définition de l'attribut debug de l'entité
  276. * @author Valentin CARRUESCO
  277. * @category Accesseur
  278. * @param <boolean> $debug
  279. */
  280. public function setDebug($debug){
  281. $this->debug = $debug;
  282. }
  283. }
  284. ?>