Fonction Joomla! pour tester l'existence d'une table ?

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

  • [RÉGLÉ] Fonction Joomla! pour tester l'existence d'une table ?

    Bonjour,

    Ma question dans une autre discussion étant peut-être passée inaperçue, je la repose ici.

    Lors de la désinstallation de Joaktree, des tables sont volontairement conservées pour ne pas perdre un certain nombre de paramétrages. Lorsqu'on réinstalle, il y a bien l'utilisation de "IF NOT EXISTS" pour ne recréer la table que si elle a bien été effacée, mais le script originel remplit les tables sans se soucier du fait qu'elles existaient déjà et n'étaient pas vides, d'où des erreurs bloquantes.
    En remplaçant "INSERT INTO" par "INSERT IGNORE INTO", le problème est réglé, mais je préfèrerais pouvoir m'assurer que la table n'existait pas avant l'installation et ne pas tenter d'ajouter des données inutilement, ça me semblerait plus "propre".

    Y a-t-il une solution interne à Joomla! permettant de ne pas aller chercher les infos d'accès à la base dans le fichier de configuration et d'utiliser une fonction "maison" pour ce test ?

    Merci de votre aide !
    Robert
    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

  • #2
    hello RobertG , à ma connaissance je ne pense pas qu'il y ai quelque chose de natif pour pallier à ce problème.
    j'ai peur que ce soit du manuel la :-/
    car en effet le IF NOT EXISTS regarde juste si la table existe ou non, cela ne tient pas compte du contenu.
    tu n'as pas moyen de scripter quelque chose de ton coté?
    Expert en conception et réalisation de sites Internet 100% Joomla
    www.toonetcreation.com

    Commentaire


    • #3
      Oui, je vais être obligé de récupérer les infos de configuration pour pouvoir accéder hors-Joomla! à la base et vérifier si les tables existent déjà.
      Le plugin LazyDbBackup utilise déjà un tel accès à la base puis liste les tables et récupère structure et données pour la sauvegarde, mais c'est plus lourd qu'une fonction intégrée.
      "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
      MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

      Commentaire


      • #4
        sinon il te faut développer un plugin sur mesure, je vois pas comment sinon :-/
        Expert en conception et réalisation de sites Internet 100% Joomla
        www.toonetcreation.com

        Commentaire


        • #5
          Bonjour

          Sauf erreur de compréhension, ... tu n'es pas encore dans Joomla ...

          Ton IF NOT EXISTS; je suppose, c'est dans ton fichier d'installation .sql. Le fichier est traité en une seule fois et c'est le job de mySQL / Postgres / ... de traiter les instructions SQL.

          Ce n'est qu'après le traitement que tu bascules dans du code PHP; pas pendant.

          La réponse à ta question est donc que c'est impossible de le faire en PHP.
          Christophe (cavo789)
          Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
          Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

          Commentaire


          • #6
            Bonjour Robert,

            Je vais peut-être dire des bêtises.
            Tu ne peux pas tester la situation dans le script install.php de l'extension.
            UP, le plugin universel à découvrir sur https//up.lomart.fr
            bgMax
            , AdminOrder, MetaData, Zoom, ArtPlug, Custom, Memo, Filter, ... sur http://lomart.fr/extensions

            Commentaire


            • #7
              Bonjour Christophe,

              Non, c'est un script PHP qui, si ce n'est pas une mise à jour, va créer les tables et dans la foulée en remplir certaines.
              Il y a donc l'instruction "IF NOT EXISTS" pour la création de la table, mais pas de test de l'existence préalable de données.
              Comme on conserve certaines tables pour ne pas perdre des paramétrages précédents, il faut tenir compte de leur existence préalable.

              C'est ce test que je souhaite : savoir, avant la création de la table, si elle existe déjà, auquel cas il ne faudra pas ajouter de données, puisqu'elles sont déjà présentes.
              Il faut donc se connecter à la base avant le "CREATE IF NOT EXISTS" pour vérifier si la table existe déjà, et dans ce cas ne pas lancer la création et la série d'INSERT, ce qui me semble plus propre que INSERT IGNORE.
              Donc récupération des données de configuration, connexion à la base, listing des tables et si celle concernée est trouvée, un flag permettant de sauter cette étape.

              Oui, Loïc, c'est ce que je veux faire mais j'aurais préféré éviter la connexion manuelle à la base pour en lister les tables, si une fonction Joomla! existait.
              "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
              MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

              Commentaire


              • #8
                Okido, perso, je voyais un gros SQL avec plein d'instructions type "CREATE TABLE IF NOT EXISTS table_name( column_1_definition, column_2_definition, ..., table_constraints ) ..."; d'où ma tentative de réponse.
                Christophe (cavo789)
                Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                Commentaire


                • #9
                  Salut Robert

                  Si je comprend bien tu veux que l'installateur n’exécute le script en administrator/components/com_joaktree/sql/install.mysql.utf8.sql que si un table particulière du composant n'existe pas déjà ?

                  Je n'ai pas accès au code de la dernière version d joaktree actuellement, mais dans la version que j'ai pu consulter, apparemment tout est géré dans un script en /administrator/component/com_joaltree/joaktree.script.php et il n'y a pas de script sql.

                  Tu peux donc tester l’existence d'une table ou d'un élément avant de lancer toute la série d'insert (méthode install)
                  Dernière édition par roland_d_alsace à 22/12/2020, 13h29
                  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


                  • #10
                    Il y a ce fichier joaktree.script.php en effet, qui va, comme je l'ai dit, créer les tables si elles n'existent pas, mais les remplit même si elles ne sont pas vides.
                    Regarde par exemple dans ce script la table #__joaktree_display_settings : on la crée si elle n'existe pas, mais on la remplit quoi qu'il en soit. Dans mon fichier actuel, c'est ligne 110

                    Et oui, je peux et veux tester, mais comme le précise mon premier message, j'aurais aimé qu'une fonction de Joomla! existe pour ça plutôt qu'ajouter une fonction maison.
                    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                    Commentaire


                    • #11
                      Code PHP:
                       /**
                      * Cherche si le table existe en db
                      * @param string $tablename nom de la table cherchée par exemple #__users
                      * @return boolean
                      */
                      public static function TableDbExist($tablename){
                      $db JFactory::getDBO();
                      $tablename $db->replacePrefix($tablename);
                      $Ttables $db->getTableList();
                      $found=false;
                      foreach (
                      $Ttables as $Table){
                      if(
                      $Table == $tablename){
                      $found=true;
                      break;
                      }
                      }
                      return 
                      $found;

                      RobertG aime ceci.
                      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


                      • #12
                        Merci Roland !
                        Il y a donc bien dans Joomla! cette fonction.
                        Ton code est beaucoup plus court que ce que j'avais commencé et pas encore testé :
                        Code PHP:
                         function SearchTable($tablename) {
                        $db JFactory::getDBO();
                        $config JFactory::getConfig();
                        $jk_host $config->get('host');
                        if(
                        $jk_host=='localhost'){
                        $jk_host '127.0.0.1';
                        }
                        $jk_user $config->get('user');
                        $jk_password $config->get('password');
                        $lb_db $config->get('db');
                        $jk_prefix $config->get('dbprefix');
                        $searched_table str_replace ('#__'$jk_prefix$tablename);
                        try {
                        $this->handler mysqli_connect($jk_host$jk_user$jk_password$jk_db);
                        $value true;
                        } catch (
                        PDOException $e) {
                        $this->handler null;
                        $this->error[] = $e->getMessage();
                        return 
                        false;
                        }
                        if (!(
                        $tables $this->_GetTables($jk_prefix)))
                        {
                        return 
                        false;
                        }
                        foreach (
                        $tables as $table)
                        {
                        if (
                        $table == $searched_table) {return true ; }
                        }
                        return 
                        false;

                        "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                        MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                        Commentaire


                        • #13
                          je ne comprends pas, j'ajoute la fonction TableDbExist ci-dessus dans joaktree.script.php, j'entoure par exemple par
                          if (TableDbExist('#__joaktree_display_settings') == false) {
                          les tables que je veux protéger, et à l'installation :
                          0 Call to undefined function TableDbExist()
                          "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                          MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                          Commentaire


                          • #14
                            Salut Robert

                            Cette fonction très certainement celle d'un objet, vérifie si tu ne dois pas y accéder au travers d'un objet du style $db->TableDbExist(). (non vérifié)


                            Edit. En fait non, je relis le code de la fonction et elle utilise déjà $db aussi elle n'appartient pas à cet objet. J'ai l'impression que cette fonction est une proposition de Roland, copie colle la fonction dans ton code source (sous forme de helper cád une fonction statique appelable de n'importe où) et tu pourras l'utiliser.
                            Dernière édition par cavo789 à 22/12/2020, 20h08
                            Christophe (cavo789)
                            Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                            Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                            Commentaire


                            • #15
                              Merci Christophe !
                              Ce qui ne me paraît pas logique c'est qu'elle ne soit pas reconnue alors qu'elle est dans le même fichier que la fonction de création des tables.
                              "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                              MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X