Fatal error: Allowed memory

Default
,

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

4 Réponse

40917
,

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 ?

Default
,

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

Default
,

Si quelqu'un à d'autres idées du coup je suis preneur ;)

220023
,

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.