Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql/php]Połączenia z kilkoma bazami jednocześnie
Forum PHP.pl > Forum > Bazy danych > MySQL
mruwek
Mój skrypt do wykonania potrzebuje danych z kilku baz. Schemat wygląda tak:

  1. <?php
  2. $link_A = mysql_connect('localhost', 'user_A', 'pass_A');
  3. $A = `jakiś fragment skryptu potrzebujący połączenia z bazą \"A\"`;
  4. mysql_close($link_A);
  5.  
  6. $link_B = = mysql_connect('localhost', 'user_B', 'pass_B');
  7. $B = `jakiś fragment skryptu potrzebujący połączenia z bazą \"B\"`;
  8. mysql_close($link_B);
  9.  
  10. $link_A = mysql_connect('localhost', 'user_A', 'pass_A');
  11. $A = `jakiś fragment skryptu potrzebujący ponownie połączenia z bazą \"A\"`;
  12. mysql_close($link_A);
  13. ?>


Moje pytanie brzmi czy nie można jakoś inaczej przełączać się między tymi bazami, niż za każdym razem zamykając i otwierając połączenie? Teoretycznie jeśli poda się te same argumenty dla "mysql_connect, to nie wywołuje on nowego połączenia, a tylko ponownie używa już wywołane. Czytałem jednak na php.net, że jeśli między 2 połączeniami o takich samych argumentach (czytaj - do tej samej bazy), znajdzie się połączenie o innych argumentach, to zostanie wywołane nowe połączenie zamiast wznowienia.

Sumując: W chwili obecnej (zgodnie z zaprezentowanym schematem) skrypt wywołuje 3 połączenia SQL (2 do bazy "A" i 1 do bazy "B"). Chciałbym zamiast tego wywoływać 2 połączenia. Jakieś pomysły??
lopik
A sprawdzałeś jak to jest, gdy podasz czwarty argument funkcji mysql_connect() ?

Ja tak jeszcze nie robiłem, więc nie wiem.
Kicok
A musisz zamykać połączenie za każdym razem, gdy zmieniasz bazę? Czemu nie możesz korzystać z 2 połączeń równolegle?

  1. <?php
  2.  
  3. $link_A = mysql_connect( 'localhost', 'user_A', 'pass_A' );
  4. mysql_select_db( 'baza_A', $link_A );
  5.  
  6. $link_B = mysql_connect( 'localhost', 'user_B', 'pass_B' );
  7. mysql_select_db( 'baza_B', $link_B );
  8.  
  9.  
  10.  
  11. // Zapytanie 1 (baza: baza_A)
  12. $result1 = mysql_query( 'SELECT * FROM tabela1', $link_A ) or die( mysql_error( $link_A ) );
  13.  
  14. // Zapytanie 2 (baza: baza_B)
  15. $result2 = mysql_query( 'SELECT * FROM tabela2', $link_B ) or die( mysql_error( $link_B ) );
  16.  
  17. // Zapytanie 3 (baza: baza_A)
  18. $result3 = mysql_query( 'SELECT * FROM tabela1', $link_A ) or die( mysql_error( $link_A ) );
  19.  
  20.  
  21.  
  22. mysql_close( $link_A );
  23. mysql_close( $link_B );
  24.  
  25. ?>
mruwek
Prawie działa.

Mówię prawie, bo nie działa mi ta opcja przy stosowaniu funkcji. Gdy w skrypcie jest jakieś zwykłe zapytanie, które odnosi się do bazy, to bez problemu wszystko działa. Gdy jest to jednak zapytanie tworzone w funkcji includowanej z innego pliku to nie wiedzieć czemu nie działa.

Przykład:
index.php (fragment)
  1. <?php
  2. $site_conn = mysql_connect('localhost', 'user_A', 'pass_A);
  3. if (!$site_conn) 
  4.  {
  5. echo "Nie udało się nawiązać połączenia z serwerem.";
  6. exit;
  7.  }
  8. mysql_select_db('baza_A, $site_conn);
  9.  
  10. require_once $include_path."/include/class_mysql.php";
  11. ?>


I oto w class_mysql.php znajdujemy coś takiego:
  1. <?php
  2. function query($query_string) {
  3. $this->result = mysql_query($query_string);
  4. $this->query_count++;
  5. if (!$this->result) {
  6. $this->sql_error("Query Error");
  7. }
  8. return $this->result;
  9. }
  10. ?>


Zmieniłem to oczywiście na:
  1. <?php
  2. function query($query_string) {
  3. $this->result = mysql_query($query_string, $site_conn);
  4. $this->query_count++;
  5. if (!$this->result) {
  6. $this->sql_error("Query Error");
  7. }
  8. return $this->result;
  9. }
  10. ?>


No i niestety nie działa. Wywala nic ciekawego - "Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in ..."

Jaka jest tego przyczyna?
mwojcik
Cytat(mruwek @ 27.08.2007, 01:14:40 ) *
Prawie działa.

Mówię prawie, bo nie działa mi ta opcja przy stosowaniu funkcji. Gdy w skrypcie jest jakieś zwykłe zapytanie, które odnosi się do bazy, to bez problemu wszystko działa. Gdy jest to jednak zapytanie tworzone w funkcji includowanej z innego pliku to nie wiedzieć czemu nie działa.

Przykład:
index.php (fragment)
  1. <?php
  2. $site_conn = mysql_connect('localhost', 'user_A', 'pass_A);
  3. if (!$site_conn) 
  4.  {
  5. echo "Nie udało się nawiązać połączenia z serwerem.";
  6. exit;
  7.  }
  8. mysql_select_db('baza_A, $site_conn);
  9.  
  10. require_once $include_path."/include/class_mysql.php";
  11. ?>


I oto w class_mysql.php znajdujemy coś takiego:
  1. <?php
  2. function query($query_string) {
  3. $this->result = mysql_query($query_string);
  4. $this->query_count++;
  5. if (!$this->result) {
  6. $this->sql_error("Query Error");
  7. }
  8. return $this->result;
  9. }
  10. ?>


Zmieniłem to oczywiście na:
  1. <?php
  2. function query($query_string) {
  3. $this->result = mysql_query($query_string, $site_conn);
  4. $this->query_count++;
  5. if (!$this->result) {
  6. $this->sql_error("Query Error");
  7. }
  8. return $this->result;
  9. }
  10. ?>


No i niestety nie działa. Wywala nic ciekawego - "Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in ..."

Jaka jest tego przyczyna?



Chyba zapomniales 2 argumentu dla funkcji :
  1. <?php
  2. function query($query_string, $site_conn) {
  3. $this->result = mysql_query($query_string, $site_conn);
  4. $this->query_count++;
  5. if (!$this->result) {
  6. $this->sql_error("Query Error");
  7. }
  8. return $this->result;
  9. }
  10. ?>
mruwek
Tak, masz rację. Prócz tego powinienem jeszcze zglobalizować $site_conn. Teraz już działa.
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.