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:
-
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:
-
tsql -H 127.0.0.1 -p 1433 -U roky -P roky -I ./test.conf
test.conf vsebina:
-
[FREETS]
-
host=127.0.0.1
-
port=1433
-
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:
-
$connection_string = 'DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=IME_BAZE';
-
$user = 'roky';
-
$pass = 'roky';
-
$connection = odbc_connect($connection_string, $user, $pass);
Na linux strežniku odbc knjižnica vrne sledečo napako:
-
[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:
-
$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:
-
$connection = mssql_connect('FREETS', 'roky', 'roky');
-
-
if ($connection !== false) {
-
mssql_select_db('IME_BAZE', $connection);
-
-
$sql = "SELECT * FROM ime_tabele";
-
$result = mssql_query($sql, $conn);
-
-
while( ($row = mssql_fetch_array($result, MSSQL_ASSOC)) ) {
-
foreach($row as $key => $field) {
-
}
-
$data[] = $row;
-
}
-
}
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:
- Inštalacija Free TDS knjižnice
- Primer inštalacije Free TDS ter registriranje tega driverja pri ODBC knjižnici
- Enako kot zgornji link, le da na Debian strežniku
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
Podobni članki:
- Povezava na MSSQL 2005 z uporabo PHP mssql knjižnice (MSSQL, PHP MSSQL, Windows, Apache)
- Povezava preko IIS-ja s PHP-jem na strežnik MSSQL 2005 z uporabo Windows Authentication načina (MSSQL, PHP SQLSRV, Windows, IIS)
- Internet explorer – več verzij hkrati – Linux – Mac – Windows
- Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
- WAMP – Windows – mail smtp strežnik – pošiljanje epošte
- PHP – namestitev SQL Server 2005 knjižnice (SQLSRV extension)
- HTML Mime Mail PHP – nastavljanje kodne tabele (charset – windows-1250 – UTF-8) – Outlook Express



June 17th, 2009 ob 2:27 pm
[...] š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 [...]