PHP 在 bind_param 内爆
PHP implode in bind_param
我正在尝试在 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_params
的最后一个参数,你正在做的是创建一个包含所有变量的字符串并传递它。
改变
$stmt_search->bind_param(implode("", $params), implode(",", $vars));
至
$stmt_search->bind_param(implode("", $params), ...$vars );
并且 PHP 将获取 $vars
数组中的所有条目并将它们作为函数的单独参数传递。
有关这方面的更多信息,请参阅堆栈溢出 Documentation of bind_param
, PHP's introduction of the splat operator
here and here and some 。
我正在尝试在 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_params
的最后一个参数,你正在做的是创建一个包含所有变量的字符串并传递它。
改变
$stmt_search->bind_param(implode("", $params), implode(",", $vars));
至
$stmt_search->bind_param(implode("", $params), ...$vars );
并且 PHP 将获取 $vars
数组中的所有条目并将它们作为函数的单独参数传递。
有关这方面的更多信息,请参阅堆栈溢出 Documentation of bind_param
, PHP's introduction of the splat operator
here and here and some