Nette 2.0 Database Connection + MS SQL 2008 (sqlsrv) → problémy
- mr.mac
- Člen | 87
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
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
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
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
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)