[PHP] IE下載檔案無法辨識檔名與檔案類型

今天碰到網站利用IE下載檔案時發生無法辨識檔名與檔案類型

花了一點時間找問題來源,原來是IE讀 http header 讀到uft-8的編碼時會有問題

只好針對IE多寫一個判斷,讓程式偵測到瀏覽器為IE時把檔名轉碼

function dl_file( $file ){
    if ( file_exists($file) ) {
        $filename = basename($file);
    }

    // 若為IE瀏覽器則將檔名編碼轉換成Big5
    if ( strpos( $_SERVER['HTTP_USER_AGENT'], "MSIE" ) ) {
        $filename = iconv('utf-8', 'big5', $filename);
    }

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$filename);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: '.filesize($file) );
    ob_clean();
    flush();
    readfile($file);
    exit;
} else {
    echo "Error: File not found.";
    return false;
}

IE啊IE,ˊ_>ˋ………

[WordPress] 新增後台頁面

WordPress不只可以當Blog,也可以架設成其他類型的網站(Ex:報名網站)
有時候想要替自己的網站加一些特殊的功能,而找不到外掛可以來頂替時,就要自己動手做了
而直接做在後台裡是一個不錯的選擇,以下為在後台開新頁面並將頁面放在左側管理選單
先在theme_option.php裡面加入一些內容

// Path: wordpress/wp-content/themes/sample_theme/functions/theme_options.php
// 註冊頁面
// 功能表名稱與頁面title設成"自訂頁面",權限等級設為2 (即身分為作者以上的使用者都能看到這個頁面),page為my_custom_page,callback為load_custom_page
function add_menu_custom_page() {
    add_menu_page('自訂頁面', '自訂頁面', 2, 'my_custom_page', 'load_custom_page');
}

// 設定要載入的script、css
function custom_page_init() {
    if ( isset($_GET['page']) && $_GET['page'] == 'my_custom_page' ) {
        wp_enqueue_style("jquery-ui_layout_1.10.3", "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css");
        wp_enqueue_style("style", THEME_CSS."/custom_page.css", false, "1.0", "all");
        wp_enqueue_script("jquery_1.9.1", "http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js");
        wp_enqueue_script("jquery-ui_core_1.10.3", "http://code.jquery.com/ui/1.10.3/jquery-ui.js");
    }
}

// 讀取頁面模版(在此將模版檔案寫在另一支檔案裡)
function load_custom_page() {
    include ('../custom_page.php');
}

// 將前面的function載入wordpress的核心執行項目中
add_action('admin_init', 'custom_page_init');
add_action('admin_menu', 'add_menu_custom_page');

 

頁面內容寫在custom_page.php裡

// Path: wordpress/wp-content/themes/sample_theme/custom_page.php
echo "This is custom page.";
/*
do somethings
*/

 

關於前面所用到的WordPress function完整說明可參考官方文件:
add_menu_page
add_action
wp_enqueue_style
wp_enqueue_script

 

而頁面權限等級的部分,可以參考 WordPress Codex :: User Levels
另外一個是加入子選單的部分,用法也是大同小異:WordPress Codex :: add_submenu_page
※值得注意的是若要加入自訂頁面至預設功能選單要用到子函式,例如要在options-general加入子選單要使用add_options_page()來新增。

[WordPress] WP Page Numbers 外掛設定

WP Page Numbers是個不錯的外掛,套用的步驟也很簡單,詳見外掛介紹
http://wordpress.org/plugins/wp-page-numbers/

不過要在自己的網站上開新頁面做一些特殊用途,又需要用到換頁功能
但是新頁面又和文章不相關時,外掛便不會運作
不過使用一點小方法便可解決這問題

$rows = 200; // 資料筆數
$display_rows = 20; // 每頁顯示20筆資料

// 宣告全域變數
global $max_page; // 最大頁數
$max_page = $rows / $display_rows; // 計算總頁數,並存到$max_page這個變數

// 若沒有使用固定網址時則需要再加入下列兩行
global $paged;
$paged = $_GET['paged'];

// 如果有設定固定網址,可用這種方式取得當前頁碼
$get_currentPage = $wp_query->query_vars['paged'];

 

這樣就可以正常運作了

[Ubuntu] Apache 模組的啟用與停用

Ubuntu 與 FreeBSD 的 Apache Load Module 設定有點小小的不同,在 FreeBSD 上是直接在 httpd.conf 上把註解拿掉,重啟服務後 Module 就啟動了。不過在 Ubuntu 的設定檔都零零散散拆成很多檔案,Load Module 這部分的設定也是。

calos@ubuntu:/etc/apache2$ ls
apache2.conf  conf.d  envvars  httpd.conf  magic  mods-available  mods-enabled  ports.conf  sites-available  sites-enabled

 

mods-available 是所有模組存放目錄,但是服務載入的模組是存放在 mods-enabled

注意到 apache2.conf 的其中幾行:

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

 

服務啟動時,只載入 mods-enabled 裡面的模組,而部分模組在安裝時預設是不啟動的(意即該模組不會出現在 mods-enabled

若要載入指定模組,可使用 a2enmod 這個指令。例如要啟用 mod-rewrite 模組:

calos@ubuntu:~$ sudo a2enmod rewrite

 

輸入 ls /etc/apache2/mod-enabled,可以看到指定的 module 已經被放進 mods-enabled 裡了。

要停用模組可用 a2dismod

calos@ubuntu:~$ sudo a2dismod rewrite

 

這時候 mod-rewrite 就從 mods-enabled 消失了,模組異動完後記得重啟服務才會生效:

calos@ubuntu:~$ sudo service apache2 restart

 

※PS:a2enmod 實際上也只是把 mods-available 的模組用一個 Symbol Link 指過去 mods-enabled 而已,所以直接用 ln -s 指過去也不是不行 XD​。

[MySQL] 開放外部連線

MySQL通常預設不開放外部連線,因此需要修改一下my.cnf來開放其他機器存取資料庫。

# OS: Ubuntu 14.04 Server LTS x64
# MySQL Server Version: 5.5
# 打開my.cnf
vim /etc/mysql/my.cnf
# 找到下列兩行,拿掉或加上註解後儲存離開
skip-external-locking
bind-address = 127.0.0.1
# 重新啟動服務
sudo service mysql restart