Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Jeden plik - dwie bazy
Forum PHP.pl > Forum > PHP
cezet
Mam następujący problem. Do dyspozycji mam 2 bazy danych na jednym serwerze, i potrzebuję uzyskać dostęp do danych z obu baz z poziomu jednego skryptu.

Ten temat był już poruszany w podobnym wątku. Tam problem został rozwiązany - u mnie nie działa.
Co robię źle?

Połączenie jest uzyskiwane w następujący sposób. Jeden includowany plik conn.php:

  1. <?php
  2. $$link = mysql_connect($server, $username, $password) or die(mysql_error());
  3.  
  4. if ($$link) mysql_select_db($database);
  5. ?>


Oraz drugi includowany plik conn2.php:

  1. <?php
  2. $$link1 = mysql_connect($cserver, $cusername, $cpassword) or die(mysql_error());
  3.  
  4. if ($$link1) mysql_select_db($cdatabase) or die(mysql_error());
  5. ?>


I używam metody z wcześniej wrzuconego wątku:
  1. SELECT baza.tabela.pole FROM baza.tabela


I niestety - nie działa... blinksmiley.gif

Wywala błąd:

SELECT command denied to user 'nazwa_uzytkownika_z_pierwszego_polaczenia'@'******.netart.pl' for table 'firmy'


Proszę, pomóżcie, naprawdę nie wiem jak sobie z tym poradzić... Z góry dzięki winksmiley.jpg
MMX3
powinno chodzić. ewentualnie możesz sobie połączyć dane wewnątrz php. Rozwiązanie powolne w działaniu ale zawsze jakieś rozwiązanie. Jest jeszcze jedna opcja. Zadzwonić do netart i zapytać konsultatna. Ale tylko jak ci zostało z 60 darmowych minut na telefonie.

Pozdro
cezet
Niestety, problem w tym, że nie mogę połączyć danych wewnątrz skryptu.. Jeśli już pobiorę dane z pierwszego połączenia - z pierwszej bazy, to wykrzacza się na próbie pobrania danych z drugiej bazy w tym samym skrypcie (dziwne, żeskrypt  próbuje użyć w drugim połączeniu danych logowania z pierwszej bazy - nie wiem czy za bardzo nie namieszałem). Może jakieś inne propozycje?? winksmiley.jpg
franki01
Serwery najczesciej nadaja ograniczenia uzytkownikom co do dostepu do baz danych. Nie mozna np. z poziomu zwyklego SQL'a tworzyc baz (trzeba korzystac z cPanelu, DirectAdmina). Takie same ograniczenia dotycza poslugiwania sie bazami danych. Nie wiem czy na tym serwerze sa tez takie ograniczenia, ale po bledzie pewnie tak. Jak chcesz sprawdzic czy dobrze dziala, to zainstaluj na localhost jakis serwer (np. AppServ) i wtedy zobacz czy skrypt dziala, bo user ma pelne prawa do baz.
ucho
Jak rozumiem chcesz być podłaczony do obu baz jednocześnie i wykonywać na nich operacje. Zgaduje - ze skoro przy mysql_select_db nie przekazujesz $link jako ostatniego parametru to i przy mysql_query o tym nie pamietasz - to skąd baza ma php ma wiedzieć do której bazy chcesz wysłać zapytanie? smile.gif
nevt
a pokaż może jak potem w kodzie php korzystasz z obu połaczeń? bo coś mi się wydaje, że nawiązujesz dwa połączenia, ale poźniej korzystasz tylko z jednego...
cezet
Szczerze mówiąc - fakt, nie pamiętam, bo nawet o tym nie słyszałem. Do tej pory pracowałem tylko na jednej bazie jednocześnie, i było wszystko ok. Co do użycia; oto zapytanie które ma pobrać dane z bazy pierwszej (gdy - teoretycznie nawiązane są połączenia z obiema bazami):

  1. <?php
  2. $qcfg1 = "SELECT $database.firmy.* from $database.firmy where firma_id = '$firma'";
  3. $rcfg1 = mysql_query($qcfg1) or die("BLAD 2");
  4. ?>


Ok. A w takim razie w jaki sposób przekazać parametr $$linkquestionmark.gif

Czy to będzie coś w rodzaju:

  1. <?php
  2. $rcfg1 = mysql_query($qcfg1, $$link) or die("BLAD 2");
  3. ?>


questionmark.gif
PawelC
Czemu masz $$link a nie $link??
nevt
$$link - dlatego że ten kod był przygotowany do wielokrotnego includowania, a kolega cezet niepotrzebnie go przerabiał, tego się używa mniej więcej tak:
  1. <?php
  2. $link = 'baza1';
  3. include('conn.php');
  4. $link = 'baza2';
  5. include('conn.php');
  6. $sql = 'SELECT * FROM tabela;';
  7. $result1 = mysql_query($sql, $baza1); //wykonuje zapytanie na pierwszej bazie
  8.  $result2 = mysql_query($sql, $baza2); //wykonuje zapytanie na drugiej bazie
  9. ?>

i tyle. powodzenia.
cezet
Ok. Potestowałem. W każdym miejscu, tam gdzie powinno być - wstawiłem wskaźnik połączenia $$link lub $$link1 w zależności od bazy - której dotyczy. Połączenie zostało nawiązane, jednak problem dalej jest.Po nawiązaniu połączenia z drugą bazą ($$link1) i próbie pobrania danych z bazy pierwszej (query, z parametrem $$link) wywala ten sam błąd. Tylko nie mam pojęcia czemu - mimo podania poprawnego wskaźnika połączenia - próbuje użyć danych logowania do bazy z połączenia $$link1.

Czyli konkretnie:
Po nawiązaniu połączenia $$link a następnie $$link1Pada:
  1. <?php
  2. $q1 = "SELECT $database.* FROM $database.firmy order by firma_id";
  3. $r1 = mysql_query($q1, $$link) or die(mysql_error());
  4. ?>


gdzie $database zawiera bazę z $$link. Według mnie - teoretycznie powinno być ok. Jednak wywala właśnie przy tym zapytaniu - błąd:

SELECT command denied to user 'uzytkownik_z_polaczenia_$$link1'@'acr93.rev.netart.pl' for table 'firmy'

Kurcze, już mi nerwy siadają, niby proste zadanie, a nie radzę sobie...
nevt
pokaż DOKŁADNIE JAK inicjujesz te bazy, jak ustawiasz wszystkie zmienne potrzebne do loginu i jak includujesz te pliki - gdzieś tam masz błąd - jak nie pokażesz tego kodu - nikt ci nie pomoże...
wklej tu kod który testujesz a nie jakieś przykładówki...
cezet
nevt juz jest ok. Nie przeczytałem Twojego poprzedniego postu, zanim puściłem swojego.

Poszedłem Twoim tokiem, i przyznam szczerze... Sam nie wiedzialem czemu jest $$link, do czego służy i jak się używa.

Ale rzeczywiście - jesteś genialny winksmiley.jpg Ku mojemu zaskoczeniu - ZADZIAŁAŁO JAK TRZEBA winksmiley.jpg))

Dzieki Ci wielkie, przede mną nowe perspektywy winksmiley.jpg)) Masz u mnie piwo biggrin.gif

Dzieki wszystkim za pomoc. Pozdrawiam smile.gif
rafaelpl
Cytat(nevt @ 20.12.2007, 23:33:03 ) *
$link - dlatego że ten kod był przygotowany do wielokrotnego includowania, a kolega cezet niepotrzebnie go przerabiał, tego się używa mniej więcej tak:
  1. <?php
  2. $link = 'baza1';
  3. include('conn.php');
  4. $link = 'baza2';
  5. include('conn.php');
  6. $sql = 'SELECT * FROM tabela;';
  7. $result1 = mysql_query($sql, $baza1); //wykonuje zapytanie na pierwszej bazie
  8. $result2 = mysql_query($sql, $baza2); //wykonuje zapytanie na drugiej bazie
  9. ?>

i tyle. powodzenia.


Przepraszam za odkopywanie starego tematu, ale nie chciałem zakładać nowego smile.gif

Mam takie pytanie w sprawie kodu nevta... Skierowane do niego, ale może ktoś inny go wyręczy.

Nie popełniłeś może w nim błędu? Gdy się na nim wzorowałem, skrypt nie chciał pobierać danych z bazy...

Dopiero po zmianie na:

  1. <?php
  2. include('conn.php');
  3. $baza1 = $link;
  4. include('conn.php');
  5. $baza2 = $link;
  6. $sql = 'SELECT * FROM tabela;';
  7. $result1 = mysql_query($sql, $baza1); //wykonuje zapytanie na pierwszej bazie
  8. $result2 = mysql_query($sql, $baza2); //wykonuje zapytanie na drugiej bazie
  9. ?>


...wszystko działało prawidłowo.

Chciałbym wiedzieć, czy mój tok rozumowanie jest poprawny, ponieważ mogę coś robić nie tak, a nie chcę mieć dziurawego kodu smile.gif
nevt
przedstawiona przeze mnie wersja działa, jeżeli nawiązanie połączenia wygląda tak jak w pierwszym poście, czyli przy użyciu podwójnego $$:
  1. <?php
  2. $$link = mysql_connect($server, $username, $password) or die(mysql_error());
  3. ?>

natomiast wersja z poprzedniego postu będzie działać jeżeli użyjesz normalnego podstawienia do zmiennej $link (z pojedynczym $):
  1. <?php
  2. $link = mysql_connect($server, $username, $password) or die(mysql_error());
  3. ?>

poczytaj w manualu o konstrukcji zmienne zmienne i zrozumiesz na czym to polega...
rafaelpl
Wielkie dzięki, nie miałem pojęcia, że coś takiego istnieje smile.gif
Właśnie się zastanawiałem do czego służą te podwójne $$, ale nie wiedziałem co wpisać w manualu, żeby dokopać się do takich informacji.
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.