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 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 14 mars 2021 à 13:00
jordane45 Messages postés 38308 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 14 mars 2021 à 13:00
A voir également:
- Comparaison dates formulaires VS BDD
- Udp vs tcp - Guide
- Comparaison million milliard - Accueil - Technologies
- Dual core vs i5 ✓ - Forum Processeur
- Logiciel comparaison photo gratuit - Télécharger - Photo & Graphisme
- Somme si entre deux dates ✓ - Forum Excel
4 réponses
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
13 mars 2021 à 11:22
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 )
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 )
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
13 mars 2021 à 11:39
Activation des erreurs PDO faite :
Requête préparée fait :
Par contre je ne comprends pas ton ciblage avec between...
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...
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
13 mars 2021 à 11:41
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
Et pour le Between
https://www.techonthenet.com/mysql/between.php
YameFAZE
Messages postés
201
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
14 mars 2021
>
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
14 mars 2021 à 08:25
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...
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...
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
>
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
14 mars 2021 à 09:32
Tu sais que tu peux mettre plusieurs conditions dans ton where ???
YameFAZE
Messages postés
201
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
14 mars 2021
>
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
Modifié le 14 mars 2021 à 10:33
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 ?
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.
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.
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
>
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
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...
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...
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
Modifié le 14 mars 2021 à 13:05
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
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); }
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
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 :
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
/* 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.
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
Modifié le 14 mars 2021 à 13:06
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 :
Ensuite :
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 :-)
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 :-)