insérer des valeurs contenant des caractères spéciaux sous PHP5.5.2 et PDO

Eléphanteau du PHP | 17 Messages

25 août 2015, 17:55

Bonjour, je viens de passer mon site sous php5.5.2 et tant qu'à faire, j'ai tout passé aussi en PDO. Mais j'ai un souci avec les variables de formulaire comme une adresse postale par exemple ( disons $_POST['adresse'] = 3 rue de l'hirondelle ) Ce champ contenant la guillemet simple ' bloque tout l'insert en base sql. J'ai bien lu qu'on pouvait utiliser PDO directement ou utiliser mysqli_real_escape_string mais je n'y arrive pas !!! Je ne suis pas très doué, quelqu'un pourrait me poster le code pour que mon INSERT accepte l'adresse " 3 rue de l'hirondelle " ?
MERCI 1000 fois

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

25 août 2015, 18:36

Bonjour,

Il faut que tu utilises la fonction PDO quote(), il y a des exemples dans la doc :
https://secure.php.net/manual/fr/pdo.quote.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 17 Messages

25 août 2015, 18:50

merci mais ça ne marche pas du tout. j'ai essayé ça :

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* Chaîne simple */
$string = 'Nice';
print "Chaîne non échappée : $string\n";
print "Chaîne échappée : " . $conn->quote($string) . "\n";
?>
rien, ça ne marche pas. Par quoi je dois remplacer ça ? : $conn = new PDO('sqlite:/home/lynn/music.sql3');

merci

Mammouth du PHP | 2703 Messages

25 août 2015, 18:52


Eléphanteau du PHP | 17 Messages

25 août 2015, 19:13

merci les gars !!! Je crois que j'ai enfin compris. En fait je remplace $conn = new PDO('sqlite:/home/lynn/music.sql3'); par ma connexion à ma base via PDO ( chez moi c'est $connexion=new PDO('..... ) donc en fait je remplace $conn par $connexion. A priori ça marche :) Mais ça remplace les apostrophes par un espace ... il n'y a pas moyen de conserver les apostrophes ?
MERCI

Eléphanteau du PHP | 17 Messages

25 août 2015, 21:13

et pour un mot de passe ? comment conserver les ' * " ? / etc ... ? Là il ne faut pas les remplacer par des espaces, il faut les conserver ... Merci pour votre aide

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

25 août 2015, 22:27

salut,

il faut le faire à l'insertion dans la base, quote ne sert pas à l'affichage.
il faut voir ce qu'il y a en base réellement pour l'afficher correctement.
Est ce que le code d'origine n'aurait pas fonctionné avec les magic_quote activée et non géré ? (du genre ajout de \ automatique).

Si tu veux que l'on t'aide efficacement il faut que tu nous fournisse ton code.

Suivant comment tu réalise l'insertion en base tu peux ou pas avoir besoin de quote. Par exemple si tu utilise une requête préparée (comme souvent indiqué dans les tutos sur PDO) tu n'en as pas besoin.

Perso je propose plus de n'utiliser les requêtes préparées qu'a bon escient et d'utiliser quote.
Par exemple
<?php
$pdo = new \PDO(''); // a remplacer par la connexion à la base
$sql = 'insert into laTable (les,champs,utiles) values('.$pdo->quote($variable).' , '.$pdo->quote($variable2).','.$pdo->quote($variable3).')';

$pdo->query($sql);
?>
en fonction du type de champs du champs SQL tu peux utiliser le second paramètre de quote pour l'indiquer. par défaut c'est PDO::PARAM_STR mais tu indiquer un entier ou autre.

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

Eléphanteau du PHP | 17 Messages

26 août 2015, 08:17

Merci Moogli. Je vais essayer de comprendre tout ce que tu dis :) je teste tout ça aujourd'hui. A tout à l'heure donc ...

Eléphanteau du PHP | 17 Messages

26 août 2015, 09:21

j'ai essayé ça, mais ça ne marche pas ...

$Pass = $connexion->quote($_POST['password']);

$resultats=$connexion->exec("INSERT INTO membre VALUES('".$Pass."')");

Eléphanteau du PHP | 17 Messages

26 août 2015, 09:50

a priori si j'écris
$resultats=$connexion->exec("INSERT INTO membre VALUES($Pass)");
ça semble marcher ... normal ?

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

27 août 2015, 09:10

Bonjour,

La méthode pdo::quote va non seulement protéger les apostrophes contenues dans la chaine passée en argument, mais également ajouter des apostrophes autour de celle-ci afin de pouvoir l'utiliser dans une requête SQL ;)
$Pass = $connexion->quote($_POST['password']); // MonMotD'Passe

echo "INSERT INTO membre VALUES('".$Pass."')";
// génère un code SQL invalide : INSERT INTO membre VALUES(''MonMotD''Passe'') 

echo "INSERT INTO membre VALUES($Pass)";
// génère un code SQL valide : INSERT INTO membre VALUES('MonMotD''Passe') 

echo "INSERT INTO membre VALUES(" . $Pass . ")";
// génère un code SQL valide : INSERT INTO membre VALUES('MonMotD''Passe')
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...