Drupal網站的Views功能相對強大,特别是對于SQL不太熟悉的朋友來說Views的Web界面非常方便,而且數據庫查詢功能一點不弱,用Drupal這麼多年了不能用Views實現的查詢功能極少極少,但也還是存在用Views不好實現的場景,例如我遇到的:
- 跨站之間的查詢之一,用Views隻能查詢同一個Drupal網站内的表,我當時隻好用SQL語句來實現需要的查詢;
- 跨站之間的查詢之二,不使用同一台數據庫服務器的情況,或者不是兩個同類型的網站,例如一個是微信小程序,一個是Drupal網站,這時可以用Json數據的API調用來解決,當然提供Json數據的Drupal網站還是可以用Views來實現Json數據的輸出;
- 比較少見的記錄數據,例如“IP地址查詢”中需要判斷變量所在的數據庫記錄範圍段,用Views勉強可以實現變量比較,但不夠靈活、效率也低,後來采用了讀取文件中的文本數據進行對比的辦法,完全抛棄了數據庫;
- 比較少見的條件查詢,例如“國語小字典”中需要做“拼音索引”,而遇到多音字的情況下,拼音字段就可能包含多個拼音,中間用空格分隔,嘗試了用Views但怎麼也沒搞出來。
後來與同事商量後,用SQL語句才解決,源代碼如下:
......
$output = '';
$fields = '`danzi`,`pinyin`,`pinyinqushengdiao`,`zhuyin`';
$table = 'dict_mini';
$sql = "SELECT $fields FROM $table WHERE `pinyinqushengdiao` = '$pinyin' or `pinyinqushengdiao` like '$pinyin %' or `pinyinqushengdiao` like '% $pinyin %' or `pinyinqushengdiao` like '% $pinyin'";
$query = db_query($sql);
$result = $query->fetchAll();
$output .= "<table>\n";
$output .= "<tr><th>序號</th><th>單字</th><th>拼音</th><th>拼音(無聲調)</th><th>注音</th></tr>\n";
foreach ($result as $key => $value) {
$danzi = $value->danzi;
$pinyin = $value->pinyin;
$pinyinqushengdiao = $value->pinyinqushengdiao;
$zhuyin = $value->zhuyin;
$url = l($danzi,"danzi/$danzi");
$number = $key + 1;
$output .= "<tr><td>$number</td><td>$url</td><td>$pinyin</td><td>$pinyinqushengdiao</td><td>$zhuyin</td></tr>\n";
}
$output .= "</table>\n";
return $output;
......
這段代碼實現的效果請看“拼音: he”,無論拼音he是單音字的唯一拼音還是多音字的多個拼音之一(位于前中後都可以),上面紅色的SQL語句是關鍵,可以看出Where條件中列出了4種可能,這在Drupal的Views裡面還真不好實現。
以前剛用MediaWiki和Drupal的時候,對MySQL、PHP都還不太了解,現在逐步了解了,确實不用都是用Drupal或第三方擴展程序提供的現成構架,某些複雜情況下直接用PHP代碼、SQL語句來實現更簡單高效。
评论