如何在表格中搜索和显示两个或多个值的行

时间:2018-11-26 02:16:29

标签: php sql

我在sql数据库中有一个表,如下所示

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-0lax">Date</th>
    <th class="tg-0lax">Time<br></th>
    <th class="tg-0lax">Title</th>
    <th class="tg-0lax">Contact<br></th>
  </tr>
  <tr>
    <td class="tg-0lax">2017</td>
    <td class="tg-0lax">5:45</td>
    <td class="tg-0lax">The Study of Galaxy and star formation</td>
    <td class="tg-0lax">NA</td>
  </tr>
  <tr>
    <td class="tg-0lax">2018</td>
    <td class="tg-0lax">5:00</td>
    <td class="tg-0lax">Study Properties of Magnetic Properties of Earth Poles</td>
    <td class="tg-0lax">NA</td>
  </tr>
  <tr>
    <td class="tg-0lax">2019</td>
    <td class="tg-0lax">6:00</td>
    <td class="tg-0lax">Solar Radiation and Global Temperature Rate</td>
    <td class="tg-0lax">NA</td>
  </tr>
  <tr>
    <td class="tg-0lax">2020</td>
    <td class="tg-0lax">6:12</td>
    <td class="tg-0lax">Medical Science and advance Laser Technology</td>
    <td class="tg-0lax">NA</td>
  </tr>
</table>

我正在使用如下所示的sql搜索通配符来返回并显示包含来自搜索栏的任何单个值的行,如下所示

$query = "select Date,Time,Title,Contact from book_info where  Title like '%$search%'

工作正常。但是,当用户在搜索栏中输入两个或多个关键字(例如Galaxy star)时,如果用户键入 科学激光,然后应显示最后一行。

我该怎么做。

非常感谢您的帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您希望接受用户输入的内容并检查包含所有单词的书籍,其顺序与用户写的顺序相同,请用%替换空格(伪代码;我不使用php):

$search = replace($search, " ", "%")

这将运行以下查询:

WHERE title like '%science%laser%'

这不会找到一本叫做《激光:科学突破》的书


如果要返回与所有单词匹配的所有结果,则必须将字符串拆分为单个单词,并在AND中添加多个子句,这样最终得到的查询如下:

SELECT whatever
FROM books
WHERE 1=1
  AND title like '%science%'
  AND title like '%laser%'

这将找到一本名为“医学先进激光技术”的书,并且会发现一本名为“激光:科学突破”的书

我建议在查询中放入1 = 1,因为它没有用,但使查询更易于构建。这是一个伪代码:

words = stringsplit(search, " ")
sql = "select whatever from books where 1=1 "
param = 1
for each(word in words){
  sql = sql + "and title like @p$param"
  parameters.add("@p$param", "%$word%")
  param = param +1
}
database.query(sql,parameters)

这将产生语法上正确的sql,而没有任何复杂的“如果是第一个单词,则不要将and放在其中……”

最后,请阅读http://bobby-tables.com-我在上面构建sql搜索命令的方式绝对应该是将用户提供的值包含到sql字符串中时采用的方法。

简单地接受他们给您的内容并将其放入sql中会给您的应用程序带来巨大的安全漏洞,并使最终用户几乎完全控制您的数据库。在任何情况下,请勿在实践中这样做。上面的代码指示了如何使用循环:

Add a named parameter to a database query string
Give the parameter a value 
Run the query with the parameters

它是伪代码,代表一个概念。如果您不知道如何用您选择的编程语言来参数化数据库查询,而鲍比表却没有告诉您(也许有示例),那么您进行的下一个Google搜索应该是“我如何参数化一个中的sql查询,永远不要编写另一个未参数化的查询