0

構築しているサイトにレビューを追加しようとしています。レビューの内容が3つのテーブルに分割されているため、1つのレビューに対してデータベースに3つの挿入を実行しようとしています。実行するとページが表示されるので、ほとんどが機能していることがわかりますが、送信ボタンをクリックすると、次のように表示されます。

Syntax error (missing operator) in query expression '3')'' error message. 

問題は次のコード行にあると言っています。

Line 86:         dbInsert.ExecuteNonQuery()

これは私がこのセクションのために持っているコードです:

Dim sql As String = "INSERT INTO MovieReviews (MovieID, MReviewID, ReviewerType, ReviewDate, UserID) "
    sql = sql & " VALUES ('" & movID & "','" & review_id & "','" & 2 & "','" & Date.Now & "'," & uID & "')'"
    Dim sql2 As String = "INSERT INTO MReviewRatings (MReviewID, ValueForMoney, ActingAbility, SpecialEffects, Plot, Total) "
    sql2 = sql2 & " VALUES ('" & movID & "','" & moneyStar(moneyStarRating) & "','" & actingStar(actingStarRating) & "','" & effectsStar(effectStarRating) & "','" & plotStar(plotStarRating) & "','" & totalStar(avg) & "')'"
    Dim sql3 As String = "INSERT INTO MReviewTexts (MReviewID, ReviewText) "
    sql3 = sql3 & " VALUES ('" & review_id & "','" & txtReviewText.Text & "')'"
    dbInsert.CommandText = sql
    dbInsert.CommandType = CommandType.Text
    dbInsert.Connection = aConnection

    dbInsert2.CommandText = sql2
    dbInsert2.CommandType = CommandType.Text
    dbInsert2.Connection = aConnection
    dbInsert3.CommandText = sql3
    dbInsert3.CommandType = CommandType.Text
    dbInsert3.Connection = aConnection
    dbInsert.ExecuteNonQuery()
    dbInsert2.ExecuteNonQuery()
    dbInsert3.ExecuteNonQuery()

何が問題を引き起こしているのかわかりません。レビューをデータベースに挿入する方法を知っている人はいますか?

4

4 に答える 4

1

このようにコードを実装することで、freefallerが指摘したようにSQLインジェクション攻撃にさらされることになります。

クエリをそのように書く方がはるかに良いでしょう:

Dim sql As String = "INSERT INTO MovieReviews (MovieID, MReviewID, ReviewerType, ReviewDate, UserID) " & _
    " VALUES (@movID,@review_id,@reviewerType,@timestamp,@userid)"
dbInsert.CommandText = sql
dbInsert.CommandType = CommandType.Text
dbInsert.Connection = aConnection
dbInsert.Parameters.Add(New SQLParameter("@movID",movID))
dbInsert.Parameters.Add(New SQLParameter("@review_id",review_id ))
dbInsert.Parameters.Add(New SQLParameter("@reviewerType",2))
dbInsert.Parameters.Add(New SQLParameter("@timestamp",Date.Now))
dbInsert.Parameters.Add(New SQLParameter("@userid",uID))
dbInsert.ExecuteNonQuery()

残りのクエリも同様の扱いを受けることができます。この変更により、SQLインジェクション攻撃から保護されるだけでなく、データアクセス層のコードがはるかに管理しやすくなります。

于 2012-12-18T16:54:28.617 に答える
0

この行は、終わり近く(直前uID)に一重引用符がないように見えます:

sql = sql & " VALUES ('" & movID & "','" & review_id & "','" & 2 & "','" & Date.Now & "'," & uID & "')'"

s / b:

sql = sql & " VALUES ('" & movID & "','" & review_id & "','" & 2 & "','" & Date.Now & "','" & uID & "')'"
于 2012-12-18T16:35:00.203 に答える
0

すべてのフィールドがVarcharであると仮定します...

Dim sql As String = "INSERT INTO MovieReviews (MovieID, MReviewID, ReviewerType, ReviewDate, UserID) "
sql = sql & " VALUES ('" & movID & "','" & review_id & "','" & 2 & "','" & Date.Now & "','" & uID & "')"
Dim sql2 As String = "INSERT INTO MReviewRatings (MReviewID, ValueForMoney, ActingAbility, SpecialEffects, Plot, Total) "
sql2 = sql2 & " VALUES ('" & movID & "','" & moneyStar(moneyStarRating) & "','" & actingStar(actingStarRating) & "','" & effectsStar(effectStarRating) & "','" & plotStar(plotStarRating) & "','" & totalStar(avg) & "')"
Dim sql3 As String = "INSERT INTO MReviewTexts (MReviewID, ReviewText) "
sql3 = sql3 & " VALUES ('" & review_id & "','" & txtReviewText.Text & "')"
于 2012-12-18T16:37:35.483 に答える
0

ステートメントの最後に余分な一重引用符があります。

現時点では、文字列は次のようになります...

insert into (x,y,z) values ('a','b','c')'

線の代わりに...

sql = sql & " VALUES ('" & movID .... uID & "')'"

あなたが持っている必要があります(欠落していることに注意してください')...

sql = sql & " VALUES ('" & movID .... uID & "')"

補足として、列が数値ベースの場合、値を一重引用符で囲む必要はありません。

また、ストアドプロシージャを使用して、SQLインジェクション攻撃を防止することも検討する必要があります。

于 2012-12-18T16:38:00.860 に答える