我在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)时,如果用户键入 科学激光,然后应显示最后一行。
我该怎么做。
非常感谢您的帮助。
谢谢。
答案 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查询,永远不要编写另一个未参数化的查询