De variabele $exemplaren staat geregistreerd als string, ookal heb ik deze aangegeven als integer. Ik heb deze simpelweg op deze manier aangegeven.
$exemplaren = 0;
Maar ik krijg steeds de volgende foutmelding. Zoals je ziet staat het steeds tussen aanhalingstekens. Hoe geef ik dit op een correcte manier aan?
Fatal error: Uncaught TypeError: Film::create(): Argument #3 ($exemplaren) must be of type int, string given, called in /opt/lampp/htdocs/Videotheek/App/Data/FilmDAO.php on line 33 and defined in /opt/lampp/htdocs/Videotheek/App/Entities/Film.php:18 Stack trace: #0 /opt/lampp/htdocs/Videotheek/App/Data/FilmDAO.php(33): Film::create(30, 'Kill Bill', '1') #1 /opt/lampp/htdocs/Videotheek/App/Data/DVDDAO.php(48): FilmDAO->getById(30) #2 /opt/lampp/htdocs/Videotheek/App/Business/DVdbeheer.php(18): DvdDAO->create('0', 30, '0') #3 /opt/lampp/htdocs/Videotheek/App/voegdvdtoe.php(16): DvdService->voegNieuweDvdToe(55, 30, '0') #4 {main} thrown in /opt/lampp/htdocs/Videotheek/App/Entities/Film.php on line 18
<?php
//Entities/Film.php
declare(strict_types = 1);
class Film {
private static $idMap = array();
private int $id;
private string $titel;
private int $exemplaren;
public function __construct(int $id, string $titel, int $exemplaren ) {
$this->id = $id;
$this->titel = $titel;
$this->exemplaren = $exemplaren;
}
public static function create(int $id, string $titel, int $exemplaren){
if (!isset(self::$idMap[$id])) {
self::$idMap[$id] = new Film($id, $titel, $exemplaren);
}
return self::$idMap[$id];
}
public function getId(): int {
return $this->id;
}
public function getTitel() : string{
return $this->titel;
}
public function getExemplaren() : int {
return $this->exemplaren;
}
public function setTitel(string $titel) {
$this->titel = $titel;
}
public function setExemplaren(int $exemplaren) {
$this->exemplaren = $exemplaren;
}
}
?>
in functie in DAO
<?php
public function create(string $titel, int $exemplaren) : Film {
$sql = "insert into mvc_films (titel, exemplaren) values (:titel, :exemplaren)" ;
$dbh = new PDO(DBConfig::$DB_CONNSTRING, DBConfig::$DB_USERNAME, DBConfig::$DB_PASSWORD);
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':titel' => $titel, ':exemplaren' => $exemplaren));
$id = $dbh->lastInsertId();
$film = new Film((int)$id, $titel, $exemplaren);
$dbh = null;
return $film;
}?>
businesslaag
<?php
public function voegNieuweFilmToe(string $titel, int $exemplaren) {
$filmDAO = new FilmDAO();
$filmDAO->create($titel, $exemplaren);
} ?>
Dit laatste '1' klopt dus niet. volg dus de rest van de trace om te zien waar deze string '1' vandaan komt.
?Onbekende gebruiker
11-02-2022 08:56
gewijzigd op 11-02-2022 08:56
Als je even meekijkt naar de foutmelding, het gaat mis in:
/opt/lampp/htdocs/Videotheek/App/Data/FilmDAO.php op regel 33
Hier staat:
Film::create(30, 'Kill Bill', '1').
Dat gaat niet goed, omdat PHP afdwingt dat het een integer moet zijn vanwege de functiedefinitie van class Film in de regel
public static function create(int $id, string $titel, int $exemplaren) {
Regel 33 van de foutmelding correspondeert met regel 9 in je tweede code snippet van 'functie DAO' (of wat het ook is).
Je zou op basis van die definitie verwachten dat $exemplaren een integer is, vanwege de functiedefinitie waar het in zit:
public function create(string $titel, int $exemplaren) : Film {
Het gaat mis met PDO::execute(). Als je de handleiding leest op https://www.php.net/manual/en/pdostatement.execute.php staat hier "An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR."
Dus moet je PDO vertellen dat je een integer opgeeft. Zie hiervoor voorbeeld #1 in de handleiding.