Obsługa MSSQL, SYBASE oraz ODBC

PiotrB

W internecie znalazłem sposób na zmuszenie PHP do pracy dodatkiem mssql (ang. "extension"). Włączenie dodatku to odkomentowanie linijki z plikiem php_mssql.dll w php.ini.

Instrukcje

  • Włącz rozszerzenie MSSQL, w pliku php.ini, odkomentuj linkijkę

extension=php_mssql.dll

* Przkopiuj plik: `php_mssql.dll` do głównego katalogu PHP, jeśli jeszcze go tam nie ma
* Plik: `ntwdblib.dll` przekopiować do katalogu, znajdującym się w `PATH` Twojego systemu operacyjnego.


```php
<?php
$conn = mssql_connect("10.0.10.11", "user", "password");
mssql_select_db("base", $conn);

$result = mssql_query('SELECT COUNT(*) FROM my_table;', $conn);
$row = mssql_fetch_array($result);
return $row[0]; // odczytaj wartość

Dodatkowe informacje

Gdy skrypt php jest uruchamiany na innym komputerze niż znajduje się serwer MS SQL trzeba na tym komputerze też zaintalować klienta MS SQL albo prościej dopisać do rejestru klucze:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ MSSQLServer\Client\ConnectTo]
a w tych kluczach wartość:
DSQUERY="DBNETLIB"
oczywiście biblioteka dbnetlib.dll też musi być w systemie. Ja nie musiałem jej dorzucać, bo już była w katalogu C:\Windows\System32\dbnetlib.dll

Oczywiście ze względu na szybkość wykonywania skryptu najlepiej gdy PHP i MS SQL działa na tym samym komputerze, ale gdy np. pracujemy w domu i chcemy przetestować coś można skorzystać z tej informacji. Znalazłem ją na stronie: http://pl2.php.net/manual/pl/function.mssql-connect.php

Później dostałem polecenie aby napisać skrypty w PHP dla Sybase-a.
Zrobiłem więc podobnie jak z mssql, usunąłem komentarz z linii, jak również dodałem bibliotekę do folderu z PATH swojego systemu operacyjnego.

extension=php_sybase_ct.dll

i krasnal przy uruchomieniu zaczął wyrzucać błędy, że funkcje są duplikowane (funkcje mssql ?!?). Po chwili dumania wywaliłem bibliotekę sybase-a i zacząłem łączyć się z nim przez odbc:

$link = odbc_connect('base', 'user', 'password') or die('uuuu cha, cha');
$result = odbc_exec($link, 'SELECT TOP 10 * FROM table_name');
$num_fields = odbc_num_fields($result);
$num_rows = odbc_num_rows($result);
if ($num_fields > 0)
{
  echo '<table border=1>';
  
  echo '<tr>';
  for ($i = 1; $i <= $num_fields; $i++)
  {
    echo '<td>'.odbc_field_name($result, $i).'</td>';
  }
  echo '</tr>';
  
  while ($row = odbc_fetch_array($result))
  {
    echo '<tr>';
    for ($i = 1; $i <= $num_fields; $i++)
    {
      $field_name = odbc_field_name($result, $i);
      $temp = $row[$field_name];
      if ($temp == '')
      {
        $temp = ' ';
      }
      echo '<td>'.$temp.'</td>';
    }
    echo '</tr>';
  }
  
  echo '</table>';

Jakie różnice pomiędzy odbc, a MySQL czy MsSQL?
Zamiast mssql_query() czy mysql_query() wywołuje się odbc_exec().
I druga ważna sprawa kolumny, czy pola numeruje sie od 1, a nie jak w MySQL, czy MsSQL od 0. Patrz linia:

for ($i = 1; $i <= $num_fields; $i++)

5 komentarzy

Poprawiłem formatowanie artykułu + redakcja.

Pokombinowałem i się udało ale musiałem parę subtelności pozmieniać :), nie wiem czemu ale pomogło pozbycie sie drugiego opcjonalnego parametru w funkcji mssql_select_db,
gdyby komuś nie działał powyższy skrypt dla MS SQL 2000 to poniżej jest przykład insert-a, który w końcu u mnie zadziałał. Pozdrawiam

<?php $conn = mssql_connect('SERVER', 'sa', 'haslo') or die('nie dało się połączyć'); $status =mssql_select_db('nazwa_bazy') or die('nie dało się wybrać bazy'); $query = "INSERT INTO wiadomosci VALUES('aaa','aaa')"; $r = mssql_query($query); mssql_close($conn); ?>

Mam pytanie do wersji dla MS SQL 2000,
łącze się z serverem ale nie z bazą, czy ktoś mógłby pomóc ???

$conn = mssql_connect('SERVER', 'login', 'haslo') or die('nie dało się połączyć');
mssql_select_db('CRM', $conn) or die('nie dało się wybrać bazy');

dzięki, teraz wiem gdzie błąd popełniłem :]

Oszczędziłeś mi czas potrzebny na szukanie tego, dzieki :)