none
Wechseln von PHP auf Asp.Net VB RRS feed

  • Frage

  • Hallo, 

    ich versuche mich derzeit von PHP auf ASP.NET VB zu migrieren. Allerdings habe ich noch folgende Problem im Bereich MySQL. 

    Kann mir einer sagen wie ich am einfachsten dieses PHP Skript auf ASP.NET in VB übersetzen kann? Und hat jemand einen Vorschlag wie ich am einfachsten einen INSERT Befehl dann ausführen kann?

    if(isset($_POST['s_email']) and isset($_POST['s_pass'])) {
        if($_POST['s_email'] != "" and $_POST['s_pass'] != "") {
            $pass = md5($_POST['s_pass']);
            $email = $_POST['s_email'];
            
            $result = $sql->query("SELECT * FROM `members` WHERE email='$email'");
            $row_cnt = $result->num_rows;
            if($row_cnt != 0) {
                $row = $result->fetch_array(MYSQLI_ASSOC);
                if($pass == $row['password']){
                    $_SESSION['istEingeloggt'] = true ;
                    $_SESSION['cid'] = $row['Cid'];
                    header("Location: /members");
                } else {
                    $errmsg = '<div class="alert alert-danger">Sie haben ein falsches Passwort eingegeben</div>' ;
                }
            } else {
                $errmsg = '<div class="alert alert-danger">Ihre Email Adresse wurde nicht gefunden. Haben sie sich schon <a href="/registrieren">registriert</a>?</div>';
            } 
        } else {
            $errmsg = '<div class="alert alert-danger">Bitte f&uuml;llen sie alle Felder aus!</div>';
        }
    }

    Also in diesem Script Frage ich einmal ob, ob die Anzahl der Rows ungleich NULL ist. Und das 2te was ich noch nicht in ASP.NET VB verstehe ist, wie ich hier wie in PHP einfach die Variable $row erzeugen kann?

    Mit freundlichen Gruß


    Daniel Elskamp


    Montag, 20. Februar 2017 08:42

Antworten

  • Hallo Daniel,

    das sch;ne am .NET ist, dass vieles unabhängig vom genauen Framework funktioniert. Für MySQL brauchst du zunächst den passenden Connector, wie MySQL es nennt. Den kannst du entweder über NuGet oder hier bekommen.

    Anschließend kannst du eine Verbindung aufbauen, dein Query ausführen und ggf. mit Hilfe eines Readers die Daten erfassen. My SQL hat dazu auch offizielle Beispiele, siehe hier. Die sind zwar nur in C#, aber in meiner Signatur ist ein Converter verlinkt mit dem du das in VB.NET umsetzen kannst.
    Ich kann dir nur dazu raten die Beispiele durchzuarbeiten, da mein eigenes Wissen zu MySQL für .NET auch sehr beschränkt ist.

    Unter .NET solltest du für deine Queries unbedingt Parameter nutzen. Ich weiß nicht ob es etwas derartiges in PHP gibt, aber mit deinem bisherigen PHP Code ist SQL Injection IMO ein leichtes Spiel für den Angreifer.

    Und das 2te was ich noch nicht in ASP.NET VB verstehe ist, wie ich hier wie in PHP einfach die Variable $row erzeugen kann?
    Mit Hilfe von Dim.

    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Montag, 20. Februar 2017 12:52
  • Hallo Daniel,

    über reader.GetString( "NameDerSpalte" ) kannst Du den Wert als String auslesen. Es gibt noch weitere Methode wie GetInt32, GetDecimal, usw. Siehe dazu:

      MySqlDataReader Class

    in deinem Fall also bspw.:

    lblErrMsg.Text = "Hallo" + reader.GetString( "username" )

    Aber bitte arbeite zum einen nicht mit *, sondern mit expliziter Angabe aller auszulesenden Spaltennamen und zum anderen mit Parameter Objekten. Ein Beispiel findest Du hier:

      Parameterized Query for MySQL


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 20. Februar 2017 14:49
    Moderator
  • Hallo Daniel,

    nuja, was will uns die Meldung "Connection must be valid and open" wohl sagen?

    Dass Du die Verbindung (in deinem Fall "conn") nicht schließen solltest, wenn Du noch ein Command abfeuern willst.

    Lass conn.Close und conn.Open an der Stelle weg und schreib folgendes ans Ende deiner Methode:

    conn.Close()
    conn.Dispose()

    Alternativ nutze das Using Statement für die Connection.

      https://msdn.microsoft.com/de-de/library/htd05whh.aspx

    ---

    Und nochmal: Verwende Parameter!

    ---

    BTW: Verwende doch bitte einen anderen Anbieter für die Screenshots. Der gewählte ist ja übersät mit komisch anmutendem Javascript.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Montag, 20. Februar 2017 15:39
    Moderator
  • Hallo Daniel,

    auch hier ist die Fehlermeldung doch eindeutig.

    Du hast auf derselben Connection noch einen geöffneten DataReader. Der nutzt die Verbindung exklusiv und man kann keine weiteren Aktionen mit dieser Verbindung durchführen. Siehe dazu u.a.:

      https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

    While the SqlDataReader is being used, the associated SqlConnection is busy serving the SqlDataReader, and no other operations can be performed on the SqlConnection other than closing it. This is the case until the Close method of the SqlDataReader is called. For example, you cannot retrieve output parameters until after you call Close.

    Mitunter ein Grund, warum ich so gut wie nie mit DataReader, sondern eher mit DataAdapter und Co. arbeite.

    D.h. entweder schließt Du den DataReader vor der Ausführung des ExecuteNonQuery oder Du baust dir eine zweite Connection auf, mit der Du das INSERT Statement ausführen kannst.

    P.S.: Den zweiten DataReader brauchst Du gar nicht, was willst Du mit dem? (Also Zeile 23). Die kannst Du ersatzlos streichen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 21. Februar 2017 14:46
    Moderator

Alle Antworten

  • Hallo Daniel,

    das sch;ne am .NET ist, dass vieles unabhängig vom genauen Framework funktioniert. Für MySQL brauchst du zunächst den passenden Connector, wie MySQL es nennt. Den kannst du entweder über NuGet oder hier bekommen.

    Anschließend kannst du eine Verbindung aufbauen, dein Query ausführen und ggf. mit Hilfe eines Readers die Daten erfassen. My SQL hat dazu auch offizielle Beispiele, siehe hier. Die sind zwar nur in C#, aber in meiner Signatur ist ein Converter verlinkt mit dem du das in VB.NET umsetzen kannst.
    Ich kann dir nur dazu raten die Beispiele durchzuarbeiten, da mein eigenes Wissen zu MySQL für .NET auch sehr beschränkt ist.

    Unter .NET solltest du für deine Queries unbedingt Parameter nutzen. Ich weiß nicht ob es etwas derartiges in PHP gibt, aber mit deinem bisherigen PHP Code ist SQL Injection IMO ein leichtes Spiel für den Angreifer.

    Und das 2te was ich noch nicht in ASP.NET VB verstehe ist, wie ich hier wie in PHP einfach die Variable $row erzeugen kann?
    Mit Hilfe von Dim.

    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Montag, 20. Februar 2017 12:52
  • Hallo Tom,

    danke sehr für deine Antwort. Ich hätte vorab schonmal sagen sollen, das ich denn Connector bereits habe und auch ein kleines Script habe. 

    Protected Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
            Dim query As String = "SELECT * FROM users WHERE email='" + txtEmail.Text + "'"
            Dim conn As New MySqlConnection(ConfigurationManager.ConnectionStrings("mysqlConn").ConnectionString)
            Dim cmd As New MySqlCommand(query, conn)
            conn.Open()
    
            Dim reader As MySqlDataReader = cmd.ExecuteReader
    
            If (reader.HasRows = True) Then
                While reader.Read()
                    lblErrMsg.Text = "Hallo" + USERNAME
                End While
            Else
                lblErrMsg.Text = "Es wurde kein Benutzer gefunden"
            End If
        End Sub
    Also mehr bekomme ich aber auch nicht hin. In der While Schleife habe ich nun versucht irgendswie den Username auszulesen aus der Datenbank, was ich mit PHP in der Variable $row gemacht hätte.... 

    Wie man in der Hinsicht Variabeln erstellt wusste ich. Aber ich meinte damit wie das so hinbekomme mit dem MySQlReader, das sie so gefüllt ist wie in der $row Variable.

    Mit freundlichen Gruß


    Daniel Elskamp


    Montag, 20. Februar 2017 13:37
  • Hallo Daniel,

    über reader.GetString( "NameDerSpalte" ) kannst Du den Wert als String auslesen. Es gibt noch weitere Methode wie GetInt32, GetDecimal, usw. Siehe dazu:

      MySqlDataReader Class

    in deinem Fall also bspw.:

    lblErrMsg.Text = "Hallo" + reader.GetString( "username" )

    Aber bitte arbeite zum einen nicht mit *, sondern mit expliziter Angabe aller auszulesenden Spaltennamen und zum anderen mit Parameter Objekten. Ein Beispiel findest Du hier:

      Parameterized Query for MySQL


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 20. Februar 2017 14:49
    Moderator
  • Hallo Stefan, 

    vielen Dank auch für deine Antwort. Das war genau das was ich meinte. Jetzt habe ich meine Simple Login Funktion fertig. Aller Dings habe ich nun das Problem bei der Kombination von SELECT und INSERT......

    Protected Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click
            Dim username As String = txtUsername2.Text.Trim
            Dim email As String = txtEmail2.Text
            Dim password As String = MD5StringHash(txtPassword2.Text)
            Dim passwordC As String = MD5StringHash(txtPasswordConfirm2.Text)
    
            If (password = passwordC) Then
                Dim conn As New MySqlConnection(ConfigurationManager.ConnectionStrings("mysqlConn").ConnectionString)
                conn.Open()
                Dim query As String = "SELECT * FROM users WHERE email='" + txtEmail2.Text + "'"
                Dim cmd As New MySqlCommand(query, conn)
    
                Dim reader As MySqlDataReader = cmd.ExecuteReader
    
                If (reader.HasRows = False) Then
                    Try
                        conn.Close()
                        query = "INSERT INTO users (Username, Password, Email) VALUES ('" + username + "','" + password + "','" + email + "')"
                        cmd.ExecuteNonQuery()
                        conn.Open()
                        reader = cmd.ExecuteReader
                    Catch ex As MySqlException
                        lblErrMsg2.Text = ex.ToString
                    End Try
                Else
                    lblErrMsg2.Text = "Sry, aber die Email Adresse wurde bereits registriert. Hast du vielleicht einfach dein Passwort vergessen?"
                End If
            End If
        End Sub

    Also ich möchte gerne das er beim registrieren überprüft ob die Email Adresse vorhanden ist, wenn nicht soll er dann denn INSERT Befehl ausführen.

    Ich bekomme folgende Fehlermeldung -> http://prntscr.com/eb5a5p

    Hast du vielleicht eine Lösung?


    Daniel Elskamp

    Montag, 20. Februar 2017 15:27
  • Hallo Daniel,

    nuja, was will uns die Meldung "Connection must be valid and open" wohl sagen?

    Dass Du die Verbindung (in deinem Fall "conn") nicht schließen solltest, wenn Du noch ein Command abfeuern willst.

    Lass conn.Close und conn.Open an der Stelle weg und schreib folgendes ans Ende deiner Methode:

    conn.Close()
    conn.Dispose()

    Alternativ nutze das Using Statement für die Connection.

      https://msdn.microsoft.com/de-de/library/htd05whh.aspx

    ---

    Und nochmal: Verwende Parameter!

    ---

    BTW: Verwende doch bitte einen anderen Anbieter für die Screenshots. Der gewählte ist ja übersät mit komisch anmutendem Javascript.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Montag, 20. Februar 2017 15:39
    Moderator
  • Hallo Stefan,

    allerdings habe ich nun eine Neue Fehlermeldung..... 

    Protected Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click
            Dim username As String = txtUsername2.Text.Trim
            Dim email As String = txtEmail2.Text
            Dim password As String = MD5StringHash(txtPassword2.Text)
            Dim passwordC As String = MD5StringHash(txtPasswordConfirm2.Text)
    
            If (password = passwordC) Then
                Dim conn As New MySqlConnection(ConfigurationManager.ConnectionStrings("mysqlConn").ConnectionString)
                conn.Open()
                Dim query As String = "SELECT Username, Password, Email FROM users WHERE email='" + txtEmail2.Text + "'"
                Dim cmd As New MySqlCommand(query, conn)
    
                Dim reader As MySqlDataReader = cmd.ExecuteReader
    
                If (reader.HasRows = False) Then
                    Try
                        query = "INSERT INTO users (Username, Password, Email) VALUES ('" + username + "','" + password + "','" + email + "')"
                        cmd.ExecuteNonQuery()
                        reader = cmd.ExecuteReader
                    Catch ex As MySqlException
                        lblErrMsg2.Text = ex.ToString
                    End Try
                Else
                    lblErrMsg2.Text = "Sry, aber die Email Adresse wurde bereits registriert. Hast du vielleicht einfach dein Passwort vergessen?"
                End If
            End If
        End Sub
    Hier nun die neue Fehlermeldung! -> http://prntscr.com/ebiss9


    Daniel Elskamp

    Dienstag, 21. Februar 2017 12:09
  • Hallo Daniel,

    Fehlermeldungen bitte immer exakt und vollständig als Text posten. Vielen Dank.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 21. Februar 2017 14:02
    Moderator
  • Hallo Stefan,

    Entschuldige! Ich habe nun die vollständige Fehlermeldung aus dem Browser!

    http://prntscr.com/ebkda1


    Daniel Elskamp

    Dienstag, 21. Februar 2017 14:10
  • Hallo Daniel,

    bitte als Text, nicht als Bild.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 21. Februar 2017 14:15
    Moderator
  • Hallo Stefan,

    Pardon. 

    Ausnahmedetails: MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.

    Quelle:

    Zeile 20:             If (reader.HasRows = False) Then
    Zeile 21:                 query = "INSERT INTO users (Username, Password, Email) VALUES ('" + username + "','" + password + "','" + email + "')"
    Zeile 22:                 cmd.ExecuteNonQuery()
    Zeile 23:                 reader = cmd.ExecuteReader
    Zeile 24:             Else

    Stapelüberwachung!

    
    [MySqlException (0x80004005): There is already an open DataReader associated with this Connection which must be closed first.]
       MySql.Data.MySqlClient.ExceptionInterceptor.Throw(Exception exception) +160
       MySql.Data.MySqlClient.MySqlCommand.CheckState() +372
       MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +188
       MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +142
       register.btnRegister_Click(Object sender, EventArgs e) in C:\inetpub\wwwroot\test.xfreshdx.net\register.aspx.vb:22
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +11802193
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +150
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1735
     
    


    Daniel Elskamp

    Dienstag, 21. Februar 2017 14:23
  • Hallo Daniel,

    auch hier ist die Fehlermeldung doch eindeutig.

    Du hast auf derselben Connection noch einen geöffneten DataReader. Der nutzt die Verbindung exklusiv und man kann keine weiteren Aktionen mit dieser Verbindung durchführen. Siehe dazu u.a.:

      https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

    While the SqlDataReader is being used, the associated SqlConnection is busy serving the SqlDataReader, and no other operations can be performed on the SqlConnection other than closing it. This is the case until the Close method of the SqlDataReader is called. For example, you cannot retrieve output parameters until after you call Close.

    Mitunter ein Grund, warum ich so gut wie nie mit DataReader, sondern eher mit DataAdapter und Co. arbeite.

    D.h. entweder schließt Du den DataReader vor der Ausführung des ExecuteNonQuery oder Du baust dir eine zweite Connection auf, mit der Du das INSERT Statement ausführen kannst.

    P.S.: Den zweiten DataReader brauchst Du gar nicht, was willst Du mit dem? (Also Zeile 23). Die kannst Du ersatzlos streichen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 21. Februar 2017 14:46
    Moderator