Les accents sous PHP et dans MySql

Eléphant du PHP | 92 Messages

11 août 2010, 15:53

Bonjour,

J'ai un formulaire en PHP...

Au début de mon formulaire, j'ai mis header en utf 8

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=UTF-8'); ?>
En suite dans l’Head de la partie HTML, j'ai fait la même chose :

Code : Tout sélectionner

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Je passe les variables ENT-QUOTES
Exemple :

Code : Tout sélectionner

$var_pomme_nomme=$_POST["pomme_nomme"]; $var_pomme_nomme= htmlspecialchars($var_pomme_nomme, ENT_QUOTES);





Dans le champ de mon mySql (sous phpMyAdmin) :

Type : TEXT
Interclassement : utf8_general_ci



Lorsque l’utilisateur remplit "textarea" avec les accents, l'enregistrement dans le bd n'est pas bon. Voici l'exemple :

l'utilisateur remplit le "textarea" comme cela: je m'appelle luc côté Montréal

Mais dans bd ce que je vois : je m'appelle luc côté Montréal

Comment je peux remédier mon problème ?

Merci

ViPHP
ViPHP | 5462 Messages

11 août 2010, 16:01

tu dois pas faire le htmlspecialchars a se moment la c'est au moment de l'affichage qui faut le faire :wink:
eneleve le et regarde si dans ta base les données sont bonnes, en plus il faut utilisé le 3eme paramètre de htmlspecialchars puisque par default il est en iso-8859-1, verifie bien aussi l'encodage natif de ton fichier

ViPHP
AB
ViPHP | 5818 Messages

11 août 2010, 20:46

en plus il faut utilisé le 3eme paramètre de htmlspecialchars puisque par default il est en iso-8859-1
Pas nécessairement puisque comme dit la doc
Pour cette fonction, les jeux de caractères ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, et KOI8-R sont équivalents
C'est d'ailleurs pour cette raison que lorsque l'on transpose du code iso en utf-8 il est plus facile de remplacer les htmlentities par htmlspecialchars car on n'a pas à spécifier l'encodage.

@aspkiddy
Comme l'a dit stealth35 tu ne devrais pas faire htmlspecialchars avant l'insertion de tes données dans la base mais simplement lors de l'affichage. Et puis pourquoi employer ENT_QUOTES ?
Si c'est pour protéger tes données lors de leur insertion en bdd ce n'est pas la bonne méthode. Il faut employer la fonction prévue à cet effet, à savoir mysql_real_escape_string

Ensuite avant la requête d'insertion il faut faire
mysql_query("SET NAMES 'utf8'");
Plus de détails dans ce tuto.

Eléphant du PHP | 92 Messages

18 août 2010, 23:23

Bonjour et je vous (stealth35 et AB) remercie votre aide...

si je fais

Code : Tout sélectionner

$var_ville=$_POST["ville"]; // Pour traiter les accents //$var_ville= ($var_ville, ENT_QUOTES);
Ça marche s'il n'y a pas de [']

mais s'il y a des apostrophes ['] (comme [l'assomption]) il y a des messages d'erreur comme :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'assoption')' at line 1
Alors pour cela que je fais ENT_QUOTES et htmlspecialchars


donc avec mon code suivant, le formulaire marche et je peux aussi afficher les résultats dans une page php sans problème :

Code : Tout sélectionner

$var_ville=$_POST["ville"]; // Pour traiter les accents $var_ville= htmlspecialchars($var_ville, ENT_QUOTES);
Alors, l'utilisateur écrit dans le champ "ville" [l'assomption] et je peux l'afficher correctement le résultat dans une page PHP : [l'assomption]


Mais dans phpMyMyAdmin je vois comme cela : [l'assomption] :oops:

et en plus, lorsque je crée le fichier en format CSV, il y a aussi la même chose :[l'assomption] :cry:


et lorsque j'ajoute set_name 'utf8' comme AB dit, ça ne change rien...

Code : Tout sélectionner

mysql_query("SET NAMES 'utf8'"); $result = mysql_query($var_query, $cnx) or die (mysql_error());

alors comment je peux enregistrer [l'assomption] correctement dans mySql ? :shock:

ViPHP
AB
ViPHP | 5818 Messages

19 août 2010, 02:16

Comme l'a dit stealth35 tu ne devrais pas faire htmlspecialchars avant l'insertion de tes données dans la base mais simplement lors de l'affichage. Et puis pourquoi employer ENT_QUOTES ?
Si c'est pour protéger tes données lors de leur insertion en bdd ce n'est pas la bonne méthode. Il faut employer la fonction prévue à cet effet, à savoir mysql_real_escape_string

Ensuite avant la requête d'insertion il faut faire
mysql_query("SET NAMES 'utf8'");
Plus de détails dans ce tuto.
En clair ça veux dire :

//Récupération d'un champ $_POST
$var_ville = isset($_POST["ville"]) ? trim($_POST["ville"]) : '';

// Insertion en bdd si $var_ville non vide
if(!empty($var_ville))
{
//connexion à ta bdd
//...

//juste après la connexion
mysql_query("SET NAMES 'utf8'");

//écriture de la requête d'insertion
$query = "INSERT INTO matable (champ_ville) VALUE ('" .mysql_real_escape_string($var_ville). "' )";

//...

}

Eléphant du PHP | 92 Messages

19 août 2010, 16:39

Bonjour à vous...

Merci AB, c'est excelent ton code !!! :D =D>

Ça marche avec MySql et PhpMyAdmin...

Par contre j'ai un souci dans un autre niveau...

Je écris aussi les donnés dans un fichier csv...

Lorsque j'ouvre mon fichier sous NotePad++, tout va bien... :D



Alors, l'utilisateur écrit dans le champ "ville" [l'assomption côté] et je peux l'afficher correctement le résultat dans une page PHP et aussi dans phpMyMyAdmin
: [l'assomption côté]. C'est la même chose lorsque j'ouvre mon fichier csv sous NodePad++... Super content... :P

Par contre, lorsque j'ouvre le même fichier sous Excel, il y a un pépin :

je vois comme cela : [l'assomption çôté] :oops: :cry:


Comment je peux corriger mon histoire sous excel ?

voici mon code ....

Code : Tout sélectionner

//connection au serveur include"bd_db/connection.php"; //sélection de la base de données et table include"bd_db/selection.php"; //Récupération des input ( champ) $_POST $var_ville = isset($_POST["ville"]) ? trim($_POST["ville"]) : ''; $var_code_postal = isset($_POST["code_postal"]) ? trim($_POST["code_postal"]) : ''; // Insertion en bdd si les variables (exemple [$var_ville] non vide if(!empty($var_ville)) { //connection au serveur include"bd_db/connection.php"; //sélection de la base de données et table include"bd_db/selection.php"; //juste après la connexion encodage mysql_query("SET NAMES 'utf8'"); /------...............---ecriture cvs debut // Définit le fuseau horaire par défaut à utiliser. //voir http://php.net/manual/fr/function.date.php // http://www.php.net/manual/fr/timezones.america.php date_default_timezone_set('America/Montreal'); // formatage du date avec fonction 'date' $var_date = date('d/m/Y'); //Définir le fichier qui nous intéresse $fichier_data_FD = "data/envoie.csv"; //ou en mode "ajouter" à la fin d'info existant //créé si inexistant $ouvrir_FD = fopen($fichier_data_FD,"a"); //La position du pointeur est dans le file $pointeur_adresse_memoire = ftell($ouvrir_FD); //et est modifiable $pointeur_adresse_memoire = fseek($ouvrir_FD,$pointeur_adresse_memoire-10); // ecriture ou bien... [ajouter dans le fichier (ce qu'il y avait) //pour passer à la ligne, écrire \n fputs($ouvrir_FD, $var_ville.';'.$var_code_postal.';'.$var_date.';'."\n"); //Enfin fermer le fichier fclose($ouvrir_FD); //------...............---ecriture cvs FIN //écriture de la requête d'insertion //$query = "INSERT INTO matable (champ_ville) VALUE ('" .mysql_real_escape_string($var_ville). "' )"; $var_query = "INSERT INTO $table_db (bd_date,bd_ville,bd_code_postal)"; $var_query .= "VALUE ('$var_date','" .mysql_real_escape_string($var_ville). "','" .mysql_real_escape_string($var_code_postal). "')"; $result = mysql_query($var_query, $cnx) or die (mysql_error()); }

Est ce que vous avez une idée ? :?: :idea:

Merci encore

ViPHP
AB
ViPHP | 5818 Messages

19 août 2010, 20:06

Ben c'est normal un fichier excel n'est pas compatible avec un fichier sql !

Pour enregistrer tes données ou les données de la table au format excel tu peux utiliser la fonction fputcsv
Par exemple pour exporter le contenu de la table 'matable' dans un fichier dont le chemin est $dirfile au format excel (.csv) :
	
mysql_query("SET NAMES 'utf8'");

$query = "SELECT * FROM matable";

	$result = mysql_query($query);
	
	if($result && $fp = @fopen($dirfile, 'w+'))
	
		{
	
			while ($line = mysqli_fetch_row($result)) fputcsv($fp, $line, ';');
		
			fclose($fp);
		}
le ';' dans fputcsv est pour avoir directement le format français séparé par des ;
(Enlèves le @ devant fopen durant les tests pour visualiser les erreurs)

EDIT : Y'a bien une fonction sql qui permet d'écrire directement dans un fichier mais cela demande d'avoir les droits sql pour le faire ce qui n'est jamais le cas sur un mutualisé. Le principe ci-dessus à l'avantage de fonctionner partout.

Eléphant du PHP | 92 Messages

19 août 2010, 22:39

j'ai trouve

Il fallait
utf8_decode()

Code : Tout sélectionner

fputs($ouvrir_FD, utf8_decode($var_ville).';'.utf8_decode($var_code_postal).';'."\n");

Merci AB pour tes aides

Bonsoir...

Byters
Invité n'ayant pas de compte PHPfrance

03 mai 2012, 07:35

Bonjour,

Je relève le post car j'ai aussi le problème d’accents dans un exercice php plus connexion à la bdd MySQL

Je vous laisse en partie mon code pour voir ce qui cloche. Je pensais avoir trouvé dans ce post mais non ca ne fonctionne pas pour moi

J'ai trois fichier un header index footer
header.php

Code : Tout sélectionner

<!DOCTYPE html> <html lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Document sans nom</title> </head> <body>
index.php

Code : Tout sélectionner

<?php include ("header.php"); ?> <?php try { // On se connecte à MySQL $bdd = new PDO ('mysql:host=localhost;dbname=test', 'root', ''); //juste après la connexion mysql_query("SET NAMES 'utf8'"); } catch (Exception $e) { // En cas d'erreur, on affiche un message et on arrête tout die('Erreur : ' . $e->getMessage()); } // Si tout va bien, on peut continuer // On récupère tout le contenu de la table jeux_video $reponse = $bdd->query('SELECT * FROM jeux_video'); //On affiche chaque entrée une à une while ($donnees = $reponse->fetch()) { ?> <p> <strong>Jeu</strong> : <?php echo $donnees ['nom']; ?><br /> Le possesseur de ce jeu est : <?php echo $donnees ['possesseur']; ?>, et il le vend à <?php echo $donnees ['prix']; ?> euros !<br /> Ce jeu fonctionne sur <?php echo $donnees ['console']; ?> et on peut y jouer à <?php echo $donnees ['nbre_joueurs_max']; ?> au maximum<br /> <?php echo $donnees ['possesseur']; ?> à laissé ces commentaires sur <?php echo $donnees ['nom']; ?> : <em><?php echo $donnees ['commentaires']; ?></em> </p> <?php } $reponse->closeCursor() ; // Termine le traitement de la requête ?> <?php include ("footer.php"); ?>
J'ai le problème des accents uniquement dans la base sql et j'ai pourtant fait comme vous le voyez un mysql_query("SET NAMES 'utf8'"); comme il est dit dans les posts plus haut.
Merci pour votre aide
Bruno

Eléphant du PHP | 92 Messages

03 mai 2012, 15:25

Cela dépend de ton enregistrement dans ta BDD !
Interclassement : utf8_general_ci [école] ou
Interclassement : latin1_swedish_ci [�cole]



Il faut :

1re chose : dans 1er fichier (d'enregistrement) :

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=UTF-8'); ?>
2e :
dans les champs/colones de ton BDD il faut chosir :
Interclassement : utf8_general_ci

3e
dans 2e fichier (de lire les informations vient de BDD) :

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=UTF-8'); ?>
l'utilisateur écrit, par exemple "école" dans le fichier (d'enregistrement)
Dans la BDD, sous phpMyAdmin : c'est enregistré [école]
et lu/affiché aussi "école"...



Sinon il faut utiliser

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=iso-8859-1'); ?>

Byters
Invité n'ayant pas de compte PHPfrance

03 mai 2012, 17:42

Merci pour tes réponses, mais ça ne fonctionne pas, enfin en partie car il n'y a qu'à un seul endroit où cela ne fonctionne pas.
Tout d'abord voici ma configuration Bdd sous Wamp.

Ma Bdd est en Interclassement : utf8_general_ci
Ci-dessous mon code modifier de mon header.php
<!DOCTYPE html>
<html lang="fr">
<head>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<title>Document sans nom</title>
</head>
<body>
Ci-dessous mon code index.php
<?php include ("header.php"); ?>
<?php
try
    {
        // On se connecte à MySQL
        $bdd = new PDO ('mysql:host=localhost;dbname=test', 'root', '');
        header('Content-Type: text/html; charset=UTF-8');
    }
    catch (Exception $e)
    {
        // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : ' . $e->getMessage());
		
	//$good = strtr($bad, get_html_translation_table(HTML_ENTITIES, ENT_QUOTES));
		
		// Une fois connecté à la bdd utf8
        // mysql_query("SET NAMES 'utf8'");
    }
        // Si tout va bien, on peut continuer
        
        // On récupère tout le contenu de la table jeux_video
    $reponse = $bdd->query('SELECT * FROM jeux_video');
    
        //On affiche chaque entrée une à une
    while ($donnees = $reponse->fetch())
    {
?>
    <p>
        <strong>Jeu</strong> : <?php echo $donnees ['nom']; ?><br />
        Le possesseur de ce jeu est : <?php echo $donnees ['possesseur']; ?>, et il le vend à <?php echo $donnees ['prix']; ?> euros !<br />
        Ce jeu fonctionne sur <?php echo $donnees ['console']; ?> et on peut y jouer à <?php echo $donnees ['nbre_joueurs_max']; ?> au maximum<br />
        <?php echo $donnees ['possesseur']; ?> à laissé ces commentaires sur <?php echo $donnees ['nom']; ?> : <em><?php echo $donnees ['commentaires']; ?></em>
    </p>
<?php
}

    $reponse->closeCursor() ; // Termine le traitement de la requête

?>
<?php include ("footer.php"); ?>
Entre les balises <p></p> il a du simple texte avec des accents ceux là fonctionnent bien il y a que ceux qui viennent de la Bdd qui ne fonctionne pas.
Je suis aller voir ci il n'y avait pas des caractères bizar et rien de spécial.

Merci

Petit nouveau ! | 5 Messages

03 mai 2012, 18:16

Bien j'ai trouvé une solution à mon problème. J'ai inséré charset=utf8 dans la connexion à la bdd.
$bdd = new PDO ('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
Maintenant ce que je voudrais savoir si dans mon fichier header.php j'ai mis à la bonne place le charset
<!DOCTYPE html>
<html lang="fr">
<head>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<title>Document sans nom</title>
</head>
Merci

Eléphant du PHP | 92 Messages

03 mai 2012, 18:26

tu peux essayer cela :

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=UTF-8'); ?> <?php include ("header.php"); ?> <?php $cnx = mysql_connect( "127.0.0.1", "root", "" ) ; $db = mysql_select_db( "test" ) ; $reponse= "SELECT * FROM jeux_video"; $rep = mysql_query($req, $cnx) or die( mysql_error() ) ; while($row=mysql_fetch_row($rep)){ $nom=$row[0]; $possesseur=$row[1]; $prix=$row[2]; $console=$row[3]; $nbre_joueurs_max=$row[4]; $commentaires=$row[5]; echo " <p> <strong>Jeu</strong> : $nom<br /> Le possesseur de ce jeu est : $possesseur , et il le vend à $prix euros !<br /> Ce jeu fonctionne sur $console et on peut y jouer à $nbre_joueurs_max à laissé ces commentaires sur <em> $commentaires </em> </p>" ; } $reponse->closeCursor() ; // Termine le traitement de la requête ?> <?php include ("footer.php"); ?>
mais sinon je ne sais pas pourquoi ?

Eléphant du PHP | 92 Messages

03 mai 2012, 18:31

Mieux c'est comme cela :

Code : Tout sélectionner

<?php header('Content-Type: text/html; charset=UTF-8'); ?> <!DOCTYPE html> <html lang="fr"> <head> <title>Document sans nom</title> </head>
ou bien (mais ce n'est pas bon méthode :

Code : Tout sélectionner

<!DOCTYPE html> <html lang="fr"> <head> <title>Document sans nom</title> <?php echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />; ?> </head>

Petit nouveau ! | 5 Messages

03 mai 2012, 19:29

Merci pour ton aide.

Mais il y a une erreur
Notice: Undefined variable: req in D:\Sites\wamp\www\Exercices\12-connexion-base\connexion-1.php on line 11
Query was empty
Merci