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

PHP & Base de données Discussion :

Requêtes select préparées par checkboxes [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur Hôtelier
    Inscrit en
    Janvier 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur Hôtelier
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2011
    Messages : 48
    Par défaut Requêtes select préparées par checkboxes
    Bonjour à tous.

    J'essaye depuis un bout de temps de trouver comment filtrer une recherche sur ma bdd avec des checkboxes. je n'ai pas le moment que la partie html avec les checkboxes et une bdd alimentée par formulaire.
    les checkboxes doivent filtrer les différentes entrées en trouvant par colonne les entrées correspondantes.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form name="recherche_caisse" id "recherche_caisse" method="post" action="index.php?option=com_jumi&view=application&fileid=5" />
    	Date de début :<input type="date" name="d_caisse_min" id="d_caisse_min"> - date de fin : <input type="date" name="d_caisse_max" id="d_caisse_max"><br>
    	<table id="cherche_caisse"><caption>Trouver les feuilles de caisse :</caption>
    	<tr><td><label><input type="checkbox" name="rch[]" value="c_am"> de fin de journée</label></td><td><label><input type="checkbox" name="erreurcaisse" value="caisse_erreur"> avec erreurs</label></td></tr>
    	<tr><td><label><input type="checkbox" name="rch[]" value="cheques"> avec chèques</label></td><td><label><input type="checkbox" name="ancv" value="caisse_ancv"> avec ANCV</label></td></tr>
    	<tr><td><label><input type="checkbox" name="rch[]" value="virements"> avec virements</label></td><td><label><input type="checkbox" name="remboursements" value="caisse_rmb"> avec remboursements</label></td></tr>
    	</table>
    	<input type="submit" value="rechercher">
    </form>

    en cochant l'une ou l'autre (voir plusieurs) checkboxes j'aimerais afficher les entrées dont les colonnes (mêmes noms que les "names" des checkbox) sont supérieurs à zéro.

    Pour l'instant je peux réduire la liste avec une date min et une date max (c'est déjà ça) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT * FROM #__caisse WHERE (c_date >= ' . $d_caisse_min . ' AND c_date <= ' .$d_caisse_max . ') ORDER BY c_date asc';
    Je ne sais pas si je suis très clair.

    Pourriez-vous me dire si je part dans la bonne direction, si il existe un tutoriel ou peut être pourriez-vous m'aider ?

    Merci beaucoup. Nicolas

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Construis ta requête dynamiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = 'SELECT * FROM #__caisse WHERE (c_date >= ' . $d_caisse_min . ' AND c_date <= ' .$d_caisse_max . ')';
     
    $param = array();
     
    if (isset($_POST['rch'])) {
        $sql .= ' AND rch IN (' . implode(',', array_fill(0, count($_POST['rch']) , '?')) . ')';
        $param = array_merge($param,  $_POST['rch']);    
    }
     
    $sql .= ' ORDER BY c_date asc';
     
    $sth = $pdo->prepare($sql);
    $sth->execute($param);
    J'ai supposé que "rch" était une colonne dans la table qui pouvait contenir une des 3 valeurs des checkbox.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Directeur Hôtelier
    Inscrit en
    Janvier 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur Hôtelier
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2011
    Messages : 48
    Par défaut
    Bonjour Sabotage.

    Le "rch" est juste le nom de mes checkboxes de recherche. Les nom de colonnes sont dans les values:

    • c_am (boolean) :
      • 1 = après-midi (soir en fait)
      • 0 = matin,

    • erreurcaisse : toute les caisses dont l'erreur est > 0
    • cheques : toute les caisses dont l'encaisse en chèque est > 0
    • ancv : toute les caisses dont l'encaissement en chèque vacances est > 0
    • virements : toute les caisses dont l'encaissement en virement est > 0
    • remboursements : toute les caisses dont les remboursement en espèces est > 0


    (il y en a plein d'autre(51 colonne en fait), mais la recherche se fait sur une des 6 colonnes.

    L’intérêt étant que l'utilisateur puisse trouver les feuilles de caisse par critères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $sql = 'SELECT * FROM #__caisse WHERE (c_date >= ' . $d_caisse_min . ' AND c_date <= ' .$d_caisse_max . ')
    // si erreur coché
    AND erreurcaisse > 0
    // si chèques coché
    AND cheque > 0
    //...
    ORDER BY c_date asc';

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

    1/ commence par écrire la requête "en dur" (comme tu l'as fait dans le message précédent, mais complétée), afin de savoir COMMENT elle doit s'écrire.
    -> En fonction des critères, il faudra utiliser AND ou OR.

    2/ sabotage t'a montré une façon de construire une requête préparée, dynamiquement.

    3/ seule les checkbox cochées renvoient un résultat (ce qui explique le if (isset($_POST['rch'])) de sabotage) :
    donc il est facile de récupérer les value pour la requête.

  5. #5
    Membre averti
    Homme Profil pro
    Directeur Hôtelier
    Inscrit en
    Janvier 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur Hôtelier
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2011
    Messages : 48
    Par défaut
    Merci à vous deux de m'aider


    J'ai essayé ce bout de code mais il me renvoi des erreurs... Je pense que je me suis emmêlé les pinceaux :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form name="recherche_caisse" id="recherche_caisse" method="post" action="index.php?option=com_jumi&view=application&fileid=5" />
    	Date de début :<input type="date" name="d_caisse_min" id="d_caisse_min"> - date de fin : <input type="date" name="d_caisse_max" id="d_caisse_max"><br>
    	<table id="cherche_caisse"><caption>Trouver les feuilles de caisse :</caption>
    	<tr><td><label><input type="checkbox" name="c_am" value="c_am"> de fin de journée</label></td><td><label><input type="checkbox" name="erreurcaisse" value="erreurcaisse"> avec erreurs</label></td></tr>
    	<tr><td><label><input type="checkbox" name="cheques" value="cheques"> avec chèques</label></td><td><label><input type="checkbox" name="ancv" value="ancv"> avec ANCV</label></td></tr>
    	<tr><td><label><input type="checkbox" name="virements" value="virements"> avec virements</label></td><td><label><input type="checkbox" name="remboursements" value="remboursements"> avec remboursements</label></td></tr>
    	</table>
    	<input type="submit" name="btn_recherche_caisse" value="rechercher">
    </form>

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php $hier = date('Y-m-d', time()-60*60*24*1);
     
    if (isset ($_POST['btn_recherche_caisse'])) {
    	if (!isset ($_POST['d_caisse_min']) && !isset($_POST['d_caisse_max'])) {
    		$sql = 'SELECT * FROM #__caisse WHERE (c_date = ' . $hier . ')';
    	}
    	else {
    		$sql = 'SELECT * FROM #__caisse WHERE (c_date > ' .$d_caisse_min. ' AND c_date < ' .$d_caisse_max.')';
    		if (isset ($_POST['c_am'])) {
    			$sql .= ' AND c_am = 1 ';
    		}
    		if (isset ($_POST['cheques'])) {
    			$sql .= ' AND cheques > 0 ';
    		}
    		if (isset ($_POST['virements'])) {
    			$sql .= ' AND virements > 0 ';
    		}
    		if (isset ($_POST['erreurcaisse'])) {
    			$sql .= ' AND erreurcaisse <> 0 ';
    		}
    		if (isset ($_POST['ancv'])) {
    			$sql .= ' AND ancv > 0 ';
    		}
    		if (isset ($_POST['remboursements'])) {
    			$sql .= ' AND remboursements > 0 ';
    		}
    	}
    	$database->setQuery( $sql );
    	$rows = $database->loadObjectList();  // récupération des objets
    ?>
    <table>
    	<tr>
    		<th>Date :</th>
    		<th>Utilisateur :</th>
    		<th>Espèces :</th>
    		<th>Chèques :</th>
    		<th>ANCV :</th>
    		<th>Virements :</th>
    		<th>Remboursements :</th>
    		<th>Erreur de caisse :</th>
    	</tr>
    <?php
    foreach ( $rows as $row ) // parcourir les objets
    { ?> 
    	<tr border="1px">
    		<td><?php echo $row->c_date; ?></td>
    		<td><?php echo $row->c_utilisateur; ?></td>
    		<td><?php echo $row->enveloppe; ?></td>
    		<td><?php echo $row->cheques; ?></td>
    		<td><?php echo $row->ancv; ?></td>
    		<td><?php echo $row->virements; ?></td>
    		<td><?php echo $row->remboursements; ?></td>
    		<td><?php echo $row->erreurcaisse; ?></td>
    	</tr>
    <?php
    }  
    ?>
    </table>
    <?php 
    }
    else {
    	echo 'Veuillez faire une recherche de feuille de caisse.';
    }
    ?>
    </div>
    <br>
    </html>

    Ça me donne cette erreur ... :
    Erreur de syntaxe près de 'AND c_date < )' à la ligne 1 SQL=SELECT * FROM #__caisse WHERE (c_date > AND c_date < )
    Je suis désolé j'ai vraiment l’impression d’être un boulet .

  6. #6
    Membre averti
    Homme Profil pro
    Directeur Hôtelier
    Inscrit en
    Janvier 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur Hôtelier
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2011
    Messages : 48
    Par défaut
    J'ai trouvé l'erreur j'avais oublié les quotes sur les variables
    Le code à l'air fonctionnel
    Qu'en pensez-vous ?

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php if (isset ($_POST['btn_recherche_caisse'])) {
    	if (!isset ($_POST['d_caisse_min']) && !isset($_POST['d_caisse_max'])) {
    		$sql = 'SELECT * FROM #__caisse WHERE (`c_date` = "' . $hier . '")';
    	}
    	else {
    		$d_caisse_min = $_POST['d_caisse_min'] ;
    		$d_caisse_max = $_POST['d_caisse_max'] ;
    		$sql = 'SELECT * FROM #__caisse WHERE (`c_date` > "'.$d_caisse_min.'" AND `c_date` < "'.$d_caisse_max.'") ';
    		if (isset ($_POST['c_am'])) {
    			$sql .= ' AND c_am = 1 ';
    		}
    		if (isset ($_POST['cheques'])) {
    			$sql .= ' AND `cheques` > 0 ';
    		}
    		if (isset ($_POST['virements'])) {
    			$sql .= ' AND `virements` > 0 ';
    		}
    		if (isset ($_POST['erreurcaisse'])) {
    			$sql .= ' AND `erreurcaisse` <> 0 ';
    		}
    		if (isset ($_POST['ancv'])) {
    			$sql .= ' AND `ancv` > 0 ';
    		}
    		if (isset ($_POST['remboursements'])) {
    			$sql .= ' AND `remboursements` > 0 ';
    		}
    	}
    	$database->setQuery( $sql );
    	$rows = $database->loadObjectList();  // récupération des objets
    ?>
    <table>
    	<tr>
    		<th>Date :</th>
    		<th>Utilisateur :</th>
    		<th>Espèces :</th>
    		<th>Chèques :</th>
    		<th>ANCV :</th>
    		<th>Virements :</th>
    		<th>Remboursements :</th>
    		<th>Erreur de caisse :</th>
    	</tr>
    <?php
    foreach ( $rows as $row ) // parcourir les objets
    { ?> 
    	<tr border="1px">
    		<td><?php echo $row->c_date; ?></td>
    		<td><?php echo $row->c_utilisateur; ?></td>
    		<td><?php echo $row->enveloppe; ?></td>
    		<td><?php echo $row->cheques; ?></td>
    		<td><?php echo $row->ancv; ?></td>
    		<td><?php echo $row->virements; ?></td>
    		<td><?php echo $row->remboursements; ?></td>
    		<td><?php echo $row->erreurcaisse; ?></td>
    	</tr>
    <?php
    }  
    ?>
    </table>
    <?php 
    }
    else {
    	echo 'Veuillez faire une recherche de feuille de caisse.';
    }
    ?>
    </div>
    <br>
    </html>

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

Discussions similaires

  1. Multitude de requêtes SELECT restituées par le Logger
    Par abbepierre94 dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/08/2012, 21h53
  2. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  3. Requête Ajax sur éléments d'un select remplis par Ajax
    Par descurai dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/04/2009, 17h04
  4. [MySQL] Ordre par défaut d'une requête SELECT ?
    Par Sayrus dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/04/2008, 14h27
  5. Réponses: 6
    Dernier message: 30/01/2008, 22h20

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