[Résolu] Requête préparées

Vous avez un soucis de développement et ce n'est pas du ressort de notre support ? N'hésitez pas à soumettre vos petits soucis de développement et à vous entre aider par la même occasion.
Répondre
Philippe40
Messages : 32
Enregistré le : 21 octobre 2012 à 18:54

Bonjour,

J'ai créé une requête préparée insert qui ne fonctionne pas :
try {\t\t
\t\t $connexion = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);
\t\t\t\t $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
\t\t\t\t
\t\t\t\t $prepared = $connexion->prepare
\t\t\t\t (
\t\t\t\t "INSERT INTO wp3_achats (id,code_article, product_name,createdon,qt,pa,latitude,longitude,id_magasin,utilisateur )\t\t\t
\t\t\t\t VALUES
\t\t\t\t (
\t\t\t\t\t :id ,
\t\t\t\t\t :codearticle ,\t\t\t\t
\t\t\t\t\t :created ,
\t\t\t\t\t :qt ,
\t\t\t\t\t :pa ,
\t\t\t\t\t :latitude ,
\t\t\t\t\t :longitude ,
\t\t\t\t\t :idmagasin ,
\t\t\t\t\t :utilisateur
\t\t\t\t\t)"
\t\t\t\t );
\t\t\t\t\t\t
\t $prepared->bindParam(':id' , $_GET['id']);
\t\t $prepared->bindParam(':codearticle', $_GET['code_article']);
\t $prepared->bindParam(':created', $_GET['createdon']);
\t $prepared->bindParam(':qt', $_GET['qt']);
\t $prepared->bindParam(':pa', $_GET['pa']);
\t $prepared->bindParam(':latitude', $_GET['latitude']);
\t $prepared->bindParam(':longitude', $_GET['longitude']);
\t $prepared->bindParam(':idmagasin', $_GET['id_magasin']);
\t $prepared->bindParam(':utilisateur', $_GET['utilisateur']); \t\t\t\t
\t\t \t\t\t\t\t\t\t
\t\t\t$prepared->execute();
\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t
}

catch(PDOException $x) { die("Secured"); }

\t\t$prepared = null;
\t\t$connection = null;

Malgré tous mes essais, elle ne fonctionne pas.

J'ai une requête équivalente en injection directe qui fonctionne

try {\t\t
\t\t $dbh = new PDO('mysql:host='.$host.';dbname='.$base, $user, $pass);
\t\t\t\t
\t\t\t\t $sql = "INSERT INTO wp3_achats (id,code_article,createdon,qt,pa,latitude,longitude,id_magasin,utilisateur)
\t\t\t\t VALUES
\t\t\t\t\t\t (
\t\t\t\t\t\t '$_POST[id]' ,
\t\t\t\t\t\t '$_POST[code_article]' ,\t\t\t\t\t\t
\t\t\t\t\t\t '$_POST[createdon]' ,
\t\t\t\t\t '$_POST[qt]' ,
\t\t\t\t\t\t '$_POST[pa]' ,
\t\t\t\t\t\t '$_POST[latitude]' ,
\t\t\t\t\t\t '$_POST[longitude]' , \t\t\t\t\t\t
\t\t\t\t\t\t '$_POST[id_magasin]' ,
\t\t\t\t\t\t '$_POST[utilisateur]'
\t\t\t\t\t\t )";
\t\t\t\t\t\t
if ($dbh->query($sql) === TRUE) { echo "New record created successfully";}
\t\t\t\t
\t\t\t\t else
\t\t\t\t {
\t\t\t\t\t echo "Error: " . $sql . "<br>" . $dbh->error;\t\t\t\t \t\t\t\t
\t\t\t\t }\t\t\t\t
}
catch (PDOException $error) {die("Erreur de connexion : " . $error->getMessage() );}\t\t\t

$dbh->close();

Pouvez-vous m'aider ?

Cordialement
Philippe
Avatar du membre
Elodie
Messages : 7735
Enregistré le : 2 avril 2010 à 20:14

Bonjour,

Dans la première requête, vous avez 9 éléments préparés alors que vous avez 10 propriétés, il vous manque "product_name" qui n'est pas préparé ni associé (bindé).

Dans le catch de l'erreur, au lieu d'afficher le mot "Secured", vous pouvez afficher le message d'erreur comme dans votre requête non préparée. Vous auriez eu un message d'erreur vous indiquant une incohérence entre le nombre de propriétés et les valeurs préparées :

Code : Tout sélectionner

catch(Exception $x)
    {
    die("Erreur MySQL n° ".$x->getCode()." : ".$x->getMessage());
    }
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Philippe40
Messages : 32
Enregistré le : 21 octobre 2012 à 18:54

Encore une fois merci.
Je ne voyais pas ce détail et je tournais en rond.
J'avais aussi utilisé $_GET au lieu de $_POST
Cordialement
Avatar du membre
Elodie
Messages : 7735
Enregistré le : 2 avril 2010 à 20:14

Je vous en prie, passez un bon samedi soir.
philippe40 a écrit :Encore une fois merci.
Je ne voyais pas ce détail et je tournais en rond.
J'avais aussi utilisé $_GET au lieu de $_POSTt
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Répondre