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

login-funktion


puttewickstrom

Rekommendera Poster

puttewickstrom

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]

Länk till kommentar
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.

 

Länk till kommentar
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;

}

 

Länk till kommentar
Dela på andra webbplatser

puttewickstrom

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!

 

Länk till kommentar
Dela på andra webbplatser

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

 

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

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...