1

以下导致错误,因为我无法将一个 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 次。我的感觉是必须有更好的方法。

有没有更好的解决方法来处理这种情况?

4

2 回答 2

1

我的解决方法

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

说到效率LIKE基于 - 的搜索在设计上是非常低效的。您的效率是您真正需要的,那么至少FULLTEXT必须使用搜索。或者 - 更好的 - 专用搜索引擎,如 SphinxSearch。

于 2013-09-10T09:49:59.397 回答
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

我不确定与一遍又一遍地传递相同的东西相比它的效率如何,但它可能是一个快速解决它的方法。

于 2013-09-10T09:54:11.327 回答