Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dlaczego pole w klasie nie jest modyfikowanie
Forum PHP.pl > Forum > PHP
Aztech
Zwątpiłem! Nie wiem dlaczego poniższy kod nie działa.

klasa Forum
  1. <?php
  2.  
  3. /* ... wycięty zbędny kod ... */
  4.  
  5. /**
  6.    * Informuje o aktywowaniu (zatwierdzeniu przez administratora) forum
  7.    * @var boolean
  8.    * @access private
  9.    */
  10. private $active;
  11.  
  12. /* ... wycięty zbędny kod ... */
  13.  
  14. /**
  15.    * Aktywacja forum
  16.    * 
  17.    * @access public  
  18.    */
  19. public function activate(){
  20. $this->active = true;
  21. }
  22.  
  23. /**
  24.    * Deaktywowanie forum
  25.    * 
  26.    * @access public
  27.    *
  28.    */
  29. public function deactivate() {
  30. $this->active = false;
  31. }
  32.  
  33. /**
  34.    * Sprawdzenie stanu forum, (czy zostało aktywowane)
  35.    *
  36.    * @return boolean
  37.    * @access public
  38.    */
  39. public function isActive(){
  40. return $this->active;
  41. } 
  42.  
  43.  
  44. ?>


kod w php, który nie działa - w komentarzach wyjaśnienei problemu
  1. <?php
  2.  
  3. / * kod */
  4. case 'deact': //deaktywowanie forum
  5. if (isset($arr[3])) {
  6. try {
  7. $act_forum = new Forum($arr[3]);
  8. #odczytaj dane z bazy
  9. $act_forum->readDataFromSQLById();
  10. echo "<BR>AKTYWNY? = ".$act_forum->isActive()."<BR>"; #tutaj wyświetla mi się pobrana z bazy wartość 1(true)
  11. #deaktywuj
  12. $act_forum->deactivate();
  13. echo "<BR>AKTYWNY? = ".$act_forum->isActive()."<BR>"; # a tutaj nie wyrzuca mi żadnej wartości, nawet null
  14. #uaktualnij dane
  15. $act_forum->updateSQL();
  16. #zakończenie
  17. $arr[2]==null;
  18. }
  19. catch (PDOException $e) {
  20. echo $e;
  21. }
  22. }
  23. break;
  24. /* kod */
  25.  
  26. ?>


Konia z rzędem dla tego ktro mi wytłumaczy dlaczego to nie działa?
dr_bonzo
  1. <?php
  2. $x = true;
  3. echo "[" . $x . "]<br />";
  4. var_dump( $x );
  5.  
  6. echo "<br />";
  7.  
  8. $x = false;
  9. echo "[" . $x . "]<br />"; // <<<<<<<<<<<<<<
  10. var_dump( $x );// <<<<<<<<<<<<<<
  11. ?>

powinno wystarczyc
Aztech
var_dump() zwróciło:
Kod
wartość po odczytaniu z bazy: string(1) "1"
wartość po deaktywowaniu: bool(false)


jak widać, potem jest funkcja updateSQL, która zapisuje wartość z pola active i zapisuje za pomocą setSql do obiektu PDOStatement
  1. <?php
  2. if (isset($update_id)) {
  3. $this->setSql("UPDATE rbx_forums"
  4. ." SET"
  5. ." forum_id = ".$update_id.","
  6. ." app_order = ".$this->getAppearanceOrder().","
  7. ." subforums = ".$this->getSubforumNum().","
  8. ." topics = ".$this->getTopicNum().","
  9. ." title = '".$this->getTitle()."',"
  10. ." last_post_id = ".$this->getLastPostId().","
  11. ." last_topic_id = ".$this->getLastTopicId().","
  12. ." active = ".$this->isActive().","
  13. ." posts = ".$this->getPostNum().","
  14. ." description = '".$this->getDescription()."'"
  15. ." WHERE forum_id = ".$update_id
  16. ." LIMIT 1");
  17.  
  18. ?>

no i print_r() zwraca mi:
Kod
PDO Object ( ) [result:private] => [sql:private] => UPDATE rbx_forums SET forum_id = 4, app_order = 5, subforums = 0, topics = 0, title = 'algebra', last_post_id = 0, last_topic_id = 0, active = , posts = 0, description = 'Zadania oraz materiały z wykładu' WHERE forum_id = 4 LIMIT 1

a PDO wyrzuca wyjątek:
Kod
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' posts = 0, description = 'Zadania oraz materiały z wykładu' WHERE forum_id = 4 '
dr_bonzo
1. $this->isActive() wyswietla ci pusty string, wiec zapytanie wyglada:
  1. WHERE active = , posts = 3 ...

w powodu wyzej wymienionego: jesli w bazie zapisujesz stan active:
active: 1
non active: 0

to najlepiej tak samo zapisywac w obiekcie

  1. <?php
  2. public function activate(){
  3. $this->active = 1;
  4. }
  5.  
  6. public function deactivate() {
  7. $this->active = 0;
  8. }
  9.  
  10. public function isActive(){
  11. return $this->active !== 0;
  12. } 
  13. ?>


wtedy zapytanie bedzie prawidlowe.

Lub przy zapytaniu:

  1. <?php
  2. active = " . ( $this->isActive() ? 1 : 0 ) . ", posts = ". ....
  3. ?>
Aztech
Dzieki, pomogło. Wszystko guitar.gif Już zrozumiałem, gdzie popełniałem błąd.
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.