我是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');
}
?>
这段代码的结果应该是,当我关闭锦标赛的注册时。注册玩家应以随机顺序插入游戏桌,以便自动生成与比赛的匹配项。
答案 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
,但是返回对象而不是关联数组的原因会很奇怪,因为您已经请求了数组获取样式。