tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

kombinace AND a OR ve WHERE

před 10 lety

wnc
Člen | 7

Ahoj, řešil jsem kombinaci AND a OR v jedné WHERE podmínce. Vymyslel jsem něco takovéhleho:

<?php
$words = split(' ',$query);
$fluent = dibi::select('*')->from('poeples');
$driver = dibi::getConnection()->getDriver();

foreach ($words as $word)  {
    $word = $driver->escape('%'.$word.'%',Dibi::TEXT);
    $fluent->where("(`jmeno` LIKE $word OR `prijmeni` LIKE $word)");
}

$fluent->test();
?>

Docela to funguje. Problém ale nastane při escapování apostrofů. Je-li jméno například John Mc'Donald, vypadá výsledek takto:

SELECT *
FROM `peoples`
WHERE (`jmeno` LIKE '%John%' OR `prijmeni` LIKE '%John%') AND (`jmeno` LIKE '%Mc\\'Donald%' OR
`prijmeni` LIKE '**Extra modifier %Mc**\'Donald%')

Tuší někdo, proč je výraz obsahující apostrof pokaždé jiný?

Editoval wnc (7. 7. 2009 22:50)

před 10 lety

wnc
Člen | 7

Tak se to nakonec podařilo vyřešit. Výsledek je zde:

<?php
$words = split(' ',$query);
$fluent = dibi::select('*')->from('poeples');

foreach ($words as $word)  {
    $word = '%'.$word.'%';
    $fluent->where("(`jmeno` LIKE %s OR `prijmeni` LIKE %s)",$word,$word);
}

$fluent->test();
?>

Editoval wnc (7. 7. 2009 23:16)

před 9 lety

mprokes
Člen | 10

nebo zkusit třeba

<?php
...
$word = '%'.$word.'%';
$fluent->where('( [jmeno]')->like ('%s', $word)
       ->or('[prijmeni]')  ->like ('%s', $word)
       ...
       ->or('[prezdivka]') ->like ('%s )', $word);
...
?>

Editoval mprokes (25. 2. 2010 23:27)