Problém připojení do špatné DB
- johnny13
- Člen | 17
Ahoj, mám následující situaci:
Zavolám URL z prohlížeče s parametrem ‚hash‘, což je parametr
rozlišující, ke kterému zákazníkovi (databázi) se má aplikace připojit.
V bootstrapu se nejprve vytvoří DI container, poté na základě containeru
se vytvoří DB spojení do databáze, ve které se získá host, port atd. dle
hashe. Dále na základě těchto získaných údajů vytvořím DB spojení do
zákazníkovi databáze a přidám jako službu do containeru a dále ji
v modelu využívám. V NEONU mám nakonfigurovanou výchozí databázi,
která se používá v případě neaktivního spojení do zákazníkovi DB.
Pokud z prohlížeče vyplním přihlašovací údaje (email, heslo), tak je
vše v pořádku, aplikaci se připojí ke správné DB a nadále se s tímto
připojením pracuje.
Problém nastává ve chvíli, kdy přihlašovací formulář odešlu pomocí
POSTMANA jako POST požadavek. Všechno se tváří stejně až do chvíle,
když se má zjišťovat, zda daný uživatel existuje v DB. Problém tkví
v tom, že místo toho, aby se použilo spojení do zákazníkovi databáze
vytvářené v bootstrap.php, se použije spojení do výchozí databáze
definované v neonu a tedy daný uživatel není dohledán.
V čem by mohl prosím být rozdíl přístupu přes prohlížeč oproti přístupu odeslání formuláře přes POSTMANA? Používám Nette 2.3.8, PHP 5.5, DB PostrgreSQL. Žádná chyba není hlášena. Pro práci s DB používám Nette\Database.
Děkuji.
bootstrap.php
<?php
/**
* Vrátí spojení do databáze, která obsahuje připojovací údaje k zákazníkům
*
* @return \Nette\Database\Context
*/
function getDatabaseConnection() {
$conn = new Nette\Database\Connection("pgsql:dbname=zakaznici;host=host123;port=10500;user=userxyz;password=hesloxyz;");
$cacheStorage = new \Nette\Caching\Storages\FileStorage(__DIR__ . '/../temp');
$structure = new \Nette\Database\Structure($conn, $cacheStorage);
return new Nette\Database\Context($conn, $structure);
}
require __DIR__ . '/../vendor/autoload.php';
$configurator = new Nette\Configurator;
$configurator->setDebugMode(true);
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()->addDirectory(APP_DIR)->addDirectory(LIBS_DIR)->register();
$configurator->addConfig(__DIR__ . '/config/config.neon', Nette\Configurator::AUTO);
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
$container = $configurator->createContainer();
// v případě existujícího parametru hashe (tzn. uživatel se chce přihlásit) se získají přístupové údaje do zákazníkovy DB
if (isset($_GET["hash"])) {
$db = getDatabaseConnection();
$result = $db->query("SELECT ip, port FROM zakaznici WHERE hash = ?", $_GET["hash"])->fetch();
$newTargetSchool = $container->getService("session")->getSection("targetSchool");
$newTargetSchool["hash"] = $_GET["hash"];
$newTargetSchool["ip"] = $result["ip"];
$newTargetSchool["port"] = $result["port"];
}
// ze session se získají přístupové údaje k databázi zákazníka
$targetSchool = $container->getService("session")->getSection("targetSchool");
if ($targetSchool["hash"] == null) {
$hash = $targetSchool["hash"];
$db = getDatabaseConnection();
$result = $db->query("SELECT ip, port FROM zakaznici WHERE hash = ?", $hash)->fetch();
if ($result) {
$targetSchool["ip"] = $result->ip;
$targetSchool["port"] = $result->port;
$targetSchool["hash"] = $hash;
}
}
$conn = new Nette\Database\Connection("pgsql:host=" . $targetSchool["ip"] . ";port=" . $targetSchool["port"] . ";dbname=zakaznikovadb", "myusername", "najakeheslo");
$cacheStorage = new \Nette\Caching\Storages\FileStorage(__DIR__ . '/../temp/cache');
$structure = new \Nette\Database\Structure($conn, $cacheStorage);
$db = new Nette\Database\Context($conn, $structure);
$container->addService("nette.database.default", $db);
$container->application->run();
?>
config.neon
common:
parameters:
# is used, when connection setting in bootstrap is not active
database:
host: 111.111.111.111
dbname: mydbname
user: myusername
password: mypassword
php:
date.timezone: Europe/Prague
nette:
session:
autoStart: true
expiration: "+ 7 days"
savePath: "%tempDir%/sessions"
database:
default:
dsn: 'pgsql:host=%database.host%;dbname=%database.dbname%'
user: %database.user%
password: %database.password%
options:
lazy: true
svn:
dsn: "pgsql:dbname=zakaznici;host=host123;port=10500;"
user: userxyz
password: hesloxyz
options:
lazy: true
container:
debugger: true
accessors: TRUE
latte:
xhtml: no
services:
- Api(@database.svn.context)
userManager: \Model\Permission\UserManager
authenticator:
class: \Model\Authenticators\MultiAuthenticator
setup:
- addAuthenticator("db", \Authenticator())
- addAuthenticator("google", \Model\Authenticators\GoogleAuthenticator(@session, @userManager, @googleClient, false))
- addAuthenticator("facebook", \Model\Authenticators\FacebookAuthenticator(@session, @userManager, @\Kdyby\Facebook\Facebook, false))
authorizator:
class: Authorizator
studentInfo:
class: StudentInfo(@container)
teacherInfo:
class: TeacherInfo(@container)
schoolService:
class: SchoolService(@container)
versionService:
class: VersionService(@container)
production < common:
development < common:
Abtraktní třída Service.php, jež dědí repozitáře pracující s databází přes proměnnou $database
<?php
/**
* Class Service
*/
abstract class Service extends Nette\Object {
/** @var Nette\DI\Container */
protected $context;
/** @var \Nette\Database\Context */
protected $database;
/**
* Create model class
*/
public function __construct(\Nette\DI\Container $context) {
$this->context = $context;
$this->database = $this->getService('nette.database.default');
}
/**
* Return service by name.
*
* @param string $name Name of the service
* @return mixed Service
*/
protected function getService($name) {
return $this->context->getService($name);
}
}
?>
- nightfish
- Člen | 518
johnny13 napsal(a):
Problém nastává ve chvíli, kdy přihlašovací formulář odešlu pomocí POSTMANA jako POST požadavek.
if (isset($_GET[„hash“])) {
Úplně detailně jsem to nestudoval, ale není problém v tom, že
POST požadavek neprojde přes GET podmínku
if (isset($_GET["hash"])) {
?