Bonjour,
Voila je rencontre un petit problème avec mon code.
Ce que je fais
Je cherche à ajouter une reservation dans un agenda. (ref : Tuto Calendrier ajout d'evenements).
J'ai essayé de reprendre au mieux la logique de gestion des "events" et je l'ai adapté à la partie "RESAS" qui reserve une plage de date.
Mon seul gros freestyle est dans la fonction compare date ou j'ai fait comme j'ai pu pour obenir la comparaison entre 'date déja reservée' et 'date en cours de reservation'. Sinon c'est à peu près la meme logique d'execution que le tuto.
Cependant j'ai ce message d'erreur qui apparait lors de mon insert into sur la reservation :
aroundFatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in /Applications/MAMP/htdocs/agenda/src/Calendar/Resas.php on line 57around
Je bloque sur cette erreur, dans les forums on parle d'une ligne à ajouter à la racine du fichier ("memory_limit 528mo ...1000 5000 ..."). Cette solution ne fonctionne pas.
C'est un mystère pour moi ! l'erreur apparait au moment de l'insert into
(mes champs ne sont pas lourds, 1 table de 4 colonnes de texte et date c'est tout) .
Ma reservation s'ajoute à ma base de donnée, et, lors de la redirection vers l'index le message d'erreur apparait
MAIS quand j'ajoute manuelement une reservation directement sur la base et bien pas d'erreur
Resas.php
namespace Calendar;
class Resas {
private $pdo;
public function __construct(\PDO $pdo){
$this->pdo = $pdo;
}
// SELECT resevation Début et fin
public function getResasBetween(){
$sql = " SELECT * FROM resas
WHERE start_Res
BETWEEN start_Res
AND end_Res
ORDER BY `resas`.`start_Res` ASC
";
$statement = $this->pdo->query($sql);
$result = $statement->fetchAll();
return $result;
}
// RETURN resevation Day by Day
public function getResasBetweenByDay(){
// Execute fonct° : on stock Date de Début/fin
$resas = $this->getResasBetween();
// on stock les jours dans un tableau vide
$days = [];
// BOUCLE sur les évènements
foreach ($resas as $resa){
// on stock le Début et fin de la reservation
$debut = $resa['start_Res'];
$fin = $resa['end_Res'];
for($i = $debut; $i < $fin; $i++):
// explode — Scinde une chaîne de caractères en segments
$date = explode(' ', $i)[0];
if (!isset($days[$date])){
$days[$date] = [$resa];
}
else {
$days[$date][] = $resa;
}
endfor;
}
return $days;
}
// SELECT resevation WHERE id
public function getResas(){
$id= $_GET['id_Res'];
$sql = " SELECT * FROM resas
WHERE id_Res = $id
";
$statement = $this->pdo->query($sql);
$result = $statement->fetchAll();
return $result;
}
// COMPARE resevation and post reservation
public function compareDates(){
// Recup Reservations
$resas = $this->getResasBetween();
if(!empty($resas))
$error_Res= [];
// Affichage Reservations -> Debut/Fin
foreach ($resas as $resa){
// Stock Dates
$strRes = new \DateTime($resa['start_Res']);
$endRes = new \DateTime($resa['end_Res']);
// On boucle pour obtenir toutes les dates réservés
$tabRes = array_map(
function ($dt){
return $dt->format('Y-m-d');
},
iterator_to_array(new \DatePeriod($strRes, \DateInterval::createFromDateString('1 day'), $endRes))
);
if(!empty($_POST)){
$str = new \DateTime($_POST['debut']);
$end = new \DateTime($_POST['fin']);
$tabPost = array_map(
function ($dat){
return $dat->format('Y-m-d');
},
iterator_to_array(new \DatePeriod($str, \DateInterval::createFromDateString('1 day'), $end))
);
}
// Si dates pré-reservées && dates déja réservés
if(!empty($tabPost) && isset($tabPost) && !empty($tabRes) && isset($tabRes) ){
// On compare les deux tableaux (retourne les égalités)
$result = array_intersect($tabPost, $tabRes);
//$result = array_diff($tabPost, $tabRes);
if (!empty($result)){
$string = 'Désolé, ces dates sont déja réservées';
return $string;
}
}
}//endforeach
}//endif
}
public function hydrateRes($resas, $data){
$resas->setName($data['name']);
$resas->setPrenom($data['prenom']);
$resas->setNumber($data['number']);
$resas->setEmail($data['email']);
$resas->setStartRes($data['debut']);
$resas->setEndRes($data['fin']);
return $resas;
}
// INSERT INTO Edition des évènements wirh GETTER
public function createRes($resas){
$statement = $this->pdo->prepare(
" INSERT INTO resas ( name,prenom,nombre,email,start_Res,end_Res ) VALUES ( ?, ?, ?, ?, ?, ? ) ");
return $statement->execute([
$resas->getName(),
$resas->getPrenom(),
$resas->getNumber(),
$resas->getEmail(),
$resas->getStartRes(),
$resas->getEndRes()
]);
}
}
addResas.php**
require '../src/database.php';
require '../src/Calendar/Resa.php';
require '../src/Calendar/EventValidator.php';
$data = [
'debut' => $_GET['debut'] ?? date('Y-m-d'),
'fin' => $_GET['fin'] ?? date('Y-m-d')
];
$validator = new \App\Validator($data);
if (!$validator->validate('date','date')){
$data['debut'] = date('Y-m-d');
$data['fin'] = date('Y-m-d');
}
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST'){
$data = $_POST;
$validator = new Calendar\EventValidator();
$errors = $validator->validates_Res($_POST);
if(empty($errors)){
$resas = new Calendar\Resas(get_pdo());
$resas = $resas-> compareDates();
if(empty($resas)){
$update = new Calendar\Resas(get_pdo());
$upd = $update->hydrateRes( new Calendar\Resa(), $data);
db($upd);
$update->createRes($upd);
db($update);
// header('location: index.php?Reservation_Success=1');
// exit();
}
}
}
// INCLUDE VIEW
render( 'header', [ 'title' => 'Réservation'] );
include('../views/addResa.phtml');
render('footer');
Resa.php (setter getter)
<?php
namespace Calendar;
class Resa {
// initialisation des données de la réservation
// private $id_Res;
private $name;
private $prenom;
private $number;
private $mail;
private $startRes;
private $endRes;
// // GETER
// function getId_Res(): int {
// return $this->id_Res;
// }
function getName(){
return $this->name;
}
function getPrenom(){
return $this->prenom;
}
function getNumber(){
return $this->number;
}
function getEmail(){
return $this->mail;
}
function getStartRes(){
return $this->startRes;
}
function getEndRes(){
return $this->endRes;
}
// SETER
function setName(string $name){
$this->name = $name;
}
function setPrenom(string $prenom){
$this->prenom = $prenom;
}
function setNumber(string $number){
$this->number = $number;
}
function setEmail(string $mail){
$this->mail = $mail;
}
function setStartRes(string $startRes){
$this->startRes = $startRes;
}
function setEndRes(string $endRes){
$this->endRes = $endRes;
}
}
Ce que je veux
Voilà avant tout merci pour ce tuto car il est super ! J'ai bien compris la logique et tes explications, jusqu'à ce que je tombe sur ce souci.
J'aimerais avoir un indice , une piste de reflexion , un avis serieux sur mon probleme.... pour avancer sur la resolution de celui-ci qui me bloque depuis 3 jours maintenant.
Si vous pouvez m'aider je vous remercie d'avance.
A votre disposition si besoin de plus de code ou de plus d'explication
Merci d'avance
Florian