Php 多个where的MySQL查询,有些可能是空的
我试图创建一个用户可以输入的查询:名字、姓氏、昵称、等级和性别。但是,其中一些字段可能为空 我知道如何创建一个查询来检查所有这些。但是,如果没有给出,我如何使它不会查询某些内容。例如,用户可能希望按姓氏和性别搜索,但不希望按其他人搜索 我该怎么做呢?非常感谢你的帮助 @Ibu,这就是我目前的情况: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
// 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..