Problém s insertem do databáze MySQL. Ve Workbenchi ale dotaz projde v pořádku
- janmat
- Člen | 5
Zdravím vás,
mám problém, se kterým si nevím rady. Jedná se o insert do MySQL databáze.
Kód:
$this->context->query('INSERT INTO order', [
'item_id' => $itemID,
'user_id' => $userID,
'order_type' => 'P',
'order_price' => $price,
'buy_date' => date("Y-m-d H:i:s"),
'close_date' => date("Y-m-d H:i:s")
]);
SQL vygenerovaný Debuggerem:
INSERT INTO order (item_id
, user_id
,
order_type
, order_price
, buy_date
,
close_date
)
VALUES (‚2‘, 1, ‚P‘, 5000, ‚2016–12–22 21:14:40‘,
‚2016–12–22 21:14:40‘)`
---(editor tady ve foru mi rozbil uvozovky tady v SQL – všude jsou
‚ ‘)
Když dotaz spustím ve Workbenchi, tak se provede.
Debugger vypisuje:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ‚order (item_id
,
user_id
, order_type
, order_price
,
buy_date
, `close_dat‘ at line 1
Jediná chyba, která mě napadá, že by byl nějaký problém s úvozovkami: ‚2‘ tak, že by si s nimi Nette nevědělo rady.
Předem díky za cenné rady.
Editoval janmat (22. 12. 2016 21:44)
- janmat
- Člen | 5
Mysteria napsal(a):
Pojmenovávat tabulky klíčovým slovem MySQL (ORDER) není dobrý nápad. Pak musí být vždy dané slovo uzavřeno v ‚‘.
Už jsem problém vyřešil. Stačilo použít místo:
$this->context->query('INSERT INTO order', [
'item_id' => $itemID,
'user_id' => $userID,
'order_type' => 'P',
'order_price' => $price,
'buy_date' => date("Y-m-d H:i:s"),
'close_date' => date("Y-m-d H:i:s")
]);
toto:
$this->context->table('order')->insert([
'item_id' => intval($itemID),
'user_id' => $userID,
'order_type' => 'P',
'order_price' => $price,
'buy_date' => date("Y-m-d H:i:s"),
'close_date' => date("Y-m-d H:i:s"),
]);
Ale teď nemohu najít podobnou syntaxi pro UPDATE. Tato mi nefunguje:
$this->context->query('UPDATE item SET ?=? WHERE id=?',"active",0,intval($itemID));
VYŘEŠENO !!!
Správná syntaxe:
$this->context->table(SELF::$TABLE_NAME)->get($itemID)->update(array('active' => 0));
Díky za rady. :)
Editoval janmat (22. 12. 2016 22:31)
- uestla
- Backer | 799
@janmat
Je ale důležité uvědomit si rozdíl obou volání:
Voláním metody query()
pracuješ s
Nette\Database\Connection
, kdežto table()
vytváří
Nette\Database\Table\Selection
.
Taky ten poslední update představuje zbytečně 2 dotazy – jeden pro SELECT a druhý pro UPDATE.
V query buď použij přímo SET active = ?
, nebo (použití
Table\Selection
)
->table('item')->wherePrimary($id)->update(...)
- janmat
- Člen | 5
uestla napsal(a):
@janmat
Je ale důležité uvědomit si rozdíl obou volání:
Voláním metody
query()
pracuješ sNette\Database\Connection
, kdežtotable()
vytváříNette\Database\Table\Selection
.Taky ten poslední update představuje zbytečně 2 dotazy – jeden pro SELECT a druhý pro UPDATE.
V query buď použij přímo
SET active = ?
, nebo (použitíTable\Selection
)->table('item')->wherePrimary($id)->update(...)
Jasný, díky. S Nette začínám, takže mi chvilku trvalo než jsem postřehl, že se jedná o dvě odlišné součásti Nette. Určitě se hodí pro ponaučení pro příště a zjednodušení dotazu. :)