Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poczatki z PHP5 i MySql
Forum PHP.pl > Forum > PHP
Miko05
Witam

Do tej pory programowałem struturalnie i postanowiłem przesiąść się na obiektowe programowanie.
rozpoczołem nauke PHP5 i mam problem.

Stworzyłem plik class.Widget.php i index.php poniżej ich zawartości.
A mój problem polega na tym że nie pobiera danych z bazy danych, anie też nie otrzymuje żadnego komuniaktu błądu.


class.Widget.php
  1. <?php
  2.  
  3. class Widget{
  4.  
  5.  
  6.  
  7. private $id;
  8. private $name;
  9. private $description;
  10. private $hDB;
  11. private $polaczenie;
  12. private $needUpdateing = false;
  13.  
  14. public function _construct($widgetID){
  15.  
  16. $this->hDB = new mysqli("localhost", "user", "hasło", "nazwa_bazy");
  17.  
  18. if(!is_resource($this->hDB)){
  19. throw new Exception('nie można połączyć się z bazą');
  20. }
  21.  
  22. if(0 !== mysqli_connect_errno($this->hDB)) {
  23. throw new Exception(mysqli_connect_error($this->hDB));
  24. }
  25.  
  26.  
  27.  
  28. $sql = "SELECT * FROM artykul WHERE nr_artykulu = $widgetID";
  29. $rs = $this->hDB->query($sql);
  30. if(!is_resource($rs)){
  31. throw new Exception('Błąd przy wykonywaniu instrukcji wyboru.');
  32. }
  33.  
  34. if(!mysql_num_rows($rs)){
  35. throw new Exception('Szukanego artykułu nie ma w bazie!');
  36. }
  37.  
  38. $data = $rs->fetch_array();
  39. //$data = mysql_fetch_array($rs);
  40. $this->id=$widgetID;
  41. $this->name=$data['name'];
  42. $this->description=$data['opis'];
  43.  
  44.  
  45. }
  46.  
  47. public function getName(){
  48. return $this->name;
  49. }
  50.  
  51. public function getDescription(){
  52. return $this->description;
  53. }
  54.  
  55. public function setName($name){
  56. $this->name = $name;
  57. $this->needUpdating = true;
  58. }
  59.  
  60. public function setDescription($description){
  61. $this->description = $description;
  62. $this->needUpdating = true;
  63. }
  64.  
  65. public function _destruct(){
  66. if(! $this->needUpdating){
  67. return;
  68. }
  69.  
  70. $sql = 'UPDATE "artykul" SET';
  71. $sql .= "\"nazwa\"= '".mysql_escape_string($this->name)."', ";
  72. $sql .= "\"opis\"= '".mysql_escape_string($this->description)."', ";
  73. $sql .= "WHERE nr_artykulu=".$this->id;
  74.  
  75. //$rs=mysql_query($thishDB. $sql);
  76.  
  77. if(! is_resource($rs)){
  78. throw new Exception('Wystąpił błąd podczas akutalizacji bazy danych.');
  79. }
  80.  
  81. mysql_close($this->hDB);
  82. }
  83.  
  84. }
  85.  
  86. ?>



i plik index.php
  1. <?php
  2.  
  3. require_once('class.Widget.php');
  4.  
  5. try{
  6. $objWidget = new Widget('2');
  7.  
  8. print "Nazwa artykulu: ".$objWidget->getName() . "<br/>\n";
  9. print "Opis artykulu: ".$objWidget->getDescription() . "<br/>\n";
  10.  
  11. $objWidget->setName('Trampki');
  12. $objWidget->setDescription('Trampki o duzym przebiegu');
  13.  
  14. } catch (Expetion $e){
  15. die ("Wystapil problem: ". $e->getMessage() );
  16. }
  17.  
  18. ?>


Tajgeer
  1. ini_set('display_errors', 1);
nospor
Z jednej strony używasz mysqli a z drugiej strony używasz mysql_num_rows..... jedno nie ma związku z drugim...

I tak jak napisał Tajgeer włącz wyświetlanie błędów
mikolaj51
  1. ...
  2. function __construct($widgetID){
  3. ...
Miko05
Wprowadziłem poprawkę która zasugerował Mikołaj51

  1. function __construct($widgetID){


i wyświetliło błąd

Fatal error: Uncaught exception 'Exception' with message 'nie można połączyć się z bazą' in /home/septsit/public_html/php5/class.Widget.php:24 Stack trace: #0 /home/septsit/public_html/php5/index.php(6): Widget->__construct('1') #1 {main} thrown in /home/septsit/public_html/php5/class.Widget.php on line 24
mikolaj51
Masz problem z połączeniem się z bazą danych... Widzę, że ten kod był pod bazy danych PostgreSQL smile.gif

Edit:

może zamiast:
  1. if(!is_resource($this->hDB)){
  2. throw new Exception('nie można połączyć się z bazą');
  3. }

spróbuj tak

  1. if($this->hDB->connect_errno){
  2. throw new Exception('nie można połączyć się z bazą');
  3. }
Miko05
Pomogło dzięki

teraz za to mam nowy błąd
Fatal error: Uncaught exception 'Exception' with message 'Błąd przy wykonywaniu instrukcji wyboru.' in /home/septsit/public_html/php5/class.Widget.php:36 Stack trace: #0 /home/septsit/public_html/php5/index.php(6): Widget->__construct('1') #1 {main} thrown in /home/septsit/public_html/php5/class.Widget.php on line 36

ale zamieniłem
  1. $sql = "SELECT * FROM artykul WHERE nr_artykulu = $widgetID";
  2. $rs = $this->hDB->query($sql);
  3. if(!is_resource($rs)){
  4. throw new Exception('Błąd przy wykonywaniu instrukcji wyboru.');
  5. }


na

  1. $sql = "SELECT * FROM artykul WHERE nr_artykulu = $widgetID";
  2. $rs = $this->hDB->query($sql);
  3. if ($rs === false){
  4. throw new Exception('Błąd przy wykonywaniu instrukcji wyboru.');
  5. }


i wywaliłem

  1. if(!mysql_num_rows($rs)){
  2. throw new Exception('Szukanego artykułu nie ma w bazie!');
  3. }


i zadziałało smile.gif

ale pytanie czy moge jakość sprawdzić czy dany wiersz istnieje w bazie?
mikolaj51
Np. tak:

  1. $sql = "SELECT * FROM artykul WHERE nr_artykulu = $widgetID";
  2. $rs = $this->hDB->query($sql);
  3. if($rs->num_rows == 0){
  4. //nie ma takiego rekordu
  5. }
  6. else{
  7. //jest
  8. }
lukaskolista
Nie
  1. $sql = "SELECT * FROM artykul WHERE nr_artykulu = $widgetID";
tylko
  1. $sql = "SELECT primary_key_kolumn FROM artykul WHERE nr_artykulu = $widgetID";
, jezeli artykul ma kilka kolumn typu text to nie ma sensu tego wszystkiego pobierac tylko po to, zeby sprawdzic, czy artykul istnieje
mikolaj51
lukaskolista - ale potem autor te dane wykorzystuje:

  1. (...)
  2. $data = $rs->fetch_array();
  3. //$data = mysql_fetch_array($rs);
  4. $this->id=$widgetID;
  5. $this->name=$data['name'];
  6. $this->description=$data['opis'];
  7. (...)
Miko05
Bardzo dziękuje za pomoc
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.