mysqli_stmt_bind_param用于搜索

时间:2018-01-24 19:14:59

标签: php mysql search prepared-statement

您好我需要将已经正在运行的查询更改为预备语句。我无法弄清楚如何让mysqli_stmt_bind_param();正确。我准备好的陈述是......

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND";
foreach ($terms as $term) { // add the search term..
    $query .= " word=? OR"; // STUCK HERE
} 
$query = substr($query, 0, -3); // remove last OR.
    $query .= " GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);
    mysqli_stmt_bind_param($stmt, 's', $term); // STUCK HERE
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    mysqli_stmt_bind_result($stmt, $user_id, $first_name);
    mysqli_stmt_fetch($stmt);`

请任何帮助都会很棒, 感谢。

3 个答案:

答案 0 :(得分:1)

你真的不需要第二次循环你的术语,只需简单地传递一堆“word =?OR word =?OR word =?”使用array_fill()你可以完成任务。

真正的问题在绑定params时发挥作用。您可以使用str_repeat()生成一个字符串,其中'ssssss'...等于要附加的术语数,然后使用Argument unpacking$terms数组作为参数附加到{{ 1}}。

mysqli_stmt_bind_param()

答案 1 :(得分:0)

我建议您使用以下内容更改$query建筑物:

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND (";
foreach ($terms as $term) {
    $query .= "word=? OR ";
}
$query = rtrim($query, " OR "); // remove last OR .
$query .= ") GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);

我在这里做了一些更改,例如将substr()替换为rtrim()(因为它是更短的语法,更具动态性),修复间距,并放置所有{ {1}}和括号内。

至于你的实际参数绑定,我建议改为:

word=?

更改包括使用str_repeat()生成一串“s”,其长度与//use str_repeat to create a string of "s"'s equal to the amount of terms there are. //use variable unpacking to unpack all of the terms into the function. mysqli_stmt_bind_param($stmt, str_repeat("s", count($terms)), ...$terms); 中的术语数相同。我还使用variable unpacking(在PHP 5.6版中添加)来解压缩要绑定到查询的所有变量。

注意:如果您使用的是早于5.6的PHP版本,我建议您更新,但变量解包也无效。这是一个替代方案,只需将您的$terms替换为:

mysqli_stmt_bind_param()

这利用call_user_func_array()允许您解压缩变量。 PHP 5.6版中添加的变量打包基本上只是这个旧函数的糖语法。

答案 2 :(得分:0)

您可以构建一个数组并将它们组合在Repo.get(Resource, 1) |> Repo.preload(:association, where: [deleted_at == nil]) 上。然后使用一系列参数调用OR

mysqli_stmt_bind_param

我打算将此作为$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND"; foreach ($terms as $term) { $or[] = " word=?"; } $query .= implode("OR ", $or); $query .= " GROUP BY users.user_id ORDER BY users.first_name DESC"; $stmt = mysqli_prepare($dbc, $query); call_user_func_array("mysqli_stmt_bind_param", array_merge(array($stmt, str_repeat("s", count($terms)), $terms)); 的替代编辑,但FrankerZ将其作为答案的一部分:

foreach