2013-09-10 3 views
1

Следующие приводит к ошибке, потому что я не могу связать один вар на несколько заполнителей:PDO лучшая практика для запроса нескольких полей с одной переменной

$search = "%somename%"; 
$stmt = $pdo->prepare("SELECT * FROM persons WHERE firstname LIKE :search OR lastname LIKE :search"); 
$stmt->bindValue(":search", $search, PDO::PARAM_STR); 
$stmt->excecute(); 

мой обходной путь заключается в следующем:

$search = "%somename%"; 
$search1 = $search; 
$search2 = $search; 
$stmt = $pdo->prepare("SELECT * FROM persons WHERE firstname LIKE :search1 OR lastname LIKE :search2"); 
$stmt->bindValue(":search1", $search1, PDO::PARAM_STR); 
$stmt->bindValue(":search2", $search2, PDO::PARAM_STR); 
$stmt->excecute(); 

I думаю, что это не очень эффективно. Мне нужно скопировать мой var 2 раза, чтобы иметь возможность связывать его 2 раза. Если я хочу запросить 6 полей, мне нужно скопировать их 6 раз. Я чувствую, что должен быть лучший способ.

Есть ли лучшее обходное решение для обработки этого случая?

+1

Вы также можете установить его, указав его в массив. –

+0

Вам не нужно '$ search1' +' $ search2', просто используйте '$ search' дважды. Возможно, что вместо имени ': .. 1',': .. 2' может быть несколько наименований вместо того, чтобы заманить, что эти заполнители имеют одинаковое значение. – djot

ответ

1

мой обходной

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE); 

Говоря о эффективности, LIKE основанное поиск ужасно неэффективен по дизайну. Эффективность - это то, что вам действительно нужно, тогда нужно использовать не менее FULLTEXT. Или - лучше - выделенный поисковик, такой как SphinxSearch.

+0

Спасибо, 'LIKE' был просто использован, например. Правильно ли я понимаю, что это приводит только к ошибке, потому что инструкции подготовки mysqls native не поддерживают его? – steven

+0

Собственные подготовленные заявления не имеют к этому никакого отношения, я полагаю. Это скорее реализация PDO. Но да, технически он работает только в режиме эмуляции. –

+0

Вы бы рекомендовали использовать режим эмуляции по другим причинам? Или я должен использовать его только для данного случая? – steven

0

В MySQL не поддерживает хорошие КТР, вы можете попробовать этот подход:

select 
    persons.id 
    // etc etc 
from 
    persons 
     join (
      select 
       :search as mat 
      from 
       dual) du 
      on person.firstname like du.mat 
      or person.lastname like du.mat 

Я не уверен, насколько он эффективен по сравнению с пропусканием же вещи снова и снова, но это может быть быстро взломать, чтобы обойти это.

+0

^^ этот мой любимый. «Всегда указывайте, как будто человек, который заканчивает поддерживать ваш код, является жестоким психопатом, который знает, где вы живете». Даже если бы я был самым спокойным человеком в мире, я бы стал маньяком, увидев * это *. У вас есть простой поисковый запрос. –

+0

@YourCommonSense Я не сказал, что это отличный способ, но это, вероятно, тот, который никто не пробовал бы. Нет вреда в предоставлении опций :) – Fluffeh

Смежные вопросы