Nette\Database – ON DUPLICATE KEY – vypnutí escapování
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- VojtaSim
- Člen | 55
Zdravím,
snažím se vytvořit SQL dotaz
ON DUPLICATE KEY UPDATE
v Nette\Database pomocí query()
. Dotaz
používám na přeřazení odkazů v navigaci. Z frontendu se po změně
pořadí posílá POST, zpracuje se v handle
a pokračuje do
modelu. V modelu mám fnci která jako parametr dostane zpracované
pořadí:
array(
array('id' => 5, 'parent_id' => NULL, 'order' => 1),
array('id' => 6, 'parent_id' => NULL, 'order' => 2),
array('id' => 7, 'parent_id' => 5, 'order' => 1)
);
Funkce vypadá takto:
public function reorderNavigationLinks(array $linksArray)
{
// search for columns to update
$keys = array_keys(array_values($linksArray)[0]);
// join keys for update statement
$updateStatement = array();
foreach ($keys as $key)
$updateStatement[$key] = "VALUES($key)";
try {
// insert new navigation links or update existing
$result = $this->database->query('INSERT INTO navigations_links', $linksArray, ' ON DUPLICATE KEY UPDATE ',$updateStatement);
if (!$result)
throw new Nette\Application\ApplicationException("An error occurred while saving data!");
} catch (\PDOException $e) {
throw new Nette\Application\ApplicationException("An error occurred while saving data!");
}
}
Problém je, že při generování SQL dotazu se escapují i hodnoty
VALUES($key)
a pak následovný dotaz vypadá:
INSERT INTO navigations_links (`id`, `parent_id`, `order`)
VALUES (6, NULL, 1), (5, NULL, 2), (7, 5, 1) ON DUPLICATE KEY
UPDATE `id`='VALUES(id)', `parent_id`='VALUES(parent_id)', `order`='VALUES(order)'
Dotaz tedy zní: jestli se dá nějak vypnout escapování pro jeden
paremetr, a nebo raději místo $updateStatement
tam hodit přímo
string, který bude obsahovat id
=VALUES(id),
parent_id
=VALUES(parent_id), … ?
- David Matějka
- Moderator | 6445
zkus pouzit:
$updateStatement[$key] = new Nette\Database\SqlLiteral("VALUES($key)");