suite à un autre sujet poster ici j'ai vu que j'avais 2 connexion pour mon panier et mon code promotion a ma base de donnée.
J'essaye de les réduire à une seule avec pdo vu que mon panier se base sur les requêtes préparé pdo.
seulement j'ai une erreur qui s'affiche sur laquelle je bute :
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?' at line 1 in /var/www/html/produit/db.class.php on line 43
public function __construct($host = null, $username = null, $password = null, $database = null){
if($host != null){
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
}
try{
$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
));
}catch(PDOException $e){
die('<h1>Impossible de se connecter a la base de donnee</h1>');
}
}
public function query($sql, $data = array()){
$req =$this->db->prepare($sql);
$req->execute($data);
return $req->fetchAll(PDO::FETCH_OBJ);
}
public function count($sql, $data = array()){
$req = $this->db->prepare($sql);
$req->execute($data);
return $req->fetchColumn();
}
public function kaka($sql, $data = array()){
$req =$this->db->prepare($sql);
$req->execute($data);
return $req->fetchAll(PDO::FETCH_ASSOC);
}
Si tu mets un marqueur, le ?, tu fournis sa valeur à quel moment ? Ta méthode kaka attend un tableau facultatif en second argument pour justement y préciser les binds à faire. Enfin, c'est toi qui a écrit cette méthode ...
$codeuser = $DB->kaka("SELECT * FROM promotion WHERE promo = ?"); => $codeuser = $DB->kaka("SELECT * FROM promotion WHERE promo = ?", [$_POST['promo']]);
public function kaka($sql, $data = array()){
$req =$this->db->prepare($sql);
$req->bindParam('promo', $codeuser, PDO::PARAM_INT);
$req->execute();
return $req->fetchAll(PDO::FETCH_ASSOC);
}
je bute encore PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /var/www/html/produit/db.class.php on line 44 toujours la ligne execute
Non, j'avais édité pour donner la solution en plus.
Non seulement procéder ainsi limiterait grandement le réemploi de la méthode mais, question de portée, la variable $codeuser n'existe pas pour commencer.
> $codeuser = $DB->kaka("SELECT * FROM promotion WHERE promo = ?"); => $codeuser = $DB->kaka("SELECT * FROM promotion WHERE promo = ?", [$_POST['promo']]);
Je n'avais pas tilté mais avec le fetchAll, $codeuser serait un tableau de tableaux, ton test if($codeuser == $codeconnect) { ne saurait être vrai. Ce serait plus par la méthode count (avec un SELECT COUNT(*)) que kaka qu'il faudrait passer.
Non il faut que tu changes SELECT * en SELECT COUNT(*) et if($codeuser == $codeconnect) { en if($codeuser == 1) {
Si ton code fonctionnait ce serait vraiment un coup de bol : il faudrait que la première colonne renvoyée par le SELECT * soit celle de ta colonne promo (ie avec SELECT promo ça pourrait fonctionner) mais après ça dépend encore de la casse et si ton interclassement est insensible à la casse. Bref, pour faire court, la méthode basée sur un SELECT COUNT(*) est bien plus viable.
d'accord c'est limpide par contre le calcul total se fait sur une autre page (panier.class) je pensai du coup faire une session a la page livraison ou se situe le codeuser etc pour la promotion.
et importer sur ma page panier class le session discount
sa donne sa
if(isset($_POST['promo'])) {
$codeconnect = $_POST['promo'];
if(!empty($codeconnect)) {
$codeuser = $DB->get("SELECT * FROM promotion WHERE promo = ?", [$_POST['promo']]);
if ($codeuser) {
echo "<p> votre code est valide </p>";
$_SESSION['discount'] = $codeuser['discount'];
} else {
echo "<p>Mauvais code de promotion !</p>";
}
}
}
A toi de me dire Je pense qu'avec ce code, $_SESSION['discount'] peut ne pas exister donc plutôt return $total * ($_SESSION['discount'] ?? 1) + $_SESSION['port'] ; (ou return $total * (1 - ($_SESSION['discount'] ?? 0)) + $_SESSION['port'] ; suivant ce que représente le discount) ?
Attention :
aux décimaux, ce n'est pas du calcul exact, tu pourrais avoir des surprises (arrondis)
les sessions peuvent potentiellement durer plus longtemps que tu ne le penses, perso, je retesterais sa validité complète à la fin (paiement). Idem pour les frais de port mais je suis peut être parano. Ok pour garder ces informations en session de façon indicative en guise de cache mais je revérifierais/recalculerais tout au moment du paiement
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
je bute encore PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /var/www/html/produit/db.class.php on line 44 toujours la ligne execute
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
tu veux dire ainsi ? sa me met toujours sur le ELSE si c'est sa
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli