Vypnutí backticku, parametrizace v order – Nette 2.0

Kcko
Člen | 465
+
0
-

EDIT: vyřešeno
Hnusnou cestou přes SQL builder, ani nevím jak sem se k tomu doklikal a dopsal. FUJ.


Ahoj,
bohužel máme ještě projekt na 2.0 bez možnosti upgradu.
Staré vyhledávání, řešené ještě blbě přes LIKE. Potřebuji nastavit priority řazení, kde bych použil něco jako

Ale nelze mi vůbec zapsat do metody order nebo select. Neustále mi to NDB escapuje backtickem.

Lze to vůbec?

Zkoušel jsem 2 způsoby (polem, které jsem předal do orderu a poté selectem přes SqlLiteral)

<?php
		$orderImplode[] = 'CASE WHEN name LIKE ? COLLATE utf8_general_ci';
		$orderArgs[] = '%' . implode(' ', $searchWords) . '% THEN 0 ELSE 1 END';

	$wholeTerm = implode(' ', $searchWords);
		$selection = $this->connection->table('eshop_item')
			->getDataset()->getSelection()
			->select('eshop_item.id')
			//->select(new Nette\Database\SqlLiteral("IF (name LIKE '%dortove noze%' COLLATE utf8_general_ci, 1, 0) AS rank"))
			->where(implode(' OR ', $whereImplode), $args);
			//->order("rank");
			//->order(implode(', ', $orderImplode), $orderArgs)
			;

?>

Výsledkem je pak tahle zoufalost, což je nejen SQL injekce, ale i díky backtickum, které mi obalí hledaný výraz absolutně nefunkční.

<?php
IF (`name` LIKE '%`dortove` `noze`%' COLLATE `utf8_general_ci`, 1, 0) AS `rank`
?>

Nápad? Díky.

Editoval Kcko (28. 7. 2021 12:07)