【问题标题】:PHP implode in bind_paramPHP 在 bind_param 中内爆
【发布时间】:2021-04-02 08:01:52
【问题描述】:

我正在尝试在 php 中创建高级搜索。不需要输入,用户可以决定是要搜索制造商还是只设置最低价格等。我试图将 bind_param 的“s”和“i”保存在数组中,以及变量在另一个数组中,然后将它们内爆到 bind_param 部分。 这就是我遇到问题的地方。 $params 内爆工作正常,但是当我尝试内爆 $vars 数组时,我收到一条错误消息,上面写着“只有变量应该通过引用传递”。 这是因为如果我将一个变量推送到我的数组中,它会存储它的值而不是变量本身。我尝试将它们作为字符串推送,例如“$example”,但在这种情况下,当我将其内爆时,会收到相同的消息,因为它是一个字符串。 那么,我应该如何将它们存储在数组中以便能够在 bind_param 中使用它们呢?

在这个例子中,我只展示了 2 个输入,但我还有更多。

if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['search_button'])) {
    $params[] = "i";
    $vars[] = '$status';
    $sql_search = 'SELECT m.*, u.premium, u.avatar FROM motorcycles m INNER JOIN users u ON u.id = m.userid WHERE status = ?';

    if (isset($_GET['manufacturer_search']) && $_GET['manufacturer_search'] !== "") {
        $manufacturer_search = $_GET['manufacturer_search'];
        $sql_search .= " AND manufacturer LIKE ?";
        array_push($params, 's');
        array_push($vars, '$manufacturer_search');
    }

    if (isset($_GET['min_price']) && $_GET['min_price'] !== "") {
        $min_price = $_GET['min_price'];
        $sql_search .= " AND price >= ?";
        array_push($params, 'i');
        array_push($vars, '$min_price');
    }

    $sql_search .= " ORDER BY u.premium DESC LIMIT ?, ?";
    array_push($params, 'ii');
    array_push($vars, '$this_page_first_result', '$results_per_page');


    $stmt_search = $link->prepare($sql_search);
    $stmt_search->bind_param(implode("", $params), implode(",", $vars));
    $stmt_search->execute();
    $result = $stmt_search->get_result();
}

【问题讨论】:

  • 除非我弄错了,否则你应该在调用bind_paramimplode 时提供你想要在语句中准备的变量,但是会创建一个字符串。尝试以下操作; $stmt_search->bind_param(implode("", $params), ...$vars );
  • 是的,但问题是我们不知道用户在搜索中会使用多少个参数,所以我不能把所有变量都放在那里。有时用户只会使用 1 个输入,但有时会使用 4 个。我正在尝试使其动态化,但不知道如何将变量放在那里。
  • 您的编辑确实解决了问题。太感谢了。如果您将其写为答案,我可以接受。 :D

标签: php mysqli


【解决方案1】:

您应该单独提供您想要的变量作为bind_params 的最后一个参数,您所做的是创建一个包含所有变量的字符串并传递它。

改变

$stmt_search->bind_param(implode("", $params), implode(",", $vars));

$stmt_search->bind_param(implode("", $params), ...$vars );

PHP 将获取 $vars 数组中的所有条目,并将它们作为函数的单独参数传递。

有关这方面的更多信息,请参阅bind_paramDocumentation,PHP 引入了splat operator herehere 以及一些关于堆栈溢出的extra information

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多