顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2017年2月13日 星期一

避免因 "重新整理網頁" (Reload Page) 造成資料重送


by Jamyy on 三月.20, 2008, under Coding

PHP 網頁達到以下目的
  1. 禁止返回上頁
  2. 避免因 "重新整理網頁" (Reload Page) 造成資料重送
PHP

 11<script language="JavaScript">
12    //讓 "回上頁不觸發 onload() 事件的瀏覽器" 也能 "禁止回上頁"
13    //Ref: http://www.boutell.com/newfaq/creating/backbutton.html
14    setTimeout("fn_forward()",1);
15    function fn_forward() {
16        history.forward();
17        setTimeout("fn_forward()",1);
18    }
19</script>
20</head>
21<body onload="history.go(1);fn_forward();">

"history.go(1);fn_forward();">




"history.go(1);fn_forward();">

2013年9月10日 星期二

優化PHP執行效率的40條技巧

  1. 如果一個方法可靜態化,就對它做靜態聲明。速率可提升至4倍
  2. echo 比 print 快
  3. 使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接
  4. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值
  5. 註銷那些不用的變數尤其是大陣列,以便釋放內存
  6. 盡量避免使用__get,__set,__autoload
  7. require_once()代價昂貴
  8. 在包含文件時使用完整路徑,解析操作系統路徑所需的時間會更少
  9. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()
  10. 函數代替正則表達式完成相同功能
  11. str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍
  12. 如果一個字元串替換函數,可接受陣列或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換程式,使得每次傳遞參數是一個字元,而不是只寫一行程式接受陣列作為查詢和替換的參數
  13. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句
  14. 用@屏蔽錯誤消息的做法非常慢
  15. 打開apache的mod_deflate模塊
  16. 資料庫連接當使用完畢時應關掉
  17. $row['id']的效率是$row[id]的7倍
  18. 錯誤訊息代價昂貴
  19. 盡量不要在for循環中使用函數,比如for ($x=0; $x < count($array); $x)每循環一次都會調用count()函數
  20. 在function中遞增局部變數,速度是最快的。幾乎與在函數中調用局部變數的速度相當
  21. 遞增一個全局變數要比遞增一個局部變數慢2倍
  22. 遞增一個物件屬性(如:$this->prop++)要比遞增一個局部變數慢3倍
  23. 遞增一個未預定義的局部變數要比遞增一個預定義的局部變數慢9至10倍
  24. 僅定義一個局部變數而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變數)。PHP大概會檢查看是否存在全局變數
  25. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化
  26. 派生類中的方法運行起來要快於在基類中定義的同樣的方法
  27. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變數遞增操作。類似的方法調用所花費的時間接近於15次的局部變數遞增操作
  28. 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變數,單引號則不會。當然,只有當你不需要在字元串中包含變數時才可以這麼做
  29. 輸出多個字元串時,用逗號代替句點來分隔字元串,速度更快。註意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)
  30. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本
  31. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷
  32. 盡量做緩存,可使用memcached。memcached是一款高性能的內存物件緩存系統,可用來加速動態Web應用程式,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯
  33. 當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變數)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫),會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的程式
    舉例如下:
    if (strlen($foo) < 5) { echo "Foo is too short"; }
    與下面的技巧做比較:
    if (!isset($foo{5})) { echo "Foo is too short"; }
    調用isset()恰巧比strlen()快,因為與後者不同的是,isset()作為一種語言結構,意味著它的執行不需要函數查找和字母小寫化。也就是說,實際上在檢驗字元串長度的頂層程式中你沒有花太多開銷
  34. 當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變數,這個臨時變數隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的網際網路服務提供商(ISPs)和服務器
  35. 並不是所有都要使用OOP,面向物件往往開銷很大,每個方法和物件調用都會消耗很多Memory
  36. 並非要用 class 實現所有的數據結構,陣列也很有用
  37. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些程式?
  38. 當你需要時,你總能把程式分解成方法
  39. 盡量採用大量的PHP內置函數
  40. 如果在程式中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們
  41. 評估檢驗(profile)你的程式。檢驗器會告訴你,程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式,評估檢驗總體上可以顯示出程式的瓶頸
  42. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%
  43. 另一篇優化PHP的精彩文章,由John Lim撰寫

相關網頁

2011年9月30日 星期五

安全的檔案上傳 upload

為了安全考量,系統中內部會記錄上船的檔案名稱,以便讓我們能交叉比對該檔案是否真的是客戶端上傳的檔案名稱,由兩個函式來完成。
is_uploaded_file($filename);
$filename是要檢查的檔案名稱,實際在使用時,is_uploaded_file()函式的功用和file_exists()是相同的,但file_exists()函式沒有去確認檔名是否確實為客戶端所上傳,而is_uploaded_file()函式則會幫我們確認。
move_uploaded_file($filename, $dest);
$filename是儲存在$_files(super global)中 tmp_name項目的上傳暫存檔名,而$dest則是移動的目標路徑及檔名;此兩個函式主要功能是互先檢查確認該檔名是否真的為使用者上傳後,才去執行移動的動作。

2011年8月24日 星期三

Superglobal陣列

PHP提供的一些陣列型態($_GET, $_POST, $_SESSION, $_COOKIE)等等...
$_GET為PHP儲存經由get方式所傳送的變數及其值(有可能是從HTML表單傳送,但不一定是)。同樣的$_POST儲存經由post方式所傳送的資料。
相較於register global變數,superglobal具有2項優點,
  1. 較為嚴謹(指出變數的來源),顧安全項較高。
  2. 變數範圍為全域性。
若希望簡化程式碼(且register_globals功能開啟時),則可將$_POST['name']改寫為$name。

superglobal是PHP4.1版的新功能,若為更早的版本,則使用$HTTP_POST_VARS來代替$_POST,以$HTTP_GET_VARS取代$_GET。

2011年8月6日 星期六

使用header()函數

重新導向為最常見的用法,即利用header()函數將目前瀏覽器的網頁導向另一網頁
header("Location: http://www.google.com/")
重新導向應該是目前網頁所執行的最後一項動作,所以此灀之後,通常會跟隨著一行用以結束程式執行的exit()敘述。

要特別留意,呼叫header()函數的動作,需在任何資料輸出至瀏覽器前進行,不論是HTML程式碼甚至是空白字元。若是header()函數敘述前,含有任何echo()、print()敘述或是空行(PHP標籤外)等內容,或是載入了包含這些內容的included file,將會出現以下錯誤訊息。
Warning:Cannot add header information - headers already sent bby (output started at phpmysql/header.inc:6) in phpmysql/header.php on line 6
避免錯誤發生,可使用headers_sent()函數來檢查是否已有資料輸出至瀏覽器。
if(!headers_sent()){
  header("Location: http://www.google.com/");
  exit();
} else {
  echo 'Wanted to redirect you but I could not do it!';
} 
TIPS

  • header()函數也可應用於由PHP程式產生PDF檔、圖檔或其他非HTML的文件類型。
  • 建議於header()函數中使用完整的URL網址http://domain/index.php 。

-延伸閱讀 -
http://php.net/manual/en/function.header.php
http://www.w3.org/Protocols/

2011年7月28日 星期四

2011年7月21日 星期四

檢核資料 isset(), strlen(), stripslashes()

isset()函數用來驗證變數是否含值(可以為0、但不可是Null或False)
if ( isset($var) ) {
//$var 有設值
} else {
//$var 未設值
}

檢查表單應用:strlen(), stripslashes()
if(strlen($var) > 0){  //檢查長度
$var= stripslashes($var); //移除反斜線
}
藉由檢核$submit是否含有變數值(為表單元件submit的名稱),來確認表單資料是否被送出。
if(isset($_POST['submit'])){
   //處理表單資料
} else {
   //顯示表單
   echo ''''
}
參考
 http://www.php.net/manual/en/function.isset.php

2011年7月17日 星期日

PASSWORD()函數

PASSWORD()函數是MySQL加密資料的方法,此函數會建立一個固定為16字元長度的加密字串(這就是將資料表中的password欄位設計成CHAR(16)的原因)。
PASSWORD()是一種單向加密的技術,益及加密後的字串將無法被還原。
此函數對於儲存日後無需再檢視其加密錢格式的機密性資料相當有用;但對日後需檢視其職的機密性資料(如信用卡卡號),顯然並非一項好的選擇。

example,
SELECT * FROM user WHERE password = PASSWORD('password');
因為儲存資料表中的密碼已利用PASSWORD()函數加密過,故可藉由比較儲存值與PASSWORD()加密過的值,來找出符合的紀錄。PASSWORD()函數有區分字母大小寫,所以此查詢僅於資料庫中與查詢句中的密碼完全符合才能找到資料。

2011年3月3日 星期四

Update php5.16 to 5.2 on CentOS

CentOS因安全及穩定的考量,所以在更新上不一定是最新的版本,如特殊需要必須自己更新
升級完後記得 httpd restart

目前有遇到的是
phpMyAdmin3329需要php5.2以上
joomla1.6需要php5.2以上

*maybe you need
# rpm -qa | grep httpd
# rpm -qa | grep php
# php -v


參考資料
http://plog.olps.tcc.edu.tw/post/1/3661
http://www.wretch.cc/blog/jerry0822/16159621
http://www.pigo.idv.tw/archives/242

2010年6月28日 星期一

Php $ SERVER "PHP SELF" 漏洞

從安全角度來講,在開發應用尤其是web應用的時候,所有用戶提交的數據都是不安全的,這是基本原則,所以我們才不厭其煩的又是客戶端驗證又是服務 端驗證。從這個安全漏洞來講,不安全的內容中又要增加「網址」一條了。要解決$_SERVER[』PHP_SELF』]的安全隱患,主要有以下2 種方式:

htmlentities
用htmlentities($_SERVER[』 PHP_SELF』])來替代簡單的$_SERVER[』PHP_SELF』],這樣即使網址中包含惡意代碼,也會被「轉換」為用於顯示的html代碼, 而不是被直接嵌入html代碼中執行,簡單一點說,就是「<」會變成「<」,變成無害的了。

REQUEST_URI
用$_SERVER[』REQUEST_URI』]來替代$_SERVER[』PHP_SELF』],在phpinfo()中可以看到這兩個變量的區 別:
_SERVER[」REQUEST_URI」] /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(』xss』)%3C/script%3E %3Cfoo_SERVER[」PHP_SELF」] /fwolf/temp/test.php/」>
$_SERVER[』 REQUEST_URI』]會原封不動的反映網址本身,網址中如果有%3C,那麼你得到的也將會是%3C,而$ _SERVER[』PHP_SELF』]會對網址進行一次urldecode操作,網址中的%3C將會變成字符「<」,所以就產生了漏洞。需要注意 的是,在很多情況下,瀏覽器會對用戶輸入要提交給web服務器的內容進行encode,然後服務器端程序會自動進行decode,得到相應的原指,在我們 進行post或者get操作的時候都是這樣。
另外還有兩點需要指出,第一是這種寫法雖然沒有直接用到$_SERVER[』 PHP_SELF』],但實際效果卻是一樣的,只是發生的時間錯後到了用戶提交之後的下一個頁面,所以,form的action還是不要留空的好。第二 點,除了PHP_SELF之外,其他的$_SERVER變量也許也會有類似的漏洞,比如SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他們之前一定要先作htmlentities之類的轉換。
原文出處:
http://wiki.guoshuang.com/Php_$_SERVER_%22PHP_SELF%22_%E6%BC%8F%E6%B4%9E"


該函數做甚麼用呢?目前網頁變數名稱

http://www.php.net/manual/en/reserved.variables.server.php
example:
action="<?php echo $_SERVER['PHP_SELF']" ?>
超全域變數,代表目前網頁

2010年3月31日 星期三

eregi() 正規表示式

http://php.net/manual/en/function.eregi.php
eregi ( "正規表示式敘述","要比對的資料" )

PHP:
"正規表示式敘述","要比對的資料"

Javascript
/正規表示式敘述","要比對的資料/

2010年3月30日 星期二

foreach php

http://php.net/manual/en/control-structures.foreach.php
讀出陣列資料

2010年3月24日 星期三

PHP explode - 切開字串

語法:array explode ( string $delimiter , string $string [, int $limit ] )

傳回一個字串的陣列,以參數 $delimiter為界線將參數 $string切開,如果有設定參數$limit,則傳回的陣列最多將會包含 $limit個元素,而最後一個元素將會包含 string全部剩餘的部份。


參考:
http://baniclin.blogspot.com/2008/11/php-explode.html

2010年3月22日 星期一

fatal error: call to undefined function xml_parse()

在偶然的機會下,將 Joomla1.5移植至別台主機,檢查了config及相關路徑資料後卻出現
fatal error: call to undefined function xml_parse()

在網路上找了一下資料才發現,原來少裝了php5-xml

$cd /usr/port/textproc/php5-xml
$make install clean

重新啟動Apache~搞定

2010年3月9日 星期二

安裝php5 on FreeBSD8

In the past there were several ports for PHP such as /www/mod-php5, /lang/php5-cli, and /lang/php5. Since the release of PHP 5.1.14 there is now only /lang/php5 This port now allows you to choose if you want to install the CLI, CGI, and Apache module.

# cd /usr/ports/lang/php5
# make config
# make install


Once php has installed you will need to install the extra modules for things such as MySQL. These modules are all located in the ports. Some of the most common modules are
/usr/ports/databases/php5-mysql - MySQL Database
/usr/ports/www/php5-session - Sessions
/usr/ports/graphics/php5-gd - Graphics Library

Adding the PHP 5 module to Apache

Apache needs the following lines in the httpd.conf file to use php. These lines should already be added by the port but if you have problems you should double check your httpd.conf file. Note that Apache 2.x does not need the AddModule line.
# Apache 1.3.x
LoadModule php5_module        libexec/apache/libphp5.so
AddModule mod_php5.c
# Apache 2.x
LoadModule php5_module        libexec/apache/libphp5.so
If you installed using the port and had apache installed already it should do this automatically for you.
Next find your DirectoryIndex section in your httpd.conf file. Apache is set up for PHP 4, but not PHP 5 currently so you will need to modify it and change the 4s to 5s like this.

You can change the order as you wish. Or if you just wanted to skip it you could simply add the following line to the httpd.conf file since you know you are going to have php 5.
DirectoryIndex index.php index.html index.htm
Now apache just needs to know what it should parse the PHP files with. These two lines should be added to the httpd.conf file, and can be put at the bottom if needed.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
If want to use PHP code inside of .htm files you can just add on those extensions.
AddType application/x-httpd-php .php .htm .html

Configuring PHP

Settings for PHP are stored in /usr/local/etc/php.ini You will need to create this file by copying it from /usr/local/etc/php.ini-dist
# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini In this file you can set the memory limit for programs. Turn on global variables if you must, set the max file upload size, and everything else you need.

From:http://www.freebsdmadeeasy.com/tutorials/web-server/install-php-5-for-web-hosting.php

2010年3月5日 星期五

checkbox利用array寫入資料庫-join("連接的字串","要讀取的陣列變數名稱")

DW8 Example:
 GetSQLValueString(isset($_POST['Mm_Interest']) ? "true" : "", "defined","'Y'","'N'"));
改成
GetSQLValueString(join(",",$_POST['Mm_Interest']), "text"));
此行程式主要是將原本判斷表單元件[checkbox]是否勾選,若勾選擇資料值為"Y",相反則"N"。

因皆是相同名稱的[checkbox],又須將選取值都寫入資料庫,所以改成 [陣列] 的方式儲存資料;不過若將 [陣列]資料直接寫入資料庫,則可能會在表單資料送出並寫入指定資料表後,才發現記載的資料從原本的 [Y} 變成 [Array]。

因為它是陣列資料值的變數,所以須將資料讀出來後,再做轉存的動作,可以採用「join()」這個由PHP提供的函數;

語法: join("連接的字串","要讀取的陣列變數名稱")
以「興趣」為例,其變數名稱為 $M_interest,則可寫成
join(",", $M_interest) 
使用「,」連接「$M_interest」陣列資料值,因修改後DW無法判斷程式法是否由它自己產生,故「伺服器行為」之「插入記錄」會消失。

熱門文章