Error při přesunu na produkční server

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

Ahoj, je to mé první použití Nette a moc se mi nedaří přesunout vytvořenou aplikaci na server (PHP 5.2.17). Původně jsem použil Nette 2 alpha 2 pro PHP 5.3, ale to jsem neznal ještě konfiguraci serveru a tak jsem stahl Nette pro PHP 5.2 s prefixy, přepsal aplikaci otestoval na localu (zde mám verzi 5.2.6) a zkusil jí na produkčním serveru, kde se v logu objevula hláška:

PHP Fatal error: Uncaught exception DibiDriverException with message '' in /.../libs/dibi/drivers/mysql.php:110  @  http://.../sign/in?do=signInForm-submit

Prosím o radu, kde bych měl hledat chybu (už nevím kde a co hledat :( ), jestli opravdu někde u dibi nebo ve své aplikaci, ale na localhostu mi vše šlape tak jak má, tak mám podezření, jestli není chyba například ve špatné verzi PHP na serveru.

Díky za odpověd.

Jan Endel
Člen | 1016
+
0
-

Něco je v dibi konfiguraci špatně, pokud je v logu toto, měla by v té složce být i laděnka k tomuto erroru odpovídajíc, ta napoví víc.

ezop
Člen | 12
+
0
-

ano, našel jsem to, ale o moc moudřejší nejsem. Soubor vypadá takto.

jen opravím, že už jsem upgradoval na Nette 2 beta 1. A ještě jeden postřeh, na svůj local jsem si nahrál php 5.2.1 abych si ověřil, že to není hostingem a opravdu se mi na localu objevila stejná chyba.

Jan Endel
Člen | 1016
+
0
-

Vypadá to, že nemáš vůbec nakonfigurovanou databázi. Respektive máš nakonfigurovánu jen dev část. Hoď sem svůj config neon. Máš na hostingu vytvořenou databázi pro svoji aplikaci?

ezop
Člen | 12
+
0
-

config.neon:

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	services:

		model:
			class: Model
			arguments: [@database]
		connection:
			class = DibiConnection
			option: ['%database%']
		authenticator:
			class: Authenticator
			arguments: [@connection]

	nastaveni:
		strankovani:
			ukoly: 5

	database:
		driver: mysql
		host: localhost
		charset: utf8
		profiler: true

production < common:
	database:
		username: root
		password:
		database: msi

development < common:
	database:
		username: root
		password:
		database: msi

console < common:

ale stejnou chybu mi to hází i na localu pod php 5.2.1, na vyšší verzi to šlape, bohužel server na hostingu nemám možnost ovlivnit. Databázi samozřejmě vytvořenou mám.

Editoval ezop (22. 1. 2012 12:08)

Jan Endel
Člen | 1016
+
0
-

Hmm, nějak špatně se ti config.neon vyparsuje když tam zkusíš hodit:

production < common:
        database:
                username: root
                password:
                database: msi
		driver: mysql
                host: localhost
                charset: utf8
                profiler: true

tak se stane co?

ezop
Člen | 12
+
0
-

také mě to napadlo, to takto změnit, ale nenastane žádná změna

Jan Endel
Člen | 1016
+
0
-

Tak mě už jen napadá, jak vytváříš dibiconnection?

ezop
Člen | 12
+
0
-
...
// Load configuration from config.neon file
$configurator = new NConfigurator;
$configurator->container->params += $params;
$configurator->container->params['tempDir'] = dirname(__FILE__) . '/../temp';
$container = $configurator->loadConfig(dirname(__FILE__) . '/config.neon');
$configurator->container->getService('robotLoader'); // force RobotLoader to be registered

//databaze
dibi::connect( $container->params['database'] );
...
Jan Endel
Člen | 1016
+
0
-

Dump $container->params[‚database‘] ? evidentně hází něco špatného (podle laděnky vnořené pole do dalšího pole).

22
Člen | 1478
+
0
-

zkusil bych smazat cache

ezop
Člen | 12
+
0
-

tak v bootstrap.php se mi nepodařilo tuhle proměnnou odchytit, házé mi to pořád chybu (i když by se to mělo vyřešit kodováním bez BOM, tak to nepomáha):

session_start(): session_start(): Cannot send session cache limiter - headers already sent (output started at C:\Users\Jana\Downloads\xampp-win32-1.6.0a\xampp\htdocs\msib\libs\Nette\Diagnostics\Debugger.php:586)
ezop
Člen | 12
+
0
-

22 napsal(a):

zkusil bych smazat cache

tu mažu průběžně pořád

Jan Endel
Člen | 1016
+
0
-

zkus před ten dump

if ($container->session->exists()) {
	$container->session->start();
}

(Vypujčeno z aktuálního bootstrapu)

ezop
Člen | 12
+
0
-

pilec napsal(a):

zkus před ten dump

if ($container->session->exists()) {
	$container->session->start();
}

(Vypujčeno z aktuálního bootstrapu)

pomohlo to, dump $container->params[‚database‘] je zde:

array(7) {
   username => "root" (4)
   password => NULL
   database => "msi" (3)
   driver => "mysql" (5)
   host => "localhost" (9)
   charset => "utf8" (4)
   profiler => TRUE
}
Jan Endel
Člen | 1016
+
0
-

Ok, doposud sicko v rychtiku. Chtělo by to vědět, jakou přesnou verzi máš Dibi\Connection.

Tak mě napadlo, máš vůbec propojené mysql a php?

Editoval pilec (22. 1. 2012 14:46)

ezop
Člen | 12
+
0
-

používám Dibi 1.2 (revision 3b2ca19 released on 2009–09–18)

ezop
Člen | 12
+
0
-

pilec napsal(a):

Ok, doposud sicko v rychtiku. Chtělo by to vědět, jakou přesnou verzi máš Dibi\Connection.

Tak mě napadlo, máš vůbec propojené mysql a php?

používám Xampp pro windows, všechno by mělo být už nakonfigurované, ale jak jsem již psal, pokud nainstaluji novejší Xampp, samozřejmě s novější verzí php a mysql, tak vše šlape.

když záměrně zadám špatné přihlašovací údaje do databáze, tak se vypíše chyba v laděnce:

Access denied for user 'root'@'localhost' (using password: YES)

což podle mě naznačuje, že databáze je nějak připojena

ale tahle chyba se objevuje hned po spuštění, kdežto předtím, až při po odeslání přihlašovacího formuláře, tak jestli není chyba ještě v Athenticator.php:

class Authenticator extends NObject implements IAuthenticator
{
	/**
	 * Performs an authentication
	 * @param  array
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
    public function __construct() {

    }
    public function authenticate(array $credentials)
    {
            list($nick, $heslo) = $credentials;
            //$row = $this->users->where('username', $username)->fetch();
            $row = dibi::fetch('
                SELECT *
                FROM [uzivatele]
                WHERE [nick] = %s', $nick
            );

            if (!$row) {
                    throw new NAuthenticationException("Uživatel '$nick' nebyl nalezen.", self::IDENTITY_NOT_FOUND);
            }

            if ($row->heslo !== $this->calculateHash($heslo)) {
                UzivateleModel::IncrementBadLogin($row->iduzivatele);
                if ($row->neuspesne_prihlaseni > 5){
                    UzivateleModel::povolit($row->iduzivatele, false);
                }
                else
                    throw new NAuthenticationException("Neplatné heslo.", self::INVALID_CREDENTIAL);
            }

            if (!$row->povolen) {
                    throw new NAuthenticationException("Uživatel byl zablokován.", self::IDENTITY_NOT_FOUND);
            }

            UzivateleModel::ClearBadLogin($row->iduzivatele);
            unset($row->heslo);
            return new NIdentity($row->iduzivatele, $row->role, $row);
    }

Editoval ezop (22. 1. 2012 15:08)

Pavel Kouřil
Člen | 128
+
0
-

Zkus změnit tu option u dibi connection na následující :)

connection:
        class = DibiConnection
        option: %database%
ezop
Člen | 12
+
0
-

Pajka napsal(a):

Zkus změnit tu option u dibi connection na následující :)

connection:
        class = DibiConnection
        option: %database%

Díky (i ostatním za snahu pomoci), konečně to funguje :) ale pořád je pro mě záhada, proč to na jiné verzi serveru fungovalo…

22
Člen | 1478
+
0
-

a co tam dělá to rovnítko? Tam má být dvojtečka, ne?

Editoval 22 (22. 1. 2012 17:50)

ezop
Člen | 12
+
0
-

22 napsal(a):

a co tam dělá to rovnítko? Tam má být dvojtečka, ne?

mě zjevně fungují obě varianty

22
Člen | 1478
+
0
-

nevím, co to máš za verzi, misto option by mělo být arguments

Pavel Kouřil
Člen | 128
+
0
-

Nevím jak teď, ale dřív fungovaly AFAIK obě..

A jsi si jistý, že jsi tam to [''] nepřidal při snaze to opravit? :)

22
Člen | 1478
+
0
-

jen pro úplnost, jak to má zhruba vypadat v Nette 2 final:

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

//nebo
connection:
        class: DibiConnection(%database%)

Editoval 22 (22. 1. 2012 20:57)