2010年10月6日 星期三

php 防止重複提交

當我們寫網頁程式時
很多時會因為用戶按了重新整理(F5)引致重複送出表單
如重複留言等問題

當然使用AJAX可以解決這個問題
但現在我介紹一個比較簡單的方式解決
在表單和SESSION中加插一個隨機隱藏數值來定義是否重複送出
請從下方繼續閱讀觀看全文


inc.function.php
<?php

//隨機產生數字
function formResubmitGen(){
 global $_SESSION;
 $_SESSION["formHash"] = rand(10000, getrandmax());
}

//輸出Hidden表單
function formResubmitPrint(){
 global $_SESSION;
 if($_SESSION["formHash"]=="") formResubmitGen();
 echo '<input name="formHash" type="hidden" value="'.$_SESSION["formHash"].'" />';
}

//輸出檢查
function formResubmitCheck(){
 global $_SESSION, $_POST;
 if($_SESSION["formHash"]==$_POST["formHash"]){
  $_SESSION["formHash"] = "";
  return true;
 }
 return false;
}
?>



guestbook.php

<?php
//必須開啟SESSION
@session_start();
//引用上面的函式
include("inc.function.php");
//檢查表單輸入及是否重複
if($_POST["name"] && $_POST["comment"] && formResubmitCheck()){
 $db->insert($_POST,tblComment);
}
?>

Name
Comment



參考文獻:http://b.lineage.idv.hk/300/teach-php-reflesh-form-resubmit

2010年10月5日 星期二

CodeIgniter 驗證碼

源代码下载地址:http://code.google.com/p/cool-php-captcha/

最新的是0.3版,所以我下cool-php-captcha-0.3.zip

解壓縮後得到cool-php-captcha-0.3目路,裡面有4個文件和一个resources目錄。

captcha.php:生成captcha的文件,关键文件;

example-form.php:一个验证页面例子;

example.jpg:生成后的效果图;

LICENSE.txt:许可协议;

resources:存放了生成時需要的資源文件,包括字体、字典和语言文件,關鍵目錄。

其实有captcha.php和resources目录就可以使用了。


因為原作不是基於CodeIgniter框架的,為了最短时間内可以使用,按下列步骤操作:

1.    建一个與system平级的resources目錄,这个是存放CI编程時用得到的資源文件,
       平時我把CSS、JS、Images都放在这里,如果你已经有類似的目录了(public),
       跳到下一步;

2.   复制captcha.phpresources目錄到剛才建的(public)目录中,
      將複製進來的resources目錄改名为captcha,目的是標記清楚,不會混淆;


 3.  告訴captchay 資源文件目錄改名了。打開“captcha.php”,
      找到“OPTIONAL Change configuration…”,
      在他下面找到“$captcha->resourcesPath = “/var/cool-php-captcha/resources”;”,
      改     为“$captcha->resourcesPath = “captcha”;”,再把前面的注釋符“//”去掉
      其它的captcha的配置可根据自己需要改變;


4.   在自己要使用驗證碼的地方,使用這個HTML代碼:



點擊更换圖片

5. 如果需要更新的話,传递一个随機數做参數就行了:


点击更换图片





6. 驗證的时候,把提交的驗證碼和$_SESSION['captcha']做比對就行了。


注意:如果按上面的步骤做,卻顯示不出驗證碼圖片,請查看.htaccess文件,確認rewrite功能把resources目錄排除了。具體語句如下:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

PS:可以在config.php里增加一條語句配置資源文件目錄: