Critères de selection dans une base de données

SHINTYMAN Messages postés 114 Date d'inscription   Statut Membre Dernière intervention   -  
SHINTYMAN Messages postés 114 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, je suis en cours d'apprentissage du language MySQL, et j'ai appris à chercher des informations en utilisant des conditions (WHERE). Mettons que je fasse une page HTML avec un formulaire de recherche qui contient plusieurs champs, comme par exemple 'pseudo', 'prix', 'type'. Aucun n'est obligatoire; ainsi, j'avais pensé faire ceci:

//Pseudo
if(isset($_POST['pseudo']))
{
$pseudo= $_POST['pseudo'];
}
else
{
$pseudo = '*';
}

//Type de produit
if(isset($_POST['type']))
{
$type = $_POST['type'];
}
else
{
$type = '*';
}

//Prix Max
if(isset($_POST['prix_max']))
{
$prix= $_POST['prix_max'];
}
else
{
$prix = '*';
}

$req = $produits->prepare('SELECT nom, prix FROM vente WHERE pseudo = :pseudo AND prix <= :prix AND type= :type');
$req->execute(array('pseudo' => $pseudo, 'prix' => $prix, 'type' => $type));

J'avais pensé que l'astérisque marcherais en tant que 'toutes les entrées', mais il semble que ça ne marche pas. Y a-t-il un moyen d'accomplir ceci?

P.S: La table contient les champs suivants: nom, prix, pseudo, type et la page d'avant a un formulaire qui demande le pseudo de l'offrant ('pseudo'), le type ('type') et/ou le prix max ('prix_max').



A voir également:

2 réponses

Utilisateur anonyme
 
Bonjour

J'avais pensé que l'astérisque marcherais en tant que 'toutes les entrées'
C'est bien de "penser", mais il y a encore mieux : lire le manuel.
Le caractère générique, c'est % et non pas *, et il s'utilise avec LIKE et non pas =, qui recherche une 'vraie' égalité.
Pour ton prix, il vaut mieux transformer la condition en <= très grand nombre pour qu'elle soit toujours vraie.
Enfin, histoire d'alléger un peu l'écriture, il vaut mieux, dans les cas simples comme celui-ci, utiliser l'opérateur ternaire ? : plutôt que if... else :

//Pseudo
	$pseudo= isset($_POST['pseudo']) ? $_POST['pseudo']:'%';
//Type de produit
	$type= isset($_POST['type']) ? $_POST['type']:'%';
//Prix Max
	$prix= isset($_POST['prix_max']) ? $_POST['prix_max']:1000000000;

$req = $produits->prepare('SELECT nom, prix FROM vente WHERE pseudo LIKE :pseudo AND prix <= :prix AND type LIKE :type');
$req->execute(array('pseudo' => $pseudo, 'prix' => $prix, 'type' => $type));
0
SHINTYMAN Messages postés 114 Date d'inscription   Statut Membre Dernière intervention   153
 
Merci beaucoup! J'ai aussi rajouté des lignes pour les champs vides et du coup, maintenant, j'ai ceci :

//Pseudo
$pseudo= isset($_POST['pseudo']) ? $_POST['pseudo'] : '%';
$pseudo= ($pseudo == null) ? '%' : $_POST['pseudo'];

//Type de produit
$type= isset($_POST['type']) ? $_POST['type'] : '%';
$type= ($type == null) ? '%' : $_POST['type'];

//Prix Max
$prix= isset($_POST['prix_max'])? $_POST['prix_max'] : 1000000000;
$prix= ($prix == null) ? 1000000000 : $_POST['prix_max'];


qui marche!
0