Sélection entre deux dates
binousha_1022
Messages postés
41
Date d'inscription
Statut
Membre
Dernière intervention
-
binousha_1022 Messages postés 41 Date d'inscription Statut Membre Dernière intervention -
binousha_1022 Messages postés 41 Date d'inscription Statut Membre Dernière intervention -
Bonjour, j'ai un petit soucis sur mon code php. En fait je veux afficher le chiffre d'affaire total entre deux dates choisies par l'utilisateur mais il m'affiche toujours aucun résultat trouvé. Le 1er code m'affiche le chiffre d'affaire de toutes les lignes de la table (ce qui n'est pas intéressant), si on a par exemple un enregistrement de plusieurs mois il va afficher le chiffre total de ces mois. Je veux que l'utilisateur choisi deux dates et qu'il me calcul le chiffre entre ces deux dates.
Voici le code qui calcule le chiffre d'affaires de toutestes les lignes:
Voici le code de calcul par période (entre deux dates)
Merci d'avance!
Voici le code qui calcule le chiffre d'affaires de toutestes les lignes:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Recherche</title> <style> table{width:100%;border-collapse:collapse} table tr,table th,table td{border:1px solid black;} table tr td{text-align:center;padding:1em;} </style> </head> <body> <?php include('connection_database.php');?> <form method='post'> <input type='text' placeholder='numerocompte' name="numerocompte"/> <input type='submit' value="Rechercher"/> </form> <table> <thead> <tr><th>Agence</th><th>Nom de l'agent</th><th>Date Commande</th><th>Prénom</th><th>Nom</th><th>N°Compte</th><th>montant</th><th>acompte</th><th>solde</th></th></tr> </thead> <tbody> <?php $somme = 0; $sql='select * from commande WHERE date_livraison_client IS NOT NULL and agence="b"' ; $params=[]; if(isset($_POST['numerocompte'])){ $sql.=' and numerocompte like :numerocompte'; $params[':numerocompte']="%".addcslashes($_POST['numerocompte'],'_')."%"; } $resultats=$connect->prepare($sql); $resultats->execute($params); if($resultats->rowCount()>0){ while($d=$resultats->fetch(PDO::FETCH_ASSOC)){ $somme += $d['montant']; ?> <tr><td><?=$d['agence']?></td><td><?=$d['nomagent']?></td><td><?=$d['datecommande']?></td><td><?=$d['prenom']?></td><td><?=$d['nom']?></td><td><?=$d['numerocompte']?></td><td><?=$d['montant']?></td><td><?=$d['acompte']?></td><td><?=$d['solde']?></tr> <?php } $resultats->closeCursor(); } else echo '<tr><td colspan=4>aucun résultat trouvé</td></tr>'. $connect=null; ?> </tbody> <tr> <th colspan="3">Chiffre d'Affaires TOTAL : <?php echo $somme; ?></th> </tr> </table> <input type="button" value="page précédente" onclick="javascript:history.back()"> </body> </html>
Voici le code de calcul par période (entre deux dates)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Recherche</title> <style> table{width:100%;border-collapse:collapse} table tr,table th,table td{border:1px solid black;} table tr td{text-align:center;padding:1em;} </style> </head> <body> <?php include('connection_database.php');?> <form action="date.php method="post"> <label for="datedeb">From</label> <input type="date" id="datedeb" name="datedeb" > <label for="datefin">To</label> <input type="date" id="datefin" name="datefin"> <input type="submit" value="Envoyer"> </form> <table> <thead> <tr><th>Agence</th><th>Nom de l'agent</th><th>Date Commande</th><th>Prénom</th><th>Nom</th><th>N°Compte</th><th>montant</th><th>acompte</th><th>solde</th></th></tr> </thead> <tbody> <?php $somme = 0; $datedeb = isset($_POST['datedeb']) ; $datefin = isset($_POST['datefin']) ; $condition = "WHERE date_livraison_client BETWEEN '".$datedeb."' AND '".$datefin."'"; $sql= "SELECT * FROM commande"; if(isset($_POST['datedeb']) && $datefin = isset($_POST['datefin'])){ $sql = $sql . " " . $condition; } //'select * from commande WHERE date_livraison_client IS NOT NULL //AND BETWEEN $datedeb AND $datefin //AND agence="b"'; //$sql= "SELECT * FROM commande WHERE monchampdate BETWEEN '".$date_debut."' AND '".$date_fin."'"; $resultats=$connect->prepare($sql); if($resultats->rowCount()>0){ while($d=$resultats->fetch(PDO::FETCH_ASSOC)){ $somme += $d['montant']; ?> <tr> <td><?=$d['agence']?> </td><td><?=$d['nomagent']?> </td><td><?=$d['datecommande']?> </td><td><?=$d['prenom']?> </td><td><?=$d['nom']?> </td><td><?=$d['numerocompte']?> </td><td><?=$d['montant']?> </td><td><?=$d['acompte']?> </td><td><?=$d['solde']?> </tr> <?php } $resultats->closeCursor(); } else echo '<tr><td colspan=4>aucun résultat trouvé</td></tr>'; $connect=null; ?> </tbody> <tr> <th colspan="3">Chiffre d'Affaires TOTAL : <?php echo $somme; ?></th> </tr> </table> <input type="button" value="page précédente" onclick="javascript:history.back()"> </body> </html>
Merci d'avance!
A voir également:
- Sélection entre deux dates
- Nombre de jours entre deux dates excel - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Itinéraire google map entre deux adresses - Guide
- Sms deux ronds - Forum Xiaomi
4 réponses
Bonjour,
isset retourne un booléen, donc
En attendant que d'autres complètent sur le problème de sécurité de ta requête, une valeur dont le format attendu est strict est à contrôler avant de passer ça à une reqête sql.
isset retourne un booléen, donc
$conditionn'a aucun sens.
En attendant que d'autres complètent sur le problème de sécurité de ta requête, une valeur dont le format attendu est strict est à contrôler avant de passer ça à une reqête sql.
Merci pour votre réponse mais si vous pouvez me corriger le code svp, je suis débutante en php donc je ne comprends pas certaines théories.
Bonjour,
Lorsque tu fais
Ces 2 variables ne contiennent pas les valeurs de $POST, mais les retour de isset, donc tu devrais tester si $_POST['datedeb'] et $_POST['datefin'] existent et contiennent quelque chose, et contrôler également si les valeurs des dates sont bien de format attendu.
On pourrait penser à faire un contrôle avec une regex (désolé, je fais ça en interactif).
Mais comme il est nécessaire de vérifier que la date est valide, autant passer ça directement à DateTime.
Si le $date_fr n'a pas un format valide, alors ça jettera une erreur, voir date_get_last_errors() ou encore faire ça dans un bloc try catch.
Bon, je préférerai que quelqu'un d'autres réponde, je ne suis pas du tout un très bon connaisseur de php ^^
Lorsque tu fais
$datedeb = isset($_POST['datedeb']) ; $datefin = isset($_POST['datefin']) ;
Ces 2 variables ne contiennent pas les valeurs de $POST, mais les retour de isset, donc tu devrais tester si $_POST['datedeb'] et $_POST['datefin'] existent et contiennent quelque chose, et contrôler également si les valeurs des dates sont bien de format attendu.
if( !empty($_POST['datedeb']) && !empty($_POST['datefin']) ) { // Contrôler également que les 2 variables sont de format attendu }
On pourrait penser à faire un contrôle avec une regex (désolé, je fais ça en interactif).
php > $date_fr = '31/01/2000'; php > echo preg_match('`^\d{2}/\d{2}/\d{4}$`', $date_fr); 1
Mais comme il est nécessaire de vérifier que la date est valide, autant passer ça directement à DateTime.
php > $date_fr = '31/01/2000'; php > $date = DateTime::createFromFormat('d/m/Y', $date_fr); php > echo $date->format('Y-m-d'); 2000-01-31
Si le $date_fr n'a pas un format valide, alors ça jettera une erreur, voir date_get_last_errors() ou encore faire ça dans un bloc try catch.
Bon, je préférerai que quelqu'un d'autres réponde, je ne suis pas du tout un très bon connaisseur de php ^^
Bonjour,
Si tu veux comprendre (et corriger) ton code...
Commence par faire un ECHO de ta variable $sql.
Puis, copie le code de la requête ainsi obtenu directement dans l'interface de requête de ta bdd ( via l'onglet SQL de phpmyadmin par exemple)
Regarde ce que ta requête retourne et fonctionne ....
Si elle te retourne le résultat désiré... montre le nous.
Si ça t'affiche une erreur..et bien essais de la corriger....
NB: Tu as également un souci dans ton code php à la ligne 37
Une comparaison en PHP .. c'est avec DEUX (ou trois selon ce que tu veux faire) symboles EGALE .. mais là .. je ne vois pas pourquoi tu veux faire cette comparaison ...
Tu as un autre souci....
ISSET ... te retournera TRUE ou FALSE en fonction de si la variable EXISTE ou NON.
Donc tes variables $datedeb et $datefin ne contiendront JAMAIS les dates.. juste un booleen indiquant l'existante de ces variables en POST
Toi ce que tu veux c'est :
et par conséquent.. ta ligne 37 devient tout simplement
Histoire qu'à l'avenir tu évites ce genre d'erreurs... je t'invite fortement à lire ET A APPLIQUER le contenu de ce lien :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Si tu veux comprendre (et corriger) ton code...
Commence par faire un ECHO de ta variable $sql.
Puis, copie le code de la requête ainsi obtenu directement dans l'interface de requête de ta bdd ( via l'onglet SQL de phpmyadmin par exemple)
Regarde ce que ta requête retourne et fonctionne ....
Si elle te retourne le résultat désiré... montre le nous.
Si ça t'affiche une erreur..et bien essais de la corriger....
NB: Tu as également un souci dans ton code php à la ligne 37
if(isset($_POST['datedeb']) && $datefin = isset($_POST['datefin'])){
Une comparaison en PHP .. c'est avec DEUX (ou trois selon ce que tu veux faire) symboles EGALE .. mais là .. je ne vois pas pourquoi tu veux faire cette comparaison ...
Tu as un autre souci....
$datedeb = isset($_POST['datedeb']) ; $datefin = isset($_POST['datefin']) ;
ISSET ... te retournera TRUE ou FALSE en fonction de si la variable EXISTE ou NON.
Donc tes variables $datedeb et $datefin ne contiendront JAMAIS les dates.. juste un booleen indiquant l'existante de ces variables en POST
Toi ce que tu veux c'est :
$datedeb = !empty($_POST['datedeb']) ? $_POST['datedeb'] : NULL ; $datefin = !empty($_POST['datefin']) ? $_POST['datefin'] : NULL;
et par conséquent.. ta ligne 37 devient tout simplement
if($datedeb && $datefin )
Histoire qu'à l'avenir tu évites ce genre d'erreurs... je t'invite fortement à lire ET A APPLIQUER le contenu de ce lien :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code