我正在创建一个社交网络。我创建了一个个人资料页面和一个新闻源类型页面,可以将您导航到个人资料页面。
我正在尝试根据您在其他脚本上输入的数据轻松创建唯一的基本配置文件布局。我有一个会话变量($ _SESSION ['id']),我试图抓住它,将用户移动到页面,然后加载与MySQL表中的id匹配的结果。但是,依赖于id的数据似乎不起作用。以下是关键脚本的摘录:
导航菜单到个人资料
<?
function fetch_new_users()
{
$result = mysql_query("SELECT `id`, `username` FROM `users` WHERE username='{$_SESSION['user_login']}'");
$mysql = mysql_fetch_assoc($result);
return $mysql;
}
$users = fetch_new_users();
?>
<?
if (isset($_SESSION["user_login"])) {
echo '
<div class="fnav">
<?php foreach($users as $user): ?>
<p>
<a href="profile.php?id=<?php echo $user[\'id\']; ?>" >Profile</a>
</p>
<?php endforeach; ?>
</div><!-- end fnav -->
登录时创建会话变量
if(isset($_POST["user_login"]) && isset($_POST["password_login"]))
{
$user_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["user_login"]); // filter everything but numbers and letters
$password_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password_login"]); // filter everything but numbers and letters
$md5password_login = md5($password_login);
$sql = mysql_query("SELECT id FROM users WHERE username='$user_login' AND password='$md5password_login' LIMIT 1"); // query the person
//Check for their existance
$userCount = mysql_num_rows($sql); //Count the number of rows returned
if($userCount == 1)
{
while($row = mysql_fetch_array($sql))
{
$id = $row["id"];
}
$_SESSION["id"] = $id;
$_SESSION["user_login"] = $user_login;
$_SESSION["password_login"] = $password_login;
exit("<meta http-equiv=\"refresh\" content=\"0\">");
}
else
{
echo 'That information is incorrect, try again';
exit();
}
实际抓取MySQL表中的数据
$id1 = $_GET['id'];
//check user exists
$check = mysql_query("SELECT * FROM `users` WHERE id='$id1'");
$get = mysql_fetch_assoc($check);
$username = $get['username'];
$firstname = $get['first_name'];
答案 0 :(得分:1)
这里的根本问题是使用/滥用PHP随意跳转到HTML和HTML之间的能力。虽然它被广泛吹捧为一个功能,但对于任何非常重要的事情,它通常会结束,导致服务器端代码,标记和客户端脚本的可怕的意大利面条,所有嵌入和编织在一起。解决方案不以这种方式编写代码。
现在,这很容易说,但是什么意思?这意味着将PHP视为真正的独立语言。它还意味着拥抱HTTP请求周期并预先进行所有数据处理/处理。
因此,当您收到请求时 - 无论是GET还是POST - 而不是立即跳转来编写一些HTML来向用户显示某些内容,请停止。根本不要写任何标记。相反,首先处理请求。
在您的情况下,您希望显示指向用户个人资料页面的链接。这意味着:
你的功能已经准确无误(编辑后更容易阅读(双引号字符串是你的朋友)),所以从这开始:
function fetch_new_users()
{
$result = mysql_query("SELECT `id`, `username` FROM `users` WHERE username={$_SESSION['user_login']");
$mysql = mysql_fetch_assoc($result);
$newresult = $mysql;
return $newresult;
}
$users = fetch_new_users();
现在,不要在那里回复它,而是继续进行您可能需要的任何处理。您已经在$users
变量中获得了函数的结果,因此无需立即吐出。只需处理您的数据并将结果存储在变量中。
当您准备好实际显示信息时,请创建整个模板:
<!doctype html>
<html>
<!-- stuff -->
<body>
<!-- more stuff -->
<?php foreach($users as $user): ?>
<p>
<a href="profile.php?id=<?php echo $user['id']; ?>" >Profile</a>
</p>
<?php endforeach; ?>
</body>
</html>
您的模板(可以是include()
- ed)应该只包含最少的PHP。 echo
,if/else
,while()
,for()
和foreach()
应该是其中包含的限制。处理表单数据,查询数据库或任何其他有趣的东西不是模板的工作。
像这样拆分脚本是关注点分离的一个例子,它基本上说应该根据应用程序将应用程序拆分成组件。所以,就像CSS应该如何与HTML分开(一个是格式而另一个是结构),PHP也应该与HTML分开,除了显示内容。
TLDR:更好地构建您的应用程序,不要遵循任何建议在PHP和HTML之间跳转的资源。你最终只会学习编写PHP应用程序的错误方法。