2011-08-16 54 views
1

我是PDO PHP的新手(刚开始今天)。我试图写一个登录函数,但它返回false,即使我知道凭据是正确的。PDO脚本获取行数不工作?

我认为是尝试获取触发脚本的行数量,你能帮忙吗?

function check_login($email, $username, $password) 
{ 
    $host = 'localhost'; 
    $port = 3306; 
    $database = 'example'; 
    $username = 'root'; 
    $password = ''; 

    $dsn = "mysql:host=$host;port=$port;dbname=$database"; 
    $db = new PDO($dsn, $username, $password); 
    $password = md5($password); 

    $statement = $db->prepare("SELECT * FROM users WHERE email = ? or username = ? and password = ?"); 
    $statement->execute(array($email, $username, $password)); 

    while ($result = $statement->fetchObject()) { 
     $sql = "SELECT count(*) FROM users WHERE email = ? or username = ? and password = ?"; 
     $result1 = $db->prepare($sql); 
     $result1->execute(array($email, $username, $password)); 
     $number_of_rows = $result1->fetchColumn(); 
     if ($number_of_rows == 1) 
     { 

      $_SESSION['login'] = true; 
      $_SESSION['uid'] = $result->uid; 
      return TRUE; 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
} 

回答

1
  1. 此:

    WHERE email = ? or username = ? and password = ? 
    

    ...等于此:

    WHERE email = ? or (username = ? and password = ?) 
    

    ...由于operator precedence。这意味着如果您使用电子邮件地址进行验证,则不需要提供有效的密码来登录。

  2. 一旦找出用户是否存在,您将进行第二次查询以计算匹配用户的数量。数据库表不应该能够容纳重复的用户!应该将列usernameemail定义为唯一索引。

  3. 如果要在第一次迭代中使用return,则使用while循环没有意义。它可能工作,但它很混乱。

这应该是足够了:

$statement = $db->prepare('SELECT uid FROM users WHERE (email = ? or username = ?) and password = ?'); 
$statement->execute(array($email, $username, $password)); 

if ($result = $statement->fetchObject()) { 
    $_SESSION['login'] = true; 
    $_SESSION['uid'] = $result->uid; 
    return TRUE; 
}else{ 
    return FALSE; 
} 

编辑: BTW,你不应该采用明文存储密码。无数的网站被黑客入侵,密码被盗。 Google为腌制密码