2010-09-09 4 views
2

Je souhaite supprimer du code HTML malveillant d'un champ de base de données supposé contenir un nom de fichier simple. Exemple de champ ok:MySQL: Comment puis-je supprimer le HTML de fin d'un champ dans la base de données?

myfile.pdf 

Exemple de champ non ok:

myfile2.pdf<input type="hidden" id="gwProxy" />... 

Quelqu'un sait-il une question que je peux courir qui peut enlever la partie HTML, mais laisser le nom du fichier? c'est-à-dire, supprimez tout du premier caractère <.

Supposons que le champ s'appelle myattachment et est défini comme varchar(250) et que la table est appelée mytable dans une base de données MySQL.


Informations générales (pas nécessaire de lire):

Le champ dans notre base de données est censé contenir les noms de fichiers cependant, en raison d'un problème (documented here) quelques-uns des champs contiennent maintenant un nom de fichier et certains HTML rogue. Nous avons corrigé le problème de la racine et devons maintenant corriger les champs corrompus. Dans le passé, je l'ai remplacé du texte en utilisant ce type de requête:

UPDATE mytable SET myattachment = replace(myattachment, 'JPG', 'jpg') WHERE myattachment LIKE '%JPG'; 
+0

De combien de lignes dispose la table? Si ce n'est pas plus de 1 million, je suggère d'extraire l'id et myattachment dans un fichier. Utilisez un éditeur de texte avec une expression régulière pour effectuer le remplacement et réimporter la colonne. – Yada

+0

Merci pour votre suggestion. J'ai envisagé de corriger le problème en utilisant un script PHP pour lire les lignes, corriger la corruption et les réécrire. Mais alors je pensais qu'il devait y avoir une requête MySQL que je pourrais lancer plus rapidement? – Tom

Répondre

1

Cette requête semble fonctionner ok, peut-on voir des problèmes avec elle?

UPDATE mytable 
    SET myattachment = SUBSTRING_INDEX(myattachment, '<', 1) 
WHERE `myattachment` LIKE '%<%'; 

Pour docs sur SUBSTRING_INDEX voir le mysql manual page.

Questions connexes