我有一个函数可以帮助我对数据库进行预备调用,到目前为止,我从未遇到过问题,这是以下错误:
警告:mysqli_stmt :: bind_result():绑定变量的数量与/var/www/file.php中准备好的语句中的字段数量不匹配
这是我的职责
function GetPrepared($SQL, $Types = null, $Params = null) {
global $dbs;
# create a prepared statement
$Statement = $dbs->prepare($SQL);
# bind parameters for markers
# but this is not dynamic enough...
//$stmt->bind_param("s", $parameter);
if (!empty($Statement)) {
if ($Types && $Params) {
$bind_names[] = $Types;
for ($i = 0; $i < count($Params); $i++) {
$bind_name = 'bind' . $i;
$$bind_name = $Params[$i];
$bind_names[] = &$$bind_name;
}
$return = call_user_func_array(array($Statement, 'bind_param'), $bind_names);
}
# execute query
$Statement->execute();
# these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
$meta = $Statement->result_metadata();
if (!empty($meta)) {
while ($field = $meta->fetch_field()) {
$var = $field->name;
$$var = null;
$parameters[$field->name] = &$$var;
}
call_user_func_array(array($Statement, 'bind_result'), $parameters);
while ($Statement->fetch()) {
return $parameters;
//print_r($parameters);
}
}
}
return false;
# close statement
$Statement->close();
}
这是我尝试运行的查询,但上面得到了该错误
$OptionData = GetPrepared("select * from `options` join `fields` on `fields`.`FieldID`=`options`.`FieldID` where `CompanyID`=? and (replace(`options`.`Name`, ' ', '') =? or `Slug`=?);", 'sss', array($_CompanyID, $_GET['id'], $_GET['id']));
$_GET['id']
的值是文本,$_CompanyID
的值是Guid,两者都被设置了,因为在调用之前我可以回显它们的两个内容。另外,如果我继续进行此查询并将其带入Workbench,并用其值替换问号,则该查询工作正常。我想念什么?
由于该代码以前可以工作,并且您没有进行任何更改,所以问题一定来自数据库结果。 options
和fields
表现在很可能具有公共字段(例如id
或name
),这导致$parameters
数组的末尾项目少于列,因为$parameters[$field->name] = &$$var;
分配不能处理具有相同名称的多个字段。