Vyhledávání v DB skrze složený sql

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

Ahoj, mám takový menší problém při položení dotazu pro vyhledávání v NDB.
Vezmu vyhledávaný řetězev a Vytvořím z něj SQL podímku:

if(count($this->searchWords))
{
	$sql = array();
	foreach($this->searchWords as $word)
	{
		$columns = array();
		foreach($this->columns as $column)
		{
			$cColumn = $word['lower'] ? 'LOWER(' . $column . ')' : $column;
			$columns[] = sprintf('%s LIKE "%s" COLLATE %s', $cColumn, "%" . $word['word'] . "%", $word['coding']);
		}
		$sql[] = implode(' OR ', $columns);
	}
	return implode(' OR ', $sql);
}

Tento kód mi vrátí krásný SQL string

$sql = "name_temp LIKE "%pejsek%" COLLATE utf8_general_ci OR content_temp LIKE "%pejsek%" COLLATE utf8_general_ci OR perex_temp LIKE "%pejsek%" COLLATE utf8_g ... "

Následně tento string hodím do podmínky

$this->documentModel->table_documents()->where($sql);

Bohužel se ale SQL ale přeloží s apostrofy a tudíž není možné slovo/a dohledat

// "SELECT *
FROM `documents`
WHERE (`name_temp` LIKE "%`pejsek`%" COLLATE `utf8_general_ci` OR `content_temp` LIKE "%`pejsek`%"
COLLATE `utf8_general_ci` OR `perex_temp` LIKE "%`pejsek`%" COLLATE `utf8_general_ci`)"

Je možné tomuto nějak zabránit? Bohužel nemůžu použít klasiku která mi funguje

$this->documentModel->table_document()->where('name LIKE', "%" . $search . "%");

Jelikož se dotaz zkláda z dynamického počtu soupců a vyhledávaných slov.

Díky moc

Editoval iwory (30. 3. 2014 19:55)

David Matějka
Moderator | 6445
+
0
-

vytvor si ten dotaz s parametrama, ktery pak posles do where. takze aby ti to vygenerovalo neco jako

name_temp LIKE ? COLLATE ? OR content_temp LIKE ? COLLATE ?

a parametry budou pole s

%pejsek%
utf8_general_ci
....

a do where posles ->where($sql, $parameters)

iwory
Člen | 147
+
0
-

Good idea, works, thx :-)