8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je suis bloqué depuis plusieurs jours sur un script PHP, puis-je vous demander de m'aider à le résoudre SVPL.
Voici le problème :
J'ai une table "client" avec, entre autres, un champ "archive" de type "enum" avec 2 valeurs "oui" et "non".
J'ai une table "don" avec, entre autres, un champ "nomclient" qui est indexé avec le même champ de la table "client" avec une clé étrangère sur cette table.
J'ai un script qui me permet d'archiver un client lorsque nécessaire et du coup le champ "archive" passe de "non" à "oui".
Ce que je souhaite faire, c'est lorsque j'archive un client, on ne puisse plus afficher ses dons. En gros si "archive" de client est "oui" alors les dons de ce client ne s'affichent pas.
Ce n'est peut-être pas assez clair, alors voici les scripts en question :
1°) page liste des clients

<?php session_start(); ?>

<?php
require_once('_nav.php');
require_once('_head.php');
require_once('../fonctions/bdd.php');
$bdd = bdd();
?>

<?php

if (!empty($_SESSION['codeagence'])) {
  $codeagence = ($_SESSION['codeagence']);
  $statement = $bdd->prepare("SELECT * FROM client WHERE codeagence = ?");
  $statement->execute(array($codeagence));
  $item = $statement->fetch();
  $ClientID     = $item['ClientID'];
  $nomagence     = $item['nomagence'];
}

if (!empty($_SESSION['codeagence'])) {
  $codeagence = ($_SESSION['codeagence']);
  $statement = $bdd->prepare("SELECT * FROM agence WHERE codeagence = ?");
  $statement->execute(array($codeagence));
  $item = $statement->fetch();
}
if (isset($_POST['supprimer'])) {
  $ClientID    = ($_POST['ClientID']);
  $statement = $bdd->prepare("DELETE FROM client WHERE ClientID = ? ");
  $statement->execute(array($ClientID));
}
if (isset($_POST['archiver'])) {
  $statement = $bdd->prepare("INSERT INTO client_archive (codeagence, nomagence, numbi, prenomclient, nomclient, dateevenement, nomevenement, destination, telclient, mailclient, adresseclient, cpclient, villeclient, prenomconjoint, nomconjoint, mailconjoint, telconjoint, imgclient, message, pwdclient)
    SELECT codeagence, nomagence, numbi, prenomclient, nomclient, dateevenement, nomevenement, destination, telclient, mailclient, adresseclient, cpclient, villeclient, prenomconjoint, nomconjoint, mailconjoint, telconjoint, imgclient, message, pwdclient FROM client WHERE ClientID = ?");
  $statement->execute(array($ClientID));
}
if (isset($_POST['archiver'])) {
  $statement = $bdd->prepare("DELETE FROM client WHERE ClientID = ?");
  $statement->execute(array($ClientID));
}
?>

<div class="container-fluid">
  <div class="row justify-content-center">

    <div class="col-lg-12 bg-secondary text-white text-center mb-4">
      <h2>Liste des clients de l'agence <strong><?php echo $nomagence ?></strong></h2>
    </div>

    <div class="col-auto mb-4">
      <table class="table-responsive">
        <tr>
          <td>
            <?php
            echo '<form method="post" action="liste_client_archive.php" role="form">';
            echo '<input type="submit" name="submit3" class="btn btn-warning" value="Liste des clients archivés">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="ajout_client.php" role="form">';
            echo '<input type="submit" name="submit1" class="btn btn-warning" value="Ajouter un client">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="espace_agence.php" role="form">';
            echo '<input type="submit" name="submit2" class="btn btn-warning" value="Retour vers l\'espace agence">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="" role="form">';
            echo ' <a href="logout.php" type="text" class="btn btn-danger">Déconnexion</a> ';
            echo '</form>';
            ?>
          </td>
        </tr>
      </table>
    </div>

    <div class="col-auto">
      <table class="table-responsive">
        <thead>
          <tr>
            <th class="font-weight-normal">Prénom</th>
            <th class="font-weight-normal">Nom</th>
            <th class="font-weight-normal">N° BI</th>
            <th class="font-weight-normal">N° mobile</th>
            <th class="font-weight-normal">Email</th>
            <th class="font-weight-normal">Adresse</th>
            <th class="font-weight-normal">CP</th>
            <th class="font-weight-normal">Ville</th>
            <th class="font-weight-normal">Prénom du conjoint</th>
            <th class="font-weight-normal">Nom du conjoint</th>
            <th class="font-weight-normal">Modifier</th>
            <th class="font-weight-normal">Supprimer</th>
          </tr>
        </thead>
        <tbody>
          <?php
          $statement = $bdd->prepare('SELECT * FROM client WHERE archive = "non" AND nomagence="' . $item['nomagence'] . '"');
          $statement->execute();
          while ($item = $statement->fetch()) {
            echo '<tr>';
            echo '<td>' . ucfirst($item['prenomclient']) . '</td>';
            echo '<td>' . strtoupper($item['nomclient']) . '</td>';
            echo '<td>' . $item['numbi'] . '</td>';
            echo '<td>' . wordwrap(($item['telclient']), 2, ' ', true) . '</td>';
            echo '<td>' . $item['mailclient'] . '</td>';
            echo '<td>' . $item['adresseclient'] . '</td>';
            echo '<td>' . $item['cpclient'] . '</td>';
            echo '<td>' . strtoupper($item['villeclient']) . '</td>';
            echo '<td>' . ucfirst($item['prenomconjoint']) . '</td>';
            echo '<td>' . strtoupper($item['nomconjoint']) . '</td>';

            echo '<td>';
            echo '<form method="post" action="update_client_profil.php" role="form">';
            echo '<input id="ClientID" type="hidden" name="ClientID" value="' . $item['ClientID'] . '"> ';
            echo '<input type="submit" name="submit1" class="btn btn-primary" value="Modifier">';
            echo '</form>';
            echo '</td>';
            echo ' ';
            
            echo '<td>';
            echo '<form method="post" action="liste_client.php" role="form">';
            echo '<input id="ClientID" type="hidden" name="ClientID" value="' . $item['ClientID'] . '"> ';
            echo '<input type="submit" name="supprimer" class="btn btn-danger" value="Supprimer">';
            echo '</form>';
            echo '</td>';
            echo '</tr>';
          }
          ?>
        </tbody>

      </table>
    </div>
  </div>
</div>
<?php require_once('_footer.php'); ?>


2°) Page liste des dons :

<?php session_start(); ?>


<?php
require_once('_nav.php');
require_once('_head.php');
require_once('../fonctions/bdd.php');
$bdd = bdd();
?>

<?php

if (!empty($_SESSION['codeagence'])) {
  $codeagence = ($_SESSION['codeagence']);
  $statement = $bdd->prepare("SELECT * FROM agence WHERE codeagence = ?");
  $statement->execute(array($codeagence));
  $item = $statement->fetch();
  $nomagence    = $item['nomagence'];
}

if (!empty($_SESSION['codeagence'])) {
  $codeagence = ($_SESSION['codeagence']);
  $statement = $bdd->prepare("SELECT * FROM don WHERE codeagence = ?");
  $statement->execute(array($codeagence));
  $item = $statement->fetch();
}

if (!empty($_SESSION['codeagence'])) {
  $codeagence = ($_SESSION['codeagence']);
  $statement = $bdd->prepare("SELECT * FROM client WHERE codeagence = ?");
  $statement->execute(array($codeagence));
  $item = $statement->fetch();
}

if (isset($_POST['supprimer'])) {
  $statement = $bdd->prepare("DELETE FROM don WHERE DonID = ? ");
  $statement->execute(array($DonID));
}

?>

<div class="container-fluid">
  <div class="row justify-content-center">

    <div class="col-lg-12 bg-secondary text-white text-center mb-4">
      <h1>Gestion des dons en cours de l'agence <strong><?php echo $nomagence ?></strong></h1>
    </div>

    <div class="col-auto mb-4">
      <table class="table-responsive">
        <tr>
          <td class="text-left">
            <?php
            echo '<form method="post" action="liste_don_archive.php" role="form">';
            echo '<input type="submit" name="submit3" class="btn btn-warning" value="Liste des dons archivés">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="ajout_don.php" role="form">';
            echo '<input type="submit" name="submit1" class="btn btn-warning" value="Ajouter un don manuellement">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="espace_agence.php" role="form">';
            echo '<input type="submit" name="submit3" class="btn btn-warning" value="Retour vers l\'espace agence">';
            echo '</form>';
            ?>
          </td>
          <td>
            <?php
            echo '<form method="post" action="" role="form">';
            echo ' <a href="logout.php" type="text" class="btn btn-danger">Déconnexion</a> ';
            echo '</form>';
            ?>
          </td>
        </tr>
      </table>
    </div>

    <div class="col-auto">
      <table class="table-responsive">
        <thead>
          <tr class="bg-dark text-white">
            <th class="font-weight-normal">N° du Don</th>
            <th class="font-weight-normal">Date du paiement</th>
            <th class="font-weight-normal">Prénom du donateur</th>
            <th class="font-weight-normal">Nom du donateur</th>
            <th class="font-weight-normal">Mail du donateur</th>
            <th class="font-weight-normal">N° mobile du donateur</th>
            <th class="font-weight-normal">Bénéficiaires(s)</th>
            <th class="font-weight-normal">Montant</th>
            <th class="font-weight-normal">Mode de paiement</th>
            <th class="font-weight-normal text-center">Supprimer</th>
          </tr>
        </thead>
        <tbody>
          <?php
          if (!empty($_SESSION['codeagence'])) {
            if ($item['archive'] = "non") {
          $statement = $bdd->prepare('SELECT * FROM don WHERE nomagence="' . $item['nomagence'] . '"'); 
          $statement->execute();

          while ($item = $statement->fetch()) {
            echo '<tr>';

            echo '<td>' . ($item['DonID']) . '</td>';
            $timestamp = $item['datetransaction'];
            $format = 'd/m/Y - H:m:s';
            echo '<td>' . date($format, $timestamp) . '</td>';

            echo '<td>' . ucfirst($item['prenomdonateur']) . '</td>';
            echo '<td>' . strtoupper($item['nomdonateur']) . '</td>';
            echo '<td>' . ($item['maildonateur']) . '</td>';
            echo '<td>' . wordwrap(($item['teldonateur']), 2, ' ', true) . '</td>';
            echo '<td>' . strtoupper($item['nomclient']) . '</td>';
            echo '<td class="text-right pr-5">' . substr($item['montantdon'], 0, -2) . ' €</td>';
            echo '<td>' . ($item['nompaymode']) . ' </td>';

            echo '<td class="text-left">';
            echo '<form method="post" action="" role="form">';
            echo '<input id="DonID" type="hidden" name="DonID" value="' . $item['DonID'] . '"> ';
            echo '<input type="submit" name="supprimer" class="btn btn-danger" value="Supprimer">';
            echo '</form>';
            echo '</td>';
            echo '</tr>';
          }}}
          ?>
        </tbody>
        <foot>
          <tr class="bg-success">
            <td colspan=5 class="text-white text-right font-weight-bold pr-5">Montant total des dons</td>
            <?php
            
            $statement = $bdd->query('SELECT SUM(montantdon) FROM don WHERE codeagence="' . $codeagence . '"');
            while ($item = $statement->fetch()) {
              echo '<td colspan=3 class="text-white text-right font-weight-bold pr-5">' .  substr($item['SUM(montantdon)'], 0, -2) . ' €</td>';
            } ?>
            <td></td>
            <td></td>
            <td></td>
          </tr>
        </foot>
      </table>
    </div>

  </div>
</div>

<?php require_once('_footer.php'); ?>


2°) C'est ce bout de code qui me pose problème :

          if (!empty($_SESSION['codeagence'])) {
            if ($item['archive'] = "non") {
          $statement = $bdd->prepare('SELECT * FROM don WHERE nomagence="' . $item['nomagence'] . '"'); 

Quelle requête pour
1°) demander d'afficher les données de la tables don avec la conditon "WHERE nomagence="' . $item['nomagence'] . '"'); " qui elle fonctionne puisque le SELECT est sur la table "don"
2°) En même temps demander d'afficher le données de la table don avec la condition if ($item['archive'] = "non") puisqu'il s'agit là de la table client.

D'avance mille mercis de votre aide si vous pouvez.
Bien cordialement +++
Bonjour,
En faisant une jointure sur la table 'client' avec une condition sur le champ 'archive' de cette table:

$bdd->prepare(
'SELECT * FROM don 
inner join client on client.nomclient = don.nomclient 
WHERE nomagence="' . $item['nomagence'] . '" and  client.archive = "non"')

Modifié par loicbcn (03 Nov 2022 - 12:31)
Bonjour loicdcn,
Mille mercis de ta réponse.

J'ai effectivement déjà essayé la jointure des 2 tables, mais cela ne fonctionnait pas non plus, mais j'ai fait une grosse bourde, j'ai d'abord joint la table client et ensuite j'ai ajouté ma clause WHERE en notant les deux conditions avec AND. Voici ce que j'ai essayé qui n'a donc pas fonctionné :

'SELECT D.DonID, D.nomagence, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
JOIN client C ON D.nomclient = C.nomclient
WHERE nomagence="' . $item['nomagence'] . '" AND C.archive = "non"
');

Je viens d'essayer ton code, mais le systeme n'affiche toujours pas les dons, sans toutefois signaler d'erreur.
J'ai donc fait comme ceci :

$statement = $bdd->prepare(
'SELECT * FROM don 
WHERE nomagence="' . $item['nomagence'] . '"
INNER JOIN client ON client.nomclient = don.nomclient 
WHERE client.archive = "non" ');
            
$statement->execute();

while ($item = $statement->fetch()) {

J'ai bien essayé avec une syntaxe différente (en renomant les champs et les tables, comme je le fait habituellement dans mes jointures, mais c'est pareil, pas d'affichage des dons et toujours pas d'erreur signalée ! J'ai fait cmomme ceci :

$statement = $bdd->prepare(
'SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.paymode, C.archive
FROM don D
WHERE nomagence="' . $item["nomagence"] . '"
INNER JOIN client C ON C.nomclient = D.nomclient 
WHERE C.archive = "non" '); 


J'imagine que je ne dois pas être très loin de la solution, mais je ne trouve toujours pas Smiley sweatdrop . Encore merci de te pencher sur mon problème.
J'ai encore fait plusieurs tests.
1°) Si je fait ça, sans la clause WHERE nomagence, le système m'affiche bien tous les dons, mais de toutes les agences puisque la clause WHERE n'est pas renseignée.

// Ce script fonctionne. Les dons des clients non archivés s'affichent, mais de toutes les agenes puisque la  clause WHERE nomagence n'est pas active.
$statement = $bdd->prepare(
'SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
INNER JOIN client C ON D.nomclient = C.nomclient
WHERE archive = "non" ');

2°) Si je fait ça, sans la clause WHERE archive, le système m'affiche bien tous les dons et uniquement de l'agence sélectionnée,, mais aussi bien les dons des clients archivés que non archivés de cette agence, puisque clause WHERE archive n'est pas active.

$statement = $bdd->prepare(
'SELECT * FROM don D WHERE nomagence="' . $item['nomagence'] . '" ');

3°) Ce que je dois arriver à faire, c'est la combinaison des deux clauses WHERE ! Et ça je bloque...
Tout d'abord, excuse moi, il y avait une erreur dans mon premier message, je l'ai rectifiée.

Je te conseille d'exécuter ta requête directement sur la base de données, dans phpmyadmin par exemple, avant de le faire en php.

Ainsi, tu pourras voir si elle retourne des résultats, ou si elle contient des erreurs.
Lorsque les résultats souhaités s'afficheront, tu pourras intégrer la requête dans ton code php.

La requête avec jointure devrait donner le résultat escompté si la description que tu as faite de tes tables est exacte.

PS: Que se passe t-il si tu lances cette requête ? :

SELECT * FROM client where archive = 'non'

Modifié par loicbcn (03 Nov 2022 - 12:53)
Pas de soucis pour l'erreur, j'ai testé avec ton script modifié, mais ça ne fonctionne toujours pas.
Lorsque je lance cette requête, il s'affiche bien tous les dons des clients qui ne sont pas archivés.
Il me faut maintenant trouver la requête qui me permettra en plus de n'afficher que les dons (des clients qui ne sont pas archivés) de l'agence sélectionnée par $item['nomagence'].
Merci pour ton conseil d'excécuter ma requête dans la BDD, mais pour cela le problème est comment la rédiger pour que MySQL trouve l'item de nomagence :
Clairement je ne sais pas traduire cette requête PHP :
WHERE nomagence="' . $item['nomagence'] . '" ');
en requête sur MySQL.
Sais-tu comment faire cela ?
En résumé :
1°) cette requête fonctionne, elle affiche bien Les dons des clients non archivés, mais aussi de toutes les agences puisque la clause WHERE nomagence n'est pas active.

$statement = $bdd->prepare(
'SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
INNER JOIN client C ON D.nomclient = C.nomclient
WHERE archive = "non" ');

2°) cette requête fonctionne, elle affiche bien les dons des clients de l'agence sélectionnée, mais aussi bien les dons des clients archivés que non archivés de cette agence, puisque clause WHERE archive n'est pas active.

$statement = $bdd->prepare(
'SELECT * FROM don D WHERE nomagence="' . $item['nomagence'] . '" ');

3°) Il faudrait arriver à combiner ces deux requêtes et là je suis dans les choux !
Loutschi a écrit :
Sais-tu comment faire cela ?


Tu prends le nom d'une agence, par exemple "Pôle emploi" (c'est un exemple)
et tu écris ta requête dans l'onglet sql de phpmyadmin

SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
INNER JOIN client C ON D.nomclient = C.nomclient
WHERE archive = "non" and d.nomagence = "Pôle emploi"


PS: Si "nomagence" est bien un champ de la table "don"
Salut,
Je suis vraiment "c..", j'étais tellement obnibulé par la partie php de ma requête que je n'ai pas eu le reflexe d'écrire le nom de l'agence en dur ! C'est pourtant tellement évident et bien sûr le le savais. Merci de m'avoir éclairé sur ce sujet.
Ceci dit, donc, lorsque j'envois cette requête sur l'onglet SQL de PhyMyadmin, ainsi d'ailleurs que dans mon fichier php, ça fonctionne bien. J'affiche uniquement les dons des clients qui sont archivés de l'agence sélectionné. C'était bien ça le but.

$statement = $bdd->prepare(
SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
INNER JOIN client C ON D.nomclient = C.nomclient
WHERE archive = "non" and d.nomagence = "Mondialvision Voyages" ');

Mais bon sang pourquoi ce script ne fonctionne pas

WHERE d.nomagence = "' . $item['nomagence']  ');

Lorsqu'il est combiné avec :

WHERE archive = "non" 

Alors qu'il fonctionne très bien tout seul, sans âtre combiné ???
Bien sûr, j'ai essayé d'intervertir les 2 clauses, rien n'y fait.
Je n'y comprend plus rien !
Oh punaise j'ai trouvé !
J'explique si ça peut aider quelqu'un
1°) Tout d'abord à savoir que j'accède à cette page "liste_don.php depuis une page "espace_client.php. Donc depuis cette page j'envoie le nom de l'agence en POST comme ceci

<?php
echo '<form method="post" action="liste_don.php" role="form">';
echo '<input id="nomagence" type="hidden" name="nomagence" value="' . $item['nomagence'] . '"> ';
echo '<input type="submit" name="submit3" class="btn btn-block btn-secondary" value="Gestion des dons">';
echo '</form>';
?>

2°) Sur ma page "liste_don.php" je vérifie que le nom de l'agence est bien arrivé en POST avec un petit var_dump. C'est bien le cas.
3°) Je modifie ma requête en
d.nomagence="' . $_POST['nomagence'] . '"
au lieu de
d.nomagence="' . $item['nomagence'] . '"
et le tour est joué, ma requête fonctionne correctement.
Voici donc la requête complète :

'SELECT D.DonID, D.datetransaction, D.prenomdonateur, D.nomdonateur, D.maildonateur, D.teldonateur, D.montantdon, D.nompaymode, D.nomclient, C.archive
FROM don D
INNER JOIN client C ON D.nomclient = C.nomclient
WHERE archive = "non" and d.nomagence="' . $_POST['nomagence'] . '"  '
            );

Encore merci de m'avoir répondu c'est grâce à toi que j'ai trouvé car tu m'as mis sur la bonne voie pour savoir où chercher.
Smiley merci
Excellente soirée bien cordialement +++