日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

用php编写室友通讯录_使用 XML 和 PHP 创建一个更具适应性的电话簿和通讯录

發布時間:2024/8/1 php 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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 - Snom

Friend, 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 创建一个更具适应性的电话簿和通讯录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。