2012-11-13 66 views
0

我正在創建社交網絡。我創建了一個個人資料頁面和一個新聞源類型頁面,可以將您導航到個人資料頁面。根據社交網絡的ID加載獨特頁面

我想根據您在另一個腳本上輸入的數據輕鬆地創建一個獨特的基本配置文件佈局。我有一個會話變量($ _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

'session_start()'在每個腳本的頂部,對嗎?另外,看看什麼語法突出顯示告訴你與您的第一個腳本的「回聲」.... –

+0

不是在每個腳本的頂部,我有頂級腳本,只是包括 –

+0

好吧,就像我試圖暗示上面,與你寫的代碼,你的第一個代碼片段中的第一個'echo'有語法錯誤。這時你已經在PHP中了,但是爲了輸出正確的鏈接,再次嘗試輸入PHP *。這是不可行的,並且真正突出了設計中的缺陷 - 在HTML和PHP之間跳躍。格式良好的PHP腳本會先處理** ALL **數據處理,然後在模板中回顯結果。不這樣做會導致你所遇到的混亂,調試意味着挖掘兩種語言的語法。 –

回答

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()應該是它們包含的限制。處理表單數據,查詢數據庫或其他任何有趣的東西不是模板的工作。

像這樣拆分腳本就是問題分離的一個例子,它基本上說應用程序應該根據它們的功能拆分成組件。所以,很像CSS應該如何與HTML分開(一種是格式化,而另一種是結構化),PHP也應該與HTML分開,除了顯示內容之外。

TLDR:更好地構建您的應用程序,並且不要遵循任何推薦在PHP和HTML之間跳轉的資源。你最終只會學習編寫PHP應用程序的錯誤方法。

+0

構建應用程序的「流程優先,*然後*顯示結果」方式有一個很好的副作用。你知道那些「標題已經發送」的錯誤?它們基本上消失了。 –

+0

另外,作爲一個PSA,**不要**使用舊的'mysql_ *'功能。他們軟弱的棄用。相反,使用MySQLi或PDO。在你的情況下,可能MySQLi,因爲他們有一個程序/'正常'/非OOP API。舊的功能有點不好,並導致安全問題。 –

+0

交配仍然是一回事。似乎沒有任何改變。任何想法如何不改善代碼的外觀,但它實際上做什麼 –