vb.net
  • sqlite
  • system.data.sqlite
  • 2010-01-03 41 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 & "" 
    
    相關問題