[Résolu] Requête préparées
-
- Messages : 32
- Inscription : 21 octobre 2012 à 18:54
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
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());
}
-
- Messages : 32
- Inscription : 21 octobre 2012 à 18:54
Je ne voyais pas ce détail et je tournais en rond.
J'avais aussi utilisé $_GET au lieu de $_POST
Cordialement
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