用php编写室友通讯录_使用 XML 和 PHP 创建一个更具适应性的电话簿和通讯录
使用 XML 和 PHP 創建一個更具適應性的電話簿和通訊錄
使用 XML 為您的電話提供一個一致的通訊錄
Colin Beckingham
2011 年 5 月 09 日發布
您需要與聯系人隨時保持聯系 — 即使在出差途中。在辦公室,可以使用您的桌面 VoIP 電話;出差途中,可以使用智能電話。但每臺設備都要求其電話列表采用一種特殊格式,每臺設備都有自己的、格式與眾不同的通訊錄或電話簿。如果有必要,可能需要輸入您的所有聯系人兩次 — 每個通訊錄一次 — 每次變更聯系人時,都需要同時在兩個列表中進行更改。毫無疑問,您肯定希望這兩部電話從同一個后端數據源獲取數據,這樣您就只需在一個地方編輯姓名和電話號碼。這不成問題:只要能訪問互聯網或內聯網。在本文中,了解如何使用一個 MySQL 數據庫中的數據向兩個完全不同的設備提供聯系信息:一部通過 snom 300 系列設備標識的 VoIP 電話和一個采用 Nokia E71 設備形狀的智能電話(參見 參考資料 中的鏈接)。
桌面設備:snom 300 系列
常用縮略詞HTML:超文本標記語言
HTTP:超文本傳輸協議
LAN:局域網
LDAP:輕量級目錄訪問協議
SQL:結構化查詢語言
VoIP:IP 語音傳輸
XML:可擴展標記語言
snom 300 系列提供優質穩定的 VoIP 電話,這些電話擁有廣泛的辦公功能,比如等待、轉接和電話會議。這類電話的確擁有對來自 LDAP 服務器的數據提要的原生支持,它還擁有一個能閱讀 HTML 的微型瀏覽器(參見 參考資料)。它甚至能以一種能夠觸發電話呼叫的格式在電話屏幕上顯示文本。
清單 1 展示 snom 微型瀏覽器需要(特別是在電話簿上下文中)的 XML 格式的示例。
清單 1. snom XML 微型瀏覽器示例<?xml version="1.0" encoding="UTF-8"?>
PhoneList - SnomFriend, First
555-456-7890
Person, Second
555-654-0987
F1
Dial
F_ENTER
在這段代碼中,根元素 SnomIPPhoneDirectory 擁有 3 個不同子元素:Title、DirectoryEntry 和 SoftKeyItem。標題位于電話顯示的頂部,滾動過程中不間斷顯示。標題下方是目錄條目 — 每行一個條目 — 且能夠滾動。這些軟鍵項目關聯到顯示下方的 4 個按鈕。這些能執行一些功能,比如對當前突出顯示的目錄條目發起一個呼叫。這個示例中的數據包含兩個電話號碼條目:一個顯示姓名和一個用于撥號的號碼。它只激活一個按鈕:按下 F1 按鈕,電話就開始撥號。
旅行設備:Nokia E71 智能電話
Nokia E71 設備是一個典型現代智能電話示例。它能夠連接無線 WAN 或移動電話服務,擁有一個 Session Initiation Protocol (SIP) 客戶端,能使用自己的本機瀏覽器瀏覽 Internet,并以移動方式管理語音通信。
E71 設備支持 Wireless Application Protocol (WAP) 版本 2.0(WAP2 — 參見 參考資料)— 不要與 Wi-Fi Protected Access II (WPA2) 功能混淆。這意味著它能閱讀 XML 格式文件,這類文件在電話內部與各種專業功能通信,比如打開一個窗口來發起一次呼叫。
清單 2 展示了這種智能電話需要的 WAP2/XML 格式內容示例。這個示例使用 清單 1 中顯示的那兩個虛構條目。
清單 2. WAP2 XML 示例<?xml version="1.0"?>
/p>
"http://www.wapforum.org/DTD/wml_1.1.xml" >
Tel (WTAI): Friend, First
Tel (WTAI): Person, Second
WAP2 要求以卡片組的形式顯示數據。根元素 擁有一個子元素 (或頁面),該子元素有兩行,通過一個換行符分隔。這個頁面的標題在這個根元素的一個屬性中列示。這些電話號碼在一些錨點元素(即 )中列示,有一個 屬性使用 Wireless Telephony Applications Interface(WTAI — 參見 參考資料)。當您打開電話的瀏覽器中的頁面并單擊一個電話鏈接時,一個窗口將彈出并詢問您是否要呼叫這個號碼,這時電話找到一條路徑來路由呼叫 — 無論是通過一條無線 LAN 還是使用另一個電話訂閱。
由于智能電話沒有處理 LDAP 的原生能力且桌面電話不能處理 WAP2,它們似乎沒有什么共同點。但是,編寫腳本通過使用 XML 的適應性提供了一種解決方案。您可能會找到一種方法,通過智能電話同步您的聯系人和 LDAP 服務器,但這種方法可能不如直接訪問信息那么簡捷。幸運的是,盡管 XML 的格式在這兩種架構之間可能會更改,但數據在根本上是相同的。
解決方案
鑒于這兩種設備均可隨時隨地訪問 Internet,實現一個通用電話簿的解決方案是將所有數據放置在一個數據庫中,然后使用一個腳本引擎生成一個 XML 文件,并將其傳遞給您認為最方便的設備瀏覽器。另外,這個腳本能根據需要控制訪問權并過濾要交付的信息。
數據庫
數據可以存儲為各種格式并根據需要提取,包括 PostgreSQL、XML、純文本、IBM? DB2? 等。清單 3 展示了一個 MySQL 樣例架構。
清單 3. 示例數據庫架構CREATE TABLE IF NOT EXISTS 'mycontacts' (
'id' int(11) NOT NULL auto_increment,
'firstName' varchar(30) default NULL,
'lastName' varchar(30) default NULL,
'number' varchar(20) default NULL,
PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
這個表只包含 4 個字段 — 一個 ID、姓名、電話號碼 — 以及一個索引。該架構顯示了所需要信息的關鍵組成部分。可以根據需要進一步添加字段和索引。可以根據需要采用您選擇的 LibreOffice Base 或 phpMyEdit(參見 參考資料)編輯器編輯數據內容。
PHP 生成器
清單 4 展示了一個從后端獲取數據并以純文本格式顯示輸出的基本腳本。此時,您只是測試腳本,確保它返回合理的數據。
清單 4. 基本數據庫生成器<?php
$dev = "";
$db_host = "your.database.server";
$db_user = "your_user";
$db_pass = "your_password";
$db_name = "your_database";
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
if (mysqli_connect_errno()) show_err($dev,"Could not connect to database");
$query = "SELECT * FROM mycontacts order by lastName asc";
$result = $mysqli->query($query);
$num = $result->num_rows;
$i = 0;
while ($row = $result->fetch_array()) {
$myarr[$i]['first']=$row["firstName"];
$myarr[$i]['last']=$row["lastName"];
$myarr[$i]['phone']=$row["number"];
$i++;
}
$mysqli->close();
switch ($dev) {
case 'snom':
echo mysnom($myarr);
break;
case 'noki':
echo mynoki($myarr);
break;
default:
echo mytest($myarr);
break;
}
function mytest($myarr) {
$cont = "Header\n";
foreach ($myarr as $a) {
$cont .= " ".$a['first']." ".$a['last']." ".$a['phone']."\n";
}
$cont .= "Footer\n";
return $cont;
}
function show_err($dev,$msg) {
die($msg);
}
?>
這段代碼首先定義用于訪問數據庫的變量,打開一個連接,返回一個結果集或一條錯誤消息(如果不能連接到數據庫的話)。然后,一個 while 循環迭代數據集,在一個方便的數組中存儲信息以便將來進行顯示。由于設備變量 $dev 被初始化為一個長度為零的字符串,因此,當 switch 執行時,它將切換到默認值并調用 mytest() 函數。這個函數將顯示一個簡單的標題,寫出數組內容,然后打印一個頁腳 — 全部采用純文本格式。
這個腳本只處理一個可能的錯誤:數據庫連接故障。您應計劃處理其他情況,比如成功連接到數據庫但發現一個空表。您可以使用 show_err()
函數調用之類的調用捕獲并處理這些情況。
大多數組件都已就緒,可以泛化這個腳本,處理其他設備類型。switch 擁有針對這兩種電話的情況,但它們的功能還不存在。現在的問題是如何使輸出與其他目標設備相關,根據需要添加 XML 格式的細節。
桌面微型瀏覽器
對照 清單 1 中的示例,您將看到,清單 5 中的函數添加了必要的組件來處理桌面 VoIP 電話。
清單 5. 處理桌面微型瀏覽器的函數function mysnom($myarr) {
$cont = "<?xml version=\"1.0\"?>
MySQL Directory";foreach ($myarr as $a) {
$cont .= "
".$a['first']." ".$a['last']."
".$a['phone']."
\n";
}
$cont .= "\n";
return $cont;
}
function show_err($dev,$msg) {
switch ($dev) {
case 'snom':
echo "<?xml version=\"1.0\"?>
$msg
";
break;
default:
echo $msg;
break;
}
die();
}
對比 清單 5 和 清單 4,您會發現,這些新函數并不回顯純文本,而是回顯微型瀏覽器預期的元素中封裝的數據。mysnom() 函數是腳本的一個新增函數,show_err() 函數是一個替代函數。
微型瀏覽器不能顯示純文本:它什么也不做。因此,常規和異常輸出都需要 XML 輸出。由于您正在使用電話,因此電話也是錯誤消息必須顯示的地方。如果出現數據庫連接故障,腳本將向電話報告錯誤。如果成功連接,則在 while 循環開始之前,腳本應聲明根元素。循環進行時,每條記錄都被封裝到記錄自己的目錄條目標記中;循環完成后,按鈕的設置就開始了。由于只有 4 個按鈕,是否也需要在數據庫中對其進行編碼還存在疑問。最后,代碼結束了根元素。
上述函數要正常工作,必須在代碼開頭按如下方式正確設置變量 $dev:$dev = "snom";
智能電話 WAP2
如果是 Nokia 電話,則需要提供一些輸出細節,它們通過 WTAI 引用以 WAP2 格式向智能電話提供 XML。清單 6 顯示了相關代碼。
清單 6. 處理智能電話 WAP2 的函數function mynoki($myarr) {
$cont = "<?xml version=\"1.0\"?>
"-//WAPFORUM//DTD WML 1.1//EN\"
\"http://www.wapforum.org/DTD/wml_1.1.xml\" >
\n
\n";
foreach ($myarr as $a) {
$cont .= "\nTel (WTAI):
".$a['last']." ".$a['first']."
";
}
$cont .= "\n";
return $cont;
}
同樣,這段代碼向 Nokia 電話提供必要的 XML。如果出現數據庫連接錯誤,文本輸出不需要封裝到任何標記中,因為簡單輸出無需任何標記即可在此電話上正確顯示。當電話簿條目被顯示時,在循環開始之前,腳本發送 XML 和 DOCTYPE 信息,然后是 根元素和 元素的開始標記。然后,循環開始,顯示封裝在 WTAI 信息中的每條記錄。最后,代碼結束 card 元素和 根元素。
上述函數要正常工作,必須在代碼開頭按如下方式正確設置變量 $dev:$dev = "noki";
請注意,Nokia E71 通訊錄的解決方案建議并不打算完全替代原有聯系人應用程序,后者作為電話系統的一部分,肯定有一定優點,因此能與其他應用程序形成緊密的內部連接。但是,原有通訊錄可以使用同一流程從同一 MySQL 數據庫生成,但生成 vCard (VCF) 文件格式(參見 參考資料)的中間輸出,這樣便于導入電話。
檢測設備
這個問題的最后部分是讓腳本在運行時了解需要哪種設備輸出。可以通過幾種方法完成此任務,其中一種方法是在 HTTP 請求查詢字符串中發送 GET 信息。假設您發送以下請求,顯式聲明一個設備和一個用戶:http://www.myserver.tld/phonebook/myscript.php?device=snom&user=jim
然后,清單 7 中的最終腳本解析查詢字符串并在運行時將信息插入腳本。
清單 7. 檢測設備<?php
if ($_GET['user'] != 'jim') show_err($dev,'Unauthorised access');
$dev = $_GET['device'];
$db_host = "your.database.server";
$db_user = "your_user";
$db_pass = "your_password";
$db_name = "your_database";
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
if (mysqli_connect_errno()) show_err($dev,"Could not connect to database");
$query = "SELECT * FROM mycontacts order by lastName asc";
$result = $mysqli->query($query);
$num = $result->num_rows;
$i = 0;
while ($row = $result->fetch_array()) {
$myarr[$i]['first']=$row["firstName"];
$myarr[$i]['last']=$row["lastName"];
$myarr[$i]['phone']=$row["number"];
$i++;
}
$mysqli->close();
switch ($dev) {
case 'snom':
echo mysnom($myarr);
break;
case 'noki':
echo mynoki($myarr);
break;
default:
echo mytest($myarr);
break;
}
function mytest($myarr) {
$cont = "Header\n";
foreach ($myarr as $a) {
$cont .= " ".$a['first']." ".$a['last']." ".$a['phone']."\n";
}
$cont .= "Footer\n";
return $cont;
}
function mynoki($myarr) {
$cont = "<?xml version=\"1.0\"?>
"-//WAPFORUM//DTD WML 1.1//EN\"
\"http://www.wapforum.org/DTD/wml_1.1.xml\" >
\n
\n";
foreach ($myarr as $a) {
$cont .= "\nTel (WTAI):
".$a['last']." ".$a['first']."
";
}
$cont .= "\n";
return $cont;
}
function mysnom($myarr) {
$cont = "<?xml version=\"1.0\"?>
MySQL Directory";foreach ($myarr as $a) {
$cont .= "
".$a['first']." ".$a['last']."
".$a['phone']."
\n";
}
$cont .= "\n";
return $cont;
}
function show_err($dev,$msg) {
switch ($dev) {
case 'snom':
echo "<?xml version=\"1.0\"?>
$msg
";
break;
default:
echo $msg;
break;
}
die();
}
?>
這段代碼基本上是 清單 4 的重復,只是添加了 清單 5 和 清單 6 中的函數。代碼首先進行一個簡單檢查,了解用戶是誰,如果錯誤的用戶企圖訪問信息,代碼將在控制條件下停止。然后,代碼從查詢字符串獲取設備,并根據指示完成輸出。
由于每部電話都向數據庫顯示自己的請求和查詢字符串,因此它們以設備可顯示的格式輕松快速地接收輸出。
結束語
您可以通過修改 XML 輸出在其他平臺上使用來自一個公共源的通訊錄。針對 Nokia 的函數應該適用于任何遵守 WAP 2.0 的電話。針對其他電話改編 snom 函數可能更加復雜,但如果使用 XML,那么您需要的只是正確的架構。您可以使用任何方便的腳本語言、根據需要輕松維護和擴展這個腳本。
相關主題snom VoIP 電話概覽:了解關于 snom 系列 VoIP 電話的更多信息。
snom 微型瀏覽器:了解 snom370、snom360、snom320、snom300 上的 V7 固件以及 snom820 和 snom870 上的 V8 固件支持的 XML 對象。
Nokia E71 智能電話:查看這種擁有 QWERTY 鍵盤的電話。
無線應用程序協議(Wikipedia):閱讀一個關于用于移動電話等小型移動設備的常用 web 瀏覽器的優秀條目。
用 PHP 編寫腳本:了解這種通用腳本語言的更多相關信息,這種語言尤其適合 web 開發,可以嵌入到 HTML 中。
VCF 和 vCard 文件格式:了解用于電子商務卡的 vCard 文件格式標準的更多信息。
LibreOffice:了解這個面向 Windows、Macintosh 和 Linux 的 OpenSource 個人生產力套件。試用下面 6 個用于文檔生產和數據處理的應用程序:Writer、Calc、Impress、Draw、Math 和 Base。
phpMyEdit:使用這個工具編寫一個簡單的調用程序,生成一些 PHP 代碼,以 HTML 格式顯示或編輯的 MySQL 表。
developerWorks XML 專區:在 XML 專區獲取提高您的專業技能所需的資源。
XML 技術庫:訪問 developerWorks XML 專區,獲得廣泛的技術文章和技巧、教程、標準和 IBM 紅皮書,并閱讀關于 XML 技巧 的更多信息。
developerWorks 技術活動 和 網絡廣播:隨時關注這些活動中的技術。
IBM 產品評估版:下載或 在線試用 IBM SOA Sandbox,并開始使用來自 DB2?、Lotus?、Rational?
、Tivoli? 和 WebSphere? 的應用程序開發工具和中間件產品。
總結
以上是生活随笔為你收集整理的用php编写室友通讯录_使用 XML 和 PHP 创建一个更具适应性的电话簿和通讯录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于深度学习的车型识别APP
- 下一篇: BCH编译码的matlab性能分析