1
Dim conntps As MySqlConnection
Dim myconnstringtps As String
conntps = New MySqlConnection()
Dim mycommand As New MySqlCommand
Dim Updatepayments As String = "update payments set payments.payorname='" & _
    epayorname.Text & "', payments.cardnumber='" & eccnumber.Text & _
    "', payments.bankname='" & ebankname.Text & "', payments.checkaccountnumber='" & _
    eaccountnumber.Text & "', payments.checkroutingnumber='" & _
    erouting.Text & "', payments.cardexpirationdate='" & eexpmonth.Text & "/" & _
    eexpireyear.Text & "', payments.cardexpirationmonth='" & _
    eexpmonth.Text & "', payments.cardexpirationyear='" & eexpireyear.Text & _
    "', payments.cardaddress='" & eaddy.Text & "', payments.cardzipcode='" & _
    ezip.Text & "', payments.threedigitnumber='" & ecvv.Text & _
    "' where payments.filenumber='" & TextBox1.Text & "' and paymentstatus='PENDING';"
myconnstringtps = "server=localhost; user id=root; " & _
                  "password=1C0cac0la; database=collectionsmax"
Try
    conntps.Open()
    Try
        mycommand.Connection = conntps
        mycommand.CommandText = Updatepayments
        mycommand.ExecuteNonQuery()
        conntps.Close()
        mycommand.Dispose()
    Catch myerror As MySqlException
        MsgBox("error connecting:" & myerror.Message)
    End Try
Catch myerror As MySqlException
    MsgBox("error connecting:" & myerror.Message)
Finally
    If conntps.State <> ConnectionState.Closed Then conntps.Close()
    MsgBox("Successfully Changed")
End Try

コードを実行しようとしても、エラーや例外は発生しません。

生成された更新クエリをテキスト ボックスに出力し、mysql 管理スタジオを介してコードを実行しようとしましたが、完全に機能します。そのため、実際のクエリがサーバーに送信されることに問題はないと確信しています。

これとほぼ同じコードを使用して、問題なくステートメントに挿入しました。

上記のコードを使用して VB.net アプリケーションでコードを実行すると、データベースが更新されません。

4

3 に答える 3

1

コマンド パラメータを使用します。これにより、より安全 ( SQL インジェクション) になり、処理が容易になります。

Dim Updatepayments As String = "UPDATE payments SET payments.payorname=@1, " & _
    "payments.cardnumber=@2, ..." & _
    "WHERE payments.filenumber=@11 AND paymentstatus='PENDING';"

mycommand.Parameters.AddWithValue("@1", epayorname.Text);
mycommand.Parameters.AddWithValue("@2", eccnumber.Text);
...

SQL-Server のようにパラメーター名を使用することもでき@epayornameますが、一部の接続タイプ (ODBC など) では位置パラメーターしか使用できません。

于 2012-12-18T22:29:27.620 に答える
1

MySqlConnection で接続文字列を設定しない

myconnstringtps = "server=localhost; user id=root; password=1C0cac0la;......"
conntps = New MySqlConnection(myconnstringtps)

それとは別に、パラメーター化されたクエリを使用して、文字列内の一重引用符の問題とSQL インジェクション攻撃のセキュリティ問題を回避する必要があります

Dim Updatepayments As String = "update payments " & _
    "set payments.payorname=@name," & _
    "payments.cardnumber=@cnum," & _
    "payments.bankname=@bank," & _
    "payments.checkaccountnumber=@actnum," & _
    "payments.checkroutingnumber=@routing," & _
    "payments.cardexpirationdate=@monthyear," & _
    "payments.cardexpirationmonth=@month," & _
    "payments.cardexpirationyear=@year," & _
    "payments.cardaddress=@address," & _
    "payments.cardzipcode=@zip," & _
    "payments.threedigitnumber=@digits " & _
    "where payments.filenumber=@file and paymentstatus='PENDING'"

Dim mycommand As New MySqlCommand(Updatepayments, conntps)
mycommand.Parameters.AddWithValue("@name", epayorname.Text)
mycommand.Parameters.AddWithValue("@cnum", eccnumber.Text)
mycommand.Parameters.AddWithValue("@bank", ebankname.Text)
mycommand.Parameters.AddWithValue("@actnum", eaccountnumber.Text);
mycommand.Parameters.AddWithValue("@routing", erouting.Text)
mycommand.Parameters.AddWithValue("@monthyear", eexpmonth.Text & "/" &  eexpireyear.Text)
mycommand.Parameters.AddWithValue("@month", eexpmonth.Text)
mycommand.Parameters.AddWithValue("@year", eexpireyear.Text)
mycommand.Parameters.AddWithValue("@address", eaddy.Text)
mycommand.Parameters.AddWithValue("@zip", ezip.Text)
mycommand.Parameters.AddWithValue("@digits", ecvv.Text)
mycommand.Parameters.AddWithValue("@file", TextBox1.Text)

その他の問題点: フィールドがすべて文字列型であると確信していますか? すべてのフィールドに文字列を渡し、値を一重引用符で囲みます。フィールドのいずれかが文字列型でない場合、これは失敗する可能性があります。(特にこれらのフィールドは、文字列型のpayment.cardnumber、payments.checkaccountnumber、payments.cardexpirationmonth、payments.cardexpirationyear、payments.threedigitnumber ではない可能性があります)

于 2012-12-18T22:18:56.637 に答える
0

赤警告ここでクレジットカード情報を扱っているのは明らかですが、あなた自身と顧客を SQL インジェクション攻撃に対して無防備な状態にしています!

また、公共のインターネットに投稿したコードにパスワードが含まれています。

(そしてスティーブは正しい答えを持っているようです。)

于 2012-12-18T22:22:16.800 に答える