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...) :
Elle peut se résumer comme cela (en retirant les mêmes comparatifs pour les différentes dates) :
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 :
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 :
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)
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)