使用变量来引导流量

时间:2013-10-06 22:28:08

标签: php login

我很确定我的错误是没有从表中获取变量。但是,在我要求输入用户名和密码的同时,我无法看到我要求提供的数据错误。该表由[用户名],[密码],[公司]组成。目标是在验证用户名和密码后,根据公司名称对用户进行定向。最后我不断得到回声。

这是代码

   function RegisterUser($usename, $password, $company)
{
   // hash the pwd
   $hpwd = hash('sha256',$password);
   $q ='insert into users values(username, password, company) values(?,?,?)';
   $stmt = PDO::prepare($q);
   $stmt->exectue(array( $username, $hpwd, $company));
}
// validate user and return the company if successfull

function ValidateUser($username, $password, &$company)
{
   $hpwd = hash('sha256',$password);
   $q ='select company from users where username=? AND password=?';
   $stmt = PDO::prepare($q);
   $stmt->exectue(array( $username, $hpwd));
   if( ($company = $stmt->fetch(PDO::FETCH_COLUMN)) === false )
   {
     $company = header( 'Location: login.php' );
   } 

   elseif($company == "monkeynones"){
        header( 'Location: admin1.php' );
        }

2 个答案:

答案 0 :(得分:2)

您的查询错误:

$sql = "SELECT 'password' and 'company' from users where 'username' = '$username';";

应该是

$sql = "SELECT `password`, `company` from `users` where `username` = '$username'";

在标识符周围使用反引号,而不是引号。 and被逗号替换,查询中的尾随分号不是必需的。

答案 1 :(得分:0)

新程序员学会正确地进行用户名/密码身份验证非常重要我觉得有必要写这篇更长的帖子。

首先,正如eicto所指出的那样,mysql扩展已被弃用,甚至不应该被使用。

对金属来说 访问php.net并了解PDO

永远不要存储未编码的密码。

这是你应该做的:

设置PDO:

// you need to store $link somewhere. in a class preferrably
function InitPDO(&$link)
{
   // havet the database handle all strings as UTF-8.
   $options = array('PDO::MYSQL_ATTR_INIT_COMMAND' => 'set names utf8');
   $link = new PDO ( 'mysql:host='.$config['dsn_host'].';dbname='.$config['dsn_db'], $config['username'], $config['password'], $options ) ;

   // If there is an error executing database queries, have PDO to throw an exception.
   $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $link->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

用户注册后。

function RegisterUser($username, $password, $company)
{
   // hash the pwd
   $hpwd = hash('sha256',$password);
   $q ='insert into users values(username, password, company) values(?,?,?)';
   $stmt = $link->prepare($q);
   $stmt->execute(array( $username, $hpwd, $company));
}

//验证用户并在成功时返回公司

function ValidateUser($username, $password, &$company)
{
   $hpwd = hash('sha256',$password);
   $q ='select company from users where username=? AND password=?';
   $stmt = $link->prepare($q);
   $stmt->execute(array( $username, $hpwd));
   if( ($company = $stmt->fetch(PDO::FETCH_COLUMN)) === false )
   {
     $company = 'invalid'; // because user auth failed';
   } 
   //else all is good
}

示例测试用法。

// assumes there is a 'login.php' and a 'invalid.php' file
$link = null;
InitPDO( $link );
RegisterUser('tester','password','login');
VerifyUser('tester','password', $redir );
if( file_exists( $redir . '.php' ) )
{
   header( 'Location: '. $redir . '.php' );
   exit;
}
echo 'error. no valid page found to fullfill query';