poniedziałek, 12 maja 2008

Nóż w plecy ;) - godzimy PHP z MS SQL

Nie wiem co Wy o tym sądzicie, ale dla mnie jakoś tak PHP i MS SQL nie pasują do siebie ;p No nie wiem, nie wiem. Może to przez moją delikatną niechęć do Microsoftu? Może. A może coś w tym jest, bo jakby nie patrzeć pehapca faktycznie nie tak łatwo namówić do współpracy z bazami MS. I vice versa. Niby ma PHP te biblioteki do pogaduch z SQL Serverem, a jednak trzeba im pomóc się dogadać.

Na zajęciach w WSB, ponad miesiąc temu, gdy zaczynaliśmy kombinować w PHP z bazą danych (SQL Serverem 2005 właśnie) nadarzyła się okazja do połączenia obu technologii. Szczęśliwie nasz wykładowca już kiedyś bawił się w te klocki i teraz przekazał nam swoją tajemną wiedzę :) Wszyscy zassali EasyPHP i ruszyliśmy do boju. Więc, jak to było?

Konfiguracja PHP pod Windows XP

Najpierw musimy dobrać się do pliku php.ini. W tym celu przy uruchomionym serwerze, w okolicach zegara odszukujemy ikonę EasyPHP. Klikamy na niej prawym przyciskiem myszy, wybieramy Configuration, a następnie PHP.


Plik konfiguracyjny otwiera się w nowym oknie Notatnika. Odszukujemy linię:

;extension=php_mssql.dll

i usuwamy z jej początku średnik. Na koniec oczywiście musimy zapisać zmiany oraz uruchomić ponownie Apache'a (prawoklik na ikonie w trayu i Restart lub Stop, a po chwili Start :)). Po tym PHP powinno być gotowe do współpracy.

Konfiguracja PHP pod Fedorą 7

Pod Fedorą sprawa wygląda zgoła inaczej. Tutaj nie wystarczy odkomentować linii w pliku konfiguracyjnym, a trzeba wzbogacić system o niezbędne pakiety - FreeTDS oraz php-mssql. Na szczęście tak się składa, że roboty nie ma wiele. Logujemy się na roota i z pomocą starego dobrego yuma instalujemy co konieczne:

yum install freetds php-mssql

Po zakończonej instalce upewniamy się, że nowe rozszerzenie zostało pomyślnie dodane do PHP. Wklepujemy w konsoli:

ls -la /usr/lib/php/modules/

i szukamy na liście mssql.so. Jeśli go tam brakuje to mamy problem, ale jeśli się pojawiło to znaczy, że PHP jest gotowe i można ponownie uruchomić Apache'a :)

Konfiguracja SQL Servera 2005

Teraz czeka nas trochę klikania - jak to na Windowsie ;p Uruchamiamy SQL Server Surface Area Configuration i klikamy Surface Area Configuration for Services and Connections. W nowym oknie rozwijamy drzewko po lewej i zaznaczamy Remote Connections. Teraz po prawej zaznaczamy Local and remote connections, poniżej upewniamy się, że aktywna jest opcja pierwsza (Using TCP/IP only) lub ewentualnie trzecia i zatwierdzamy zmiany przyciskiem OK. Zostaniemy poinformowani o konieczności ponownego uruchomienia serwera w celu wprowadzenia zmian. Oczywiście dajemy OK, ale jeszcze nie restartujemy niczego.

Zamykamy wszystkie okienka, odpalamy SQL Server Management Studio i logujemy się. W oknie Object Explorer klikamy prawym przyciskiem myszy główną gałąź (tak, to ta z nazwą naszego hosta ;>), a następnie z menu kontekstowego wybieramy Properties. Otwiera się okno ustawień. Po lewej na liście Select a page zaznaczamy Security. Po prawej stronie widnieją teraz w czterech grupach ustawienia zabezpieczeń. W grupie Server authentication wybieramy SQL Server and Windows Authentication mode. Zatwierdzamy przez OK. Kolejny raz pojawi się komunikat dotyczący konieczności restartu. Wbijamy OK i lecimy dalej.

Wracamy do naszego drzewka. Rozwijamy teraz gałąź Security i klikamy prawym przyciskiem myszy na Logins. Z menu kontekstowego wybieramy New Login.... Przechodzimy do utworzenia nowego użytkownika dla PHP. Z sekcji Select a page wybieramy General. Po prawej podajemy nazwę usera, zaznaczamy opcję SQL Server authentication, ustalamy oraz potwierdzamy hasło dostępu i usuwamy zaznaczenie z checkboksa przy Enforce password policy. Przechodzimy do Server Roles (lewe menu). Na liście dostępnych ról zaznaczamy sysadmin i zatwierdzamy wszystko przez OK. Oczywiście można utworzyć i przypisać PHP osobną rolę, choćby ze względów bezpieczeństwa, jednak do zastosowań domowych przedstawiona konfiguracja powinna w zupełności wystarczyć.

Na koniec, wieńcząc nasze karkołomne zmagania z konfiguracją SQL Servera, uroczyście dokonujemy jego ponownego uruchomienia (eee... zrymowało się? ;p). Powtórnie popełniając prawoklik na najwyższej gałęzi drzewa Object Explorera wybieramy tym razem opcję Restart. Serwer zapyta jeszcze tylko czy aby na pewno chcemy mu to uczynić, na co odpowiemy soczystym Yessss.

I tak nie może być idealnie ;)

Mimo, że da się już w miarę normalnie korzystać z baz SQL Servera, PHP zwraca czasami podejrzane komunikaty typu:

Unicode data in Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier

Dotyczą one problemów z kodowaniem znaków w Unicode i najczęściej pojawiają się podczas wykonywania selectów z pól typu ntext w tradycyjny sposób:

mssql_connect('.', 'user', 'pass');
mssql_select_db('Northwind');

$q = mssql_query('select CategoryID, CategoryName, Description
from Categories');

while ($r = mssql_fetch_assoc($q)) {
echo $r['CategoryID'] . '. <strong>' . $r['CategoryName'] . '</strong> <em>' . $r['Description'] . '</em><br />';
}

mssql_close();

Rozwiązaniem może być tu np. wykorzystanie klasy COM zaproponowane w jednej z notek do manuala PHP:

$db = new COM('ADODB.Connection');
$dsn = 'DRIVER={SQL Server}; SERVER={localhost}; UID={user}; PWD={pass}; DATABASE={Northwind}';
$db->Open($dsn);
$rs = $db->Execute('select CategoryID, CategoryName, Description
from Categories');

while (!$rs->EOF) {
echo $rs->Fields['CategoryID'] . '. <strong>' . $rs->Fields['CategoryName'] . '</strong> <em>' . $rs->Fields['Description'] . '</em><br />';
$rs->MoveNext();
}


W kolejnym poście, jak wspomniałem ostatnio, wrócimy do grzebania przy domenach i zbratamy nasz adresik z wielkim Google oraz jego aplikacjami webowymi. Roboty z tym nie ma za wiele, jednak czasu też brak i pewnie nie uda mi się opublikować tekstu tak szybko jak teraz. Postaram się jednak żeby przerwa nie trwała zbyt długo. Pozdrawiam serdecznie i przypominam o ankiecie z lewej :)

Zauważyłeś błąd w artykule? Coś nie działa? Zostaw swoje uwagi w komentarzach.

3 komentarze:

Tomasz Ślązok pisze...

na niektorych systemach (my:)) trzeba zaktualizować dllke: NTWDBLIB.DLL zeby php sie moglo laczyc z mssql, jak dla mnie to krew mnie zalewa jak mysle o tej bazie danych.

co do blogu to nice dopracuj komentarze ;p
Ja tez mialem konto na bloggerze ale teraz bez WP nie widze zebym cos blogowal

Dawid Pająk pisze...

A co tu do dopracowywania? ;p Blogger to Blogger. Poza tym i tak pewnie będę jeszcze w tym roku migrował z tego całego shitu na własny silnik (o ile go skończę, a motywacja jest teraz silna >_<).

Dzięki za uwagi.

Anonimowy pisze...

Genialny tutorial! W końcu zadziałało, dzięki!