Problème lors d'un UPDATE de table avec Mysqli

Fermé
clend06 Messages postés 3 Date d'inscription jeudi 25 avril 2019 Statut Membre Dernière intervention 26 avril 2019 - Modifié le 25 avril 2019 à 15:04
clend06 Messages postés 3 Date d'inscription jeudi 25 avril 2019 Statut Membre Dernière intervention 26 avril 2019 - 26 avril 2019 à 06:13
Bonjour,
Je butte sur quelques lignes de php et mysql, où la màj d'un élément de table doublonne systématiquement. Ayant déjà passé de nombreuses heures infructueuses sur ce pépin, je serais ravi de trouver ici un bon conseil de dépannage. Voici le bloc de script qui pose problème. J'explique plus bas ce que je veux résoudre:

$req = "SELECT id, cb_pass1_1, cb_pass2_1,  cb_pass3_1,  cb_pass4_1,  cb_pass5_1, cb_pass1_2, cb_pass2_2, cb_pass3_2, cb_pass4_2, cb_pass5_2 FROM syw7g_comprofiler WHERE id=".$id;

$maj = $conn->query("SET NAMES utf8");
$maj = $conn->query($req) or die('Erreur SQL !<br>'.$req.'<br>'.mysqli_error());
$nba = $maj->num_rows;
if ($nba>0) {
$arr = mysqli_fetch_row($maj); // enregt unique du conducteur sélectionné

mysqli_free_result($maj);

echo "Nombre de places demandées = " .$places. "<br />";

$nb_reserv = 0;

$maj_res = 'N';

if ($no_trajet === 'A') {
for ($iii=1; $iii<6; $iii++) {

if ($arr[$iii]=='') {

$maj_res = 'O';
$arr[$iii] = $name_dem;  // nom de celui qui réserve

++$nb_reserv;

if ($nb_reserv == $places) break;

} // fin if ($arr...
} // fin for

if ($maj_res == 'O') {

$req = "UPDATE syw7g_comprofiler SET cb_pass1_1 = '" . $arr[1] . "', cb_pass2_1 = '" . $arr[2] . "', cb_pass3_1 = '" . $arr[3] . "', cb_pass4_1 = '" . $arr[4] . "', cb_pass5_1 = '" . $arr[5] . "'  WHERE id=".$id;

$maj = $conn->query("SET NAMES utf8");
$maj = $conn->query($req) or die('Erreur SQL !<br>'.$req.'<br>'.mysqli_error());

mysqli_free_result($maj);

}
} // fin trajet A

Edit : Correction des balises de code pour avoir la coloration syntaxique

Je cherche à mettre à jour une table où chaque ligne représente un conducteur. C'est ce que je sélecte au début. Les champs cb_xx représentent les 5 réservations possibles pour un trajet aller, puis les 5 du trajet retour.
Les lignes qui suivent sont ici pour enregistrer une nouvelle réservation par l'utilisateur ($name_dem), pour le trajet Aller seulement.
Le système fonctionne, mais lorsque je modifie par ex. le champ cb_x par le nom du demandeur lors d'une réservation par l'utilisateur, le champ immédiatement suivant est également modifié avec le même nom de demandeur. Et ceci, même si la demande de réservation ne porte que sur 1 réservation !

J'ai pisté le fonctionnement en faisant apparaître à l'écran, et en clair, les points de passage et les champs en cours de mise à jour: tout est nickel d'après le cheminement à l'écran. Mais quand j'analyse ensuite le contenu de ma table avec phpmyadmin: chaque réservation est double !

Alors j'ai imaginé que j'avais peut-être un problème de gestion des buffers, de cache, etc... Mais malgré bien des modifs, rien n'y fait.
Je n'arrive pas à interpréter ce phénomène de doublons.

Merci pour vos conseils éclairés.


Configuration: Linux / Firefox 66.0
A voir également:

5 réponses

jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
Modifié le 25 avril 2019 à 17:58
Bonjour,

Je suppose que ton souci se situe à cette ligne de code :
$arr[$iii] = $name_dem;  // nom de celui qui réserve


Et si tu testes avec un empty
if (empty($arr[$iii])) {

au lieu du
  if ($arr[$iii]=='') {


Et à la limite, si ça ne marche pas mieux, fournis nous un var_dump de ta variable $arr (avant modification)


EDIT :
Et si tu ne veux modifier qu'un seul utilisateur... il faut que tu vérifies également si tu n'as pas déjà u 'O'
if (empty($arr[$iii]) && $maj_res != 'O') {




0
clend06 Messages postés 3 Date d'inscription jeudi 25 avril 2019 Statut Membre Dernière intervention 26 avril 2019
Modifié le 25 avril 2019 à 17:57
Bonjour,

Merci Jordane pour ces conseils.

J'ai donc testé mon script en utilisant "if (empty(..." : mais le résultat est toujours le même (doublon de la personne qui réserve).
Voici ci-dessous le dump du tableau $arr[] AVANT la màj provoquée par la réservation d'un passager:

Array ( [0] => 880 [1] => Lancelot du lac Martin [2] => [3] => [4] => [5] => (indisponible) [6] => Lancelot du lac Martin [7] => Larrivée Joelle [8] => [9] => [10] => (indisponible) 


Et voici le dump du même tableau utilisé pour le Update, donc tenant compte de la réservation d'une place par le passager "Lendrevie Claude":

 Array ( [0] => 880 [1] => Lancelot du lac Martin [2] => Lendrevie Claude [3] => [4] => [5] => (indisponible) [6] => Lancelot du lac Martin [7] => Larrivée Joelle [8] => [9] => [10] => (indisponible)


Tout ceci est tout à fait correct. C'est ce que j'attends, exactement.
Mais le pépin, c'est que la vérification de la table après cette réservation par Phpmyadmin donne:

880 [1] => Lancelot du lac Martin [2] => Lendrevie Claude [3] => Lendrevie Claude [4] => [5] => (indisponible) [6] => Lancelot du lac Martin [7] => Larrivée Joelle [8] => [9] => [10] => (indisponible)


Cela ressemble fort à un problème de buffer final qui doublonnerait quand je ferme la connexion à la BDD.

nb: ne pas tenir compte dans ces dumps des champs n°6 à 10 (ils concernent le trajet Retour, absent de mon extrait de script ci-dessus)
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
25 avril 2019 à 17:58
Tu as testé mon dernier commentaire ?
if (empty($arr[$iii]) && $maj_res != 'O') {
0
Re,

Non Jordane.

Je ne peux pas ajouter cette condition car un passager est autorisé à réserver plusieurs places dans la même vacation.
J’ai simplement placé cette variable maj_res pour savoir en final si je dois informer le conducteur d’une nouvelle réservation (par un mail).
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
25 avril 2019 à 23:19
Je pense que c'est la structure de ta table qui n'est pas optimisée.
Je découperait en deux tables...
Une table trajet ( id, date, depart, destination, conducteur.... )
Une table resa_trajet ( id, id_trajet, passager )

et tu ajoutes des lignes dans ta table resa_trajet en fonction du nombre de places à réserver...

De cette façon, si demain tu veux pouvoir gérer qu'il n'y ait que 2 places... ou 7 ... tu n'auras pas à modifier la structure de ta table.
(parts du principe qu'on créé le modèle de la base de données... et qu'ensuite lors de l'utilisation de l'appli... on ne doit pas avoir à la modifier )





0

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

Posez votre question
clend06 Messages postés 3 Date d'inscription jeudi 25 avril 2019 Statut Membre Dernière intervention 26 avril 2019
26 avril 2019 à 06:13
Bonjour Jordane,

Je comprends tout à fait cette proposition d'utiliser une table indépendante pour gérer les réservations. Ce serait d'ailleurs plus logique.
Mais j'ai développé mon site avec le CMS Joomla et j'utilise ici l'extension "Community Builder" qui m'impose de placer ces champs de réservation dans leur table principale xxx_comprofiler: faute de quoi, les réservations ne seraient pas automatiquement intégrées dans le profil d'un conducteur.

Je ne peux donc pas retenir maintenant cette bonne idée.
0