Blog Emmanuel Orchanian

astuce bdd bureautique codage culture débat design énigme français hacking html mathématiques méthodologie santé typographie 

💬🔢 Les chaînes numériques

 

 [1117 vues] 2021-12-21 Emmanuel Orchanian

Aucun rapport avec la télévision 😉

Types

En informatique, on distingue deux types

  • Les textes "bonjour comment ça va ?"
  • Les nombres 0 1 2 3...

Quelque informations en vrac

  • Les textes sont appelés "chaînes de caractère" en français, et "string" en anglais parce ce que ça se traduit par... chaîne en français, tout simplement.
  • On distingue les textes parce qu'ils sont mis entre des guillemets "bonjour"

Les chaînes numériques

Ce sont les nombres sous forme de texte, par exemple "44805"

À quoi ça sert ?

Pour stocker des nombres avec lesquels on ne fera jamais de calculs

Par exemple le code d'un immeuble, une plaque d'immatriculation.

Pour stocker des nombres trop longs

En informatique, l'infini n'existe pas, par exemple sur ce serveur, le nombre le plus long pris en compte par PHP est 2147483648 (environ 2 milliards) (Mince maintenant tout le monde sait que je suis sous PHP !)

Les numéros de sécurité social sont des nombres très longs par exemple

Pour préserver les zéro à gauche

  • 007 de James Bond se transformerai en un simple 7 si on le met en nombre
  • Les codes postaux, par exemple 07 pour les Ardéchois.
    Note à ce propos : les codes postaux peuvent contenir les lettre A et B, il ne faut donc pas les considérer comme des nombres

Les données de formulaire

Qu'on le veuille ou non, toutes les données des formulaires sont sous forme de textes, même les nombres... Donc même les <input type="number"> vous donnerons des textes en vérité.

Les chaînes hybrides

J'appelle personnellement ainsi les texte qui commencent par un nombre et qui continuent avec des mots

Supposons que nous avons la catégorie 17 est celle des rouges à lèvres pour e-commerce de cosmétiques.

  • Si j'écris dans mon URL https://maboutique/categorie/rouge-a-levres, c'est bien, mais en base de données, les catégories (et quasiment tout ce qui existe) est identifié avec des nombres. Donc rouge-a-levres n'a aucun sens pour l'ordinateur, lui ce qu'il veut c'est un numéro, le 17 dans notre cas.
  • Si j'écris 17, l'ordinateur aime ça, mais l'être humain lui se demande Mais qu'est ce que c'est la catégorie 17 ?
codage problème homme machine
Il y a donc un problème entre les humains et les machines :
  • les ordinateurs préfèrent les nombres comme "17", mais cela ne parle pas aux humains
  • les humains préfèrent les textes comme "catégorie rouge à lèvre", mais celà est difficile à traiter pour les ordinateurs

Comment concilier les deux ?

En écrivant une chaîne hybride sous la forme "17-rouge-a-levres"

  • L'être humain comprend en lisant l'URL qu'on est dans la catégorie des rouges à lèvres
  • On peux récupérer le 17 au début ligne pour l'ordinateur (voir la partie suivante)

Récupérer un nombre en début de texte

Par exemple dans le texte "3 pommes", je veux récupérer le nombre 3

PHP

On peux faire un casting en écrivant le type qu'on veut entre parenthèses avant le reste

$nombre = (int) "3 pommes"

On peux aussi utiliser la fonction dédiée pour ça, intval

$nombre = intval("3 pommes") ;

c'est ce que je fais personnellement.

  • Le PHP lit la chaîne de la gauche vers la droite, il enlève les espaces et les zéro de gauche, puis s'il tombe sur un charactère différent d'un chiffre arabe, il arrête.
  • si le nombre ne commence pas par un nombre, alors PHP considère cela comme zéro.
  • n'écrivez pas des chaînes bizarres comme " 20 pommes" , "00020 pommes" "0x20 pommes" "0b pommes" contentez-vous d'un simple trait nombre suivi d'un trait d'union et de la suite en kebab et tout ira bien "20-pommes"

JavaScript

On peux utiliser la fonction parseInt

let nombre = parseInt("3 pommes") |0

ASTUCE : si le JavaScript remplacera "0-pommes" par 0 et "pomme" par NaN qui signifie "Not a number" (ce n'est pas un nombre).
Si on veux que le JavaScript ai le même comportement que le PHP et qu'il remplace le NaN (not a number) par un zéro, on peux rajouter |0 par la suite :

let nombre = parseInt("pommes")|0

Utile pour rallier confort et sécurité

Dans la réception des données de formulaire, tout est sous forme de texte qu'il faut ensuite nettoyer à l'eau de javel pour ne pas risquer de se faire hacker les base de données par des données maveillante ou maladroites.

On est alors habitué à envoyer un nombre et à la récupération utiliser un simple intval qui transforme le texte numérique en nombre, "55" se tranformerai en 55, et les tentatives de hacking "';-- onclick> etc." se transformeraient en 0, puisque en base de données les identifiants commencent par 1, il est alors facile de détourner les choses.

Je conseille ainsi lors de l'envoi de ne pas envoyer des nombres mais des chaînes hybrides écrit en kebab-case 17-rouge-a-levre au lieu d'un simple 17, car c'est ainsi plus confortable à comprendre et à débugguer, et à la réception ça ne soulève point de danger puisqu'on récupèrerai un nombre de tout façon.

Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.