Just nu i M3-nätverket
Gå till innehåll
puttewickstrom

login-funktion

Rekommendera Poster

Jag har problem med koden nedan. Den rödmarkerade raden i koden ger felet: System.NullReferenceException: Objektreferensen har inte angetts till en instans av ett objekt. Hur löser jag detta?

 

<%@ Import NameSpace="System.Data" %>
<%@ Import NameSpace="System.Data.SqlClient" %>
<%@ Page Language="C#" debug="true" %>
<html>
 <body>
   <h1>Login</h1>
   <hr>
   <form runat="server">
  <table cellpadding="8">
   <tr>
     <td>
       User Name:
     </td>
     <td>
       <asp:TextBox ID="UserName" RunAt="server" />
     </td>
   </tr>
   <tr>
     <td>
       Password:
     </td>
     <td>
       <asp:TextBox ID="Password" RunAt="server" />
     </td>
   </tr>
   <tr>
     <td>
      <asp:Button Text="Submit" OnClick="OnSubmit" RunAt="server" />
     </td>
     <td>
       <asp:CheckBox Text="Remember me" ID="RememberMe" RunAt="server" />
     </td>
   </tr>
 </table>
</form>
   <hr>
   <h3><asp:Label ID="Output" RunAt="server" /></h3>
 </body>
</html>

<script language="C#" runat="server">

void OnSubmit(Object sender, EventArgs e){
if(authentCheck() > 0){
	FormsAuthentication.SetAuthCookie(UserName.Text, false);
	Response.Redirect("secret/inloggad.aspx");
}
else{
	Response.Redirect("loginpage3.aspx?error=true");
}
}

int authentCheck(){
string connectionString = "Server=localhost;Database=XX;uid=XX;pwd=XX;;";
SqlConnection objConn = new SqlConnection(connectionString);

string queryString = "SELECT * FROM users WHERE username = '" + UserName.Text + "' AND password = '" + Password.Text + "'";
SqlCommand sqlCommand = new SqlCommand(queryString, objConn);

objConn.Open();
[color="#ff0000"]	Int32 count = (Int32)sqlCommand.ExecuteScalar();[/color]

objConn.Close();

return count;
}

</script>

[inlägget ändrat 2009-01-08 13:12:17 av puttewickstrom]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Username och password är väl reserverade ord i din databas (ms)?

 

Testa:

"SELECT * FROM users WHERE [username] = '" + UserName.Text.Replace("'", "''") + "' AND [password] = '" + Password.Text.Replace("'", "''") + "'";

 

Och din sql-sats nu är väldigt öppen för s.k. sql injections, därav min replace av enkelfnuttar.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Hmm, kollade igenom igen och en anledning till att du får null är väl att du får ett tomt resultat från frågan. ExecuteScalar returnerar ju första kolumnen i första raden utifrån frågan. Och det returneras som ett objekt så om den inte hittar användaren så returneras således null. Du döper variabeln till "count". Vet inte varför du gör detta för ofta är första kolumnen id:t.

 

Gör en check på objektet du får tillbaka.

 

object obj = sqlCommand.ExecuteScalar();

if (obj == null)

{

// hittade inte användaren

}

else

{

// record found, do proper casting like:

int userID = (int)obj;

}

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag tackar så mycket för detta!

Scriptet du förmedlade funkade inte "out of the box", kommer inte ihåg vilket felmeddelande jag fick, men det gav mig väldigt god ledning!

 

int check = 0;

object obj = sqlCommand.ExecuteScalar();

 

if (obj == null){

check = 0;

}

else{

check = 1;

}

 

return check;

 

hade nog funkat med en bool också. Tack så mycket för hjälpen!

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Om du vill kan du skriva om din kod till endast en rad:

 

return (sqlCommand.ExecuteScalar() != null) ? 1 : 0;

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...