php - 使用动态数量的 LIKE 条件构建 SELECT 查询作为 mysqli 准备语句

标签 php select mysqli prepared-statement sql-like

我正在尝试为用户输入编写准备好的语句。参数编号是可变的,取决于用户输入。 Oam 尝试此代码
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'];
        }
    }
}
    
当我print_r($inputArray) ,输出为:
Array ( [0] => ss [1] => my [2] => name ) 
错误日志中没有显示错误。
怎么了?

最佳答案

%环绕参数,而不是占位符。
我的代码片段将使用面向对象的 mysqli 语法,而不是您的代码演示的过程语法。
首先,您需要设置必要的成分:

  • WHERE 子句表达式——由 OR 分隔
  • 你的值的数据类型——你的值是字符串,所以使用“s”
  • 绑定(bind)到准备好的语句的参数

  • 我将把#2 和#3 组合成一个变量,以便使用 splat 运算符 (...) 进行更简单的“解包”。数据类型字符串必须是第一个元素,然后一个或多个元素将表示绑定(bind)值。
    作为逻辑包含,如果 WHERE 子句中没有条件,则使用准备好的语句没有任何好处;直接查询表即可。
    代码:( 100% 测试/成功代码 )
    $string = "my name";
    
    $conditions = [];
    $parameters = [''];
    foreach (array_unique(explode(' ', $string)) as $value) {
        $conditions[] = "name LIKE ?";
        $parameters[0] .= 's';
        $parameters[] = "%{$value}%";
    }
    // $parameters now holds ['ss', '%my%', '%name%']
    
    $query = "SELECT * FROM info";
    if ($conditions) {
        $stmt = $conn->prepare($query . ' WHERE ' . implode(' OR ', $conditions));
        $stmt->bind_param(...$parameters);
        $stmt->execute();
        $result = $stmt->get_result();
    } else {
        $result = $conn->query($query);
    }
    foreach ($result as $row) {
        echo "<div>{$row['name']} and whatever other columns you want</div>"; 
    }
    

    对于任何寻找类似动态查询技术的人:
  • SELECT with dynamic number of values in IN()
  • INSERT dynamic number of rows with one execute() call
  • 关于php - 使用动态数量的 LIKE 条件构建 SELECT 查询作为 mysqli 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51010509/

    相关文章:

    php - mysql 连接出现不推荐错误

    php - mysql : updating existing column using the column value in prepared query

    php - PHP获取PATCH请求数据

    php - 如何在 wordpress 中更改链接的 Logo ?

    php - 将数据 PHP 多维数组传递到 Javascript

    mysql - SQL 查询以匹配具有/不具有所有定义的多对多匹配项的记录

    jquery - 根据选择启用/禁用其他元素

    MySQL 获取同一个表内的差异

    php - 未知列 'STRICT_ALL_TABLES,' 设置 CodeIgniter DB 连接

    php - 如何使 PHP 网站同时支持 HTTP 和 HTTPS?