0

我正在创建一个社交网络。我创建了一个个人资料页面和一个新闻源类型的页面,可将您导航到个人资料页面。

我正在尝试根据您在另一个脚本中输入的数据轻松创建独特的基本配置文件布局。我有一个会话变量($_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'];    
4

1 回答 1

1

这里的根本问题是使用/滥用 PHP 在自身和 HTML 之间随意跳转的能力。虽然它被广泛吹捧为一项功能,但对于任何不平凡的事情,它通常会导致服务器端代码、标记和客户端脚本的可怕意大利面条,所有这些都嵌入并相互交织在一起。解决方案不是那样编写代码。

现在,这很容易说,但这意味着什么?这意味着将 PHP 视为真正的独立语言。这也意味着拥抱 HTTP 请求周期并预先完成所有数据处理/处理。

因此,当您收到一个请求(GET 或 POST)时,不要马上跳起来编写一些 HTML 来向用户展示一些东西,而是停下来。根本不要写任何标记。相反,首先处理请求。

在您的情况下,您希望显示指向用户个人资料页面的链接。这意味着:

  1. 确定用户是谁
  2. 根据该信息生成正确的链接

你已经对你的函数有了正确的认识(编辑使它更容易阅读(双引号字符串是你的朋友)),所以从那个开始:

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()应该是它们包含的限制。处理表单数据、查询数据库或任何其他此类有趣的东西不是模板的工作。

像这样拆分脚本是Separation of Concerns的一个示例,它基本上表示应用程序应该根据它们的功能拆分为组件。因此,就像 CSS 应该如何与 HTML 分开(一个是格式,另一个是结构)一样,PHP 也应该与 HTML 分开,但显示内容除外。

TLDR:更好地构建您的应用程序,不要遵循任何建议在 PHP 和 HTML 之间跳转的资源。你最终只会学习错误的方式来编写 PHP 应用程序。

于 2012-11-14T00:32:02.440 回答