• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PDO i kilka połączeń do bazy MySQL raz za czas wysypuję błędem

Object Storage Arubacloud
0 głosów
1,023 wizyt
pytanie zadane 21 listopada 2015 w SQL, bazy danych przez Pytający Początkujący (290 p.)
Witam,

Mam pewien problem z PDO i MySQL.

Mianowicie mam projekt w którym integruje dwie oddzielne bazy Mysql.

takim sposobem robie sobie połączenia:

 try
 {
   $db = @new PDO('mysql:host='.$dbhost.';dbname='.$dbname.'', ''.$user.'', ''.$pass.'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    echo 'Połączenie nawiązane!';
 }
 catch(PDOException $e)
 {
    echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
 }
 

Analogicznie drugie połaczenie wygląda tak samo z różnicą danych do MySql i zmieną połaczenia.

Przy odświeżaniu strony albo przy przechodzeniu na podstronę w której mam kilka zapytań do bazy wzór zapytania:

$stmt = $db->prepare("SELECT * FROM tabela");        
$stmt->execute();            
 while($row = $stmt->fetch())
   {
     echo'działa';
    }   

$stmt->closeCursor();    

często ale nie zawsze wystepuje taki bład:

"Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia. "

oraz przy zapytaniu:

"Fatal error: Call to a member function prepare() on a non-object in "

Co ciekawe ten błąd zawsze odwołuje sie do tej "drugiej" bazy.

 

Co może być przyczyną? Nie kończe połączeń do bazy albo zapytań gdy je wykonam i przez to baza danych MySQL nie ma już wolnego miejsca dla mojego połączenia? Może baza ma ograniczone połączenia albo częstotliwość zapytań?

Będę wdzięczny za jakiekolwiek sugestie i pomysły.

2 odpowiedzi

+1 głos
odpowiedź 21 listopada 2015 przez efiku Szeryf (75,160 p.)
1. Sprawdz serwer zdalny , możlie, że ustawiony jest tak, aby akceptować tylko lokalne połączenia z bazą. Ponieważ bez problemu można trzymać połączenia z kilkoma bazami  ;)

2. Gdzie nauczyłeś się tak tak bardzo złej praktyki jak stosowanie @ w kodzie?  Wiesz wgl co daje try catch?? PDO Rzuca wyjątkiem jak nie ustanowi połączenia, ten wyjątek łapiesz własnie blokiem try ... catch.

3. Błąd mówi, że próbujesz się odwołać do metody obiektu $db którym jest  boolean albo null. ( no nie udało się połączyć z bazą to myk)

 

Postaram się pokazać Ci przykładowy kod w oparciu o sqlite.
komentarz 21 listopada 2015 przez Pytający Początkujący (290 p.)
1. Gdyby było tak ustawione to razczej za kazdym razem byłby ten błąd? A tak to jest raz za czas...

2. Z począktu jak uczyłem się PDO to w kilku kursach zawsze była @... i tak ją już zostawiałem. Ale faktycznie przecież wyłapuje błędy i ich nie pokazuje :)

3. Tak, błąd mówi nam że nie można się połączyć z bazą danych, albo jest niedostępna lub nie odpowiada.
komentarz 21 listopada 2015 przez efiku Szeryf (75,160 p.)
komentarz 21 listopada 2015 przez efiku Szeryf (75,160 p.)
aa no rzeczywiście, myślałem, że wgl nie masz dostępu do drugiej zdalnej bazy.

No to skoro aktualnie go odmawia, to napisz tam do nich, aby przestał odmawiać :D

Support myślę, że da radę.
komentarz 21 listopada 2015 przez Pytający Początkujący (290 p.)

Przerobiłem na szybko na Twój szablon tworzenia połączenia ale dalej ten sam błąd wyskakuje, nie za każdym razem ale wyskakuje...

Powiedz i proszę czy ja dobrze myślę, a mianowicie czy ten kod:

$stmt = $db->prepare("SELECT * FROM tabela");        
$stmt->execute();            
 while($row = $stmt->fetch())
   {
     echo'działa';
    }   

$stmt->closeCursor(); 

Tworzy mi tak jaby nowe połączenie do bazy? I tak ma być? czy jest jakiś inny sposób?

0 głosów
odpowiedź 21 listopada 2015 przez Szymon Lisowiec Mądrala (7,150 p.)

Nie zapomniałeś zamykać połączenia z bazą?
 

$db = null;

 

komentarz 21 listopada 2015 przez Pytający Początkujący (290 p.)
Ale ogólnie to dobrze robię te zapytania i tworzenie połączeń?

Mianowicie czy jest jakaś opcja w której tylko raz otwieram połączenia do baz a potem w ramach tego jednego połączenia wykonuje kilka zapytań?
komentarz 21 listopada 2015 przez Pytający Początkujący (290 p.)
Niestety, po dodaniu portu również występuje ten błąd...
komentarz 21 listopada 2015 przez Szymon Lisowiec Mądrala (7,150 p.)
Tak.

Hmm, może napisz do supportu hostingu tej bazy danych z którą masz problem?
komentarz 21 listopada 2015 przez Pytający Początkujący (290 p.)
Spróbuje ich zapytać w czym może być problem albo żeby logi podesłali.

A co z tym „jednorazowym” połączeniem jest na to jakiś sposób?

Żeby nie otwierać za każdym razem nowego połączenia?

PS. Dzięki za zainteresowanie :)
komentarz 21 listopada 2015 przez Szymon Lisowiec Mądrala (7,150 p.)
W PHP takiego nie uzyskasz. Możesz np. w nodejs nawiązać stałe połączenie.

Ok, proszę. ;)

Podobne pytania

0 głosów
2 odpowiedzi 487 wizyt
–2 głosów
1 odpowiedź 241 wizyt
pytanie zadane 30 czerwca 2016 w PHP przez Kacper Duda Obywatel (1,970 p.)
0 głosów
2 odpowiedzi 288 wizyt
pytanie zadane 29 listopada 2015 w PHP przez Widemo Użytkownik (920 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...