Zápis do DB, PDO + Nette\database, … Co je na tom špatně?

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

Při odeslání formuláře pro uložení nového uživatele do databáze mi to skončí na řádku:
$q = $database->prepare($sql);
nadpis chyby je: Call to a member function prepare() on a non-object

tady jsou všechny potřebné kódy

--- bootstrap.php ---

<?php
$application->onStartup[] = function() {
	BaseModel::initialize(Environment::getConfig()->database);
};
?>

--- BaseModel.php ---

<?php
class BaseModel extends Object {

        public static $database;

        public static function initialize($database)
	{
              self::$database = new Nette\Database\Connection($database->dsn, $database->user, $database->password);
	}
}
?>

--- RegistracePresenter.php ---

<?php
protected function createComponentRegistraceForm()
	{
		$form = new AppForm;
                $form->addText('username', 'Username:')
                $form->addText('real_name', 'jméno:')
		$form->addPassword('password', 'heslo:')
		$form->addSubmit('send', 'Odeslat');
                $form->addSubmit('cancel','Zrušit');

		$form->onSubmit[] = array($this, 'registraceFormSubmitted');
		return $form;
	}

public function registraceFormSubmitted($form)
	{
             if ($form->isSubmitted())
             {
                 if ($form['cancel']->isSubmittedBy())
                 {
                     $this->redirect('Login:in');
                 } else {
                     $username = $form['username']->getValue();
                     $real_name = $form['real_name']->getValue();
                     $password = $form['password']->getValue();

                     $aa = new \RegistraceModel;
                     $aa->adduser($username, $real_name, $password);

                     $this->flashMessage('Byl jste úspěšně zaregistrován.');
                     $this->redirect('Login:in');
                 }
            }
?>

--- RegistraceModel.php ---

<?php
class RegistraceModel extends BaseModel
{
        public static function adduser($username, $real_name, $password)
        {
                $sql = "INSERT INTO users (username, real_name, password) VALLUES (:username,:realname,:password)";

                $q = $database->prepare($sql);
                $q->execute(array(':username'=>$username,
                                  ':real_name'=>$real_name,
                                  ':password'=>$password));
        }


}
?>
kravčo
Člen | 721
+
0
-

Asi chceš v registračnom modeli namiesto $database písať self::$database

zoltinho
Člen | 24
+
0
-

Všude kde je $database by se mělo používat předtím ::self?
I když se připojuji pomocí Nette\database, tak jsem myslel, že v dotazech můžu používat pouze klasické PDO jako treba v tomto tutorialu, že Nette\database je jen „nadstavba“ které můžu a nemusím využít..

přidání ::self pomohlo, ted se mi to ale zastavilo na řádku
':password'=>$password));
s chybovou hláškou:

PDOException #HY093

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Btw, ten zápis v tom RegModelu co tam mám je podobný tomu co je na stránce v odkazu výš, tak myslím, že to špatně napsaný není..

zoltinho
Člen | 24
+
0
-

BaseModel.php jsem se připojil místo

self::$database = new Nette\Database\Connection($database->dsn, $database->user, $database->password);

normálně přes PDO

self::$database = new PDO($database->dsn,$database->user,$database->password);

a chybu při odeslání formuláře to už nevyhodí, stránka se přesměruje a i se vypíše „Byl jste úspěšně zaregistrován.

Jenže do databáze se uživatel nepřidá. čím to je, ČÍM TO JE…

zoltinho
Člen | 24
+
0
-

vyřešeno

připojení k db jsem nakonec nechal přes Nette\database:

self::$database = new Nette\Database\Connection($database->dsn, $database->user, $database->password);

a v RegistraceModel.php jsem do fce adduser napsal:

<?php
self::$database->exec('INSERT INTO users', array( // parametrem může být také pole
                    'username' => $username,
                    'real_name' => $real_name,
                    'password' => $password,
                ));
?>

Editoval zoltinho (2. 5. 2011 21:39)