Zápis do DB, PDO + Nette\database, … Co je na tom špatně?
- zoltinho
- Člen | 24
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));
}
}
?>
- zoltinho
- Člen | 24
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
V 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
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)