以下结果导致错误,因为我无法将一个var绑定到多个占位符:
$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();
我认为这样效率不高。 我必须复制我的var 2次才能绑定它2次。如果我想查询6个字段,我需要复制6次。我的感觉是必须有更好的方式。
处理此案件有更好的解决方法吗?
答案 0 :(得分:1)
我的解决方法
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
说到效率,基于LIKE
的搜索在设计上非常低效。您的效率是您真正需要的,然后至少必须使用FULLTEXT
搜索。或者 - 更好 - 专门的搜索引擎,如SphinxSearch。
答案 1 :(得分:0)
由于MySQL不支持很好的CTE,你可以尝试这种方法:
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
我不确定与一遍又一遍地传递相同的东西相比效率如何,但它可能是一个快速的黑客来解决它。