2008年01月20日
[Web] 連結分享
PHP
-
How to avoid POSTDATA resend warning
為了避免出現重送 POST 資料的警告訊息,我也是採用 redirect 加上 session 的方式來重繪表單。
-
What PHP Deployment Gets Right
說明一些 Apache + PHP 的佈署模式的觀念,不過我現在是有看沒有懂...等過一陣子再回頭來看好了。
-
PHP_SELF 常數可能帶來的危險。
-
How To HTTP-PUT A File Somewhere Using PHP
用 HTTP 協定的 PUT 指令來傳檔。
-
Creating Code Coverage Statistics with xdebug
利用 Xdebug 來建立程式碼覆蓋率的統計。
-
Limb 也是一個 PHP Framework (看起來像是俄國人的作品) 。
-
Understanding Destructors in PHP 5
介紹 PHP5 中的類別解構子。
-
Using suphp To Secure A Shared Server
用 suphp 來保護與大家共用的伺服器,不過速度上明顯比較慢。
-
Tokenization using regular expression sub patterns
看不太懂,但似乎有用,記下來先。
Zend Framework
-
Zend Framework - how a framework should be done
介紹 ZF 在 MVC 及其他方面所提供的功能。
-
Zend Framework Components Part 2: Zend_View
Zend_View 元件的簡介。
JavaScript
-
Using the assignment operator instead of the equality operator
這個技巧在 PHP 也常用到,底下的回應討論也滿值得看的。
jQuery
-
jQuery 1.2.2: 2nd Birthday Present
jQuery 1.2.2 釋出了, ericsk 有簡單的中文說明。
CSS
-
利用一堆的 b 標籤加上連結,模擬出 Image Map 的效果。
-
101 CSS Techniques Of All Time- Part 1 / Part 2
介紹多種 CSS 技巧。
-
三篇 CSS 文章的連結。
-
Results of the “What do you use to write your CSS?” Poll
大部份的開發者都是用 Dreamweaver 來寫 CSS ,因為既可手寫又有自動完成,方便又不失自由度。
-
用 CSS 來美化表單的一些文章。
-
建立一個美觀且易用的表單。
-
CSS 圓角技術文章的搜集。
-
利用 CSS 來裝飾按鈕。
-
Eric 大師又一次為我們帶來將瀏覽器預設樣式重置的 CSS 設定。
-
在 HTML4 Strict 模式下建立高度為 100% 的版型。
-
Simple CSS vertical menu Digg-like
簡單但還不錯看的垂直選單。
Web
-
Best Color Tools For Web Designers
很棒的色彩工具。
-
How-To: Use your Blog/Website as your OpenID URL
OpenID 的應用逐漸抬頭,連 Yahoo 都開始支援了。本篇介紹如何把 OpenID 整合到網站裡, ZF 也有相關的元件可以使用。
-
這個可以呼應家儒的「網頁設計不必無懈可擊」一文章,有關 Zoom 的部份。
Design
-
25 Beautiful, Minimalistic Website Designs - Part 2
一些滿獨特的設計風格。
-
How To Create a Stunning Vista Inspired Menu
用 Photoshop 製作 Vista 風格的選單。
RoR
-
10 Alternative Ruby Web Frameworks
10 個 RoR 的替代品。我一直以為 Rails 是 Ruby 上唯一的 Web Framework ,沒想到還有其他的產品。
Database
-
Deleting Duplicate Records in a Table
如何刪除在資料表中重複的紀錄。
Programming
-
結果我的 Trac 一直放在那邊沒在動...Orz
-
探討 JSON 是否比 XML 更適用於 Web 開發上?
-
這個網站分享了一此管理上的心得。
Software
Other
2008年01月16日
[PHP] mysql_query 的記憶體使用與分頁方式
說明
這個實驗主要是探討在 TWPUG 上的這篇 FIEND 寫的: [原創] [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版) 。
幾個實驗重點如下:
-
FIEND 提到兩次 Query 不是一個好方式,他的做法是用一次 Query 配合 while + mysql_result 就能做到分頁效果。
-
另外 shirock 從 PHP 原始碼的部份解釋 PHP 和 MySQL 抓資料後的處理方式,但 FIEND 卻說「用屁股想都知道 PHP 不可能把 QUERY 結果 全部拉回 PHP 端記憶體」。
- 還有 shirock 提到:「參考文章中已經很明白指出 mysql_query 跳過 PHP 內建記憶體配置機制,而直接使用 mysql C library 的函數儲存資料在 PHP 程序這端。而 memory_limit 只會管制到 PHP 內建記憶體配置機制的使用上限。所以 mysql_query 查詢大量資料時,不會受到 memory_limit 的限制。」
基本上我從來不知道屁股可以用來思考,所以我還是要實事求是,用 FIEND 的方法實驗一次。
註:不過我老是在上廁所時想到一些靈感...Orz
環境
- Windows XP
- PHP 5.2.5
- MySQL 5.0.45
- memory_limit = 16M (in php.ini)
另外我準備了一個資料庫,裡面包含了四個資料表:
| 資料表 | 筆數 | 硬碟空間 |
|---|---|---|
| r1000 | 一千筆 | 75KB |
| r10000 | 一萬筆 | 743KB |
| r100000 | 十萬筆 | 7,422KB |
| r1000000 | 一百萬筆 | 74,219KB |
資料表欄位為一個 id 欄位和一個 value 欄位;而 value 欄位為 varchar(64) ,其內容存的是兩個隨機的 md5 函式結果所組合的字串。可以用以下程式產生:
<?php
echo "CREATE DATABASE `page_test`;\n";
echo "USE `page_test`;\n";
foreach (array(1000, 10000, 100000, 1000000) as $r) {
$sql = <<<SQL
CREATE TABLE IF NOT EXISTS `r$r` (
`id` int(10) unsigned NOT NULL auto_increment,
`value` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
SQL;
echo $sql, "\n";
for ($i = 1; $i <= $r; $i ++) {
$value = md5(rand(0, 9999)) . md5(rand(0, 9999));
echo "INSERT INTO `r$r` (`value`) VALUES ('$value');\n";
}
}
程式
程式部份很簡單,就是按照 FIEND 說的步驟來寫的。只是我這裡改用 CLI 模式執行,以避掉 Apache 的影響。
<?php
echo ini_get('memory_limit'), "\n"; // 16M
echo "\n";
echo "========================\n";
echo "Start.\n";
echo "========================\n";
sleep(10);
$link = mysql_connect('localhost', 'username', 'password');
mysql_select_db('page_test', $link);
$result = mysql_query('SELECT * FROM r1000000', $link);
echo "\n";
echo "========================\n";
echo "mysql_query\n";
echo "========================\n";
sleep(10);
$count = mysql_num_rows($result);
echo 'count: ', $count, "\n";
echo "\n";
echo "========================\n";
echo "mysql_num_rows\n";
echo "========================\n";
sleep(10);
$start = rand(0, $count - 1);
$end = $start + 10;
$i = $start;
echo 'start: ' . $start, "\n";
echo 'end: ' . $end, "\n";
echo "\n";
while ($id = mysql_result($result, $i, 'id')) {
echo $i, ': ', $id, "\n";
$i ++;
if ($i >= $end || $i >= $count) break;
}
echo "\n";
echo "========================\n";
echo "while & mysql_result\n";
echo "========================\n";
sleep(10);
mysql_free_result($result);
echo "\n";
echo "========================\n";
echo "mysql_free_result\n";
echo "========================\n";
sleep(10);
mysql_close($link);
echo "\n";
echo "========================\n";
echo "mysql_close\n";
echo "========================\n";
sleep(10);
而記憶體的觀察我是用 Windows 的工作管理員,然後查看 php.exe 所使用的記憶體大小。在什麼都沒有執行的狀況下, php.exe 會佔用掉約 8MB 的記憶體 (在我的環境下) 。
結果如下 (每項執行 5 次後再取平均值) :
| 資料表 | 程式啟動 | mysql_query | mysql_num_rows | while & mysql_result | mysql_free_result | mysql_close |
|---|---|---|---|---|---|---|
| r1000 | 8,196KB | 8,592KB | 8,596KB | 8,656KB | 8,568KB | 8,556KB |
| r10000 | 8,196KB | 9,496KB | 9,500KB | 9,560KB | 8,592KB | 8,580KB |
| r100000 | 8,192KB | 18,840KB | 18,844KB | 18,904KB | 8,584KB | 8,596KB |
| r1000000 | 8,192KB | 110,684KB | 110,688KB | 110,748KB | 8,796KB | 8,784KB |
然後我比較 mysql_query 用掉的記憶體和原來資料表使用的硬碟空間:
| 資料表 | mysql_query | 硬碟空間 |
|---|---|---|
| r1000 | 396KB | 75KB |
| r10000 | 1,300KB | 743KB |
| r100000 | 10,648KB | 7,422KB |
| r1000000 | 102,492KB | 74,219KB |
很明顯地 mysql_query 所得到的 resource 佔的記憶體空間比 MySQL 使用的硬碟大小還多,這證明了 mysql_query 是有把資料內容抓到 PHP 這邊來;至於為什麼 MySQL 的反而比較小,我想這應該是 MySQL 將資料做壓縮的關係。
補充:我上面在 MySQL 壓縮的部份沒有任何根據,應該是錯誤的推論;因此我想就以 normansu 給我的說明為準:
應該不是.
執行 mysql_store_result 的時候,
在 result 和每一筆 record 都會多一個 Header 的空間,
大小不一定(看 field count).
所以使用的記憶體會比實際 mysql table 大.
在 source 中沒有看到任何 compress 的動作.
mysql 的這個流程讓我嚇一跳,
以往大部份用的是 mssql 和 oracle,
在 client 和 server 間的 data cache 機制都做得比較好,
看起來 mysql 像是把結果算出來後就直接全部丟出來.
所以使用 mysql 要比用 mssql 或oracle 要來得更小心一點.
然後由於在上面的實驗裡我已經將 php.ini 的 memory_limit 設為 16M ,也用過 php -i 檢查過了。但在執行一百萬筆測試時,卻沒有受到任何影響,因此也證明了 shirock 說的「所以 mysql_query 查詢大量資料時,不會受到 memory_limit 的限制。」
結論
從上面的實驗可以看到一次 Query 並取得資料總筆數雖是可行的,但這個前提是建立在 mysql_query 已經把資料內容全部放到 php.exe 的記憶體中。除非我誤解了 FIEND 的意思,不然他的作法看起來實在不適用於他所說的「存取大量資料的環境」。
所以一般常見的做法是採用就是 tokimeki 提到的兩次 Query 的方式,第一次先利用 SQL 的 COUNT() 指令取得我們所需要的總筆數,第二次再配合 LIMIT 去取得我們所要的資料。不用 LIMIT 的後果就是每當執行一次 script ,我們就要冒著記憶體使用量爆增的後果。
註:雖然 MySQL 有 Query Cache ,但對 php 端已經爆增的記憶體也於事無補了。
而我也贊成 tokimeki 說的:「另外之二,假設內容資料是非常龐大的,且必須利用查詢內容作某些運算(例如:矩陣運算之類的),那麼這樣的應用不該由PHP程式來完成,應由其他的方式來作計算(例如:資料庫作OLAP或是Server上某個用C/C++寫的程式定期跑),Web這邊只做顯示以及計算排程即可。」
其他不想多說了,被某人看不起也不是一天兩天的事了。我自知自己還有很多東西要學,而這些還有望其他高手前輩們給予我指教。
不過最後這個實驗也證明一件事:屁股不是用來想事情的。
2008年01月15日
[PHP-ZF] 初探 Zend_Db_Table Relationships (三)
前面我已經知道如何設定 Zend_Db_Table 的關連,這次來記一下串聯刪除 (cascading delete) 。
cascading delete 主要的目的是這樣的:假設 a 資料表和 b 資料表間有關連 (a.id = b.a_id) ,而當 a 資料表的某紀錄被刪除後,會使得 b 資料表中的相關紀錄失去作用而需要一併刪除。多數主流的資料庫系統都會內建類似的功能,例如 Oracle 、 MSSQL 及 PostgreSQL 等。但像是 MySQL 4.x 以前 的 MyISAM 格式並沒有提供 foreign key 和 trigger ,所以也沒辦法內建 Cascading Delete 時,這時只好從程式裡來著手。
不過有一點要小心,就算資料庫系統有支援 cascading delete ,也必須在資料表定義 foreign key 時設定 cascading delete 的相關指令 (通常是 ON DELETE CASCADE) ;不然資料表還是不會知道要去刪掉對應的紀錄。
註:以上資訊有錯誤的話,煩請大家不吝指正。
延續上一次的程式碼,這次我要為它們加入 cascading delete 的功能。
範例下載
不提供了,請下載上次的範例照以下說明修改吧。
說明
刪除文章時同時刪除文章與標籤之間的關連
首先我們在 Articles 這個類別中,加入一個 $_dependentTables 屬性:
<?php
class Articles extends Zend_Db_Table_Abstract
{
// ... 略 ...
protected $_dependentTables = array('ArticlesTags');
}
這個 $_dependentTables 必須給它一個陣列,這個陣列要包含你要串聯刪除的資料表類別名稱 (此例即為 ArticlesTags 這個類別) 。
接下來打開 ArticlesTags 這個類別,在原本的 $_referenceMap['Article'] 關連中,再加入一個 onDelete 索引:
<?php
class ArticlesTags extends Zend_Db_Table_Abstract
{
protected $_referenceMap = array(
// ... 略 ...
'Article' => array(
'columns' => array('article_id'),
'refTableClass' => 'Articles',
'refColumns' => 'id',
'onDelete' => self::CASCADE,
),
);
}
onDelete 的值固定就是用 self::CASCADE (其他值就不會動了) 。
註:別忘記原來 $_referenceMap['Article'] 所指定的意思,它是指 articles_tags 這個資料表的 articles_id (columns) 這個欄位要對應到 Articles (refTableClass) 這個資料表類別的 id 欄位 (refColumns) 。
這樣設定好後,就完成串聯刪除的動作了,很簡單吧?不過有一點非常重要:那就是一定要用 Zend_Db_Table_Row 的 delete 方法來刪除紀錄,才能啟動串聯刪除!
舉個例子:假設現在有兩篇文章,標題分別是 jQuery 和 Prototype ;現在我為它們都下了 javascript 和 ajax 兩個標籤。現在資料表紀錄如下:
| id | category_id | title |
|---|---|---|
| 3 | 2 | jQuery |
| 4 | 2 | Prototype |
| id | name |
|---|---|
| 3 | javascript |
| 4 | ajax |
| article_id | category_id |
|---|---|
| 3 | 3 |
| 3 | 4 |
| 4 | 3 |
| 4 | 4 |
註:請依照上面的例子,先在 articles 、 tags 及 artices_tags 三個資料表分別加入相關的紀錄。
接下來在 IndexController 中,加入一個 deleteAction 方法:
<?php
class IndexController extends Zend_Controller_Action
{
// ... 略 ...
function deleteAction()
{
// 不顯示畫面
$this->getHelper('ViewRenderer')->setNoRender();
$articleTable = new Articles();
// 有找到才刪
if ($articleRow = $articleTable->find(3)->current()) {
$articleRow->delete();
}
}
}
現在瀏覽一下 http://localhost/example3/index/delete (實際位置請按照各位的環境自行輸入) ,畫面應該不會出現任何資訊。現在到資料庫觀察一下,應該會發現 articles 資料表的第 3 筆紀錄已經被刪除;再看看 articles_tags ,在 article_id 為 3 的紀錄也跟著一併被刪除了。這樣就完成串聯刪除啦!
再整理一次重點:
-
在要刪除紀錄的資料表類別裡定義 $_dependentTables 。
-
在要串聯刪除紀錄的資料表類別裡定義 $_referenceMap[關連的名稱] 的 onDelete 屬性。
-
要使用串聯刪除,一定要用 Zend_Db_Row 的 delete 方法。
2008年01月12日
[Web] 連結分享
PHP
-
Create a Facebook Application With PHP
搜集一些教你如用 PHP 開發 Facebook 應用的文章。
-
HTML Purifier 的介紹可以參考: HTML Purifier - 另類的 PHP input validation ; Mark 也打算換用它了,因此有打算讓 User 放 HTML 的話,可以考慮看看。
-
Once upon a time there was Smarty!
國外那本 Smarty 書的作者也要脫離 Smarty 的魔掌了。當然 Smarty 是有它的缺點存在,不過大家似乎只針對它的語法來討論,石頭成也寫過類似的話題 (其實更早之前就有一篇 Beyond The Template Engine 就已經有這個想法了 ) 。然而如果今天你得用一堆的函式來處理問題時,那和學語法有什麼兩樣?不過我個人也是認為 Smarty 也必須重新檢視語法的問題,至少在物件導向的部份要多多加強。後續參考:Smarty "revelations" 、 Another Smarty Emigrant
不過說真的,我個人很討厭還要寫個 <?php echo $this->escape($this->xxx); ?> 之類的語法,遠不如 {$xxx} 來得簡單易懂。
-
This is why PHP is better than ROR (for me)
跟作者一樣,雖然我不討厭 RoR ,但是 Ruby 的魔幻語法實在讓我難以下嚥...死腦筋的我對非 C style 的語法始終有點距離,要學會的話會比其他人來得吃力些 (Ruby 之父的書我到現在還沒看完) 。
-
Sorting 2D-arrays in PHP - anectodes and reflections
排序二維陣列。
-
10 個對 PHP 的迷思。的確一般開發者對 PHP 就是有偏頗的印象,不過這也許是因為 PHP 從出生時就不被定義成一個語言有很大的關係。
-
直到最近,我才真正瞭解 MAX_FILE_SIZE 的用途。現在我在我的專案裡已經把它自動化了。
-
有需要開發 Web Service 的話,這個網站不錯參考。
-
PHP Large result sets and summary tables.
介紹 PHP 中原生的 mysql_xxx 函式在處理大資料集時的問題。
-
PHP vs. BIGINT vs. float conversion caveat
介紹 PHP 的數值型態在不同平台上的轉換問題。
Zend Framework
-
把領域邏輯放在 Row 裡面,事實上我也開始這麼做了。
-
php|architect Announces 'Programming with the Zend Framework'
另一本 ZF 的英文書。
-
Zend_Form and 2 step view demo
簡介了 Zend_Form 和 Zend_Layout 的一些連結...對我來說有點來不及了...我自己已經實作了一些專案常用的方法了。
-
ZF 1.0.3 要直接跳 1.5 了,這裡有 1.5 的釋出計畫。比較重要的當然是 Zend_Build/Zend_Console 囉。
JavaScript
-
又是一堆奇技淫巧。
-
Using Prototypes in Javascript
雖然說 Prototype 用起來很像繼承,但實際上運作起來跟繼承還是有差別的。
-
JavaScript Libraries By Comparison
各家 JavaScript Library 在不同面向的比較表。
-
Style Your Website's Search Field with JS/CSS
很棒的表單技術,可以參考看看作法。
-
Firefox 3 可以讓 XMLHttpRequest 可以跨網域執行?會不會有 XSS 的問題?觀注中...
-
這個很方便喔,如果有壓縮過的 JS 程式,可以拿來這裡試試看;當然使用 eval 壓縮法的 JS 程式就不行了。
-
可以在線上立即開啟一個 JS 的執行環境。
-
Transitioning from Java Classes to JavaScript Prototypes
將 Java 的 Class 和 JavaScript 的 Prototype 做一個對照。
jQuery
-
真是漂亮的分頁套件。
-
jQuery - Altering Layout Based On Dimensions
太長的話就隱藏起來,再加上個下方導覽列。這個做法還滿讚的。
-
AOP 的大意是說可以在不破壞目前的程式狀況下,切入一些功能 (可能在動作的之前或之後) 。
-
官方網站竟然還沒有相關的訊息?還是我眼拙?不過我已經從 SVN 拉出來用了。
CSS
-
Advanced CSS Printing — Using CSS Page Breaks
在列印時,利用 CSS 做分頁。
Web
-
A blog about technology, programming, engineering and my personal interests.
站長把自己寫過的文章整理了一下,我覺得這樣還不錯,有空我也會整理一下我自己寫過的文章。
-
都還滿有參考價值的,對岸的朋友功力真的不容小覷 (雖然有些是譯文) 。
-
Automatically Version Your CSS and JavaScript Files
可以參考宗董的介紹:自動幫 Javascript / CSS 檔加上版本編號。
-
I can make your site run 10 times faster
讓網站加速的一些技巧。分別從 DB 層、伺服端程式、前端程式及 Web 伺服器上說明。
-
格式化 JSON 的工具,可以直接輸入 JSON 內容或輸入會回傳 JSON 的網址。
-
Grails Making Java Developers Forget about Rails
Java 陣營推出了 Grails 來反攻 RoR ,還有這篇可以參考: 10 Reasons to Switch from Rails to Grails 。
-
不熟 Linux 的我,真的要好好學一下關於權限的部份。
Browser
-
2008: the year of the layout engine
介紹 2008 年瀏覽器使用的排版引擎。
Database
-
滿有價值的參考文章。
SQL
-
Why paging needs a lot of performance
對呀,如果已經算過 COUNT(*) 了,為什麼不把它 Cache 起來呢?至少在不常更新資料的狀況下,這樣的做法可以減少一些 Loading ...
而且就算有更新,一般來說筆數其實也不會一下子就超過每頁筆數,這樣所需要的總筆數就不用太精準。
Programming
-
50 Great CS Books Recommended by Book Pool
一堆軟體開發的書單。
-
記下來,以後或許有用。
-
Frameworks Round-Up: When To Use, How To Choose?
介紹 Framework 的概念,並簡介各語言的 Framework 。
-
Top 5 developer benefits of agile development
敏捷開發所帶來的好處。
-
沒用過 SVK ...我想這可能是因為我很少到深山泡溫泉的關係吧。 XD
Software
2008年01月7日
dean 的 IE7 Library 釋出新版
完整文章連結:IE7.js version 2.0 (beta)
這次從 0.9 直接跳到 2.0 beta ,而且拆成了 IE7.js 和 IE8.js 兩個部份。
IE7.js 把功能只精簡到微軟正牌 IE7 有實作的部份,其他加強的部份就移到 IE8.js 上了 (因為 IE8 已經趕上 Web 標準了) 。其他修正部份如下:
- The IE7 project is now hosted on googlecode (I got fed up with SourceForge).
- IE7 is no longer modular. Instead I’ve merged the scripts into two: IE7.js and IE8.js
- IE7.js includes only fixes that are included in the real MSIE7 browser.
- All other enhancements are moved to IE8.js.
- IE7 is now much smaller (11KB gzipped).
- IE7 is now much faster (it uses the selector engine from base2.DOM)
- There are no dependencies on other files (except blank.gif)
- You can hotlink IE7/IE8.js directly from Google’s servers (usage instructions below)
- The fix for base64 encoded images is no longer included
看起來不錯喔,有興趣的朋友不妨試一下。
2008年01月4日
[Web] 連結分享
PHP
-
PHP 4: So long, and thanks for all the fish
PHP 4.4.8 釋出了,在 2008-08-08 號前如果沒有安全性議題的話,它可能就是 PHP4 的最後一個釋出版本了。而我們因為 Zend Framework 的關係,已經投向 PHP5 的懷抱很久了;但我還是要說: PHP4 ,謝謝你對 Web 的貢獻!
-
PHP: Compiling mysqlnd with PHP 5.2/5.3/6.0
在編譯 PHP 時,加入 mysqlnd 的功能。
-
這個是 Zend Framework in Action 一書的 Blog ,裡面也會有一些不錯的 ZF 資訊。
JavaScript
-
Add and Remove Elements with JavaScript (reprise)
一個很簡單的 DOM 和 Event 教學,也可以算是一個超輕量級的 JS Library 。
-
線上編輯器,不過它是一個專門用來編輯「程式碼」且擁有語法多色顯示的編輯器。
-
PHP to Javascript Project: php.js
把 PHP 的函式移植到 JavaScript 上,目前為止已經有 8 個函式已經實作出來了。
-
JavaScript, Regex, and Unicode
在不同瀏覽器中, JavaScript 的 Regex 並不是把所有特殊字元類組或其他相關語法都是視為 Unicode 來處理。本文探討了這些字元類組在遇到 Unicode 字元時,會採取何種處理方式。
-
JavaScript: It's Just Not Validation!
JavaScript 主要的目的是輔助使用者輸入正確資料,而不是用來驗證使用者的資料。
-
不錯的方法,不過 document.write 不適用在 DOM 上,得另外想個方法解決。
jQuery
-
How to Use the Same Server-Side Code to Validate Form Data With or Without AJAX Using jQuery
概念很有趣,主要是讓所有驗證工作交給 Server 端 (其實也應該要) 。然後不論有 Ajax 或沒有 Ajax 的環境下,都要能正常工作。這個方向也是我目前正在做的表單驗證部份,雖然這樣 Server 的 Loading 會重一點,但也沒辦法,因為 Client 端傳來的資料是不能相信的。
CSS
-
20 Websites With Unique Layouts
20 個有獨特排版方式的網站,大部份都跳脫了我們所謂「欄」的設計方式。
-
9 Timeless 3 Column Layout Techniques
9 個很經典的 3 欄排版技術,文章中以固定及浮動來區分它們,而且也介紹了幾篇教學文章。
-
Understanding CSS Colour modes
介紹了 CSS2 和 CSS3 中一些有關處理顏色方面的資訊。 (如連不上的話,請多重新整理幾次)
-
CSS Skill Level Survey RESULTS
上次提過的 CSS 技術等級調查有結果了,不意外的 3 、 4 級的人數是最多的。而神的境界 (Level 6) 竟然有 30 人之多...太強了!
-
Introducing a new way to minify CSS
CSS Minifier 和 CSSTidy 很像,都是用來縮減 CSS 碼的工具。
-
滑鼠移過連結時,會讓底下的虛線變成會動的動畫。文章回應裡有人提到可以把靜態的部份和動態的部份放在同一張圖上 (類似 CSS Sprite) ,這也是不錯的 Idea 。
Web
-
Top PHP, MySQL, and CSS Resources
對新手來說,這些是不錯的參考資源。
-
這篇探討 Web 標準的未來,不過最可怕的魔鬼還是微軟。 (XD)
-
從第二段以後感覺就變成能 Zoom 就叫無懈可擊?除此之外,這篇的其他論點還滿值得參考的。
Database
-
MySQL Table Prefix Changer Tool in PHP
幫你在資料表更換 prefix ,測了一下,在一開始沒有 prefix 的狀況下會有 Bug 。解決方式:
找到:
function replace_prefix($s, $prefix) { $pos = strpos($s, "_"); $s = substr($s, $pos + 1); $s = sprintf("%s_%s", $prefix, $s); return $s; }改成:
function replace_prefix($s, $prefix) { $pos = ($pos = strpos($s, "_")) ? $pos + 1 : 0; $s = substr($s, $pos); $s = sprintf("%s_%s", $prefix, $s); return $s; } -
How do you store a tree in a database table?
如何把樹狀結構存在資料表裡?一般是加入一個 parent id ,本文則是把從父節點到根節點的所有 id 都存在一個欄位裡,並介紹如何用程式去處理它們之間的對應關係。 kiang 和 tokimeki 也討論過類似的問題,請參考:你還在用遞迴產生樹狀結構嗎?
Programming
-
The Declarative Factory Pattern
不甚瞭解,看起來很類似抽象工廠。
-
雖然 Java 不是我的飯碗,不過裡面的討論還是值得關注一下。另外後續還有這篇:版本控制,版本升級是不是個問題?
