2

我正在使用 sqlite 在 vb.net 上的数据库中工作,该数据库托管了一个画廊,我想扩展搜索属性。

这是实际的查询字符串:

"SELECT images.*
FROM images 
JOIN nodes 
ON images.id = nodes.image_id 
WHERE tag_id = (SELECT tags.id 
                FROM tags 
                WHERE tag = '" & tagname & "') 
ORDER BY images." & sort & " " & order & ""

但它只能搜索一个描述性标签(标签名)并对图像进行排序,仅此而已。

我还想过滤图像 ext (table = images.ext) 或一个或多个参数的结果...例如:

如果用户搜索“cars ext:jpg width>500”,数据库将返回所有带有标签“cars”、扩展名为 jpg 且宽度大于 500 像素的图像。

4

4 回答 4

1

首先,这段代码很危险。它对SQL 注入攻击开放。您不应该只是将这样的字符串值附加到查询字符串中。相反,您应该使用参数化查询。

关于您的具体问题,您应该检查搜索的输入,并根据输入生成查询的特定部分,并在必要时对其进行参数化。

例如,如果您必须过滤扩展,那么您可以在包含 join 子句的变量中添加一个连接到扩展表,以及在包含 where 子句的变量中的连接表上添加一个过滤器(以及适当的参数和参数值)。

然后,最后,将查询的各个部分(连同查询参数)连接在一起并执行它。

于 2010-01-03T21:15:41.143 回答
0

如果我正确理解了这个问题,您只想构建一个查询字符串。你有没有尝试过这样的事情?

SQLcommand.CommandText = "SELECT images.* FROM images JOIN nodes ON images.id = nodes.image_id WHERE tag_id = (SELECT tags.id FROM tags WHERE tag = '" & tagname & "') AND images.Ext = '" & ext & "' AND width > " & width & " ORDER BY images." & 排序 & ””

于 2010-01-03T21:16:52.857 回答
0

首先,如果输入来自用户,不要像这样连接字符串,因为它很容易被SQL 注入

使用 SQL 参数是一种避免注入的方法:

command.CommandText = "SELECT images.* " &_
                      "FROM images " &_
                      "JOIN nodes " &_
                      "ON images.id = nodes.image_id " &_
                      "WHERE tag_id = (SELECT tags.id " &_
                                      "FROM tags " &_
                                      "WHERE tag = @tag)"

您可以将其扩展到:

command.CommandText = "SELECT images.* " &_
                      "FROM images " &_
                      "JOIN nodes " &_
                      "ON images.id = nodes.image_id " &_
                      "WHERE tag_id = (SELECT tags.id " &_
                                      "FROM tags " &_
                                      "WHERE tag = @tag)"

command.Parameters.AddWithValue("@tag", searchTag)


If Not String.IsNullOrEmpty(searchExt) Then
    command.CommandText = command.CommandText & " AND images.ext = @imageExt"
    command.Parameters.AddWithValue("@imageExt", searchExt)
EndIf

If Not String.IsNullOrEmpty(searchWidth) Then
    command.CommandText = command.CommandText & " AND images.width > @imageWidth"
    command.Parameters.AddWithValue("@imageWidth", searchWidth)
EndIf
于 2010-01-03T21:20:08.057 回答
-2

单独构建 WHERE 子句,并将其添加到您的查询中。

where="1"
if tagname<>"" then where=where & " AND tag='" & tagname & "'"
...
"SELECT images.*
FROM images 
JOIN nodes 
ON images.id = nodes.image_id 
WHERE tag_id = (SELECT tags.id 
                FROM tags 
                WHERE " & where & " ) 
ORDER BY images." & sort & " " & order & ""
于 2010-01-03T21:21:10.353 回答