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