[FIX] Problème de correspondance entre client MySQL et les entêtes

Le problème

Suite à la mise à jour de ce WordPress vers 4.5, j’ai récemment obtenu l’erreur suivante:

Warning: mysqli_real_connect(): Headers and client library minor version mismatch. Headers:50546 Library:50625

Nous allons donc voir ensemble comment la résoudre, sachant que les numéros de version peuvent être différents et que le correctif peut quand même s’appliquer correctement.

Comme bibliothèque PHP pour interagir avec MySQL, j’utilisais php5-mysql comme à peu près tout le monde mais apparemment, il y a un problème avec elle et MySQLi n’hésite pas à remonter une erreur à PHP s’il trouve un problème de concordance entre les versions, alors que concrètement, ces discordances n’ont aucun impact sur l’utilisation de MySQL.

Pour réparer cela, j’ai d’abord mis à jour le serveur, ce qui a mené à une mise à jour de mysql-client et une de php5-mysql, j’étais donc plutôt optimiste, mais ça n’a rien changé au problème.

La solution

La solution qui fonctionne [dans mon cas au moins] est d’installer php5-mysqlnd à la place de php5-mysql et de redémarrer le serveur web et le serveur MySQL.

 

SGBD vs POO

Rien ne semble opposé un Système de Gestion de Base de données qui s’occupe du stockage des données à la Programmation Orientée Objet qui est une manière de développer autours d’une ressource. C’est un peu comme comparer un entrepôt à un supermarché mais pour autant, ils proposent des fonctionnalités communes.

En POO, toutes les contraintes doivent être vérifiées pour s’assurer que notre objet a une intégrité solide et qu’il n’y a aucun autre moyen de parvenir à une opération dessus que par le biais de sa classe, tout doit se passer au sein de l’application.
Or un SGBD, en tant que service externe à l’application et aussi complet soit-il comme MySQL avec InnoDB permet de vérifier les contraintes sur des données et d’effectuer des opérations en cascade. Ces vérifications et ces opérations se font alors en dehors de l’œil vigilant de la POO, c’est donc possiblement permettre de briser le contrôle d’intégrité de l’objet, surtout que cela ne peut pas être vérifié par l’application.

Le SGBD souhaiterait-il alors récupérer le pouvoir sur la POO ? Est-il le seul qui puisse veiller à l’intégrité des données.

Côté application, le SGBD fournit aussi quelques services intéressants comme la gestion des transactions, permettant aux développeurs avertis de veiller à ce que l’intégrité soit préservée au moment de leur manipulation.

L’application n’ayant que peu de contrôle sur le fonctionnement interne au SGBD, elle est indépendante de son mode de connexion des données, mais elle doit pour autant veiller par elle-même à ce que les données soit complètement vérifiées avant de lui être envoyées, notamment pour remonter tout problème à sa source.

La notion de contrainte et de clés étrangères au sein du SGBD ne semble n’être que de redondance.

C’est pour cela qu’on peut se demander est-ce qu’un SGBD ne devrait-il pas être qu’un système avancé de stockage des données ?

La gestion des états en informatique

Il y a plusieurs manières de représenter des états selon le cas, nous aborderons les solutions intéressantes répondant à des besoins d’exclusivité.

Le booléen

C’est probablement le cas le plus simple, il définit 2 états pour une propriété ainsi cette propriété ne peut être que vraie ou fausse.

Exemple :
Un article sur un site internet peut être publié ou non à l’aide d’un simple booléen published, si vrai, le site affiche l’article au public sinon, il reste caché et seul un administrateur peut le voir pour l’éditer.

Le drapeau (flag)

C’est un outil intéressant qui permet de combiner plusieurs propriétés en une seule variable, elles peuvent alors être vérifiées indépendamment ou ensembles selon le besoin. On utilise pour cela un entier et cela demande une certaine maîtrise des opérateurs binaires pour pouvoir être utilisé correctement, 0 doit toujours être l’absence complète, vous devez former votre approche autour de ce principe.

Vous pouvez créer des combinaison avec l’opérateur | qui autorise ce bit ou ce bit et permet ainsi de définir que ces 2 bits peuvent valider votre vérification, selon votre choix ils sont inclusifs ou non, généralement on les utilise pour obliger ces 2 propriétés à être présentes.

Pour valider une propriété, il suffit de vérifier si elle est présente dans votre drapeau, il existe une formule pour cela: (flags & reference) == reference) avec flags l’ensemble des drapeaux à comparer à un drapeau reference. Cette formule vérifie un drapeau qu’il soit un simple bit ou une combinaison de drapeaux, on simplifie généralement son usage en en faisant une fonction.

Exemple :
À l’aide des drapeaux, on peut en arriver à gérer les permissions d’un utilisateur sur un article, s’il a les droits de lecture, d’écriture et de suppression. Pour cela on va définir 3 entiers avec un binaire glissant, on aura ainsi:

  • PERMISSION_READ = 1 (001 en binaire)
  • PERMISSION_WRITE = 2 (010 en binaire)
  • PERMISSION_DELETE = 4 (100 en binaire)

Vous voyez ainsi que la position du 1 dans l’entier doit toujours être différente car sa présence indique explicitement que cette permission y est et son absence (par 0) que cette permission n’y est pas. Concrètement, la valeur décimale ne nous intéresse pas, c’est la position du bit 1 qui est pertinente.

  • Pour combiner les permissions: PERMISSION_READ | PERMISSION_WRITE
  • Pour vérifier le droit de lecture de l’utilisateur: (user.permissions & PERMISSION_READ) == PERMISSION_READ)
  • Pour aller plus loin dans la vérification:

La machine a états

Pour une même propriété, la machine à état ou automate fini, permet d’avoir différents états ne pouvant se cumuler et s’excluant mutuellement.
Chaque état défini vers quels autres états il peut passer et si nécessaire sous quelles conditions.
Suivant les langages, il peut y avoir de très nombreuses manières de représenter un tel statut, la plus simple est probablement un tableau définissant pour chaque état vers quels autres états il peut aller.

Exemple :
Un article peut avoir différents statuts que nous allons définir précisément pour les besoins de cet exemple.
Cet article peut être en brouillon, publié, rejeté ou archivé et il ne peut être que dans un seul de ces états à la fois. Chaque état doit alors respecté le schéma suivant.

Status d'un article

 

Comprendre le fonctionnement de la Programmation Orientée Objet en Javascript

Faire de l’objet en javascript semble être une épreuve surréaliste tant le langage a un fonctionnement particulier.

Tout est ce qui constitue une « classe » en javascript est aussi un objet et nous allons voir ensemble comment cela fonctionne afin de pouvoir l’utiliser de manière aussi naturelle que possible.

En déclarant une fonction, vous déclarer un objet de type fonction, c’est un objet très particulier mais cela reste un objet, il possède des attributs et des méthodes, sachant qu’en JS les méthodes sont des attributs, il est juste de type « function ». En JS, un objet peut être modifié à la volée, indépendamment de sa signature.

Le prototype d’une classe est sur quoi se base l’objet nouvellement instancié pour s’initialiser, puis il appelle le constructeur qui construira l’objet.
Pour bien comprendre, quand vous utiliser le mot clé « new » sur une fonction, pour vous, vous créez une instance de cette classe. Pour le moteur Javascript, il s’agît juste de créer une copie du prototype MaClass.prototype et d’appeler le constructeur de votre classe qui n’est autre que la fonction elle-même, c’est aussi ainsi que fonctionne l’héritage en Javascript, autant dire qu’il n’existe pas.

Concrètement, voici un exemple

Vous pouvez voir ici que pour faire de l’héritage, j’ai défini le prototype de ClassB avec une instance de ClassA. Autrement dit, ClassB n’hérite pas réellement de ClassA, la signature de ClasseB se base sur un objet de type ClassA. Vous pouvez très bien modifier le prototype de ClassB par la suite, cela n’affectera pas ClassA mais rétroactivement les instances de ClassB, sauf si vous remplacez complètement le prototype de ClassB. Je vous ai fait un jsfiddle pour comprendre, lisez la console (F12) pour plus de détails.

 

Aperçu d’upload d’une image

Après avoir sélectionner une image dans un champs file, l’utilisateur apprécie avoir un aperçu de son image avant de la poster. Cette fonction permet d’afficher un aperçu dans une balise <img>.

Ensuite, sur votre champs file, ajoutez un attribut data-preview avec comme valeur un sélecteur vers la balise <img>, ça peut être .preview pour <img class= »preview »/>.

Voici un jsfiddle pour tester ça.