Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przejscie z mysql na mysqli obiektowe. dlaczego kod nie działa?
Forum PHP.pl > Forum > PHP
miccom
Witam.
Właśnie chcę przejść z mysql do mysqli i ponad to z programowania strukturalnego do programowania obiektowego...
Co robię źle, że poniższy kod nie działa, po dłuższym "mieleniu" strony wyskakuje błąd BAD GATEWAY...


  1. public function connect_with_database(){
  2. $this->dbhandle = new mysqli('localhost', 'root', 'haslo', 'baza');
  3. if (!$this) {
  4. printf("Brak połączenia z serwerem MySQL. Kod błędu: %s\n", mysqli_connect_error());
  5. }
  6. }
  7. public function pobierz_dane($id_one){
  8. $zapytaj1=$this->query("select * from tabela_one where rekord = '".$id_one."' ");
  9. $zapytaj=$zapytaj1->fetch_assoc();
  10. $id_rekord=$zapytaj['rekord'];
  11. $statement = 'select * from koszta where rekord_koszt = '.$id_rekord.' ';
  12. $result = $this->query($statement);
  13. while ($row = $result->fetch_assoc() ){
  14. $i = (int)($row["id_rek"]-1) / $this->size_y;
  15. $j = (int)($row["id_rek"]-1)% $this->size_x;
  16. $this->area[$i][$j]['cost'] = $row['koszt'];
  17. }
  18. }
  19.  
  20. if($action==1){
  21. $area = new Area(120,120);
  22. $area->connect_with_database();
  23. $area->pobierz_dane(14);
  24. }




plej
  1. if (!$this) {

tu masz chyba błąd ; p
  1. if (!$this->dbhandle ) {


Następna sprawa to w funckji pobierz_dane
musisz dać uchwyt do połączenia ; p jak wykonujesz zapytanie query ; p
miccom
Ok, wiec byłoby tak?

  1. $this->dbhandle->query("select * from tabela_one where rekord = '".$id_one."' ");
  2. $zapytaj=$zapytaj1->fetch_assoc();
  3. $id_rekord=$zapytaj['rekord'];
  4. $statement = 'select * from koszta where rekord_koszt = '.$id_rekord.' ';
  5. $result = $this->dbhandle->query($statement);
  6. while ($row = $result->fetch_assoc() ){
  7. $i = (int)($row["id_rek"]-1) / $this->size_y;
  8. $j = (int)($row["id_rek"]-1)% $this->size_x;
  9. $this->area[$i][$j]['cost'] = $row['koszt'];
  10. }

ech dużo nauki przede mną;/
Powyższe rozwiąże sprawę?
plej
Np.:

  1. $db_obj= new mysqli("localhost", "php", "test", "ksiegarnia");
  2. if(!$db_obj->connect_errno){
  3.  
  4. $query = "select * from tabelajakas";
  5.  
  6. if($result = $db_obj->query($query)){
  7. echo "work !biggrin.gif " ;
  8. }else{
  9. echo "lipa";
  10. }
  11.  
  12. }else{
  13.  
  14. echo "połączenie się nie udało bla bla";
  15. }


No ja ci skryptu pisać nie będę ; p poćwicz trochę to zapamiętasz biggrin.gif

Tu piszą różnice mysql miedzy mysqli
http://funkcje.net/view/4/28/2375/

A tu coś ggotowego masz ; p

http://funkcje.net/view/2/8/1585/index.html


Polecam książke
php i mysql dla każdego "Marcin Lis"

masz w niej wszystko:D
miccom
Skryptu nie musisz pisać, poza tym to co wskazujesz w linkach znam...

Twój przykład też sam bym sklecił bo inne skrypty o takiej konstrukcji działają...ale w funkcji nie działają...
Sprawdzę ten uchwyt, może tutaj się krzaczy
plej
Dasz rade:D
miccom
No niestety...
Mimo wpisania uchwytu nie działa...
Jak sprawdzić, co nie działa? Jest jakaś metoda na pokazanie co w zapytaniu jest nie tak?
plej
A jakieś błędy ci chyba wyświetla?
miccom
No właśnie nie wiem jak w obiektowym projektowaniu wskazywać błędy...

W mysql strukturalnym wywalają się błędy, w obiektowym po prostu przeglądarka myśli... a następnie wskazuje BAD GATEWAY bez podania błędu...
Czy po każdym zapytaniu do bazy muszę dać or trigger_error("Query Failed! SQL: $sql - Error: ".mysqli_error(), E_USER_ERROR); questionmark.gif
Turson
Bad gateway to nie wina obiektowego PHP. Jest coś takiego jak mysqli errno i ono powinno pokazać błąd. Zwykłe or die error powinno rozwiązać problem.
miccom
Jak dam taką wersję:
  1. public function pobierz_dane($id_one){
  2. $zapytaj=mysql_fetch_array(mysql_query("select * from tabela_one where rekord = '".$id_one."' ") );
  3. $id_rekord=$zapytaj['rekord'];
  4. $statement = 'select * from koszta where rekord_koszt = '.$id_rekord.' ';
  5. $result = mysql_query($statement);
  6. while ($row = mysql_fetch_array) ){
  7. $i = (int)($row["id_rek"]-1) / $this->size_y;
  8. $j = (int)($row["id_rek"]-1)% $this->size_x;
  9. $this->area[$i][$j]['cost'] = $row['koszt'];
  10. }
  11. }


to wszystko działa poprawnie
maly_swd
Ponieważ w funkcji pobierz_dane, nie "widzi" obiektu $this z funcji connect_with_database.

viking
Cytat(miccom @ 13.02.2014, 12:50:46 ) *
No właśnie nie wiem jak w obiektowym projektowaniu wskazywać błędy...


http://www.php.net/manual/pl/class.mysqli-sql-exception.php
Poszukaj w dokumentacji o wyjątkach. Nie opłaca ci się bardziej przejść na PDO?
miccom
Cytat(maly_swd @ 13.02.2014, 17:04:00 ) *
Ponieważ w funkcji pobierz_dane, nie "widzi" obiektu $this z funcji connect_with_database.


Jak w ciele funkcji dam global $this; towywala błąd że nie mogę dwa razy deklarować tego samego $this...

Ale przed wywołaniem funkcji łączę się z bazą... Mam się połączyć w ciele funkcji pobierz_dane ?


Cytat(viking @ 13.02.2014, 17:15:49 ) *
http://www.php.net/manual/pl/class.mysqli-sql-exception.php
Poszukaj w dokumentacji o wyjątkach. Nie opłaca ci się bardziej przejść na PDO?


A co do PDO to w kursie który "przerabiam" instruktor mówił, że PDO jest wolniejsze... U mnie cały skrypt jest strukturalnie napisany w mysql, teraz przechodzę na mysqli i obiektowe rozwiązania. W większości skryptów działa pięknie... natomiast w tym sie krzaczy i nie porafię znaleźć, co jest nie tak.
Pyton_000
  1. $this->dbhandle->query(...)
viking
Cytat(miccom @ 13.02.2014, 18:00:40 ) *
A co do PDO to w kursie który "przerabiam" instruktor mówił, że PDO jest wolniejsze... U mnie cały skrypt jest strukturalnie napisany w mysql, teraz przechodzę na mysqli i obiektowe rozwiązania. W większości skryptów działa pięknie... natomiast w tym sie krzaczy i nie porafię znaleźć, co jest nie tak.


A podparł swoje teorie testami? Nawet jeśli będzie różnica w tysięcznej części sekundy na poziomie sterownika nie ma to znaczenia dla zapytania trwającego kilka sekund. A skoro już uczysz się czegoś nowego warto stosować IMO rozwiązania które wszyscy wykorzystują. Większość DBAL opiera się głównie na PDO, jest bardziej przejrzyste i uporządkowane. No i nie musisz zastanawiać się jak obsługiwać błędy.
Pyton_000
Cytat
No i nie musisz zastanawiać się jak obsługiwać błędy.

A co w kosmos je wyślesz wink.gif

Poza tym kolejny argument jest taki, że w każdej chwili możesz zmienić silnik BD na inny nie zmieniając nic w kodzie. Możesz z MySQL powędrować do SQLite np. smile.gif
sazian
Cytat(viking @ 13.02.2014, 20:00:54 ) *
Nawet jeśli będzie różnica w tysięcznej części sekundy na poziomie sterownika nie ma to znaczenia dla zapytania trwającego kilka sekund.

skoro zapytanie wykonuje się kilka sekund to zapewne trzeba je zmienić.


Cytat(viking @ 13.02.2014, 20:00:54 ) *
A skoro już uczysz się czegoś nowego warto stosować IMO rozwiązania które wszyscy wykorzystują

nie wszyscy.
Ja używam mysqli, więc Twoja teoria padła tongue.gif
za to mogę powiedzieć że z mysqli korzystają prawie wszyscy smile.gif

Cytat(Pyton_000 @ 13.02.2014, 20:26:42 ) *
Poza tym kolejny argument jest taki, że w każdej chwili możesz zmienić silnik BD na inny nie zmieniając nic w kodzie. Możesz z MySQL powędrować do SQLite np. smile.gif

jest to argument który słyszę zawsze w dyskusjach "dlaczego pdo jest lepsze". Tylko jakoś nigdy nie miałem takiej potrzeby...
tym bardziej że w wielu przypadkach wymagałoby to dokonania zmian samej bazy i zapytań
Pyton_000
Cytat(sazian @ 13.02.2014, 20:38:18 ) *
tym bardziej że w wielu przypadkach wymagałoby to dokonania zmian samej bazy i zapytań

Zgadza się. Ale o ile nie wykorzystuje się jakichś dziwacznych konstrukcji SQL to każda baza łyknie.
I fakt nie codziennie zmienia sie BD, a jeżeli już taka zmiana następuje to pewnie tez następuje ze zmianą silnika wink.gif
sazian
mysql używa do "izolacji" słów kluczowych w nazwach tabel/kolumn znaku ` a mssql []
mysql podczas grupowania pozwala na wyświetlenie kolumn których niema w GROUP BY, większość innych baz nie
postgresql pozwala na tworzenie typów tablicowych i złożonych, mysql nie

czy to są dziwaczne konstrukcje ? nie, to są konstrukcje wykorzystywane w tych silnikach na co dzień, a jednocześnie są to różnice uniemożliwiającą przejście od tak
Pyton_000
Cytat
mysql używa do "izolacji" słów kluczowych w nazwach tabel/kolumn znaku ` a mssql []

Dobrym zwyczajem jest nie używać takowych w bazie.
Cytat
mysql podczas grupowania pozwala na wyświetlenie kolumn których niema w GROUP BY, większość innych baz nie

Pokaż przykład tej większości

Może faktycznie trochę napisałem na wyrost że "bez zmian w kodzie". Bardziej odpowiednim by było "zmiany kosmetyczne w zapytaniach"

Ale dobra, dość tego tematu. Jak chcesz podyskutować na ten temat to na PW zapraszam smile.gif
sazian
Cytat(Pyton_000 @ 13.02.2014, 21:41:05 ) *
Pokaż przykład tej większości


oracle,mssql,postgresql
miccom
Słuchajcie, gdybym zadał pytanie na jaki system się przesiąść to Wasza debata miałaby sens...

Aktualnie nie działają żadne rozwiązania które zostały podane w tym temacie...
Pyton_000
A zastosowałeś to co Ci podałem ?
sazian
pokaż więcej kodu, jak to obecnie wygląda w całości
wywala jakieś błędy ?
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.