PDOException #1045 SQLSTATE[28000] [1045]…

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

Zdravím,
Som už na konci síl nedokážem sa nijak pripojiť na DB vždy mi vyhodí chybu:

**PDOException #1045**
**SQLSTATE[28000] [1045] Access denied for user 'vp_username'@'10.10.29.10' (using password: YES)**

Viem, že sa to už riešilo ale ani to mi nepomohlo

Toto je môj config.neon schválne som vytvoril prihlasovacie údaje do db s heslom 123456 ale nijak nepomohlo.
Porovnával som všetky moje súbory so súbormy v sandboxe všetko je ako má už fakt neviem kde robím chybu.

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
	parameters:

	php:
		date.timezone: Europe/Prague
		# zlib.output_compression: yes

	nette:
		application:
			errorPresenter: Error

		database:
			dsn: 'mysql:host=localhost;dbname=vp_dbname'
			user: 'vp_username'
			password: '123456'

		session:
			expiration: 30 days


	services:
		authenticator: Authenticator
		routerFactory: RouterFactory
		router: @routerFactory::createRouter


	factories:


production < common:

development < common:

Môj Authenticator

<?php
use Nette\Security as NS,
    Nette\Utils\Strings;
/**
 * Select DB
 * Check connect
 */
class Authenticator extends Nette\Object implements NS\IAuthenticator
{
	/** @var Nette\Database\Connection */
	private $database;
	/**
	 * Construct Function DB Connect
	 * @return Nette\Database\Connection
	 */
	function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}
	/**
	 * Performs an authentication.
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = $this->database->table('users')->where('username', $username)->fetch();
		if(!$row)
		{
			throw new NS\AuthenticationException("Užívateľ '$username' nejnájdený", self::IDENTITY_NOT_FOUND);
		}
		if($row->password !== $this->calculateHash($password, $row->password))
		{
			throw new NS\AuthenticationException('Neplatné heslo', self::INVALID_CREDENTIAL);
		}
		unset($row->password);
		return new NS\Identity($row->id, NULL, $row->toArray());
	}
	/**
	 * Computes salted password hash.
	 * @param  string
	 * @return string
	 */
	public static function calculateHash($password, $salt = NULL)
	{
		if ($password === Strings::upper($password)) { // perhaps caps lock is on
			$password = Strings::lower($password);
		}
		return crypt($password, $salt ?: '$2a$07$' . Strings::random(22));
	}
}

A ešte moj AuthPresenter nie je síce dokončený pre registráciu ale prihlasovanie by malo fungovať

<?php
use Nette\Application\UI\Form,
    Nette\Utils\Html;
/**
 * Display Login & LogOut Form
 * @return Nette\Application\UI\Form
 */
class AuthPresenter extends BasePresenter
{
	/**
	 * Create a Form
	 * Display form in Template
	 */
	protected function createComponentLoginInForm()
	{
		$form = new Form;
		$form->addText('username', 'Prezývka:')
		     ->setRequired('Musíte zadať prezývku!', Form::FILLED);
		$form->addPassword('password', 'Heslo:')
		     ->setRequired('Musíte zadať heslo!', Form::FILLED);
		$form->addCheckBox('remember', 'Zapamätať si ma');
		$form->addSubmit('login', 'Prihlásiť');

		$form->onSuccess[] = $this->loginInFormSubmitted;
		return $form;
	}
	/**
	 * Check is User Success Login
	 * if is Success Login @return loginInFormSubmitted
	 */

	public function loginInFormSubmitted(Form $form)
	{
		try {
        $user = $this->getUser();
        $values = $form->getValues();
        if ($values->remember)
        {
            $user->setExpiration('+30 days', FALSE);
        }
        $user->login($values->username, $values->password);
        $this->flashMessage('Přihlášení bylo úspěšné.', 'success');
        $this->redirect('Homepage:');
    } catch (Nette\Security\AuthenticationException $e) {
        $form->addError('Neplatné uživatelské jméno nebo heslo.');
    }
	}
	/** Out Form */
	public function handleLogOut()
	{
		$this->getUser()->logout();
		$this->redirect('Index:index');
	}
	/**
	 * Create Register Form
	 * Display form in Template
	 */
	protected function createComponentRegisterInForm()
	{
		$form = new Form;
		$form->addText('username', 'Prezývka:')
		     ->setRequired('Musíte zadať prezývku!');
		$form->addPassword('password', 'Heslo:')
		     ->setRequired('Musíte zadať heslo!');
		$form->addText('email', 'Email:')
		     ->setRequired('Musíte zadať emailovú adresu')
		     ->addRule(Form::EMAIL, 'Nesprávne zadaná emailová adresa');
		$gen = array('m' => 'Muž', 'f' => 'Žena');
		$form->addRadioList('gander', 'Pohlavie:', $gen);
		$countries = array(
			'Europe' => array(
                'SK' => 'Slovensko',
                'CZ' => 'Česko',
                'HU' => 'Maďarsko'
				),
			'USA' => 'Spojené Štáty Americké'
			);
		$prompt = Html::el('option')->setText('Krajina')->class('prompt');
		$form->addSelect('country', 'Krajina:', $countries)
		     ->setPrompt($prompt);
		$form->addCheckBox('agree')
		     ->setOption('description', Html::el('span')
		     ->setHtml('Súhlasím s <a href="../docs/ListTerms">Podmienkamy</a>'))
		     ->addRule(Form::EQUAL, 'Musíte súhlasiť s podmienkamy!', TRUE);
		$form->addSubmit('subreg', 'Registrácia');
		$form->onSuccess[] = $this->registerIsSuccess;
		return $form;
	}
	/**
	 * If the value of the form sent to the correct
	 * Return a report on user success and redirect
	 * @return Success Page
	 */
	public function registerIsSuccess()
	{
		/** This @parameter return if is Success or Bad */

	}
}

hostujem u Websupportu.
Nette 2.0.10 pre PHP 5.3

Editoval SontoEremo (22. 3. 2013 13:04)

castamir
Člen | 629
+
0
-

Nedávno jsem řešil podobný problém, který házel stejnou chybu. Problém byl v databázi, kterou jsem dostal vyexportovanou. V sql kódu byly komentáře, jež byly ve stejném formátu user@host, ale neshodovaly se s mým přihlašovacím jménem a hostem. Řešením bylo vyexportovat databázi znovu (např. přes adminer), smazat současné tabulky a vytvořit je znovu.

Jan Mikeš
Člen | 771
+
0
-

A pri vykonavani jakeho sql dotazu ti to haze tuto chybu? Rovnou pri connectu?

Editoval Lexi (22. 3. 2013 13:37)

SontoEremo
Člen | 341
+
0
-

castamir napsal(a):

Nedávno jsem řešil podobný problém, který házel stejnou chybu. Problém byl v databázi, kterou jsem dostal vyexportovanou. V sql kódu byly komentáře, jež byly ve stejném formátu user@host, ale neshodovaly se s mým přihlašovacím jménem a hostem. Řešením bylo vyexportovat databázi znovu (např. přes adminer), smazat současné tabulky a vytvořit je znovu.

Nazdar vďaka za odpoveď
toto je export z Adminer-a:

-- Adminer 3.5.0 MySQL dump

SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` char(60) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


-- 2013-03-22 13:33:27

A toto z phpMyAdmin-a:

-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Hostiteľ: localhost:3306
-- Vygenerované: Pi 22.Mar 2013, 13:34
-- Verzia serveru: 5.1.63-log
-- Verzia PHP: 5.4.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Databáza: `vp_dbname`
--

-- --------------------------------------------------------

--
-- Štruktúra tabuľky pre tabuľku `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` char(60) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Zmazal a následne vytvoril nuvú tabuľku users ale žiadna zmena vždy tá istá chyba.

**PDOException #1045**
**SQLSTATE[28000] [1045] Access denied for user 'vp_username'@'10.10.29.10' (using password: YES)**

Fakt nechápem možno robím niekde chybu ale kde to vie asi len boh alebo najeký ten NetteGuru :)

SontoEremo
Člen | 341
+
0
-

Lexi napsal(a):

A pri vykonavani jakeho sql dotazu ti to haze tuto chybu? Rovnou pri connectu?

Pri odoslaný formulára k prihláseniu

Jan Mikeš
Člen | 771
+
0
-

No podle te chybove hlasky to vypada ze nemas opravneni insertovat. Kdyz pres adminera/phpmyadmina primo na webu vlozis testovaci radek funguje ti to? Pokud ano, zkus si zkopirovat sql dotaz po insertu a zkus ho execnout primo v nette napr v base presenteru, jestli se ti dany radek vlozi stejne. Pokud ne, kontaktuj technickou podporu, ze mas problem s databazi a opravnenimi :).

SontoEremo
Člen | 341
+
0
-

Lexi napsal(a):

No podle te chybove hlasky to vypada ze nemas opravneni insertovat. Kdyz pres adminera/phpmyadmina primo na webu vlozis testovaci radek funguje ti to? Pokud ano, zkus si zkopirovat sql dotaz po insertu a zkus ho execnout primo v nette napr v base presenteru, jestli se ti dany radek vlozi stejne. Pokud ne, kontaktuj technickou podporu, ze mas problem s databazi a opravnenimi :).

Cez sql dotaz v adminer-i a tak isto phpMyAdmin-e sa zapíše do tabuľky
Prepáč tomuto nerozumiem:

a zkus ho execnout primo v nette napr v base presenteru

Myslíš tento sql dotaz po insertu?

INSERT INTO `vp_dbname`.`users` (
`id` ,
`username` ,
`password`
)
VALUES (
NULL , 'Tester', MD5( '123456' )
)

prosím ako ho execnut? ešte nie som až tak zrelý v Nette :)

Editoval SontoEremo (22. 3. 2013 14:27)

castamir
Člen | 629
+
0
-

Databáze se normálně do presenteru v této formě dostat nemá, ale pro účely tohoto testu to nevadi.

// tvuj Basepresenter
private $connection;
public final function injectConnection(Nette\Database\Connection $connection)
{
	$this->connection = $connection;
}

public function startup()
{
	parent::startup();
	$this->connection->table("users")->insert(array( // id je auto_increment
		"username" => "Tester",
		"password" => "MD5( '123456' )"
	));
}
SontoEremo
Člen | 341
+
0
-

castamir napsal(a):

Databáze se normálně do presenteru v této formě dostat nemá, ale pro účely tohoto testu to nevadi.

// tvuj Basepresenter
private $connection;
public final function injectConnection(Nette\Database\Connection $connection)
{
	$this->connection = $connection;
}

public function startup()
{
	parent::startup();
	$this->connection->table("users")->insert(array( // id je auto_increment
		"username" => "Tester",
		"password" => "MD5( '123456' )"
	));
}

Stále to isté tá istá chyba bez zmeny…
Já už s tohto zošaliem asi :)
Ešte jedna otázka dúfam, že nebudem za hlupáka
Nemám náhodou Selectovať namiesto Insertovať? keďže sa pokúšam prihlásiť? či?

Jan Mikeš
Člen | 771
+
0
-

Presne to jsem mel namysli. Pripadne pro ucel testu muzes pouzit primo toto:

public function startup(){
	parent::startup();
	$this->context->database->exec("INSERT INTO `vp_dbname`.`users` ( `id` , `username` , `password` ) VALUES ( NULL , 'Tester', MD5( '123456' ) )");
	// nebo $this->context->getByType("Nette\Database\Connection")->exec("INSERT INTO `vp_dbname`.`users` ( `id` , `username` , `password` ) VALUES ( NULL , 'Tester', MD5( '123456' ) )");
}

Neni to ani trochu cisty zpusob, je to pouze pro otestovani zda mas prava a zda se ti tento dotaz provede.

Jan Mikeš
Člen | 771
+
0
-

Zkousis zda mas prava na to vkladat do db. Muzes zkusit klidne i select.

Mozne priciny proc ti to nefunguje:

  • mas spatne vyplnene udaje pro pripojeni k db (host/user/pass, spis bych to videl na hosta pokud je chyba v tomto)
  • nekde nastala chyba a tebou vytvoreny ucet v PMA nema opravneni pro inserty (mozna i selecty, kdo vi)

Zkus tedy overit zda 1. bod muzes vyloucit, pokud ho vyloucit muzes, kontaktuj technickou podporu, ti budou urcite chytrejsi.

SontoEremo
Člen | 341
+
0
-

Lexi napsal(a):

Zkousis zda mas prava na to vkladat do db. Muzes zkusit klidne i select.

Mozne priciny proc ti to nefunguje:

  • mas spatne vyplnene udaje pro pripojeni k db (host/user/pass, spis bych to videl na hosta pokud je chyba v tomto)
  • nekde nastala chyba a tebou vytvoreny ucet v PMA nema opravneni pro inserty (mozna i selecty, kdo vi)

Zkus tedy overit zda 1. bod muzes vyloucit, pokud ho vyloucit muzes, kontaktuj technickou podporu, ti budou urcite chytrejsi.

bod1) čo sa týka host-a je to buď localhost,db51.domena.xx alebo /tmp/mysql51.sock ale ani jedno stoho nepomohlo. user a pass a dbname som schválne spravil na vp_username ' vp_dbname ' 123456 / pretože som myslel, že je to mojimi údajmy ale ako som zistil nie je a tie ja nevytváram v PMA ale vo webadmine u hostéra už odjakživa :). Tak som si vytvoril jednoduchý script na Insetr a Select v čistom php a funguje za pomoci tých údajov čo svedčí o tom, že mám opravnenie pre insetry , selecty, updaty atď… :) .
Žial je tu ešte drobnosť a to, že sa mi nezapisujú errory a logy do /log a mám správne nastavenú cestu a CHMOD na 777 fakt neviem čo som dodrbal ale v systéme som sa vôbec nehrabal.

Skúsim ešte kontaktovať HelpDesk ale dúfam, že niekto ešte prispeje nejakým riešení a, že chybu budem mať ja aspoň sa do budúcna poučí. :)

Editoval SontoEremo (22. 3. 2013 15:28)

SontoEremo
Člen | 341
+
0
-

VYRIEŠENÉ
Povolil som PHP 5.4 a Začalo to šalapať, len neviem prečo s PHP 5.3 sú problémy!!! budem to musieť nejako dať DOKOPY

Ale hlavne FUNGUJE!!!
Ďakujem všetkym za POMOC :) Súper Fórum toto :)

Editoval SontoEremo (22. 3. 2013 15:47)