Soucis avec mon code SQL et PHP

Enzo34!

★REALITYGAMING★
Premium
Inscription
31 Janvier 2014
Messages
1 417
Réactions
329
Points
17 831
RGCoins
0
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
RGCoins
0

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
RGCoins
0

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
RGCoins
0
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
RGCoins
0
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 712
Réactions
8 501
Points
32 425
RGCoins
0
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
 

Enzo34!

★REALITYGAMING★
Premium
Inscription
31 Janvier 2014
Messages
1 417
Réactions
329
Points
17 831
RGCoins
0
Normal dans ta requête tu as sois mon sois max et dans ton execute tu donnes les deux
Du coup quand je rentre aucune cari lave vu que ça apparaît pas dans la requête je comprend l’erreur mais quand je rentre une variable j’ai quand même l’erreur louche
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
RGCoins
0
$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