使用PHP/MySQL进行搜索筛选
我正在尝试在我的献血者应用程序中创建搜索/筛选选项。捐献者可以通过性别,姓名,血型或全部三种方式进行搜索。这里是我的代码使用PHP/MySQL进行搜索筛选
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;
}
这里是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>
单过滤功能非常精细。但要过滤所有我使用的AND,但它给了我错误。谁能帮忙?
预先感谢
像所有其他职位,你将需要附加所有的条件与像这样。迄今为止,这是最清洁的答案。请记住要使用mysqli OOP方式而不是旧的mysql来真正地逃脱你的字符串。只是一个建议。
下面是一个典型查询的例子。
正确的方法:
SELECT * FROM donar WHERE name='dxenaretionx' AND sex='M';
你正在做它的方式
SELECT * FROM donar WHERE name='dxenaretionx' sex='M';
代码:
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;
}
我在stackoverflow上看到的最好和明确的答案之一。非常感谢@Rejinderi。 –
谢谢@LaurenceNicolaou您对我的日子的评论:D – Rejinderi
下面的代码片断:
$search_query = "SELECT * FROM donar WHERE";
if($by_name !="") {
$search_query .= " name='$by_name'";
}
if($by_sex !="") {
$search_query .= " sex='$by_sex'";
}
产生查询,如
SELECT * FROM donar WHERE name='nowak' sex='m'
,因为在条款之间没有逻辑运算符,它是无效的。你需要添加一个'AND'。为了简化代码,你可以在形式产生条件“真正的A和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'";
}
...
尝试这样的:
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;
}
有没有问题查询条件。在这里您的查询将会像 select * from donar where by_name = "A" by_group = "N"
那里有And/Or
,以使条件适当。请尝试下面给出的代码。
$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;
}
在这里,代码首先,我们需要$query_cond
变空,并根据代码作出条件。据此管理AND
运营商。并在最后如果我们发现$query_cond
不空,然后将其添加到$select_query
。
我希望这会对你有所帮助。
感谢
在这个地方,你不使用验证,它recomended不使用字段是否为空。尝试下面的代码,希望它会工作
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;
}
什么错误它给你......? – Menztrual
请至少使用'mysql_real_escape_string($ _ POST ['by_name'])在数据库中搜索时跳过您的数据;'强烈建议使用mysqli_ *或PDO代替mysql_ * –
什么是您的问题中的$ donar变量? –