Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Objektówka
Forum PHP.pl > Forum > PHP > Object-oriented programming
primo
Witam,

próbuję zrozumieć działanie prostego skryptu pobierającego dane z bazy, niby błędy nie wyskakują (nawet jak coś celowo usunę z kodu i powinno je pokazać)

  1. <?php
  2. require_once(&#092;"BD.class.php\");
  3.  
  4. class Widget {
  5. private $id;
  6. private $name;
  7. private $description; 
  8. private $bd;
  9. private $needsUpdating = false;
  10.  
  11.  
  12. public function _construct($widgetID){
  13.  
  14. $bd = new BD;
  15.  
  16. if (!$bd->otworz()) {
  17. die ($bd->blad());
  18. }
  19.  
  20. if (!$bd->zapytaj(&#092;"SELECT \"nazwa\", \"opis\" FROM artykul WHERE nr_artykulu = $widgetID\")) {
  21. die ($db->error());
  22. }
  23.  
  24. if (!pobierzTablice) {
  25. throw new Exception ('Szukanego artykułu nie ma w bazie !');
  26. }
  27.  
  28. $bd->pobierzTablice();
  29.  
  30. $data->pobierzTablice();
  31. $this->id = $widgetID;
  32. $this->name = $data['nazwa'];
  33. $this->description = $data['opis'];
  34. }
  35.  
  36. public function getName() {
  37. return $this->name;
  38. }
  39.  
  40. public function getDescription() {
  41. return $this->description;
  42. }
  43.  
  44. public function setName($name) {
  45. $this->name = $name;
  46. $this->needsUpdating = true;
  47. }
  48.  
  49. public function setDescription($description) {
  50. $this->description = $description;
  51. $this->needUpdating = true;
  52. }
  53.  
  54. public function _destruct () {
  55. if (! $this->needsUpdating){
  56. return;
  57. }
  58.  
  59. $bd = 'UPDATE \"artykul\" SET';
  60. $bd.= &#092;"\"nazwa\" = '\" .msql_escape_string($this->name) . \"', \";
  61. $bd.= &#092;"\"opis\" = '\" .msql_escape_string($this->description) . \"' \";
  62. $bd.= &#092;"WHERE nr_artykulu = \" .$this->id;
  63.  
  64. }
  65.  
  66. }
  67. ?>


  1. <?php
  2. require_once('class.Widget.php');
  3.  
  4. try {
  5. $objWidget = new Widget (1);
  6.  
  7. print &#092;"Nazwa artykułu: \" .$objWidget->getName() .\"<br>n\";
  8. print &#092;"Opis artykułu: \" .$objWidget->getDescription() . \"<br>n\";
  9.  
  10. $objWidget->setName ('Trampki');
  11. $objWidget->SetDescription ('Trampki o dużym przebiegu !');
  12. } catch (Exception $e) {
  13. die (&#092;"Wystąpił problem: \" .$e->getMessage());
  14. }
  15. ?>


jak odpalę ten drugi skrypt to pokazuje mi tylko w przeglądarce:
Nazwa artykułu:
Opis artykułu:

nic poza tym.

macie jakieś pomysły ?
czachor
  1. <?php
  2. $bd = 'UPDATE \"artykul\" SET';
  3. $bd.= &#092;"\"nazwa\" = '\" .msql_escape_string($this->name) . \"', \";
  4. $bd.= &#092;"\"opis\" = '\" .msql_escape_string($this->description) . \"' \";
  5. $bd.= &#092;"WHERE nr_artykulu = \" .$this->id;
  6. ?>
to Ci się luzem wala...
Imperior
Widzę tutaj dwa zasadnicze błędy:
1. metody specjalne zaczynają się od __ zatem powinno być:
  1. <?php
  2. public function __construct(...) {}
  3. public function __destruct(...) {}
  4. ?>


2. Dwie rzeczy są ni z gruszki ni z pietruszki:
  1. <?php
  2. if (!pobierzTablice) {...}
  3. ?>

Oraz:
  1. <?php
  2. $data->pobierzTablice();
  3. ?>

Skąd to się wzieło (w drugim chodzi mi o $data)?

--EDIT--

No i własnie jeszcze SQL... nazwy pól masz zapisane jako stringi...
Używaj `pole`.

--EDIT2--

Dopiero teraz zrozumiałem post poprzednika biggrin.gif
Tworzysz zapytanie, ale go nie wykonujesz.
No i jeszcze podstawianie zapytania do zmiennej o takiej samej nazwie, jak wcześniej była baza danych, daje nieczytelny kod.
primo
Ad. 1 -- poprawione
Ad. 2

poprawiłem na:
  1. <?php
  2. $data = $bd->pobierzTablice();
  3. ?>


funkcja ta pochodzi z includowanej clasy Baza - msql_fetch_array

Ad. 3

  1. $sql = 'UPDATE "artykul" SET';
  2. $sql.= "\"nazwa\" = $this->name ,";
  3. $sql.= "\"opis\" = $this->description";
  4. $sql.= "WHERE nr_artykulu = " .$this->id;


a co dalej to nie mam zielonego pojęcia ;(
Imperior
No jeszcze pozostało Ci wykonać to zapytanie (czyli tak jak u góry z tym bd->zapytaj() )
primo
  1. <?php
  2. if (!$bd->zapytaj(&#092;"UPDATE artykul SET nazwa = $this->name, opis = $this->description WHERE nr_artykulu = $this->id\")) {
  3. die ($bd->blad());
  4. }
  5. ?>


Wyskakuje komunikat o błędzie:

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 'o dużym przebiegu ! WHERE nr_artykulu = 1' at line 1
nospor
ale napisy w mysql ttrzeba w ciapkach dawac:
  1. <?php
  2.  
  3. if (!$bd->zapytaj(&#092;"UPDATE artykul SET nazwa = '$this->name', opis = '$this->description' WHERE nr_artykulu = $this->id\")) {
  4.         die ($bd->blad());
  5.     }
  6.  
  7. ?>


że już nie wspomnę o ich ewentualnym escapowaniu
primo
Cytat
że już nie wspomnę o ich ewentualnym escapowaniu


a co to oznacza questionmark.gif

Wszystkie błędy usunięte, a jak nie było pobrania z bazy tak i dalej nie ma. A cholewcia obiektówka miała być o wiele łatwiejsza winksmiley.jpg a nie mogę nawet rekordu z bazy wyciągnąć, co dopiero przerobić kod strony (za 5 lat się odezwę) winksmiley.jpg
nospor
escapowanie: mysql_escape_string

Cytat
a nie mogę nawet rekordu z bazy wyciągnąć
Nie żebym się czepial, ale update nie slyzu do wyciągania danych

edit: aha, nie doczytalem calego topicu winksmiley.jpg
może pokaż jeszcze raz caly oprawiony kod
primo
no bez przesady, przecież jest powyżej kod z zapytaniem select.

dopisałem jeszcze:

  1. <?php
  2. if (!$sql = $bd->zapytaj(&#092;"UPDATE artykul SET nazwa = '$this->name', opis = '$this->description' WHERE nr_artykulu = $this->id\")) {
  3. die ($bd->blad());
  4. }
  5.  
  6. $rs = $bd->zapytaj($this->bd, $sql);
  7. if(! is_resource($rs)) {
  8. throw new Exception('Wystąpił błąd podczas aktualizacji bazy danych');
  9. }
  10.  
  11. $bd->zamknij($this->bd);
  12. ?>


Cytat
escapowanie: mysql_escape_string


jak teraz zescapuje to zapytanie to czy przypadkiem nie wyskoczy błąd że mój obiekt BD tego nie obsługuje questionmark.gif
nospor
Cytat
jak teraz zescapuje to zapytanie
Ale ty nie masz apytania escxapować, a wartości tekstowe, czyli np mysql_escape_string($this->name)
Miales to robione wyżej w postach
primo
  1. IF (!$sql = $bd->zapytaj("UPDATE artykul SET nazwa = '". mysql_escape_string ($this->name)."', opis = '". mysql_escape_string ($this->description)."' WHERE nr_artykulu = $this->id")) {
  2. die ($bd->blad());
  3. }


oki poszło.

jak dodałem ten kod poniżej zapytania to mam błąd: Fatal error: Exception thrown without a stack frame in Unknown on line 0

cały poprawiony kod:

  1. <?php
  2. require_once(&#092;"BD.class.php\");
  3.  
  4. class Widget {
  5. private $id;
  6. private $name;
  7. private $description; 
  8. private $bd;
  9. private $needsUpdating = false;
  10.  
  11.  
  12. public function __construct($widgetID){
  13.  
  14. $bd = new BD;
  15.  
  16. if (!$bd->otworz()) {
  17. die ($bd->blad());
  18. }
  19.  
  20. if (!$bd->zapytaj(&#092;"SELECT nazwa, opis FROM artykul WHERE nr_artykulu = $widgetID\")) {
  21. die ($bd->blad());
  22. }
  23.  
  24. $data = $bd->pobierzTablice();
  25. $this->id = $widgetID;
  26. $this->name = $data['nazwa'];
  27. $this->description = $data['opis'];
  28. }
  29.  
  30. public function getName() {
  31. return $this->name;
  32. }
  33.  
  34. public function getDescription() {
  35. return $this->description;
  36. }
  37.  
  38. public function setName($name) {
  39. $this->name = $name;
  40. $this->needsUpdating = true;
  41. }
  42.  
  43. public function setDescription($description) {
  44. $this->description = $description;
  45. $this->needUpdating = true;
  46. }
  47.  
  48. public function __destruct () {
  49. if (! $this->needsUpdating){
  50. return;
  51. }
  52.  
  53. $bd = new BD;
  54.  
  55. if (!$bd->otworz()) {
  56. die ($bd->blad());
  57. }
  58.  
  59. if (!$sql = $bd->zapytaj(&#092;"UPDATE artykul SET nazwa = '\". mysql_escape_string ($this->name).\"', opis = '\". mysql_escape_string ($this->description).\"' WHERE nr_artykulu =\" .$this->id)) {
  60. die ($bd->blad());
  61. }
  62.  
  63. $bd->zamknij($this->bd);
  64.  
  65. }
  66.  
  67. }
  68. ?>
nospor
no ale sluchaj. Robisz zabytanie update, a potem sprawdzzasz czy wynik tego zapytania jest resource. Jelsi nie to wyrzucasz wyjątek. Jaki sens i logika? przecież zapytania typu update zwracają true lub false i nigdy nie będą resorcem, więc zawsze po takim zapytaniu wywali ci wyjątek tongue.gif
primo
właśnie to dostrzegłem i wywaliłem winksmiley.jpg ale dzięki
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.