Problèmes de mises à jour en PHP

Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 - Modifié le 19 janv. 2024 à 17:41
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 - 22 janv. 2024 à 20:05

 Bonjour,

J'ai un problème de mises à jour qui ne se fait pas quand les conditions ne sont pas réunies.

j'ai un formulaire pour afficher des informations, en plus j'ai une méthode qui m'affichent des informations provenant d'autre table en rapport avec la page.

les infos viennent de la table 'customers' et les autres infos par exemple de la tables 'emails'

quand j'ai des données provenant de la table 'emails' je peux faire les mises à jour, quand il n'y a pas d'email provenant de la table 'emails' la mises à jour ne fonctionne plus

je récupère les infos de la tables emails comme ça :

                        <?php $emailData = $manager->displayCustomerEmails(); ?>
                        <?php foreach ($emailData as $indexEmail => $emails) : ?>
                            <?php if (!empty($emails['email'])) : ?>
                                <div class="row">
                                    <!-- left column -->
                                    <div class="col-md-11">
                                        <div class="form-group">
                                            <label>Email <?php echo $index + 2; ?> :</label>
                                            <input type="text" class="form-control" name="emails[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['email']); ?>">
                                            <input type="hidden" name="email_ids[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">
                                            <input type="hidden" name="id_emails" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">

                                        </div>
                                    </div>
                                    <div style="margin-top:35px;">
                                        <div class="col-md-1">
                                            <div class="form-group">
                                                <button type="submit" class="btn btn-outline-danger  btn-sm" name="deleteEmail"><i class="fa fa-trash"></i></button>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            <?php endif; ?>
                        <?php endforeach; ?>

voici le code du traitement qui me pose problème :

if (!empty($_POST)) {

    // Instanciation de la classe CustomerManager
    $manager = new CustomerManager();


    if (isset($createCustomer)) {
        // On crée le client si toutes les conditions sont réunies
        $result = $manager->creaCustomer($fullname);
        if ($result) {
            // echo "<script type='text/javascript'>document.location.replace('../array/customers.php');</script>";
            exit; // Toujours mettre un exit après une redirection
        }
    }


    $id_emails = valid_donnees(isset($_POST["id_emails"]) ? $_POST["id_emails"] : '');
    $id_phones = valid_donnees(isset($_POST["id_phones"]) ? $_POST["id_phones"] : '');
    $currentmail =  (isset($_POST["currentmail"]) ? $_POST["currentmail"] : '');

    if (isset($updateCustomer)) {


                // Vérifier si $_POST['email_ids'] est défini
                if (isset($_POST['email_ids'])) {
                    // Vos traitements pour les e-mails...
                    foreach ($_POST['email_ids'] as $indexEmail => $id_emails) {
                        $email = $_POST['emails'][$indexEmail];
                     // var_dump($id_emails);



                                $result = $manager->updCustomer($id_customers, $fullname, $id_type_of_customers, $currentmail, $street, $city, $zipcode, $code, $buildind, $floor,  $id_emails, $email, $id_phones, $phone, $id_contacts, $contact);

                                if ($result) {
                                    // Mise à jour réussie
                                    // Redirection ou autre traitement...
                                }
                            }
                        }
                    }
                }

A voir également:

6 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
19 janv. 2024 à 19:52

Bonjour,

Je ne vois pas, dans le code que tu nous montres, la balise FORM qui spécifie l'action et la méthode utilisée.

Je vois également que tu as des var_dump en commentaire dans ton code... quand tu les décommentes.. qu'est-ce qu'ils t'affichent ? n'hésitent pas à en ajouter d'autres pour voir le contenu de tes différentes variables et ainsi essayer de comprendre ce qui ne va pas.

Au passage... nous ne savons rien non plus du code des différentes méthodes que tu utilises via ta class manager.

Et enfin ..  pour peu que tu utilises PDO pour effectuer tes requêtes SQL, pense à appliquer les infos données ici : 

https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs


0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
20 janv. 2024 à 13:24

Bonjour Jordan,

Les erreurs sont bien activés.

le form :


<form method="POST" action="">
                    <div class="card-body">
                        <div class="form-group">
                            <label>Prénom, Nom :</label>
                            <code>.ou raison sociale</code>
                            <input type="text" class="form-control" name="fullname" value="<?php echo htmlspecialchars($customerData['fullname']); ?>">
                            <!-- champs caché customers_id, sinon la mises à jour ne se fait pas -->
                            <input type="hidden" class="form-control" name="id" value="<?php echo $user['id']; ?>" readonly="true">
                            <input type="hidden" class="form-control" name="customer" value="<?php echo htmlspecialchars($customerData['customer']); ?>" readonly="true">
                            <input type="hidden" class="form-control" name="id_customers" value="<?php echo htmlspecialchars($customerData['id_customers']); ?>" readonly="true">
                        </div>       
                        <div class="form-group">
                            <label>Email :</label>
                            <input type="text" class="form-control" name="currentmail" value="<?php echo htmlspecialchars($customerData['currentmail']); ?>">
                        </div>
                        <?php $emailData = $manager->displayCustomerEmails(); ?>
                        <?php foreach ($emailData as $indexEmail => $emails) : ?>
                            <?php if (!empty($emails['email'])) : ?>
                                <div class="row">
                                    <!-- left column -->
                                    <div class="col-md-11">
                                        <div class="form-group">
                                            <label>Email <?php echo $index + 2; ?> :</label>
                                            <input type="text" class="form-control" name="emails[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['email']); ?>">
                                            <input type="hidden" name="email_ids[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">
                                            <input type="hidden" name="id_emails" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">
                                            <?php endif; ?>
                                    <?php endforeach; ?>
                                </div>
                                <!-- /.card-body -->
                                <div class="card-footer">
                                    <button type="submit" name="updateCustomer" class="btn btn-primary">Valider</button>
                                </div>
                </form>

la méthode pour afficher les emails :

  public function displayCustomerEmails()
  {
    $db = getDB();

    $id_customers = valid_donnees(isset($_GET["id_customers"]) ? $_GET["id_customers"] : '');

    $stmt = $db->prepare("SELECT 
                customers.id_customers as id_customers,
                emails.id_emails as id_emails,
                emails.email as email                        
                FROM customers 
                LEFT JOIN users ON customers.id = users.id
                LEFT JOIN emails ON customers.id_customers = emails.id_customers AND emails.id = :user_id
                WHERE customers.id_customers=:id_customers AND customers.id = :user_id");

    $stmt->bindParam(':user_id', $_SESSION['user_id']);
    $stmt->bindParam(':id_customers', $id_customers);
    $stmt->execute();

    return $stmt->fetchAll(PDO::FETCH_ASSOC); // Assurez-vous que le résultat est un tableau associatif
  }

la méthode pour le update :

public function updCustomer($id_customers, $fullname, $id_type_of_customers, $currentmail, $street, $city, $zipcode, $code, $buildind, $floor,  $id_emails, $email)
  {

    $currentmail =  (isset($_POST["currentmail"]) ? $_POST["currentmail"] : '');


    $db = getDB();

    $sql = "UPDATE customers                               
    INNER JOIN users ON customers.id = users.id
  
    SET
    customers.fullname = :fullname,
    customers.id_type_of_customers = :id_type_of_customers,
    customers.currentmail = :currentmail,    
    customers.street = :street,
    customers.city = :city,
    customers.code = :code,
    customers.zipcode = :zipcode,
    customers.buildind = :buildind,
    customers.floor = :floor

    WHERE customers.id_customers = :id_customers AND users.id = :user_id";

    try {
      // Prepare statement
      $stmt = $db->prepare($sql);
      $stmt->bindParam(':id_customers', $id_customers);
      $stmt->bindParam(':fullname', $fullname);
      $fullname = ucfirst($fullname);
      $stmt->bindParam(':id_type_of_customers', $id_type_of_customers);
      $stmt->bindParam(':currentmail', $currentmail);
      $currentmail = strtolower($currentmail);
      $stmt->bindParam(':street', $street);
      $stmt->bindParam(':city', $city);
      $city = strtoupper($city);
      $stmt->bindParam(':zipcode', $zipcode);
      $stmt->bindParam(':code', $code);
      $stmt->bindParam(':buildind', $buildind);
      $stmt->bindParam(':floor', $floor);
      $stmt->bindParam(':user_id', $_SESSION['user_id']);
      $stmt->execute();



     

      // Mises à jour des emails
      $sqlEmails = "UPDATE emails SET email = :email WHERE id_emails = :id_emails";
      $sqlEmails = $db->prepare($sqlEmails);
      $sqlEmails->bindParam(':email', $email);
      $sqlEmails->bindParam(':id_emails', $id_emails);
      $sqlEmails->execute();


    } catch (Exception $e) {
      echo "Erreur dans la requête " . $sql;
      echo $e->getMessage();
      exit;
    }
  }
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
20 janv. 2024 à 14:50

Et pour les var_dump ?

Où en as-tu mis qu'est-ce qu'ils t'afficher ?

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
20 janv. 2024 à 18:37

En plus, en relisant ta question je vois :

quand j'ai des données provenant de la table 'emails' je peux faire les mises à jour, quand il n'y a pas d'email provenant de la table 'emails' la mises à jour ne fonctionne plus

.Dans ton code, tu essaies de faire la mise à jour dans un foreach sur les adresses mail ..

   foreach ($_POST['email_ids'] as $indexEmail => $id_emails) {
    $email = $_POST['emails'][$indexEmail];
    // var_dump($id_emails);
    $result = $manager->updCustomer($id_customers, $fullname, $id_type_of_customers, $currentmail, $street, $city, $zipcode, $code, $buildind, $floor,  $id_emails, $email, $id_phones, $phone, $id_contacts, $contact);

sauf que.. si tu n'as pas de mail...  tu n'entres pas dans cette boucle !

Moi, à ta place, je ferai :

Mise à jour des données de l'utilisateur ( sauf email)

Puis dans un second temps, si il y a des emails,  mise à jour des mails de cet utilisateur.


0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
Modifié le 20 janv. 2024 à 20:43

Oui c'est exactement ça, j'utilise une boucle pour mettre à jour les emails qui proviennent de la table email, mais ce n'est pas obligé d'avoir plusieurs email, vu que dans la table 'customers' il y a déjà un email par défaut. 

le var_dump je l'ai mis à ce niveau :

    if (isset($_POST['email_ids']) || (empty($_POST['email_ids']))) {
            foreach ($_POST['email_ids'] as $index => $id_emails) {
                // Vérifier si l'email existe dans $_POST['emails']
        $email = $_POST['emails'][$index] ?? '';
        var_dump($email);

il m'affiche ce qu'il est censé affiché :

C:\wamp64\www\test\app\class\process\customers.php:31:string '***@***' (length=14)
C:\wamp64\www\test\app\class\process\customers.php:31:string '***@***' (length=14)

Dans le form le foreach ne s'affiche que s'il y a un ou plusieurs email de la tables 'emails' quand il n'y en a pas j'ai ces messages :

Warning: Undefined array key "email_ids" in C:\wamp64\www\test\app\class\process\customers.php on 
 Warning: foreach() argument must be of type array|object, null given in C:\wamp64\www\test\app\class\process\customers.php on line 28

ça correspond a cette ligne :

foreach ($_POST['email_ids'] as $indexEmail => $id_emails) {
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
20 janv. 2024 à 21:17

Oui c'est bien ce que je te disais ...    le souci vient de ton foreach.

Il faut revoir la "logique" de ton code.

Et commence aussi par appliquer ceci : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code  ( à commencer par la récupération "propre" des variables AVANT de les utiliser !)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
22 janv. 2024 à 16:17

Le problème vient du fait que quand il n'y a pas d'email qui provient de la table : 'emails' je ne les affiche pas dans le form

Quand je fais un  POST il attend la variable  : 

<?php foreach ($emailData as $indexEmail => $emails) : ?>
<?php if (!empty($emails['email'])) : ?>

<input type="text" class="form-control" name="emails[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['email']); ?>">

<input type="hidden" name="email_ids[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">

<?php endif; ?>
<?php endforeach; ?>

Quand il n'y à pas d'email additionnel, j'ai les message d'erreurs cité plus haut. 

Pour résoudre le problème, j'ai ajouté un champ caché au dessus de ce code : 

<input type="hidden" name="email_ids[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">
<?php foreach ($emailData as $indexEmail => $emails) : ?>
<?php if (!empty($emails['email'])) : ?>

<input type="text" class="form-control" name="emails[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['email']); ?>">

<input type="hidden" name="email_ids[<?php echo $indexEmail; ?>]" value="<?php echo htmlspecialchars($emails['id_emails']); ?>">

<?php endif; ?>
<?php endforeach; ?>


ça corrige le problème, je sais pas si c'est une bonne solution, j'ai l'impression que c'est une solution de contournement.

La solution idéale, serait peut-être de gérer ça au niveau traitement pour dire que, s'il n'y pas de variable de ce type, de continuer, je pensais qu'isset servais à ça.

J'ai pas que les emails, j'ai aussi les tel et je pourrais rajouter d'autres champs, il faut que je trouve la meilleure solution.

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
22 janv. 2024 à 20:05

Malheureusement (pour moi..) je vais te redonner la même réponse que je t'ai déjà donné !

Moi, à ta place, je ferai :

Mise à jour des données de l'utilisateur ( sauf email)

Puis dans un second temps, si il y a des emails,  mise à jour des mails de cet utilisateur.

En gros, tu dois exploser ton code en deux fonctions (une pour le client, une pour ses emails)

<?php
public function updCustomer($id_customers, $fullname, $id_type_of_customers, $currentmail, $street, $city, $zipcode, $code, $buildind, $floor)
{
  $db = getDB();

  $sql = "UPDATE customers                               
  INNER JOIN users ON customers.id = users.id

  SET
  customers.fullname = :fullname,
  customers.id_type_of_customers = :id_type_of_customers,
  customers.currentmail = :currentmail,    
  customers.street = :street,
  customers.city = :city,
  customers.code = :code,
  customers.zipcode = :zipcode,
  customers.buildind = :buildind,
  customers.floor = :floor

  WHERE customers.id_customers = :id_customers AND users.id = :user_id";

  try {
    // Prepare statement
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':id_customers', $id_customers);
    $stmt->bindParam(':fullname', $fullname);
    $fullname = ucfirst($fullname);
    $stmt->bindParam(':id_type_of_customers', $id_type_of_customers);
    $stmt->bindParam(':currentmail', $currentmail);
    $currentmail = strtolower($currentmail);
    $stmt->bindParam(':street', $street);
    $stmt->bindParam(':city', $city);
    $city = strtoupper($city);
    $stmt->bindParam(':zipcode', $zipcode);
    $stmt->bindParam(':code', $code);
    $stmt->bindParam(':buildind', $buildind);
    $stmt->bindParam(':floor', $floor);
    $stmt->bindParam(':user_id', $_SESSION['user_id']);
    $stmt->execute();

  } catch (Exception $e) {
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }    
}
 
 public function updateEmail($id_emails, $email){
   $db = getDB();
  // Mises à jour des emails
  try {
    $$sql = "UPDATE emails SET email = :email WHERE id_emails = :id_emails";
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':email', $email);
    $stmt->bindParam(':id_emails', $id_emails);
    $stmt->execute();


  } catch (Exception $e) {
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }
}

Puis faire le traitement en deux temps :

//--------------------------------------------------------------
//récupération des variables AVANT de les utiliser
//--------------------------------------------------------------
// $id_emails = valid_donnees(isset($_POST["id_emails"]) ? $_POST["id_emails"] : ''); !! Pas la bonne variable !
$id_phones = valid_donnees(isset($_POST["id_phones"]) ? $_POST["id_phones"] : ''); // pas utilisé ?
$currentmail =  !empty($_POST["currentmail"]) ? trim($_POST["currentmail"]) : '';
$emails = !empty($_POST['emails']) ? $_POST['emails'] : NULL;
$emails_id = !empty($_POST['email_ids']) ? $_POST['email_ids'] : NULL;

if (isset($updateCustomer)) {
//--------------------------------------------------------------
// Mise à jour du client
//--------------------------------------------------------------
 $result['UPD_CUST'] = $manager->updCustomer($id_customers, $fullname, $id_type_of_customers, $currentmail, $street, $city, $zipcode, $code, $buildind, $floor);

// Vérifier si $emails_id est défini
if (!empty($emails_id)) {
  //--------------------------------------------------------------
  // Mise à jour des e-mails...
  //--------------------------------------------------------------
    foreach ($emails_id as $indexEmail => $id_emails) {
      $email = trim($emails[$indexEmail]);
     // var_dump($id_emails);
      $result['UPD_MAIL'][] = $manager->updateEmail( $id_emails, $email);
    }
  }
}

if ($result) {
  //print_r($result); // pour debuguer eventuellement
  // Mise à jour réussie
  // Redirection ou autre traitement...
}

0