J'ai fait un simple formulaire, à remplir qui devrait normalement injecter les données dans une bdd, pour être réutiliser, comme des "News", sur ma page d’accueil.
Cela marche très bien excepté le fait que si on rentre des accents cela ne marche pas... !
<?php
// on teste si le formulaire a été validé
if (isset($_POST['go']) && $_POST['go']=='Poster la news') {
// on se connecte à notre base
include('cobd.php');
// on teste la déclaration de nos variables
if ((!isset($_POST['auteur']) || !isset($_POST['titre']) || !isset($_POST['news']))) {
$erreur = 'Les variables nécessaires au script ne sont pas définies.';
}
else {
if (empty($_POST['auteur']) || empty($_POST['titre']) || empty($_POST['news'])) {
$erreur = 'Au moins un des champs est vide.';
}
// si tout est bon, on peut commencer l'insertion dans la base
else {
// lancement de la requête d'insertion
$sql = 'INSERT INTO news(auteur,titre,date,news) VALUES( "'.mysql_escape_string($_POST['auteur']).'", "'.mysql_escape_string($_POST['titre']).'", "'.date("Y-m-d H:i:s").'","'.mysql_escape_string($_POST['news']).'")';
//des putains de connards on doit faire un INSERT TO (table) (lister les champs) Values (Donner la valeurs de chacuns des champs)
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base de données
mysql_close();
// on redirige vers la page d'accueil du site (attention, cette redirection ne fonctionne qui si vous avez placé cette page dans un répertoire à partir de la racine du site). Si ce n'est pas le cas, veuillez entrer ici le bon chemin d'accès afin de retomber sur la page d'accueil du site.
header('Location:index.php');
// on termine le script courant
exit();
}
}
}
?>
<!-- on fait pointer le formulaire vers la page traitant les données -->
<form action="panneladmin.php" method="post">
<table>
<tr><td>
<span class="gras">Auteur :</span>
</td><td>
<input type="text" name="auteur" maxlength="30" size="50" value="<?php if (isset($_POST['auteur'])) echo htmlentities(trim($_POST['auteur'])); ?>">
</td></tr><tr><td>
<span class="gras">Titre :</span>
</td><td>
<input type="text" name="titre" maxlength="50" size="50" value="<?php if (isset($_POST['titre'])) echo htmlentities(trim($_POST['titre'])); ?>">
</td></tr><tr><td>
<span class="gras">News :</span>
</td><td>
<textarea name="news" cols="50" rows="10"><?php if (isset($_POST['news'])) echo htmlentities(trim($_POST['news'])); ?></textarea>
</td></tr><tr><td><td align="right">
<input type="submit" name="go" value="Poster la news">
</td></tr></table>
</form>
<?php
// on affiche les erreurs éventuelles
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
Quand je met des accents par exemple dans le formulaire "news", je retrouve l'erreur suivante:
Citation
Erreur SQL !INSERT INTO news(auteur,titre,date,news) VALUES( "cxc", "wxcxc", "2011-04-29 18:30:28","à é")
Incorrect string value: '\xE0 \xE9' for column 'news' at row 1
Sur PHPmyadmin
ma table est en interclassement utf8_general_ci
et le champs est "news" également.
Je ne vois pas d’où vient l’erreur, merci de votre aide.
Donc je pense que sa viens encore de la dbb. Non ? Si ? =p
Car quand je lis directement le champs dans phpmyadmin les accents sont présents, c'est donc lrs de leurs rappel pour apparaitre sur ma page que cela plante. hum en toute logique ya peut être une version du uft8 encode à l'envers...
Je viens de réaliser ce que tu ma dit.
Et sa reste inchangé =( L'espece de a espagnol reste un a espagnol ><
Par contre sur le reste de ma feuille apparait des ? au lieu des accents puisque ce n'est pas le même charset (preuve que le charset est bien modifié)
Pourtant désormais dans ma DBB grâce à ta première manip, apparait bel et bien les accents dans les champs visualisé à partir de phpmyadmin.
Pour le problème des ?, il faut à mon avis convertir aussi tes fichiers sources en UTF-8 (sans BOM), afin d'aller jusqu'au bout du passage à ce charset.
Si les accents sont bien affichés dans PMA, c'est que le problème ne vient pas de la base de données mais de ton PHP. Comment affiches-tu les news ?
<?php
include('cobd.php');
// lancement de la requête. on sélectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus récente à la plus vieille : DESC) tout en ne sélectionnant que le nombre voulu de news à afficher (LIMIT)
$sql = 'SELECT auteur, titre, date, news FROM news ORDER BY date DESC;';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on compte le nombre de news stockées dans la base de données
$nb_news = mysql_num_rows($req);
if ($nb_news == 0) {
echo 'Aucune news enregistrée.</div>';
}
else {
// si on a au moins une news, on l'affiche
while ($data = mysql_fetch_array($req)) {
// on décompose la date
sscanf($data['date'], "%4s-%2s-%2s %2s:%2s:%2s", $an, $mois, $jour, $heure, $min, $sec);
// on affiche les résultats
echo ' <div class="article"><h2>' , htmlentities(trim($data['titre'])) , '</h2>';
echo '<p class="separateur"></p><BR><FONT SIZE="+1"><p>' , nl2br(htmlentities(trim($data['news']))) , '</p></font><br /><br><br>';
echo ' <p> Par : ' , htmlentities(trim($data['auteur'])) , '';
echo '<small> Postée le : ' , $jour , '/' , $mois , '/' , $an , ' à ' , $heure , ':' , $min , ':' , $sec , '</small> <br></p> <br></div>';
}
}
// on libère l'espace mémoire alloué à cette requête
mysql_free_result ($req);
// on ferme la connexion à la base de données
mysql_close ();
?>
Au dessus du code des includes sont présent pour le reste du site donc du <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
"<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />" ?
Le problème vient de là, la page est toujours en ISO-8859-1.
UTF-8 partout ou UTF-8 nulle part.
Après si tu ne veux pas tout le site en UTF-8, tu peux recopier les includes et changer juste pour cette page, mais je te le déconseille.
Par exemple pour le titre
UTF8_decode($data['titre'])
et la miracle tout marche.
C'est ton encode() qui m'avais mis la puce à l'oreille.
Par contre je vais regardé la fonction que tu ma proposé pour aller plus loin.
Question bête, je débute, mais sa veut dire que dans tout mes formulaires, dans mes prochains sites =D je serais toutjours obligé d'encodé, décodé etc ? Il n'existe pas de fonction universel ?
Je préfére iso-8859-1 =p
au passage j'ai testé, de mettre tout en uft8 comme dit précédemment mais sa ne changeait rien, seul le UFT8_decode() à marché.
Je te déconseille fortement l'utilisation de ces fonctions (utf8_encode, utf8_decode, etc.), il est beaucoup plus simple de passer ton charset complet en UTF-8 (base de données, connexion, fichiers et headers). Car là, oui, tu seras toujours obligé d'encoder et de décoder tes chaînes, ce qui est pas très pratique...
EDIT : dans ce cas, repasse ta base en iso aussi. Aucun intérêt de stocker des données en utf-8 pour les afficher en 8859-1.
J'ai eu ce problème récemment, c'est à cause du htmlentities qui convertit les accents en leur entité html, ou un truc dans le genre . Je te conseille de remplacer ça par htmlspecialchars
Merci Arriv,
@cybertueur: oui c'est idiot de decodé recodé à chaque fois, donc si je met ma dbb tout en iso 8859 sa marcherais ? (enfin pas besoin de décodé/recodé par derrière)
Oui, il faut mettre la base de données, la table et les champs à nouveau en iso-8859-1.
Et retirer le "SET NAMES UTF8" de ton code si ce n'est déjà fait. Et ensuite, plus besoin de encode/decode.
Incorrect string value: '\xE0 \xE9' for column 'news' at row
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.