Poznaję rozszerzenie PDO i chciałbym zwrócić wynik zapytania jako tablicę obiektów o określonej klasie, którą stworzyłem. Niestety samemu nie potrafię dojść do rozwiązania więc proszę o drobną pomoc :)
Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: could not call class constructor in C:\xampp\htdocs\tutorial\09\DatabaseManager.php on line 26
Fatal error: Uncaught ArgumentCountError: Too few arguments to function Task::__construct(), 0 passed and exactly 3 expected in C:\xampp\htdocs\tutorial\09\Task.php:8 Stack trace: #0 [internal function]: Task->__construct() #1 C:\xampp\htdocs\tutorial\09\DatabaseManager.php(26): PDOStatement->fetchAll(8, 'Task') #2 C:\xampp\htdocs\tutorial\09\index.php(9): DatabaseManager->executeQuery('SELECT * FROM t...') #3 {main} thrown in C:\xampp\htdocs\tutorial\09\Task.php on line 8
Task.php
<?php
class Task {
private $id;
private $description;
private $completed;
public function __construct(int $id, string $description, bool $completed) {
$this->id = $id;
$this->description = $description;
$this->completed = $completed;
}
public function complete() {
$this->completed = true;
}
public function isCompleted(): bool {
return $this->completed;
}
public function getDescription(): string {
return $this->description;
}
public function getCompleted(): string {
return $this->completed ? 'yes' : 'no';
}
}
DatabaseManager.php
<?php
class DatabaseManager {
private $dsn;
private $username;
private $password;
private $pdo;
public function __construct(string $dsn, string $username, string $password) {
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
}
public function connect() {
try {
$this->pdo = new PDO($this->dsn, $this->username, $this->password);
} catch (PDOException $e) {
$e->getMessage();
}
}
public function executeQuery(string $query): array {
$statement = $this->pdo->prepare($query);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_CLASS, 'Task');
return $result;
}
}
index.php
<?php
require 'Task.php';
require 'DatabaseManager.php';
$databaseManager = new DatabaseManager('mysql:host=127.0.0.1;dbname=mytodo;', 'root', '');
$databaseManager->connect();
$tasks = $databaseManager->executeQuery('SELECT * FROM todos');
require 'index.view.php';
index.view.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>09</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<style>
body { padding: 2.5rem; }
</style>
</head>
<body>
<main class="container">
<pre><?php var_dump($tasks); ?></pre>
<pre><?= $tasks[0]->getDescription(); ?></pre>
<pre><?= $tasks[0]->getCompleted(); ?></pre>
</main>
</body>
</html>
Struktura tabeli todos