【发布时间】:2014-11-13 21:12:01
【问题描述】:
我有以下查询,用于自动完成用户正在搜索的学校名称。如果$query = har
SELECT *,
CASE
WHEN text LIKE '$query' THEN 1
WHEN text LIKE '$query%' THEN 2
WHEN text LIKE '%$query%' THEN 3
end AS priority
FROM (SELECT b.school_name AS `text`,
'school' AS `type`,
b.slug AS `id`,
n.neighbourhood AS 'params'
FROM schools b
LEFT JOIN school_addresses ba
ON ( b.id = ba.school_id )
LEFT JOIN neighbourhoods n
ON ( ba.neighbourhood_id = n.id )
WHERE b.entity_status = 'active'
AND ba.city_id = '$city'
AND b.visibility != 'delisted'
AND (b.school_name LIKE '$query'
OR b.school_name LIKE '$query%'
OR b.school_name LIKE '%$query%')
UNION
SELECT tg.OPTION AS `text`,
'tags' AS `type`,
tg.OPTION AS `id`,
tg.OPTION AS 'params'
FROM tags t
LEFT JOIN tag_options tg
ON ( t.id = tg.tag_id )
WHERE t.tag = 'Cuisines'
AND (tg.OPTION LIKE '$query'
OR tg.OPTION LIKE '$query%'
OR tg.OPTION LIKE '%$query%')
UNION
SELECT category AS `text`,
'category' AS `type`,
category AS `id`,
category AS 'params'
FROM categories
WHERE category LIKE '$query'
OR category LIKE '$query%'
OR category LIKE '%$query%'
UNION
SELECT area AS `text`,
'area' AS `type`,
id AS `id`,
id AS 'params'
FROM areas
WHERE city_id = '$city'
AND (area LIKE '$query'
OR area LIKE '$query%'
OR area LIKE '%$query%')
UNION
SELECT district AS `text`,
'districts' AS `type`,
id AS `id`,
id AS 'params'
FROM districts
WHERE city_id = '$city'
AND (district LIKE '$query'
OR district LIKE '$query%'
OR district LIKE '%$query%')
UNION
SELECT neighbourhood AS `text`,
'neighbourhood' AS `type`,
id AS `id`,
id AS 'params'
FROM neighbourhoods
WHERE city_id = '$city'
AND (neighbourhood LIKE '$query'
OR neighbourhood LIKE '$query%'
OR neighbourhood LIKE '%$query%')
) AS t1
WHERE 1
ORDER BY priority
LIMIT 5
这是它产生的结果
'text' 'type' 'id' 'params' 'priority'
Harvard mba harv-ny-city new york 2
Harcum mba har-pa Pa 2
Harford mba harf-md Maryland 2
我的问题是如何同时使用上述查询中的“学校名称”“文本”和上述查询中的“学校地点”“参数”进行搜索。就像 $query = 'harford ma' 然后它应该产生如下结果:
'text' 'type' 'id' 'params' 'priority'
Harford mba harf-md Maryland 2
Harford mba harv-ny-city new york 2
Harford mba har-pa Pa 2
我几乎整天都在玩这个,没有结果。
Logic-> 这是我网站中的自动搜索功能。用户可以尝试查找这些学校的学校名称或城市。但用户也可以同时搜索两者。例如,在孟买、德里、钦奈有 School iit。用户可以像这样搜索:“iit de”->只要用户输入它,它就会自动完成并在顶部搜索中引入 iit Delhi,然后是其他 iit 位置。总共应该显示 5 个结果。
【问题讨论】:
-
危险!您正在使用用户提供的 $query、$city - 您将获得 sql 注入!如果 $query 是
'; drop table areas; --会发生什么? -
@AMADANONInc。 $query 是用户在搜索栏中输入的内容。这是错误的做法吗?
-
这正是问题所在。如果用户希望搜索
'; drop table areas; --,您的查询会是什么样子?答案:SELECT *, CASE WHEN text LIKE ''; drop table areas; --- 他们刚刚放下了你的桌子。阅读有关 sql 注入攻击的信息。有一些方法可以解决这个问题,但细节因语言而异。简而言之,您不应该只将用户提供的文本放入这样的查询中。 -
@AMADANONInc。 - 谢谢,我会读的。知道如何查询另一部分吗?
-
What happens if $query is '; drop table areas; --抛出异常,注入今天没那么简单)
标签: mysql