Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> klasa sql
kayman
post
Post #1





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


w zasadzie 2 klasy bo connect jest oddzielnie

nie staram się wynaleźć koła na nowo tylko uprościć sobie robotę (IMG:style_emoticons/default/smile.gif)

ale pewnie jest tu parę błędów więc oceniajcie

btw. PDO do mnie nie przemawia jakoś a może przyzwyczaiłem się do starego?

pozdrawiam

  1. <?php
  2.  
  3. class DBConnect {
  4.  
  5. private static $_instance;
  6. public static $db;
  7. private static $host = 'localhost';
  8. private static $user = 'root';
  9. private static $pass = '';
  10. private static $database = 'ukcrm';
  11.  
  12. private function __construct() {
  13. $this->connect();
  14. }
  15.  
  16. public function setConnect() {
  17. if (!isset(self::$_instance)) {
  18. self::$_instance = new DBConnect();
  19. }
  20. }
  21.  
  22. private static function connect() {
  23. self::$db = mysqli_connect(self::$host, self::$user, self::$pass, self::$database) or die('Connection fail');
  24. }
  25.  
  26. public function changeConnect($host, $user, $pass, $db) {
  27. if (isset(self::$_instance)) {
  28. mysqli_close(self::$db);
  29. self::$host = $host;
  30. self::$user = $user;
  31. self::$pass = $pass;
  32. self::$database = $db;
  33. self::connect();
  34. } else {
  35. self::$_instance = new DBConnect();
  36. self::ChangeConnect($host, $user, $pass, $db);
  37. }
  38. }
  39.  
  40. }
  41.  
  42. class sql {
  43.  
  44. private $table;
  45. private $params;
  46. private $where;
  47. private $columns;
  48. private $result;
  49. private $sql;
  50. private $order;
  51. private $orderMode = 'ASC';
  52. private $limit;
  53.  
  54. function __construct() {
  55. DBConnect::setConnect();
  56. $this->resetSql();
  57. }
  58.  
  59. public function resetSql() {
  60. $this->table = '';
  61. $this->params = array();
  62. $this->where = array();
  63. $this->result = array();
  64. $this->columns = array();
  65. $this->order = array();
  66. $this->sql = '';
  67. $this->limit = '';
  68. }
  69.  
  70. public function setTable($table) {
  71. $this->table = $table;
  72. }
  73.  
  74. public function setSqlString($string) {
  75. $this->sql = $string;
  76. }
  77.  
  78. public function crearteSQL($mode) {
  79. if ($mode == 'insert') {
  80. $this->sql = 'INSERT INTO ' . $this->table . ' SET ' . implode(', ', $this->params);
  81. }
  82. if ($mode == 'update') {
  83. $this->sql = 'UPDATE ' . $this->table . ' SET ' . implode(', ', $this->params) . ' WHERE ' . implode(' ', $this->where);
  84. }
  85. if ($mode == 'delete') {
  86. $this->sql = 'DELETE FROM ' . $this->table . ' WHERE ' . implode(' ', $this->where);
  87. }
  88. if ($mode == 'select') {
  89. $this->sql = 'SELECT ' . implode(', ', $this->columns) . ' FROM ' . $this->table;
  90. if (!empty($this->where))
  91. $this->sql .= ' WHERE ' . implode(' ', $this->where);
  92. if (!empty($this->order)) {
  93. $this->sql .= ' ORDER BY ' . implode(', ', $this->order) . ' ' . $this->orderMode;
  94. }
  95. if ($this->limit) {
  96. $this->sql .= ' LIMIT ' . $this->limit;
  97. }
  98. }
  99. }
  100.  
  101. public function setLimit($value) {
  102. $this->limit = $value;
  103. }
  104.  
  105. public function setOrderMode($value) {
  106. $this->orderMode = $value;
  107. }
  108.  
  109. public function addOrder($column) {
  110. $this->order[] = $column;
  111. }
  112.  
  113. public function addParam($name, $value, $filter) {
  114. if ($value) {
  115. switch ($filter) {
  116. case 'int':
  117. $value = $this->filterInt($value);
  118. break;
  119. case 'double':
  120. $value = $this->filterDouble($value);
  121. break;
  122. case 'text':
  123. $value = $this->filterText($value);
  124. break;
  125. case 'like':
  126. $value = $this->filterLike($value);
  127. break;
  128. }
  129. } else {
  130. $value = "NULL";
  131. if ($filter == 'double')
  132. $value = '0';
  133. }
  134. $this->params[] = $name . '=' . $value;
  135. }
  136.  
  137. public function addWhere($column, $value, $filter, $sign = '=') {
  138. if ($value) {
  139. switch ($filter) {
  140. case 'int':
  141. $value = $this->filterInt($value);
  142. break;
  143. case 'double':
  144. $value = $this->filterDouble($value);
  145. break;
  146. case 'text':
  147. $value = $this->filterText($value);
  148. break;
  149. case 'like':
  150. $value = $this->filterLike($value);
  151. $sign = ' LIKE ';
  152. break;
  153. }
  154. } else {
  155. $value = "NULL";
  156. }
  157. $this->where[] = $column . $sign . $value;
  158. }
  159.  
  160. public function addTextWhere($value) {
  161. $this->where[] = $value;
  162. }
  163.  
  164. public function addColumn($value) {
  165. $this->columns[] = $value;
  166. }
  167.  
  168. public function addColumns($val = array()) {
  169. if (!empty($val)) {
  170. foreach ($val as $value) {
  171. $this->addColumn($value);
  172. }
  173. }
  174. }
  175.  
  176. public function sqlQuery() {
  177. $this->result = mysqli_query(DBConnect::$db, $this->sql) or die(mysqli_error());
  178. }
  179.  
  180. public function getResult() {
  181. return $this->result;
  182. }
  183.  
  184. public function getRow() {
  185. return mysqli_fetch_assoc($this->result);
  186. }
  187.  
  188. public function numRows() {
  189. return mysqli_num_rows($this->result);
  190. }
  191.  
  192. public function testSQL() {
  193. echo $this->sql . '<br />';
  194. exit();
  195. }
  196.  
  197. private function filter($value, $type) {
  198. $value = mysqli_real_escape_string(DBConnect::$db, $value);
  199. switch ($type) {
  200. case "text":
  201. $value = ($value != "") ? "'" . $value . "'" : "NULL";
  202. break;
  203. case "int":
  204. $value = ($value != "") ? intval($value) : "NULL";
  205. break;
  206. case "double":
  207. $value = ($value != "") ? "'" . doubleval($value) . "'" : "NULL";
  208. break;
  209. }
  210. return $value;
  211. }
  212.  
  213. public function filterInt($value) {
  214. return $this->filter($value, 'int');
  215. }
  216.  
  217. public function filterText($value) {
  218. return $this->filter($value, 'text');
  219. }
  220.  
  221. public function filterDouble($value) {
  222. $value = str_replace(',', '.', $value);
  223. return $this->filter($value, 'double');
  224. }
  225.  
  226. public function filterLike($value) {
  227. return $this->filter('%' . $value . '%', 'text');
  228. }
  229.  
  230. }
  231.  
  232. //przykładowe wywołanie
  233.  
  234. $sql = new sql();
  235. $sql->setTable('kkk k left join iii i on k.kkk_id = i.id');
  236. $cols = array('k.id', 'k.number', 'k.name', 'k.preson');
  237. $sql->addColumns($cols);
  238. $cols = array('i.id as invid', 'i.number as inumber', 'i.name as iname', 'i.preson as iperson');
  239. $sql->addColumns($cols);
  240. $sql->addWhere('k.id', $_GET['id'], 'int');
  241. $sql->crearteSQL('select');
  242. $sql->sqlQuery();
  243. if ($sql->numRows() == 1) {
  244. $row = $sql->getRow();
  245. }
  246.  
  247.  
  248. //inne wywolanie
  249.  
  250. if (isset($_POST['action'])) {
  251. $sql = new sql();
  252. $sql->setTable('anytable');
  253.  
  254. $sql->addParam('flue_sizing', $_POST['flue_sizing'], 'text');
  255. $sql->addParam('flue_route', $_POST['flue_route'], 'text');
  256. $sql->addParam('based_on_client_info', $_POST['based_on_client_info'], 'text');
  257. $sql->addParam('instalation_time1', $_POST['instalation_time1'], 'text');
  258. $sql->addParam('instalation_time1_combo', $_POST['instalation_time1_combo'], 'text');
  259. $sql->addParam('instalation_time2', $_POST['instalation_time2'], 'text');
  260. $sql->addParam('instalation_time2_combo', $_POST['instalation_time2_combo'], 'text');
  261. $sql->addParam('lead_time', $_POST['lead_time'], 'text');
  262. $sql->addParam('lead_time_combo', $_POST['lead_time_combo'], 'text');
  263.  
  264. $sql->addParam('zone', $_POST['zone'], 'text');
  265. $sql->addParam('terrain_category', $_POST['terrain_category'], 'text');
  266. $sql->addParam('basic_wind_speed', $_POST['basic_wind_speed'], 'text');
  267. $sql->addParam('reliability_level', $_POST['reliability_level'], 'text');
  268.  
  269. $sql->addParam('lorry_length', $_POST['lorry_length'], 'text');
  270. $sql->addParam('crane_radius_of_loading', $_POST['crane_radius_of_loading'], 'text');
  271. $sql->addParam('building_height', $_POST['building_height'], 'text');
  272. $sql->addParam('crane_capacity', $_POST['crane_capacity'], 'text');
  273. $sql->addParam('crane_radius_for_lifting', $_POST['crane_radius_for_lifting'], 'text');
  274.  
  275. $sql->addParam('nr_of_appliances', $_POST['nr_of_appliances'], 'text');
  276.  
  277. if ($_POST['action'] == 'edit') {
  278. $sql->addWhere('id', $_POST['id'], 'int');
  279. $sql->addParam('data_mod', date('Y-m-d'), 'text');
  280. $sql->crearteSQL('update');
  281. //$sql->testSQL();
  282. $sql->sqlQuery();
  283. }
  284. }
  285. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kayman
post
Post #2





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


klasa powstała w związku z dużymi formularzami i pewnie dlatego singleton w connect bo zapytania w zasadzie dotyczą jednej bazy, jest ich najwyżej kilka ale kolumn duzo

co do private to cenna uwaga ale na dzień dzisiejszy nie bardzo widzę jej rozwój przez dziedziczenie

założenie było takie żeby ona wykonywała prawidłowe i przefiltrowane zapytanie i na tyle czytelne że w razie modyfikacji formularza/bazy/widoku (lub po prostu własnego błędu) można było szybko zmodyfikować duże zapytanie sql

Ten post edytował kayman 6.11.2013, 21:22:30
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 11:52