切割字串通常都是有某些特殊分隔用 split 來分隔, 而另外一種是固定長度的切割法, 就是第一欄長度是 20, 第二欄長度是 15 .. 等, 遇到這種可以使用 unpack 來切割.
簡單範例
下述範例 $str 裡面第一欄的長度是 10, 第二欄是 10, 第三欄是 9, 第四欄是 8 (算法是由字串開始算到最後面空白結束), 那 unpack 用法就如下述範例:
<?php
$str = '12/01/08 00:22:33 112233 12342222';
print_r(unpack('a10date/a10time/a9phone/a8tel', $str));
?>
輸出結果:
Array
(
[date] => 12/01/08
[time] => 00:22:33
[phone] => 112233
[tel] => 12342222
)
unpack 裡面的第一欄 format 格式, 上述用的都是 a NUL-padded string (詳細格式可見: pack), "/" 是分隔下一欄用, 所以格式寫起來是 "10個字 指定給 date 的變數 / 10個字 指定給 time 的變數 ... 等", 而因為是固定字串, 所以這些資料印出來的後面, 有可能會有空白, 可以再用 trim 去掉.
範例: 讀檔再切割
範例2: (讀檔再切割)
<?php
$handle = fopen("unpack.txt", "r");
while (!feof($handle)) {
$t = unpack("a10date/a10time/a9phone/a8tel", fgets($handle));
$date = trim($t['date']);
$time = trim($t['time']);
$phone = trim($t['phone']);
$tel = trim($t['tel']);
// todo something.
}
fclose($handle);
?>
文章轉載自 Tsung's Blog
kevin0523 發表在 痞客邦 留言(0) 人氣()
有時候常常會需要取得來訪者的IP位址,但是IP位址有兩種
一種為非透過proxy上網
另一種為透過proxy上網
兩種方式其實都不一樣
取得使用者ip,php取得使用者ip
以下為不同取得IP位置的方式
kevin0523 發表在 痞客邦 留言(0) 人氣()
PEAR::HTML_QuickForm的驗證規則
參考資料:http://phpeye.com/article/view/id/108
規則名稱
|
參數
|
規則描述
|
required
|
|
必須輸入,不能為空
|
maxlength
|
$length
|
最大字符長度
|
minlength
|
$length
|
最小字符長度
|
rangelength
|
$min,$max
|
字符長度的範圍
|
regex
|
$rx
|
輸入的數據必須匹配給定的正則表達式
|
email
|
true
(forDNS heck)
|
驗證email地址的格式(有個可選的選項還可以查看域名是否有效)
|
lettersonly
|
|
只能是英文字母
|
alphanumeric
|
|
只能是英文字母或數字
|
numeric
|
|
只能是數字
|
nopunctuation
|
|
不能包含以下特殊字符: ( ) . / * ^ ? # ! @ $ % + = , " ' > < ~ [ ] { }.
|
nonzero
|
|
不能為零
|
compare
|
|
兩次輸入必須相同
|
uploadedfile
|
|
表單元素必須包含正確上傳文件
|
maxfilesize
|
$size
|
上傳文件的最大容量
|
mimetype
|
$mime
|
上傳文件的類型,$mime可以是數組,則上傳文件的類型必須為其中一種
|
filename
|
$file_rx
|
上傳的文件的名稱必須滿足給定的正則表達式
|
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
過濾用戶輸入一直也是 web 應用很重要的安全工作,在 PHP 內除了自行編寫過濾特別字符串的程式外,也可以用現成的 PECL extension: Input Filter extension。要使用這個 extension 需要在 shell 輸入以下指令安裝:
pecl install filter
以下例子假設有一張表單,裡面有兩個欄位: name, age 及 email。而我們希望 name 會用字串;age 是數字;email 就是電郵格式,那麼便可以這樣做:
以上會使用 filter_input 函式來過濾輸入,如果輸入是合符規定,會回傳沒有改動的變數;如果不符合規定,便會回傳 FALSE,而如果變數不存取便會回傳 NULL。
如果不想回傳 FALSE,而是回傳經過處理的輸入,假設 $_POST['name'] 是 "<b>My Name</b>" 可以這樣做:
kevin0523 發表在 痞客邦 留言(0) 人氣()
今天推出驗證圖片的功能
每一行的指令都有加上註解
下面各項參數最佳化於100X30的尺寸
如有變更驗證圖片的長寬
參數需要自行修正
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
話說最近在為了上傳圖片經過縮圖的時間來煩惱,只不過我在想,為甚麼我上傳圖片還要等待縮圖時間才可以,然而無名小站,只需要上傳時間,縮圖是在它機器背景執行,後來發現一個函式非常好用,那就是
ignore_user_abort(true)
;
http://tw2.php.net/manual/tw/function.ignore-user-abort.php
無名在上傳圖片的php檔案,肯定有加上這個函式,他的好處是使用者如果關掉瀏覽器,但是php還是會繼續執行,也就是無名可以把檔案上傳之後,重新導向到使用者的相簿,程式可以如下
kevin0523 發表在 痞客邦 留言(0) 人氣()
PHP4
putenv("TZ=Asia/Taipei");
PHP5
date_default_timezone_set( "Asia/Taipei" );
或是在 php.ini 設定:
date.timezone = Asia/Taipei
(PHP 5.1 起,主機不論是不是在國外都要設定)
kevin0523 發表在 痞客邦 留言(0) 人氣()
安全模式 safe_mode
PHP 的安全模式是為了試圖解決共享伺服器(shared-server)安全問題而設立的。在結構上,試圖在 PHP 層上解決這個問題是不合理的,但修改 WEB 伺服器層和操作系統層顯得非常不現實。因此許多人,特別是 ISP,目前使用安全模式。
保安措施和安全模式
表格 22-1. 保安措施和安全模式配置指令
名稱 |
預設值 |
作用範圍 |
safe_mode |
"0" |
PHP_INI_SYSTEM |
safe_mode_gid |
"0" |
PHP_INI_SYSTEM |
safe_mode_include_dir |
NULL |
PHP_INI_SYSTEM |
safe_mode_exec_dir |
"" |
PHP_INI_SYSTEM |
safe_mode_allowed_env_vars |
PHP_ |
PHP_INI_SYSTEM |
safe_mode_protected_env_vars |
LD_LIBRARY_PATH |
PHP_INI_SYSTEM |
open_basedir |
NULL |
PHP_INI_SYSTEM |
disable_functions |
"" |
PHP_INI_SYSTEM |
PHP_INI_* 常數的進一步詳細說明與定義見 ini_set()。
這裡是配置指令的一些簡短解釋。
- safe_mode boolean
-
是否啟用 PHP 的安全模式。更多訊息請閱讀安全一章。
- safe_mode_gid boolean
-
預定情況下,安全模式在打開文件時會做 UID 比較檢查。如果你想將其放寬到 GID 比較,則打開 safe_mode_gid。是否在文件連接時使用 UID(FALSE)或者 GID(TRUE)來做檢查。
- safe_mode_include_dir string
-
當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。
從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。
- safe_mode_exec_dir string
-
如果 PHP 使用了安全模式,system() 和其它執行系統程序的函式將拒絕啟動不在此目錄中的程序。
- safe_mode_allowed_env_vars string
-
設置某些環境變數可能是潛在的安全缺口。本指令包含有一個逗號分隔的前綴列表。在安全模式下,用戶只能改變那些名字具有在這裡提供的前綴的環境變數。預定情況下,用戶只能設置以 PHP_ 開頭的環境變數(例如 PHP_FOO = BAR)。
註: 如果本指令為空,PHP 將使用戶可以修改任何環境變數!
- safe_mode_protected_env_vars string
-
本指令包含有一個逗號分隔的環境變數的列表,最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。
- open_basedir string
-
將 PHP 所能打開的文件限制在指定的目錄樹。本指令不受安全模式打開或者關閉的影響。
當一個腳本試圖用例如 fopen 或者 gzopen 打開一個文件時,該文件的位置將被檢查。當文件在指定的目錄樹之外時 PHP 將拒絕打開它。所有的符號連接都會被解析,所以不可能通過符號連接來避開此限制。
特殊值 . 指定了存放該腳本的目錄將被當做基准目錄。
在 Windows 中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為 Apache 模塊時,父目錄中的 open_basedir 路徑自動被繼承。
用 open_basedir 指定的限制實際上是前綴,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許連接 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將連接限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir = /dir/incl/"。
預定是允許打開所有文件。
- disable_functions string
-
本指令允許你基於安全原因禁止某些函式。接受逗號分隔的函式名列表作為參數。 disable_functions 不受安全模式的影響。
本指令只能設置在 php.ini 中。例如你不能將其設置在 httpd.conf。
參見 register_globals,display_errors 和 log_errors。
當 safe_mode 設置為 on,PHP 將檢查當前腳本的擁有者是否和將被文件函式操作的文件的擁有者相匹配。例如:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd |
執行 script.php
<?php readfile('/etc/passwd'); ?> |
如果安全模式被啟動,則將會導致以下錯誤:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 |
同時,或許會存在這樣的環境,在該環境下,寬松的 GID 檢查已經足夠,但嚴格的 UID 檢查反而是不適合的。您可以用 safe_mode_gid 選項來控制這種檢查。如果設置為 On 則進行寬松的 GID 檢查;設置為 Off(預設值)則進行 UID 檢查。
除了 safe_mode 以外,如果您設置了 open_basedir 選項,則所有的文件操作將被限制在您指定的目錄下。例如:
<Directory /docroot> php_admin_value open_basedir /docroot </Directory> |
如果您在設置了 open_basedir 選項後執行同樣的 script.php,則其結果會是:
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2 |
您也可以單獨地屏蔽某些函式。請注意 disable_functions 選項不能在 php.ini 文件外部使用,也就是說您無法在 httpd.conf 文件的按不同虛擬主機或不同目錄的方式來屏蔽函式。 如果我們將如下內容加入到 php.ini 文件:
disable_functions readfile,system |
則我們會得到如下的輸出:
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2 |
kevin0523 發表在 痞客邦 留言(0) 人氣()
在PHP.ini中
short_open_tag參數控制語法分析器是否識別快捷鍵< ?...?>,類似於識別標準鍵< ?php...?>。
如果這一參數與其它語言發生衝突,或者如果你想在PHP代碼中使用嚴格語法規則,就關閉該參數。
short_open_tag = On
還有發生錯誤時若不顯示php版號 則將
expose_php = OFF
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
自動裁切縮圖程式
使用方式
autoResizeImage($srcjpeg,245,184,$dstjpeg);
freeResizeImage($srcjpeg,245,245,184,$dstjpeg);
kevin0523 發表在 痞客邦 留言(0) 人氣()
The Original
imagefilter() called with different filter constants
Filter: IMG_FILTER_BRIGHTNESS
Code to reproduce:
<?php
$image = imagecreatefrompng('nathalie.png');
imagefilter($image, IMG_FILTER_BRIGHTNESS, 5);
imagepng($image, 'img_filter_brightness_5.png');
imagedestroy($image);
?>
Filter: IMG_FILTER_BRIGHTNESS
Code to reproduce:
<?php
$image = imagecreatefrompng('nathalie.png');
imagefilter($image, IMG_FILTER_BRIGHTNESS, 50);
imagepng($image, 'img_filter_brightness_50.png');
imagedestroy($image);
?>
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
用以下的方式,可以讓大部份瀏覽器 (主要是 IE) 詢問你是否要下載檔案 (而不是直接開啟) 。
- $file_name: 這是給瀏覽器看的檔案名稱,也就是下載視窗會出現的那個檔名;它可以跟實際檔案的名稱不一樣!
- $file_path: 會連到實際檔案的位置,也就是該檔案在伺服器上的真實路徑。
- $file_size: 檔案的大小。
kevin0523 發表在 痞客邦 留言(0) 人氣()
問: 如何偵測網路圖片是否存在?如http://www.example.com/xxx.png。並回傳結果。
如果僅需偵測是否存在,而不要下載整份文件。僅需要透過 HTTP 協定 (RFC2616)的 HEAD method 即可達成目的。依 HTTP 協定之狀態定義,文件存在時回應代碼 200 ,不存在時回應 404 。我們可以此作為回傳值。
kevin0523 發表在 痞客邦 留言(0) 人氣()
kevin0523 發表在 痞客邦 留言(0) 人氣()
問: 如何偵測網路圖片是否存在?如http://www.example.com/xxx.png。並回傳結果。
如果僅需偵測是否存在,而不要下載整份文件。僅需要透過 HTTP 協定 (RFC2616)的 HEAD method 即可達成目的。依 HTTP 協定之狀態定義,文件存在時回應代碼 200 ,不存在時回應 404 。我們可以此作為回傳值。
kevin0523 發表在 痞客邦 留言(0) 人氣()