Php选择*where like

Php选择*where like,php,sql,search,select,Php,Sql,Search,Select,嗨,我正试图得到一个网站的搜索工作。它有两个输入用于接收信息,一个是下拉列表 <div id="search"> <form action="projectsearchall.php" method="post" enctype="multipart/form-data"> <h3>Search for an Item</h3> <p>Keywords</p><p><input name="keyword

嗨,我正试图得到一个网站的搜索工作。它有两个输入用于接收信息,一个是下拉列表

<div id="search">
<form action="projectsearchall.php" method="post" enctype="multipart/form-data">
<h3>Search for an Item</h3>

<p>Keywords</p><p><input name="keywords" type="text" value="keywords"></p>


<p>Select A Location</p><p>

<select name="location" id="jumpMenu">
 <option>Any Location</option>
 <option>Antrim</option>
 <option>Armagh</option>
 <option>Carlow</option>
 <option>Cavan</option>


</select>
</p>
<p>

提前谢谢

您实际上没有使用
$keylocation
的值;要缩小搜索范围,需要使用
而不是

$stmt = mysqli_prepare($con, 'SELECT * FROM projectitem 
    where (description LIKE ? OR item LIKE ?) AND location LIKE ?');

mysqli_stmt_bind_param($stmt, 'sss', "%$keywords%", "%$keywords%", "%$keylocation%");

mysqli_stmt_execute($stmt);

// etc.
更新

由于下拉列表可能有“任意位置”,您需要动态更改查询:

$sql = 'SELECT * FROM projectitem WHERE 1'; // base query

$types = ''; $vars = array();

if (!empty($keywords)) {
    $sql .= ' AND (description LIKE ? OR item LIKE ?)';
    $types .= 'ss';
    $vars[] = "%$keywords%";
    $vars[] = "%$keywords%";
}

if ($keylocation != 'Any Location') {
    $sql .= ' AND location LIKE ?';
    $types .= 's';
    $vars[] = $keylocation;
}

$stmt = mysqli_prepare($con, $sql);
if ($types) {
    mysqli_stmt_bind_param($stmt, $types, $vars);
}
mysqli_stmt_execute($stmt);

我认为在运行查询之前,您可以进行一些预处理

首先,您需要为您的选择选项提供某种类型的值以进行检查

我不知道您的确切数据库结构,但假设您正在使用选定的文本,您可能希望尝试以下方法:

$query = "SELECT * FROM projectitem WHERE (description LIKE '%$keywords%' OR item LIKE '%$keywords%')";
这是您的基本查询,现在运行它将检查关键字,但没有位置

if($keylocation != "Any location") $query .= " AND location = '$keylocation'";
最后一行将把位置作为附加筛选器添加到查询中。运行它,看看它能做什么。(但我不确定那里的字符串比较)


啊,是的,最后一个建议是:确保通过escape函数
mysqli\u escape\u string
运行您的输入。否则,您将向SQL注入敞开大门。

首先,您需要SQL注入

使用
mysqli\u real\u escape\u字符串

例如,如果关键字为null,则查询如下

$result = mysqli_query($con,"SELECT * FROM projectitem where description  like '%%'  or item like '%%' or location like '%$keylocation%'");
和“%”之类的
说明
返回所有行

你必须先检查数据

$query = "SELECT * FROM projectitem where 1=1 "
if($keywords)
  $query .= " AND ( description  like '%$keywords%' AND item like '%$keywords%' )";
if($keylocation)
  $query .= " AND location  like '%$keylocation%'";

你为什么不在任何地方使用$keylocation?我如何选择*where like作为两个参数:$keywords=$\u POST['keywords']$keylocation=$_POST['location'];我没有看到在您的查询中使用
$keylocation
;你不应该这样做,因为如果不正确地避开它或使用预先准备好的语句,这实际上是危险的。我从他的描述中取出了它,因为它不起作用。听起来他想要
和位置[…]
,因为他希望能够按位置缩小搜索范围。我没有在
$query
作业中看到。过滤器将扩展
中的
,如果
$keyword
NULL
,会发生什么情况?您的查询将是这样的
SELECT*FROM projectitem,其中(像“%”这样的描述或像“%”这样的项)和location='$keylocation'
返回所有行@如果关键字为空,它将返回所有匹配的结果。除非另有规定,否则应如此。另一种方法是检查关键字字符串的长度,如果不是最小字符数,则抛出错误。另外,在此上下文中,字符串不能为“NULL”…只能为空。可能关键字为NULL且keylocation不为NULL,查询必须返回按keylocation筛选的数据!你的答案是wrong@CooPer引用我自己的话:
它将返回所有匹配的结果
->我的答案没有错。它将根据第一个标准
查找所有结果,然后过滤掉那些与位置不匹配的结果。布尔代数:(x或Y)和Z等于(x和Z)或(Y和Z)
$result = mysqli_query($con,"SELECT * FROM projectitem where description  like '%%'  or item like '%%' or location like '%$keylocation%'");
$query = "SELECT * FROM projectitem where 1=1 "
if($keywords)
  $query .= " AND ( description  like '%$keywords%' AND item like '%$keywords%' )";
if($keylocation)
  $query .= " AND location  like '%$keylocation%'";