尝试在数据库中保存子值时,变量数与准备语句中的参数数不匹配

Number of variables doesn't match number of parameters in prepared statement while trying to save son values in db

我知道这是一个老问题,我已经找到了很多答案,但其中 none 有效。我真的需要帮助。

我正在解码一些 JSON,然后需要用新值更新我的数据库。

$id = $_POST["user_id"];
$facebook = $_POST["facebookId"];
$userInfos = $_POST["userInfos"];

$json = json_decode($userInfos, true);

        $coins = $json['coins'];
        $score =  $json['score'];
        $highest_coins = $json['highest_coins'];
        $upgrades = $json['upgrades'];
> line 89
        $sql = "UPDATE app_user SET coins = ?, score = ?, highest_coins = ? WHERE user_id = ?";
        $stmt->bind_param('iiis',$coins,$score,$highest_coins,$id);
        $nb = $stmt->execute();
line 99
            foreach(is_array($upgrades) as $person => $value)
            {
                $character_id =  $value['character_id'];
                $upgrade_id =  $value['upgrade_id'];
                $upgrade_level =  $value['upgrade_level'];

                $sql = "UPDATE user_upgrades SET upgrade_level = ? WHERE facebook_id = ? AND character_id = ? AND upgrade_id = ?";
                $stmt->bind_param('isii', $upgrade_level, $facebook, $character_id, $upgrade_id);
                $nb = $stmt->execute();
            } 

Number of variables doesn't match number of parameters in prepared statement on line 89

Invalid argument supplied for foreach() on line 99

非常感谢任何帮助。提前谢谢你。

is_array($upgrades) returns bool,你需要数组

试试这个方法

mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

您正在创建一个名为 $sql 的变量,但不要使用它。我们没有看到您如何初始化 $stmt。你需要这样的东西:

$stmt = $mysqli->prepare($sql);

适用于您的情况:

    $sql = "UPDATE app_user SET coins = ?, score = ?, highest_coins = ? WHERE user_id = ?";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('iiis',$coins,$score,$highest_coins,$id);
    $nb = $stmt->execute();

并在您的 foreach 中删除 is_array,其中 returns 来自您的 arrayboolean