Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] problem z drugim połączeniem, mysqli
Forum PHP.pl > Forum > Bazy danych > MySQL
14lukas14
A ja mam taki problem.. mam stronkę, na której używam systemu newsow i komentarzy.. korzystam z biblioteki mysqli... mam plik php z funkcja lacz_bd() [zwraca obiekt
Kod
$bd
] odpowiedzialną za ustanowienie połączenia z bazą właśnie za pomocą mysqli.. wszystko śmiga ładnie.. ale wymyśliłem sobie, żeby do komentarzy napisać osobny moduł, taki który mogliby wykorzystać inni użytkownicy.. tak więc logicznym jest także, aby ten moduł miał osobny plik php z funkcją lacz_bd_c() [zwraca obiekt
Kod
$bd_c
]...
i teraz operacje dodawania/wyswietlania komentarzy nie działają, podobnie jak wszystkie inne zapytania na obiekcie
Kod
$bd_c
..

wygląda to mniej więcej tak (kodu nie przytaczam ze względu na jego objętość):

Kod
<strona>
lacz_bd();
operacje na obiekcie $bd //tu wszystko śmiga
lacz_bd_c();
operacje na obiekcie $bd_c //tu właśnie pusto.. nic nie dodaje[insert], nic nie zwraca[select] itp
$bd_c->close();
$bd->close();
</strona>


taka modyfikacja także nic nie daje
Kod
<strona>
lacz_bd();
operacje na obiekcie $bd //tu wszystko śmiga
$bd->close();
lacz_bd_c();
operacje na obiekcie $bd_c //tu właśnie pusto.. nic nie dodaje[insert], nic nie zwraca[select] itp
$bd_c->close();
</strona>


odrazu moge napisać, że zapytania na obiekcie $bd jak i $bd_c są poprawne, gdyż wystarczy, że zostawię sam fragment kodu (czyli jedna funkcja łącząca z bazą na cały skrypt):
Kod
lacz_bd_c();
operacje na obiekcie $bd_c //teraz śmiga
$bd_c->close();

i wszystko działa jak powinno..
to samo gdy w komentarzach zacznę odwoływać się do obiektu $bd zamiast tworzyć nowe połączenie, wtedy również bez zastrzeżeń..

wniosek: błąd tkwi w tym, że drugie połączenie coś knoci i na obiekcie przez niego zwracanym nie działają żadne zapytania do bazy danych.. miał ktoś kiedyś podobny problem??

używam krasnala, włączyłem php5..
toel
Jeśli do łączenia się używasz również oddzielnego obiektu to po prostu przerób go na Singleton.
Ew. połączenie przekazuj jako parametr, żeby nie łączyć się 2 razy.
14lukas14
czyli chcesz powiedzieć, że nie można stworzyć dwóch lub więcej obiektów połączenia z mysql w jednym skrypcie.questionmark.gif
toel
szczerze mówiąc nigdy nie potrzebowałem więcej niż jednego połączenia, więc po prostu nie wiem smile.gif
erix
Możesz mieć tyle połączeń, ile wytrzymają zasoby i limity.

Pokaż lepiej kod tej lacz_db.
thek
Najprawdopodobniej połączenie jest wywoływane tylko raz i dostaje swój identyfikator, ale ponowne jego wywołanie nie rozumie, że chcesz mieć połączenie osobne i próbuje przypisać mu to pierwsze. Sprawdź zresztą co Ci daje var_dump dla $bd i $bd_c. Możliwe, że gdzieś wali błąd przez próbę odwołania z tymi samymi danymi lub zamknięciem zmiennej $bd. Zdebuguj te zmienne...
14lukas14
trochę to nieciekawe, bo zamierzałem zbudować stronę ładując do niej kilka komponentów.. z czego każdy miał mieć swoje połączenie, z użytkownikiem z pewnymi przywilejami na określone tabele;/

  1. <?php
  2. function db_lacz(/*$komputer, $uzyt, $haslo, $baza*/)
  3. {
  4. require_once('hasla/_pass_.php');
  5. @$db=new mysqli("$komp", "$user", "$haslo", "$baza");
  6. if(mysqli_connect_errno())
  7. {
  8. echo 'Błąd. Połączenie z bazą danych niemożliwe. Spróbuj póĽniej.';
  9. }
  10. return $db;
  11. }
  12. ?>



  1. <?php
  2. function db_lacz_c()
  3. {
  4. global $__db_user__;
  5. global $__db_password__;
  6. global $__db_name__;
  7. global $__db_host__;
  8. global $__db_table__;
  9.  
  10. @$db_c=new mysqli("$__db_host__", "$__db_user__", "$__db_password__", "$__db_name__");
  11. if(mysqli_connect_errno())
  12. {
  13. echo 'Błąd. Połączenie z bazą danych niemożliwe.
  14. Spróbuj póĽniej.';
  15. exit();
  16. }
  17. return $db_c;
  18. }
  19. ?>
thek
przecież da się tworzyć kilka połączeń w skrypcie. Problem tylko jest jeden z tym. Liczba userow mających jednocześnie do bazy maleje do ilość_maksymalnych_połączeń/ilość_połączeń_na_skrypt
Zadaj sobie pytanie: "Czy ma to sens?"
14lukas14
var_dump dla $db
Kod
object(mysqli)#1 (0) { }


var_dump dla $db_c
Kod
NULL


jakieś pomysły..questionmark.gif dlaczego daje nulla..questionmark.gif

co do Twojego pytania thek.. nie o to chodzi.. po prostu mój skrypt ma być później wykorzystywany przez innych.. a jego instalacja i użytkowanie ma być najprostsze jak się tylko da.. więc ustanowienie nowego połączenia, na konkretnym użytkowniku jest mi tu niezbędne..

EDIT:
naprawione.. okazało się że funkcja db_lacz_c() nie widzi tych globalnych zmiennych potrzebnych do zalogowania ;]
dzieki za pomoc..
LukenZi
Przy okazji tego tematu co by nowego nie zakladac - jaka jest praktyka tworzenia serwisow, ktore beda odwiedzane przez duza liczbe osob? Czy powinno sie polaczenie z baza zestawiac na poczatku np. index, na koncu rozlaczac, czy w kazdej funkcji gdzie jest kwerenda zestawiac polaczenie (czasami wiecej) i po jej wykonaniu rozlaczac ? I tak w skrypcie powiedzmy 5-10 razy na jedno wywolanie
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.