Menu

Mise à jour d'un champ blob contenant texte [Résolu]

stidroubaix 6 Messages postés jeudi 21 octobre 2010Date d'inscription 12 septembre 2018 Dernière intervention - 11 sept. 2018 à 10:50 - Dernière réponse : stidroubaix 6 Messages postés jeudi 21 octobre 2010Date d'inscription 12 septembre 2018 Dernière intervention
- 12 sept. 2018 à 14:09
Bonjour,

Je travaille sur une table d'une base de données MySQL d'un logiciel "fait maison". Cette table nommée "passweb" contient notamment les champs login ("login") et mot de passe ("pass") des utilisateurs du logiciel.

Le champ "pass" est un champ de type "blob". Celui-ci ne contient que du texte. Je pense que celui qui a développé ça à l'époque a utilisé cette méthode dans le but de "crypter" le champ. A mon sens, ce n'est pas une solution correcte mais bon, je ne peux pas faire marche arrière.

Quand je crée un utilisateur, je dois intervenir en base directement. J'utilise le logiciel "MySQL Workbench 6.3 CE". Je fais un insert dans ma base de données et je laisse le champ "pass" à vide (INSERT INTO passweb VALUES('login_utilisateur','','Prenom NOM','1','CODE','R','',3,'2020-01-01')) <-- le champ pass est entre le login et le nom prénom, ce sont deux apostrophes. L'utilisateur personnalisera son mot de passe via l'application lors de sa première connexion. Quand l'utilisateur oublie son mot de passe, il m'appelle pour que je lui réinitialise et je le fais en lançant un update sur la table (update passweb set pass = '' where login = 'login_utilisateur').

Mon problème, c'est que par le biais d'une requête, je n'arrive pas à insérer autre chose que rien (c'est à dire deux guillemets comme ceci : ''). Si je voulais par exemple réinitialiser le mot de passe avec la valeur "azertyuiop", le fait d'exécuter la requête update passweb set pass = 'azertyuiop' where login = 'login_utilisateur' ne fonctionne pas.

Ma question est donc : comment mettre du texte dans un champs de type "blob" en MySQL par le biais d'une requête insert ou update?

Merci d'avance. Cordialement,
Afficher la suite 

Votre réponse

4 réponses

jordane45 22528 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 septembre 2018 Dernière intervention - Modifié par jordane45 le 11/09/2018 à 11:07
0
Merci
Bonjour,

Déjà, même si techniquement faisable de réaliser la requête INSERT comme tu le fais... ce n'est pas la meilleur façon.
On "nomme" les champs dans lesquels on veut insérer des données
INSERT INTO matable ( champ1,champ2...) VALUES (val1, val2...)

De cette façon, les champs qui auraient des valeurs par défaut de renseigner ou qui autorisent le "NULL" n'ont pas à être spécifiés dans nos requêtes.

Ensuite, l'insertion ou la mise à jour de champ BLOB se fait de la même manière que pour les autres champs....
Par exemple

Prenons la table :
-- Export de la structure de table aaa
CREATE TABLE IF NOT EXISTS `aaa` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `bb` blob,
      PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Insertion :
INSERT INTO aaa (bb) VALUES ('TEST')


Mise à jour
UPDATE aaa 
SET bb = 'Ma nouvelle valeur'
WHERE id=1


Lecture
SELECT CONVERT(bb, CHAR(32767)) AS blob_value FROM aaa;




Cordialement, 
Jordane                                                                 
stidroubaix 6 Messages postés jeudi 21 octobre 2010Date d'inscription 12 septembre 2018 Dernière intervention - 11 sept. 2018 à 12:51
Bonjour Jordane,

Merci pour votre réponse. J'en attendais une pour continuer d'étoffer.

Cette solution fonctionne mais sur le fond, pas sur l'application. Si pour un utilisateur, j'ai mon champ "pass" (de type "blob" donc) à vide parce que le mot de passe réellement à vide et que je mets à jour ce mot de passe par le biais d'un update classique en mettant un vrai mot de passe, lorsque je vais faire un select CONVERT(pass USING utf8) from passweb where login = 'LOGIN_UTIL', je vais bien voir le bon mot de passe apparaître.

Mon problème, c'est que l'applicatif continue de s'appuyer sur l'ancien mot de passe à vide et le nouveau mot de passe ne fonctionnera pas. Par contre, dans l'autre sens, si j'ai un mot de passe qui existe vraiment et je mets à vide par le biais d'un update, non seulement mon select classique va me renvoyer la valeur à vide mais en plus, c'est vraiment ce mot de passe à vide qui sera pris en compte.

Cordialement,
jordane45 22528 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 septembre 2018 Dernière intervention - 11 sept. 2018 à 13:24
<block>
Merci pour votre réponse. J'en attendais une pour continuer d'étoffer. </blovk>
Je n'en vois pas l'interet... autant donner toutes les informations immédiatement.... ça évite de perdre du temps à trouver des réponses qui, au final, ne seront pas pertinentes....

Ta question concernait l'update qui "ne fonctionnait pas" ... hors tu nous dis finalement que ça fonctionne... mais que ça pose des soucis avec l'autre application...
La seule réponse qu'on peut alors te donner.... c'est de savoir comment fonctionne le code de l'autre application. Sans cette donnée... impossible de te répondre.
A la limite, dans ton application, met un password à vide et regarde en BDD comment il est stocké
stidroubaix 6 Messages postés jeudi 21 octobre 2010Date d'inscription 12 septembre 2018 Dernière intervention - 12 sept. 2018 à 14:09
Le problème est résolu!

On a effectué des tests. Le mot de passe est bien crypté. Quand on change le mot de passe via l'applicatif, il n'est pas possible de le sortir par le biais d'une requête. Par contre, quand je fais une mise à jour par le biais d'une requête, ça ne fonctionne pas.

On a récupéré une sauvegarde de la base de données avec la requête qui est passé au moment du changement de mot de passe via l'applicatif et on a récupéré le code crypté.

Il faut que je fasse ceci qui correspond au format de mon champs :

update passweb set pass = convert('|¢ËøÔ\0l+–t÷DT&¢r8\\XãúbjVUÌÇ-' using latin1) where login = 'login_user';
Commenter la réponse de jordane45