php json_encode亂碼問題

php很簡單的用json_encode就可以回傳json格式了!

不過遇到中文會有亂碼問題,解決方式很簡單在json_encode之前先做urlencode,json_encode之後做urldecode。

範例:

[php]
While ($row=mysql_fetch_array($result1)){
$stores[] = array("NAME" => urlencode($row["STORE_NAME"]),
"TEL" => urlencode($row["STORE_TEL"]))
}
echo urldecode(json_encode($stores));
[/php]

form加上enctype=multipart/form-data作用

在設計表單時,如果內容有檔案時,我們都會在上面加上enctype=”multipart/form-data”。其實form的enctype有三種

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

預設的狀況下都是以application/x-www-form-urlencoded為主,會將資料做編碼傳送(空白以+代替,而特殊字元則傳成ASCII HEX。而multipart/form-data則是不做任何編碼,如果需要上傳文件時,就要使用它;text/plan則是僅將空白以+代替,常見於電子郵件表單。

 

 

延伸閱讀:

http://www.w3.org/TR/html401/interact/forms.html

筆記-自己常用的PHP Opensource框架或元件

Yii
http://www.yiiframework.com/

CodeIgniter
http://ellislab.com/codeigniter
http://www.codeigniter.org.tw/

資料庫(adodb)
http://adodb.sourceforge.net/

模板引擎(SMARTY)
http://www.smarty.net/

電子郵件(PHPMailer)
http://phpmailer.worxware.com/

MobileDetect
http://mobiledetect.net/

Captcha Genie
http://www.captchagenie.com/

QrCode
http://phpqrcode.sourceforge.net/

有趣的PHP Session機制

網站為了擔心Cross-site Request Forgery(CSRF/XSRF)攻擊,所以在增加csrf-token的session,在執行時判斷網頁的csrf-token值跟session是不是一樣。

不過發現即使設定gc_maxlifetime,仍會有可能出現應該過期的session還在的問題,這才發現原來php沒有一個daemon定時掃描過期的session,而是透過session.gc_probability/session.gc_divisor的設定來決定是否啟動Garbage Collector機制的機率。

解決的方式有幾種:
1.提高session.gc_probability/session.gc_divisor的機率,不過會造成系統的性能降低。

2.如果有更動gc_maxlifetime的話,也要跟著更動session.save_path,或者使用session_save_path()

自己使用了另一個方式,增加了csrf-time,自己檢查過期的話就unset Session。

SMARTY模板中CSS及JavaScript問題

SMARTY算是歷史久遠且強大的template engine(模板引擎),不過最常遇到的問題就是SMARTY引擎將{} 大括號區塊中視為它的解析語法。因此與CSS及JavaScript語法產生衝突,解決的方式有以下幾種:

1.使用{literal} {/literal}

在CSS或JavaScript語法區塊前後加上{literal} {/literal},Smarty 就不會進行解析,不過注意的是裡面就不能再增加任何變數囉。

[php]
{literal}

<style type="text/css"><!– body {
padding-bottom: 40px;
}
.sidebar-nav {
padding: 9px 0;
}

–></style>{/literal}
[/php]

2.利用 {ldelim} {rdelim} 取代左右大括號

[php]
<style type="text/css"><!–
body {ldelim}
padding-bottom: 40px;
{rdelim}
.sidebar-nav {ldelim}
padding: 9px 0;
{rdelim}
–></style>
[/php]

3.重新定義delimiters

[php]
<?php
$smarty->left_delimiter = ‘<!–{‘;
$smarty->right_delimiter = ‘}–>’;
?>
[/php]

4.獨立成檔案

[html]
<link id="bs-css" href="css/base.css" rel="stylesheet">
<script src="js/base.js"></script>
[/html]

這樣一來就可以讓SMARTY與CSS/JavaScript和平共存!

寫PHP的一些安全性問題

怕自己忘記,隨手筆記一下:

.php.ini 中的 register_globals = off;

如果不能改變php.ini的話,可以利用下面的code

[php]
if(ini_get(‘register_globals’)){
foreach($GLOBALS as $key=>$val){
if(!in_array($key,array(‘GLOBALS’,’_POST’,’_GET’,’_COOKIE’,’_SERVER’,’_FILES’,’wind_in’))){
${$key}=”;
}
}
}
[/php]

或是

[php]
if ((isset($_REQUEST[‘GLOBALS’])

OR isset($_FILES[‘GLOBALS’]))

AND ini_get(‘register_globals’)) {

die(globals overwrite attempted.);

}
[/php]

.error_reporting(0);

.防止上傳的檔案執行,在http.conf加上
[php]
<Directory "/home/www/upload">
AllowOverride None
php_flag engine off
Allow from all
</Directory>
[/php]
或是在上傳的目錄下增加 .htaccess
[php]
RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off
[/php]
 

1. SQL 注入攻擊 (SQL injection attack)
mysql_real_escape_string
2. 操縱 GET 的值 (manipulating GET variables)
is_numeric 、 regular expression(ereg(“^[0-9]+$”)
3. 緩衝器溢位攻擊 (buffer overflow attack)
前端 maxlength 、strlen 、 substr
4. 跨站腳本攻擊 (cross-site scripting)
strip_tags 、 htmlspecialchars
5. 操縱瀏覽器內的資料 (manipulating data inside the browser)
假設Tamper Data
6. 遠程表格遞交 (remote form posting)
random token(md5、uniqid、rand)

使用cPanel定時備份資料庫並寄到Mail

對網站來說,資料庫是相當重要的東西。定期的備份,可以在網站主機萬一掛掉、資料損毀或駭客入侵時,都可以透過備份的資料庫還原,讓網站恢復,降低損失。

今天教大家如果申請虛擬主機是使用cPanel的話,如何利用Cron Jobs來定期備份資料庫,並且壓縮後寄到指定信箱。

一、FileZilla 登入虛擬主機,接著切換到根目錄(/)下新增一個backups目錄。

add_backups0

add_backups1

二、打開記事本,輸入以下內容
[shell]
cd /home/yowsoftc/backups
stamp=$(date +%y%m%d)
mysqldump -u資料庫帳號 -p資料庫密碼 資料庫名稱 &gt; db_backup_$stamp.sql
bzip2 -z -9 -f db_backup_$stamp.sql
mutt 接收備份資料庫的Mail -a db_backup_$stamp.sql.bz2 -s "database backup"
rm db_backup_$stamp.sql.bz2
[/shell]
三、另存 backupdatabase.sh,上傳到 backups 目錄下。

四、 將backupdatabase.sh更改權限為755(將執行權限打勾)

backups1

change_attrib0 change_attrib

五、進入cPanel網頁,使用進階工具的工作排程,並選擇”標準”

tools

jobs_standard

六、Add New Cron Job,Common Settings下拉可以選擇每分鐘、每五分鐘、半小時…..。我們選擇Twice a day(一天二次)。接著在執行的指令:輸入 /home/cpanel帳號/backups/backupdatabase.sh

common_settings

add_new_cron_job

七、新增成功後就會如下圖

current_cron_jobs

八、執行排程成功後,會收到一封mail。

cron_daemon

九、使用者也會收到備份成功的mail。database_backup

[PHP]計算二點間距離

[php]
#lat1,lon1是第一個點的經緯度
#lat2,lon2是第二個點的經緯度
#unit的話就用"K" (這樣的話傳回值就會是公尺)
function distance($lat1, $lon1, $lat2, $lon2, $unit) {
global $source;
$theta = $lon1 – $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtoupper($unit);

if ($unit == "K") {
$meters = intval($miles * 1.609344 * 1000);
if($meters &gt; 10000){
return intval($meters/1000).msg(‘公里’,’km’);
}else{
return $meters.msg(‘公尺’,’m’);
}
} else if ($unit == "N") {
return ($miles * 0.8684);
} else {
return $miles;
}
}
[/php]

PHP-如何偵測使用者是否使用手機瀏覽

隨著智慧型手機的普及,在網頁的製作上都需考量到手機瀏覽器的部份,雖然最近很常提到的RWD(Responsive Web Design)可以解決,但實際上如果dom structure 過於肥大,或是載入 Javascript過多時,依舊會有頻寬上的問題(3G貴森森呀),尤其是圖片硬縮流量也不會變小XD

老實說responsive web design 也不是萬能的,祇是利用CSS手法隱藏不需要的elements,最好還是透過偵測方式,輸出不同html會比較好些。

這邊介紹一個很不錯的class

PHP Mobile Detect

網址:http://mobiledetect.net/

使用的方式也很簡單。

  1. include ‘Mobile_Detect.php’;
  2. $detect = new Mobile_Detect();
  3. // Check for any mobile device.
  4. if ($detect->isMobile())
  5. // Check for any tablet.
  6. if($detect->isTablet())
  7. // 3. Check for any mobile device, excluding tablets.
  8. if ($detect->isMobile() && !$detect->isTablet())