IF语句的行为未达到预期


IF statement not behaving as expected

如果用户已登录,我想显示用户的全名。如果未登录,则应显示文本"Login"。

这就是我目前所拥有的:

session_start();
$session = $_SESSION['username'];
include "config.php";
$sql = mysql_query("SELECT * from user");    
while($d=mysql_fetch_array($sql))
{
    if($d['status']=='online' and $_SESSION['username'] == $d['username'])
    {
        $full_names = $d['full_name'];
        echo $full_names;
    }
    else
    {
        echo "Login";
    }
}

有什么想法吗?

您应该使用SQL WHERE(正如@ThiefMaster所提到的),但只是为了回答您的问题:

$full_names = false;
while($d=mysql_fetch_array($sql)) {
    if($d['status']=='online' and $_SESSION['username'] == $d['username']) {
        $full_names = $d['full_name'];
        echo $full_names;
    }
}
if(!$full_names) {
  echo "Login";
}

您可能需要存储id,而不是将用户名称存储在会话中。这并不像在查询中使用WHERE语句将结果限制在一行(有问题的用户)那么重要。这一点很重要,因为随着用户数据库规模的增长,该查询的效率会越来越低。通过一点简单的逻辑,您可以防止未来出现问题,并在平衡中拥有一个更健壮的体系结构。

另一个重要的注意事项是,mysql_*函数正在被弃用,您不应该使用它们再怎么强调也不为过,你需要开始使用PDO。这并不难理解(不再让mysql_*发挥作用!),您还不如现在就开始使用它——很快,mysql_*就根本不可用了。你的代码将停止工作,或者你将被困在一个充满已知安全漏洞的旧PHP版本上。

在引用$_SESSION中的密钥之前,应该进行检查以确保其存在。

session_start();
$session_identifier = isset($_SESSION['username']) ? $_SESSION['username'] : false;
$user_name = false;
if ($session_identifier) {
    $pdo = new PDO("mysql:host=localhost;dbname=database", '-username-', '-password-');
    $sql = '
        SELECT 
            full_name 
        FROM 
            users 
        WHERE 
            username = ":username"
    ';
    $statement = $pdo->prepare($sql);
    if($statement->execute(array(':username'=>$session_identifier)))
        $user_name = $statement->fetchColumn();
}

然后你可以这样做:

if ($user_name)
    print 'Welcome, '.$user_name;
else
    print '<a href="login.php">Login</a>';

文档

  • isset-http://php.net/manual/en/function.isset.php
  • PDO-http://www.php.net/manual/en/class.pdo.php
  • PDO::prepare-http://www.php.net/manual/en/pdo.prepare.php
  • PDOStatement-http://www.php.net/manual/en/class.pdostatement.php
  • PDOStatement::execute-http://www.php.net/manual/en/pdostatement.execute.php
  • PDOStatement::fetchColumn-http://www.php.net/manual/en/pdostatement.fetchcolumn.php
  • mysql_query已弃用-http://php.net/manual/en/function.mysql-query.php
  • mySQL SELECT(请参阅WHERE部分)-http://dev.mysql.com/doc/refman/5.0/en/select.html

您应该将查询更改为:

"SELECT * from user WHERE status = 'online' AND username = '" . mysql_real_escape_string($_SESSION['username']) . "'"

那么你就不需要where循环了。

您还应该使用mysqli而不是mysql。