Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO使用一个变量查询多个字段的最佳实践_Php_Mysql_Optimization_Pdo - Fatal编程技术网

Php PDO使用一个变量查询多个字段的最佳实践

Php PDO使用一个变量查询多个字段的最佳实践,php,mysql,optimization,pdo,Php,Mysql,Optimization,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(); 我的解决方法如下: $se

由于无法将一个变量绑定到多个占位符,以下结果导致错误:

$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两次才能绑定它两次。如果我想查询6个字段,我需要复制它6次。我觉得一定有更好的办法

是否有更好的解决方案来处理此案件?

我的解决方案

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
说到效率,
比如基于
的搜索在设计上是非常低效的。你真正需要的是效率,那么至少必须使用
全文搜索。或者-更好-像SphinxSearch这样的专用搜索引擎。

我的解决方法

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

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

由于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

我不确定与一遍又一遍地传递相同的内容相比,它的效率有多高,但这可能是一个快速的解决方法。

由于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

我不确定与一遍又一遍地传递相同的内容相比,它的效率有多高,但绕过它可能是一种快速的方法。

您也可以通过将其定义到数组中来设置它。。您不需要
$search1
+
$search2
,只需使用
$search
两次即可。可能有一些更好的命名方法来代替
:…1
:…2
,以确定这些占位符具有相同的值。您也可以通过将其定义到数组中来进行设置。您不需要
$search1
+
$search2
,只需使用
$search
两次即可。可能有一些更好的命名方法,而不是
:…1
:…2
,来说明这些占位符具有相同的值。谢谢,
LIKE
只是用作示例。我是否理解正确,它只会导致错误,因为mysqls原生prepare语句不支持它?我相信原生prepare语句与此无关。这相当于PDO实现。但从技术上讲,它只能在仿真模式下工作。出于其他原因,您是否总是建议使用仿真模式?或者我应该只在给定的情况下使用它?嗯,我个人更喜欢一直保持仿真模式。但是我觉得社区的想法是相反的。对于每个感兴趣的人来说:我找到了一条关于“是否总是使用它”的线索,谢谢,
LIKE
就是一个例子。我是否理解正确,它只会导致错误,因为mysqls原生prepare语句不支持它?我相信原生prepare语句与此无关。这相当于PDO实现。但从技术上讲,它只能在仿真模式下工作。出于其他原因,您是否总是建议使用仿真模式?或者我应该只在给定的情况下使用它?嗯,我个人更喜欢一直保持仿真模式。但是我觉得社区的想法是相反的。对于每一个感兴趣的人:我发现了一条关于是否总是使用它的帖子^^^这是我最喜欢的。“总是把维护你的代码的人当作知道你住在哪里的暴力精神病患者。”即使我是世界上最冷静的人,看到这一点,我肯定会变成疯子。对于一个简单的搜索查询,请注意。@YourCommonSense我并没有说这是一个很好的方法,但这可能是其他人都不会尝试的方法。提供选择没有坏处:)^^这是我最喜欢的。“总是把维护你的代码的人当作知道你住在哪里的暴力精神病患者。”即使我是世界上最冷静的人,看到这一点,我肯定会变成疯子。对于一个简单的搜索查询,请注意。@YourCommonSense我并没有说这是一个很好的方法,但这可能是其他人都不会尝试的方法。给予选择没有坏处:)