如果用户已登录,我想显示用户的全名。如果未登录,则应显示文本"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.phpPDO
-http://www.php.net/manual/en/class.pdo.phpPDO::prepare
-http://www.php.net/manual/en/pdo.prepare.phpPDOStatement
-http://www.php.net/manual/en/class.pdostatement.phpPDOStatement::execute
-http://www.php.net/manual/en/pdostatement.execute.phpPDOStatement::fetchColumn
-http://www.php.net/manual/en/pdostatement.fetchcolumn.phpmysql_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。