vb.net
  • sqlite
  • system.data.sqlite
  • 2010-01-03 40 views 2 likes 
    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(表= images.ext)或一个或多个参数...例如:

    如果用户搜索“汽车电话分机:JPG宽度> 500”的数据库将返回所有具有标签“cars”的图像,具有扩展名jpg并且大于500 px宽度。

    请帮忙D =

    回答

    0

    首先,如果输入来自用户的,不串联那样的字符串,因为它是succeptible到SQL Injection

    使用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 
    
    +0

    如果用户没有输入文件ext会发生什么?我的意思是如果searchExt为空或空? – 2010-01-03 21:22:52

    +0

    @Sein Kraft,我相应地编辑了我的答案 – 2010-01-03 21:26:58

    +0

    谢谢,Sander Rijken。 – 2010-01-03 21:29:43

    1

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

    关于您的具体问题,您应该检查搜索输入,并根据输入生成查询的特定部分,并在必要时对它们进行参数化。例如,如果您必须过滤扩展名,那么您在保持join子句的变量的扩展表中添加一个连接,并在变量的连接表上添加一个过滤器,以保存where子句(as以及适当的参数和参数值)。

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

    +0

    此代码在本地数据库中使用,不在sql服务器中使用。它使用sqlite和用户从他的电脑,而不是从互联网上的图像。 – 2010-01-03 21:16:50

    +1

    @Sein Kraft:使用代码的位置并不重要,如果标记名,排序或顺序参数的任何部分依赖于用户输入(即使在派生的意义上),那么您将受到SQL注入的约束。 – casperOne 2010-01-03 21:20:11

    +0

    连接查询字符串仍然是一个坏习惯。不要这样做,特别是不要代码。 – 2010-01-03 21:21:32

    0

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

    SQLcommand.CommandText = “SELECT图像。* FROM图像JOIN节点ON images.id = nodes.image_id WHERE TAG_ID =(SELECT tags.id FROM标签WHERE标签=“” &标记名&“')AND images.Ext =''& ext &“'AND width>”& width &“ORDER BY images。” &排序&“” &为了&“”

    +0

    与原始问题一样,这使得代码易受SQL注入影响 – 2010-01-03 21:17:51

    +0

    当然,它很容易受到Sql注入的影响。 (a)安全性不是问题的一部分,(b)该操作已经表示它是本地应用程序 – bglenn 2010-01-03 21:20:45

    +0

    @bglenn:作为便笺,您可以使用101010按钮来格式化代码(或缩进4个空格)。 – 2010-01-03 21:22:17

    -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 & "" 
    
    相关问题