我正在尝试为用户输入编写准备好的语句。参数编号是可变的,取决于用户输入。我在试这个密码
php代码:
$string = "my name";
$search_exploded = explode( " ", $string );
$num = count( $search_exploded );
$cart = array();
for ( $i = 1; $i <= $num; $i ++ ) {
$cart[] = 's';
}
$str = implode( '', $cart );
$inputArray[] = &$str;
$j = count( $search_exploded );
for ( $i = 0; $i < $j; $i ++ ) {
$inputArray[] = &$search_exploded[ $i ];
}
print_r( $inputArray );
foreach ( $search_exploded as $search_each ) {
$x ++;
if ( $x == 1 ) {
$construct .= "name LIKE %?%";
} else {
$construct .= " or name LIKE %?%";
}
}
$query = "SELECT * FROM info WHERE $construct";
$stmt = mysqli_prepare( $conn, $query );
call_user_func_array( array( $stmt, 'bind_param' ), $inputArray );
if ( mysqli_stmt_execute( $stmt ) ) {
$result = mysqli_stmt_get_result( $stmt );
if ( mysqli_num_rows( $result ) > 0 ) {
echo $foundnum = mysqli_num_rows( $result );
while( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) {
echo $id = $row['id'];
echo $name = $row['name'];
}
}
}
当我打印r$inputarray时,输出是这样的:
Array ( [0] => ss [1] => my [2] => name )
错误日志中没有显示错误。我在这里干什么?请告诉我。
2条答案
按热度按时间wixjitnu1#
这个
%
环绕参数,而不是占位符。我的代码片段将使用面向对象的mysqli语法,而不是代码演示的过程语法。
首先,您需要设置必要的成分:
where子句表达式——用or分隔
值的数据类型--值是字符串,所以使用“s”
要绑定到已准备语句的参数
我将把#2和#3组合成一个变量,以便用splat运算符更简单地“解包”(
...
). 数据类型字符串必须是第一个元素,然后一个或多个元素将表示绑定值。作为逻辑包含,如果where子句中没有条件,那么使用预先准备好的语句是没有好处的;直接查询表即可。
代码:(100%测试/成功代码)
对于寻找类似动态查询技术的人:
SELECT
中的值的动态数目IN()
INSERT
一行的动态行数execute()
呼叫vs91vp4v2#
编写一个通用查询处理程序,并将查询、参数数组和参数类型列表传递给它。获取结果或消息的数组。下面是我自己的mysqli个人版本(我主要使用pdo,但也为此设置了类似的函数)。对插入、更新和删除执行相同的操作。然后只需维护一个库并将其用于您所做的一切:)请注意,如果您从这个库开始,您可能希望在处理连接错误等方面做得更好。