SQLiteEntity.class.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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. $i=false;
  60. foreach($this->object_fields as $field=>$type){
  61. if($i){$query .=',';}else{$i=true;}
  62. $query .='`'.$field.'` '. $this->sgbdType($type).' NOT NULL';
  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. $i = false;
  80. foreach($this->object_fields as $field=>$type){
  81. if($i){$query .=',';}else{$i=true;}
  82. $id = eval('return htmlentities($this->'.$field.');');
  83. $query .= '`'.$field.'`="'.$id.'"';
  84. }
  85. $query .= ' WHERE `id`="'.$this->id.'";';
  86. }else{
  87. $query = 'INSERT INTO `'.$this->TABLE_NAME.'`(';
  88. $i=false;
  89. foreach($this->object_fields as $field=>$type){
  90. if($type!='key'){
  91. if($i){$query .=',';}else{$i=true;}
  92. $query .='`'.$field.'`';
  93. }
  94. }
  95. $query .=')VALUES(';
  96. $i=false;
  97. foreach($this->object_fields as $field=>$type){
  98. if($type!='key'){
  99. if($i){$query .=',';}else{$i=true;}
  100. $query .='"'.eval('return htmlentities($this->'.$field.');').'"';
  101. }
  102. }
  103. $query .=');';
  104. }
  105. if($this->debug)echo '<i>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  106. //var_dump ($query);
  107. if(!$this->exec($query)) echo $this->lastErrorMsg().'</i>';
  108. $this->id = (!isset($this->id)?$this->lastInsertRowID():$this->id);
  109. }
  110. /**
  111. * Méthode de modification d'éléments de l'entité
  112. * @author Valentin CARRUESCO
  113. * @category manipulation SQL
  114. * @param <Array> $colonnes=>$valeurs
  115. * @param <Array> $colonnes (WHERE) =>$valeurs (WHERE)
  116. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  117. * @param <String> $debug='false' active le debug mode (0 ou 1)
  118. * @return Aucun retour
  119. */
  120. public function change($columns,$columns2=null,$operation='=',$debug='false'){
  121. $query = 'UPDATE `'.$this->TABLE_NAME.'` SET ';
  122. $i=false;
  123. foreach ($columns as $column=>$value){
  124. if($i){$query .=',';}else{$i=true;}
  125. $query .= '`'.$column.'`="'.$value.'" ';
  126. }
  127. if($columns2!=null){
  128. $query .=' WHERE ';
  129. $i=false;
  130. foreach ($columns2 as $column=>$value){
  131. if($i){$query .='AND ';}else{$i=true;}
  132. $query .= '`'.$column.'`'.$operation.'"'.$value.'" ';
  133. }
  134. }
  135. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  136. if(!$this->exec($query)) echo $this->lastErrorMsg();
  137. }
  138. /**
  139. * Méthode de selection de tous les elements de l'entité
  140. * @author Valentin CARRUESCO
  141. * @category manipulation SQL
  142. * @param <String> $ordre=null
  143. * @param <String> $limite=null
  144. * @param <String> $debug='false' active le debug mode (0 ou 1)
  145. * @return <Array<Entity>> $Entity
  146. */
  147. public function populate($order='null',$limit='null',$debug='false'){
  148. eval('$results = '.$this->CLASS_NAME.'::loadAll(array(),\''.$order.'\','.$limit.',\'=\','.$debug.');');
  149. return $results;
  150. }
  151. /**
  152. * Méthode de selection multiple d'elements de l'entité
  153. * @author Valentin CARRUESCO
  154. * @category manipulation SQL
  155. * @param <Array> $colonnes (WHERE)
  156. * @param <Array> $valeurs (WHERE)
  157. * @param <String> $ordre=null
  158. * @param <String> $limite=null
  159. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  160. * @param <String> $debug='false' active le debug mode (0 ou 1)
  161. * @return <Array<Entity>> $Entity
  162. */
  163. public function loadAll($columns,$order=null,$limit=null,$operation="=",$debug='false',$selColumn='*'){
  164. $objects = array();
  165. $whereClause = '';
  166. if($columns!=null && sizeof($columns)!=0){
  167. $whereClause .= ' WHERE ';
  168. $i = false;
  169. foreach($columns as $column=>$value){
  170. if($i){$whereClause .=' AND ';}else{$i=true;}
  171. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  172. }
  173. }
  174. $query = 'SELECT '.$selColumn.' FROM `'.$this->TABLE_NAME.'` '.$whereClause.' ';
  175. if($order!=null) $query .='ORDER BY '.$order.' ';
  176. if($limit!=null) $query .='LIMIT '.$limit.' ';
  177. $query .=';';
  178. //echo '<hr>'.__METHOD__.' : Requete --> '.$query.'<br>';
  179. $execQuery = $this->query($query);
  180. if(!$execQuery)
  181. echo $this->lastErrorMsg();
  182. while($queryReturn = $execQuery->fetchArray() ){
  183. $object = eval(' return new '.$this->CLASS_NAME.'();');
  184. foreach($this->object_fields as $field=>$type){
  185. if(isset($queryReturn[$field])) eval('$object->'.$field .'= html_entity_decode(\''. addslashes($queryReturn[$field]).'\');');
  186. }
  187. $objects[] = $object;
  188. unset($object);
  189. }
  190. return $objects;
  191. }
  192. public function loadAllOnlyColumn($selColumn,$columns,$order=null,$limit=null,$operation="=",$debug='false'){
  193. eval('$objects = $this->loadAll($columns,\''.$order.'\',\''.$limit.'\',\''.$operation.'\',\''.$debug.'\',\''.$selColumn.'\');');
  194. if(count($objects)==0)$objects = array();
  195. return $objects;
  196. }
  197. /**
  198. * Méthode de selection unique d'élements de l'entité
  199. * @author Valentin CARRUESCO
  200. * @category manipulation SQL
  201. * @param <Array> $colonnes (WHERE)
  202. * @param <Array> $valeurs (WHERE)
  203. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  204. * @param <String> $debug='false' active le debug mode (0 ou 1)
  205. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  206. */
  207. public function load($columns,$operation='=',$debug='false'){
  208. eval('$objects = $this->loadAll($columns,null,\'1\',\''.$operation.'\',\''.$debug.'\');');
  209. if(!isset($objects[0]))$objects[0] = false;
  210. return $objects[0];
  211. }
  212. /**
  213. * Méthode de selection unique d'élements de l'entité
  214. * @author Valentin CARRUESCO
  215. * @category manipulation SQL
  216. * @param <Array> $colonnes (WHERE)
  217. * @param <Array> $valeurs (WHERE)
  218. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  219. * @param <String> $debug='false' active le debug mode (0 ou 1)
  220. * @return <Entity> $Entity ou false si aucun objet n'est trouvé en base
  221. */
  222. public function getById($id,$operation='=',$debug='false'){
  223. return $this->load(array('id'=>$id),$operation,$debug);
  224. }
  225. /**
  226. * Methode de comptage des éléments de l'entité
  227. * @author Valentin CARRUESCO
  228. * @category manipulation SQL
  229. * @param <String> $debug='false' active le debug mode (0 ou 1)
  230. * @return<Integer> nombre de ligne dans l'entité'
  231. */
  232. public function rowCount($columns=null)
  233. {
  234. $whereClause ='';
  235. if($columns!=null){
  236. $whereClause = ' WHERE ';
  237. $i=false;
  238. foreach($columns as $column=>$value){
  239. if($i){$whereClause .=' AND ';}else{$i=true;}
  240. $whereClause .= '`'.$column.'`="'.$value.'"';
  241. }
  242. }
  243. $query = 'SELECT COUNT(id) FROM '.$this->TABLE_NAME.$whereClause;
  244. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  245. $execQuery = $this->querySingle($query);
  246. //echo $this->lastErrorMsg();
  247. return (!$execQuery?0:$execQuery);
  248. }
  249. /**
  250. * Méthode de supression d'elements de l'entité
  251. * @author Valentin CARRUESCO
  252. * @category manipulation SQL
  253. * @param <Array> $colonnes (WHERE)
  254. * @param <Array> $valeurs (WHERE)
  255. * @param <String> $operation="=" definis le type d'operateur pour la requete select
  256. * @param <String> $debug='false' active le debug mode (0 ou 1)
  257. * @return Aucun retour
  258. */
  259. public function delete($columns,$operation='=',$debug='false',$limit=null){
  260. $whereClause = '';
  261. $i=false;
  262. foreach($columns as $column=>$value){
  263. if($i){$whereClause .=' AND ';}else{$i=true;}
  264. $whereClause .= '`'.$column.'`'.$operation.'"'.$value.'"';
  265. }
  266. $query = 'DELETE FROM `'.$this->TABLE_NAME.'` WHERE '.$whereClause.' '.(isset($limit)?'LIMIT '.$limit:'').';';
  267. //echo '<hr>'.$this->CLASS_NAME.' ('.__METHOD__ .') : Requete --> '.$query.'<br>';
  268. if(!$this->exec($query)) echo $this->lastErrorMsg();
  269. }
  270. public function customExecute($request){
  271. $this->exec($request);
  272. }
  273. public function customQuery($request){
  274. return $this->query($request);
  275. }
  276. // ACCESSEURS
  277. /**
  278. * Méthode de récuperation de l'attribut debug de l'entité
  279. * @author Valentin CARRUESCO
  280. * @category Accesseur
  281. * @param Aucun
  282. * @return <Attribute> debug
  283. */
  284. public function getDebug(){
  285. return $this->debug;
  286. }
  287. /**
  288. * Méthode de définition de l'attribut debug de l'entité
  289. * @author Valentin CARRUESCO
  290. * @category Accesseur
  291. * @param <boolean> $debug
  292. */
  293. public function setDebug($debug){
  294. $this->debug = $debug;
  295. }
  296. }
  297. ?>