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

ここでの根本的な問題は、気まぐれにそれ自体と HTML の間をジャンプする PHP の機能を使用/悪用することです。これは機能として広く宣伝されていますが、些細なことであれば、サーバー側のコード、マークアップ、クライアント側のスクリプトがすべて埋め込まれ、互いに織り合わされた恐ろしいスパゲッティ皿になってしまうのが普通です。解決策は、そのようにコードを書かないことです。

と、言うのは簡単ですが、どういう意味ですか?これは、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()) には、最小限の PHP のみを含める必要があります。 echoif/elsewhile()for()、およびforeach()それらが含むものの限界でなければなりません。フォーム データを処理したり、データベースにクエリを実行したり、その他の楽しいことを行うのは、テンプレートの仕事ではありません。

このようにスクリプトを分割することは、懸念事項の分離の例です。これは基本的に、アプリケーションをその機能に基づいてコンポーネントに分割する必要があることを示しています。つまり、CSS を HTML から分離する必要があるのと同じように (1 つは書式設定で、もう 1 つは構造)、PHP も HTML から分離する必要がありますが、表示は例外です。

TLDR: アプリをより適切に構成し、PHP と HTML の間を行き来することを推奨するリソースには従わないでください。PHP アプリケーションの書き方を間違って学ぶことになるだけです。

于 2012-11-14T00:32:02.440 に答える