Soucis d'encodage apostrophe UTF8

Nouveau WRInaute
Bonjour, d'habitude je ne poste pas pour ce genre de chose mais la je tourne en rond ...
Dans ma base mySql lors d'un insert, mes données ne sont pas rentré correctement, c'est un problème d'encodage.

Sur ma page web tout est bien affiché, cependant dans la base les accents sont correct mais l'apostrophe pose problème.
Code:
function config()
{
header("Content-Type: text/html; charset=utf-8");
ini_set("max_execution_time", 0); 
$serveur = "localhost";
$nom_base = "veto";
$login = "root";
$pwd = "";
mysql_connect ($serveur,$login,$pwd) or die ('ERREUR '.mysql_error()); 

if (mysql_connect ($serveur,$login,$pwd)) {
  echo 'connexion réussie';
}
else {
  echo 'connexion impossible...'.mysql_error();
}

// sélection de la base de données
mysql_select_db ($nom_base) or die ('ERREUR '.mysql_error()); 
mysql_query("SET NAMES UTF8");
require_once 'simple_html_dom.php';
}

Code:
function parserSubstances_temp ()
{
$html = new simple_html_dom();
$id = 7;
// Boucle sur tout les éléments de la base extranet
while($id <= 8)
    {
$url = "https://extranet.edqm.eu/4DLink1/4DCGI/web_view/mono/$id";
$file = @fopen($url, 'r'); 
// On test si le fichier existe ou non
if ($file)
    //Si il exite en commencer à parser la page et récupérer les données
    {
    $html->load_file($url);
    // Sur ces 5 je parcours les lignes du tableau pour me positionner sur l'élément souhaité.
    $monoNumber     =    $html->find('td', 5)->plaintext;
    $englishName    =    $html->find('td', 7)->plaintext;
    $frenchName     =    $html->find('td', 9)->plaintext;
    $latinName      =    $html->find('td', 11)->plaintext;
    $PhEurStatus    =    $html->find('td', 17)->plaintext;
    echo $frenchName ;
    // On test si le status n'est pas plus grand que 1, cela nous permet de savoir si un texte est aussi présent.
    if(strlen($PhEurStatus) > 1 ){$PhEurDeleted = 1;} else {$PhEurDeleted = 0;}
    
    }
        // Ligne de test(désactivé)
        // echo $monoNumber." ".$englishName." ".$frenchName. " ".$latinName." ".$PhEurStatus."<br/>"; // Pour test
        // Requète d'ajout de no données et gestion des doublons avec ON DUPLICATE KEY UPDATE, si un doublon
        // est détécté la requète se transforme en update.
        $query = "INSERT INTO substances_temp(PhEurMonograph,TermName_FR,TermName_EN,Termname_LA,PhEurStatus,PhEurDeleted) VALUES('$monoNumber','$frenchName','$englishName','$latinName','$PhEurStatus', '$PhEurDeleted')
        ON DUPLICATE KEY UPDATE PhEurMonograph=$monoNumber";
        // On execute la fonction
        $result = mysql_query($query);  
        // On ferme le fichier et livère la mémoire.
        fclose($file); 
// On incrément l'id de 1 pour changer de document.        
$id++;
    }
}

Et ma table est en Interclassement : utf8_general_ci.
J'ai essayer pas mal de truc et rien ne passe :(

Exemple de ce que ça me met : Argent (nitrate d&#39;)
 
WRInaute accro
En regardant une des page que tu essaies de parser:
-https://extranet.edqm.eu/4DLink1/4DCGI/web_view/mono/7

L'apostrophe est le seul caractère codé en entité HTML:
Code:
Ammonium (chlorure d&#39;)

Quel est le problème lors de l'insert MySQL ?
Je vois que tu n'échappes pas les données lors de l'insert.
 
Nouveau WRInaute
Bah en fait dans ma base sql c'est écrit Ammonium (chlorure d&#39;) au lieu de Ammonium (chlorure d'), il faut donc que j'encode le d&#39; et je n'y arrive pas :(
 
WRInaute accro
Essaies avec html_entity_decode().

PHP:
<span class="syntaxhtml"><br /><span class="syntaxdefault"><?php&nbsp;<br /></span><span class="syntaxkeyword">echo&nbsp;</span><span class="syntaxdefault">html_entity_decode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Ammonium&nbsp;(chlorure&nbsp;d&#39;)'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">?><br /></span></span>
Et n'oublie pas d'échapper les données à insérer, sinon tu vas tomber sur un autre problème.
 
Nouveau WRInaute
Re, j'ai tenter de decode ça me rentre toujours une ligne dans ma base avec une erreur sur le caractère '.
Sinon j'ai tenté mysql_real_escape_string pour échapper et toujours pareil :'(

Voila une ligne de ma base sql :
109 Ammonium (chlorure d&#39;) Ammonium chloride Ammonii chloridum 7 4 0

Qui devrait être
109 Ammonium (chlorure d') Ammonium chloride Ammonii chloridum 7 4 0
 
Nouveau WRInaute
Code:
    $englishName    =    html_entity_decode(mysql_real_escape_string($html->find('td', 7)->plaintext));
    $frenchName     =    html_entity_decode(mysql_real_escape_string($html->find('td', 9)->plaintext));
    $latinName      =    html_entity_decode(mysql_real_escape_string($html->find('td', 11)->plaintext));

J'ai tenter comme ceci ? mais tjr pas :(
 
WRInaute accro
Il faut d'abord html_entity_decode puis mysql_real_escape_string, pas l'inverse comme tu montres.
 
Nouveau WRInaute
J'ai tenter ceci :
$frenchName = html_entity_decode($frenchName);
$frenchName = mysql_real_escape_string($frenchName);
echo $frenchName;

Un echo sur ma page php me ressort : Ammonium (chlorure d')
et dans ma base : Ammonium (chlorure d&#39;)

Mon phpmyadmin m'en veut je crois =$
 
WRInaute discret
Tu insert bien un nouvelle enregistrement et il est faut ? Car ta requête qui met a jour en début de page ne met pas a jour tous les champs...
Code:
ON DUPLICATE KEY UPDATE PhEurMonograph=$monoNumber
 
Nouveau WRInaute
Merci de vos réponses en fait mon caractère est en ascii et la conversion ascii et utf8 est automatique.
A vrai dire ce n'est pas vraiment un problème mais c'est que je code pour mon employeur et il est assez strict sur ce qu'il veut.
Je vais voir avec lui mais c'est vraiment étrange :p

Sinon pour faire mes test je supprimais la ligne en question donc tout les champs se mettais bien à jour.
Si je trouve je posterais ici.
 
WRInaute passionné
J'ai eu le même soucis avec ma base, ça vient de la configuration de celle-ci je crois.

Pour ma part, les accents et tous les caractères spéciaux étaient encodés, j'ai finalement réussi à insérer n'importe quoi correctement en faisant ceci lors de l'insert :

html_entity_decode(addslashes($data))

Ca doit revenir au même que ce que t'as dit Spout mais tu peux tjrs essayer...
 
Nouveau WRInaute
Ralalala toujours pareil je vais regarder du coté de la fonction qui parse la page web il y à peux être un hic la dedans.
Merci de votre aide en tout cas :).
 
Discussions similaires
Haut