Problème sur màj basique de table avec mysqli (Joomla 3.9.5)

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Problème sur màj basique de table avec mysqli (Joomla 3.9.5)

    Mon environnement de travail

    Joomla 3.9.5, CB 2.4.1, Php 7.2, Apache, Mysql

    Mon problème

    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:

    Code PHP:
    $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 />";

    print_r($arr);

    $nb_reserv 0;

    $maj_res 'N';

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

    if (empty(
    $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);

    print_r($arr);

    }
    // fin trajet A 
    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.

    Voici ci-dessous le dump du tableau $arr[] AVANT la màj provoquée par la réservation d'un passager:

    Code:
     Array ( [0] => 880 [1] => Lancelot du lac Martin [2] => [3] => [4] => [5] => (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":

    Code:
     Array ( [0] => 880 [1] => Lancelot du lac Martin [2] => Lendrevie Claude [3] => [4] => [5] => (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, dans le script et par Phpmyadmin donne:

    Code:
      
     880 [1] => Lancelot du lac Martin [B][2] => Lendrevie Claude [3] => Lendrevie Claude[/B] [B][4][/B] => [5] => (indisponible)
    nb: dans ces dumps, je n'ai laissé que les 6 premiers champs, en cohérence avec ce que je montre ici de mon script

    Poussant plus loin mes recherches, voici ce que je viens de détecter entre différentes versions:

    1. version en "local": Joomla 3.9.3 (+ CB 2.4.1, Php7.2, Apache, Mysql) = aucun doublon dans la base après un tel UPDATE,
    2. version sur site O2switch: Joomla 3.9.4 (+ identique ci-dessus) = aucun doublon dans la base après un tel UPDATE,

    3. version sur site O2switch: Joomla 3.9.5 stable Amani (+ identique ci-dessus) = doublon dans la base après un tel UPDATE.

    Dernières précisions
    * j'obtiens strictement les mêmes constats avec les navigateurs Mozilla 5 (cf. firefox) & Chromium,
    * j'ai tenté différents réglages tels que: avec cache Joomla, sans cache Joomla, avec Jch Optimize activé, sans Jch Optimize, ...
    et toujours avec Joomla 3.9.5: le dysfonctionnement d'un UPDATE est constant.


    QUESTION: n'y aurait-il pas un bug propre à Joomla 3.9.5 ?
    Dernière édition par Visiteur à 26/04/2019, 06h50

  • #2
    Envoyé par lendrevi Voir le message

    QUESTION: n'y aurait-il pas un bug propre à Joomla 3.9.5 ?
    Pour qu'il y ait un bug de Joomla, il faudrait que tu utilises Joomla et son framework

    Voici comment on fait les requêtes avec Joomla :

    https://docs.joomla.org/Selecting_da...g_JDatabase/fr

    et les updates :

    https://docs.joomla.org/Inserting,_U...g_JDatabase/fr

    Ensuite tu ne dis pas comment tu récupères le $id tout au début de ton script.

    Attention, il s'agit du $id de CB et pas du $id de l'utilisateur Joomla.

    Ensuite ton script tu le lances comment (plugin de CB ?)
    Tu es sur que tu ne passes pas 2x dedans ?
    Le plus sage serait de tester si le traitement n'est pas déjà fait par exemple :
    • passer $place par adresse et le décrementer à chaque passage dans la boucle).
    • Ou placer une variable globale pour éviter un 2ème passage dans la fonction.
    Dernière édition par roland_d_alsace à 26/04/2019, 08h46
    A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
    Rejoignez le Joomla Users Groupe Alsace...
    roland_d_alsace va-t-il devenir roland_du_grand_est ?

    Commentaire


    • #3
      Envoyé par roland_d_alsace Voir le message

      Pour qu'il y ait un bug de Joomla, il faudrait que tu utilises Joomla et son framework

      Voici comment on fait les requêtes avec Joomla :

      https://docs.joomla.org/Selecting_da...g_JDatabase/fr

      et les updates :

      https://docs.joomla.org/Inserting,_U...g_JDatabase/fr

      Ensuite tu ne dis pas comment tu récupères le $id tout au début de ton script.

      Attention, il s'agit du $id de CB et pas du $id de l'utilisateur Joomla.

      Bonjour et merci Roland,

      Je comprends bien et connais la méthode PDO. Par contre, je n'ai jamais lu qu'il ne fallait pas -ou plus- utiliser mysql ou mysqli. Serait-ce désormais incompatible depuis Joomla 3.9.5 ?
      Mon problème est vraiment basique, nullement sophistiqué. J'aimerais beaucoup comprendre les RAISONS d'un tel dysfonctionnement.

      Par contre, ta première affirmation m'échappe "Pour qu'il y ait un bug de Joomla, il faudrait que tu utilises Joomla et son framework" ?
      Mes investigations montrant que mon dysfonctionnement n'existait pas quand je tournais avec les versions précédentes J 3.9.3 & J 3.9.4 ont tout de même de quoi interpeller. Non ?
      D'après toi, il suffirait que j'utilise ici la méthode PDO pour que cesse ce dysfonctionnement. Si oui, grand merci pour l'info ... qui mériterait une large diffusion auprès des développeurs utilisant Joomla.

      ps: je n'avais pas vu ta remarque importante sur l'origine du $id. Très bonne remarque. Je cours vérifier ceci. Merci encore.

      Commentaire


      • #4
        Pour Roland

        Après vérification, c'est bien le "id" de la table "users" qui est systématiquement repris tel quel par CB dans ses tables et principalement dans la table "comprofiler" sur laquelle je travaille ici.

        Commentaire


        • #5
          Envoyé par lendrevi Voir le message

          Bonjour et merci Roland,

          Je comprends bien et connais la méthode PDO. Par contre, je n'ai jamais lu qu'il ne fallait pas -ou plus- utiliser mysql ou mysqli. Serait-ce désormais incompatible depuis Joomla 3.9.5 ?
          Mon problème est vraiment basique, nullement sophistiqué. J'aimerais beaucoup comprendre les RAISONS d'un tel dysfonctionnement.

          Par contre, ta première affirmation m'échappe "Pour qu'il y ait un bug de Joomla, il faudrait que tu utilises Joomla et son framework" ?
          Mes investigations montrant que mon dysfonctionnement n'existait pas quand je tournais avec les versions précédentes J 3.9.3 & J 3.9.4 ont tout de même de quoi interpeller. Non ?
          D'après toi, il suffirait que j'utilise ici la méthode PDO pour que cesse ce dysfonctionnement. Si oui, grand merci pour l'info ... qui mériterait une large diffusion auprès des développeurs utilisant Joomla.
          Je disais juste que tu utilises du pur PHP, donc le framework ne peut être mis en cause.

          Il reste ma dernière remarque alors :

          Envoyé par roland_d_alsace Voir le message

          ....
          Ensuite ton script tu le lances comment (plugin de CB ?)
          Tu es sur que tu ne passes pas 2x dedans ?
          Le plus sage serait de tester si le traitement n'est pas déjà fait par exemple :
          • passer $place par adresse et le décrémenter à chaque passage dans la boucle). -> afin que s'il y a 2ème passage dans la fonction il soit à zéro.
          • Ou placer une variable globale qui serait testée à l'entrée de la fonction pour éviter un 2ème passage dans celle-ci.
          Avec Joomla il faut bien faire attention au contexte à l'entré des événements dans les plugins, car on y passe très souvent plusieurs fois lors du traitement d'une requête http.

          Surtout que CB a son propre framework et sa propre gestion de plugins qui se rajoute à celle de Joomla.

          Je te conseille d'utiliser un IDE avec x-debug (par exemple) et un point d’arrêt dans la boucle.
          Tu verras de suite pourquoi tu y passe 2x.
          Dernière édition par roland_d_alsace à 26/04/2019, 13h15
          A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
          Rejoignez le Joomla Users Groupe Alsace...
          roland_d_alsace va-t-il devenir roland_du_grand_est ?

          Commentaire


          • #6
            Envoyé par lendrevi Voir le message
            Pour Roland

            Après vérification, c'est bien le "id" de la table "users" qui est systématiquement repris tel quel par CB dans ses tables et principalement dans la table "comprofiler" sur laquelle je travaille ici.
            De mon côté j'utilise 'user_id'.

            Mais effectivement suite à ta remarque j'ai vérifié et dans mes tables (sur plusieurs sites et plusieurs milliers de membres) id est toujours = à user_id :

            Code:
            [URL="http://serveur03.ordi-genie.com/phpmyadmin/url.php?url=https://dev.mysql.com/doc/refman/5.5/en/select.html"]SELECT[/URL] * FROM `#__comprofiler` WHERE `user_id` != `id`
            Renvoi toujours 'aucun résultat'
            Dernière édition par roland_d_alsace à 26/04/2019, 13h15
            A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
            Rejoignez le Joomla Users Groupe Alsace...
            roland_d_alsace va-t-il devenir roland_du_grand_est ?

            Commentaire


            • #7
              À ROLAND

              je ne comprends pas ce que tu veux dire par "Je te conseille d'utiliser un IDE avec x-debug (par exemple) et un point d’arrêt dans la boucle" : IDE, x-debug ???
              Je ne connais pas du tout cette technique.

              Je viens de lire des explications sur Google. Pas évident pour quelqu'un qui n'y a jamais mis les doigts.

              Ceci dit: il est impossible que je puisse exécuter n fois ce processus puisque je n'y accède qu'après avoir saisi l'identifiant du conducteur ET que -immédiatement après mon ordre "UPDATE" de la fiche de ce conducteur- j'efface cet identifiant. Et s'il est vide -cas d'une non réservation demandée- je n'entre pas dans ce module de réservation !

              Enfin, je serai un peu moins formel que toi quand tu écris: "c'est du pur php, Joomla ne peut être mis en cause". Moi, je l'interprète comme un script rapporté DANS Joomla: la gestion des buffers, des plugins, etc... intervient naturellement.
              Que penses-tu de ma découverte sur les fonctionnement du même script sous les versions de Joomla 3.9.3,4 et 5. Et où mon malaise n'apparaît qu'avec Joomla 3.9.5. Cette découverte me semble très importante.

              ps: ... mais si je suis le seul utilisateur à en parler, alors je dois commettre une erreur. J'en conviendrais alors volontiers.
              Dernière édition par Visiteur à 26/04/2019, 14h17

              Commentaire


              • #8
                J'ai généralisé la méthode PDO dans mon script: mais je n'y trouve aucune amélioration. Toujours ce sale doublon !

                Commentaire


                • #9
                  Envoyé par lendrevi Voir le message
                  À ROLAND

                  je ne comprends pas ce que tu veux dire par "Je te conseille d'utiliser un IDE avec x-debug (par exemple) et un point d’arrêt dans la boucle" : IDE, x-debug ???
                  Je ne connais pas du tout cette technique.

                  Je viens de lire des explications sur Google. Pas évident pour quelqu'un qui n'y a jamais mis les doigts.
                  Dans les installs de wamp, x-debug est pré-installé.
                  Si tu utilises Eclipse ou Netbeans pour développer tes extensions, il n'y a plus grand chose à faire pour configurer le debugger.

                  Tu trouveras des tutos sur la toile.
                  J'ai également fait quelques notes dont :
                  https://ordi-genie.com/developpement...g-sous-windows

                  ou celle-ci un peu + récemment :
                  https://ordi-genie.com/developpement...se-php-x-debug

                  Cela t'éviteras de t'arracher les cheveux ou de poser des print_r partout dans le code pour trouver un problème, comme celui objet de cette discussion.

                  Envoyé par lendrevi Voir le message
                  Ceci dit: il est impossible que je puisse exécuter n fois ce processus puisque je n'y accède qu'après avoir saisi l'identifiant du conducteur ET que -immédiatement après mon ordre "UPDATE" de la fiche de ce conducteur- j'efface cet identifiant. Et s'il est vide -cas d'une non réservation demandée- je n'entre pas dans ce module de réservation !
                  On ne sais toujours pas comment tu exécutes ton code ?

                  Comme dit plus haut un plugin peut être lancé plusieurs fois dans une même séquence mais dans des contextes différents.

                  De plus CB lance ses plugins, mais ceux de Joomla aussi.

                  En ce sens Joomla est puissant, mais ce n'est pas toujours évident à maitriser sans avoir "suivit" le code et l'ordre d’exécution des plugins avec un debugger.

                  Ensuite comment récupérés-tu ton identifiant "chauffeur", es-tu sur qu'il est effacé dans le script appelant ?

                  Envoyé par lendrevi Voir le message
                  Enfin, je serai un peu moins formel que toi quand tu écris: "c'est du pur php, Joomla ne peut être mis en cause". Moi, je l'interprète comme un script rapporté DANS Joomla: la gestion des buffers, des plugins, etc... intervient naturellement.

                  Que penses-tu de ma découverte sur les fonctionnement du même script sous les versions de Joomla 3.9.3,4 et 5. Et où mon malaise n'apparaît qu'avec Joomla 3.9.5. Cette découverte me semble très importante.

                  ...
                  Comme dit l'explication la plus probable pour moi est que tu exécutes ton code dans un plugin qui est lancé plusieurs fois par Joomla ou par CB.

                  En ce sens tu as peut-être raison (mais que partiellement) en incriminant Joomla car l'appel aux plugins peut changer.
                  Je dis "que partiellement", car c'est bien au développeur à veiller à que son code soit exécuté au bon moment et qu'une seule fois (si cela peut poser problème).

                  L'un de point les plus délicat dans le développement de plugin est de trouver le "bon événement" à utiliser et comme dit à bien tester les contextes d'exécution avant de lancer (ou pas) son code.
                  Dernière édition par roland_d_alsace à 27/04/2019, 14h07
                  A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                  Rejoignez le Joomla Users Groupe Alsace...
                  roland_d_alsace va-t-il devenir roland_du_grand_est ?

                  Commentaire

                  Annonce

                  Réduire
                  Aucune annonce pour le moment.

                  Partenaire de l'association

                  Réduire

                  Hébergeur Web PlanetHoster
                  Travaille ...
                  X