Nette 2.0 Database Connection + MS SQL 2008 (sqlsrv) → problémy

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

Zdravím. Jsem začátečník v Nette (troufám si říci, že ne v PHP a MSSQL), používám databázi MSSQL 2008 R2 (express), tedy pro Nette 2.0 Database Connection driver MsSqlDriver.php (asi pracuje s driverem php_pdo_sqlsrv_xxx.dll (ver. 2) v php) a Apache 2.2.21 + PHP 5.3.8 (IIS7 jsem vzdal – fakt to nešlo rozchodit – 2 dny v háji). Abych začal „prakticky od nuly“ vyšel jsem z demo aplikace CD-Collection a „jen“ jsem chtěl změnit DB za MSSQL. Myslím si, že jsem confog.neon jakžtakž odladil takto (tedy alespoň jsem se nakonec připojil):

common:
	php:
		date.timezone: Europe/Prague

	services:
		robotLoader:
			run: true

		database:
			class: Nette\Database\Connection
			arguments: ['sqlsrv:Server=.\SQLEXPRESS;Database=db', 'usr', 'pwd']
			charset: UTF8

		model:
			class: Model
			arguments: [@database]

		authenticator:
			factory: [@model, createAuthenticatorService]


production < common:

development < common:

Bohužel potom jsem ale už skončil, debugger mi hlásí tuto chybu:

Fatal Error

Call to a member function delimite() on a non-object search►
Source file ▼

File: ...\libs\Nette\Database\Table\Selection.php   Line: 104

 97:         * @param
 98:         */
 99:        public function __construct($table, Nette\Database\Connection $connection)
100:        {
101:            $this->name = $table;
102:            $this->connection = $connection;
103:            $this->primary = $this->getPrimary($table);
104:            $this->delimitedName = $connection->getSupplementalDriver()->delimite($this->name);
105:            $this->delimitedPrimary = $connection->getSupplementalDriver()->delimite($this->primary);
106:        }
107:

Mám zato, že třída Database Connection není pro MSSQL jaksi doladěná a rozhodně bych se v ní nechtěl šťourat – až sem to opravdu trvalo dost dlouho, teď už mi opravdu došly síly. Chci se tedy zeptat – do jaké míry je MsSqlDriver.php použitelný a kde si jsou autoři vědomi, že selhává – má cenu pokračovat touto cestou, nebo se pokusit se prokousávat přes Dibi, neřku-li vrátit se k Nette 0.9 – tam mi to jakž takž chodí. Můj projekt je dosti rozsáhlý a chtěl jsem nové finesy v Nette 2.0 využít. Už týden přešlapuji jakou platformu tedy zvolit (bohužel Nette a MSSQL 2008 – mám jaksi nařízeno „shora“).
Děkuji za radu či nasměrování.

Editoval mr.mac (2. 10. 2011 17:27)

Jan Endel
Člen | 1016
+
0
-

Není problém dibi v Nette 2 používat, zde je nastíněno ukázkové řešení tohoto problému. Navíc pokud jsi na dibi už zvyklý odjinud, řekl bych, že je to i lepší volba než Nette\Database ale to je můj soukromý názor.

mr.mac
Člen | 87
+
0
-

pilec napsal(a) …

Díky za rychlou reakci – myslíš si tedy, že Dibi bude větší jistota. Zde jsem si předtím (pod Nette 0.9) udělal vlastní driver sqlsrv.php, neboť stávající mssql.php nechodí s MSSQL 2008 + PHP 5.3 (využívá mssql.dll, který pro PHP 5.3 už není k mání, jen sqlsrv). Nejsem si 100% jistý, zda je zcela funkční, zatím chodí jednoduché SQL dotazy. Mám totiž zato, že v Nette 0.9 se nepracuje s PDO drivery – nejsem si tím 100% jistý, kdežto v Nette 2.0 ano a to by mohl být do budoucna problém. Nicméně asi to zkusím s Dibi – je to škoda – s třídou Database jsem očekával, že to bude více hotové a dobudoucna s Nette 2.0 více „srostlé“.
Jinak díky, moc za názor, pokud má někdo nějaký další – budu jen moc rád.

Tomas Jancik
Člen | 103
+
0
-

mr.mac wrote:

s třídou Database jsem očekával, že to bude více hotové a dobudoucna s Nette 2.0 více „srostlé“.

musis taky brat ohled na to, ze Nette 2.0 je porad jeste beta

mr.mac
Člen | 87
+
0
-

Akceptuji to – jsem tu nováček, takže jsem si myslel, že podpora MSSQL bude trochu dál. Nedá se nic dělat, vracím se k Dibi a mému driveru sqlsrv.

mr.mac
Člen | 87
+
0
-

Bohužel ani s Dibi + Nette 2.0 se mi nedaří. Nemá někdo zkušenost s MS SQL 2008 a Dibi + Nette 2.0. Rád bych viděl nějaký vzorový config.neon, bootsrap.php a Model.php. Díky za radu.

Můj config.neon je:

common:
	php:
		date.timezone: Europe/Prague
	database:
		driver: sqlsrv
		host: .\SQLEXPRESS
		username: usr
		database: pwd
		password: db
		charset: utf-8

	services:
		robotLoader:
			run: true

		model:
			class: Model
			#arguments: [@database]

		database:
			class: DibiConnection
			arguments: [%database%]

		authenticator:
			factory: [@model, createAuthenticatorService]


production < common:

development < common:

Bootstrap:

<?php

use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\RouteList,
	Nette\Application\Routers\SimpleRouter;


// Load Nette Framework
require __DIR__ . '/../libs/Nette/loader.php';
// Load Dibi library
require __DIR__ . '/../libs/Dibi/Dibi.php';


// Enable Nette Debugger for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::$logDirectory = __DIR__ . '/../log';
Debugger::enable();


// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->container->params += $params;
$configurator->container->params['tempDir'] = __DIR__ . '/../temp';
$container = $configurator->loadConfig(__DIR__ . '/config.neon');

// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
	$container->router = new RouteList;
	$container->router[] = new Route('index.php', 'Dashboard:default', Route::ONE_WAY);
	$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Dashboard:default');

} else {
	$container->router = new SimpleRouter('Dashboard:default');
}

//Pripojeni k DB - nefunkční - co použít místo třídy Environment z v. 0.9?
//$container->application->onStartup[] = 'Model::initialize';

// Run the application!
$container->application->run();
?>

Model.php:

<?php

use Nette\Object;

class Model extends DibiRow // DibiRow obstará korektní načtení dat
{

	private $table = 'staty';

	private $connection;

/* v Nette 0.9 - čím to nahradit?
	public static function initialize()
	{
		dibi::connect(Environment::getConfig('database'));
	}
*/
        public function __construct($arr = array())
       {
           parent::__construct($arr);
	   this->connection = dibi::getConnection();
       }

	public function show()
	{
		return $this->connection->select('*')->from($this->table);
	}
}
?>

Potřeboval bych tedy jak implementovat připojení k DB – raději bych ho měl v konstruktoru Modelu, nebo jak ho implementovat v bootstrapu?

Díky ještě jednou.

Editoval mr.mac (4. 10. 2011 8:37)