2008-01-27

如何選擇 MySQL 的儲存引擎

MySQL Storage Engines 值得細細品味!
簡單的講, 要快要方便用 MyISAM, 要 Transaction-safe 用 innoDB。

JavaScript 動態產生 radio 選項

例子
如果沒有表單成員, 不可以直接使用 document.form1.radiog.value 去判斷, 否則會發生語法錯誤, 而應先以 document.form1.radiog 判斷。
多個 radio button 會變成陣列, 判斷方式和單一個不同。
另外, 上面的例子在 Firefox 2.0.0.11 會發生錯誤, 如果先在「單一選項」或「多個選項」選第一個項目再回到「沒有選項」並按「檢查」, 就可以看到問題 =.=

2008-01-24

AS3 翻頁效果 (使用現成類別)

PageFlip class
作者首頁
測試範例

import com.foxaweb.pageflip.PageFlip;

const PAGE_WIDTH = 240;
const PAGE_HEIGHT = 180;

var render:Shape=new Shape();
var page0:BitmapData=new p0(PAGE_WIDTH, PAGE_HEIGHT);
var page1:BitmapData=new p1(PAGE_WIDTH, PAGE_HEIGHT);

render.x=250;
render.y=35;
addChild(render);
this.addEventListener(Event.ENTER_FRAME, onEF);

function onEF(e:Event){
render.graphics.clear();
// 計算翻頁的物件
var o0:Object = PageFlip.computeFlip(
new Point(render.mouseX, render.mouseY), // 翻折位置
new Point(1,1), // 右下角
PAGE_WIDTH, PAGE_HEIGHT, // 尺寸
true, // 水平翻頁
1);
PageFlip.drawBitmapSheet(o0, render, page0, page1);
}

測試範例原始檔

2008-01-16

JavaScript 傳中文給 PHP

用 GET 送中文字時, 不同瀏覽器的行為不同
所以先以 JS 轉換成 Unicode
傳給 PHP 後, 再轉成 utf8
資料來源: Neo's Blog 使用 PHP 解譯 javascript escape() 編碼過的字串
<?php
$search_value = uniDecode($search_value, 'utf8');

function uniDecode($str,$charcode){
$text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);
return mb_convert_encoding($text, $charcode, 'utf-8');
}

function toUtf8($ar){
foreach($ar as $val){
$val = intval(substr($val,2),16);
if($val < 0x7F){ // 0000-007F
$c .= chr($val);
}elseif($val < 0x800) { // 0080-0800
$c .= chr(0xC0 | ($val / 64));
$c .= chr(0x80 | ($val % 64));
}else{ // 0800-FFFF
$c .= chr(0xE0 | (($val / 64) / 64));
$c .= chr(0x80 | (($val / 64) % 64));
$c .= chr(0x80 | ($val % 64));
}
}
return $c;
}
?>

2008-01-14

無權設定 php.ini 時

可以使用 ini_set() 函式
若只是設定 include path 可以使用 set_include_path()
以下是官網的範例:
<?php
$path = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>

2008-01-11

INNER JOIN 的效能 (SQL)

個人經驗是 JOIN 三張表以上, 效能明顯變慢。可以使用 sub select 來達到相同的目的。
用一個資料表開得不好的例子來說明。
第一種:
SELECT a. * , ch.listname AS chl, cn.listname AS cnl, en.listname AS enl, jp.listname AS jpl, kr.listname AS krl
FROM aa_mainmenu a
INNER JOIN ch_mainmenu ch ON a.sno = ch.a_id
INNER JOIN cn_mainmenu cn ON a.sno = cn.a_id
INNER JOIN en_mainmenu en ON a.sno = en.a_id
INNER JOIN jp_mainmenu jp ON a.sno = jp.a_id
INNER JOIN kr_mainmenu kr ON a.sno = kr.a_id
ORDER BY a.priority DESC

第二種:
SELECT *
FROM (

SELECT a. * , b.listname AS kr
FROM aa_mainmenu a
INNER JOIN kr_mainmenu b ON a.sno = b.a_id
)a
INNER JOIN (

SELECT a. * , b.en, b.jp
FROM (

SELECT a.a_id, a.listname AS ch, b.listname AS cn
FROM ch_mainmenu a
INNER JOIN cn_mainmenu b ON a.a_id = b.a_id
)a
INNER JOIN (

SELECT a.a_id, a.listname AS en, b.listname AS jp
FROM en_mainmenu a
INNER JOIN jp_mainmenu b ON a.a_id = b.a_id
)b ON a.a_id = b.a_id
)b ON a.sno = b.a_id
ORDER BY a.priority DESC

第二種看起來較複雜, 但執行效能通常比第一種好。

FB 留言