顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - ricky

頁: 1 ... 21 22 [23]
661
還有忘了提一點
程式結尾的地方那堆html
雖然程式在header送出後就結束了
可是結尾的html並不受程式結束的影響喔
他還是會乖乖送出的
只是我沒試過這樣會導致什麼後果
try看看吧應該行的通吧
如果行不通的話再想辦法把他用if框起來吧

662
這個時候找起來就有點麻煩了
尤其是php程式碼跟html混用的時候就常常會發生這種討人厭的情況
可以先試著找看看
事不是在程式最開頭的地方留下了空白或是斷行
在程式開頭到第一個<?php出現的這一段中間的字元php會視為html
會導致在header送出前就先送出html了
照理來說既然是header就表示他得在第一行輸出
在他輸出之前不能有任何html存在或是送出任何echo
哈哈找到了
代碼: [選擇]

    for ($i=0;$i<$pas_index;$i++)
   {
      $passck[$i]=mysql_fetch_array($result_pas);

      if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
        {
         $keyid=$passck[$i][mem_key];
         $memid=$passck[$i][mem_id];
         $nameid=$passck[$i][mem_name];
   }
}
?>

<? //看到沒上面一行的地方上面是不是留空白啦那行是html
if ($usr_t && $pas_t)
{

   if ($keyid && $memid && $nameid)
     {
                    header("Location:index.html"); //<---header是在這邊送出的
                    die;    
      //echo "<font color='yellow' class='FontSize18'>請稍後, 登入中...</font><br><br>";
      //echo "<meta http-equiv='refresh' content='1;URL=index.html'>";
     }

}

663
改成這樣試看看吧
引述: "joeyhsy"
我也很混淆,我把我的原始code貼上來,請您幫我看看哪裡錯了 :(
代碼: [選擇]
<?session_start();
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


session_register("memid");
session_register("nameid");
session_register("keyid");

include "config.php";
include "css.php";

// ----- 密碼提取 ----- //
$passcheck = "SELECT mem_id,mem_pas,mem_key,mem_name FROM $db_table_member";
$result_pas=mysql_query($passcheck,$link_ID);
$pas_index=mysql_num_rows($result_pas);

if ($usr_t && $pas_t)
{
    for ($i=0;$i<$pas_index;$i++)
{
$passck[$i]=mysql_fetch_array($result_pas);

if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
 {
  $keyid=$passck[$i][mem_key];
  $memid=$passck[$i][mem_id];
  $nameid=$passck[$i][mem_name];  
}
}
if(!($usr_t && $pas_t))
{
?>

<html>
<head><title>使用者登入</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">



<script language="JavaScript">
<!-- Hide

function setfocus() {
        document.first.usr_t.focus();
        return;
}

// -->
</script>

</head>
<body  link="#0000FF" vlink="#0000FF" text="#CCFFFF" onLoad="setfocus()"  bgcolor="<?echo $bgcolor_main?>">

<table border="0">
<tr>
<td height="25">
</td>
</tr>
</table>



<div align="center">
<form action="<?echo $PHP_SELF?>" method="post" name="first">


<table width="220" cellspacing="2" cellpadding="5" align="center" border="2">
<tr>
<td class="bg2" height="23" align="left" colspan="2">
請輸入帳號及密碼
</td>
</tr>

<tr>
<td class="block1" valign="top" align="center">

帳 號: <input type="text" size="20" name="usr_t" class="block5" value="<?echo $usr_t?>"><br><br>
密 碼: <input type="password" size="20" name="pas_t" class="block5"><br><br>
<div align="center"><input type="submit" value="登入" class="Fontsize"></div>

</td>
</tr>

</table>


<br>

</form>






<?
}
if ($usr_t && $pas_t)
{

if ($keyid && $memid && $nameid)
 {
                    header("Location:index.html");
                    die;    //<<-----送出header之後就停啦別再送出html
 }
else
 {
  echo "<font color='yellow' class='FontSize18'>帳號密碼錯誤!!</font>";
 }
}
if(! ($usr_t && $pas_t))
{

?>

</div>
</body>
</html>
<?
}
?>

664
問題就出在...
你的程式碼有回應html所以就會出現網頁過期訊息啦...
避免的方法就是"不要送出html"
直接回應一個header導向另一個網頁
就不會出現這個問題了
"因為header不屬於html的一部分"

665
register_globals = On
這樣不是一個很好的程式寫作習慣喔
將POST變數regist成global的話很容易導致一些安全因素(如果檢查不是很周嚴的話)
所以php從4.3以後預設是將register_globals設為off
盡量改用$_GET,$_POST,$_SESSION這些變數來取代傳統global變數的使用
避免一些安全上的疑慮

666
你可能還是沒看清楚喔
(1)login.php(顯示login畫面)-->POST->(2)login.php(回應一個Location header)->重新導向->(3)登入後的歡迎畫面
而一般系統會出現過期都是在(2)產生的
所以(2)送出一個重新導向的header導致使用者在(3)按上一頁是回不到(2)的
在(1)送出資料後Action"是自己本身"也就是login.php
然後在login.php裡面regist session再來就直接回應header redirect
就不會回到login.php了
看來你可能是直接以login.php做回應就會出現網頁過期的訊息了
如果login成功login.php是只有回應header而已不會有html code
就不會有網頁過期的問題了
可以參考一下我的網頁吧http://ez2.us/

667
我自己的做法是這樣子
login.php  ->顯示login畫面 POST action處理程式也是login.php
當使用者輸入正確密碼登入後
login.php就送回一個header("Location:http://xxx.xxx.xxx/");
將使用者導引至登入後的畫面
如果使用者使用上一頁功能回到上一頁時
就不會出現這個問題了
畫個圖就比較容易了解
(1)login.php(顯示login畫面)-->POST->(2)login.php(回應一個Location header)->重新導向->(3)登入後的歡迎畫面
而一般系統會出現過期都是在(2)產生的
所以(2)送出一個重新導向的header導致使用者在(3)按上一頁是回不到(2)的
會直接回到(1)就可以避免掉這個問題了

668
PHP程式設計討論區 / Smarty樣板引擎簡介
« 於: 2004-07-12 16:08 »
那我簡單的說明一下{section}用法好了
{section}{/section}主要是用在巢狀迴圈
舉個簡單例子
引用

test.htm
<!--
注意這邊的 List代表的是這一層section
$ListCount是表示這個section要跑幾次他是一個變數別忘了前面'$'
{section name=List loop=$ListCount}
-->
 這是Data1:{$Data1
    }<br>
     這是Data2:{$Data2
      }<br>
      <!-- {/section} -->

引用

test.php
require_once("Smarty/Smarty.class.php");
$tpl=new Smarty;
$tpl->template_dir="templates";  //告訴Smarty樣板檔擺在哪編
$datacount=10;
for($i=0;$i<$datacount;$i++)
{
 $Data1[$i]="Data1_".$i;
 $Data2[$i]="Data2_".$i;
}
$tpl->assign("ListCount",$datacount);  //指定section要跑10次
$tpl->assign("Data1",$Data1);   //指定Data1
$tpl->assign("Data2",$Data2);   //指定Data2
$tpl->display("test.htm");
?>

引用

輸出
 這是Data1:Data1_0
 這是Data2:Data2_0
 這是Data1:Data1_1
 這是Data2:Data2_1
 這是Data1:Data1_2
 這是Data2:Data2_2
 這是Data1:Data1_3
 這是Data2:Data2_3   ......


巢狀式的section也很簡單
引用

test.htm
{section name=ListI loop=$LoopCountI}
{section name=ListJ loop=$LoopCountJ[ListI]}   <-這邊的LoopCountJ是一個array
 data {$Data[ListI][ListJ]}                                 <Data是一個二維的array
{/section}
{/section}

引用

test.php
<?php
require_once("Smarty.class.php");
$tpl=new Smarty;
$tpl->template_dir="./";
for($i=0;$i<5;$i++)
{
 $LoopCountJ[$i]=5;
 for($j=0;$j<5;$j++)
 {
  $Data[$i][$j]="[$i][$j]";
 }
}
$tpl->assign("LoopCountI","5");
$tpl->assign("LoopCountJ",$LoopCountJ);
$tpl->assign("Data",$Data);
$tpl->display("test.htm");
?>

引用

輸出
                                                                               
 data
  • [0]

 data
  • [1]

 data
  • [2]

 data
  • [3]

 data
  • [4]

                                                                               
 data [1][0]
 data [1][1]
 data [1][2]
 data [1][3]
 data [1][4]
                                                                               
 data [2][0]
 data [2][1]
 data [2][2]
 data [2][3]
 data [2][4]
                                                                               
 data [3][0]
 data [3][1]
 data [3][2]
 data [3][3]
 data [3][4]
                                                                               
 data [4][0]
 data [4][1]
 data [4][2]
 data [4][3]
 data [4][4]

section的用法大致上就是這樣
有問題的話大家可以提出來互相研究研究吧

669
PHP程式設計討論區 / Smarty樣板引擎簡介
« 於: 2004-07-09 14:07 »
開發php程式免不了的要跟html綁在一起
但是把html跟php寫在一起就不是個很好的做法
如果網頁版面常常需要變動時
版面一調整php程式碼可能也得跟著大變動
如此一來程式碼的使用率可能就不太好了
況且美工跟程式人員可能天天為了整合的問題在大傷腦筋
因此樣板系統就誕生了
Smarty就是一套專門為php打造的一套樣板引擎
可以讓php歸php html歸html讓程式員不用再為了排版問題大傷腦筋
好了廢話不多說讓我們來看看如何使用這套樣板引擎吧

安裝過程很簡單
http://smarty.php.net抓取最新的Smarty
代碼: [選擇]

tar zxvf Smarty-2.6.2.tar.gz
解開後在Smarty的目錄下會有一個libs目錄
cp libs  /usr/lib/Smart
mkdir /tmp/smarty.tmp
chmod 1777 /tmp/smarty.tmp   <-用來擺放Smarty產生的cache資料
編輯 /usr/lib/Smart/ Smarty.class.php
把 var $compile_dir     =  xxxx
改成 var $compile_dir     =  /tmp/smarty.tmp
最後
在php.ini裡面
include_path 加上 /usr/lib/Smarty
這就ok啦

再來就是如何使用了

我們就用個簡單的成功或失敗的網頁來做說明吧

代碼: [選擇]

success.htm
<html>
<head>
<title>成功</title>
</head>
<body>
  使用者帳號{$User}登入成功
</body>
</html>

代碼: [選擇]

fail.htm
<html>
<head>
<title>失敗</title>
</head>
<body>
  使用者帳號{$User}密碼{$Password}登入失敗
</body>
</html>

代碼: [選擇]

login.php
<?php
 
require_once&#40;"Smarty/Smarty.class.php"&#41;;
 
$tpl=new Smarty;
 
$tpl->template_dir="templates";  //告訴Smarty樣板檔擺在哪編
 
if&#40;&#40;$_POST['User']=="ricky"&#41;&&&#40;$_POST['Password']=="ilovericky"&#41;&#41;
 
{
  
$tpl->assign&#40;"User",$_POST['User']&#41;;
  
$tpl->display&#40;"success.htm"&#41;;    //顯示success.htm
 
}
 else
 {
  
$tpl->assign&#40;"User",$_POST['User']&#41;;
  
$tpl->assign&#40;"Password",$_POST['Password']&#41;;
  
$tpl->display&#40;"fail.htm"&#41;;     //顯示fail.htm
 
}
?>


輸入User -> 'ricky' Password->'ilovericky'
輸出結果
代碼: [選擇]

<html>
<head>
<title>成功</title>
</head>
<body>
  使用者帳號ricky登入成功
</body>
</html>

輸入User -> 'hacker' Password->'i am a hacker!!'
輸出結果
代碼: [選擇]

<html>
<head>
<title>失敗</title>
</head>
<body>
  使用者帳號hacker密碼i am a hacker!!登入失敗
</body>
</html>

html檔裡面的{$XXXX}就是樣板變數
當smarty在解譯的時候遇到{$XXXX}就會尋找相對應的XXXX變數去取代掉
指定變數就是靠
$tpl->assign(變數名稱,變數內容);
最最最重要的$tpl->display("xxxx");
作用就是用來將指定的樣板輸出拉
以上只是簡單的介紹Smarty
事實上Smarty能做的還不只這樣
可以在樣板檔宣告巢狀的區塊
使用if條件式動態的決定要不要輸出某個欄位
甚至在一個樣板檔內引入另一個樣板檔
以後有機會再詳細的介紹Smarty強大的功能

頁: 1 ... 21 22 [23]