Připojení na MSSQL databazi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
gavec
Člen | 68
+
0
-

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)

JuniorJR
Člen | 181
+
0
-

A zkoušel jsi už restartovat Apache? Případně zkus kouknout sem

gavec
Člen | 68
+
0
-

Restart jsem zkousel, v extensionech jsem ale nenasel knihovnu php_mssql.dll, přičemž v nabídce wampu toto rozsiresni je. Je tam jen php_pdo_mssql.dll. Tak nevim, jestli je mozne tu knihovnu php_mssql.dll nekde stahnout.

Tharos
Člen | 1030
+
0
-

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
+
0
-

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
+
0
-

Tohle záleží čistě na tom, jaké sestavení PHP používáš. Vše potřebné najdeš ve výstupu phpinfo(). Odpověď na VC6 versus VC9 najdeš snad hned na třetím řádku výstupu (Compiler) a TS versus NTS hledej podle Thread Safety.

V nouzi experimentuj. :)

gavec
Člen | 68
+
0
-

Dobře. Jak to prosím tě pak testnu? Stačí mssql_connect, jestli se to přikonektí? pač mi to teď háže Call to undefined function mssql_connect().

Tharos
Člen | 1030
+
0
-

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)

gavec
Člen | 68
+
0
-

Tak vypada to, ze to podle toho tveho skriptu jede. Problem byl v tom, ze jsem mel nainstalovany 64bitovy WAMP. Slo by to nejak zprovoznit i pres dibi?

Tharos
Člen | 1030
+
0
-

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
+
0
-

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
+
0
-

Tak už jsem to asi našel… DSN by mělo být údajně v tomto formátu:

„sqlsrv:Server=localhost;Database=testdb“, „UserName“, „Password“

Až se k tomu dostanu, otestuju.

gavec
Člen | 68
+
0
-

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
+
0
-

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.

  1. 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.
  2. 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
+
0
-

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
+
0
-

Pro dibi mimochodem driver s sqlsrv_* funkcemi existuje už v distribuci – https://api.dibiphp.com/…5Driver.html