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 chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos 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)
    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


    • #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 chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos 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 chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos 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 chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos 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 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