如何正确确定返回的数组是否为false?

时间:2013-04-18 17:32:45

标签: php authentication

我正在尝试在我的网站上构建一个受密码保护的区域。但是,在我的if声明中,我无法确定阵列是否为空。运行代码时,无论放入user / pass字段的内容是什么,它都始终测试为true。作为参考,被访问的数据库只有1行,包含1个用户/通过组合。

function verify(){

  $dbhost = "host";
  $dbname = "db";
  $dbuser = "user";
  $dbpass = "password";


  if (isset($_SESSION['valid_user']))return true;

  $user_name = $_POST["user_name"]; 
  $password = $_POST["password"];

  if ($user_name && $password){ 

    try{ 
      $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    }
    catch(PDOException $pe){
      die('Connection error, because: ' .$pe->getMessage());
    }

    $sql = "SELECT user_name FROM users WHERE user_name = ':user_name' AND password = ':password'";     

    $q = $conn->prepare($sql);

    if(!$q){
      die("Execute query error, because: ". $conn->errorInfo());
    }; 

    $q->execute(array(':user_name'=>$user_name, ':password'=>$password));  

    $result = $q->fetchALL();

    if ($result['user_name']=$user_name){ 
      $valid_user = $user_name;
      $_SESSION['valid_user'] = $valid_user;
      return true;
    }
    else{  
      $text = "User Name and Password did not match";
      write_log_in($text);
    }
  }
  else {  
    $text = "This is a secure server. Please log in.";
    write_log_in($text);
  }
}

作为旁注,我知道我的密码应至少以MD5哈希格式或类似方式存储。我只是想在添加更多东西之前让它工作。

4 个答案:

答案 0 :(得分:2)

这是你的问题

if ($result['user_name']=$user_name){ 

应该是

if ($result['user_name']==$user_name){ 

但是为什么你不检查你是否有结果来确定用户是否正确。因为您在SQL查询中传递了用户。

答案 1 :(得分:1)

缺少等号:

if ($result['user_name'] == $user_name){ 
// ----------------------^

答案 2 :(得分:1)

$result['user_name']=$user_name应为$result['user_name'] === $user_name

另外,请勿使用MD5。使用像hash_pbkdf2这样的缓慢散列函数来散列密码,攻击费用很高。

答案 3 :(得分:-1)

你可以使用:if(mysql_num_rows($ result)== 0)因为如果没有reslut,输入passwd的用户不正确