Sélection entre deux dates

Signaler
Messages postés
19
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
31 janvier 2020
-
binousha_1022
Messages postés
19
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
31 janvier 2020
-
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:

<!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!

4 réponses

Bonjour,

isset retourne un booléen, donc
$condition
n'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.
Messages postés
19
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
31 janvier 2020

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

$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 ^^
jordane45
Messages postés
27576
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 février 2020
2 111 > trifou
Bonjour,
je préférerai que quelqu'un d'autres réponde, je ne suis pas du tout un très bon connaisseur de php ^^

Tu t'en sors pas mal... et la réponse est déjà faite (juste en dessous )
> jordane45
Messages postés
27576
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 février 2020

Oui, je me suis endormi sur la rédaction de ma réponse, désolé je n'avais pas vu la tienne XD
Messages postés
27576
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 février 2020
2 111
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
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 :
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


Messages postés
19
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
31 janvier 2020

Merci à Trifou et Jordane45, je vais appliquer vos corrections et vous revenir. Merci