Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie i błędne sprawdzanie if'a
Forum PHP.pl > Forum > PHP > Object-oriented programming
MicNeo
Witam!

Tworze sobie taką klase, która ułatwi mi działanie na bazie danych. Na początku tworzyła automatycznie zapytania itp. Osobno łączyłem się z bazą (via mysqli), osobno tworzyłem zapytanie (moją klasą). Jednak chciałem to połączyć, więc rozrzeszyłem klase mysqli o moją klase.

  1. <?php
  2.  
  3. class DBManager extends mysqli
  4. {
  5. private $selectables = array();
  6. private $values = array();
  7. private $table;
  8. private $whereClause;
  9. private $limit;
  10.  
  11. public $connection;
  12.  
  13. function __construct($host, $user, $pass, $base){
  14. $this->connection = new mysqli($host, $user, $pass, $base);
  15. return $this;
  16. }
  17.  
  18. public function from($table)
  19. {
  20. $this->table = $table;
  21. return $this;
  22. }
  23.  
  24. public function where($clause)
  25. {
  26. $this->whereClause = $clause;
  27. return $this;
  28. }
  29.  
  30. public function limit($limit)
  31. {
  32. $this->limit = $limit;
  33. return $this;
  34. }
  35.  
  36. public function fields()
  37. {
  38. $this->fields = func_get_args();
  39. return $this;
  40. }
  41.  
  42. public function select()
  43. {
  44. $this->selectables = func_get_args();
  45. $query = "SELECT " . join(",", $this->selectables) . " FROM {$this->table}";
  46.  
  47. if (!empty($this->whereClause)){
  48. $query .= " WHERE {$this->whereClause}";
  49. }
  50. if (!empty($this->limit))
  51. $query .= " LIMIT {$this->limit}";
  52.  
  53. return $query;
  54. }
  55.  
  56. public function update()
  57. {
  58. $this->values = func_get_args();
  59. $query = "UPDATE {$this->table} SET " . join(",", $this->values) . " WHERE {$this->whereClause}";
  60. return $query;
  61. }
  62.  
  63. public function delete()
  64. {
  65. $query = "DELETE FROM {$this->table} WHERE {$this->whereClause}";
  66. return $query;
  67. }
  68.  
  69. public function add()
  70. {
  71. $this->values = func_get_args();
  72. $query = "INSERT INTO {$this->table} (" . join(",", $this->fields) . ") VALUES ('" . join("', '", $this->values) . "')";
  73. return $query;
  74. }
  75. }
  76.  
  77.  
  78. $db = new DBManager("localhost", "root", "", "test");
  79.  
  80. $query = $db->from("posts")->where("id=4")->limit(1)->select("id", "title");
  81.  
  82. if (mysqli_connect_errno())
  83. {
  84. printf("Connect failed: %s\n", mysqli_connect_error());
  85. exit();
  86. }
  87. if ($result = $db->connection->query($query))
  88. {
  89. while ($obj = $result->fetch_object())
  90. {
  91. echo $obj->id . "
  92. ";
  93. }
  94. $result->close();
  95. }
  96.  
  97. $db->connection->close();
  98.  
  99. ?>
  100.  


I niby wszystko fajnie działa, ale w metodzie "select" ten fragment kodu nie jest wykonywany:
  1. if (!empty($this->whereClause)){
  2. $query .= " WHERE {$this->whereClause}";
  3. }
  4. if (!empty($this->limit))
  5. $query .= " LIMIT {$this->limit}";


Tak jakby $this->limit była pusta. A nie jest! Nadmienię, że wcześniej działało winksmiley.jpg I do tego, jeżeli zrobie coś takiego:
  1. $a = $this->whereClause;
  2. if (!empty($a)){
  3. $query .= " WHERE {$this->whereClause}";
  4. }
  5. $a = $this->limit;
  6. if (!empty($b))
  7. $query .= " LIMIT {$this->limit}";
  8.  
To już wszystko śmiga. Totalnie nie mam pojęcia ocb.

Jeżeli ktoś ma jakieś pomysły, to śmiało walić smile.gif

Pozdrawiam!
plurr
na moje oko, takie rozwiązanie powinno działać - w metodach where i limit zwracasz ten sam obiekt z ustawionymi wcześniej whereClause i limit.

Wyprintuj sobie w metodach wartości whereClause i limit - zobaczymy czy coś w nich jest. Wtedy można dalej myśleć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.