0

我很确定我的错误是没有从表中获取变量。但是,在我要求用户名和密码的同时,我看不到我要求该数据的错误。该表由 [用户名]、[密码]、[公司] 组成。目标是在验证用户名和密码后,根据公司名称引导用户。我一直在最后得到回声。

这是代码

   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' );
        }
4

2 回答 2

2

您的查询是错误的:

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

应该

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

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

于 2013-10-06T22:31:44.873 回答
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';
于 2013-10-06T22:44:08.027 回答