8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Voila plus de 3 heures que je bûche sur cette requête... (à mon avis pas optimisée du tout mais j'ai de maigres connaissances avec le SQL...) :

SELECT COUNT(id_reservation) FROM `hertz_planning_charleville_reservations` 
WHERE 
('2013-01-12 00:00:00' >= `date_depart` AND '2013-01-12 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-12 00:00:00' >= `date_depart` AND '2013-01-12 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')
OR ('2013-01-13 00:00:00' >= `date_depart` AND '2013-01-13 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-13 00:00:00' >= `date_depart` AND '2013-01-13 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')
OR ('2013-01-14 00:00:00' >= `date_depart` AND '2013-01-14 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-14 00:00:00' >= `date_depart` AND '2013-01-14 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')
OR ('2013-01-15 00:00:00' >= `date_depart` AND '2013-01-15 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-15 00:00:00' >= `date_depart` AND '2013-01-15 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')
OR ('2013-01-16 00:00:00' >= `date_depart` AND '2013-01-16 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-16 00:00:00' >= `date_depart` AND '2013-01-16 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')
OR ('2013-01-17 00:00:00' >= `date_depart` AND '2013-01-17 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-17 00:00:00' >= `date_depart` AND '2013-01-17 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')


Elle peut se résumer comme cela (en retirant les mêmes comparatifs pour les différentes dates) :

SELECT COUNT(id_reservation) FROM `hertz_planning_charleville_reservations` 
WHERE 
('2013-01-12 00:00:00' >= `date_depart` AND '2013-01-12 00:00:00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('2013-01-12 00:00:00' >= `date_depart` AND '2013-01-12 00:00:00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')


Cette requête est générée dynamiquement avec une boucle pour que l'on vérifie jour par jour si la nouvelle réservation ne chevauche aucune autre réservation existante.

La fonctionne qui s'occupe de concaténer :

public function checkReservationAvailable(Reservation $res){
        $req = "SELECT COUNT(id_reservation) FROM `hertz_planning_charleville_reservations` WHERE ";
        
        if($res->getDateProlongation() != "0000-00-00 00:00:00")
            $time_retour = strtotime($res->getDateProlongation());
        else
            $time_retour = strtotime($res->getDateRetour());
            
        $time_depart = strtotime($res->getDateDepart());
        $i=0;
        while($time_depart < ($time_retour+86400)){
            if($i==0)
                $i++;
            else
                $req .= "<br /> OR ";
            $req .= "('".date("Y-m-d i:s", $time_depart).":00' >= `date_depart` AND '".date("Y-m-d i:s", $time_depart).":00' <= `date_retour` AND `Date_prolongation` = '0000-00-00 00:00:00') OR ('".date("Y-m-d i:s", $time_depart).":00' >= `date_depart` AND '".date("Y-m-d i:s", $time_depart).":00' <= `Date_prolongation` AND `Date_prolongation` <> '0000-00-00 00:00:00')";
            $time_depart += 86400;
        }
        $q = $this->_db->query($req);
        return $q->fetchColumn();
        //return $req;
    }


Ce que je ne comprend pas, c'est que ma requête fonctionne lorsque je l'a met dans MySQL via phpmyadmin (je récupère avec un echo ce que ma concaténation génère) mais pas via PDO :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '> OR ('2013-01-13 00:00:00' >= `date_depart` AND '2013-01-13 00:00:00' <= `date_' at line 1' in C:\UwAmp\www\agenda\includes\manager-charleville.class.php:59 Stack trace: #0 C:\UwAmp\www\agenda\includes\manager-charleville.class.php(59): PDO->query('SELECT COUNT(id...') #1 C:\UwAmp\www\agenda\addReservation.php(59): Manager->checkReservationAvailable(Object(Reservation)) #2 {main} thrown in C:\UwAmp\www\agenda\includes\manager-charleville.class.php on line 59


Désolé pour le post à rallonge, je voulais mettre toutes les infos pour qu'une personne puisse m'éclairer au mieux...

Merci d'avance.

Apo.
Modifié par Apoooo (15 Jan 2013 - 10:18)
Quel c**...

C'est tout naturellement dû a ceci :
$req .= "<br /> OR ";

J'avais mis ce <br /> pour que mon affichage de mon echo soit plus clairs avec des sauts de ligne lorsque je tentais de le déboguer... Au final, ça m'aura causer plus de tord qu'autre chose...

Résolu...
Salut !

Juste pour tes prochains debugs, utilise simplement les retours claviers dans ta requête SQL et affiche le résultat dans un PRE Smiley smile