Připojení na MSSQL databazi
- gavec
- Člen | 68
Zdravim, měl bych dotaz ohledně připojení k MSSQL databázi pomocí Nette a dibi. Byl bych rá za každou radu. U sebe na lokalu pouzivam wamp server, diky kteremu jsem se bez problemu pripojoval na mysql databazi. Nyni se vsak potřebuji připojit na vzdálenou mssql databázi.
U mysql jsem přihlašovací údaje zadával takto:
[production < common]
database.driver = mysql
database.database = localhost
database.charset = utf8
database.lazy = TRUE
database.host = host
database.username = user
database.password = pass
database.profiler = TRUE
[development < production]
database.profiler = TRUE
database.username = user
database.password = pass
U mssql jsem zkusil upravit drive a pridat extensiony v php.ini (php_mssql a php_pdo_mssql). Nyní mi to ale vyhazuje hlášku „PHP extension ‚mssql‘ is not loaded.“
Nema s tim nekdo prosim zkusenost?
Předem díky za každý tip.
Nette verze 0.9.7, PHP 5.2.
Editoval gavec (7. 11. 2011 20:50)
- Tharos
- Člen | 1030
Ahoj, klasická PHP extenze pro připojení k MS SQL serveru se již nevyvíjí a od PHP 5.3 již není ani nativní součástí distribuce. Vývoj podobné extenze plně přešel pod Microsoft a tohle je přesně to, co hledáš.
Je to trochu pracnější na instalaci, ale mně funguje dobře (potřeboval jsem tuto extenzi nedávno kvůli importu dat z jednoho MS SQL serveru). Používám ji sice v PHP 5.3, ale mám pocit, že ve staženém balíčku byla odpovídající .dll i pro PHP 5.2.
Zdá se, že vývoj klasické PHP extenze už vzal úplně za své…
Editoval Tharos (8. 11. 2011 14:40)
- gavec
- Člen | 68
Diky vyzkousim to. Pro php 5.2 jsou tam asi 4 rozsireni (php_sqlsrv52_nts_vc6.dll, php_pdo_sqlsrv52_nts_vc6.dll, php_sqlsrv52_ts_vc6.dll a php_pdo_sqlsrv52_ts_vc6.dll). Prvni 2 maji thread safe a pouzivaji se s php5.dll a dalsi 2 thread safe nemaji a pouzivaji se s php5ts.dll. Ktere mam teda hodit do slozky ‚ext‘ a pridat do php.ini?
- Tharos
- Člen | 1030
Použij PDO. Já jsem při odlazování spojení měl připraven testovací skript, který vypadal zhruba takhle:
<?php
$serverName = 'XPIE\SQLEXPRESS, 1433';
$database = 'database';
$uid = 'root';
$pwd = 'password';
try {
$conn = new PDO( "sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch( PDOException $e ) {
die('Error connecting to SQL Server: ' . $e->getMessage());
}
echo 'Connected to SQL Server';
Editoval Tharos (8. 11. 2011 18:52)
- Tharos
- Člen | 1030
Tak to jsem rád. Mělo by to jít použít i s dibi, protože mezi dibi drivery je i DibiPdoDriver. V konfigu pak pravděpodobně nebudeš mít rozepsané jednotlivé parametry připojení, ale celé dsn… To už určitě dáš snadno dohromady. :)
- gavec
- Člen | 68
Zkoušel jsem to přes to PDO, ale nefunguje. Nejsem si jisty, jestli to dělám správně.
[production < common]
database.driver = pdo
database.dsn = "sqlite::host:db"
database.charset = utf8
database.lazy = TRUE
database.username = user
database.password = pass
database.profiler = TRUE
Tohle DSN jsem někde vygooglil.. Nevim jestli ten sqlite je nejak dulozity. Mohl by prosím někdo poslat správný formát toho dsn? popřípadě se podívat, co mám špatně?
Nyní mi to vyhazuje tuhle chybu:
SQLSTATE[HY000] [14] unable to open database file
- gavec
- Člen | 68
Zkoušel jsem tedy zadat DSN v tomto formátu, ale vyhodilo mi to další chybovou hlášku:
SQLSTATE[08001]: [Microsoft][SQL Server Native Client 10.0]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].
Už si s tím nevím rady. Jen bych ještě dodal, že DB, na kterou se napojuju, je vzdálená. Napojím se na ni jen přes VPN.
- brabo
- Člen | 19
Od PHP 5.3 výše není již přímá podpora pro MSSQL, ale musí se použít externí driver od MS, viz http://cz2.php.net/…do-dblib.php
Nepřipojuje se pak k driveru mssql, ale sqlsrv. Konfigurace pak vypadá nějak takhle:
parameters:
database:
driver: sqlsrv
server: JMENO_POCITACE
instance: SQLEXPRESS
database: test
user: test
password: 1
database:
default:
dsn: '%database.driver%:server=%database.server%\%database.instance%;database=%database.database%'
user: %database.user%
password: %database.password%
Má to dva háčky.
- Nette nepodporuje driver pro SqlSrv. Zatím jsem to vyřešil tak, že jsem si udělal vlatní jako kopii MsSqlDriver z Nette distribuce.
- Po volání fetchAll() mi to úplně shodilo apache. Metodou pokus omyl jsem došel k tomu, že problém dělá následující řádka třídy Statement, kterou jsem zakomentoval a zatím se zdá OK.
$this->setFetchMode(PDO::FETCH_CLASS, 'Row', array($this));
- mr.mac
- Člen | 87
Tento problém jsem před časem taky řešil:
Používám MS SQL 2008R2 Express a PHP 5.3.8 a Dibi. Původní driver
mssql.php v dibi mi nechodil, neboť funkce driveru mssql jako např.
mssql_query() a podbné nejspíš již nejsou podporovány pro tuto veri SQL
DB.
Upravil jsem si tedy mssql.php dibi driver na sqlsrv.php driver (mohu ho
v případě zájmu poslat), který podporuje sqlrv_xxx() funkce PHP
5.3. Vcelku mi vše šlape až asi na nějaké drobnosti (např. teď ladím
metodu applyLimit – parametr offset (s vnořeným SELECTem a funkcí
ROW_NUMBER()).
Včera jsme rozchodili PHP na Windows Serveru 2003 s drivery
„php_sqlsrv53_ts_vc9.dll“ resp.
„php_pdo_sqlsrv53_ts_vc9.dll“ a vše chodí dobře, přesto, že
knihovna sqlsrv 3.0 má dle slov Microsoftu chodit až od Windows Serveru 2008.
Můj zápas s problémem hlášení chyb SQL dotazu si můžeš přečíst zde.
Editoval mr.mac (13. 3. 2012 8:00)
- Quinix
- Člen | 108
Pro dibi mimochodem driver s sqlsrv_* funkcemi existuje už v distribuci – https://api.dibiphp.com/…5Driver.html