7
votes

Possibilité d'avoir une requête PHP MySQL Ignorer la variable vide dans la clause WHERE?

Je ne sais pas comment je peux faire cela. Fondamentalement, j'ai des variables remplacées avec une combinaison de ComboBox, puis transmises pour former les filtres pour une requête MQSQL via la clause WHERE. Ce que je dois faire, c'est permettre à la liste déroulante de rester vide par l'utilisateur, puis de cette variable ignorée dans la clause WHERE. Est-ce possible?

I.E., À partir de ce code. Supposons que la combinaison qui remplit $ Value1 est laissée vide est vide, existe-t-il un moyen de l'avoir ignoré et seul le 2e filtre appliqué. P>

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 ";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);


1 commentaires

Vérifiez si $ value1 est vide et ne pas ajouter et emplacement = '$ valeur1' pour interroger. BTW n'utilise pas mysql _ * depuis son dépréciation


7 Réponses :


0
votes

Bien sûr,

$sql = "";
if(!empty($value1))
  $sql = "AND location = '{$value1}' ";
if(!empty($value2))
  $sql .= "AND english_name = '{$value2}'";

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' {$sql} ";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);


1 commentaires

Vous avez une faute de frappe dans la dernière instance de variable $ sql . Vous avez écrit $ SQ . J'ai essayé d'éditer mais je ne pouvais pas (6 lettres min.)



0
votes
if ( isset($value1) )
 $query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 ";
else
 $query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND english_name = $value2 ";   
But, you can also make a function to return the query based on the inputs you have. 
And also don't forget to escape your $values before generating the query.

0 commentaires

17
votes

Utilisez

$where = "WHERE user_id = '$username'";

if(!empty($value1)){
$where .= "and location = '$value1'";
}

if(!empty($value2 )){
$where .= "and english_name= '$value2 '";
}


$query = "SELECT * FROM moth_sightings $where";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);


2 commentaires

excuses. N'a pas cliqué sur ça exprès. Cela ne me laissera pas voter depuis que je suis un nouvel utilisateur, mais cela était extrêmement utile. Encore une fois, je m'excuse pour le vote accidentel.


Je ne sais pas qui l'a fait, mais n'a pas voté à nouveau, changez également le lieu où dans l'IF dans et, et laissez l'espace après «$ valeur1», sinon cela ne fonctionnera pas;)



0
votes

1.) N'utilisez pas l'extension PHP simplement MySQL, utilisez l'extension Advanced MySQLI ou les emballages de PDO / MDB2 beaucoup plus sûrs.

2.) Ne spécifiez pas la déclaration complète comme celle-là (en dehors de cela, vous n'avez même pas d'encoder et d'échapper aux valeurs données ...). Utilisez plutôt quelque chose comme ceci: p> xxx pré>

puis remplissez cette requête brute à l'aide d'une matrice contenant toutes les valeurs que vous recevez réellement de votre formulaire: p>

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", 
        implode(' AND ', $clause) );


0 commentaires

0
votes

Premier, veuillez lire sur injections SQL . Deuxièmement, $ R = mysql_numrows ($ résultat) devrait être $ R = mysql_num_rows ($ Résultat);

Vous pouvez utiliser si dans MySQL, quelque chose comme ceci: p>

SELECT * FROM moth_sightings WHERE user_id = '$username' AND IF('$value1'!='',location = '$value1',1) AND IF('$value2'!='',english_name = '$value2',1); -- BUT PLEASE READ ABOUT SQL Injections. Your code is not safe.


2 commentaires

Merci, je suis au courant des injections SQL. Ceci est juste pour m'aider à apprendre avant que je reçois cela.


bien. J'espère que les IFS dans MySQL vous aideront avec votre préoccupation. La syntaxe pour if est si (condition, [si true], [si faux]). Dans [si faux], j'ai placé «1» pour simplement retourner vrai de sorte que cela n'affecterait pas les autres conditions.



0
votes

J'ai pensé à deux autres moyens de résoudre ce problème: xxx

Cela reviendra des résultats uniquement pour ce user_id , où le champ d'emplacement contient $ value1 . si $ valeur1 est vide , cela retournera toujours toutes les lignes de ce user_id , vierge ou non.


ou xxx

ceci vous donnera toutes les lignes pour ce user_id qui ont $ value1 < / code> pour l'emplacement ou avoir des valeurs vides.


0 commentaires

5
votes

Plusieurs autres réponses mentionnent le risque d'injection SQL et un couple mentionnent explicitement à l'aide de déclarations préparées, mais aucun d'entre eux ne montre explicitement comment vous pourriez le faire, ce qui pourrait être une grande demande à un débutant.

My actuel préféré. La méthode de résolution de ce problème utilise une instruction MySQL "si" pour vérifier si le paramètre en question est null / vide / 0 (selon le type). S'il est vide, il compare la valeur de champ contre elle-même ( où champ1 = champ1 retourne toujours vrai ). Si le paramètre n'est pas vide / null / zéro, la valeur de champ est comparée au paramètre.

Voici un exemple en utilisant des déclarations préparées MySQLI (en supposant $ MySQLI est un objet MySQLI déjà instancié): xxx

(je suppose que valse2 est une chaîne basée sur le nom du champ, malgré le manque de guillemets dans l'exemple de SQL de OP.)

Il n'y a aucun moyen dans MySQLI de lier le même paramètre à plusieurs espaces réservés dans l'état, nous devons donc lier explicitement $ value1 deux fois. L'avantage que MySQLI a dans ce cas est la typage explicite du paramètre - si nous passons dans Value1 en tant que chaîne, nous savons que nous devons le comparer à la chaîne vide '' . Si Value1 était une valeur entière, nous pourrions expliquer explicitement que, comme: xxx

et le comparer contre 0 à la place.

Voici un exemple de PDO à l'aide de paramètres nommés, car je pense qu'ils aboutissent à un code beaucoup plus lisible avec moins de comptage: xxx

Notez que avec PDO nommé Paramètres, nous pouvons vous référer à : emplacement_id plusieurs fois dans la requête tout en suffoçant de le lier une fois.


0 commentaires