如何使用准备好的语句动态绑定参数?

维奈

我正在尝试为用户输入编写准备好的语句。参数号是可变的,取决于用户输入。我正在尝试此代码

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语法,而不是您的代码演示的过程语法。

首先,您需要设置必要的要素:

  1. WHERE子句表达式-用OR分隔
  2. 值的数据类型-您的值是字符串,因此请使用“ s”
  3. 要绑定到准备好的语句的参数

我将#2和#3合并到一个变量中,以便使用splat运算符(...进行更简单的“拆包” 数据类型字符串必须是第一个元素,然后一个或多个元素将代表绑定值。

作为逻辑上的包含,如果您的WHERE子句中没有条件,那么使用预处理语句没有任何好处;只是直接查询表。

代码:(100%已测试/成功代码

$string = "my name";

$conditions = [];
$parameters = [''];
foreach (array_unique(explode(' ', $string)) as $value) {
    $conditions[] = "name LIKE ?";
    $parameters[0] .= 's';
    $parameters[] = "%{$value}%";
}

$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>"; 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何记录Hibernate绑定到准备好的语句的值?

如何在MySQL中使用准备好的语句创建动态列?

Sqlx使用准备好的语句获取

如何使用pgx控制准备好的SQL语句中的参数类型?

绑定消息提供1个参数,但准备好的语句“”需要2个

错误:绑定消息提供1个参数,但准备好的语句“”需要0

如何使用准备好的语句更新阵列的单个元素?

错误{错误:绑定消息提供11个参数,但准备好的语句“”需要12个参数

如何为libpqxx / C ++在准备好的SQL语句中将引号内的参数绑定

如何使用准备好的语句选择IP地址

在绑定参数中遍历数组-准备好的语句

绑定消息提供2个参数,但准备好的语句“”需要1个

如何使用sqlite_bind_text将文本正确绑定到SQLite准备好的语句

如何在Android sqlite中使用准备好的语句?

在准备好的语句参数中使用表列

如何在PDO准备好的语句的标记参数中使用句点?

ProtocolViolation:错误:绑定消息提供0个参数,但准备好的语句“”需要1个

PDO多参数绑定准备好的语句

PHP-如何记录准备好的语句作为参数

使用准备好的语句写入 mysql

mysql(非常)动态准备好的语句

如何使用准备好的语句从 mysql 中获取多行

准备好的语句 - 使用参数指定表名

准备好的语句无法识别 Postgres JS 绑定上的任何参数

使用准备好的语句构建 PDO 动态查询

如何使用准备好的 stmt pdo 提供分页参数?

使用 Knex.js 的批量插入错误:绑定消息提供 X 参数,但准备好的语句“”需要 Y

如何修复 Postgres 错误:绑定消息提供 8 个参数,但准备好的语句“”需要 6 个

在 PHP PDO 中,如何在不知道名称的情况下绑定准备好的语句的命名参数?