将对象数据提取到数组中会出现错误:未捕获的错误:无法将类型为stdClass的对象用作数组

时间:2019-06-21 07:11:48

标签: php pdo

我是php pdo的新手,我试图制作一个Tournamentcms,它通过关闭注册来随机生成比赛。我不断收到这个错误 未捕获的错误:无法将类型为stdClass的对象用作数组。 有谁知道如何解决这个问题,或者知道我做错了什么? 感谢所有帮助。

我尝试切换获取方法,但未进行任何更改。

<?php
include 'db.php';
?>
</head>


<?php
if(isset($_GET["id"])){
   $stmt = $conn->prepare("SELECT * FROM registration WHERE tournament_id = :id 
   ORDER BY RAND()");
   $stmt->execute([":id" => $_GET["id"]
]);

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$values = array();

$amount = count($result);

for($i = 0; $i < $amount; $i += 2)
{
$values[] = '(' . $result[$i]['id'] . ',' . $result[$i + 1]['id'] . ', :tournament_id)';
}

$values = implode(',', $values);

$stmt = $conn->prepare("insert into game(player1, player2, tournament_id) values ($values)");

$stmt->execute([
    ":tournament_id" => $_GET["id"]
]);

$stmt = $conn->prepare('update tournament set active = 1 where id = :id');
$stmt->execute([
   ':id' => $_GET['id']
]);

header('Location:index.php');

}

?>

这段代码的结果应该是,当我关闭锦标赛的注册时。注册玩家应以随机顺序插入游戏桌,以便自动生成与比赛的匹配项。

1 个答案:

答案 0 :(得分:1)

我很确定在尝试使用PDO::FETCH_ASSOC提取样式之前已引发错误。从fetchAll方法的文档中:

  

fetch_style控制PDOStatement::fetch()中记录的返回数组的内容。默认值为PDO::ATTR_DEFAULT_FETCH_MODE(默认为PDO::FETCH_BOTH

像在代码中一样使用它不会导致该错误。如果仍然这样做,则意味着错误可能会在其他地方引发。您可以尝试一下:

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$values = [];

while (!empty($results)) {
    $firstPlayer = array_shift($results);
    $secondPlayer = array_shift($results);

    if ($firstPlayer !== null && $secondPlayer !== null) {
        $values[] = '(' . $firstPlayer['id'] . ',' . $secondPlayer['id'] . ', :tournament_id)';
    }
}

$values = implode(',', $values);

// Please note that you must not wrap the resulted `$values` by brackets
$stmt = $conn->prepare("insert into game(player1, player2, tournament_id) values $values");

如果仍然抛出错误,请尝试$firstPlayer->id$secondPlayer->id,但是返回对象而不是关联数组的原因会很奇怪,因为您已经请求了数组获取样式。