PDO:将额外参数传递给准备好的参数而不是需要

joe*_*e92 6 pdo prepared-statement

您是否可以使用PDO向准备好的语句发送超出需要的参数而没有不良副作用?

这可能看起来像一个奇怪的问题,但我问,因为我连续4个查询,它们都使用相似和不同的参数.查询的相关部分:

第1名(选择,与其他人不同):
WHERE threadID = :tid

第二(选择):
WHERE user_ID = :u_ID AND thread_ID = :tid

第3次(如果第2次成功则更新):
SET time = :current_time WHERE user_ID = :u_ID AND thread_ID = :tid

第4次(如果第二次失败则插入):
VALUES (:u_ID, :tid, :current_time)

我可以在开头声明一个带有三个参数的数组,并将其用于所有4个查询吗?

为了解决任何混淆,查询将单独执行.它是重用的参数变量,因此这意味着某些查询将接收它们不需要的参数.所以类似于:

$parameters = array(':tid' => $tid, ':u_ID' => $u_ID, ':current_time' => $time);

$1st = $db->prepare($query1);
$1st->execute($parameters);

$2nd = $db->prepare($query2);
$2nd->execute($parameters);

$3rd = $db->prepare($query3);
$3rd->execute($parameters);

$4th = $db->prepare($query4);
$4th->execute($parameters);
Run Code Online (Sandbox Code Playgroud)

如果可以的话,我应该吗?这会减慢或导致我的数据库或脚本的安全漏洞吗?

如果我能让这个问题更清楚一点,请问.

谢谢!

Jef*_*ett 5

也许自从第一次问这个问题以来文档已经更新,但现在很清楚地说明“

您不能绑定比指定更多的值;如果 input_parameters 中存在的键多于 PDO::prepare() 中指定的 SQL 中的键,则该语句将失败并发出错误。

这些答案应该有助于过滤掉额外的参数。


joe*_*e92 2

我有机会测试我的问题,答案是您不能发送比查询使用的参数更多的参数。您会收到以下错误:

PDOException Object
(
    [message:protected] => SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
    [string:Exception:private] => 
    [code:protected] => HY093
    [file:protected] => C:\Destination\to\file.php
    [line:protected] => line number
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [file] => C:\Destination\to\file.php
                    [line] => line number
                    [function] => execute
                    [class] => PDOStatement
                    [type] => ->
                    [args] => Array
                        (
                            [0] => Array
                                (
                                    [:u_ID] => 1
                                    [:tid] => 1
                                    [:current_time] => 1353524522
                                )

                        )

                )

            [1] => Array
                (
                    [file] => C:\Destination\to\file.php
                    [line] => line number
                    [function] => function name
                    [class] => class name
                    [type] => ->
                    [args] => Array
                        (
                            [0] => SELECT
                                                column
                                            FROM
                                                table
                                            WHERE
                                                user_ID  = :u_ID AND
                                                thread_ID = :tid
                            [1] => Array
                                (
                                    [:u_ID] => 1
                                    [:tid] => 1
                                    [:current_time] => 1353524522
                                )

                        )

                )

        )

    [previous:Exception:private] => 
    [errorInfo] => Array
        (
            [0] => HY093
            [1] => 0
        )

)
Run Code Online (Sandbox Code Playgroud)

我对 PDO 了解不多,因此我的问题是,但我认为因为 :current_time 已发送但未使用,并且错误消息是“无效的参数号:参数未定义”,所以您无法发送未定义的额外参数用过的。

此外,还会生成错误代码 HY093。现在我似乎无法在任何地方找到任何解释 PDO 代码的文档,但是我遇到了以下两个专门关于 HY093 的链接:
What is PDO Error HY093
SQLSTATE[HY093]

HY093 似乎是由于错误绑定参数而生成的。这一定发生在这里,因为我绑定了太多参数。