Soucis avec mon code SQL et PHP

Enzo34!

★REALITYGAMING★
Premium
Inscription
31 Janvier 2014
Messages
1 417
Réactions
329
Points
17 831
Bonsoir,
J'ai un input qui sert a récupérer un prix l'utilisateur rentre un prix je le récupére puis je l'insère dans ma requête et je dis d'afficher tout les prix qui sont en dessus mais pas au dessus :

PHP:
$annonce = $_GET['annonce'] ?? '';
$adresse = $_GET['adresse'] ?? '';
$categorie = $_GET['categorie'] ?? '';
$min = $_GET['min'] ?? '';
$max = $_GET['max'] ?? '';

if(isset($_GET['tri']) && $_GET['tri'] == "desc") {
    $orderby = 'ASC';
 }
 else {
    $orderby = 'DESC';
 }


$req = $bdd->prepare('SELECT * FROM membres WHERE prix >= :min AND prix <= :max AND CONCAT(produit, description) LIKE :annonce AND CONCAT(ville, region) LIKE :adresse AND categorie LIKE :categorie ORDER BY date '.$orderby.'');
$req->execute([
    'annonce' => "%{$annonce}%",
    'adresse' => "%{$adresse}%",
    'categorie' => "%{$categorie}%",
    'max' => "$max",
    'min' => "$min",
]);

Donc a la ligne SELECT je dis que le prix doit être inférieur ou égale a la valeur de l'utilisateur sauf que cela fonctionne seulement quand je rentre un value dans l'input et quand je rentre rien cela n'affiche rien ...
 

MEKr

Banni
Inscription
8 Septembre 2019
Messages
80
Réactions
23
Points
3 666

puis pour ta requête je dirais que soit tu set des valeurs par defauts soit tu construits ta requête en fonction des paramètres

Code:
$req = ('SELECT * FROM XXX ');
if ($_GET['min']) {
    $req .= 'WHERE min = :min';
}
etc...
 

Enzo34!

★REALITYGAMING★
Premium
Inscription
31 Janvier 2014
Messages
1 417
Réactions
329
Points
17 831

puis pour ta requête je dirais que soit tu set des valeurs par defauts soit tu construits ta requête en fonction des paramètres

Code:
$req = ('SELECT * FROM XXX ');
if ($_GET['min']) {
    $req .= 'WHERE min = :min';
}
etc...
je vais pas set des valeurs par Default étant donne que je ne connais pas ma variable xD
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Code:
$annonce = $_GET['annonce'] ?? '';
$adresse = $_GET['adresse'] ?? '';
$categorie = $_GET['categorie'] ?? '';
$min = $_GET['min'] ?? '';
$max = $_GET['max'] ?? '';

// Tu es sûr de cette ligne ? Car là tu dis "si le prix est DESC, je veux order by ASC", ça me paraît bizarre...
if isset($_GET['tri']) && $_GET['tri'] == 'desc') {
    $orderby = 'ASC';
} else {
    $orderby = 'DESC';
}

$where = '';

if (!empty(trim($min))) {
   $min = (int) $min; // Comme ça on est sûr que min sera un nombre et pas n'importe quoi rentré par l'utilisateur
   $where .= 'prix >= :min AND'; // On ajoute la condition dans la variable $where si $min a été défini
}

// On fait la même chose avec max
if (!empty(trim($max))) {
   $max = (int) $max;
   $where .= ' prix >= :max AND';
}

$req = $bdd->prepare("SELECT * FROM membres WHERE {$where} CONCAT(produit, description) LIKE :annonce AND CONCAT(ville, region) LIKE :adresse AND categorie LIKE :categorie ORDER BY date {$orderBy}");
$req->execute([
    'annonce' => "%{$annonce}%",
    'adresse' => "%{$adresse}%",
    'categorie' => "%{$categorie}%",
    'max' => "$max",
    'min' => "$min",
]);

Comme ça, si $min est pas défini, on rajoute pas la condition dans la requête, si $max est pas défini, on rajoute pas la condition à la requête, si aucun des deux n'est défini, non plus, mais si l'un, l'autre ou les deux sont définis on les rajoute à la requête
Je ne l'ai pas testé mais je suppose que ça marche, tu m'en diras des nouvelles :p
 

Enzo34!

★REALITYGAMING★
Premium
Inscription
31 Janvier 2014
Messages
1 417
Réactions
329
Points
17 831
Code:
$annonce = $_GET['annonce'] ?? '';
$adresse = $_GET['adresse'] ?? '';
$categorie = $_GET['categorie'] ?? '';
$min = $_GET['min'] ?? '';
$max = $_GET['max'] ?? '';

// Tu es sûr de cette ligne ? Car là tu dis "si le prix est DESC, je veux order by ASC", ça me paraît bizarre...
if isset($_GET['tri']) && $_GET['tri'] == 'desc') {
    $orderby = 'ASC';
} else {
    $orderby = 'DESC';
}

$where = '';

if (!empty(trim($min))) {
   $min = (int) $min; // Comme ça on est sûr que min sera un nombre et pas n'importe quoi rentré par l'utilisateur
   $where .= 'prix >= :min AND'; // On ajoute la condition dans la variable $where si $min a été défini
}

// On fait la même chose avec max
if (!empty(trim($max))) {
   $max = (int) $max;
   $where .= ' prix >= :max AND';
}

$req = $bdd->prepare("SELECT * FROM membres WHERE {$where} CONCAT(produit, description) LIKE :annonce AND CONCAT(ville, region) LIKE :adresse AND categorie LIKE :categorie ORDER BY date {$orderBy}");
$req->execute([
    'annonce' => "%{$annonce}%",
    'adresse' => "%{$adresse}%",
    'categorie' => "%{$categorie}%",
    'max' => "$max",
    'min' => "$min",
]);

Comme ça, si $min est pas défini, on rajoute pas la condition dans la requête, si $max est pas défini, on rajoute pas la condition à la requête, si aucun des deux n'est défini, non plus, mais si l'un, l'autre ou les deux sont définis on les rajoute à la requête
Je ne l'ai pas testé mais je suppose que ça marche, tu m'en diras des nouvelles :p
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/xxxxxxindex.php:68 Stack trace: #0 /var/www/xxxxx/index.php(68): PDOStatement->execute(Array) #1 {main} thrown in /var/www/xxxxx/index.php on line 68 je vais continuer de chercher ^^
 
Dernière édition:

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/xxxxxxindex.php:68 Stack trace: #0 /var/www/xxxxx/index.php(68): PDOStatement->execute(Array) #1 {main} thrown in /var/www/xxxxx/index.php on line 68 je vais continuer de chercher ^^
Normal dans ta requête tu as sois mon sois max et dans ton execute tu donnes les deux
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
$req->execute([ 'annonce' => "%{$annonce}%", 'adresse' => "%{$adresse}%", 'categorie' => "%{$categorie}%", 'max' => "$max", 'min' => "$min", ]);
Tu peux remplacer ça par ça:
Code:
$req->bindValue(':annonce', $annonce);
$req->bindValue(':adresse', $adresse);
$req->bindValue(':categorie', $categorie);

if(is_int($max)) {
    $req->bindValue(':max', $max);
}
if (is_int($min)) {
    $req->bindValue(':min', $min);
}

$req->execute();
En PDO, tu as 2 moyens de bind une variable, soit en passant un array dans execute(), soit en utilisant bindValue(). Essaie cette méthode là, elle devrait fonctionner :p
Après bon je garantis pas le code le plus propre mais bon je vais pas te mâcher tout le travail non plus, je te donne juste l'idée globale :trollface:
 
Haut