[RESOLU] Problème d'apostrophe et d'antislash sur un nouveau serveur

Cassandra
Invité n'ayant pas de compte PHPfrance

05 mars 2015, 11:56

Bonjour

me revoilà :oops:
Alors comme l'hébergeur SFR a souvent des problèmes , et que je ne vais peut être pas rester chez eux , enfin bref... J'ai aussi un autre serveur Web4all . J'ai donc mis le site sur celui là en attendant . Et mauvaise surprise, la réponse avec accent n'entre pas , et même sans accent :oops:


j'ai donc mis var_dump($_POST['reponse']); pour faire le test

<?php
$reponsefausse = '';
var_dump($_POST['reponse']);
if (preg_match("#le ?d(?:e|é)jeuner ?sur ?l.herbe#i", $_POST['reponse']))
{
header ("Location:bravo.php?adresse=03burton");
exit;
} else {
$reponsefausse= htmlspecialchars($_POST['reponse']);
}
?>
<!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" >
<html><!-- ---------------------------- HEAD ---------------------------- -->
<head>
<title>Flight Burton Enigme2</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="enigmes et enquêtes">
<meta name="keywords" content="enigmes, enquête, jeu, gratuit">
<meta name="author" content="Cassandra">
<meta name="robots" content="noindex">
<meta name="Revisit-after" content="10 days">
<link rel="stylesheet" href="style.css">

........

voir sur le lien ici dessous
http://www.enigmescassandra.free-hostin ... UGAZ02.php

Merci pour votre aide :D

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

05 mars 2015, 15:31

Hello !

Ce n'est pas un problème d'accent, mais d'apostrophe :)

Sur ton nouveau serveur, la directive magic_quotes est activée. Celle-ci va par défaut protéger toutes les apostrophes reçues par des antislash. Ainsi lorsque tu envois la chaine "Le déjeuner sur l'herbe" php reçoit et traite la chaine ""Le déjeuner sur l\'herbe" (ce que tu peux justement constater avec le var_dump :))

C'est cet antislash qui n'est pas prévu dans ton expression qui pose problème et qui du coup fait que la chaine n'est pas reconnue.

Il faudrait donc soit :
- désactiver l'option magic_quotes si tu as les droits pour le faire
- sinon, détecter si l'option est active ou non, et si elle l'est, utiliser la fonction stripslashes() pour supprimer les " \ " que php a rajouté
- ou encore prendre en compte l’éventualité de l'antislash dans ton expression de contrôle

A noter qu'actuellement, tu attends 1 et 1 seul caractère, quel qu'il soit. La réponse "Le déjeuner sur laherbe" fonctionne (bon y a un problème de redirection à cause du var_dump, mais cela montre bien que c'est l'apostrophe qui pose problème et non pas l'accent :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

05 mars 2015, 17:31

Modération :
Pour plus de clarté dans les réponses, il est préférable de faire 1 problématique = 1 sujet.
Aussi j'ai divisé le sujet initial en 2 car les problématiques sont différentes.
Quand tout le reste a échoué, lisez le mode d'emploi...

Cassandra
Invité n'ayant pas de compte PHPfrance

05 mars 2015, 22:07

Bonsoir

Désolé :oops: je comprends pour la division du sujet.

Donc je ne peux pas désactiver l'option magic_quotes car nous n'avons pas les droits pour le faire !
Dans ma formule ci dessous , comment puis je utiliser la fonction stripslashes() pour supprimer les " \ " que php a rajouté ? Où dois le mettre exactement ?

<?php
$reponsefausse = '';
if (preg_match("#le ?d(?:e|é)jeuner ?sur ?l.herbe#i", $_POST['reponse']))
{
header ("Location:bravo.php?adresse=03burton");
exit;
} else {
$reponsefausse= htmlspecialchars($_POST['reponse']);
}
?>

merci pour votre réponse

ViPHP
xTG
ViPHP | 7331 Messages

05 mars 2015, 22:36

http://openclassrooms.com/courses/les-m ... s-magiques
Voici une petite fonction à appeler en début de chaque script utilisant $_GET ou $_POST pour résoudre cela :
function stripslashes_r($var) // Fonction qui supprime l'effet des magic quotes
{
        if(is_array($var)) // Si la variable passée en argument est un array, on appelle la fonction stripslashes_r dessus
        {
                return array_map('stripslashes_r', $var);
        }
        else // Sinon, un simple stripslashes suffit
        {
                return stripslashes($var);
        }
}

if( get_magic_quotes_gpc() )
{
      $_GET = stripslashes_r($_GET);
      $_POST = stripslashes_r($_POST);
      $_COOKIE =  stripslashes_r($_COOKIE);
}

Cassandra
Invité n'ayant pas de compte PHPfrance

06 mars 2015, 11:08

Bonjour

Un grand merci pour ton aide xTG :pouce:

cela fonctionne parfaitement !

Bonne journée