Programowanie w języku PHP » FAQ

Obsługa MSSQL, SYBASE oraz ODBC na Krasnalu

Jak większość programujących w PHP znam również MySQL-a. Zatrudniony zostałem jednak w firmie, która ma Microsoft SQL oraz Sybase (jakby nie mogli się zdecydować na jeden serwer ;-)
Okazało się, że PHP (mam Krasnala), który od razu pracuje z MySQL nie chce pracować z tamtymi serwerami. W internecie znalazłem sposób na zmuszenie PHP do pracy z biblioteką php_mssql.dll. Oto ten sposób:
1. Odkomentować linię:
extension=php_mssql.dll
zrobiłem to :-)
2. Przkopiować plik: php_mssql.dll do głównego katalogu php
nie musiałem tego robić, bo już tam był ;-)
3. Plik: ntwdblib.dll przekopiować do katalogu:
c:\windows\system32   (XP)
c:\windows\system    (9x,2000)
Ja przekopiowałem do katalogu:
c:\WINNT\system\
bo mam 2000, ktoś tak nazwał katalog WINDOWS ;-)
No i zabrałem się za pisanie kodu w php. Oto moja biblioteka:
<?php
  error_reporting(0);
  $conn = mssql_connect("10.0.10.11", "user", "password")
    or die('nie dało się połączyć');
  mssql_select_db("base", $conn)
    or die("nie dało się wybrać bazy");
  function query($query)
  {
    global $conn;
//    echo nl2br($query)."<br />";
    return mssql_query($query, $conn);
  }
  function num_rows($table_name)
  {
    $result = query('SELECT COUNT(*) FROM '.$table_name);
    $row = mssql_fetch_array($result);
    return $row[0];
  }
?>

Dołączenie powyższej biblioteki poprzez:
include('mssql.php');
Funkcja query przekazuje zapytanie i zwraca rezultat tego zapytania. Jeżeli coś nie działa, to usuwam komentarze przy echo i widzę czy w zapytaniu nie ma jakiegoś błędu.
A ponieważ baza tu jest ogromna postanowiłem napisać jeszcze funkcję, która zwraca ilość rekordów w bazie. Robi to funkcja:
function num_rows($table_name)
Funkcja działa poprawnie, choć do niczego mi się nie przydała ;-)

Dopisek (2005-03-02):
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:
extension=php_sybase_ct.dll
samą bibliotekę przegrałem do windows/system
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 = '&nbsp;';
      }
      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++)

4 komentarze

break 2007-04-22 21:07

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);
?>

break 2007-04-22 19:58

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');

angel2953 2005-01-12 22:31

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

Mabakay 2005-01-12 15:27

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