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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 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é?
    Expertise 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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 et OVH

      Commentaire


      • #4
        sinon il te faut développer un plugin sur mesure, je vois pas comment sinon :-/
        Expertise 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)
          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)
          Développeur de marknotes, logiciel de gestion de prises de notes avec interface web et de multiples convertisseur https://github.com/cavo789/marknotes
          Mes logiciels OpenSource : https://www.avonture.be

          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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 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)
                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)
                Développeur de marknotes, logiciel de gestion de prises de notes avec interface web et de multiples convertisseur https://github.com/cavo789/marknotes
                Mes logiciels OpenSource : https://www.avonture.be

                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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 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)
                            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)
                            Développeur de marknotes, logiciel de gestion de prises de notes avec interface web et de multiples convertisseur https://github.com/cavo789/marknotes
                            Mes logiciels OpenSource : https://www.avonture.be

                            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 et sites perso chez PlanetHoster + sites gérés chez PHPNET, 1and1 et OVH

                              Commentaire

                              Annonce

                              Réduire
                              1 sur 2 < >

                              C'est [Réglé] et on n'en parle plus ?

                              A quoi ça sert ?
                              La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                              Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                              Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                              Comment ajouter la mention [Réglé] à votre discussion ?
                              1 - Aller sur votre discussion et éditer votre premier message :


                              2 - Cliquer sur la liste déroulante Préfixe.

                              3 - Choisir le préfixe [Réglé].


                              4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                              2 sur 2 < >

                              Assistance au forum - Outil de publication d'infos de votre site

                              Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                              Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                              Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                              UTILISER À VOS PROPRES RISQUES :
                              L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                              Problèmes connus :
                              FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                              Installation :

                              1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                              Archive zip : https://github.com/AFUJ/FPA/zipball/master

                              2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                              3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                              4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                              5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                              6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                              et remplacer www. votresite .com par votre nom de domaine


                              Exemples:
                              Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/
                              Pour executer le script: http://www..com/fpa-fr.php

                              Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/cms/
                              Pour executer le script: http://www..com/cms/fpa-fr.php

                              En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                              Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                              Voir plus
                              Voir moins

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X