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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Valeur modifiée avec une requête préparéer

par Bidibule » 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

par Tracker » 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.

par Bidibule » 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:

par nina20 » 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 ?

par Tracker » 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)

par Bidibule » 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)

par Tracker » 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:

par Sékiltoyai » 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 “”.

par zeus » 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. ;)

par Tracker » 05 oct. 2007, 10:36

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

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

par Bidibule » 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: