Problèmes de mises à jour en PHP
jordane45 Messages postés 38306 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 - 22 janv. 2024 à 20:05
- Problèmes de mises à jour en PHP
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise a jour windows 10 - Accueil - Mise à jour
- Mise a jour chromecast - Accueil - Guide TV et vidéo
- Mise a jour kindle - Guide
- Mise a jour windows 7 - Accueil - Mise à jour
6 réponses
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
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; } }
20 janv. 2024 à 14:50
Et pour les var_dump ?
Où en as-tu mis qu'est-ce qu'ils t'afficher ?
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.
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) {
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 !)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question22 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.
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... }