Valeur modifiée avec une requête préparéer

Eléphant du PHP | 53 Messages

05 oct. 2007, 10:27

BOnjour à tous!

Voilà j'utilise les requêtes préparées afin de me prémunir des injections SQL et aussi pour avoir un code encreo un peu plus lisible et robuste.

Mais j'ai qqch de bizarre qui se passe

J'ai un champ "Numéro de téléphone" dans lequel la personne peut entrer une chaine de caractère (genre 064/123 458) mais lorsque que j'associe le paramètre à la valeur et que j'insère,
dans la BD je retouve ceci 64 ...

En gros il tronque le 0 et s'arrête au slash... Test vérifié lorsque j'enlève le slash il m'insère 64123458

Est-ce normal qu'il élimine comme ça mes donnés ? Dois-je reprendre mes bonnes "vieilles" fonctions pour éluder les caractères spéciaux et virer les requêtes préparées ? (addslashes, htmentities, etc etc

merci pour votre éclaircissement

:wink:

Eléphant du PHP | 443 Messages

05 oct. 2007, 10:36

caste en string [ (string)$numtel ] quand tu définis le paramêtre lors de la préparation.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 oct. 2007, 10:37

C'est pas mal que tu arrives à donner la réponse sans voir le code :-k

En tout cas, j'en suis incapable. Du moins sans lancer des idées en l'air et voir si ça marche. ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

05 oct. 2007, 10:42

Trois choses :
-Un slash n'a rien à faire dans un numéro de téléphone, tu n'es pas sensé faire la requète avec. Lorsque tu fais un “cast” (c'est pas un vrai cast mais bon…) chaine vers entier, alors il retire tout 0 en début de chaine, et arrête la lecture au premier caractère non numérique, intval() se comporte exactement pareil…
-Les requètes préparées ne te dispensent pas des contrôles sur les données, non pour s'assurer de la sécurité de la base, mais pour t'assurer de l'intégrité des données, parce que sans contrôle, on peut te mettre le numéro 8756 en base sans que le script bronche. C'est à toi, lorsque le numéro n'est pas correct, de demander à l'utilisateur de le retaper ou de l'effacer…
-Enfin un numéro de téléphone ne contient que des chiffres mais ce n'est pas un entier, ce n'est pas une information numérique, c'est une information textuelle, tu dois le stocker sous forme d'une chaine. D'ailleurs, tel que tu le stockes, le “0632…” se transforme en “632…”, et pire, le “06 32…” se transforme en “6”, et enfin le “+33 6 32…” te donne “”.

Eléphant du PHP | 443 Messages

05 oct. 2007, 10:44

Dans son cas il parait clair que sa chaine est interprétée comme un nombre, ça sous-entend qu'il n'a pas fait de transtypage...
Cela dit, si ça ne fonctionne pas il filera sans doute le code :wink:

Eléphant du PHP | 53 Messages

05 oct. 2007, 13:15

Yop,

non en castant ça ne chaneg rine et c'est vrai que j'ai omis le bout de ccde!

Voici
$query = "INSERT INTO users " .						"values(:login,:password,:firstname,:surname,:email,:tel1,:tel2,:role,:box)";

$user = $this->db->prepare($query);
$user->bindParam(':tel1',$tel1,PDO::PARAM_STR);

...
...
...

j'avais fait avant sans le paramètre optionnel mais même en le rajoutant ça ne change rien..

Je précise que le champ est déclaré en VARCHAR hein!

Je comprends pas pourquoi il l'insère comme un entier... (je suis au courant que quand il prend comme un entier, il enlève le 0 et s'arrêt au 1er carcat non-numérique)

Eléphant du PHP | 443 Messages

05 oct. 2007, 13:39

File plus de code, parce qu'on voit pas d'où vient ta variable $tel1 (le problème est peut-être en amont)

Petit nouveau ! | 5 Messages

10 oct. 2007, 23:39

bonsoir,
je suis pas sûr de mon coup, mais ... à partir du moment où dans ta base.latable l'attribut TEL à le bon format => varchar(X), je vois pas pourquoi à l'insertion la valeur serait interprétée comme un nombre et donc modifiée ! non ?

Eléphant du PHP | 53 Messages

15 oct. 2007, 11:08

Je reste toujours perplexe faca à cela...

Voici ma méthode


Code : Tout sélectionner

function addUser($surname, $firstname,$email, $password, $tel1, $tel2, $role, $box){ $password = md5($password); // Remplacement des accents et des espaces $firstname_log = $this->formatString($firstname); $surname_log = $this->formatString($surname); $login = $firstname_log{0}; $login .= substr($surname_log,0,5); $login = strtolower($login); // Préparation de la requête $query = "SELECT count(*) as nb FROM users " . "WHERE user_login = :login"; $user = $this->db->prepare($query); // Remplacement des valeurs $user->bindParam(':login',$login); $user->execute(); $result = $user->fetchAll(); $num_rows = $result[0]['nb']; $user = NULL; if($num_rows == 0){ $query = "INSERT INTO users " . "values(:login,:password,:firstname,:surname,:email,:tel1,:tel2,:role,:box)"; $user = $this->db->prepare($query); $user->bindParam(':login',$login); $user->bindParam(':password',$password); $user->bindParam(':firstname',$firstname); $user->bindParam(':surname',$surname); $user->bindParam(':email',$email); $user->bindParam(':role',$role); $user->bindParam(':tel1',$tel1,PDO::PARAM_STR); $user->bindParam(':tel2',$tel2,PDO::PARAM_STR); $user->bindParam(':box',$box); $user->execute(); $user = $this->db = NULL; return true; } else return false; }
Le paramètre PDO::PARAM_STR j'ai essayé sans et avec mais sans succès...

merci à vous! :wink:

Eléphant du PHP | 443 Messages

15 oct. 2007, 11:20

Au début de ta fonction addUser(...), tu peux ajouter die($tel1);
Ta variable est peut-être fliguée bien avant l'appel ??

[edit]
plutot var_dump($tel1);
die()
on verra aussi le type.

Tracker.

Eléphant du PHP | 53 Messages

15 oct. 2007, 11:25

Bon je crois que j'ai trouvé et ça n'a rien avoir avec PHP.

En fait je bosse avec SWX PHP pour ceux qui connaisent, une interface Flash/PHP.

Et je teste avec l'explorer SWX ce qui me fait dire que quand je fais un call avec mes paramètres passés, l'interpréteur JSON a mon avis modifie la valeur!

j'en dis plus sous peu