J'essaie de créer une option de recherche/filtrage dans mon application de donneur de sang. Où donneur peut être recherché par sexe, nom, groupe sanguin ou en sélectionnant tous les trois. Voici mon code
function search_donar($_POST) {
$by_name = $_POST['by_name'];
$by_sex = $_POST['by_sex'];
$by_group = $_POST['by_group'];
$by_level = $_POST['by_level'];
$search_query = "SELECT * FROM donar WHERE";
if($by_name !="") {
$search_query .= " name='$by_name'";
}
if($by_sex !="") {
$search_query .= " sex='$by_sex'";
}
if($by_group !="") {
$search_query .= " blood_group='$by_group'";
}
if($by_level !="") {
$search_query .= " e_level='$by_level'";
}
$search_query;
$result = mysql_query($search_query);
return $result;
}
Et voici le html
if(isset($_POST['submit'])) {
$retrived_result = $donar->search_donar($_POST);
}
<form action="" method="post">
<table width="100%" border="0" style="border:none;">
<tr>
<td><label>Name: </label><input type="text" name="by_name" /></td>
<td><label>Sex: </label><input type="text" name="by_sex" /></td>
<td><label>Blood Group: </label><input type="text" name="by_group" /></td>
<td><label>Level: </label><input type="text" name="by_level" /></td>
<td><input class="button" type="submit" name="submit" value="Search" /></td>
</tr>
</table>
</form>
Le filtrage simple fonctionne très bien. Mais filtrer avec tout ce que j'ai utilisé ET, mais cela me donne une erreur. Quelqu'un peut-il aider?
Merci d'avance
Comme pour tous les autres articles, vous devrez ajouter toutes les conditions avec AND, comme ça. C'est la réponse la plus propre à ce jour. N'oubliez pas de réellement échapper à vos chaînes, mais utilisez la méthode mysqli OOP à la place de l'ancien mysql Juste une suggestion.
Voici un exemple de requête typique.
La bonne façon:
SELECT * FROM donar WHERE name='dxenaretionx' AND sex='M';
La façon dont vous le faites
SELECT * FROM donar WHERE name='dxenaretionx' sex='M';
Code:
function search_donar($_POST) {
$by_name = $_POST['by_name'];
$by_sex = $_POST['by_sex'];
$by_group = $_POST['by_group'];
$by_level = $_POST['by_level'];
//Do real escaping here
$query = "SELECT * FROM donar";
$conditions = array();
if(! empty($by_name)) {
$conditions[] = "name='$by_name'";
}
if(! empty($by_sex)) {
$conditions[] = "sex='$by_sex'";
}
if(! empty($by_group)) {
$conditions[] = "blood_group='$by_group'";
}
if(! empty($by_level)) {
$conditions[] = "e_level='$by_level'";
}
$sql = $query;
if (count($conditions) > 0) {
$sql .= " WHERE " . implode(' AND ', $conditions);
}
$result = mysql_query($sql);
return $result;
}
L'extrait de code suivant:
$search_query = "SELECT * FROM donar WHERE";
if($by_name !="") {
$search_query .= " name='$by_name'";
}
if($by_sex !="") {
$search_query .= " sex='$by_sex'";
}
produit des requêtes comme
SELECT * FROM donar WHERE name='nowak' sex='m'
, qui ne sont pas valides car il n’existe aucun opérateur logique entre les clauses. Vous devez ajouter un 'ET'. Pour simplifier le code, vous pouvez générer des conditions sous la forme "true et a et b ...":
$search_query = "SELECT * FROM donar WHERE true";
if($by_name !="") {
$search_query .= " AND name='$by_name'";
}
if($by_sex !="") {
$search_query .= " AND sex='$by_sex'";
}
...
Il y a dans votre code un problème de requête où condition. Ici, votre requête sera comme select * from donar where by_name = "A" by_group = "N"
il n’existe pas de And/Or
pour effectuer correctement la condition where. S'il vous plaît essayez le code comme indiqué ci-dessous.
$search_query = "SELECT * FROM donar";
$query_cond = "";
if($by_name !="") {
$query_cond .= " name='$by_name'";
}
if($by_sex !="") {
if(!empty($query_cond)){
$query_cond .= " AND ";
}
$query_cond .= " sex='$by_sex'";
}
if($by_group !="") {
if(!empty($query_cond)){
$query_cond .= " AND ";
}
$query_cond .= " blood_group='$by_group'";
}
if($by_level !="") {
if(!empty($query_cond)){
$query_cond .= " OR ";
}
$query_cond .= " e_level='$by_level'";
}
if(!empty($query_cond)){
$query_cond = " Where ".$query_cond;
$search_query.$query_cond;
}
Ici, dans le code Nous prenons d'abord la variable $query_cond
vide et faisons la condition en fonction du code. et gérer l'opérateur AND
en fonction de cela. Et en dernier si nous avons trouvé $query_cond
pas vide, ajoutez-le à $select_query
.
J'espère que cela vous sera utile.
merci
Essayez comme ça:
function search_donar($_POST) {
$by_name = $_POST['by_name'];
$by_sex = $_POST['by_sex'];
$by_group = $_POST['by_group'];
$by_level = $_POST['by_level'];
$isfirst=0;
$search_query = "SELECT * FROM donar WHERE";
if($by_name !="") {
$search_query .= " name='$by_name'";
$isfirst=1;
}
if($by_sex !="") {
if($isfirst!=0)
$search_query .= " AND ";
$search_query .= " sex='$by_sex'";
$isfirst=1;
}
if($by_group !="") {
if($isfirst!=0)
$search_query .= " AND ";
$search_query .= " blood_group='$by_group'";
$isfirst=1;
}
if($by_level !="") {
if($isfirst!=0)
$search_query .= " AND ";
$search_query .= " e_level='$by_level'";
$isfirst=1;
}
$result = mysql_query($search_query);
return $result;
}
Dans ce cas, où vous n'utilisez pas la validation, il est recommandé de ne pas utiliser si Field est EMPTY ou NOT. Essayez ci-dessous le code, espérons que cela fonctionnera
function search_donar($_POST) {
$by_name = $_POST['by_name'];
$by_sex = $_POST['by_sex'];
$by_group = $_POST['by_group'];
$by_level = $_POST['by_level'];
$search_query = "SELECT * FROM donar WHERE name LIKE '%$by_name%' AND sex LIKE '%$by_sex%' AND blood_group LIKE '%$by_group%' AND e_level LIKE '%$by_level%' ";
$result = mysql_query($search_query);
return $result;
}