首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Perl DBI 命令列實戰:多格式目錄產生、會員續費通知與資料編輯

     編輯:MySQL 資料庫相關知識

專案目標與腳本規劃

本章完成「歷史同盟」四大命令列任務:

  1. gen_dir:多格式(banquet/RTF/HTML)產生會員目錄。
  2. need_renewal + renewal_notify:兩階段會員到期通知。
  3. edit_member:互動式會員資料編輯(含新增)。
  4. interests:關鍵字搜尋共同興趣會員。

可擴展架構:gen_dir 的轉換盒模式

核心邏輯:


my %switchbox = (
  banquet => { init => \&banquet_init,  entry => \&format_banquet_entry, cleanup => \&banquet_cleanup },
  rtf     => { init => \&rtf_init,      entry => \&format_rtf_entry,      cleanup => \&rtf_cleanup },
  html    => { init => \&html_init,      entry => \&format_html_entry,      cleanup => \&html_cleanup },
);

執行流程:

  1. 命令列第一參數決定格式,查 %switchbox 取得函式參考 $func_href。
  2. 呼叫 $func_href->{init}()。
  3. 執行查詢,迴圈 fetchrow_hashref() 逐行呼叫 $func_href->{entry}($row_ref)。
  4. 呼叫 $func_href->{cleanup}()。

新增格式只需寫三個函式並加入 %switchbox,零修改主流程。

三種輸出格式實作細節

1. 宴會名單(純文字)

  • 僅需 format_banquet_entry():組合姓名、後綴(Jr./Sr. 加逗號,II/III 僅空格)。
  • 共用 format_name() 供 RTF/HTML 複用。

2. RTF 富文本目錄

  • 最小 RTF 框架:{\rtf0\fonttbl{\f0 Times;}\plain\f0\fs24 ... }。
  • 每欄位一行,標題粗體(\b Title\b0),段落結束 \par。
  • 地址欄位動態組合(街道、城市、州、郵遞區碼),缺漏欄位自動跳過。

3. HTML 靜態目錄

  • 初始化輸出 <html><body><h1>...,清理輸出 </body></html>。
  • 項目函式複製自 RTF 版,將控制碼換為 HTML 標籤(<b>、<br>),並用 escapeHTML() 處理特殊字元。
  • 產出 directory.html 置於 Apache htdocs,配合 cron 定時更新(如每天 04:00)。

會員續費通知:兩階段設計

階段一:need_renewal 產生名單


SELECT member_id, last_name, first_name, expiration,
       DATEDIFF(expiration, CURDATE()) AS days_left
FROM member
WHERE expiration < DATE_ADD(CURDATE(), INTERVAL ? DAY)
ORDER BY days_left;

cutoff 天數由命令列給定(0 表示已過期)。輸出含 days_left(負值=已過期),導向檔案供人工審核。

階段二:renewal_notify 發送郵件

  • 支援三類參數:會員 ID、Email、檔案名(含 ID/Email 列表)。自動去重(同 Email 多 ID 時警告跳過)。
  • 開啟 sendmail 管道(open(MAIL, "|$sendmail"))推入郵件內容。
  • 無 Email 會員輸出警告,改用電話/郵寄聯繫。

互動式會員編輯:edit_member

  • 無參數 → 新增模式:提示各欄位(col_prompt()),INSERT 新紀錄。
  • 帶 member_id → 編輯模式:先查現有值,提示時顯示當前值(col_prompt(..., $show_current=1)),直接 Enter 保留原值,輸入新值則 UPDATE。
  • 到期日欄位加簡易日期格式驗證(^\d{4}-\d{2}-\d{2}$),NULL 代表終身會員(空字串會變 0000-00-00 需特殊處理)。
  • 進階建議:僅更新已變更欄位、樂觀鎖防併發衝突。

共同興趣搜尋:interests

  • 命令列參數作為關鍵字,自動加 % 變 LIKE '%keyword%'。
  • 多關鍵字依序查詢,結果以 format_entry()(去除 RTF 控制碼版)格式化輸出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved