0

基本的なデータベース駆動の e コマース サイトを構築する任務があります。ホームページ、製品ページ、注文ページ、注文確認ページ、ショッピング カート ページ、および現在の注文ページの表示があります。このサイトでは、3 つのテーブルを持つ Access データベースを使用しています。

すべての顧客の詳細を含む Customer テーブル (FirstName、LastName、EmailAdd、CardNo、CardEx、SortCode、DeliveryAdd、Postcode)

すべての製品情報 (ProductID、ProductName、Price、ProductType、Images、ProductDescription) を含む Products テーブル。

そして、CustomerID と ProductID を含む Orders テーブル。

顧客が詳細を挿入して送信ボタンを押すと、顧客テーブルに新しいレコードが挿入されるように、注文ページに INSERT ステートメントを作成しようとしています。また、これにより、注文テーブルにエントリが作成され、クライアントが注文の詳細を表示する注文確認ページにリダイレクトされます。

注文フォームで送信ボタンがクリックされたときに実行されるコードは次のとおりです。

編集アポストロフィが欠落しているエラーを修正しました。アクセスデータベースは一度に2つを処理できないと言われたので、2つのSQLコマンドを使用して挿入しようとしています。それでもエラーが発生します。

  Protected Sub btnAddRecord_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim strFirstName As String
    Dim strLastName As String
    Dim strEmailAdd As String
    Dim intCardNo As String
    Dim strCardEx As String
    Dim intSortCode As String
    Dim strDeliveryAdd As String
    Dim strPostCode As String
    Dim intProductID As Integer
    strFirstName = tbxFirstName.Text
    strLastName = tbxLastName.Text
    strEmailAdd = tbxEmailAdd.Text
    intCardNo = tbxCardNo.Text
    strCardEx = tbxCardEx.Text
    intSortCode = tbxSortCode.Text
    strDeliveryAdd = tbxDeliveryAdd.Text
    strPostCode = tbxPostcode.Text
    intProductID = ddlProduct.SelectedValue
    
    Dim strDatabaseNameAndLocation As String
    strDatabaseNameAndLocation = Server.MapPath("KingToots.mdb")
    Dim strSQLCommand As String
    strSQLCommand = "INSERT INTO Customer(FirstName, LastName, EmailAdd, CardNo, CardEx, SortCode, DeliveryAdd, Postcode) " & _
        "Values ('" & strFirstName & "', '" & strLastName & "', '" & strEmailAdd & "', '" & intCardNo & "', '" & strCardEx & "', '" & intSortCode & "', '" & strDeliveryAdd & "', '" & strPostCode & "');"
    Dim objOleDbConnection As System.Data.OleDb.OleDbConnection
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    Dim objOleDbCommand As System.Data.OleDb.OleDbCommand
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    objOleDbCommand.ExecuteNonQuery()
    objOleDbConnection.Close()
    strSQLCommand = "INSERT INTO Orders(ProductID) " & "Values ('" & intProductID & "');"
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    objOleDbCommand.ExecuteNonQuery()
    objOleDbConnection.Close()
    strSQLCommand = "SELECT Customer.* FROM Customer ORDER BY Customer.CustomerID DESC;"
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    Dim objOleDbDataReader As System.Data.OleDb.OleDbDataReader
    objOleDbDataReader = objOleDbCommand.ExecuteReader()
    Dim datDataTable As System.Data.DataTable
    datDataTable = New System.Data.DataTable()
    datDataTable.Load(objOleDbDataReader)
    objOleDbConnection.Close()
    tbxFirstName.Text = ""
    tbxLastName.Text = ""
    tbxEmailAdd.Text = ""    
    tbxCardNo.Text = ""
    tbxCardEx.Text = ""
    tbxSortCode.Text = ""
    tbxDeliveryAdd.Text = ""
    tbxPostcode.Text = ""

End Sub
4

2 に答える 2

1

この行の最後に閉じ引用符がありません:

strSQLCommand = "INSERT INTO Customer(FirstName, LastName, EmailAdd, CardNo, CardEx, SortCode, DeliveryAdd, Postcode) " & _
    "Values ('" & strFirstName & "', '" & strLastName & "', '" & strEmailAdd & "', '" & intCardNo & "', '" & strCardEx & "', '" & intSortCode & "', '" & strDeliveryAdd & "', '" & strPostCode & ");"

明らかな SQL インジェクションの問題については、パラメーターに切り替えるのが最善の方法です (そうすると、元の問題が発生することはありません。パラメーターは引用符を使用しません)。 O'Neilという顧客を獲得した場合にプログラムが停止'''ないようにします。

于 2012-05-04T17:40:54.487 に答える
0

彼は正しいです、あなたはこれをしたくありません.SQLインジェクションを取得します. とにかく、ここにあなたの問題の解決策があります。

問題は最後の sql ステートメントではなく、前の sql ステートメントにあります。

'" & strPostCode & " に最後の一重引用符がありません。

それは読むべきです:

'" & strPostCode & "');

于 2012-05-04T17:46:56.497 に答える