Problème ' (apostrophe) lors de insert et update

Petit nouveau ! | 7 Messages

22 déc. 2014, 16:35

bonjour

Permettez-moi de faire appel à la communauté des développeur PHP/MYSQL

Voici mon code :
$q = "INSERT INTO `$db_name`.`annonces` (
`id` ,
`add_date` ,
`modify_date` ,
`ind_type` ,
`matiere` ,
`nom` ,
`dimensions` ,
`poids` ,
`description` ,
`prix` ,
`date_creation` ,
`oeuvre_originale` ,
`port_automatique` ,
`type_reproduction`)

VALUES (NULL ,
NOW( ) ,
NOW( ) ,
'".eschtml($_POST[ind_type])."',
'".eschtml($_POST[matiere])."',
'".eschtml($_POST[nom])."',
'".eschtml($_POST[dimensions])."',
'".eschtml($_POST[poids])."',
'".eschtml($_POST[description])."',
'".eschtml($_POST[prix])."',
'".eschtml($_POST[date_creation])."',
'".eschtml($_POST[oeuvre_originale])."',
'".eschtml($_POST[port_automatique])."',
'".($_POST[type_reproduction])."'
);";

Lorsque dans un des champs, je mets un ' (apostrophe) l'insert se passe mal, j'ai une erreur date base. Lorsqu'il n'y a pas de ' (apostrophe), tout se passe bien, l'insert est OK.
Est-ce un problème de version PHP ?
Pour info, je viens de passer de 1and1.fr vers infomaniak.ch.

Voici mes codes header :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Version PHP 5.4
mysql Version 5.5.x

Serveur INFOMANIAK

Pourriez-vous m'aider svp ?

Merci pour votre collaboration.

Bone journée

Eric Rouyer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 déc. 2014, 20:16

Bonjour,

Je ne sais pas ce que fait la fonction eschtml() mais pour ton problème, je dirai qu'il faut utiliser mysql_real_escape_string() / mysqli_real_escape_string ou passer à PDO :
http://fr.php.net/mysqli_real_escape_string
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 688 Messages

22 déc. 2014, 20:32

selon la configuration de l'hébergeur, une ' dans un $_POST est tranformée en \' ou laissée '
voilà pourquoi, cela fonctionnait chez 1and1.fr et plus chez infomaniak.ch.
comme dit avant, la solution est que la fonction eschtml fasse le nécessaire.

Petit nouveau ! | 7 Messages

22 déc. 2014, 21:02

Merci pour vos réponses.
Mais alors que dois je faire ou encoder pour que cela fonctionne.?
Quel code devrais mettre pour ne plus avoir de bug ?

Merci encore

Eric

Petit nouveau ! | 7 Messages

23 déc. 2014, 09:59

voici ma fonction
 function eschtml($str){
  	return str_replace("line_break_space", "<br />", htmlentities(str_replace(array("\r\n", "\n", "\'", "\r"), 'line_break_space', $str)));
  }
J'ai ajouté car cela n'était pas présent "\'" mais cela ne fonctionne pas mieux.
Pourriez-vous m'aider svp à écrire une bonne fonction eschtml ?

Merci pour votre aide.

Bonne journée

Eric

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 déc. 2014, 13:18

bonjour,

comme déjà indiquer il semble que cela soit du a la disparaition des magic quote (ce qui n'est pas un mal).

On stock des données brutes en base et non encodé html, donc ta fonction eschtml ne sert pas à grand chose.

utiliser mysql_real_escape_string à la place de eschtml est la solution.

les transformations html tu les fait à l'affichage (avec htmlentites).

ta fonction eschtml est un peux bizarre car :
1/ elle remplace les sauts de lignes pas 'line_break_space'
2/ encode en html le résultat de 1/
3/ remplace line_break_space pas un saut de ligne

le remplacement des saut de lignes est inutile car htmlentities n'y touche pas.
utilise \n (dans une chaîne délimité par des ") ou la constante PHP_EOL pour un saut de ligne.

au final tu gagnes à utiliser simplement htmlentities et peux être un nl2br pour faire bien et ne pas perdre la mise en page ;) (enfin les sauts de lignes surtout).

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 1 Messages

15 mai 2015, 12:34

Bonjour,
Grand merci pour les informations et conseils à ce sujet ! J'ai en effet dû subir le passage à la version 5.5 de PHP et le cauchemar des apostrophes pour le novice en PHP que je suis.

Dans le script PHP qui sert à insérer les données dans la BDD, j'ai donc remplacé les
$nom=stripslashes($_POST['nom']) ;
par
$nom=mysqli_real_escape_string($linkii, $_POST['nom']) ;
en prenant soin de placer la ligne suivante en début de page
$linkii = mysqli_connect ("localhost","nom_base","mdp","nom_table") ;

Et ça "fonctionne" mais je me pose quelques questions :
1) à chaque récupération de variable par $POST correspond maintenant une commande de connexion. Ne faut-il pas fermer aussi ces "mysqli_connect" avec une commande close quelque part ?
2) peut-on mélanger du mysql avec du mysqli ? (je n'ai pas touché aux autres requêtes mysql déjà présentes !)
3) n'y a-t-il pas moyen de faire plus simple que de récupérer chaque variable avant insertion dans la BDD par
$nom=mysqli_real_escape_string($linkii, $_POST['nom']) ; ?

Grand merci d'avance pour vos réponses éclairées ! :D