Problém s insertem do databáze MySQL. Ve Workbenchi ale dotaz projde v pořádku

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

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)

Mysteria
Člen | 797
+
+1
-

Pojmenovávat tabulky klíčovým slovem MySQL (ORDER) není dobrý nápad. Pak musí být vždy dané slovo uzavřeno v ‚‘.

janmat
Člen | 5
+
+1
-

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 | 796
+
0
-

@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
+
0
-

uestla napsal(a):

@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(...)

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. :)