Page 1 sur 1

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

Posté : 26 septembre 2020 à 15:40
par Philippe40
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

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

Posté : 26 septembre 2020 à 16:43
par Elodie
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());
    }

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

Posté : 26 septembre 2020 à 18:06
par Philippe40
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

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

Posté : 26 septembre 2020 à 19:16
par Elodie
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