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);
7 Réponses :
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);
Vous avez une faute de frappe dans la dernière instance de variable $ sql code>. Vous avez écrit
$ SQ code>. J'ai essayé d'éditer mais je ne pouvais pas (6 lettres min.)
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.
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);
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;)
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> 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) );
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.
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.
J'ai pensé à deux autres moyens de résoudre ce problème: Cela reviendra des résultats uniquement pour ce ceci vous donnera toutes les lignes pour ce user_id code>, où le champ d'emplacement contient
$ value1 code>. si $ valeur1 est vide strud>, cela retournera toujours toutes les lignes de ce
user_id code>, vierge ou non.
p>
ou strud> user_id code> qui ont
$ value1 < / code> pour l'emplacement ou avoir des valeurs vides. p> p>
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 ( Voici un exemple en utilisant des déclarations préparées MySQLI (en supposant $ MySQLI est un objet MySQLI déjà instancié): p> (je suppose que 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 et le comparer contre 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: p> Notez que avec PDO nommé Paramètres, nous pouvons vous référer à où champ1 = champ1 code> retourne toujours
vrai code>). Si le paramètre n'est pas vide / null / zéro, la valeur de champ est comparée au paramètre. P>
valse2 code> est une chaîne basée sur le nom du champ, malgré le manque de guillemets dans l'exemple de SQL de OP.) P>
$ value1 code> deux fois. L'avantage que MySQLI a dans ce cas est la typage explicite du paramètre - si nous passons dans
Value1 code> en tant que chaîne, nous savons que nous devons le comparer à la chaîne vide
'' code>. Si
Value1 code> était une valeur entière, nous pourrions expliquer explicitement que, comme: P>
0 code> à la place. P>
: emplacement_id code> plusieurs fois dans la requête tout en suffoçant de le lier une fois. P> p>
Vérifiez si
$ value1 code> est vide et ne pas ajouter
et emplacement = '$ valeur1' code> pour interroger. BTW n'utilise pas
mysql _ * code> depuis son dépréciation