Comparaison dates formulaires VS BDD

Fermé
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 13 mars 2021 à 11:02
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 - 14 mars 2021 à 13:00
Bonjour,

J'essaye de comparer les dates d'une période de location choisie par l'utilisateur dans un formulaire avec les dates réservées déjà présentes dans la BDD.

L'utilisateur sélectionne dans un formulaire un équipement grâce à un
select
, une date de début, et une date de fin.

A partir de là je récupère toutes les dates entre les deux sélectionnées dans le formulaires. Je me connecte à la BDD. Je récupère toutes les dates de la BDD correspondantes à l'équipement choisit par l'utilisateur dans le formulaire. Et je compare donc les dates du formulaire avec celles de la BDD.

Tout fonctionne jusqu'au moment de la seconde boucle imbriquée dans la première. Cette seconde boucle devrait comparer chaque date du formulaire avec toutes celles de la BDD. Cette seconde boucle fonctionne parfaitement sur la première date du formulaire mais elle s'arrête juste après et ne compare pas les autres dates du formulaire.

Pourtant après avoir comparé la première date du formulaire, la première boucle devrait faire revenir le déroulé du script au début de la seconde boucle, et cette seconde boucle devrait recommencer avec la seconde date... je bloque depuis plusieurs jours là-dessus alors que pourtant la solution doit être très simple.

J'ai mis beaucoup d'
echo
pour voir le déroulé de chaque étape. Et visuellement la première boucle s'initialise parfaitement, la seconde aussi, sauf que dès que la première date a été traitée par la seconde boucle, cette dernière s'arrête, et la première boucle continue parfaitement son travail jusqu'à la fin mais sans relancer la seconde.

/* On se connecte à la BDD. */
try {
	$bdd = new PDO('mysql:host=localhost;dbname=sparelax;charset=utf8', 'root', '');
	/* Si la connexion échoue on affiche le message d'erreur. */
} catch (Exception $error) {
	die('Erreur : '.$error -> getMessage());
}
/* On lance une requête sur la BDD avec laquelle on récupère dans un tableau les entrées « booked », de la table « booking », uniquement lorsque « jacuzzi » correspond au choix de l'utilisateur. */
$query = $bdd -> query('SELECT jacuzzi, booked FROM booking WHERE jacuzzi="'.$_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'].'"');
/* On supprime la variable de connexion à la BDD. */
unset($bdd);
/* On sauvegarde le nombre de jours de la période de location souhaitée par l'utilisateur dans une variable. */
$nbr = (strtotime($_SESSION['FORMbooking_FIELDdateEnd']) - strtotime($_SESSION['FORMbooking_FIELDdateStart'])) / 86400;
/* On lance une boucle. */
for ($i = 0; $i <= $nbr; $i++) {
	/* On sauvegarde la date de la période de location dans une variable. */
	$day[$i] = $_SESSION['FORMbooking_FIELDdateStart'];
	/**/
	echo '<p>Date réservée n° '.$i.' : '.$day[$i].'</p>';
	/* On lance une boucle. */
	while ($xXx = $query -> fetch()) {
		/**/
		if ($day[$i] == $xXx[1]) {
			/* ...on suit les instructions suivantes. */
			/**/
			echo '<p>Comparaison de la date n° '.$i.' : '.$day[$i].' avec la date '.$xXx[1].' de la BDD...<br />
			Correspondance trouvée !</p>';
		/* Sinon... */
		} else {
			/* ...on suit les instructions suivantes. */
			/**/
			echo '<p>Comparaison de la date n° '.$i.' : '.$day[$i].' avec la date '.$xXx[1].' de la BDD...<br />
			Pas de correspondance trouvée !</p>';
		}
	}
	/* On ajoute 1 jour à la date. */
	$_SESSION['FORMbooking_FIELDdateStart'] = date('Y-m-d', strtotime($_SESSION['FORMbooking_FIELDdateStart']. ' + 1 days'));
}
/* On supprime la variable de requête à la BDD. */
unset($query);


Merci d'avance.

Configuration: Windows / Firefox 72.0
A voir également:

4 réponses

jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
13 mars 2021 à 11:22
Bonjour,

Déjà, pour ta requête, je serai toi.. j'utiliserai une requête préparée.
De plus, vu que tu fais du PDO, il serait bien d'activer la gestion des erreurs : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Puis, pourquoi ne pas faire ta requête en ciblant directement les dates voulues ? ( via un between par exemple )
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
13 mars 2021 à 11:39
Activation des erreurs PDO faite :

try {
						/* On se connecte à la BDD. */
						$bdd = new PDO('mysql:host=localhost;dbname=sparelax;charset=utf8', 'root', '');
						/* On active les erreurs PDO. */
						$bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
						$bdd -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
					} catch (PDOException $error) {
						/* Si la connexion échoue on affiche le message d'erreur. */
						die('Erreur : '.$error -> getMessage());
					}


Requête préparée fait :

/* On prépare une requête sur la BDD avec laquelle on récupère dans un tableau les entrées « booked », de la table « booking », uniquement lorsque « jacuzzi » correspond au choix de l'utilisateur. */
					$query = $bdd -> prepare('SELECT jacuzzi, booked FROM booking WHERE jacuzzi="'.$_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'].'"');
					/* On exécute la requête. */
					$query -> execute();


Par contre je ne comprends pas ton ciblage avec between...
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
13 mars 2021 à 11:41
Pour la requête, pense à la placer égalent dans un bloc try/catch

Et pour le Between
https://www.techonthenet.com/mysql/between.php
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024
14 mars 2021 à 08:25
Salut,

Ok pour le between. Mais cela n'irait pas avec la structure de ma table. Car dans ma table il peut y avoir plusieurs fois la même date vu qu'il y a plusieurs équipements en location. Donc il faut vraiment que je cible par l'équipement pour filtrer.

En revanche je n'ai toujours pas résolut mon problème de seconde boucle qui s'arrête à la fin de la première comparaison...
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689 > YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
14 mars 2021 à 09:32
Tu sais que tu peux mettre plusieurs conditions dans ton where ???
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024
Modifié le 14 mars 2021 à 10:33
Oui je sais.

Bon je vais essayer... mais par contre j'ai un doute au niveau de la rédaction.

Comme ça ?
$query = $bdd -> prepare('SELECT jacuzzi, booked FROM booking WHERE jacuzzi="'.$_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'].'" AND order_date BETWEEN CAST(booked="'.$_SESSION['FORMbooking_FIELDdateStart'].'" AS DATE) AND CAST(booked="'.$_SESSION['FORMbooking_FIELDdateEnd'].'" AS DATE)');


Avec tous les échappements et les nominations j'ai peur de m'y perdre dans l'ordre et la catégorie des apostrophes...

EDIT : Non, ça ne fonctionne pas... j'ai du me gourer quelque part.
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689 > YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
14 mars 2021 à 10:39
heuuu... oui .. c'est un peu n'importe quoi ce que tu as écrit ....

Déjà... une requête ça ne se teste pas en php ... mais DIRECTEMENT dans ta bdd ( via phpmyadmin )
Ensuite.. le champ qui contient la date dans ta table.. c'est booked non ? .. donc que vient faire là le order_date ?? (ou alors c'est déjà que ton code initial était faut.. )

Donc :
Tu ouvres ta bdd ( via phpmyadmin )
Tu essaies d'écrire la requête qui va bien
Une fois que tu auras la requête.... là tu pourras la mettre dans ton php.


Si vraiment tu n'y arrive pas... montres nous ce que tu auras essayé et file nous un DUMP de ta table qu'on puisse voir la structure et ce qu'elle contient...
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
Modifié le 14 mars 2021 à 13:05
Donc...

Déjà... la requête fonctionne t-elle directement dans la bdd ( via phpmyadmin ) ????
Faut vriament commencer par ça !


Ensuite, niveau code .... il serait bien que tu appliques enfin les conseils/consignes que je t'ai déjà donné
En gros... , pour le code actuel .. ça donnerait un truc du genre
// Je répète....
// RECUPERATION PROPRE des variables AVANT de les utiliser !
$choice = !empty($_SESSION['FORMbooking_FIELDchoiceOfJacuzzi']) ? $_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'] : NULL;
$dateStart = !empty($_SESSION['FORMbooking_FIELDdateStart']) ? $_SESSION['FORMbooking_FIELDdateStart'] : NULL;
$dateEnd = !empty($_SESSION['FORMbooking_FIELDdateEnd']) ? $_SESSION['FORMbooking_FIELDdateEnd'] : NULL;


// Préparation de la requête PREPAREE
$sql = "SELECT booked 
        FROM booking 
        WHERE jacuzzi= :choice
        AND booked BETWEEN :dateStart AND :dateEnd";

// Les "datas" qui sont utilisés dans la requête :        
$datas = array(':choice'=>$choice , ':dateStart'=>$dateStart, ':dateEnd'=>$dateEnd);


//Execution de la requete
try{
  $prep = $bdd->prepare($sql);
  $prep->execute($datas);
  $result = $check->fetchAll();
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " datas : " ;
  print_r($datas);
}


0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
14 mars 2021 à 12:45
D'accord, je n'avais pas compris qu'il fallait tout préparer en amont, je pensais qu'il fallait mieux privilégier le moins de lignes possible et donc tout faire directement dans la requête. Donc c'est bon. Mon code :
/* Si l'utilisateur a renseigné les deux champs dates... */
			if (!empty($_SESSION['FORMbooking_FIELDdateStart']) AND !empty($_SESSION['FORMbooking_FIELDdateEnd'])) {
				/* ...on suit les instructions suivantes. */
				/**/
				echo '<p>Les 2 champs dates ont été renseignés</p>';
				/* Si la date de début renseignée par l'utilisateur est antérieure ou égale à la date du jour ET si la date de fin renseignée par l'utilisateur est antérieure ou égale à la date de début... */
				if ($_SESSION['FORMbooking_FIELDdateStart'] > date('Y-m-d') AND $_SESSION['FORMbooking_FIELDdateEnd'] > $_SESSION['FORMbooking_FIELDdateStart']) {
					/* ...on suit les instructions suivantes. */
					/**/
					echo '<p>Les 2 champs dates sont valides</p>'; 
					try {
						/* On se connecte à la BDD. */
						$login = new PDO('mysql:host=localhost;dbname=sparelax;charset=utf8', 'root', '');
						/* On active les erreurs PDO. */
						$login -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
						$login -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
					} catch (PDOException $error) {
						/* Si la connexion échoue on affiche le message d'erreur. */
						die('Erreur : '.$error -> getMessage());
					}
					/* On sauvegarde les données renseignées par l'utilisateur dans des variables. */
					$choice = $_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'];
					$DATEstart = $_SESSION['FORMbooking_FIELDdateStart'];
					$DATEend = $_SESSION['FORMbooking_FIELDdateEnd'];
					/* On prépare les données renseignées par l'utilisateur dans un tableau. */
					$datas = array(
						':choice' => $choice,
						':DATEstart' => $DATEstart,
						':DATEend' => $DATEend
					);
					/* On prépare la requête SQL dans une variable. */
					$sql = '
						SELECT booked
						FROM booking
						WHERE jacuzzi=:choice
						AND booked BETWEEN :DATEstart AND :DATEend
					';
					try {
						/* On exécute la requête. */
						$query = $login -> prepare($sql);
						$query -> execute($datas);
					} catch (Exception $error) {
						/* Si la requête échoue on affiche le message d'erreur. */
						echo 'Erreur : '.$error -> getMessage();
						echo 'Données : ';
						print_r($datas);
					}
					while ($BDD_day = $query -> fetch()) {
						/**/
						echo '<p>'.$BDD_day['booked'].'</p>';
					}
				/* Sinon... */
				} else {
					/* ...on suit les instructions suivantes. */
					/**/
					echo '<p>Les 2 champs dates ne sont pas valides</p>';
				}
			/* Sinon... */
			} else {
				/* ...on suit les instructions suivantes. */
				/**/
				echo '<p>Les 2 champs dates n\'ont pas été renseignés</p>';
			}


Je n'avais pas mis l'entièreté de mon code mais je fais déjà les vérifications des champs du formulaire en amont avec des IF. Et par contre je ne comprends pas ton étape
$result = $check->fetchAll();
. Je ne l'ai pas utilisé dans mon code et ça fonctionne.
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
Modifié le 14 mars 2021 à 13:06
Déjà.. on place le code de connexion à la bdd dans un fichier à part qu'on inclura dans les pages où on en a besoin.
Donc :
<?php
// Fichier cnxBdd.php
try {
  // On se connecte à la BDD. 
  $bdd = new PDO('mysql:host=localhost;dbname=sparelax;charset=utf8', 'root', '');
  // On active les erreurs PDO. 
  $bdd -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $error) {
  // Si la connexion échoue on affiche le message d'erreur. 
   die('Erreur : '.$error -> getMessage());
}


Ensuite :
<?php
// On active l'affichage des erreurs PHP 
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


// connexion à la bdd ( on inclus le fichier contenant la connexion.. au lieu de recopier le code dans chaque page .. )
require_once "cnxBdd.php"


// Je répète.... encore ... et encore ....
// RECUPERATION PROPRE des variables AVANT de les utiliser ! ( ici .. l'important dans la phrase .. ce sont les mots en majuscule..!!! )
// donc :
$choice = !empty($_SESSION['FORMbooking_FIELDchoiceOfJacuzzi']) ? $_SESSION['FORMbooking_FIELDchoiceOfJacuzzi'] : NULL;
$dateStart = !empty($_SESSION['FORMbooking_FIELDdateStart']) ? $_SESSION['FORMbooking_FIELDdateStart'] : NULL;
$dateEnd = !empty($_SESSION['FORMbooking_FIELDdateEnd']) ? $_SESSION['FORMbooking_FIELDdateEnd'] : NULL;



// Si l'utilisateur a renseigné les deux champs dates... 
if ($dateStart && $dateEnd ) {
  // ...on suit les instructions suivantes. 
  //
  echo '<p>Les 2 champs dates ont été renseignés</p>';
  // Si la date de début renseignée par l'utilisateur est antérieure ou égale à la date du jour ET si la date de fin renseignée par l'utilisateur est antérieure ou égale à la date de début... 
  if ($dateStart > date('Y-m-d') &&  $dateEnd > $dateStart ) {
    // ...on suit les instructions suivantes. 
    //
    echo '<p>Les 2 champs dates sont valides</p>'; 
  
    // Préparation de la requête PREPAREE
    $sql = "SELECT booked 
            FROM booking 
            WHERE jacuzzi= :choice
            AND booked BETWEEN :dateStart AND :dateEnd";

    // Les "datas" qui sont utilisés dans la requête :        
    $datas = array(':choice'=>$choice , ':dateStart'=>$dateStart, ':dateEnd'=>$dateEnd);

    // Si ça ne marche pas.. tu peux faire un echo de la variable $sql pour voir ce qu'elle contient
    // echo $sql ;
    // et également faire un print_r des datas pour voir les variables et nous montrer le tout.
    // print_r($datas);
    
    //Execution de la requete
    try{
      $prep = $bdd->prepare($sql);
      $prep->execute($datas);
      $result = $check->fetchAll(); // on stocke le résultat dans un array. ( quand on ne sait pas à quoi sert une instruction.. on pense à regarder sur internet dans la documentation officielle !! )
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " datas : " ;
      print_r($datas);
    }

    
   // On boucle sur le résultat de la requete ( qui se trouve dans l'array $result )
    foreach($result as $row ) {
       echo '<p>'.$row['booked'].'</p>';
    }
    
  // Sinon... 
  } else {
    // ...on suit les instructions suivantes. 
    //
    echo '<p>Les 2 champs dates ne sont pas valides</p>';
  }
// Sinon... 
} else {
  // ...on suit les instructions suivantes. 
  //
  echo '<p>Les 2 champs dates n\'ont pas été renseignés</p>';
}




Pour rappel ( encore.. )
Les liens à lire ET à appliquer dans tes codes :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

et :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

.
EDIT : Mea-Culpa .. ce n'est pas à toi que j'avais donné ces liens...
Mais donc, maintenant c'est fait :-)



0