Mise à jour d'un champ blob contenant texte

Résolu/Fermé
stidroubaix Messages postés 6 Date d'inscription jeudi 21 octobre 2010 Statut Membre Dernière intervention 12 septembre 2018 - 11 sept. 2018 à 10:50
stidroubaix Messages postés 6 Date d'inscription jeudi 21 octobre 2010 Statut Membre Dernière intervention 12 septembre 2018 - 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,
A voir également:

1 réponse

jordane45 Messages postés 38238 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 septembre 2024 4 689
Modifié le 11 sept. 2018 à 11:07
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;




0
stidroubaix Messages postés 6 Date d'inscription jeudi 21 octobre 2010 Statut Membre Dernière intervention 12 septembre 2018
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,
0
jordane45 Messages postés 38238 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 septembre 2024 4 689
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é
0
stidroubaix Messages postés 6 Date d'inscription jeudi 21 octobre 2010 Statut Membre Dernière intervention 12 septembre 2018
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';
0