2

Dreamweaver CS5 を使用して、正常に動作する次のサーバー動作を追加しました。

MM_rsUser1 を閉じる必要がありますか?

自動生成されたコードは MM_rsUser を閉じますが、MM_rsUser が閉じられる前後の行で MM_rsUser1 を閉じようとすると、ページが失敗します。

MySql のこの参照を見つけましたが、これは「必要」ではない可能性があることを示しているようですが、これは私の最初のプロジェクトであるため、できるだけ多くの「良い習慣」を学ぼうとしています...そして、Dreamweaver は多くのVB コード、それが私にとって何をするのかが、今日のベスト プラクティスであると「仮定」したくはありません。(このプロジェクトは、動的データを追加し、そのデータを既存のクラシック ASP サイトに編集しています...私の次のプロジェクトでは、MVC/C# にアップグレードします)

<%
' *** Validate request to log in to this site.
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString <> "" Then MM_LoginAction = MM_LoginAction + "?" + Server.HTMLEncode(Request.QueryString)
MM_valUsername = CStr(Request.Form("userid"))
If MM_valUsername <> "" Then
  Dim MM_fldUserAuthorization
  Dim MM_redirectLoginSuccess
  Dim MM_redirectLoginFailed
  Dim MM_loginSQL
  Dim MM_rsUser
  Dim MM_rsUser_cmd
  Dim MM_loginUpdate ' used to execute timestamp to log last successful login for user
  Dim MM_rsUser1 '     also used to execute timestamp as above

  MM_fldUserAuthorization = "accessLevel"
  MM_redirectLoginSuccess = "/sql.asp"
  MM_redirectLoginFailed = "/login.asp"

  MM_loginSQL = "SELECT email, password"
  If MM_fldUserAuthorization <> "" Then MM_loginSQL = MM_loginSQL & "," & MM_fldUserAuthorization
  MM_loginSQL = MM_loginSQL & " FROM table WHERE userid = ? AND pword = ?"
  Set MM_rsUser_cmd = Server.CreateObject ("ADODB.Command")
  MM_rsUser_cmd.ActiveConnection = MM_SQL_STRING
  MM_rsUser_cmd.CommandText = MM_loginSQL
  MM_rsUser_cmd.Parameters.Append MM_rsUser_cmd.CreateParameter("param1", 202, 1, 50, MM_valUsername) ' adVarWChar
  MM_rsUser_cmd.Parameters.Append MM_rsUser_cmd.CreateParameter("param2", 202, 1, 50, Request.Form("password")) ' adVarWChar
  MM_rsUser_cmd.Prepared = true
  Set MM_rsUser = MM_rsUser_cmd.Execute

  If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then 
    ' username and password match - this is a valid user
    Session("MM_Username") = MM_valUsername
    MM_loginUpdate = "UPDATE table SET lastLoggedIn = { fn NOW() } WHERE userid = '" & MM_valUsername & "'"
    MM_rsUser_cmd.CommandText = MM_loginUpdate
    Set MM_rsUser1 = MM_rsUser_cmd.Execute ' unsure if I have to write an MM_rsUser1.Close somewhere or not, but page fails where I've tried
    If (MM_fldUserAuthorization <> "") Then
      Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)
    Else
      Session("MM_UserAuthorization") = ""
    End If
    if CStr(Request.QueryString("accessdenied")) <> "" And true Then
      MM_redirectLoginSuccess = Request.QueryString("accessdenied")
    End If
    MM_rsUser.Close
    Response.Redirect(MM_redirectLoginSuccess)
  End If
  MM_rsUser.Close
  Response.Redirect(MM_redirectLoginFailed)
End If
%>
4

1 に答える 1

0

一見すると、コードは少し注意が必要です。MM_rsUserを閉じる2つのステートメントが表示されます。Response.Redirect()はreturnステートメントのように機能するため、IFブロックが他のように見える傾向がある場合でも、どちらか一方のみが実行されます。MM_rsUser1は、開かれたことがないため、IFブロックに入らないと、閉じることができないことが重要だと思います。だから私はこれを提案します:

    If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then 
        ' username and password match - this is a valid user
        Session("MM_Username") = MM_valUsername
        MM_loginUpdate = "UPDATE table SET lastLoggedIn = '" & NOW() & "' WHERE userid = '" & MM_valUsername & "'"
        MM_rsUser_cmd.CommandText = MM_loginUpdate
        Set MM_rsUser1 = MM_rsUser_cmd.Execute ' unsure if I have to write an MM_rsUser1.Close somewhere or not, but page fails where I've tried
        If (MM_fldUserAuthorization <> "") Then
            Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)
        Else
            Session("MM_UserAuthorization") = ""
        End If
        if CStr(Request.QueryString("accessdenied")) <> "" And true Then
            MM_redirectLoginSuccess = Request.QueryString("accessdenied")
        End If
        MM_rsUser1.Close 'close it here
        MM_rsUser.Close
        Response.Redirect(MM_redirectLoginSuccess)
    End If 'Not MM_rsUser.EOF Or Not MM_rsUser.BOF 
    'not open, so don't close it
    MM_rsUser.Close
    Response.Redirect(MM_redirectLoginFailed)
End If 'MM_valUsername <> "" 

アップデート

MM_rsUser_cmdを再利用することは、せいぜい混乱を招き、いくつかのエラーの原因となる可能性があります。変化する

MM_rsUser_cmd.CommandText = MM_loginUpdate
Set MM_rsUser1 = MM_rsUser_cmd.Execute

Dim MM_rsUser_cmd1 
Set MM_rsUser_cmd1 = Server.CreateObject ("ADODB.Command")
MM_rsUser_cmd1.ActiveConnection = MM_SQL_STRING
MM_rsUser_cmd1.CommandText = MM_loginUpdate
MM_rsUser_cmd1.Parameters.Append MM_rsUser_cmd1.CreateParameter("param1", 135, 1, -1, NOW()) ' adDBTimeStamp 
MM_rsUser_cmd1.Parameters.Append MM_rsUser_cmd1.CreateParameter("param2", 202, 1, 50, MM_valUsername) ' adVarWChar
MM_rsUser_cmd1.Prepared = true
Set MM_rsUser1 = MM_rsUser_cmd1.Execute
于 2012-05-10T16:03:17.623 に答える