T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
26th January

PHP – povezovanje na MSSQL bazo – Linux,Windows (odbc,mssql,iOdbc)

Na blogu sem že pisal o tem, da je Microsoft izdal novo knjižnico za PHP, ki zagotavlja veliko bolj stabilno/zanesljivo povezovanje in izvajanje operacij na MSSQL bazi s strani PHP jezika. Vendar pa omenjena knjižnica ne pride v poštev na Linux strežniku. Podobno težavo imajo lahko uporabniki na Windows strežnikih, kjer ne morejo namestiti dodatnih paketov, ki jih zahteva knjižnica. Zato si poglejmo kako se lahko preko odbc ter mssql povežemo na MSSQL brez zgoraj omenjene knjižnice - SQL Server 2005 knjižnice (SQLSRV extension).

Izbirate lahko med MSSQL knjižnico ali ODBC knjižnico. Pri Linuxu priporočam iODBC. Sliši se enostavno, dodamo MSSQL knjižnico ali ODBC, nato pa uporabimo mssql_connect oz. odbc_connect. Pri Windowsih mogoče že, pri Linuxu pa se zadeva zaplete. Po inštalaciji MSSQL knjižnice je PHP mssql_connect javil: Unable to connect to server. Kako, zakaj ... lahko podrobnejši opis napake? Nato smo poskusili še z iODBC, vendar spet brez uspeha. Kje se zatakne, zakaj ne deluje? Po uporabi Googla sem opazil, da so testirali ali sam modul deluje s pomočjo tsql-eja, primer ukaza v lupini:

CODE:
  1. tsql -H 127.0.0.1 -p 1433 -U roky -P roky

Ukaz je vrnil sledeč rezultat:
locale is "C"
locale charset is "US-ASCII"
Msg 20004, Level 9, State 0, Server OpenClient, Line 0
Read from SQL server failed.
Msg 20014, Level 9, State 0, Server OpenClient, Line 0
Login incorrect.
There was a problem connecting to the server

Nato sem po še nekaj branju uspel prebrati, da za SQL 2003 in SQL 2005 potrebujemo FreeTDS verzijo 8.0. Zato sem poskusil z naslednjim:

CODE:
  1. tsql -H 127.0.0.1 -p 1433 -U roky -P roky -I ./test.conf

test.conf vsebina:

CODE:
  1. [FREETS]
  2.        host=127.0.0.1
  3.        port=1433
  4.        tds version = 8.0

Z zgornjim ukazom smo se lahko uspešno povezali na strežnik, uporabili USE ime_baze in nato testni SQL. Korak naprej, modul deluje. Kako pa se povezati na MSSQL strežnik preko PHP-ja? Sledeča koda, ki DELUJE na Windowsih žal na Linux mašini NI DELOVALA:

PHP:
  1. $connection_string = 'DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=IME_BAZE';
  2. $user = 'roky';
  3. $pass = 'roky';
  4. $connection = odbc_connect($connection_string, $user, $pass);

Na linux strežniku odbc knjižnica vrne sledečo napako:

CODE:
  1. [iODBC][Driver Manager]Data source name not found and no default driver specified. Driver could not be loaded, SQL state IM002 in SQLConnect in

Poskusimo še z MSSQL ter FreeTDS knjižnicama, kjer bomo preko test.conf (ki smo ga tudi uporabili pri tsql) uporabili TDS Version 8.0:

PHP:
  1. putenv("FREETDSCONF=./test.conf");
  2. $connection = mssql_connect('FREETS', 'roky', 'roky');

Čudeno zadeva deluje, vendar nastopi težava s šumniki saj se knjižnica privzeto povezuje preko ISO-8859-1. Zadevo smo rešili tako, da smo pred mssql_connect dodali setlocale ukaz, za pretvorbo podatkov iz CP1250 v UTF8 pa smo uporabili iconv:

PHP:
  1. setlocale(LC_ALL, "");
  2. putenv("FREETDSCONF=./test.conf");
  3. $connection = mssql_connect('FREETS', 'roky', 'roky');
  4.  
  5. if ($connection !== false) {
  6.    mssql_select_db('IME_BAZE', $connection);
  7.    
  8.    $sql = "SELECT * FROM ime_tabele";
  9.    $result = mssql_query($sql, $conn);
  10.            
  11.    while( ($row = mssql_fetch_array($result, MSSQL_ASSOC)) ) {
  12.         foreach($row as $key => $field) {
  13.            $row[$key] = iconv('CP1250', 'UTF-8', $field);
  14.         }
  15.     $data[] = $row;
  16.   }
  17. }

V našem primeru je za inštalacijo na LINUX strežniku poskrbel Jan (pragma.si), dodatno pomoč pri povezovanju pa nudil Andrej Remškar, Creatim.

Vodiči, ki vam bodo pomagali pri inštalaciji ter razumevanju zakaj zadeva deluje oz. zakaj ne deluje:

Dodatni ODBC/MSSQL nasveti:

  • ODBC-ju morate pri SQL stavkih, ki bodo vrnili BLOB oz. velik rezultat, to povedati z ukazom odbc_longreadlen($rst, 1000000); s čimer povečamo največji limit polja
  • PHP MSSQL knjižnica VARCHAR polja daljša od 255 odreže pri 255, uporabite CAST v text za celotni rezultat
  • PHP ima za MSSQL knjižnico privzeto nastavitev za največjo dolžino polja okrog 4000, to lahko spremenite z ukazom mssql_query("SET TEXTSIZE 2147483647");

Ste kdaj uporabljali PHP in Linux kombinacijo za povezovanje do MSSQL baze? Kako ste zadevo rešili, imate kakšne nasvete? Na dan z vprašanji ali rešitvami.

Delodajalec: Creatim

Deli s skupnostjo:

  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Podobni članki:

  1. Povezava na MSSQL 2005 z uporabo PHP mssql knjižnice (MSSQL, PHP MSSQL, Windows, Apache)
  2. Povezava preko IIS-ja s PHP-jem na strežnik MSSQL 2005 z uporabo Windows Authentication načina (MSSQL, PHP SQLSRV, Windows, IIS)
  3. Internet explorer – več verzij hkrati – Linux – Mac – Windows
  4. Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
  5. WAMP – Windows – mail smtp strežnik – pošiljanje epošte
  6. PHP – namestitev SQL Server 2005 knjižnice (SQLSRV extension)
  7. HTML Mime Mail PHP – nastavljanje kodne tabele (charset – windows-1250 – UTF-8) – Outlook Express

1 komentar na “PHP – povezovanje na MSSQL bazo – Linux,Windows (odbc,mssql,iOdbc)”

  1. Povezava na MSSQL 2005 z uporabo PHP mssql knjižnice (MS SQL 2005, PHP MSSQL, Windows, Apache) | .: TRSplet - internetne storitve :. je napisal:

    [...] še vedno uporabljajo knjižnice (kot je naprimer MDB2), ki uporabljajo PHP mssql knjižnico. Na TRSplet blogu smo že pisali kako se povezati na MS SQL podatkovno bazo s pomočjo ODBC-ja oz. FR..., sedaj si poglejmo kako se povezati na MS SQL 2005 podatkovno bazo s pomočjo PHP-ja na Windows [...]

Dodaj komentar