извлечение данных объекта в массив приводит к ошибке: Uncaught Error: невозможно использовать объект типа stdClass в качестве массива - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в php pdo, и я пытаюсь создать турнирную систему, которая случайным образом генерирует совпадения при закрытии регистрации.я продолжаю получать эту ошибку Uncaught Error: Невозможно использовать объект типа 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 Ответ

1 голос
/ 21 июня 2019

Я почти уверен, что ошибка была выдана, прежде чем пытаться использовать стиль извлечения 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, но причина возврата объектов вместо ассоциативных массивов будет очень странной, поскольку вы уже запросили стиль выборки из массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...