亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3848 | 回復: 1
打印 上一主題 下一主題

PHP5.2 :新的 JSON 擴展 [復制鏈接]

論壇徽章:
2
丑牛
日期:2013-09-29 09:47:222015七夕節(jié)徽章
日期:2015-08-21 11:06:17
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-05-27 22:15 |只看該作者 |倒序瀏覽
隨著 Internet 應(yīng)用程序開發(fā)人員之中不斷有人創(chuàng)建和采用 PHP,使得它獲得了不斷發(fā)展而且并入了很多有用的標準。PHP 剛剛向 PHP V5.2 中添加了 JavaScript Object Notation (JSON) 擴展,以前該擴展只可用作附加框架類。這次添加為 PHP 開發(fā)人員在使用 JSON 開發(fā) Ajax 應(yīng)用程序時提供了更好的支持。本文是 “
PHP V5.2 中的新增功能
” 系列(共五部分)的第 3 部分,將展示如何有效地使用此應(yīng)用程序,并且在閱讀完本文后,您將可以熟練地將內(nèi)置 JSON 擴展與 PHP 結(jié)合使用來開發(fā) Ajax 應(yīng)用程序。
Ajax 入門
Ajax 作為一種創(chuàng)建功能全面的 Web 應(yīng)用程序的優(yōu)秀方法,借助 XML 的力量將數(shù)據(jù)表單和功能分離,打破了 Web 瀏覽器的規(guī)則和限制,使 Internet 的整體速度獲得了提升。Ajax 的主要限制包括在 JavaScript 中處理 XML。XML 的優(yōu)勢同樣也使自己變得十分復雜。在您確保了 XML 文檔的格式正確無誤并且設(shè)置了錯誤處理之后,仍必須把 XML 置入某種 JavaScript 可用的對象中。把 XML 整合到應(yīng)用程序中以供使用并不像聽起來那么簡單。
由于 XML 不是 JavaScript 本來就有的,因此我們最好使用 XML 的固有語言,例如 PHP 和被轉(zhuǎn)換為 JavaScript 的固有格式的簡單數(shù)據(jù) 。
我們遇到的另一個問題是不總是希望或需要在把數(shù)據(jù)裝入 Ajax 應(yīng)用程序之前將數(shù)據(jù)轉(zhuǎn)換為 XML。然而,在 Ajax 開發(fā)人員可以使用我們提供的數(shù)據(jù)之前,我們需要遵守標準。一旦我們在 PHP 代碼中創(chuàng)建了對象,我們可以將其序列化,并導出到應(yīng)用程序的 Ajax 部分中,處理并取回。


JSON
JSON 是一項旨在允許中間件創(chuàng)建使用 JavaScript 固有格式的對象的協(xié)議。它最強大的屬性是它是一種輕量級協(xié)議。簡單處理 RSS 聚合或 recipe 列表時,您不需要在 JavaScript 中使用 XML 的全部功能。不需要驗證格式或確保嚴格的數(shù)據(jù)鍵入。我們可以跳過與處理 XML 相關(guān)的大量工作,即使術(shù)語 Ajax 包括 XML。為了編寫更簡練的代碼,您可以使用 JSON 來簡化過程。讓我們來看一個顯示來自 RSS 摘要數(shù)據(jù)庫應(yīng)用程序的數(shù)據(jù)的簡單 XML 文檔示例。
清單 1. XML 格式示例
Listing 1 - XML Format Example
     
          21
www.blah.com/story1.html
     JSON is sweeping AJAX world
     FALSE
     22
www.blah.com/story2.html
     JSON is great
     FALSE

要獲得此 XML 文檔,我們需要訪問數(shù)據(jù)庫,取出相關(guān)數(shù)據(jù),并使用 PHP 在此 XML 文檔中設(shè)定格式。雖然 Ajax 可以利用 XML,但是在大多數(shù)情況下都是不必要的?刂平Y(jié)構(gòu)所需的負載帶寬量對于只需共享一些鏈接的簡單應(yīng)用程序來說完全沒必要。此外,我們必須遞歸處理 MySQL 結(jié)果,刪除非法字符以及逐位構(gòu)建我們的 XML 文檔。
JSON 在這種情況下將提供幫助,因為我們可以使用
json_encode()
把任何 PHP 對象序列化,使該對象轉(zhuǎn)換為 JSON 協(xié)議字符串,以供 Ajax 應(yīng)用程序讀取。這要比創(chuàng)建 XML 文檔便捷得多,因為我們只需把 MySQL 結(jié)果直接傳給函數(shù)。由于 MySQL 結(jié)果是以聯(lián)合數(shù)組的形式傳入的,因此沒有任何中間步驟。
讓我們來看一看如果把以上 XML 文檔轉(zhuǎn)換為 JSON 對象會發(fā)生什么情況(參見清單 2)。目前,數(shù)據(jù)庫和數(shù)據(jù)格式都是任意的;我們將在稍后的部分中了解它們的實際情況。
清單 2. 把 XML 轉(zhuǎn)換為 JSON 的 PHP 示例
array("url" => "www.blah.com/story1.html",
"title" => "JSON is sweeping AJAX world",
"viewed" => FALSE), "22" => array("url" => "www.blah.com/story2.html",
"title" => "JSON is great", "viewed" => FALSE));
//we now have a populated array object in $results resembling a possible MySQL result
$jsonObject = json_encode($results);
echo $jsonObject;
?>

全部都能理解么?結(jié)果沒有使用遞歸。沒有添加標記。只需將其傳入
json_encode()
函數(shù),然后它將從另一端作為 JSON 序列化對象傳出。參見清單 3 以查看新對象。
清單 3. JSON 序列化的 XML 對象示例
{"21":{"url":"www.blah.com\/story1.html","title":"JSON is sweeping AJAX
world","viewed":false},"22":{"url":"www.blah.com\/story2.html",
"title":"JSON is great","viewed":false}}

我們有了一個包含數(shù)組對象并且以 JSON 格式序列化的字符串。關(guān)于此字符串需要注意幾點:encode 函數(shù)已經(jīng)自動把正斜杠轉(zhuǎn)義為反斜杠,并且變量類型都是可以標識的,這取決于我們是否使用引號。由于數(shù)組中的 ID 號都使用了引號,因此那些 ID 號都被識別為字符串。布爾型 false 元素都被保留為布爾型。
現(xiàn)在我們已經(jīng)序列化了對象,我們可以在 Ajax 應(yīng)用程序的任意數(shù)目的 JSON 函數(shù)中使用它。


編碼和解碼
有兩個函數(shù)用于 JSON:encode 和 decode。像您想象的一樣,第一個函數(shù)將把任意類型的數(shù)據(jù)對象轉(zhuǎn)換為一組序列化數(shù)據(jù),以供 JavaScript 處理。第二個函數(shù)將把序列化數(shù)據(jù)解碼,并將其轉(zhuǎn)換為基本 PHP 對象或聯(lián)合數(shù)組。我們已經(jīng)見過使用
json_encode()
的示例,因此讓我們來看一看
json_decode()

清單 4.
json_decode()
的示例


如上,我們有一個 PHP 腳本,該腳本將獲取 $jsonObject 并將其解碼回 PHP 固有對象。我們進行了兩次解碼。第一次,使用未經(jīng)修改的用法,這將得到 stdClass 的對象;第二次,使用布爾型參數(shù)來創(chuàng)建聯(lián)合數(shù)組。
清單 5. 清單 4 的輸出
stdClass Object ( [21] => stdClass Object ( => www.blah.com/story1.html [title] =>
JSON is sweeping AJAX world [viewed] => ) [22] => stdClass Object ( [url] =>
www.blah.com/story2.html [title] => JSON is great [viewed] => ) )

Array ( [21] => Array ( [url] => www.blah.com/story1.html
[title] => JSON is sweeping AJAX world [viewed] => )
[22] => Array ( [url] => www.blah.com/story2.html [title] =>
JSON is great [viewed] => ) )

我們看到兩個對象,使用
[url=http://www.phpeye.com/phpmanual/function.print-r.html]print_r()

列出。


從數(shù)據(jù)庫到 JSON
在 建議的 Ajax 應(yīng)用程序中,我們的項目經(jīng)理希望使用來自另一個應(yīng)用程序提供的數(shù)據(jù)庫的數(shù)據(jù)。存儲 Web 服務(wù)器的 MySQL 數(shù)據(jù)庫中選定 RSS 摘要結(jié)果的 RSS 聚合器將經(jīng)常檢查并更新 RSS。要閱讀 RSS,我們的應(yīng)用程序?qū)⒁笫褂?Ajax 接口。作為專業(yè)的后端程序員,我們將專注于從數(shù)據(jù)庫中獲得數(shù)據(jù),并將其轉(zhuǎn)為 JSON 格式。我們將把 Ajax 留給專家,但是我們必須把 Ajax 準備好以供專家們處理。
首先,我們將設(shè)置 MySQL 數(shù)據(jù)庫來存儲 RSS 摘要信息,然后插入若干條記錄以準備開始。然后,我們將編寫一個 PHP 腳本,該腳本將進入數(shù)據(jù)庫并為基于 JSON 的應(yīng)用程序檢索一些記錄以供使用。


設(shè)置
我 們需要設(shè)置 MySQL 數(shù)據(jù)庫并插入一些簡單記錄以供我們提取。為便于使用示例,我們將使用數(shù)據(jù)庫名 “RSS_AGG”(參見清單 6)。由于大多數(shù)主要關(guān)系數(shù)據(jù)庫管理系統(tǒng)(Relational Database Management System,RDBMS)從一開始就支持 PHP,因此在選擇數(shù)據(jù)庫時,PHP 具有極大的靈活性。一些 RDBMS 不支持 PHP,但是很多這樣的 RDBMS 可以通過抽象類或擴展來提供 PHP 支持。我使用了 MySQL,但是可以任意采用這段代碼來支持您選擇的數(shù)據(jù)庫。
清單 6. feeds 表和兩條記錄的 SQL
CREATE TABLE 'feeds' (
  'id' int(11) NOT NULL auto_increment,
  'url' text NOT NULL,
  'title' text NOT NULL,
  'viewed' tinyint(1) NOT NULL,
  PRIMARY KEY  ('id')
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO 'feeds' ('id', 'url', 'title', 'viewed') VALUES
(1, 'www.blah.com/story1.html', 'JSON is sweeping AJAX world', 0),
(2, 'www.blah.com/story2.html', 'JSON is great', 0);

我們現(xiàn)在有一個可以通過 PHP 腳本訪問的數(shù)據(jù)庫。至于所有數(shù)據(jù)庫交互,我們需要設(shè)置數(shù)據(jù)庫連接并提取數(shù)據(jù)。
清單 7. output.php

在輸出腳本的開頭,我們只是創(chuàng)建變量來存儲可以訪問位于本地主機的數(shù)據(jù)庫的用戶名和密碼。我們選擇了數(shù)據(jù)庫,命名為 rss_agg,并編寫了一條十分簡單的 SELECT 語句從 feeds 表中檢索所有記錄。接下來的三行將使用連接憑證來發(fā)起一個與數(shù)據(jù)庫的連接,然后選擇數(shù)據(jù)庫。如果出于某種原因這個過程沒有發(fā)生,我們將看到 “Unable to select database” 結(jié)果。最后,我們將檢索 SQL 語句的結(jié)果并關(guān)閉數(shù)據(jù)庫連接。


編碼為 JSON
需要先把 MySQL 結(jié)果轉(zhuǎn)換為可用的 PHP 對象,然后才能把 MySQL 結(jié)果轉(zhuǎn)換為 JSON 字符串。我們可以通過把它轉(zhuǎn)為一個數(shù)組來完成以上操作。
清單 8. 帶有 JSON 代碼的 output.php
$encodable =
array()
;
mysql_connect(localhost, $username, $password);
mysql_select_db($database) or die("Unable to select database");
$result = mysql_query($sql);
while($obj = mysql_fetch_object($result))
{
$encodable[] = $obj;
}
$encoded = json_encode($encodable);
echo $encoded;
mysql_close()
;
?>

我們已經(jīng)創(chuàng)建了一個數(shù)組對象來存儲
json_encode()
可以讀取和轉(zhuǎn)換為 JSON 字符串格式的結(jié)果信息。while 語句將逐個遍歷結(jié)果查詢的每個元素并逐行構(gòu)建 $encodable 數(shù)組。此對象完成后,我們只需通過
json_encode()
運行它并生成 $encoded 對象,F(xiàn)在,可以將此信息回轉(zhuǎn)給瀏覽器,用來自對象的數(shù)據(jù)來響應(yīng)請求的 JavaScript。請求 JavaScript 應(yīng)用程序現(xiàn)在有一個完全相同的 PHP 對象副本,并使用 JavaScript 天生就能理解的方法列舉了該副本。


結(jié)束語
JSON 是一種有用的、輕量級協(xié)議,現(xiàn)在可用于 PHP V5.2,它可以輕松地實現(xiàn)從 PHP 應(yīng)用程序中提取出數(shù)據(jù),并將其放入 Ajax 應(yīng)用程序的過程。相應(yīng)地,PHP 中的 JSON 同樣也是輕量級且十分有用的,只包含兩個易于使用的函數(shù)。使用這些函數(shù),我們可以轉(zhuǎn)換和導出對象結(jié)構(gòu),還可以使用
json_encode()
使來自 PHP 數(shù)據(jù)庫連接的數(shù)據(jù)可用于 Ajax 應(yīng)用程序。在 Ajax 應(yīng)用程序中處理完數(shù)據(jù)后,可以將數(shù)據(jù)返回 PHP 腳本并用
json_decode()
重新創(chuàng)建可用的對象數(shù)據(jù)結(jié)構(gòu)。當把數(shù)據(jù)返回到 PHP 后,我們可以將其存儲到數(shù)據(jù)庫中,或使用 PHP 提供的眾多選擇中的任何其他數(shù)據(jù)處理方法。


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/4206/showart_710315.html

論壇徽章:
0
2 [報告]
發(fā)表于 2010-02-15 18:21 |只看該作者
學習
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP