当前位置: 首页 > 面试题库 >

多次使用绑定参数

马博学
2023-03-14
问题内容

我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。

但是,返回的数据是从不同的表中获取的。

每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。

现在,该手册说:

调用PDOStatement ::
execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备好的语句中两次使用相同名称的命名参数标记。

我想,不是用:termX替换每个:term参数(x表示term = n ++),必须有一个更好的解决方案?

还是我只需要绑定X个:termX?

编辑 为此发布我的解决方案:

$query = "SELECT ... FROM table WHERE name LIKE :term OR number LIKE :term";

$term = "hello world";
$termX = 0;
$query = preg_replace_callback("/\:term/", function ($matches) use (&$termX) { $termX++; return $matches[0] . ($termX - 1); }, $query);

$pdo->prepare($query);

for ($i = 0; $i < $termX; $i++)
    $pdo->bindValue(":term$i", "%$term%", PDO::PARAM_STR);

好了,这是一个示例。我没有时间使用sqlfiddle,但如有必要,我会在后面添加一个。

(
    SELECT
        t1.`name` AS resultText
    FROM table1 AS t1
    WHERE
        t1.parent = :userID
        AND
        (
            t1.`name` LIKE :term
            OR
            t1.`number` LIKE :term
            AND
            t1.`status` = :flagStatus
        )
)
UNION
(
    SELECT
        t2.`name` AS resultText
    FROM table2 AS t2
    WHERE
        t2.parent = :userParentID
        AND
        (
            t2.`name` LIKE :term
            OR
            t2.`ticket` LIKE :term
            AND
            t1.`state` = :flagTicket
        )
)

问题答案:

我已经遇到过相同的问题好几次了,我想我已经找到了一个非常简单和好的解决方案。万一我想多次使用参数,我只是将它们存储到MySQL中User-Defined Variable
这使代码更具可读性,并且您在PHP中不需要任何其他功能

$sql = "SET @term = :term";

try
{
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(":term", "%$term%", PDO::PARAM_STR);
    $stmt->execute();
}
catch(PDOException $e)
{
    // error handling
}


$sql = "SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term";

try
{
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $stmt->fetchAll();
}
catch(PDOException $e)
{
    //error handling
}

唯一的缺点可能是您需要执行其他MySQL查询-但恕我直言,这是完全值得的。
由于User-Defined Variables在MySQL中是会话绑定的,因此也不必担心变量会@term在多用户环境中产生副作用。



 类似资料:
  • 问题内容: 请看下面我的代码。我试图将一系列参数绑定到我准备好的语句中。我一直在网上四处逛逛,可以看到我必须使用call_user_func_array但无法正常工作。我得到的错误是:“第一个参数应该是有效的回调,给出了’Array’”我可能是错误的,但是我假设第一个参数可以是一个数组,并且此错误消息可能会引起误解。我认为问题是我的阵列在某种程度上存在错误。谁能看到我在做什么错?谢谢。 问题答案:

  • 问题内容: 我遵循Presentation Model模式对一些屏幕进行编码。 我把一些豆子放在一个 我将在中显示此列表的内容,这要归功于 我还想同时在组合框(以表单的形式)中显示此列表中的 某些记录* , 并同时 在JList中显示 其他 记录。 *** 这三个屏幕(及其模型)彼此独立 如何管理在我的列表中添加{一个或多个} /删除{一个或多个}并在各处实时查看更改? 我将要编写自己的Obser

  • 参数绑定是把当前请求的变量作为操作方法(也包括架构方法)的参数直接传入,参数绑定并不区分请求类型。 参数绑定传入的值会经过全局过滤,如果你有额外的过滤需求可以在操作方法中单独处理。 按名称绑定 参数绑定方式默认是按照变量名进行绑定,例如,我们给Blog控制器定义了两个操作方法read和archive方法,由于read操作需要指定一个id参数,archive方法需要指定年份(year)和月份(mon

  • 问题内容: 我有一个功能可以做到这一点: 哪个发送到我的数据库类,它执行以下操作: 问题是这不起作用。 我希望做的是获取列表,并在后面列出它们,以使查询类似于: 但是很明显,我走错了路。 有没有办法使数组…按原样转换为要在查询阶段打印出来的列表? 问题答案: call_user_func_array “使用参数数组调用回调” 应该做的工作 更新 :您还必须更改您的params数组: 如预期的那样,

  • 问题内容: 我需要将动态参数传递给applet。 这是我的控制器: 这是我的观点,参数base64在控制器中定义为“ abcd” 当我运行页面时,我在p标签中看到字符串’abcd’,但是applet参数的值只是“ {{base64}}”。 我该如何解决? 问题答案: 我解决了传递整个applet声明的问题。这样,它可以正常工作。 控制器: 视图:

  • 我有一个cql查询,我想执行。cql字符串如下所示: 我的应用程序在数据税驱动程序之上有两层抽象。在一个层中,我想绑定前两个参数,而在另一层中我想绑定最后一个参数。问题是,如果我绑定前两个参数,我会得到一个无法绑定另一个参数的BoundStatement。我错过了什么吗?能做到吗? 我们使用的是datastax驱动程序版本2.0.3。 谢谢,安纳托利。