Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP+MS SQL] Jak zrobić zapytanie do zlinkowanej bazy danych
Forum PHP.pl > Forum > PHP
emjot27
Mam taką sytuacje. Robię zaliczenie na studiach z rozproszonych baz danych. Muszę połączyć, ze sobą 2 serwery baz mySQL z jednym serwerem MS SQL. Po z linkowaniu w MS SQL Query Analizer w taki sposób:
  1. exec sp_addlinkedserver
  2. @server='mysql1',
  3. @srvproduct='MSDASQL',
  4. @provider='MSDASQL',
  5. @provstr='driver={MySQL ODBC 3.51 Driver};Server=stacja1;Port=3306;Database=zaliczenie;Uid=root;Pwd='

i podobnie z drugim serwerem. Jeżeli wykonam zapytanie w SQL Query Analizerze takie jak to:

  1. SELECT * FROM openquery(stacja1, 'select * from kontrahenci')

Wszystko jest ok, czyli połączenie działa a dane z zewnętrznej bazy pobiera prawidłowo. Teraz, jednak chciałbym zrobić coś takiego samego ale przy użyciu PHP. Zacząłem kombinować, i wymyśliłem coś takiego:

  1. <?php
  2.  $conn = mssql_connect("host", "user", "haslo")
  3.    or die('nie dało się połączyć');
  4.  
  5. $zapytanie= mssql_query("select * from openquery(stacja1, 'select * from kontrahenci')");
  6. $wyswietl = mssql_query($zapytanie, $conn);
  7. while($wiersz_sel = mssql_fetch_array($wyswietl))
  8. {
  9.    echo $wiersz_sel['nazwa'].'<br>';
  10. }
  11. ?>


Niestety dostaję błąd:

Warning: MS SQL message: Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query. (severity 16) in c:\phpdev\www\mssql.php on line 7

Czy ktoś ma pomysł, jak to zrobić?
deirathe
Ale chyba tutaj bazy nie wybrałeś, zaraz po polączeniu wykonujesz zapytanie
  1. <?php
  2. mssql_select_db("zaliczenie",$conn);
  3. ?>
emjot27
Hej, Dzięki za odpowiedź, ale to nie to. Nie mogę się tutaj łączyć z bazą zaliczenie, gdyż jest ona fizycznie na zewnętrznym serwerze mySQL a w MS SQLu jest jedynie link do niej(tzw. "Linked Servers"), dlatego gdy zrobię tak jak piszesz, zwróci mi komunikat:

Warning: MS SQL message: Could not locate entry in sysdatabases for database 'zaliczenie'. No entry found with that name. Make sure that the name is entered correctly. (severity 16) in c:\phpdev\www\mssql.php on line 4

Jakieś pomysły? ;>
deirathe
Troszkę poszperałem i:
http://support.microsoft.com/kb/296769/en-us

Niby to bug samej bazy mssql musisz włączyć, na ON NASI_NULLS, chociaż szczerze nigdy tym się nie zajmowałem, jeżeli to nie pomoże a znajdziesz rozwiązanie, to daj znać smile.gif
emjot27
Hej, też to znalazłem, ale nic to nie pomogło. Zrobiłem test, i wyszukałem dane z bazy która jest na tym serwerze w MS SQLu i udało się. Tak więc, połączenie z MS SQLem działa prawidłowo. Problem tkwi raczej w zapytaniu w momencie gdy chcę pobrać dane ze z linkowanej bazy. Jest może na to jakaś metoda?

EDIT:

No to wykombinowałem. Teraz działa wyśmienicie winksmiley.jpg

  1. <?php
  2.  $conn = mssql_connect("host", "user", "haslo")
  3.    or die('nie dało się połączyć');
  4.   mssql_select_db("master", $conn)
  5.    or die("nie dało się wybrać bazy");
  6. $zapytanie = mssql_query("set ansi_nulls ON") ;
  7. $zapytanie = mssql_query("set ANSI_warnings ON") ;
  8. $zapytanie = "select * from openquery(stacja1, 'select * from kontrahenci')";
  9. $wyswietl = mssql_query($zapytanie, $conn);
  10. while($wiersz_sel = mssql_fetch_array($wyswietl))
  11. {
  12.    echo $wiersz_sel['nazwa'].'<br>';
  13. }
  14. mssql_close($conn);
  15. ?>


Witam ponownie.
Kontynuując temat chciałem się zapytać, jaka jest składnia jeśli chcemy dodać nowy rekord w podlinkowanej w MSSQL baze mysql po przez PHP. W necie znalazłem coś takiego:

  1. INSERT INTO OPENQUERY(rftest1, 'SELECT field1, field2, fieldN FROM aqua.aqua.itin) SELECT field1, field2, fieldN FROM sqlTable WHERE ...continue WHERE


lub podobnie

  1. INSERT INTO db2..itin SELECT A.*
  2. FROM openquery(rftest1, 'select * from aqua.aqua.itin') AS A


No i nie bardzo rozumiem tą składnie ale domyślam się, że przy użyciu takiego zapytania to uzupełniam jakąś tabelę wg danych z innej tabeli. Mi natomiast chodzi o to, że chcę dodać konkretny rekord tak jak to robi się przy użyciu składni wykorzystywanej w MySQLu.
  1. <?php
  2. mysql_query("INSERT INTO example
  3. (name, age) VALUES('Sandy Smith', '21' ) ")
  4. ?>


Próbowałem zrobić podobnie jak w przypadku selecta do zlinkowanej bazy, ale nie działa:

  1. <?php
  2. INSERT INTO openquery(stacja1, 'INSERT INTO kontrahenci' (nazwa,miasto,ulica) VALUES ('Ania Frania','Warszawa','Dworcowa')";
  3. ?>


EDIT:
Ok znalazłem błąd trzeba było dodać * w zapytaniu i działa:

  1. <?php
  2. INSERT INTO openquery(stacja1, 'INSERT * INTO kontrahenci' (nazwa,miasto,ulica) VALUES ('Ania Frania','Warszawa','Dworcowa')";
  3. ?>

Pozdrawiam.
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.