Php 多个where的MySQL查询,有些可能是空的

Php 多个where的MySQL查询,有些可能是空的,php,mysql,sql,database,Php,Mysql,Sql,Database,我试图创建一个用户可以输入的查询:名字、姓氏、昵称、等级和性别。但是,其中一些字段可能为空 我知道如何创建一个查询来检查所有这些。但是,如果没有给出,我如何使它不会查询某些内容。例如,用户可能希望按姓氏和性别搜索,但不希望按其他人搜索 我该怎么做呢?非常感谢你的帮助 @Ibu,这就是我目前的情况: // Now we need to query the database for these terms $sql_query = "SELECT * FROM `students` WHERE `f

我试图创建一个用户可以输入的查询:名字、姓氏、昵称、等级和性别。但是,其中一些字段可能为空

我知道如何创建一个查询来检查所有这些。但是,如果没有给出,我如何使它不会查询某些内容。例如,用户可能希望按姓氏和性别搜索,但不希望按其他人搜索

我该怎么做呢?非常感谢你的帮助

@Ibu,这就是我目前的情况:

// Now we need to query the database for these terms
$sql_query = "SELECT * FROM `students` WHERE `first_name` = '" . $first_name . "' AND `last_name` = '" . $last_name . "' AND `nick_name` = '" . $nick_name . "' AND `grade` = '" . $grade . "' AND `gender` = '" . $gender . "'";
$result = mysql_query($sql_query);

// Let's check to make sure there is an actual result
$num_rows = mysql_num_rows($result);

if($num_rows < 1) {
    echo 'No student was found using that criteria.';
}

if($num_rows >= 1) {
    echo '<p>' . $num_rows . ' result(s) found. Below are the results:</p>';
    echo '<br />';
}

while($row = mysql_fetch_array($result)) {
    echo '
        <table border="1" width="400">
        <tr>
            <td colspan="2" align="center">Student Profile - ' . $row['last_name'] . ', ' . $row['first_name'] . '</td>
        </tr>
        <tr>
            <td>First Name: </td>
            <td>' . $row['first_name'] . '</td>
        </tr>
        <tr>
            <td>Last Name: </td>
            <td>' . $row['last_name'] . '</td>
        </tr>
        <tr>
            <td>Nick Name: </td>
            <td>' . $row['nick_name'] . '</td>
        </tr>
        <tr>
            <td>Grade: </td>
            <td>' . $row['grade'] . '</td>
        </tr>
        <tr>
            <td>Gender: </td>
            <td>' . $row['gender'] . '</td>
        </tr>
        </table> <br /><br />';

}
//现在我们需要在数据库中查询这些术语
$sql\u query=“从'students'中选择*,其中'first\u name`='$名字。“'和'姓'='”$姓。“'和'nick_name`='”$尼克的名字。“'和'grade`='”$等级“'和`性别`='”$性别。"'";
$result=mysql\u查询($sql\u查询);
//让我们检查一下,以确保有一个实际的结果
$num\u rows=mysql\u num\u rows($result);
如果($num_行<1){
echo“没有发现使用该标准的学生。”;
}
如果($num_rows>=1){
已找到回显“”.$num_rows.”结果。以下是结果:

; 回声“
”; } while($row=mysql\u fetch\u数组($result)){ 回声' 学生档案-'.$row['last_name'.','.$row['first_name'.' 名字: “.$row['first_name']” 姓氏: “.$row[“姓氏”]” 昵称: “.$row['nick_name']” 等级: “.$row['grade']” 性别: “.$行[“性别”]。”

; }
只需检查
$\u POST
变量,并在此基础上构建查询

例如,像这样(这很糟糕,因为它没有对注射用的
$\u POST
进行消毒,但这是一个好的开始):


然后只需将
$where
变量附加到查询的末尾

Erland Sommarskog实际上是这个问题的源代码:

我将以如下格式编写每个参数化的

...AND ((@Param IS NULL)  OR (@Param = your_column))

您可能需要动态地构建SQL查询。阅读盖尔·肖的博客文章

等等,但有转义输入

1=1是为了避免检查是否需要添加“where”关键字,我通常更喜欢通过动态构建where子句来创建“clean”查询。 如果您正确地清理了
$\u POST
中的数据,并将其复制到
$data
中,并且
$data
中的键以用于筛选的字段命名:

$sql = "SELECT ..fields.. FROM ..table..";
$search_enabled_fields = array('firstname', 'lastname', 'email', /* ..etc.. */);
$conditions = array();
foreach ($search_enabled_fields as $field) {
  if (!empty($data[$field])) { // isset and not an empty string
    $value = $data[$field];
    // maybe you could sanitize $value here if you didn't before..
    $conditions[] = "$field = '$value'";
  }
}
if (count($conditions) > 0) {
  $sql .= " WHERE ". implode(' AND ', $conditions);
}
// now, execute your $sql query..

通过改进这种逻辑,您还可以轻松地为每个字段实现不同的筛选类型(例如开始、包含、类似于…),并为大多数类型的搜索构建优化查询。

向我们展示您迄今为止的查询,您现在的查询不会得到任何结果(如果有任何结果留空)@Neal,是的,我知道,这就是为什么我要问在这里做什么:)这极易发生sql注入+1@Joe有趣的是,每当有关于这个话题的重复问题时,你都会发布Gail Shaw和我发布Erland Sommarskog(两者都很棒)@Matthew PK:我们都有自己的最爱。:-)我同意两者都很优秀。事实上,盖尔在她的帖子中引用了厄兰的作品。我想我更喜欢盖尔的,因为它更简洁,更容易理解。Erland的穷举性,有时可能会让人筋疲力尽。而且Erland不必费心实现web布局。最佳选择-尽管很流行将某种动态SQL语句拼凑在一起,可能使用“1=1”以避免必须决定在何处插入“and”子句。这显式地、完整地声明了预期的查询。@le dorfier但是,它可能会降低执行速度,具体取决于您如何设置RDBMS@Joe的链接对于构建动态SQL(不会缓存计划)也很有用。还有一个更简洁的版本
(@Param=your_column)不是FALSE
@Andrew Lazarus,但是如果
@Param为NULL
,那么它在所有方面都会失败。。。我从来没见过像你写的那样。
$query = "select * from somewhere where 1 = 1";
if(isset($_POST['something'])){
  $query .= " and something = '{$_POST['something']}'";
}
if(isset($_POST['something_else'])){
  $query .= " and something_else = '{$_POST['something_else']}'";
}
$sql = "SELECT ..fields.. FROM ..table..";
$search_enabled_fields = array('firstname', 'lastname', 'email', /* ..etc.. */);
$conditions = array();
foreach ($search_enabled_fields as $field) {
  if (!empty($data[$field])) { // isset and not an empty string
    $value = $data[$field];
    // maybe you could sanitize $value here if you didn't before..
    $conditions[] = "$field = '$value'";
  }
}
if (count($conditions) > 0) {
  $sql .= " WHERE ". implode(' AND ', $conditions);
}
// now, execute your $sql query..