1

1 つの変数を複数のプレースホルダーにバインドできないため、次の結果はエラーになります。

$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 回バインドできるようにするには、var を 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 に答える