[RESOLU] Ecriture utf8 en base

Eléphanteau du PHP | 40 Messages

06 août 2019, 11:42

Bonjour,

J'ai un soucis, j'ai le formulaire suivant :
<?php $menu="carnet";
require_once "include/config.inc.php";
?>
<?php
header( 'content-type: text/html; charset=utf-8' );
if (sizeof($_POST) > 0) 
{
   $frm = $_POST;
   
switch($frm['action'])
{

case "Mise A Jour":
   $message_erreur = valide_form($frm, $erreurs);

    if (empty($message_erreur)) 
	{
       update_fiche($frm);
		fiche_details($frm);
	   require_once ("include/fct_upload.inc.php");
	
		if (isset($_FILES['fichier'])||!empty($_FILES['fichier'])) $fichier = $_FILES['fichier'];
		if ( isset($fichier) && $fichier != "none")
		{		
			$rep=upload($destDir,$fichier);
			if ($rep[0]== TRUE)
			{
				$fichier=rename_fichier($frm['prenom'],$rep[1]);
			
				$sql = "UPDATE carnet SET photo='".$fichier."' WHERE carnetclef='".$frm['carnetclef']."' ";
				assert ('mysqli_query($connex, $sql)');
				$qid = mysqli_query($connex, $sql);  
				if (!$qid)  die ("Probleme :  " . mysqli_error($connex));
			}
		}
       
       afficher_enregistrement_succes();
	$carnetclef=$frm['carnetclef'];
     include("footer.inc.php");
 echo "<a href=".htmlentities($_SERVER['PHP_SELF'])."?$carnetclef class=links>Retour fiche</a>";
       exit;
	}   
break;
case "Supprimer":
	$sql="select id FROM carnet WHERE carnetclef='".$frm['carnetclef']."' ";
	assert ('mysqli_query($connex,$sql)');
	$qid = mysqli_query($connex,$sql);  
	if (!$qid)  die ("Probleme :  " . mysql_error());
	$row=mysqli_fetch_object( $qid);

	$sql="DELETE FROM carnet_details WHERE idcarnet='".$row->id."' ";
	assert ('mysqli_query($connex,$sql)');
	$qid = mysqli_query($connex,$sql);
	if (!$qid)     die('Requète invalide : ' . mysql_error());

	$sql="DELETE FROM carnet WHERE carnetclef='".$frm['carnetclef']."' ";
	assert ('mysqli_query($connex,$sql)');
	$qid = mysqli_query($connex,$sql);
	if (!$qid)     die('Requ�te invalide : ' . mysql_error());

	require_once "head.inc.php";
	echo "<h1><center>";
	echo "Fiche supprimée";
	echo "</center></h1>";
	require_once "footer.inc.php";
	exit;
break;

}

}
else
{
$carnetclef = verif_GetPost($_GET['carnetclef']);

$sql="SELECT * FROM carnet WHERE carnetclef='$carnetclef' ";
assert ('mysqli_query($connex, $sql)');
$qid = mysqli_query($connex, $sql);  
if (!$qid)  die ("Probleme :  " . mysqli_error($connex));

$nligne= mysqli_num_rows($qid);
$list=mysqli_fetch_object( $qid);

}


function valide_form(&$frm, &$erreurs) 
{
    $erreurs = array();
    $msg = array();

	if (empty($frm['prenom']) ) 
	{
			$erreurs['prenom'] = true;
			$msg['prenom'] = "Il manque le pr�nom";
	}

	$email=htmlentities($_POST['email'], ENT_QUOTES,'UTF-8');
	
	if (empty($email)) 
	{
		$erreurs['email'] = true;
		$msg['email'] = "Absence d'email";
	}

	elseif (!preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*.([a-z]{2,4})$`',$email)) 
	{
		$erreurs['email'] = true;
		$msg['email'] = " Mauvais format d'Email";
	}
	
    return $msg;
}
function fiche_details(&$frm)
{
global $connex;

	$sql="select id FROM carnet WHERE carnetclef='".$frm['carnetclef']."' ";
	assert ('mysqli_query($connex, $sql)');
	$qid = mysqli_query($connex, $sql);  
	if (!$qid)  die ("Probleme :  " . mysqli_error($connex));
	$row=mysqli_fetch_object( $qid);


$nligne=$frm['nligne']-1;
for ($i=0;$i<=$nligne;$i++)
{

$sql = "UPDATE carnet_details SET 
	idcarnet='".$row->id."'
	,idrubrique='".$frm['idrubrique'][$i]."' 
	,observation='".htmlentities($frm['observation'][$i])."' 
	WHERE id='".$frm['iddetails'][$i]."'
	";
	
	assert ('mysqli_query($connex, $sql)');
	$qid = mysqli_query($connex, $sql);  
	if (!$qid)  die ("Probleme :  " . mysqli_error($connex));

}

if ($frm['Newidrubrique']!=-1)
{
	
    $sql = "
    INSERT INTO carnet_details (
            `idcarnet`
            , `idrubrique`	
            , `observation`	
   	) VALUES (
            '".$row->id."'
            ,'".$frm['Newidrubrique']."'
            ,'".htmlentities($frm['NewObservation'])."'
     )";

    $qid = mysqli_query($connex, $sql);
	if(! $qid ) die ('Requete invalide : ' . mysqli_error($connex));       
}

}

function update_fiche(&$frm)
{
global $connex;


$sql = "UPDATE carnet SET 
	genre='".$frm['genre']."'
	,nom='".strtoupper(htmlentities($frm['nom']))."'
	,prenom='".ucfirst( strtolower(htmlentities($frm['prenom'])))."'
	,adresse1='".htmlentities($frm['adresse1'])."'
	,adresse2='".htmlentities($frm['adresse2'])."'
	,codepostal='".$frm['codepostal']."'
	,ville='".htmlentities($frm['ville'])."'
        ,nummandataire='".($frm['nummandataire'])."'
        ,numcandidat='".($frm['numcandidat'])."'
	,tel='".htmlentities($frm['tel'])."'
	,portable='".htmlentities($frm['portable'])."'
	,email='".htmlentities($frm['email'])."'
	WHERE carnetclef='".$frm['carnetclef']."'
	";

	assert ('mysqli_query($connex, $sql)');
	$qid = mysqli_query($connex, $sql);  
	if (!$qid)  die ("Probleme :  " . mysqli_error($connex));



}

function afficher_enregistrement_succes()
{
	require_once "head.inc.php";
	echo "<h2><center>";
	echo "Mise à jour...Termine";
	echo "</center></h2>";
	require_once "footer.inc.php";
	exit;
}


?>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<?php require_once "head.inc.php"; ?>
    <font><b>Fiche Candidat :</b></font> <br><br>
<form name="fiche" method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"  enctype="multipart/form-data" >
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td valign="top">
<table  border="0" >
 <tr><td align=left>
   Civilité :
 </td><td> 
 <input name="carnetclef" type="hidden" value="<?php echo $carnetclef; ?>">
 <select name="genre">
 	<?php
  	echo ligne_selected(" ","-1",$list->genre);
 	echo ligne_selected("Monsieur","Monsieur",$list->genre);
 	echo ligne_selected("Madame","Madame",$list->genre);
 	echo ligne_selected("Mademoiselle","Mademoiselle",$list->genre);
 	?>
  </select>
 </td></tr>
  <tr> 
    <td >Nom : </td>
    <td><input name="nom" type="text" value="<?php echo stripslashes($list->nom); ?>"></td>
  </tr>
  <tr> 
    <td>Prenom : </td>
    <td><input name="prenom" type="text" value="<?php echo stripslashes($list->prenom) ?>">
        * <?php if (isset($erreurs['prenom'])) echo $message_erreur['prenom'] ?></td>
  </tr>
  <tr> 
    <td>Adresse : </td>
    <td><input name="adresse1" type="text"  value="<?php echo stripslashes($list->adresse1); ?>"></td>
  </tr>
  <tr> 
    <td>Complément Adresse : </td>
    <td><input name="adresse2" type="text" value="<?php echo stripslashes($list->adresse2); ?>"></td>
  </tr>
  <tr> 
    <td>Code postal : </td>
    <td><input name="codepostal" type="text" size="5" maxlength="5" value="<?php echo stripslashes($list->codepostal); ?>"></td>
  </tr>
  <tr> 
    <td align=left>Ville : </td>
    <td><input name="ville" type="text" size="30" maxlength="30" value="<?php echo stripslashes($list->ville); ?>"></td>
  </tr>
  <tr> 
    <td align=left>Numéro Mandataire : </td>
    <td><input name="nummandataire" type="text" size="30" maxlength="30" value="<?php echo stripslashes($list->nummandataire); ?>"></td>
  </tr>
<tr>
    <td align=left>Numéro Candidat : </td>
    <td><input name="numcandidat" type="text" size="30" maxlength="30" value="<?php echo stripslashes($list->numcandidat); ?>"></td>
  </tr>

 <tr> 
    <td>Email : </td>
    <td><input name="email" type="text" value="<?php echo stripslashes($list->email); ?>">
       * <?php if (isset($erreurs['email'])) echo $message_erreur['email'] ?></td>
  </tr>
  <tr> 
    <td>Téléphone fixe : </td>
    <td><input name="tel" type="text" value="<?php echo stripslashes($list->tel); ?>"></td>
  </tr>
  <tr> 
    <td>Portable : </td>
    <td><input name="portable" type="text" value="<?php echo stripslashes($list->portable); ?>"></td>
  </tr>
  <tr> 
    <td>Photo : </td>
            <td>
<?php            
if ($list->photo)
{
	echo "<img src='".$destDir.$list->photo."'>";
} else {
?>
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $taille_max; ?>" >
<input name="fichier" type="file" >
<?php } ?> 
</td>
  </tr>
<tr><td align="center" colspan="2"><a href=carnet-googlemaps.php?carnetclef=<?php echo $carnetclef; ?> class=links></a> &nbsp;</td></tr>
</table>
</td><td valign=top>
<table border="0" cellspacing="2" cellpadding="2">
 <tr> 
    <td align=center>Rubrique</td>
    <td align=center>Observations</td>
    </tr>

     <?php 

$sql="SELECT carnet_details.idcarnet,carnet_details.id as idtmp,carnet_details.idrubrique,carnet_details.observation,carnet.id,carnet.carnetclef 
	FROM carnet,carnet_details  
	WHERE carnet.id=carnet_details.idcarnet AND carnet.carnetclef='$carnetclef' ";

	assert ('mysqli_query($connex, $sql)');
	$qid = mysqli_query($connex, $sql);  
	if (!$qid)  die ("Probleme :  " . mysqli_error($connex));

$nligne= mysqli_num_rows($qid);

$nligne=0;
while ($row=mysqli_fetch_array( $qid))  
{ 
  		echo "<tr>";
		echo "<td valign=top>";	

	echo "<select name=\"idrubrique[]\">";
	echo ligne_selected(" ","-1",$frm['idrubrique'][$i]);
	
	$sql="SELECT id,iduser,nom FROM rubrique WHERE iduser='".$_SESSION['iduser']."' ORDER BY nom";
	assert ('mysqli_query($connex, $sql)');
	$rubrique=mysqli_query($connex, $sql);
	if (!$rubrique)     die('Requète invalide : ' . mysqli_error($connex));
	if (mysqli_num_rows($rubrique)!=0)
	{
		while( $row2=mysqli_fetch_array( $rubrique) )       
		{
			echo ligne_selected($row2[nom],$row2[id],$row[idrubrique]);  
		}
	}   
	echo "</select>";
	echo "<br>";
	echo url_test($row['observation']);
	echo "</td>";
   	echo "<td>";
	echo "<textarea name=\"observation[]\" cols=\"30\" rows=\"3\">".stripslashes(nl2br($row['observation']))."</textarea>";
	echo "<input name=\"iddetails[]\" type=\"hidden\" value=".$row['idtmp'].">";
	echo "</td>";
	echo "</tr>";
   $nligne++;
} 
	mysqli_free_result($qid);

?>
<input name="nligne" type="hidden" value="<?php echo $nligne; ?>">
  
   <tr> 
    <td> 
      
	<?php
	$sql="SELECT id,iduser,nom FROM rubrique WHERE iduser='".$_SESSION['iduser']."' ORDER BY nom";
	assert ('mysqli_query($connex, $sql)');
	$rubrique=mysqli_query($connex, $sql);
	if (!$rubrique)     die('Requète invalide : ' . mysqli_error($connex));
	if (mysqli_num_rows($rubrique)!=0)
	{
		echo "<select name=\"Newidrubrique\">";
		echo ligne_selected(" ","-1","");
		while( $list=mysqli_fetch_object( $rubrique) )       
		{
		 	echo ligne_selected($list->nom,$list->id,'');
		}
		echo "</select>";
	}   
		mysqli_free_result($rubrique);
	 ?>
	
    </td>
    <td><textarea name="NewObservation" cols="30" rows="3"></textarea></td>

   </tr>
</table>
</td></tr>
<tr>
<td align=center colspan=4><input type="submit" name="action" value="Mise A Jour"> 
<input type="submit" name="action" value="Supprimer" onClick="Javascript:return confirm('êtes-vous sûr de vouloir enlever cette ligne ?');"></td></tr> 
</table>
</form>
<?php
	mysqli_close($connex);
?>
<?php require ("footer.inc.php"); ?>
</body></html>
J'ai vérifié et converti mes fichiers en utf8 sans bom, ma base est bien en utf8, je lis bien l'utf8, mais impossible d'écrire en utf8 dans ma base. Notament le champ prénom.

Auriez-vous une idée ? pour m'aider ?

Avatar du membre
Mammouth du PHP | 1609 Messages

06 août 2019, 13:27

Salut, tu peux essayer de passer une requête SET NAMES 'UTF8' juste après la connexion.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

06 août 2019, 16:00

Désolé, mais rien n'y fait.

J'ai mis ça dans le fichier de connexion :
$connex = mysqli_connect($serveur, $user, $passwd, $bdd);
        mysqli_set_charset($connex,'utf8');
        mysqli_query($connex,"SET NAMES 'utf8'");
	if (mysqli_connect_errno()) 	    die ("Echec de la connexion : ". mysqli_connect_error());
Mais rien n'y fait

J'ai recrée ma base en utf8 et vérifié toutes les tables et champs, rien

dès que j'enregistre un enregistrement avec caractère avec accent ça coince.

C'est excessivement enerrrrvant (dikenek) :D

Avatar du membre
Mammouth du PHP | 1609 Messages

07 août 2019, 10:46

J'ai vu que tu fais des htmlentities. Dans la base tu es sûr que les données sont enregistrées telles quelles ? où c'est les données converties via htmlentities qui sont enregistrées ? Le problème pourrait venir de là. Si le charset interne de php n'est pas l'utf8 alors le htmlentities sur l'utf8 ça pourrait causer des problèmes.
default_charset = "utf-8" dans le php.ini

Si php croit qu'il mange de l'ISO-8859-1 par exemple alors un é sera pour lui un double caractère genre é et converti via htmlentities donnera quelque chose du genre &Agrave;&copy; affiché é en consultant la page ou phpmyadmin à moins d'éditer la donnée (où la tu pourras voir le contenu réel de la colonne).
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

07 août 2019, 12:23

Bonjour,
oui en effet, et je crois que tu viens de mettre le doigt dessus.
Mais pourtant j'ai bien ça : default_charset = "utf-8"

J'ai rajouté également ça dans le php.ini mssql.charset = "utf-8"

ma dernière solution et je n'ai pas d'autre carte dans ma manche après ça, c'est d'utiliser utf8_encode et utf8_decode

l'encode me donne en base : Jo&atilde; pour la saisie du prénom Joël , et à l'affichage j'ai Joã

l'idée serait d'utiliser utf8_decode mais je n'arrive pas à le placer dans ma boucle :
  echo "<tr>";
        echo "<td>".$row->nummandataire."</td>";
        echo "<td>".$row->numcandidat."</td>";
        echo "<td>".$row->genre."</td>";
        echo "<td>".$row->nom."</td>";
        echo "<td>".$row->prenom."</td>";
        echo "<td>".$row->adresse1."</td>";
        echo "<td>".$row->adresse2."</td>";
        echo "<td>".$row->codepostal."</td>";
        echo "<td>".$row->ville."</td>";
       /* echo "<td>".$row->tel."</td>"; */
        echo "<td>".$row->portable."</td>";
        echo "<td>".$row->email."</td>";
        echo "<td><a href=carnet-view-edit.php?carnetclef=$row->carnetclef class=links>Cliquez ici</a></td>";
        echo "</tr>";

Avatar du membre
Mammouth du PHP | 1609 Messages

07 août 2019, 12:38

Normalement si le default charset de php est bien l'utf-8, et que tes pages html ont bien le meta charset utf-8 et que la connexion à la base est bien en utf-8, tu n'as aucun traitement particulier à faire. As tu vérifié le bon fichier php.ini ? Peut être vérifie le charset de php au début du script avec un ini_get('default_charset').
En tout cas ne te base pas sur des données déjà vérolées pour savoir si c'est bon ou pas.

Quand tu utilises des fonctions de transformation de chaine genre htmlentities, strtoupper, etc, si le charset php ne correspond pas au charset de la chaîne transmise alors tu t'exposes à des problèmes d'encodage. Mais si le charset est le même, alors pas de problème.

Là d'après ce que tu dis tu as déjà un problème lors de l'enregistrement. Joël qui devient Jo&atilde; déjà le htmlentities ne reçoit pas une chaine utf-8 ou le charset interne de php n'est pas utf-8. Tu devrais avoir Jo&euml;l.

PS : déjà lors de l'enregistrement, tu peux tester un bête echo avant htmlentities pour voir si la chaine s'affiche bien ou pas selon le charset de la page html. Vérifie aussi au niveau du navigateur que l'encodage est bien unicode pour ta page.
Typiquement un ë utf-8 interprété en iso-8859-1 donne ë
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

07 août 2019, 13:31

Merci pour ta réponse, oui j'ai un seul fichier php.ini sur cette distro.
Pour le ini_get('default_charset') , j'ai placé ça :
 echo "ini_get('default_charset') ". ini_get('default_charset')."<br>";

if (!ini_set('default_charset', 'utf-8')) {
echo "could not set default_charset to utf-8<br>";
et mon résultat :

ini_get('default_charset') utf-8

Je fais un test d'insertion

Eléphanteau du PHP | 40 Messages

07 août 2019, 13:33

Non ça ne veut toujours pas...

Eléphanteau du PHP | 40 Messages

07 août 2019, 13:36

tu peux me dire comment tu mettrais le utf8_encode sur chaque ligne stp ?
 echo "<tr>";
        echo "<td>".$row->nummandataire."</td>";
        echo "<td>".$row->numcandidat."</td>";
        echo "<td>".$row->genre."</td>";
        echo "<td>".$row->nom."</td>";
        echo "<td>".$row->prenom."</td>";
        echo "<td>".$row->adresse1."</td>";
        echo "<td>".$row->adresse2."</td>";
        echo "<td>".$row->codepostal."</td>";
        echo "<td>".$row->ville."</td>";
       /* echo "<td>".$row->tel."</td>"; */
        echo "<td>".$row->portable."</td>";
        echo "<td>".$row->email."</td>";
        echo "<td><a href=carnet-view-edit.php?carnetclef=$row->carnetclef class=links>Cliquez ici</a></td>";
        echo "</tr>";

Je pers patience ça fait 3 jours que j'essai de resoudre cette m..... #-o

Avatar du membre
Mammouth du PHP | 1609 Messages

07 août 2019, 13:39

Bah franchement j'éviterais d'avoir à utiliser des utf8 encode et decode partout. Je ferais en sorte que ça fonctionne comme ça doit. Comprendre d'où vient le problème et y remédier.

Tu es bon au niveau du charset php. Peut être un problème au niveau du html alors ?
Tu peux faire un echo de la variable avant insertion avec et sans htmlentities voir si c'est comme il faut. Et tu peux faire un double htmlentities pour l'affichage pour qu'il t'affiche les &entityName; sans avoir à regarder dans le code source de la page.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

07 août 2019, 13:45

Quand on ne voit plus rien il vaut mieux fermer les yeux et les réouvrir... je viens de passer la variable
prenom='".ucfirst( strtolower(htmlentities(utf8_decode($frm['prenom']))))."'

avec un utf8_decode, et c'est tout bon =D> :roll:

Merci beaucoup de ton oeil en tout point avisé

Eléphanteau du PHP | 40 Messages

07 août 2019, 13:46

j'ai pas mal galéré à tout mettre au point, je vais resté la dessus pour l'instant.

Tu as en tout point raison puor les utf8_encode / decode

Avatar du membre
Mammouth du PHP | 1609 Messages

07 août 2019, 13:49

Oué ben c'est quand même étrange car un utf8_decode convertie la chaine considérée comme utf-8 en iso-8859-1. Et si le htmlentities et le strtolower font bien leur travail, ça suggère que php utilise en interne le charset iso-8859-1, ce qui contredit la valeur retournée par le ini_get... à moins que strtolower et compagnie fonctionne en iso ou détecte l'encodage de la chaine ?

PS : en fait il semblerait que strtoupper et strtolower ignorent les caractères accentués avec la configuration par défaut. Le htmlentities quand à lui prend normalement par défaut le ini_get('default_charset') mais ça peut aussi être l'utf-8 selon la version de php... ça semble quand même étrange que le htmlentities sur l'utf8_decode fonctionne comme il faut.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

07 août 2019, 14:21

En base c'est écrit en utf8, le joël est : Jo&euml;l

C'est embêtant

Eléphanteau du PHP | 40 Messages

07 août 2019, 14:24

Je peux te faire passer le projet si tu trouves ;-)