Page 1 sur 1
stripslashes
Posté : 12 janv. 2013, 22:42
par Michel6359
Bonsoir
Je cherche a retirer les fameux \ devant les apostrophes et je galère depuis plusieurs heures , j'ai essayé tout ou presque
Côté serveur pas possible même avec un fichier .htaccess
Merci pour votre d'aide
Code : Tout sélectionner
<?php
header("content-type: application/json; charset=utf-8");
// Version avec PDO
$conn = new PDO('mysql:host=localhost;dbname=**', '**', '****');
$currentTimestamp = time();
$lastTimestamp = (isset($_GET['lastTimestamp'])) ? $_GET['lastTimestamp'] : ($currentTimestamp-1);
if (!empty($_POST['pseudo']) && !empty($_POST['message']))
{
$sth->bindParam(":pseudo", $pseudo);
$sth->bindParam(":message", $message);
$sth->bindParam(":timestamp", $currentTimestamp); */
$sth->bindValue('pseudo', (stripslashes($_POST['pseudo'])),PDO::PARAM_STR);
//$sth->bindValue('message',$_POST['message'],PDO::PARAM_STR);PDO::PARAM_INT
$sth->bindValue('message',(stripslashes($_POST['message'])),PDO::PARAM_STR);
$sth->bindValue('timestamp',$currentTimestamp,PDO::PARAM_INT);
$sth->execute();
}
/* $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10");
cette ligne ne peut pas fonctionner, car on ne mélange jamais du pdo avec du mysql c'est soit l'un soit l'autre
$conn-> mysql_query("SET NAMES UTF8"); */
//$sth = $conn->query("SET NAMES UTF8");
$sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10");
$sth->bindParam(":lastTimestamp", $lastTimestamp);
$sth->execute();
$result_utf8 = $sth->fetchAll(PDO::FETCH_ASSOC);
if(count($result_utf8) > 0)
ini_set("zlib.output_compression", "On");
echo json_encode (htmlspecialchars(stripslashes($result_utf8)));
?>
Re: stripslashes
Posté : 13 janv. 2013, 04:13
par Perine
Fais attention que ces antislashes viennent d'une extension de PHP qui devrait normalement être désactivée parce qu'elle crée une fausse sécurité : magic_quotes. Si tu pouvais demander à ton hébergeur de désactiver cette extension, ce serait la meilleure chose à faire.
Cependant, il y a beaucoup d'hébergeur mal organisés qui ne peuvent pas désactiver des extensions à volonté. Pour cela, il y a un code qui doit être appelé aussi vite que possible pour nettoyer ces variables (je ne l'ai pas sous la main directement, mais je te le note ici from scratch, j'espère que je mettrai pas d'erreur

) :
function cleanup_magic_quotes() {
if (!get_magic_quotes_gpc()) {
return;
}
cleanup_magic_quotes_array($_GET);
cleanup_magic_quotes_array($_POST);
cleanup_magic_quotes_array($_REQUEST);
cleanup_magic_quotes_array($_COOKIE);
}
function cleanup_magic_quotes_array(&$array) {
$copy = $array;
$array = array();
foreach ($copy as $key => $value) {
if (is_string($key)) {
$key = stripslashes($key);
}
if (is_array($value)) {
cleanup_magic_quotes_array($value);
$array[$key] = $value;
} else {
$array[$key] = stripslashes($value);
}
}
}
cleanup_magic_quotes();
Re: stripslashes
Posté : 13 janv. 2013, 04:19
par Michel6359
Bonjour
Merci de ta réponse , mon hébergeur ne veut pas ou ne c'est pas le déactiver.
Ou je dois mettre ton code ?
Re: stripslashes
Posté : 13 janv. 2013, 10:09
par xTG
Ce code est à placer avant tout traitement des variables $_GET, $_POST, ect. (avant tout traitement mais qu'une seule fois dans le script

)
Re: stripslashes
Posté : 13 janv. 2013, 11:26
par Perine
Bonjour
Merci de ta réponse , mon hébergeur ne veut pas ou ne c'est pas le déactiver.
Ou je dois mettre ton code ?
Dans ce cas, je te conseille fortement de changer d'hébergeur.
Re: stripslashes
Posté : 13 janv. 2013, 12:30
par moogli
Ce n'est pas forcément aussi simple de dire à des gens qui ont un truc qui tourne depuis dix ans qu'ils doivent mettre leur code à jour ou se barrer ailleurs (surtout de le cas des entreprises)
Un array_walk pourrait faire la même chose ? (P´tet plus rapidement ?)
@+
Re: stripslashes
Posté : 13 janv. 2013, 12:52
par Genova
J'aurai aussi utilisé un array_walk, comme ça :
function cleanup_magic_quotes() {
if (!get_magic_quotes_gpc()) {
return;
}
array_walk_recursive($_GET, 'cleanup_magic_quotes_array');
array_walk_recursive($_POST, 'cleanup_magic_quotes_array');
array_walk_recursive($_REQUEST, 'cleanup_magic_quotes_array');
array_walk_recursive($_COOKIE, 'cleanup_magic_quotes_array');
}
function cleanup_magic_quotes_array(&$value) {
$value = stripslashes($value);
}
cleanup_magic_quotes();
++
Re: stripslashes
Posté : 13 janv. 2013, 13:06
par Perine
Non, car les clés des tableaux sont aussi affectées par les quotes magiques.
Re: stripslashes
Posté : 13 janv. 2013, 13:24
par Michel6359
Bonjour
Ok je vais essayer cette solution , mais j'attend car après avoir tenté un php.ini pour déactiver magic quotes , mon ip est bannis du site , et l'hébergeur fait le sourd pour retirer mon bannissement donc j'attend . Peut-être que mon Dimanche sera foutu pour résoudre ce problème !!!
Merci pour votre aide
Re: stripslashes
Posté : 13 janv. 2013, 16:10
par Perine
Encore mieux ! Je me répète, changer d'hébergeur ou au moins faire marcher la concurrence est la meilleure chose à faire.
D'ailleurs il y a des hébergeurs qui te permettent de t'aider pour une migration sans bavure.
Re: stripslashes
Posté : 13 janv. 2013, 19:51
par Michel6359
RE
Bon j'ai essayé la solution proposé par
Perine , mais cela ne fonctionne, jai essayé avec htmlentities , rien à faire , je suis usé avec ce problème .
Code : Tout sélectionner
<?php
header("content-type: application/json; charset=utf-8");
// Version avec PDO
$conn = new PDO('mysql:host=localhost;dbname=***', '**', '***');
function cleanup_magic_quotes() {
if (!get_magic_quotes_gpc()) {
return;
}
array_walk_recursive($_GET, 'cleanup_magic_quotes_array');
array_walk_recursive($_POST, 'cleanup_magic_quotes_array');
array_walk_recursive($_REQUEST, 'cleanup_magic_quotes_array');
array_walk_recursive($_COOKIE, 'cleanup_magic_quotes_array');
}
function cleanup_magic_quotes_array(&$value) {
$value = stripslashes($value);
}
cleanup_magic_quotes();
$currentTimestamp = time();
$lastTimestamp = (isset($_GET['lastTimestamp'])) ? $_GET['lastTimestamp'] : ($currentTimestamp-1);
if (!empty(htmlentities($_POST['pseudo'])) && !empty(htmlentities($_POST['message'])))
{
/* Attention jamais faire un htmlspecialchars() sur une variable avant mise en bd cela donne un gros risque de coruption de valeur
$message = htmlspecialchars ($_POST['message']);
$pseudo = htmlspecialchars($_POST['pseudo']); */
//mysql_query("SET NAMES UTF8");
$sth = $conn->prepare("INSERT INTO minichat(pseudo,message,timestamp) VALUES(:pseudo, :message, :timestamp)");
/* pour sécuriser une variable en pdo cette méthode est meilleur
$sth->bindParam(":pseudo", $pseudo);
$sth->bindParam(":message", $message);
$sth->bindParam(":timestamp", $currentTimestamp); */
htmlentities($_POST['pseudo'], ENT_QUOTES, "UTF-8");
htmlentities($_POST['message'], ENT_QUOTES, "UTF-8");
//htmlentities ($_POST['message'], ENT_QUOTES);
//$sth->bindValue('pseudo', (htmlentities($_POST['pseudo'])),PDO::PARAM_STR);
//$sth->bindValue('message',$_POST['message'],PDO::PARAM_STR);PDO::PARAM_INT
//$sth->bindValue('message',(htmlentities($_POST['message'])),PDO::PARAM_STR);
$sth->bindValue('timestamp',$currentTimestamp,PDO::PARAM_INT);
$sth->execute();
}
/* $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10");
cette ligne ne peut pas fonctionner, car on ne mélange jamais du pdo avec du mysql c'est soit l'un soit l'autre
$conn-> mysql_query("SET NAMES UTF8"); */
//$sth = $conn->query("SET NAMES UTF8");
$sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10");
$sth->bindParam(":lastTimestamp", $lastTimestamp);
$sth->execute();
$result_utf8 = $sth->fetchAll(PDO::FETCH_ASSOC);
if(count($result_utf8) > 0)
ini_set("zlib.output_compression", "On");
echo json_encode (htmlspecialchars(stripslashes($result_utf8)));
?>
Re: stripslashes
Posté : 13 janv. 2013, 20:21
par moogli
salut,
A tu vérifié la configuration php du serveur ? (dont notamment les magic_quote)
coté code :
ajoute des var_dump() dans ton code pour voir ce qui ce passe.
par exemple avant l'utilisation de la fonction de Perine et après pour contrôler ce qui ce qui se passe
Même chose à la sortie de ta requête SQL
Quand tu utilise le script directement dans un navigateur tu as quoi ?
A l'insertion dans la table tu utilise et htmlentities et htmlspecialchars, hors tu ne devrais utiliser ni l'un ni l'autre

Ceci afin d'avoir les données brutes en base (ce qui n'est pas gênant) et utilise la fonction que tu veux pour l'affichage (mais pas les deux c'est pas forcément utile).
Tu pourras ainsi, si tu le souhaite utiliser ces données pour faire autre chose (export sous un format quelconque autre que tu html

).
@+