Bonjour,
Voila je rencontre un petit problème avec mon code.
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;
}
}
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
bonjour.
as-tu fais un phphinfo pour voir si la modification a bien été prise en compte ?
as-tu redémarrer le serveur pour appliquer la modif ?
Bonjour Carouge10 et merci pour ton aide.
J'avoue que je viens d'aprendre une fonctionnalité ! Merci ;)
je mets php info() sur l'index et/ou sur addResas.php
je vois que dans la partie CORE la memoire limit passe de 128mo à 256mo quand je place ce code /ini_set('memory_limit', '256M');
Cependant je remarque que le tableau phpinfo() integre 2 colonnes , la 1ere -> Local vue = 256mo , la 2eme-> Master view 128mo
De plus en changeant la memory-limit le message d'erreur change niveau des valeurs en bytes :
plus j'augment la memory-limite plus ce chiffre grimpte mais le beug perssiste ...
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4194312 bytes) in /Applications/MAMP/htdocs/agenda/src/Calendar/Resas.php on line 57
Tu va dans ton php.ini
et tu cherche memory_limit
. Tu remplace la valeur par défaut par -1
. Grace à celà la mémoire utilisée par PHP est illimitée.