Comment procéder ? (identifiant unique dans une table de base)

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

  • Comment procéder ? (identifiant unique dans une table de base)

    Bonjour,

    Pardon si ma question n'est pas dans le bon forum.

    J'ai besoin de générer un identifiant unique alphanumérique stocké en base de données, qui servira ensuite à lier la ligne de la table avec d'autres tables/documents, l'identifiant (ID) seul de la ligne ne suffisant pas, le but étant ensuite (une gageure pour moi ) d'accéder à des documents en utilisant ce token dans l'URL.
    Le champ interdit lui-même les doublons. Pour plus de chances de l'unicité, cet identifiant aura 20 caractères.
    J'ai trouvé des exemples de code PHP pour le générer. J'ai vu que uniqid() est déconseillé par les intervenants, dans le manuel de php.net (où j'admire souvent le remplacement d'une fonction simple et intégrée en une ligne par des dizaines de lignes pour faire la même chose ), donc j'utiliserai probablement une autre solution.

    Je me demande, dans la mesure où ce code sera dans un champ de formulaire et devrait être généré au moment de la validation, ce qui serait le plus simple : créer l'identifiant, tenter l'insertion par un simple INSERT et gérer l'erreur, ou vérifier d'abord par un SELECT si cet identifiant existe, retourner si besoin à la création jusqu'à ce que l'insertion soit possible.

    Merci de vos conseils !
    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
    Bonjour Robert

    Est-ce qu'une fonction native mysql ne serait pas le plus simple à mettre en œuvre ? Zéro php...

    Il s'agit de uuid(). Ici un article que je viens de trouver (et pas vraiment lu) qui semble donner plusieurs pistes en SQL : https://mysqlserverteam.com/storing-...-mysql-tables/

    Ce uuid dans un champ de la table restera à l'exploiter pour faire les liens dont tu parlais plus haut.

    En espérant que cela t'ouvre des horizons...

    Bon jeudi.
    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

    Cette anné, le JoomlaDay 2020 FR aura lieu à Bruxelles les 2 et 3 octobre 2020. Plus d'infos sur https://www.joomladay.fr

    Commentaire


    • #3
      Merci Christophe !

      Dans le formulaire (Fabrik), je ne peux utiliser que du PHP (avec donc de quoi faire une requête sur la base) ou du JavaScript.
      Je pense donc que je dois générer l'identifiant avec une fonction PHP (je ne sais pas comment je pourrais utiliser cette solution UUID de MyQSL dans du code PHP) et tenter de l'ajouter.
      J'imagine (si tant est que ce soit possible avec Fabrik - j'essaierai) que je dois ajouter dans la parie code de l'élément de formulaire la fonction de création de cet identifiant puis placer ma boucle appelant cette fonction tant que l'insertion sera impossible. Je ne sais pas si une fonction pour cette insertion serait mieux que placer son code dans la boucle (question d'un ignare... )
      La question est aussi de trouver le code le plus simple : gestion de l'erreur puisque le champ est sans doublon, ou interrogation pour savoir si la valeur peut être utilisé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
        Et pourquoi pas partir sur une formule du genre AAAAMMJJHHMMSS qui te donne déja 14 caractères quasi uniques (sauf plusieurs créations dans la même seconde).
        Il te reste 6 caractères pour un nombre aléatoire, ou calculé en partant des 14 premiers.
        Lorsque l'on se cogne la tête contre un pot et que cela sonne creux, ça n'est pas forcément le pot qui est vide.
        Confucius

        Commentaire


        • #5
          Pour le calcul, je ne pense pas avoir de difficultés, avec par exemple ces fonctions données sur PHP Sources : https://phpsources.net/code/php/chai...e-et-aleatoire

          C'est la partie insertion dans la base qui me préoccupe.
          Il est certain qu'avec 20 caractères, le risque de doublon et donc d'impossibilité d'insertion soit peu probable, mais je suis obligé de m'assurer que l'insertion est possible, soit en gérant l'erreur, soit en m'assurant moi-même que la place est libre, en utilisant le type le plus "propre" possible.
          "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


          • #6
            Après réflexion, et dans la mesure où la valeur sera automatiquement enregistrée dans la table lors de la validation (j'aurais dû y penser avant), la seule méthode est l'interrogation de la base pour vérifier l'absence de l'identifiant créé, puis un "return" de cet identifiant dans l'élément qui sera enregistré.

            Il restera ensuite à trouver comment retrouver la bonne ligne en insérant cet identifiant dans une adresse pour ouvrir une page/formulaire lié à l'inscrit et récupérer certaines de ses infos pour les compléter avec ce nouveau formulaire (par exemple autorisation parentale pour un inscrit de moins de 18 ans).
            "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


            • #7
              Bonjour,

              Pouvez-vous me dire si le code ci-dessous est correct ? Il s'agit donc de calculer un code, finalement de 10 caractères, puis de s'assurer qu'il n'existe pas déjà, et si oui boucler tant que la recherche ne renvoie plus de ligne.
              Code PHP:
              $myDb JFactory::getDbo();
              /* on cherche tant que la valeur est trouvée dans la table */
              $count 1;
              while (
              $count 0) {
              /*calcul de l'identifiant sur 10 caractères alphanumériques sans lettre O ni chiffre zéro, mis dans la variable $string */
              $string "";
              $chaine "abcdefghijklmnpqrstuvwxy123456789ABCDEFGHIJKLMNPQ RSTUVWXYZ";
              srand((double)microtime()*1000000);
              for(
              $i=0$i<10$i++) {
              $string .= $chaine[rand()%strlen($chaine)];
              }
              /* recherche de l'identifiant dans la base */
              $query $myDb
              ->getQuery(true)
              ->
              select('COUNT(*)')
              ->
              from($myDb->quoteName('hr5i3_stay'))
              ->
              where($myDb->quoteName('access_token') . " = " $myDb->quote($string));

              // Reset the query using our newly populated query object.
              $myDb->setQuery($query);
              $count $myDb->loadResult();
              }
              /* si aucun enregistrement avec ce code, on le conserve pour utilisation ultérieure */
              return $string
              Fabrik nécessite le préfixe de la table, si je ne me trompe, d'où son nom au lieu du dièse.

              Merci de votre aide !

              PS : bizarre cette longue marge sous le code
              Dernière édition par RobertG à 23/05/2020, 16h03
              "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