登录 - 对远程mysql数据库的身份验证

时间:2011-11-18 16:50:38

标签: java php android mysql

我这里有这行代码。

我的java代码:

btnLogin.setOnClickListener(new View.OnClickListener() {

     @Override
         $public void onClick(View v) {

        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
        postParameters.add(new BasicNameValuePair("username", txtUsername.getText().toString()));  
        postParameters.add(new BasicNameValuePair("password", txtPassword.getText().toString())); 




    //String valid = "1";  
    String response = null;  
    try {  
    response = CustomHttpClient.executeHttpPost("http://www.sampleweb.com/imba.php", postParameters);  
    String res=response.toString();  
    // res = res.trim();  
    res= res.replaceAll("\\s+","");  
    //error.setText(res);  
    if(res.equals("1")){
    txtError.setText("Correct Username or Password"); 
    //Intent i = new Intent(CDroidMonitoringActivity.this, MenuClass.class);
    //startActivity(i);
    }
    else {
    txtError.setText("Sorry!! Incorrect Username or Password");  
    } 
    } catch (Exception e) { 
    txtUsername.setText(e.toString());  

    }

}
                });
            }

我的php脚本代码:

   <?php
     $un=$_POST['username'];
     $pw=$_POST['password'];

     $user = ‘bduser’;
     $pswd = ‘dbpwd’;
     $db = ‘phplogin’;
     $conn = mysql_connect("localhost","root","");
     mysql_select_db($db, $conn);

     $query = mysql_query("SELECT * FROM user WHERE username = '$un' AND password = '$pw'");
     $result = mysql_query($query) or die("Unable to verify user because : " . mysql_error());

      if(mysql_num_rows($result) == 1)

     echo 1; // for correct login response
     else
     echo 0; // for incorrect login response
      ?>

我的代码有问题。在我的android代码中,当我尝试将res.equals更改为contains时。它总是说正确的密码,但如果我不改变它,它会说错误的密码。我不知道我的java代码或我的PHP代码中有什么问题。真的需要帮助。

3 个答案:

答案 0 :(得分:1)

看起来错误在PHP代码中。

更改以下行: -

发件人:

 $query = mysql_query("SELECT * FROM user WHERE username = '$un' AND password = '$pw'");

$query = "SELECT * FROM user WHERE username = '$un' AND password = '$pw'";

您还应该考虑进行更改以防止SQL注入: -

$query = sprintf("SELECT * FROM user WHERE username = 
    WHERE username='%s' AND password='%s'",
    mysql_real_escape_string($un),
    mysql_real_escape_string($pw));

答案 1 :(得分:0)

将PHP更改为“select count(*)”并检查结果的实际数值。这样你就不会试图与可能抛出行数的可能的NULL进行比较。

另外,请单独检查您的PHP,以确保您从ECHO获得正确的回复。

请注意,您的Android代码会阻塞,直到获得结果。你可能应该在一个线程中重新编码。否则,如果SQL太慢,设备将抛出“无响应”并退出。

编辑:添加一些代码 - 略有不同,它会检查是否设置了特定值而不是是否返回了任何内容。同样的想法,还有几行代码。

/** Authenticate a login.
 *
 * @param string $Username
 * @param string $Password
 * @return int
 */
function login( $Username, $Password )
{
    Logger::DEBUG( "Login attempt by '" . $Username . "'");

    try
    {
        $conn = DBConnection::_getConsole2DB();

        $query = "select LoginId, UserId, RoleId, ProjectMask, RestrictionMask from Users where LoginId = ? and Password = ? and Active = 1";
        $st = $conn->prepare( $query );
        $st->bindParam( 1, $Username );
        $st->bindParam( 2, $Password );
        $st->execute();

        $row = $st->fetch( PDO::FETCH_ASSOC );
                    if( !isset( $row[ 'UserId' ])) return 0;

        $this->userId = $row[ 'UserId' ];
        $this->roleId = $row[ 'RoleId' ];
        $this->projectMask = $row[ 'ProjectMask' ];
        $this->restrictionMask = $row[ 'RestrictionMask' ];         

        $_SESSION[ 'userId' ] = $this->userId;
        $_SESSION[ 'roleId' ] = $this->roleId;
        $_SESSION[ 'projectMask' ] = $this->projectMask;
        $_SESSION[ 'restrictionMask' ] = $this->restrictionMask;
        $_SESSION[ 'loginId' ] = $row[ 'LoginId' ];

    }
    catch( PDOException $e )
    {
        Logger::PDO_ERROR( $e );
        return -1; // error
    }

    return 1; 
}

这使用PDO,因此与您尝试的内容存在一些小的语法差异。

答案 2 :(得分:0)

在代码中你正在做mysql_query(mysql_query())我相信。

首先尝试:

txtError.setText(res);

顺便说一句:SQL注入。如果输入密码:

' UNION SELECT * FROM user WHERE username='admin