您好我需要将已经正在运行的查询更改为预备语句。我无法弄清楚如何让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);`
请任何帮助都会很棒, 感谢。
答案 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