php - 动态准备语句(绑定(bind)参数错误)

标签 php mysql prepared-statement

我试图将参数添加到我准备好的语句中,查询和数组看起来正确。但是会触发“类型定义字符串中的元素数量与绑定(bind)变量的数量不匹配”错误。

$sql = 'SELECT * FROM `feed` ';
$types = array();
$params = array();

if( isset($_GET['p']) ) {
  $page = $_GET['p'];
}
else {
  $page = 0;
}

if( isset($_GET['q']) ) {
  $sql .= 'WHERE `title` LIKE ? ';
  $search = $_GET['q'];
  array_push($types, 's');
  array_push($params, $search);
}

$sql .= 'ORDER BY `time` DESC LIMIT ?, 6';

array_push($types, 'i');
array_push($params, $page);

$stmt = $mysqli->prepare($sql);
$params = array_merge($types, $params);

$refs = array();
foreach($params as $key => $value)
  $refs[$key] = &$params[$key];

call_user_func_array(array($stmt, 'bind_param'), $refs);

(从服务器打印)

查询:SELECT * FROM feed WHERE title LIKE ? ORDER BY 时间 DESC LIMIT ?, 6

数组合并:

Array
(
    [0] => s
    [1] => i
    [2] => word
    [3] => 0
)

谢谢。

最佳答案

我的理解是,第一个参数“types”是参数类型的字符串,而不是数组。因此示例的参数列表应如下所示:

Array
(
    [0] => si
    [1] => word
    [2] => 0
)

这是未经测试的代码:但 implode 应该从 '$types' 数组中执行我们想要的操作

$strTypes = implode('', $types);

我稍后会检查。

关于php - 动态准备语句(绑定(bind)参数错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317078/

相关文章:

php - session 混淆 PHP

mysql - 限制 mysql 中特定数据库列的索引大小

mysql - SQL Distinct 子句不起作用?

php - 多次准备一个语句不好吗?

javascript - SweetAlert2 弹出窗口在 .php 文件中不起作用

PHP 良好实践 - Echo 用法

mysql - Laravel 5 - 将 MySQL 数据从开发传输到暂存/生产

java - 使用PreparedStatements - 使用多个参数(未知数量)进行更新

php - 选择查询的准备语句

php - 让javascript在外部链接点击时运行?