MySQL预处理语句绑定不匹配字段

问题描述 投票:1回答:1

我有一个函数可以帮助我对数据库进行预备调用,到目前为止,我从未遇到过问题,这是以下错误:

警告: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,并用其值替换问号,则该查询工作正常。我想念什么?

php mysqli prepared-statement
1个回答
1
投票

由于该代码以前可以工作,并且您没有进行任何更改,所以问题一定来自数据库结果。 optionsfields表现在很可能具有公共字段(例如idname),这导致$parameters数组的末尾项目少于列,因为$parameters[$field->name] = &$$var;分配不能处理具有相同名称的多个字段。

© www.soinside.com 2019 - 2024. All rights reserved.