【问题标题】:Php select * where likephp select * where like
【发布时间】:2013-05-01 16:38:43
【问题描述】:

您好,我正在尝试为网站进行搜索。它有 2 个输入用于获取信息,一个是下拉列表。

<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>

</form>
</div>

我似乎无法弄清楚如何将 2 个输入组合起来给出结果,我可以单独做,但不能一起工作以获得更准确的结果。

php

$keywords = $_POST['keywords'];
$keylocation =$_POST['location'];
$username = $_SESSION['username'];

   //MySQL Database Connect
 include 'connect.php';
 //make sql query

$result = mysqli_query($con,"SELECT * FROM projectitem where description  like '%$keywords%'  or item like '%$keywords%' or location like '%$keywords%'");

提前致谢!

【问题讨论】:

  • 你为什么不在任何地方使用 $keylocation?
  • 如何为 2 个参数选择 * where like:$keywords = $_POST['keywords']; $keylocation =$_POST['location'];
  • 我在您的查询中没有看到$keylocation 的使用;不应该这样做,因为如果不正确转义或使用准备好的语句,这实际上是危险的。
  • 我把它拿出来了,因为它不起作用

标签: php sql search select


【解决方案1】:

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

$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);

【讨论】:

  • 从他的描述看来,他想要AND location[...],因为他希望能够按位置缩小搜索范围。我没有DV。
【解决方案2】:

首先你有 sql 注入

使用mysqli_real_escape_string

如果关键字例如为空,您的查询将是这样的

$result = mysqli_query($con,"SELECT * FROM projectitem where description  like '%%'  or item like '%%' or location like '%$keylocation%'");

description like '%%' 返回所有行!

你必须先检查数据

$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%'";

【讨论】:

    【解决方案3】:

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

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

    我不知道您的确切数据库结构,但假设您正在使用选择文本,您可能想试试这个:

    $query = "SELECT * FROM projectitem WHERE (description LIKE '%$keywords%' OR item LIKE '%$keywords%')";
    

    这是您的基本查询,现在运行它会检查关键字,但不会检查位置。

    if($keylocation != "Any location") $query .= " AND location = '$keylocation'";
    

    最后一行会将位置作为附加过滤器添加到您的查询中。运行它,看看它做了什么。 (我不确定那里的字符串比较)

    是的,作为最后的建议:确保通过转义函数 mysqli_escape_string 运行您的输入。否则,您将面临 SQL 注入。

    【讨论】:

    • @CooPer 在$query 分配中。 WHERE 被过滤器扩展。
    • 如果 $keywordNULL 会发生什么?您的查询将是这样的SELECT * FROM projectitem WHERE (description LIKE '%%' OR item LIKE '%%') AND location = '$keylocation' 它返回所有行!
    • @CooPer 如果关键字为空,则返回所有匹配的结果。就像它应该的那样,除非另有说明。另一种方法是检查关键字字符串的长度,如果它不是至少一个最小数量的字符,则抛出一个错误。另外,在这种情况下,字符串不能为“NULL”......只是空的。
    • 可能关键字为空 AND keylocation 不为空,查询必须返回 keylocation 过滤的数据!你的答案是错误的
    • @CooPer 引用我自己的话:it will return all results, which are matched -> 我的回答没有错。它将根据第一个条件AND 查找所有结果,然后过滤掉那些与该位置不匹配的结果。布尔代数:(x OR Y) AND Z 等于 (X AND Z) OR (Y AND Z)
    猜你喜欢
    • 2015-08-01
    • 2011-04-06
    • 2017-12-07
    • 2011-11-28
    • 2012-08-18
    • 2018-08-24
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多