[RESOLU] requete preparees select between programation objet procédurale

Petit nouveau ! | 7 Messages

15 mars 2022, 11:45

Bonjour merci de m'accueillir sur ce forum,
Voici ma configuration si besoin (en local)
Version Apache :2.4.51 Server Software :Apache/2.4.51 (Win64) PHP/8.0.13 - Port défini pour Apache : 80
Version de PHP :8.0.13
Je veux afficher une période donnée (intervalle date début et date fin) .
Cette période est définie par l'utilisateur avec un formulaire (methode get).
les valeurs sont définies par $date_debut et $ date_fin

je veux ensuite utiliser une requête SQL qui va permettre d'afficher toutes les séances de la table webseance correspondantes à la période définie par l'utilisateur.
Voici la requête;

Code : Tout sélectionner

$sth = $bdh->prepare('SELECT *FROM webseance WHERE date_debut BETWEEN date_debut = :find AND date_fin = :find2'); $sth->bindValue('find', $date_debut, PDO::PARAM_STR); /* On protège car le text à recherche vient de l'utilisateur. */ $sth->bindValue('find2', $date_fin, PDO::PARAM_STR); /* On protège car le text à recherche vient de l'utilisateur. */ $sth->execute(); $resultdate = $sth->fetchAll(PDO::FETCH_ASSOC);


Voici l'erreur affichée par php
Fatal error: Uncaught PDOException: 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 '= NULL AND date_fin = NULL' at line 2 in D:\wamp64\www\dateRequete15mars\dateRequete\formRechercheDate.php on line 67
ps; j'ai fait des test de requête avec " where = " et une seule variable à récupérer, cela fonctionne
par contre avec 2 variables à récupérer (et avec between) ça ne fonctionne pas.


Merci par avance de votre aide et bonne journée à tous

Mammouth du PHP | 2703 Messages

15 mars 2022, 12:01

la syntaxe d'une condition between n'est pas celle là.
c'est : SELECT * FROM commandes WHERE date_ajout BETWEEN "2019-04-02" AND "2019-04-09"
s'il faut ne faire qu'une seule comparaison avec date_debut et une seule avec date_fin, alors pas besoin de between.

Petit nouveau ! | 7 Messages

15 mars 2022, 13:38

Merci pour votre réponse.
En fait la requête ci dessous fonctionne et affiche le résultat voulu
(sans doute j'aurais pu nommer différemment date debut)

Code : Tout sélectionner

$sql = "SELECT *FROM webseance WHERE date_debut BETWEEN '{$date_debut}' AND '{$date_fin}' "; // Le lancement en php de ma requête $sth = $bdh->query($sql); // J'exécute ma 2eme requête $sth->execute(); //fetchall recupere ttes les informations $resultdate= $sth->fetchAll();
mais on m'a dit NON, que je devais protéger le code et éviter des injections SQL
et faire une requête préparée. Ce que j'ai essayé de faire sans succès comme expliqué dans mon premier message

Mammouth du PHP | 2703 Messages

15 mars 2022, 13:42

SELECT *FROM webseance WHERE date_debut BETWEEN date_debut = :find AND date_fin = :find2
SELECT *FROM webseance WHERE date_debut BETWEEN '{$date_debut}' AND '{$date_fin}

il y a donc une différence majeure.

ensuite, il faut vérifier le contenu de la variable $date_debut qui, si elle n'est pas initialisée, aboutit à null dans la requête exécutée.

Petit nouveau ! | 7 Messages

15 mars 2022, 15:41

Oui j'ai mis aussi une condition pour vérifier si le formulaire est soumis avant d’exécuter la requête SQL
if ( isset( $_GET['submit']) ) {
$date1 = $_GET['date1'];
$date2 = $_GET['date2'];
j'ai remplacé date_debut par date1 et date_fin par date2

Petit nouveau ! | 7 Messages

15 mars 2022, 17:22

Finalement j'ai mis sai pour saisie , du coup la variable date _debut devient sai_date_debut
le code ci dessous fonctionne lui sans probleme

Code : Tout sélectionner

$sth = $bdh -> prepare('SELECT * FROM webseance WHERE date_debut = :find '); $sth->bindValue('find', $sai_date_debut, PDO::PARAM_STR); /* On protège car le text à recherche vient de l'utilisateur. */ // J'exécute ma 2eme requête $sth->execute(); //fetchall recupere ttes les informations $resultdate= $sth->fetchAll(); var_dump($resultdate); } // réinitialiser la variable $sai_date_debut = "";
Mais avec between j'ai toujours la même erreur

Code : Tout sélectionner

$sth = $bdh -> prepare(' SELECT * FROM webseance WHERE date_debut BETWEEN sai_date_debut = :find AND sai_date_fin = :find2 '); $sth->bindValue('find', $sai_date_debut, PDO::PARAM_STR); /* On protège car le text à rechercher vient de l'utilisateur. */ $sth->bindValue('find2', $sai_date_fin, PDO::PARAM_STR) $sth->execute(); //fetchall recupere ttes les informations $resultdate= $sth->fetchAll(); //réinitialisation de la variable $sai_date_debut = "";
Fatal error: Uncaught PDOException: 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 '= '2022-03-01' AND sai_date_fin = '2022-03-31'' at line 2 in /home/homes/julienhennebo/sites/live65/PHP/PHPJ3 MYADMIN/dateRequete/formRechercheDate.php on line 88
( ! ) PDOException: 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 '= '2022-03-01' AND sai_date_fin = '2022-03-31'' at line 2 in /home/homes/julienhennebo/sites/live65/PHP/PHPJ3 MYADMIN/dateRequete/formRechercheDate.php on line 88
Merci d'avance de vos suggestions

Petit nouveau ! | 7 Messages

15 mars 2022, 23:05

énieme tentative (après consultation de tuto requete préparées)
sai_date_debut et sai_date_fin sont les dates choisies par l'utilisateur et récupérée avec methode get
le but est toujours d'afficher les séances qui correspondent aux dates choisies par l'utilisateur.

Code : Tout sélectionner

$sql = "SELECT * FROM webseance WHERE date_debut BETWEEN date_debut=? AND date_end=? "; $sth = $bdh -> prepare($sql); $sth->bindValue(1, $sai_date_debut, PDO::PARAM_STR); $sth->bindValue(2, $sai_date_fin, PDO::PARAM_STR); $sth->execute(); // fetchall recupere ttes les informations $resultdate= $sth->fetchAll();

voici le code erreur reçu;
Fatal error: Uncaught PDOException: 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 '='2022-01-01' AND date_end='2022-01-31'' at line 1 in /home/homes/julienhennebo/sites/live65/PHP/PHPJ3 MYADMIN/dateRequete/formRechercheDate.php on line 132

Merci de vos suggestions, bonne soirée

Mammouth du PHP | 2703 Messages

15 mars 2022, 23:10

SELECT *FROM webseance WHERE date_debut BETWEEN date_debut = :find AND date_fin = :find2
SELECT *FROM webseance WHERE date_debut BETWEEN '{$date_debut}' AND '{$date_fin}

il y a donc une différence majeure.

quelle est cette différence ?

Petit nouveau ! | 7 Messages

15 mars 2022, 23:30

la seconde requête recupére les valeurs du formulaire get , il n'y a pas de fonction bindValue à effectuer ensuite (pas de requete préparée)
la 1ere requête utilise :find et :find2 pour ensuite et nécessite une requête préparée.
Merci à vous, j'ai besoin de comprendre

Petit nouveau ! | 7 Messages

16 mars 2022, 11:21

RESOLU

Code : Tout sélectionner

RESOLU
Bonjour à tous
J'ai trouvé mon erreur .
C'était une erreur de syntaxe SQL

Code : Tout sélectionner

SELECT * FROM `webseance` WHERE `date_debut` BETWEEN :find AND :find2
Et non pas

Code : Tout sélectionner

SELECT * FROM `webseance` WHERE `date_debut` BETWEEN date_debut = :find AND date_debut= :find2