我的MySQL会话无法启动

时间:2013-09-26 22:55:11

标签: php html mysql

如果$count等于1但是它不等于1,我的MySQL会话将开始 而且我不知道如何修复它,我对php很新,我更喜欢使用sha1 而不是BCrypt

  <?php
     //login form
     mysql_connect("xxxxx","xxxxxx","xxxxxx") or die( mysql_error() );
     mysql_select_db("u940004575_chat");

     $myusername = stripslashes( $myusername );
     $mypassword = stripslashes( $mypassword );
     $sha1mypassword = sha1( $mypassword );
     $myusername = mysql_real_escape_string( $myusername );
     $mypassword = mysql_real_escape_string( $mypassword );
     $sha1mypassword = mysql_real_escape_string( $sha1mypassword );
     $sql = mysql_query("SELECT id FROM users WHERE username='$myusername' and         password='$sha1mypassword'")or die( mysql_error() );
     $result = mysql_query( $sql );

     if ( $sql ) {
         $count = mysql_num_rows( $sql );
     }

     if ( $count == 1 ) {
        session_register("myusername");
        session_register("mypassword"); 
        header("location:home.php");
     } else {
        echo "Wrong Username or Password";
     }
?>

如果有人可以帮助我,那将是非常好的,任何修复都将非常感激。

4 个答案:

答案 0 :(得分:1)

你应该使用PHP的PDO或MySQLi而不是弃用的mysql_ *函数。

注意:使用PHP PDO,您的参数将自动转义。

请参阅:this notice on PHP doc

除非你绝对需要SHA1,否则你首先要寻找用户,然后挑战存储的密码哈希值。由于某些散列算法(如Bcrypt)不能与简单的字符串比较一起使用,因此这样更容易移植。

这让我想到了下一点:不要使用FAST散列算法(SHA,MD5等)进行密码散列。这些散列算法用于快速散列大量数据,这意味着攻击者可以快速生成反向查找表以获取密码等小数据。诸如Bcrypt,Scrypt,pbkdf2等算法是专门的散列算法的好例子,这些算法被设计为更慢或更难以生成查找表。

<?php
    session_start()
    $myusername = 'foo';
    $mypassword = '123';

    try {
       $pdo = new PDO('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE, DB_USERNAME, DB_PASSWORD);
       $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch ( PDOException $e ) {
       die ('ERROR: ' . $e->getMessage() );
    }

    $query = 'SELECT id, password FROM users WHERE username = :username';
    $params = array('username' => $myusername);

    $stmt = $pdo->prepare( $query );
    $stmt->execute( $params );

    // user not found?
    if ( ! $stmt->rowCount() ) {
       die ('unknown user');
    }

    $row = $stmt->fetch( PDO::FETCH_OBJ );

    // challenge password hash
    if ( $row->password == sha1( $mypassword ) ) {
       // success!
       header("location:home.php");
    } else {
       die ('wrong password');
    }

编辑:

同时确保您正在使用session_start()开始会话。这将允许您使用$ _SESSION超全局存储PHP后端的会话变量。

// run login script

$_SESSION['user_id'] = $row->id;

// redirect to an authenticated page

然后在所有经过身份验证的页面上,您可以按ID查询/缓存用户并获取包含所有当前用户数据的用户对象

    session_start()
    // make sure logged in

    if ( ! $_SESSION['user_id'] ) {
       // not logged in
       // redirect to login
       die ('not logged in');
    }       
    $query = 'SELECT * FROM users WHERE id = :id';
    $stmt = $pdo->prepare( $query );
    $stmt->execute( array('id' => $_SESSION['user_id'] ) );

    $user = $stmt->fetch( PDO::FETCH_OBJ );
    print 'Hello, ' . $user->username;

答案 1 :(得分:0)

尝试:

if ( $result ) {
    $count = mysql_num_rows( $result );
}

而不是:

if ( $sql ) {
    $count = mysql_num_rows( $sql );
}

答案 2 :(得分:0)

看,一定是这样:

 $sql = "SELECT id FROM users WHERE username = '$myusername' and password = '$sha1mypassword'";
 // you defined the sql query

 $result = mysql_query( $sql );
 // now you executed it and have the result

 // and you can go on with this result
 if ( $result ) {
     $count = mysql_num_rows( $result );
 }

然后转到mysqli_query(),因为mysql_query()很快就会被弃用。参见官方文档。

答案 3 :(得分:0)

试一试

if ( !$result ) {
   die( mysqli_error() );
} else {
    // check if $result row == 1
    if ( mysqli_num_rows( $result ) == 1 ) {
        // do stuff here
    }
}

如前所述,使用 mysqli _ ,因为 mysql _ 的开发已停止。 Read More