IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire et gestion de requête SQL [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut Formulaire et gestion de requête SQL
    Bonsoir à tous,

    Je développe actuellement un système de suivi en PHP qui compte un nombre de véhicules par jour, semaine et mois. Pour récupérer les données, j'exécute trois requêtes, une par jour, une par semaine et une par mois (je crée trois tableaux que je remplis avec une boucle sur le résultat de ma requête).

    Dans mon programme, j'ai une en-tête de "filtrage". En effet, je souhaite qu'en fonction des choix de l'utilisateur, j'exécute telle ou telle requête. Si l'utilisateur laisse tout les champs vide, on sort la requête globale. Si par exemple il choisit uniquement le champ Semaine et le champ Métier, on exécute la requête en fonction. Etc...

    Nom : header.PNG
Affichages : 1094
Taille : 3,5 Ko
    (l'en tête en question).

    Je ne vois pas trop comment faire ça, si quelqu'un a des pistes pour m'aiguiller...
    Merci d'avance,

    Bonne soirée

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Bonsoir, poste tes bouts de codes, tes requêtes et ta BD.

    CORDIALEMENT.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut Requetes SQL
    Bonjour,

    Donc voici les requêtes (au format SQLite) :

    Pour les jours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $result = $database->query("SELECT * FROM retoucheurs where substr(\"Date/Heure de retouche (FD)\",1,4)||'-'||
                substr(\"Date/Heure de retouche (FD)\",6,2)||'-'||
                substr(\"Date/Heure de retouche (FD)\",9,2) 
                between DATE('". date("Y-d-m", strtotime($_SESSION['jours'][0])). "') and DATE('". date("Y-d-m", strtotime($_SESSION['jours'][6]))."') ORDER BY \"Date/Heure de retouche (FD)\" DESC");
    Pour les semaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     $result = $database->query("select total(Contremarque) as Tot, 
        strftime('%Y-%m-%d', substr(\"Date/Heure de retouche (FD)\",1,4)||\"-\"||substr(\"Date/Heure de retouche (FD)\",6,2)
        ||\"-\"||substr(\"Date/Heure de retouche (FD)\",9,2)) as Week FROM retoucheurs 
        GROUP BY strftime('%W', substr(\"Date/Heure de retouche (FD)\",1,4)||\"-\"||substr(\"Date/Heure de retouche (FD)\",6,2)
        ||\"-\"||substr(\"Date/Heure de retouche (FD)\",9,2));");
    Pour les mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $result = $database->query("select total(Contremarque) as Tot, 
        strftime('%Y-%m-%d', substr(\"Date/Heure de retouche (FD)\",1,4)||\"-\"||substr(\"Date/Heure de retouche (FD)\",6,2)
        ||\"-\"||substr(\"Date/Heure de retouche (FD)\",9,2)) as Month  FROM retoucheurs 
        GROUP BY strftime('%m', substr(\"Date/Heure de retouche (FD)\",1,4)||\"-\"||substr(\"Date/Heure de retouche (FD)\",6,2)
        ||\"-\"||substr(\"Date/Heure de retouche (FD)\",9,2));");
    Pour chaque requête, je boucle ensuite sur ma variable $result avec une boucle while pour stocker le tout dans un tableau que j'affiche dans un graphique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while($row=$result->fetchArray(SQLITE3_ASSOC)) {
            $valmois[intval(strftime('%m', strtotime($row['Month'])))] = $row['Tot'];
        }
    for($i=0;$i<7;$i++) {
            $_SESSION['valsm'][$i] = $valmois[intval(strftime('%m', strtotime(date("Y-m-d", strtotime($moisJours[$j]->format('Y-m-d'), 1)))))]; 
            $j--;   
        }
    Ce qui m'interesse le plus c'est de pouvoir dynamiquement modifier mes requêtes avec les valeurs choisies, ou lancer une requête par défaut si aucune valeur n'a été choisie.

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    "formulaire de recherche multi-critères"

    ...Ce qui m'interesse le plus c'est de pouvoir dynamiquement modifier ...
    On suppose donc "sans rechargement de page".

    Dans ce cas : "Ajax"
    Dernière modification par Invité ; 11/08/2018 à 09h14.

  5. #5
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Bonjour, j'avais eu le même soucis et j'avais eu la solution en faisant ça.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?php
     
    	/*je récupère les critères sélectionnés*/
    		extract($_POST);
     
    	/* je crée le tableau choix pour stocker les différentes critères*/
    		$choix = array();
     
    	// si la variable est présente, 
    //on lui affecte une place dans le tableau 'choix[]',
    //qui nous servira ensuite à construire le WHERE de la requête.
    	if (!empty($semaine)){
    		$choix[] = "semaine LIKE '%$semaine%'";   
    	}
     
    	if (!empty($tournee)){
    		$choix[] = "tournee LIKE '%$tournee%'";
    	}
     
    	if (!empty($metier)){
    		$choix[] = "metier LIKE '%$metier%'";
    	}
     
    	if (!empty($retoucheur)){
    		$choix[] = "retoucheur LIKE '%$retoucheur%'";
    	}
     
    	$first = true; /*on déclare la variable first pour tester la première condition*/
    	$conditions = '';
     
    	foreach($choix as $c){
        /* si c'est la premiere condition est vérifiée, on met where, sinon on met and*/
        if ($first){
            $first = false;
            $conditions .= " WHERE $c ";
        }
    		else{
    			$conditions .= " AND $c ";
    		}
    	}
     
    	$sql = " SELECT * FROM ta_table $conditions ORDER BY id ";
     
    	$res = mysql_query($sql) or die(mysql_error());
     
    ?>

    si je ne suis pas pas dans la bonne voie, chèr(e) modérateur(trice) corrigez moi.

    Cordialement.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut
    Merci pour la réponse, et désolé la prochaine fois je ferais un peu plus de recherche.
    Je vais potasser tout ça

  7. #7
    Invité
    Invité(e)
    Par défaut
    1- Quand je mets le picto , ce n'est pas un reproche : je te fournis les mots-clé pour ta recherche.

    2- Les listes déroulantes restent des éléments de formulaire !
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
               <option>ELE</option>
    C'est correct, mais il vaut mieux toujours mettre une value :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
              <option value="ELE">ELE</option>

    3- Dans ton cas, si tu veux utiliser Ajax, les balises <form> ne sont effectivement pas nécessaires, puisque les données seront récupérées et transmises via JavaScript.
    Ajax se charge ensuite de les trnasmettre à un fichier PHP externe (indépendant), qui fera le traitement.

    4- (EDIT) Je n'avais pas regardé tes requêtes :
    Appeler une colonne "Date/Heure de retouche (FD)" relève du masochisme !
    Les autres colonnes ont aussi des noms à coucher dehors ?
    Dernière modification par Invité ; 11/08/2018 à 09h22.

  8. #8
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Je ne connais pas SQL Lite mais de ce que j’ai pu voir les dates sont stockées (entre auttres) comme du texte au format SSAA-MM-JJ HH:MM:SS ('2018-04-02 12:13:46')

    Donc pourquoi faire tous ces substr ? S’ils sont nécessaires un substr de 1,10 devrait suffire et allègerait grandement la compréhension des requêtes.

  9. #9
    Invité
    Invité(e)
    Par défaut
    @Manequin
    ton code est bon, mais il peut être optimisé :

    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	foreach($choix as $c){
        /* si c'est la premiere condition est vérifiée, on met where, sinon on met and*/
        if ($first){
            $first = false;
            $conditions .= " WHERE $c ";
        }
    		else{
    			$conditions .= " AND $c ";
    		}
    	}
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$conditions = (!empty($choix))? " WHERE " . implode( " AND ", $choix ) : "";

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut
    3- Dans ton cas, si tu veux utiliser Ajax, les balises <form> ne sont effectivement pas nécessaires, puisque les données seront récupérées et transmises via JavaScript.
    Ajax se charge ensuite de les trnasmettre à un fichier PHP externe (indépendant), qui fera le traitement.
    Je ne connais pas du tout Ajax ni JavaScript du coup j'essaie de faire ça en PHP.

    Donc pourquoi faire tous ces substr ? S’ils sont nécessaires un substr de 1,10 devrait suffire et allègerait grandement la compréhension des requêtes.
    Dans ma base les dates sont stockées en texte sous la forme YYYY/MM/DD et SQLite ne prend en charge que le format YYYY-MM-DD, du coup je dois substituer les '/' par des '-'. C'est pas le plus simple je l'admets...mais ça marche.

    En tout cas merci à tous pour votre aide, particulièrement à jreaux62 et Manequin

  11. #11
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$conditions = (!empty($choix))? " WHERE " . implode( " AND ", $choix ) : "";
    Une préoccupation, quel le rôle d'implode?

    Cordialement.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par elkaktus Voir le message
    ...j'essaie de faire ça en PHP...
    Alors, il y aura forcément rechargement de la page.

    Mais le fichier de traitement PHP, dans les 2 cas, sera sensiblement le même.

    Donc commence comme ça, et quand tu connaitras mieux JavaScript/Ajax, ce ne sera pas difficile à transposer.


    Citation Envoyé par Manequin Voir le message
    Une préoccupation, quel le rôle d'implode?
    Facile : "PHP implode"

    En résumé, ça fait la même chose que ton bout de script de 10 lignes,... mais en UNE SEULE ligne : concaténer les conditions dans le " WHERE.... AND ... AND ...".
    Dernière modification par Invité ; 11/08/2018 à 09h44.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par elkaktus Voir le message
    Dans ma base les dates sont stockées en texte sous la forme YYYY/MM/DD
    et SQLite ne prend en charge que le format YYYY-MM-DD...
    As-tu essayé avec SQLite REPLACE() function ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE(\"Date/Heure de retouche (FD)\", \"/\",\"-\")
    Dernière modification par Invité ; 11/08/2018 à 09h48.

  14. #14
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Merci beaucoup @jreaux, t'es genial. Ça fonctionne hyper bien. ça marche .

    Cordialement.

  15. #15
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Une chose qu’on oublie souvent. Un mois ou une semaine appartiennent à une année et dans les requêtes je n’ai pas vu d’année dans la clause where.

  16. #16
    Invité
    Invité(e)
    Par défaut
    @Manequin
    Rectification : ta requête N'EST PAS SÉCURISÉE (tu passes les variables directement dans la requête !
    Il faut faire une REQUÊTE PRÉPARÉE !

    PRINCIPE DE RECHERCHE MULTI-CRITERES :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    // ---------------
    // 1- Initialisation / Récupération des données du formulaire
    if(...)
    {
    ... 
    }
    // ---------------
    // 2- Construction des bouts de requête, en fonction des criteres recus :
    // on crée un array $sqlCritere pour stocker les morceaux de requêtes
    $sqlCritere = array();
    // on crée un array $sqlParams, destinés à être passé dans le execute()
    $sqlParams = array();
    // ---------------
    // si la variable est présente, on lui affecte une place dans le tableau 'critere[]',
    //qui nous servira ensuite à construire le WHERE de la requête.
    if (!empty($critere1))
    {
    	$sqlCritere[] = " colonne1 LIKE ?";   
    	$sqlParams[] = '%'.$critere1.'%';   
    }
    if (!empty($critere2))
    {
    	$sqlCritere[] = " colonne2 = ?";   
    	$sqlParams[] = $critere2;   
    }
    ...
    // ---------------
    // 3- Construction du WHERE ... AND ... :
    $sqlWhereAnd = (!empty($choix))? " WHERE " . implode( " AND ", $choix ) : "";
    // ---------------
    // 4- Construction de la requete PREPAREE :
    $sql = " SELECT * FROM ta_table " . $sqlWhereAnd . " ORDER BY id ";
     
    $res = mysql_prepare( $sql ); // PREPARATION
    $res = mysql_execute( $sqlParams ); // EXECUTION, en passant les paramètres
    ?>


    @elkaktus
    idem : tes requêtes NE SONT PAS SÉCURISÉES (tu passes aussi les variables directement dans la requête !
    Il faut faire des REQUÊTES PRÉPARÉES.

    INSPIRE-TOI du PRINCIPE DE RECHERCHE MULTI-CRITERES ci-dessus.
    Dernière modification par Invité ; 11/08/2018 à 15h11.

  17. #17
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2017
    Messages : 508
    Par défaut
    Oh la la, je le fait tout de suite. Merci.
    Cordialement.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Remarque concernant empty() :

    empty :
    Détermine si une variable est considérée comme vide.
    Une variable est considérée comme vide si elle n'existe pas, ou si sa valeur équivaut à FALSE. La fonction empty() ne génère pas d'alerte si la variable n'existe pas.

    Ce qui suit est considéré comme étant vide :
    • "" (une chaîne vide)
    • 0 (0 en tant qu'entier)
    • 0.0 (0 en tant que nombre à virgule flottante)
    • "0" (0 en tant que chaîne de caractères)
    • NULL
    • FALSE
    • array() (un tableau vide)
    • $var; (une variable déclarée, mais sans valeur)


    !empty :
    C'est donc l'inverse
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!empty($critere1))
    {
    	$sqlCritere[] = " colonne1 LIKE ?";   
    	$sqlParams[] = '%'.$critere1.'%';   
    }
    • si le critère peut prendre comme valeur 0 ou '' (chaine vide) ou false ou NULL, il faut alors utiliser isset(...) à la place de !empty(...) !

    Sinon, on n'entre pas dans la condition, et le bout de requête correspondant n'est pas généré.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Gestion mémoire & requêtes SQL
    Par Edlonar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/09/2013, 09h46
  2. Réponses: 2
    Dernier message: 10/05/2012, 12h26
  3. Gestion des requêtes SQL
    Par dot-_-net dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/04/2009, 00h32
  4. [MySQL] Gestion des requêtes SQL (classe ou pas ?)
    Par FrontLine dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/01/2008, 18h41
  5. Valeur des formulaire réutilisées dans des requètes SQL.
    Par cotmar dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/05/2006, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo