Php mysqli_stmt::bind_param():变量与参数数量不匹配

Php mysqli_stmt::bind_param():变量与参数数量不匹配,php,mysql,mysqli,Php,Mysql,Mysqli,当我试图执行我的代码时,我得到了错误: mysqli_stmt::bind_param:变量的数量与prepared语句中的参数数量不匹配 我的目标是:通过筛选所需的列并将其添加到数组中,从数据库表中提取信息 我已经搜索了同一个错误的答案,但提供的解决方案(如使用“?”)已经实现 mydboperation.php function getPersonChanges_made($login_token){ $stmt = $this->con->prepare("SE

当我试图执行我的代码时,我得到了错误: mysqli_stmt::bind_param:变量的数量与prepared语句中的参数数量不匹配

我的目标是:通过筛选所需的列并将其添加到数组中,从数据库表中提取信息

我已经搜索了同一个错误的答案,但提供的解决方案(如使用“?”)已经实现

mydboperation.php

function getPersonChanges_made($login_token){
        $stmt = $this->con->prepare("SELECT id, first_name, last_name, login_token, time_started, time_ended, todays_worktime FROM changes_made WHERE login_token = ? ");
        $stmt->bind_param("s", $login_token);
        $stmt->execute();
        $arrs = array(); 

        while($stmt->fetch()){
            $arr  = array();
            $arr['id'] = $id; 
            $arr['first_name'] = $first_name; 
            $arr['last_name'] = $last_name; 
            $arr['login_token'] = $login_token; 
            $arr['time_started'] = $time_started;
            $arr['time_ended'] = $time_ended;
            $arr['todays_worktime'] = $todays_worktime;

            array_push($arrs, $arr); 
        }

        return $arrs;  
    }
这是我的Api.php

case 'getpersonchanges_made':
                 isTheseParametersAvailable(array('login_token'));
                $db = new DbOperation();
                $result = $db->getPersonChanges_made(
                     $_POST['login_token']
                );

                if($result){
                    $response['error'] = false; 
                    $response['message'] = 'success';
                    $response['arrs'] = $db->getPersonChanges_made($login_token);
                }else{
                    $response['error'] = true; 
                    $response['message'] = 'error';
                }
                break;

您只需要绑定一个参数,因为查询中只有一个占位符:

    $stmt->bind_param("s",  $login_token);

执行前必须先绑定。您在执行后绑定,但执行不起作用

$stmt->bind_param("s", $login_token);
$stmt->execute();
用于逐行获取数据并构建$ARR

有关更多详细信息,请参阅。

您可能希望在执行准备好的语句后使用bind_result-将各个列指定为变量,以便稍后获取。使用单个占位符意味着您只需要将一个变量绑定为前面提到的输入参数

function getPersonChanges_made( $login_token=false ){

    $sql='select id, first_name, last_name, login_token, time_started, time_ended, todays_worktime from changes_made where login_token = ?';
    $stmt = $this->con->prepare( $sql );

    if( $stmt && $login_token ){
        $stmt->bind_param('s',$login_token);
        $res=$stmt->execute();

        if( $res ){

            $stmt->store_result();
            $stmt->bind_result( $id, $first_name, $last_name, $login_token, $time_started, $time_ended, $todays_worktime );
            $arrs=[];

            while( $stmt->fetch() ){
                $arr=[];

                $arr['id'] = $id; 
                $arr['first_name'] = $first_name; 
                $arr['last_name'] = $last_name; 
                $arr['login_token'] = $login_token; 
                $arr['time_started'] = $time_started;
                $arr['time_ended'] = $time_ended;
                $arr['todays_worktime'] = $todays_worktime;

                array_push($arrs, $arr);                
            }
            $stmt->free_result();
            $stmt->close();

            return $arrs;
        }
    }
    return false;
}

你为什么要把所有的东西都绑起来?您在where子句中只使用了一个用户输入,因此在BindingView中立即使用,并按照nacho和您的建议进行了更改,但是$result结果为false,我什么也得不到。我在用PostmanDo测试你设置过$login\u令牌吗?看起来应该是$\u POST['login\u token']或$login\u token=$\u POST['login\u token']。这也是离题的帖子,你有4个答案,已经解决了这个问题我试过了,这应该已经添加了帖子,对不起。在本例中,$result以false结束,并向我提供错误消息did this change,现在我得到一个不同的错误。上面说我的id、名字和所有其他变量都没有定义。啊,你错过了$row。已更新,请立即查看!在这个解决方案中,它表示:未定义的变量:login_token;Api.php中的一个$响应['arrs']=$db->getPersonChanges\u生成$login\u令牌;您确定在调用$db->getPersonChanges\u生成$login\u令牌之前定义了$login\u令牌吗;?MH2K9,我。。。不确定,对不起。我认为我只需要更新原始帖子中的代码,然后我只需要使用Postman发布一个我想要测试的值。现在,它返回了一个空数组,但同时我也得到了一个错误,说我的登录令牌未定义,并指向Api.php$response['arrs']=$db->getPersonChanges\u made$login\u token;在这个解决方案中,它表示:未定义的变量:login_token;Api.php中的一个$响应['arrs']=$db->getPersonChanges\u生成$login\u令牌;在这种情况下,您的原始代码肯定会遇到相同的错误?
function getPersonChanges_made( $login_token=false ){

    $sql='select id, first_name, last_name, login_token, time_started, time_ended, todays_worktime from changes_made where login_token = ?';
    $stmt = $this->con->prepare( $sql );

    if( $stmt && $login_token ){
        $stmt->bind_param('s',$login_token);
        $res=$stmt->execute();

        if( $res ){

            $stmt->store_result();
            $stmt->bind_result( $id, $first_name, $last_name, $login_token, $time_started, $time_ended, $todays_worktime );
            $arrs=[];

            while( $stmt->fetch() ){
                $arr=[];

                $arr['id'] = $id; 
                $arr['first_name'] = $first_name; 
                $arr['last_name'] = $last_name; 
                $arr['login_token'] = $login_token; 
                $arr['time_started'] = $time_started;
                $arr['time_ended'] = $time_ended;
                $arr['todays_worktime'] = $todays_worktime;

                array_push($arrs, $arr);                
            }
            $stmt->free_result();
            $stmt->close();

            return $arrs;
        }
    }
    return false;
}