Bonjour à toutes et à tous,

J'ai une base de données mysql que je souhaiterais "nettoyer"

En effet dans beaucoup de lignes d'une des tables MySQL, les accents sont affichés comme suit

"médailles"

Quelqu'un connait-il donc un script permettant de remplacer ces accents par les entités html ?

Ex ici : é sera remplacé par é

Merci de votre aide
Modifié par ashesheart (31 Aug 2010 - 11:43)
Salut,

tu peux effectivement utiliser une fonction du genre :
function oteAccents($str) { 
    $translit = array(
		'Ã '=>'à',
		'â'=>'â',
		'é'=>'é',
		...
		'ÿ'=>'ÿ'
		); 
    return strtr($str, $translit); 
}
mais en tout cas je ne vois pas bien l'intérêt de stocker des entités dans ta table.

Une autre solution (en supposant que tu as trouvé et corrigé le problème, que ta table est en latin1 et que quelques enregistrements contenaient de l'utf8 mais pas tous) :

1) faire une sauvegarde de la table (pour pouvoir revenir en arrière)
2) essayer ce code :
require('connexion.inc.php');	// connexion à ta base

$sql = 'Select id, mon_champ from ma_table';
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
	$new_str = utf8_decode($row['mon_champ']);
	if($new_str != '?') {
		mysql_query("update ma_table set mon_champ = '". mysql_real_escape_string($new_str) ."' where id = ".$row['id']);
	}
}
Si ça ne fonctionne pas il existe une autre solution basée sur ce post mais le code est un peu plus compliqué.
Bonjour,

Merci de ton aide.

La seconde solution ne semble pas fonctionner. Je vais essayer la première puis celle du lien que tu m'as fourni.

Je te tiens au courant.

Cordialement,
Modifié par ashesheart (31 Aug 2010 - 10:42)
Ben la première méthode va fonctionner... c'est juste que c'est un peu laborieux et qu'il n'y à priori aucun intérêt à sauvegarder des entités.

Seconde méthode :
require('connexion.inc.php');    // connexion à ta base 

$trans = new Latin1UTF8();

$sql = 'Select id, mon_champ from ma_table'; 
$result = mysql_query($sql); 
while($row = mysql_fetch_row($result)) { 
	if( $row[1] != $trans->mixed_to_latin1($row[1]) ) {
		mysql_query("update ma_table set mon_champ = '". mysql_real_escape_string($trans->mixed_to_latin1($row[1])) ."' where id = ".$row[0]); 
	}
}
echo 'Fini !';

class Latin1UTF8 {
   
    private $latin1_to_utf8;
    private $utf8_to_latin1;
    public function __construct() {
        for($i=32; $i<=255; $i++) {
            $this->latin1_to_utf8[chr($i)] = utf8_encode(chr($i));
            $this->utf8_to_latin1[utf8_encode(chr($i))] = chr($i);
        }
    }
   
    public function mixed_to_latin1($text) {
        foreach( $this->utf8_to_latin1 as $key => $val ) {
            $text = str_replace($key, $val, $text);
        }
        return $text;
    }

    public function mixed_to_utf8($text) {
        return utf8_encode($this->mixed_to_latin1($text));
    }
} 
Heyoan a écrit :
Ben la première méthode va fonctionner... c'est juste que c'est un peu laborieux et qu'il n'y à priori aucun intérêt à sauvegarder des entités.


Pour l'historique, j'ai récupéré une base de données avec ces caractères spéciaux. Je souhaite supprimer ces caractères spéciaux puis dans un second temps les &eacute;

Edit : ton script fonctionne à merveille! Merci.

Manque plus qu'a supprimer les &eacute; et ce sera niquel. Je vais me débrouiller pour cette seconde partie.
Edit : c'est fait grace à html_entity_decode()

Merci de ton aide.
Modifié par ashesheart (31 Aug 2010 - 11:57)