Zápis dat do databáze – Unknown column ‚_submit‘ in ‚field list‘
- iNyxLadis
- Člen | 48
Zdravím,
někde mám chybu a nevím kde, respektive nerozumím kde. Snažím se ukládat formulář (ve kterém proběhne ajax – dependentselectbox) do databáze.
presenter (formulář):
protected function createComponentTimesheetForm()
{
$form = new Form;
$form->addHidden('Tsk_ID');
$form->addSelect('Cmp_ID', 'Firma', $this->timesheetManager->getCompanies()->fetchPairs('Cmp_ID', 'CmpName1'))
->setPrompt('Vybrat firmu')->setRequired();
$form->addSelect('Prj_ID', 'Projekt')
->setPrompt('Vybrat projekt');
$form->addText('TskName', 'Obor zájmu')->setRequired();
$form->addText('TskDescription1', 'Popis úkolu')->setRequired();
$form->addText('TskDateStart', 'Datum zahájení')->setRequired();
$form->addText('TskDateEnd', 'Datum ukončení')->setRequired();
$form->addText('TskTaskmaster', 'Zadavatel')->setRequired();
$form->addText('TskWorked', 'Odpracováno (hod.)')->setRequired()->addRule(Form::INTEGER, 'Zadejte číselnou hodnotu');
$form->addSelect('TskUser', 'Provedl', $employees = array(
"user1" => 'user1',
"user2" => 'user2',
"user3" => 'user3',
"user4" => 'user4',
"user5" => 'user5',
"user6" => 'user6',
))->setPrompt('Vybrat zaměstnance')->setRequired();
$form->addSubmit('submit', 'Uložit');
$form->onSuccess[] = [$this, 'timesheetFormSucceeded'];
return $form;
}
public function timesheetFormSucceeded($form)
{
$values = $form->getHttpData();
$this->timesheetManager->saveTask($values);
$this->flashMessage('Záznam byl uložen.');
$this->redirect(':Front:Timesheet:');
}
model (uložení dat do databáze z formuláře):
public function saveTask($timesheetFormValues)
{
if (!$timesheetFormValues[self::TASK_COLUMN_ID]) {
$this->database->table(self::TABLE_TASK)->insert($timesheetFormValues);
} else {
$this->database->table(self::TABLE_TASK)->where(self::TASK_COLUMN_ID, $timesheetFormValues[self::TASK_COLUMN_ID])->update($timesheetFormValues);
}
}
šablona
{define content}
<h1>Evidence nového úkolu</h1>
{snippetArea wrapper}
{form timesheetForm}
<table>
<tr><th>{label Cmp_ID /}</th><td>{input Cmp_ID}</td></tr>
<tr n:snippet="projectSnippet"><th>{label Prj_ID /}</th><td>{input Prj_ID}</td></tr>
<tr><th>{label TskName /}</th><td>{input TskName}</td></tr>
<tr><th>{label TskDescription1 /}</th><td>{input TskDescription1}</td></tr>
<tr><th>{label TskDateStart /}</th><td>{input TskDateStart}</td></tr>
<tr><th>{label TskDateEnd /}</th><td>{input TskDateEnd}</td></tr>
<tr><th>{label TskTaskmaster /}</th><td>{input TskTaskmaster}</td></tr>
<tr><th>{label TskWorked /}</th><td>{input TskWorked}</td></tr>
<tr><th>{label TskUser /}</th><td>{input TskUser}</td></tr>
<tr><th>{label submit /}</th><td>{input submit}</td></tr>
</table>
{/form}
{/snippetArea}
{include jsCallback, input => Cmp_ID, link => timesheetFormChange}
{/define}
{define jsCallback}
<script>
$('#' + {$control["timesheetForm"][$input]->htmlId}).on('change', function() {
$.nette.ajax({
type: 'GET',
url: {link {$link}!},
data: {
'value': $(this).val(),
}
});
});
</script>
{/define}
Hláška z tracy: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚_submit‘ in ‚field list‘
INSERT INTO TblTask
(Cmp_ID
, Prj_ID
,
TskName
, TskDescription1
,
TskDateStart
,
TskDateEnd
, TskTaskmaster
, TskWorked
,
TskUser
, _submit
, Tsk_ID
,
_do
)
VALUES (‚2‘, ‚4‘, ‚Text 1‘, ‚Popis ukolu‘, ‚1–1–2016‘,
‚1–4–2016‘, ‚Mareček‘, ‚5‘, ‚user2‘,
‚Uložit‘, '', ‚timesheetForm-submit‘)
Mohu poprosit o pomoc? Díky
- ZahorskyJan
- Člen | 59
@iNyxLadis je to kvůli použití getHttpData. To obsahuje i to tlačítko na odeslání a databáze to nemá jak vědět, že to nemá použít. Řešení je použít místo toho getValues() nebo ručně vyčistit pole dat formuláře od věcí, které do databáze nepatří.
- iNyxLadis
- Člen | 48
ZahorskyJan napsal(a):
@iNyxLadis je to kvůli použití getHttpData. To obsahuje i to tlačítko na odeslání a databáze to nemá jak vědět, že to nemá použít. Řešení je použít místo toho getValues() nebo ručně vyčistit pole dat formuláře od věcí, které do databáze nepatří.
Dobře, děkuji. To bych i chápal. Bohužel v tomto řešení (čerpal jsem z https://forum.nette.org/…ct-with-ajax) je nutné getHttpData použít. Mohu se tedy zeptat na trochu amatérský dotaz a to jakým způsobem vyčištit zmíněné pole od přebytečných informací?
EDIT: ještě doplním, že pokud zvolím variantu s getValues(), dostávám od tracy hlášku Trying to get property of non-object s označením řádku (selectboxu), který je ajaxován, jež je právě řešena způsobem, který je popsaný ve foru na zmíněnem odkazu, tedy předávání hodnot pomocí getHttpData.
Editoval iNyxLadis (28. 11. 2016 14:30)
- iNyxLadis
- Člen | 48
Jan Mikeš napsal(a):
@iNyxLadis hodnoty jsou klasické pole, dumpni si ho a klíče, které tam nechceš (submit, _submit, _do,…) normálně pomocí
unset()
zruš
Děkuji, hledal jsem v tom příliš velké složitosti. Vyzkouším.
EDIT: OK, opravdu stačí jednoduše unsetnout. Funguje, díky.
Editoval iNyxLadis (29. 11. 2016 12:30)