微秒購源碼
讀者反饋
譯者序
前言
作者簡介
第一篇使用PHP
第1章PHP快速入門教程1
1.1開始之前:了解PHP
1.2創建一個示例應用:Bob汽車零部件商店2
1.2.1創建訂單表單2
1.2.2表單處理4
1.3在HTML中嵌入PHP4
1.3.1使用PHP標記5
1.3.2PHP語句6
1.3.3空格6
1.3.4注釋7
1.4添加動態內容8
1.4.1調用函數8
1.4.2使用date()函數9
1.5訪問表單變數9
1.5.1簡短、中等以及長風格的表單變數9
1.5.2字元串的連接11
1.5.3變數和文本12
1.6理解標識符13
1.7檢查變數類型13
1.7.1PHP的數據類型
1.7.2類型強度
1.7.3類型轉換
1.7.4可變變數
1.8聲明和使用常量13
1.9理解變數的作用域13
1.10使用操作符16
1.10.1算術操作符17
1.10.2字元串操作符17
1.10.3賦值操作符17
1.10.4比較操作符19
1.10.5邏輯操作符20
1.10.6位操作符21
1.10.7其他操作符21
1.11計算表單總金額23
1.12理解操作符的優先順序和結合性:
1.13使用可變函數25
1.13.1測試和設置變數類型26
1.13.2測試變數狀態26
1.13.3變數的重解釋27
1.14根據條件進行決策27
1.14.1if語句28
1.14.2代碼塊28
1.14.3else語句28
1.14.4elseif語句29
1.14.5switch語句30
1.14.6比較不同的條件31
1.15通過迭代實現重復動作32
1.15.1while循環33
1.15.2for和foreach循環34
1.15.3do...while循環35
1.16從控制結構或腳本中跳出35
1.17使用可替換的控制結構語法36
1.18使用declare36
1.19下一章37
第2章數據的存儲與檢索38
2.1保存數據以便後期使用38
2.2存儲和檢索Bob的訂單38
2.3文件處理39
2.4打開文件40
2.4.1選擇文件模式40
2.4.2使用fopen()打開文件40
2.4.3通過FTP或HTTP打開文件42
2.4.4解決打開文件時可能遇到的問題42
2.5寫文件44
2.5.1fwrite()的參數44
2.5.2文件格式45
2.6關閉文件45
2.7讀文件47
2.7.1以只讀模式打開文件:fopen()48
2.7.2知道何時讀完文件:feof()48
2.7.3每次讀取一行數據:fgets()、fgetss()和fgetcsv()49
2.7.4讀取整個文件:readfile()、fpassthru()和file()49
2.7.5讀取一個字元:fgetc()50
2.7.6讀取任意長度:fread()51
2.8使用其他有用的文件函數51
2.8.1查看文件是否存在:file_exists()51
2.8.2確定文件大小:filesize()51
2.8.3刪除一個文件:unlink()51
2.8.4在文件中定位:rewind()、fseek()和ftell()52
2.9文件鎖定52
2.10更好的方式:資料庫管理系統53
2.10.1使用普通文件的幾個問題54
2.10.2RDBMS是如何解決這些問題的54
2.11進一步學習54
2.12下一章55
第3章使用數組56
3.1什麼是數組56
3.2數字索引數組57
3.2.1數字索引數組的初始化57
3.2.2訪問數組的內容57
3.2.3使用循環訪問數組58
3.3使用不同索引的數組59
3.3.1初始化相關數組59
3.3.2訪問數組元素59
3.3.3使用循環語句59
3.4數組操作符60
3.5多維數組61
3.6數組排序64
3.6.1使用sort()函數64
3.6.2使用asort()函數和ksort()函數對相關數組排序64
3.6.3反向排序65
3.7多維數組的排序65
3.7.1用戶定義排序65
3.7.2反向用戶排序66
3.8對數組進行重新排序67
3.8.1使用shuffle()函數67
3.8.2使用array_reverse()函數68
3.9從文件載入數組69
3.10執行其他的數組操作71
3.10.1在數組中瀏覽:each()、current()、reset()、end()、next()、pos()和prev()71
3.10.2對數組的每一個元素應用任何函數:array_walk()72
3.10.3統計數組元素個數:count()、sizeof()和array_count_values()73
3.10.4將數組轉換成標量變數:extract()73
3.11進一步學習75
3.12下一章75
第4章字元串操作與正則表達式76
4.1創建一個示例應用程序:智能表單郵件76
4.2字元串的格式化78
4.2.1字元串的整理:chop()、ltrim()和trim()78
4.2.2格式化字元串以便顯示78
4.2.3格式化字元串以便存儲:addslashes()和stripslashes()81
4.3用字元串函數連接和分割字元串82
4.3.1使用函數explode()、implode()和join()82
4.3.2使用strtok()函數83
4.3.3使用substr()函數83
4.4字元串的比較84
4.4.1字元串的排序:strcmp()、strcasecmp()和strnatcmp()84
4.4.2使用strlen()函數測試字元串的長度85
4.5使用字元串函數匹配和替換子字元串85
4.5.1在字元串中查找字元串:strstr()、strchr()、strrchr()和stristr()85
4.5.2查找子字元串的位置:strpos()、strrpos()86
4.5.3替換子字元串:str_replace()、substr_replace()87
4.6正則表達式的介紹88
4.6.1基礎知識88
4.6.2字元集和類88
4.6.3重復89
4.6.4子表達式89
4.6.5子表達式計數90
4.6.6定位到字元串的開始或末尾90
4.6.7分支90
4.6.8匹配特殊字元90
4.6.9特殊字元一覽91
4.6.10在智能表單中應用91
4.7用正則表達式查找子字元串92
4.8使用正則表達式分割字元串93
4.9比較字元串函數和正則表達式函數93
4.10進一步學習93
4.11下一章93
第5章代碼重用與函數編寫94
5.1代碼重用的好處
5.1.1成本94
5.1.2可靠性94
5.1.3一致性95
5.2使用require()和include()函數95
5.2.1文件擴展名和require()語句96
5.2.2使用require()製作Web站點的模版96
5.2.3使用auto_prepend_file和auto_append_file101
5.3在PHP中使用函數101
5.3.1調用函數101
5.3.2調用未定義的函數103
5.3.3理解字母大小寫和函數名稱103
5.4理解為什麼要定義自己的函數103
5.5了解基本的函數結構104
5.5.1函數命名
5.6使用參數105
5.7理解作用域107
5.8參數的引用傳遞和值傳遞109
5.9使用Return關鍵字110
5.9.1從函數返回一個值111
5.10實現遞歸113
5.10.1名稱空間
5.11進一步學習114
5.12下一章114
第6章面向對象的PHP115
6.1理解面向對象的概念115
6.1.1類和對象115
6.1.2多態性116
6.1.3繼承117
6.2在PHP中創建類、屬性和操作117
6.2.1類的結構117
6.2.2構造函數118
6.2.3析構函數118
6.3類的實例化118
6.4使用類的屬性119
6.5使用private和public關鍵字控制訪問121
6.6類操作的調用121
6.7在PHP中實現繼承122
6.7.1通過繼承使用private和protected訪問修飾符控制可見性123
6.7.2重載124
6.7.3使用final關鍵字禁止繼承和重載125
6.7.4理解多重繼承126
6.7.5實現介面126
6.8類的設計127
6.9編寫類代碼128
6.10理解PHP面向對象新的高級功能135
6.10.1使用Per-Class常量135
6.10.2實現靜態方法135
6.10.3檢查類的類型和類型提示136
6.10.4克隆對象136
6.10.5使用抽象類137
6.10.6使用__call()重載方法137
6.10.7使用__autoload()方法138
6.10.8實現迭代器和迭代138
6.10.9將類轉換成字元串140
6.10.10使用Reflection(反射)API140
6.11下一章141
第7章錯誤和異常處理142
7.1異常處理的概念142
7.2Exception類144
7.3用戶自定義異常144
7.4Bob的汽車零部件商店應用程序的異常146
7.5異常和PHP的其他錯誤處理機制150
7.6進一步學習150
7.7下一章150
第二篇使用MySQL
第8章設計Web資料庫151
8.1關系資料庫的概念152
8.1.1表格152
8.1.2列152
8.1.3行152
8.1.4值152
8.1.5鍵152
8.1.6模式153
8.1.7關系153
8.2如何設計Web資料庫154
8.2.1考慮要建模的實際對象154
8.2.2避免保存冗餘數據154
8.2.3使用原子列值155
8.2.4選擇有意義的鍵156
8.2.5考慮需要詢問資料庫的問題156
8.2.6避免多個空屬性的設計156
8.2.7表格類型的總結157
8.3Web資料庫架構157
8.4進一步學習158
8.5下一章158
第9章創建Web資料庫159
9.1使用MySQL監視程序160
9.2登錄到MySQL160
9.3創建資料庫和用戶161
9.4設置用戶與許可權162
9.5MySQL許可權系統的介紹162
9.5.1最少許可權原則162
9.5.2創建用戶:GRANT命令162
9.5.3許可權的類型和級別163
9.5.4REVOKE命令165
9.5.5使用GRANT和REVOKE的例子165
9.6創建一個Web用戶166
9.7使用正確的資料庫166
9.8創建資料庫表167
9.8.1理解其他關鍵字的意思168
9.8.2理解列的類型169
9.8.3用SHOW和DESCRIBE來查看資料庫170
9.8.4創建索引171
9.9理解MySQL的標識符171
9.10選擇列數據類型172
9.10.1數字類型173
9.10.2日期和時間類型174
9.10.3字元串類型174
9.11進一步學習176
9.12下一章176
第10章使用MySQL資料庫177
10.1SQL是什麼177
10.2在資料庫中插入數據177
10.3從資料庫中獲取數據179
10.3.1獲取滿足特定條件的數據181
10.3.2從多個表中獲取數據182
10.3.3以特定的順序獲取數據186
10.3.4分組與合計數據186
10.3.5選擇要返回的行188
10.3.6使用子查詢188
10.4更新資料庫記錄190
10.5創建後修改表191
10.6刪除資料庫中的記錄193
10.7表的刪除193
10.8刪除整個資料庫193
10.9進一步學習194
10.10下一章194
第11章使用PHP從Web訪問MySQL資料庫195
11.1Web資料庫架構的工作原理195
11.2從Web查詢資料庫的基本步驟198
11.2.1檢查與過濾用戶輸入數據198
11.2.2建立一個連接199
11.2.3選擇使用的資料庫200
11.2.4查詢資料庫200
11.2.5檢索查詢結果201
11.2.6從資料庫斷開連接202
11.3將新信息放入資料庫202
11.4使用Prepared語句205
11.5使用PHP與資料庫交互的其他介面206
11.5.1使用常規的資料庫介面:PEARMDB2206
11.6進一步學習209
11.7下一章209
第12章MySQL高級管理210
12.1深入理解許可權系統210
12.1.1user表211
12.1.2db表和host表212
12.1.3tables_priv表,columns_priv表和procs_priv表212
12.1.4訪問控制:MySQL如何使用Grant表213
12.1.5更新許可權:修改什麼時候生效213
12.2提高MySQL資料庫的安全性214
12.2.1從操作系統角度來保護MySQL214
12.2.2密碼214
12.2.3用戶許可權215
12.2.4Web問題215
12.3獲取更多關於資料庫的信息216
12.3.1使用SHOW獲取信息216
12.3.2使用DESCRIBE獲取關於列的信息218
12.3.3用EXPLAIN理解查詢操作的工作過程218
12.4資料庫的優化221
12.4.1設計優化222
12.4.2許可權222
12.4.3表的優化222
12.4.4使用索引222
12.4.5使用默認值222
12.4.6其他技巧222
12.5備份MySQL資料庫222
12.6恢復MySQL資料庫223
12.7實現復制223
12.7.1設置主伺服器224
12.7.2執行初始的數據傳輸224
12.7.3設置一個/多個從伺服器225
12.8進一步學習225
12.9下一章225
第13章MySQL高級編程226
13.1LOADDATAINFILE語句226
13.2存儲引擎226
13.3事務227
13.3.1理解事務的定義227
13.3.2通過InnoDB使用事務228
13.4外鍵229
13.5存儲過程230
13.5.1基本示例230
13.5.2局部變數232
13.5.3游標和控制結構233
13.6進一步學習236
13.7下一章236
第三篇電子商務與安全性
第14章運營一個電子商務網站237
14.1我們要實現什麼目標237
14.2考慮電子商務網站的類型237
14.2.1使用在線說明書公布信息238
14.2.2接收產品或服務的訂單240
14.2.3提供服務和數字產品243
14.2.4為產品或服務增值243
14.2.5減少成本243
14.3理解風險和威脅244
14.3.1網路黑客244
14.3.2不能招攬足夠的生意245
14.3.3計算機硬體故障245
14.3.4電力、通信、網路或運輸故障245
14.3.5廣泛的競爭245
14.3.6軟體錯誤245
14.3.7不斷變化的政府政策和稅收246
14.3.8系統容量限制246
14.4選擇一個策略246
14.5下一章246
第15章電子商務的安全問題247
15.1信息的重要程度247
15.2安全威脅248
15.2.1機密數據的泄露248
15.2.2數據丟失和數據破壞249
15.2.3數據修改250
15.2.4拒絕服務251
15.2.5軟體錯誤251
15.2.6否認252
15.3易用性,性能、成本和安全性253
15.4建立一個安全政策253
15.5身份驗證原則254
15.6加密技術基礎255
15.6.1私有密鑰加密256
15.6.2公有密鑰加密256
15.6.3數字簽名256
15.7數字證書257
15.8安全的Web伺服器258
15.9審計與日誌記錄259
15.10防火牆259
15.11備份數據259
15.11.1備份常規文件260
15.11.2備份與恢復MySQL資料庫260
15.12自然環境安全260
15.13下一章261
第16章Web應用的安全
16.1處理安全性問題的策略
16.1.1以正確心態為開始
16.1.2安全性和可用性之間的平衡
16.1.3安全監視
16.1.4基該方法
16.2識別所面臨的威脅
16.2.1訪問或修改敏感數據
16.2.2數據丟失或破壞
16.2.3拒絕服務
16.2.4惡意代碼注入
16.2.5伺服器被攻破
16.3了解與我們「打交道」的用戶
16.3.1破解人員
16.3.2受影響機器的未知情用戶
16.3.3對公司不滿的員工
16.3.4硬體被盜
16.3.5我們自身
16.4代碼的安全性
16.4.1過濾用戶輸入
16.4.2轉義輸出
16.4.3代碼組織
16.4.4代碼自身的問題
16.4.5文件系統因素
16.4.6代碼穩定性和缺陷
16.4.7執行引號和exec
16.5Web伺服器和PHP的安全性
16.5.1保持軟體的更新
16.5.2查看php.ini文件
16.5.3Web伺服器配置
16.5.4Web應用的商業主機服務
16.6資料庫伺服器的安全性
16.6.1用戶和許可權系統
16.6.2發送數據至伺服器
16.6.3連接伺服器
16.6.4運行伺服器
16.7保護網路
16.7.1安裝防火牆
16.7.2使用隔離區域(DMZ)
16.7.3應對DoS和DDoS攻擊
16.8計算機和操作系統的安全性
16.8.1保持操作系統的更新
16.8.2隻運行必須的軟體
16.8.3伺服器的物理安全性
16.9災難計劃
16.10下一章
第17章使用PHP和MySQL實現身份驗證262
17.1識別訪問者262
17.2實現訪問控制263
17.2.1保存密碼265
17.2.2密碼的加密267
17.2.3保護多個網頁268
17.3使用基本身份驗證269
17.4在PHP中使用基本身份驗證270
17.5在Apache的.htaccess文件中使用基本身份驗證271
17.6使用mod_auth_mysql身份驗證276
17.6.1安裝mod_auth_mysql276
17.6.2使用mod_auth_mysql277
17.7創建自定義身份驗證277
17.8進一步學習278
17.9下一章278
第18章使用PHP和MySQL實現安全事務279
18.1提供安全的事務處理279
18.1.1用戶機器280
18.1.2Internet281
18.1.3我們的系統281
18.2使用加密套接字層(SSL)282
18.3屏蔽用戶的輸入284
18.4提供安全存儲284
18.5存儲信用卡號碼285
18.6在PHP中使用加密技術286
18.6.1安裝GPG286
18.6.2測試GPG288
18.7進一步學習293
18.8下一章293
第四篇PHP的高級技術
第19章與文件系統和伺服器的交互295
19.1文件上載295
19.1.1文件上載的HTML代碼296
19.1.2編寫處理文件的PHP297
19.1.3避免常見上載問題300
19.2使用目錄函數300
19.2.1從目錄讀取300
19.2.2獲得當前目錄的信息302
19.2.3創建和刪除目錄302
19.3與文件系統的交互302
19.3.1獲取文件信息302
19.3.2更改文件屬性304
19.3.3創建、刪除和移動文件305
19.4使用程序執行函數305
19.5與環境變數交互:getenv()和putenv()308
19.6進一步學習308
19.7下一章308
第20章使用網路函數和協議函數309
20.1了解可供使用的協議309
20.2發送和讀取電子郵件309
20.3使用其他Web站點的數據310
20.4使用網路查找函數312
20.5備份或鏡像一個文件
20.5.1使用FTP備份或鏡像一個文件316
20.5.2上傳文件321
20.5.3避免超時321
20.5.4使用其他的FTP函數322
20.6進一步學習322
20.7下一章323
第21章日期和時間的管理324
21.1在PHP中獲取日期和時間324
21.1.1使用date()函數324
21.1.2使用UNⅨ時間戳325
21.1.3使用getdate()函數326
21.1.4使用checkdate()函數檢驗日期有效性327
21.1.5格式化時間戳
21.2在PHP日期格式和MySQL日期格式之間進行轉換327
21.3在PHP中計算日期329
21.4在MySQL中計算日期329
21.5使用微秒331
21.6使用日歷函數331
21.7進一步學習332
21.8下一章332
第22章創建圖像333
22.1在PHP中設置圖像支持333
22.2理解圖像格式334
22.2.1JPEG334
22.2.2PNG334
22.2.3WBMP335
22.2.4GIF335
22.3創建圖像335
22.3.1創建一個背景圖像336
22.3.2在圖像上繪圖或列印文本337
22.3.3輸出最終圖形338
22.3.4清理339
22.4在其他頁面中使用自動生成的圖像339
22.5使用文本和字體創建圖像339
22.5.1創建基本畫布342
22.5.2將文本調整到適合按鈕342
22.5.3放置文本345
22.5.4將文本寫到按鈕上345
22.5.5完成345
22.6繪制圖像與用圖表描繪數據346
22.7使用其他的圖像函數352
22.8進一步學習352
22.9下一章353
第23章在PHP中使用會話控制354
23.1什麼是會話控制354
23.2理解基本的會話功能354
23.2.1什麼是cookie354
23.2.2通過PHP設置cookie355
23.2.3在會話中使用cookie355
23.2.4存儲會話ID356
23.3實現簡單的會話356
23.3.1開始一個會話356
23.3.2注冊一個會話變數356
23.3.3使用會話變數357
23.3.4注銷變數與銷毀會話357
23.4創建一個簡單的會話例子357
23.5配置會話控制359
23.6通過會話控制實現身份驗證360
23.7進一步學習365
23.8下一章365
第24章其他有用的特性366
24.1使用eval()函數對字元串求值367
24.2終止執行:die和exit367
24.3序列化變數和對象368
24.4獲取PHP環境信息369
24.4.1找到所載入的PHP擴展部件369
24.4.2識別腳本所有者370
24.4.3確定腳本最近修改時間370
24.5暫時改變運行時環境370
24.6源代碼加亮371
24.7在命令行中使用PHP372
24.8下一章372
第五篇創建實用的PHP和MySQL項目
第25章在大型項目中使用PHP和MySQL373
25.1在Web開發中應用軟體工程374
25.2規劃和運行Web應用程序項目374
25.3重用代碼375
25.4編寫可維護代碼375
25.4.1編碼標准375
25.4.2分解代碼378
25.4.3使用標準的目錄結構378
25.4.4文檔化和共享內部函數378
25.5實現版本控制379
25.6選擇一個開發環境380
25.7項目的文檔化380
25.8建立原型381
25.9將邏輯和內容分離381
25.10優化代碼382
25.10.1使用簡單優化382
25.10.2使用Zend產品382
25.11測試383
25.12進一步學習383
25.13下一章384
第26章調試385
26.1編程錯誤385
26.1.1語法錯誤385
26.1.2運行時錯誤386
26.1.3邏輯錯誤391
26.2使用變數幫助調試392
26.3錯誤報告級別393
26.4改變錯誤報告設置394
26.5觸發自定義錯誤395
26.6巧妙地處理錯誤396
26.7下一章398
第27章建立用戶身份驗證機制和個性化設置399
27.1解決方案的組成399
27.1.1用戶識別和個性化設置399
27.1.2保存書簽400
27.1.3推薦書簽400
27.2解決方案概述400
27.3實現資料庫402
27.4實現基本的網站403
27.5實現用戶身份驗證405
27.5.1注冊405
27.5.2登錄410
27.5.3登出413
27.5.4修改密碼414
27.5.5重設遺忘的密碼416
27.6實現書簽的存儲和檢索420
27.6.1添加書簽420
27.6.2顯示書簽422
27.6.3刪除書簽422
27.7實現書簽推薦424
27.8考慮可能的擴展427
27.9下一章427
第28章創建一個購物車428
28.1解決方案的組成428
28.1.1創建一個在線目錄428
28.1.2在用戶購買商品的時候記錄購買行為429
28.1.3實現一個付款系統429
28.1.4創建一個管理界面429
28.2解決方案概述429
28.3實現資料庫432
28.4實現在線目錄434
28.4.1列出目錄434
28.4.2列出一個目錄中的所有圖書437
28.4.3顯示圖書詳細信息438
28.5實現購物車440
28.5.1使用show_cart.php腳本440
28.5.2瀏覽購物車442
28.5.3將物品添加到購物庫444
28.5.4保存更新後的購物車446
28.5.5列印標題欄摘要447
28.5.6結賬447
28.6實現付款452
28.7實現一個管理界面454
28.8擴展該項目460
28.9使用一個已有系統461
28.10下一章461
第29章創建一個基於Web的電子郵件服務系統486
29.1解決方案的組成486
29.1.1電子郵件協議:POP3和IMAP
29.1.2PHP對POP3和IMAP的支持
29.2解決方案概述488
29.3建立資料庫489
29.4了解腳本架構490
29.5登錄與登出495
29.6建立賬戶498
29.6.1創建一個新賬戶499
29.6.2修改已有賬戶501
29.6.3刪除賬戶501
29.7閱讀郵件502
29.7.1選擇賬戶502
29.7.2查看郵箱內容504
29.7.3閱讀郵件消息507
29.7.4查看消息標題509
29.7.5刪除郵件509
29.8發送郵件510
29.8.1發送一則新消息510
29.8.2回復或轉發郵件512
29.9擴展這個項目514
29.10下一章514
第30章創建一個郵件列表管理器515
30.1解決方案的組成515
30.1.1建立列表和訂閱者資料庫516
30.1.2上載新聞信件516
30.1.3發送帶附件的郵件516
30.2解決方案概述516
30.3建立資料庫518
30.4定義腳本架構520
30.5實現登錄526
30.5.1新賬戶的創建527
30.5.2登錄529
30.6用戶函數的實現531
30.6.1查看列表531
30.6.2查看郵件列表信息535
30.6.3查看郵件列表存檔536
30.6.4訂閱與取消訂閱538
30.6.5更改賬戶設置539
30.6.6更改密碼539
30.6.7登出540
30.7管理功能的實現541
30.7.1創建新的郵件列表541
30.7.2上載新的新聞信件543
30.7.3多文件上載的處理545
30.7.4預覽新聞信件549
30.7.5發送郵件550
30.8擴展這個項目555
30.9下一章555
第31章創建一個Web論壇556
31.1理解流程
31.2解決方案的組成556
31.3解決方案概述557
31.4資料庫的設計558
31.5查看文章的樹型結構560
31.5.1展開和折疊561
31.5.2顯示文章564
31.5.3使用treenode類564
31.6查看單個的文章570
31.7添加新文章572
31.8添加擴充578
31.9使用一個已有的系統578
31.10下一章578
第32章生成PDF格式的個性化文檔579
32.1項目概述
32.1.1評估文檔格式579
32.2解決方案的組成582
32.2.1問題與回答系統583
32.2.2文檔生成軟體583
32.3解決方案概述585
32.3.1提問585
32.3.2給答題評分587
32.3.3生成RTF證書589
32.3.4從模板生成PDF證書591
32.3.5使用PDFlib生成PDF文檔595
32.3.6使用PDFlib的一個「HelloWorld」程序595
32.3.7用PDFlib生成證書598
32.4處理標題的問題605
32.5擴展該項目605
32.6下一章606
第33章使用XML和SOAP來連接Web服務607
33.1項目概述:使用XML和Web服務
33.1.1理解XML
33.1.2理解Web服務611
33.2解決方案的組成612
33.2.1使用Amazon的Web服務介面613
33.2.2XML的解析:REST響應
33.2.3在PHP中使用SOAP614
33.2.4緩存614
33.3解決方案概述614
33.3.1核心應用程序618
33.3.2顯示特定種類的圖書623
33.3.3獲得一個AmazonResultSet類624
33.3.4使用REST發送和接收請求
33.3.5使用SOAP發送和接收請求
33.3.6緩存請求返回的數據636
33.3.7創建購物車639
33.3.8到Amazon付賬642
33.4安裝項目代碼642
33.5擴展這個項目643
33.6進一步學習643
第34章使用Ajax構建Web2.0應用
34.1Ajax是什麼?
34.1.1HTTP請求和響應
34.1.2DHTML和XHTML
34.1.3級聯樣式單(CSS)
34.1.4客戶端編程
34.1.5伺服器端編程
34.1.6XML和XSLT
34.2Ajax基礎
34.2.1XMLHTTPRequest對象
34.2.2與伺服器通信
34.2.3處理伺服器響應
34.2.4整合應用
34.3在以前的項目添加Ajax元素
34.3.1在PHPBookmark應用中添加Ajax元素
34.4進一步學習
34.4.1進一步了解文檔對象模型(DOM)
34.4.2Ajax應用可用的JavaScript函數庫
34.4.3Ajax開發人員網站
第六篇附錄
附錄A安裝PHP及MySQL645
附錄BWeb資源664
第1章PHP快速入門教程
第2章數據的存儲與檢索
第3章使用數組
第4章字元串操作與正則表達式
第5章代碼重用與函數編寫
第6章面向對象的PHP
第7章錯誤和異常處理
……
㈡ 求一個毫秒級計時器,最好微秒級的,c/c++源代碼
毫秒級好像不好做啊,我以前做過,好像不是那麼簡單的,我只能做個秒級的
㈢ 什麼是嵌入式搞嵌入式是不是等於寫代碼
隨著信息化技術的發展和數字化產品的普及,以計算機技術、晶元技術和軟體技術為核心的嵌入式系統再度成為當前研究和應用的熱點,通信、計算機、消費電子技術(3C)合一的趨勢正在逐步形成,無所不在的網路和無所不在的計算(everything connecting, everywhere computing)正在將人類帶入一個嶄新的信息社會。一、嵌入式系統 嵌入式系統是以應用為中心,以計算機技術為基礎,並且軟硬體是可裁剪的,適用於對功能、可靠性、成本、體積、功耗等有嚴格要求的專用計算機系統。嵌入式系統最典型的特點是與人們的日常生活緊密相關,任何一個普通人都可能擁有各類形形色色運用了嵌入式技術的電子產品,小到MP3、PDA等微型數字化設備,大到信息家電、智能電器、車載GIS,各種新型嵌入式設備在數量上已經遠遠超過了通用計算機。這也難怪美國著名未來學家尼葛洛龐帝在1999年1月訪華時就預言,4~5年後嵌入式智能工具將成為繼PC機和Internet之後計算機工業最偉大的發明。 1.1 歷史與現狀 雖然嵌入式系統是近幾年才開始真正風靡起來的,但事實上嵌入式這個概念卻很早就已經存在了,從上個世紀70年代單片機的出現到今天各種嵌入式微處理器、微控制器的廣泛應用,嵌入式系統少說也有了近30年的歷史。縱觀嵌入式系統的發展歷程,大致經歷了以下四個階段: 無操作系統階段 嵌入式系統最初的應用是基於單片機的,大多以可編程式控制制器的形式出現,具有監測、伺服、設備指示等功能,通常應用於各類工業控制和飛機、導彈等武器裝備中,一般沒有操作系統的支持,只能通過匯編語言對系統進行直接控制,運行結束後再清除內存。這些裝置雖然已經初步具備了嵌入式的應用特點,但僅僅只是使用8位的CPU晶元來執行一些單線程的程序,因此嚴格地說還談不上"系統"的概念。 這一階段嵌入式系統的主要特點是:系統結構和功能相對單一,處理效率較低,存儲容量較小,幾乎沒有用戶介面。由於這種嵌入式系統使用簡便、價格低廉,因而曾經在工業控制領域中得到了非常廣泛的應用,但卻無法滿足現今對執行效率、存儲容量都有較高要求的信息家電等場合的需要。 簡單操作系統階段 20世紀80年代,隨著微電子工藝水平的提高,IC製造商開始把嵌入式應用中所需要的微處理器、I/O介面、串列介面以及RAM、ROM等部件統統集成到一片VLSI中,製造出面向I/O設計的微控制器,並一舉成為嵌入式系統領域中異軍突起的新秀。與此同時,嵌入式系統的程序員也開始基於一些簡單的"操作系統"開發嵌入式應用軟體,大大縮短了開發周期、提高了開發效率。 這一階段嵌入式系統的主要特點是:出現了大量高可靠、低功耗的嵌入式CPU(如Power PC等),各種簡單的嵌入式操作系統開始出現並得到迅速發展。此時的嵌入式操作系統雖然還比較簡單,但已經初步具有了一定的兼容性和擴展性,內核精巧且效率高,主要用來控制系統負載以及監控應用程序的運行。 實時操作系統階段 20世紀90年代,在分布控制、柔性製造、數字化通信和信息家電等巨大需求的牽引下,嵌入式系統進一步飛速發展,而面向實時信號處理演算法的DSP產品則向著高速度、高精度、低功耗的方向發展。隨著硬體實時性要求的提高,嵌入式系統的軟體規模也不斷擴大,逐漸形成了實時多任務操作系統(RTOS),並開始成為嵌入式系統的主流。 這一階段嵌入式系統的主要特點是:操作系統的實時性得到了很大改善,已經能夠運行在各種不同類型的微處理器上,具有高度的模塊化和擴展性。此時的嵌入式操作系統已經具備了文件和目錄管理、設備管理、多任務、網路、圖形用戶界面(GUI)等功能,並提供了大量的應用程序介面(API),從而使得應用軟體的開發變得更加簡單。 面向Internet階段 21世紀無疑將是一個網路的時代,將嵌入式系統應用到各種網路環境中去的呼聲自然也越來越高。目前大多數嵌入式系統還孤立於Internet之外,隨著Internet的進一步發展,以及Internet技術與信息家電、工業控制技術等的結合日益緊密,嵌入式設備與Internet的結合才是嵌入式技術的真正未來。 信息時代和數字時代的到來,為嵌入式系統的發展帶來了巨大的機遇,同時也對嵌入式系統廠商提出了新的挑戰。目前,嵌入式技術與Internet技術的結合正在推動著嵌入式技術的飛速發展,嵌入式系統的研究和應用產生了如下新的顯著變化: 新的微處理器層出不窮,嵌入式操作系統自身結構的設計更加便於移植,能夠在短時間內支持更多的微處理器。 嵌入式系統的開發成了一項系統工程,開發廠商不僅要提供嵌入式軟硬體系統本身,同時還要提供強大的硬體開發工具和軟體支持包。 通用計算機上使用的新技術、新觀念開始逐步移植到嵌入式系統中,如嵌入式資料庫、移動代理、實時CORBA等,嵌入式軟體平台得到進一步完善。 各類嵌入式linux操作系統迅速發展,由於具有源代碼開放、系統內核小、執行效率高、網路結構完整等特點,很適合信息家電等嵌入式系統的需要,目前已經形成了能與Windows CE、Palm OS等嵌入式操作系統進行有力競爭的局面。 網路化、信息化的要求隨著Internet技術的成熟和帶寬的提高而日益突出,以往功能單一的設備如電話、手機、冰箱、微波爐等功能不再單一,結構變得更加復雜,網路互聯成為必然趨勢。 精簡系統內核,優化關鍵演算法,降低功耗和軟硬體成本。 提供更加友好的多媒體人機交互界面。 1.2 體系結構 根據國際電氣和電子工程師協會(IEEE)的定義,嵌入式系統是"控制、監視或者輔助設備、機器和車間運行的裝置"(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。一般而言,整個嵌入式系統的體系結構可以分成四個部分:嵌入式處理器、嵌入式外圍設備、嵌入式操作系統和嵌入式應用軟體,如圖1所示。 圖1 嵌入式系統的組成 嵌入式處理器 嵌入式系統的核心是各種類型的嵌入式處理器,嵌入式處理器與通用處理器最大的不同點在於,嵌入式CPU大多工作在為特定用戶群所專門設計的系統中,它將通用CPU中許多由板卡完成的任務集成到晶元內部,從而有利於嵌入式系統在設計時趨於小型化,同時還具有很高的效率和可靠性。 嵌入式處理器的體系結構經歷了從CISC(復雜指令集)至RISC(精簡指令集)和Compact RISC的轉變,位數則由4位、8位、16位、32位逐步發展到64位。目前常用的嵌入式處理器可分為低端的嵌入式微控制器(Micro Controller Unit,MCU)、中高端的嵌入式微處理器(Embedded Micro Processor Unit,EMPU)、用於計算機通信領域的嵌入式DSP處理器(Embedded Digital Signal Processor,EDSP)和高度集成的嵌入式片上系統(System On Chip,SOC)。 目前幾乎每個半導體製造商都生產嵌入式處理器,並且越來越多的公司開始擁有自主的處理器設計部門,據不完全統計,全世界嵌入式處理器已經超過1000多種,流行的體系結構有30多個系列,其中以ARM、PowerPC、MC 68000、MIPS等使用得最為廣泛。 嵌入式外圍設備 在嵌入系統硬體系統中,除了中心控制部件(MCU、DSP、EMPU、SOC)以外,用於完成存儲、通信、調試、顯示等輔助功能的其他部件,事實上都可以算作嵌入式外圍設備。目前常用的嵌入式外圍設備按功能可以分為存儲設備、通信設備和顯示設備三類。 存儲設備主要用於各類數據的存儲,常用的有靜態易失型存儲器(RAM、SRAM)、動態存儲器(DRAM)和非易失型存儲器(ROM、EPROM、EEPROM、FLASH)三種,其中FLASH憑借其可擦寫次數多、存儲速度快、存儲容量大、價格便宜等優點,在嵌入式領域內得到了廣泛應用。 目前存在的絕大多數通信設備都可以直接在嵌入式系統中應用,包括RS-232介面(串列通信介面)、SPI(串列外圍設備介面)、IrDA(紅外線介面)、I2C(現場匯流排)、USB(通用串列匯流排介面)、Ethernet(乙太網介面)等。 由於嵌入式應用場合的特殊性,通常使用的是陰極射線管(CRT)、液晶顯示器(LCD)和觸摸板(Touch Panel)等外圍顯示設備。 嵌入式操作系統 為了使嵌入式系統的開發更加方便和快捷,需要有專門負責管理存儲器分配、中斷處理、任務調度等功能的軟體模塊,這就是嵌入式操作系統。嵌入式操作系統是用來支持嵌入式應用的系統軟體,是嵌入式系統極為重要的組成部分,通常包括與硬體相關的底層驅動程序、系統內核、設備驅動介面、通信協議、圖形用戶界面(GUI)等。嵌入式操作系統具有通用操作系統的基本特點,如能夠有效管理復雜的系統資源,能夠對硬體進行抽象,能夠提供庫函數、驅動程序、開發工具集等。但與通用操作系統相比較,嵌入式操作系統在系統實時性、硬體依賴性、軟體固化性以及應用專用性等方面,具有更加鮮明的特點。 嵌入式操作系統根據應用場合可以分為兩大類:一類是面向消費電子產品的非實時系統,這類設備包括個人數字助理(PDA)、行動電話、機頂盒(STB)等;另一類則是面向控制、通信、醫療等領域的實時操作系統,如WindRiver公司的VxWorks、QNX系統軟體公司的QNX等。實時系統(Real Time System)是一種能夠在指定或者確定時間內完成系統功能,並且對外部和內部事件在同步或者非同步時間內能做出及時響應的系統。在實時系統中,操作的正確性不僅依賴於邏輯設計的正確程度,而且與這些操作進行的時間有關,也就是說,實時系統對邏輯和時序的要求非常嚴格,如果邏輯和時序控制出現偏差將會產生嚴重後果。 實時系統主要通過三個性能指標來衡量系統的實時性,即響應時間(Response Time)、生存時間(Survival Time)和吞吐量(Throughput): 響應時間 是實時系統從識別出一個外部事件到做出響應的時間; 生存時間 是數據的有效等待時間,數據只有在這段時間內才是有效的; 吞吐量 是在給定的時間內系統能夠處理的事件總數,吞吐量通常比平均響應時間的倒數要小一點。 實時系統根據響應時間可以分為弱實時系統、一般實時系統和強實時系統三種。弱實時系統在設計時的宗旨是使各個任務運行得越快越好,但沒有嚴格限定某一任務必須在多長時間內完成,弱實時系統更多關注的是程序運行結果的正確與否,以及系統安全性能等其他方面,對任務執行時間的要求相對來講較為寬松,一般響應時間可以是數十秒或者更長。一般實時系統是弱實時系統和強實時系統的一種折衷,它的響應時間可以在秒的數量級上,廣泛應用於消費電子設備中。強實時系統則要求各個任務不僅要保證執行過程和結果的正確性,同時還要保證在限定的時間內完成任務,響應時間通常要求在毫秒甚至微秒的數量級上,這對涉及到醫療、安全、軍事的軟硬體系統來說是至關重要的。 時限(deadline)是實時系統中的一個重要概念,指的是對任務截止時間的要求,根據時限對系統性能的影響程度,實時系統又可以分為軟實時系統(soft real-time-system)和硬實時系統(hard real-time-system)。軟實時指的是雖然對系統響應時間有所限定,但如果系統響應時間不能滿足要求,並不會導致系統產生致命的錯誤或者崩潰;硬實時則指的是對系統響應時間有嚴格的限定,如果系統響應時間不能滿足要求,就會引起系統產生致命的錯誤或者崩潰。如果一個任務在時限到達之時尚未完成,對軟實時系統來說還是可以容忍的,最多隻會降低系統性能,但對硬實時系統來說則是無法接受的,因為這樣帶來的後果根本無法預測,甚至可能是災難性的。在目前實際運用的實時系統中,通常允許軟硬兩種實時性同時存在,其中一些事件沒有時限要求,另外一些事件的時限要求是軟實時的,而對系統產生關鍵影響的那些事件的時限要求則是硬實時的。 嵌入式應用軟體 嵌入式應用軟體是針對特定應用領域,基於某一固定的硬體平台,用來達到用戶預期目標的計算機軟體,由於用戶任務可能有時間和精度上的要求,因此有些嵌入式應用軟體需要特定嵌入式操作系統的支持。嵌入式應用軟體和普通應用軟體有一定的區別,它不僅要求其准確性、安全性和穩定性等方面能夠滿足實際應用的需要,而且還要盡可能地進行優化,以減少對系統資源的消耗,降低硬體成本。 1.3 關鍵問題 嵌入式系統是將先進的計算機技術、半導體技術以及電子技術與特定行業的具體應用相結合的產物,因此必然是一個技術密集、資金密集、高度分散、不斷創新的知識集成系統,嵌入式系統的開發充滿了競爭、機遇與創新,需要解決好如下一些關鍵問題: 內核精巧 嵌入式系統的應用領域一般都是小型電子裝置,系統資源相對有限,因此對內核的要求相當高,較之傳統的操作系統來講要小得多,例如ENEA公司推出的OSE分布式嵌入式系統,整個內核只有5KB。 面向應用 嵌入式系統通常是面向用戶、面向產品、面向特定應用的。嵌入式系統中的CPU大多工作在為特定用戶群定製的環境中,具有低耗、體積小、集成度高等特點,在進行軟硬體設計時必須突出效率、去除冗餘,針對用戶的具體需求對系統進行合理的配置,方能達到理想的性能。 系統精簡 嵌入式系統中的系統軟體和應用軟體通常沒有明顯的區別,不要求其功能及實現上過於復雜,這樣一方面有利於控制系統成本,另一方面也有利於保證系統安全。 性能優化 嵌入式系統通常都要求有一定的實時性保障,為了提高執行速度和系統性能,嵌入式系統中的軟體一般都固化在存儲晶元或者處理器的內部存儲器件當中,而不是存貯在磁碟等外部載體中。由於嵌入式系統的運算速度和存儲容量存在一定程度上的限制,而且大部分系統都必須有較高的實時性保證,因此對軟體質量(特別是可靠性方面)有著較高的要求。 專業開發 嵌入式系統本身並不具備自主開發能力,用戶不能直接在其上進行二次開發。當系統完成之後,用戶如果需要修改其中某個程序的功能,必須藉助一套完整的開發工具和環境。嵌入式系統中專用的開發工具和環境通常是基於通用計算機上的軟硬體設備,以及各種邏輯分析儀、混合信號示波器等。 回頁首 二、嵌入式Linux Linux從1991年問世到現在,短短的十幾年時間已經發展成為功能強大、設計完善的操作系統之一,不僅可以與各種傳統的商業操作系統分庭抗爭,在新興的嵌入式操作系統領域內也獲得了飛速發展。嵌入式Linux(Embedded Linux)是指對標准Linux經過小型化裁剪處理之後,能夠固化在容量只有幾K或者幾M位元組的存儲器晶元或者單片機中,適合於特定嵌入式應用場合的專用Linux操作系統。 2.1 優勢 嵌入式Linux的開發和研究是操作系統領域中的一個熱點,目前已經開發成功的嵌入式系統中,大約有一半使用的是Linux。Linux之所以能在嵌入式系統市場上取得如此輝煌的成果,與其自身的優良特性是分不開的。 廣泛的硬體支持 Linux能夠支持x86、ARM、MIPS、ALPHA、PowerPC等多種體系結構,目前已經成功移植到數十種硬體平台,幾乎能夠運行在所有流行的CPU上。Linux有著異常豐富的驅動程序資源,支持各種主流硬體設備和最新硬體技術,甚至可以在沒有存儲管理單元(MMU)的處理器上運行,這些都進一步促進了Linux在嵌入式系統中的應用。 內核高效穩定 Linux內核的高效和穩定已經在各個領域內得到了大量事實的驗證,Linux的內核設計非常精巧,分成進程調度、內存管理、進程間通信、虛擬文件系統和網路介面五大部分,其獨特的模塊機制可以根據用戶的需要,實時地將某些模塊插入到內核或從內核中移走。這些特性使得Linux系統內核可以裁剪得非常小巧,很適合於嵌入式系統的需要。 開放源碼,軟體豐富 Linux是開放源代碼的自由操作系統,它為用戶提供了最大限度的自由度,由於嵌入式系統千差萬別,往往需要針對具體的應用進行修改和優化,因而獲得源代碼就變得至關重要了。Linux的軟體資源十分豐富,每一種通用程序在Linux上幾乎都可以找到,並且數量還在不斷增加。在Linux上開發嵌入式應用軟體一般不用從頭做起,而是可以選擇一個類似的自由軟體做為原型,在其上進行二次開發。 優秀的開發工具 開發嵌入式系統的關鍵是需要有一套完善的開發和調試工具。傳統的嵌入式開發調試工具是在線模擬器(In-Circuit Emulator,ICE),它通過取代目標板的微處理器,給目標程序提供一個完整的模擬環境,從而使開發者能夠非常清楚地了解到程序在目標板上的工作狀態,便於監視和調試程序。在線模擬器的價格非常昂貴,而且只適合做非常底層的調試,如果使用的是嵌入式Linux,一旦軟硬體能夠支持正常的串口功能時,即使不用在線模擬器也可以很好地進行開發和調試工作,從而節省了一筆不小的開發費用。嵌入式Linux為開發者提供了一套完整的工具鏈(Tool Chain),它利用GNU的gcc做編譯器,用gdb、kgdb、xgdb做調試工具,能夠很方便地實現從操作系統到應用軟體各個級別的調試。 完善的網路通信和文件管理機制 Linux至誕生之日起就與Internet密不可分,支持所有標準的Internet網路協議,並且很容易移植到嵌入式系統當中。此外,Linux還支持ext2、fat16、fat32、romfs等文件系統,這些都為開發嵌入式系統應用打下了很好的基礎。 2.2 挑戰 目前,嵌入式Linux系統的研發熱潮正在蓬勃興起,並且占據了很大的市場份額,除了一些傳統的Linux公司(如RedHat、MontaVista等)正在從事嵌入式Linux的開發和應用之外,IBM、Intel、Motorola等著名企業也開始進行嵌入式Linux的研究。雖然前景一片燦爛,但就目前而言,嵌入式Linux的研究成果與市場的真正要求仍有一段差距,要開發出真正成熟的嵌入式Linux系統,還需要從以下幾個方面做出努力。 提高系統實時性 Linux雖然已經被成功地應用到了PDA、行動電話、車載電視、機頂盒、網路微波爐等各種嵌入式設備上,但在醫療、航空、交通、工業控制等對實時性要求非常嚴格的場合中還無法直接應用,原因在於現有的Linux是一個通用的操作系統,雖然它也採用了許多技術來加快系統的運行和響應速度,並且符合POSIX 1003.1b標准,但從本質上來說並不是一個嵌入式實時操作系統。Linux的內核調度策略基本上是沿用UNIX系統的,將它直接應用於嵌入式實時環境會有許多缺陷,如在運行內核線程時中斷被關閉,分時調度策略存在時間上的不確定性,以及缺乏高精度的計時器等等。正因如此,利用Linux作為底層操作系統,在其上進行實時化改造,從而構建出一個具有實時處理能力的嵌入式系統,是現在日益流行的解決方案。 改善內核結構 Linux內核採用的是整體式結構(Monolithic),整個內核是一個單獨的、非常大的程序,這樣雖然能夠使系統的各個部分直接溝通,有效地縮短任務之間的切換時間,提高系統響應速度,但與嵌入式系統存儲容量小、資源有限的特點不相符合。嵌入式系統經常採用的是另一種稱為微內核(Microkernel)的體系結構,即內核本身只提供一些最基本的操作系統功能,如任務調度、內存管理、中斷處理等,而類似於文件系統和網路協議等附加功能則運行在用戶空間中,並且可以根據實際需要進行取捨。Microkernel的執行效率雖然比不上Monolithic,但卻大大減小了內核的體積,便於維護和移植,更能滿足嵌入式系統的要求。可以考慮將Linux內核部分改造成Microkernel,使Linux在具有很高性能的同時,又能滿足嵌入式系統體積小的要求。 完善集成開發平台 引入嵌入式Linux系統集成開發平台,是嵌入式Linux進一步發展和應用的內在要求。傳統上的嵌入式系統都是面向具體應用場合的,軟體和硬體之間必須緊密配合,但隨著嵌入式系統規模的不斷擴大和應用領域的不斷擴展,嵌入式操作系統的出現就成了一種必然,因為只有這樣才能促成嵌入式系統朝層次化和模塊化的方向發展。很顯然,嵌入式集成開發平台也是符合上述發展趨勢的,一個優秀的嵌入式集成開發環境能夠提供比較完備的模擬功能,可以實現嵌入式應用軟體和嵌入式硬體的同步開發,從而擺脫了"嵌入式應用軟體的開發依賴於嵌入式硬體的開發,並且以嵌入式硬體的開發為前提"的不利局面。一個完整的嵌入式集成開發平台通常包括編譯器、連接器、調試器、跟蹤器、優化器和集成用戶界面,目前Linux在基於圖形界面的特定系統定製平台的研究上,與Windows CE等商業嵌入式操作系統相比還有很大差距,整體集成開發環境有待提高和完善。 回頁首 三、關鍵技術 嵌入式系統是一種根據特定用途所專門開發的系統,它只完成預期要完成的功能,因此其開發過程和開發環境同傳統的軟體開發相比有著顯著的不同。 3.1 開發流程 在嵌入式系統的應用開發中,整個系統的開發過程如圖2所示: 圖2 嵌入式系統的開發流程 嵌入式系統發展到今天,對應於各種微處理器的硬體平台一般都是通用的、固定的、成熟的,這就大大減少了由硬體系統引入錯誤的機會。此外,由於嵌入式操作系統屏蔽了底層硬體的復雜性,使得開發者通過操作系統提供的API函數就可以完成大部分工作,因此大大簡化了開發過程,提高了系統的穩定性。嵌入式系統的開發者現在已經從反復進行硬體平台設計的過程中解脫出來,從而可以將主要精力放在滿足特定的需求上。 嵌入式系統通常是一個資源受限的系統,因此直接在嵌入式系統的硬體平台上編寫軟體比較困難,有時候甚至是不可能的。目前一般採用的解決辦法是首先在通用計算機上編寫程序,然後通過交叉編譯生成目標平台上可以運行的二進制代碼格式,最後再下載到目標平台上的特定位置上運行。 需要交叉開發環境(Cross Development Environment)的支持是嵌入式應用軟體開發時的一個顯著特點,交叉開發環境是指編譯、鏈接和調試嵌入式應用軟體的環境,它與運行嵌入式應用軟體的環境有所不同,通常採用宿主機/目標機模式,如圖3所示。 圖3 交叉開發環境 宿主機(Host)是一台通用計算機(如PC機或者工作站),它通過串口或者乙太網介面與目標機通信。宿主機的軟硬體資源比較豐富,不但包括功能強大的操作系統(如Windows和Linux),而且還有各種各樣優秀的開發工具(如WindRiver的Tornado、Microsoft的Embedded Visual C++等),能夠大大提高嵌入式應用軟體的開發速度和效率。 目標機(Target)一般在嵌入式應用軟體開發期間使用,用來區別與嵌入式系統通信的宿主機,它可以是嵌入式應用軟體的實際運行環境,也可以是能夠替代實際運行環境的模擬系統,但軟硬體資源通常都比較有限。嵌入式系統的交叉開發環境一般包括交叉編譯器、交叉調試器和系統模擬器,其中交叉編譯器用於在宿主機上生成能在目標機上運行的代碼,而交叉調試器和系統模擬器則用於在宿主機與目標機間完成嵌入式軟體的調試。在採用宿主機/目標機模式開發嵌入式應用軟體時,首先利用宿主機上豐富的資源和良好的開發環境開發和模擬調試目標機上的軟體,然後通過串口或者以網路將交叉編譯生成的目標代碼傳輸並裝載到目標機上,並在監控程序或者操作系統的支持下利用交叉調試器進行分析和調試,最後目標機在特定環境下脫離宿主機單獨運行。 建立交叉開發環境是進行嵌入式軟體開發的第一步,目前常用的交叉開發環境主要有開放和商業兩種類型。開放的交叉開發環境的典型代表是GNU工具鏈、目前已經能夠支持x86、ARM、MIPS、PowerPC等多種處理器。商業的交叉開發環境則主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。 3.2 交叉編譯和鏈接 在完成嵌入式軟體的編碼之後,需要進行編譯和鏈接以生成可執行代碼,由於開發過程大多是在使用Intel公司x86系列CPU的通用計算機上進行的,而目標環境的處理器晶元卻大多為ARM、MIPS、PowerPC、DragonBall等系列的微處理器,這就要求在建立好的交叉開發環境中進行交叉編譯和鏈接。 交叉編譯器和交叉鏈接器是能夠在宿主機上運行,並且能夠生成在目標機上直接運行的二進制代碼的編譯器和鏈接器。例如在基於ARM體系結構的gcc交叉開發環境中,arm-linux-gcc是交叉編譯器,arm-linux-ld是交叉鏈接器。通常情況下,並不是每一種體系結構的嵌入式微處理器都只對應於一種交叉編譯器和交叉鏈接器,比如對於M68K體系結構的gcc交叉開發環境而言,就對應於多種不同的編譯器和鏈接器。如果使用的是COFF格式的可執行文件,那麼在編譯Linux內核時需要使用m68k-coff-gcc和m68k-coff-ld,而在編譯應用程序時則需要使用m68k-coff-pic-gcc和m68k-coff-pic-ld。 嵌入式系統在鏈接過程中通常都要求使用較小的函數庫,以便最後產生的可執行代碼能夠盡可能地小,因此實際運用時一般使用經過特殊處理的函數庫。對於嵌入式Linux系統來講,功能越來越強、體積越來越大的c語言函數庫glibc和數學函數庫libm已經很難滿足實際的需要,因此需要採用它們的精化版本uClibc、uClibm和newlib等。 目前嵌入式的集成開發環境都支持交叉編譯和交叉鏈接,如WindRiver Tornado和GNU工具鏈等,編寫好的嵌入式軟體經過交叉編譯和交叉鏈接後通常會生成兩種類型的可執行文件:用於調試的可執行文件和用於固化的可執行文件。 3.3 交叉調試 嵌入式軟體經過編譯和鏈接後即進入調試階段,調試是軟體開發過程中必不可少的一個環節,嵌入式軟體開發過程中的交叉調 ~
㈣ 深圳市微秒電子有限公司怎麼樣
深圳市微秒電子有限公司是2017-06-15在廣東省深圳市羅湖區注冊成立的有限責任公司,注冊地址位於深圳市羅湖區東門街道花場社區人民北路3092號物資大廈716。
深圳市微秒電子有限公司的統一社會信用代碼/注冊號是91440300MA5EKHCW2R,企業法人羅保進,目前企業處於開業狀態。
深圳市微秒電子有限公司的經營范圍是:一般經營項目是:電子產品、五金產品的批發、研發與銷售;國內貿易,從事貨物及技術的進出口業務(企業經營涉及前置性行政許可的,須取得前置性行政許可文件後方可經營)。(企業經營涉及前置性行政許可的,須取得前置性行政許可文件後方可經營),許可經營項目是:電子產品、五金產品的生產;醫用口罩(含原材料)、醫用一次性手套、測溫儀、消毒液、生活酒精、防護服、二類醫療器械的研發及購銷。
深圳市微秒電子有限公司對外投資1家公司,具有0處分支機構。
通過愛企查查看深圳市微秒電子有限公司更多信息和資訊。
㈤ ps是皮秒,比納秒還小的時間單位,OK
皮秒是比納秒還小的單位。
1s=1000ms=1000000微秒=1000000000納秒=1000000000000皮秒=10^15飛秒=10^18啊秒=10^21仄秒=10^24幺秒
1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(納秒)=10^12ps(皮秒)=10^15fs(飛秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(幺秒)
(5)微秒購源碼擴展閱讀
相關微小時間單位:
1、飛秒(femtosecond)也叫毫微微秒,即10的負15次秒,簡稱fs。是標衡時間長短的一種計量單位。1飛秒只有1秒的一千萬億分之一,即1e−15秒或0.001皮秒(1皮秒是,1e−12秒)。即使是每秒飛行30萬千米的光速,在一飛秒內,也只能走0.3微米,不到一根頭發絲的百分之一。
2、幺秒(yoctosecond),即10的負24次秒,簡稱ys。0.3ys是W及Z玻色子的壽命,23ys是氫的同位素的半衰期。
3、阿秒(attosecond),又名阿托秒、渺秒和微微微秒,相當於10的負18次秒,簡稱as。是可測量的最短時間,中性π介子的壽命。如果宇宙的年齡幾百億年,那麼10的負18次相當於其中的1秒。科學家是用阿秒來對瞬時事件進行計時的。
㈥ 哪位大神有單片機C語言程序設計實訓100例綜合設計中的用1602LCD與DS18B20設計的溫度報警器的源代碼啊
/*******************************************
文件:DS18B20.C
環境:編譯為ICC AVR6.31A,模擬為AVR Studio4.10
硬體:ATMEGA16晶元
日期:2008年8月8日
/******************************************/
#include //包含型號頭文件
#include //包含"位"操作頭文件
#include //標准輸入輸出頭文件
#include //包含自定義常量頭文件
#include "SMG.C" //包含數碼管顯示函數
/*******************************************
函數名稱: B20_init
功 能: 復位DS18B20
參 數: 無
返回值 : 無
/********************************************/
void B20_init(void)
{
DDRA|=BIT(DS18B20); //配置為輸出
PORTA&=~BIT(DS18B20); //拉低
Delayus(600); //等待600微秒
PORTA|=BIT(DS18B20); //釋放匯流排
Delayus(60); //等待60微秒
DDRA&=~BIT(DS18B20); //配置為輸入
while((PINA&(BIT(DS18B20)))); //等待DS18B20拉低
while(!(PINA&(BIT(DS18B20)))); //等待DS18B20釋放匯流排
}
/*******************************************
函數名稱: B20_readB
功 能: 讀取一個位元組的數據
參 數: 無
返回值 : retd--返回的一個位元組數據
/********************************************/
uchar B20_readB(void)
{
uchar i,retd=0;
for(i=0;i<8;i++) //位計數值
{
retd>>=1; //右移,准備接受新的數據位
DDRA|=BIT(DS18B20); //配置為輸出
PORTA&=~BIT(DS18B20); //拉低,啟動讀數據位
PORTA|=BIT(DS18B20); //釋放匯流排
Delayus(5); //等待5微秒
DDRA&=~BIT(DS18B20); //配置為輸入,開始讀取數據位
if(PINA&BIT(DS18B20)) //該位是否為高
{
retd|=0x80; //是就將此位置高
}
Delayus(50); //等待50微秒
}
return retd; //將讀到的一個位元組返回
}
/*******************************************
函數名稱: B20_writeB
功 能: 寫入一個位元組的數據
參 數: wrd--要寫入的數據
返回值 : 無
/********************************************/
void B20_writeB(uchar wrd)
{
uchar i;
for(i=0;i<8;i++) //位計數值
{
DDRA|=BIT(DS18B20); //配置為輸出
PORTA&=~BIT(DS18B20); //拉低,啟動寫數據位
Delayus(1); //等待1微秒
if(wrd&0x01) //此位數據是否為高
{
PORTA|=BIT(DS18B20); //是高則將單匯流排拉高
}
else
{
PORTA&=~BIT(DS18B20); //是低則將單匯流排拉低
}
Delayus(50); //等待50微秒
PORTA|=BIT(DS18B20); //釋放匯流排
wrd>>=1; //右移,為寫入新的數據位做准備
}
Delayus(50); //等待50微秒
}
/*******************************************
函數名稱: Read_temp
功 能: 讀取溫度值
參 數: 無
返回值 : rettemp--返回的溫度值
/********************************************/
uint Read_temp(void)
{
uchar templ,temph;
uint temp;
B20_init(); //初始化,每次寫命令都從初始化開始
B20_writeB(0xcc); //跳過ROM
B20_writeB(0x44); //啟動溫度轉換
B20_init(); //初始化,每次寫命令都從初始化開始
B20_writeB(0xcc); //跳過ROM
B20_writeB(0xbe); //讀寄存器
templ=B20_readB(); //讀溫度低位元組
temph=B20_readB(); //讀溫度高位元組
temp=templ+temph*256;//將溫度整理成16位變數
return temp; //返回16位變數
}
/*******************************************
函數名稱: Num_BCD
功 能: 將一個位元組的整數轉換成三位BCD碼
參 數: num--需要轉換的整數
返回值 : chr--三位BCD碼數組指針
/********************************************/
uchar* Num_BCD(uint num)
{
uchar i,chr[3];
uchar *rept;
rept=&(chr[0]); //返回指針指向BCD碼數組
for(i=0;i<3;i++)
{
chr[2-i]=num%10; //對10取余數(其實是求模,但是對於正數,取余與求模是相等的)
num/=10; //除以10,為取出下一位做准備
}
return rept; //返回指針
}
/*******************************************
函數名稱: main
功 能: 完成溫度的讀取與顯示
參 數: 無
返回值 : 無
/********************************************/
void main(void)
{
uint t;
uchar *temppt;
uchar i,temp[3];
Board_init( ); //初始化開發板
while(1)
{
t=Read_temp(); //讀取溫度值
t*=0.625; //轉換成實際溫度的10倍
temppt=Num_BCD(t);//將實際溫度的10倍轉換成BCD碼
for(i=0;i<3;i++) //將轉換後的BCD碼存入顯示數組
{
temp[i]=*(temppt+i);
}
for(i=0;i<3;i++) //顯示溫度
{
if(i==1)
{
temp[1]+=16; //如果是各位,則加上小數點(數碼管的解碼
}
One_smg_display(temp[i],i+1);
Delayms(5);
}
}
}
/*******************************************
文件:SMG.C
環境:編譯為ICC AVR6.25A,模擬為AVR Studio4.10
硬體:ATMEGA16晶元
日期:2006年12月10日
功能:驅動開發板上的數碼管,滾動顯示1、2、3、4、5、6
備註:參考《AVR系列單片機C語言編程與應用實例
/******************************************/
#include //包含型號頭文件
#include //包含"位"操作頭文件
#include //標准輸入輸出頭文件
#pragma data:code
const SEGMENT[26]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,
0xff,0xef};
/*******************************************
函數名稱: One_smg_display
功 能: 指定的數碼管顯示指定的內容
參 數: data--顯示的內容(0-15)
number--指定的數碼管(1-6)
返回值 : 無
/********************************************/
void One_smg_display(uchar data,uchar number)
{
PORTB|=0x3F; //輸出位選
PORTA|=BIT(BITLK); //更新位選
Delayus(50); //調整時序
PORTA&=~BIT(BITLK); //鎖存位選
PORTB=SEGMENT[data]; //輸出段選
PORTA|=BIT(SEGLK); //更新段選
Delayus(50); //調整時序
PORTA&=~BIT(SEGLK); //鎖存段選
number=~BIT(number-1); //調整位選(指定時是1~6,而操作的時候是0~5)
PORTB=number; //輸出位選
PORTA|=BIT(BITLK); //更新位選
Delayus(50); //調整時序
PORTA&=~BIT(BITLK); //鎖存位選
}
/*******************************************
函數名稱: All_smg_display
功 能: 6個數碼管顯示指定的內容
參 數: *pdata--顯示內容數組地址
返回值 : 無
/********************************************/
void All_smg_display(uchar *pdata)
{
uchar i;
for(i=0;i<6;i++)
{
One_smg_display(pdata[i],i+1);
Delayms(1);
}
}
/*******************************************
函數名稱: Cycle_smg_display
功 能: 6個數碼管從右向左循環滾動顯示指定的內容(循環一次)
參 數: *pdata--顯示內容數組地址
返回值 : 無
/********************************************/
void Cycle_smg_display(uchar *pdata)
{
uchar i,j;
for(i=0;i<240;i++) //共滾動6次,每次內容顯示40個循環
{
for(j=0;j<6;j++) //掃描6個數碼管
{
One_smg_display(pdata[(i/40+j)%6],j+1);//顯示
Delayus(2000); //調整顯示時間和亮度(時間越長亮度越高,但是太長數碼管就閃了)
}
}
}
㈦ php和mysql web開發的目錄
讀者反饋
譯者序
前言
作者簡介
第一篇使用PHP
第1章PHP快速入門教程1
1.1開始之前:了解PHP
1.2創建一個示例應用:Bob汽車零部件商店2
1.2.1創建訂單表單2
1.2.2表單處理4
1.3在HTML中嵌入PHP4
1.3.1使用PHP標記5
1.3.2PHP語句6
1.3.3空格6
1.3.4注釋7
1.4添加動態內容8
1.4.1調用函數8
1.4.2使用date()函數9
1.5訪問表單變數9
1.5.1簡短、中等以及長風格的表單變數9
1.5.2字元串的連接11
1.5.3變數和文本12
1.6理解標識符13
1.7檢查變數類型13
1.7.1PHP的數據類型
1.7.2類型強度
1.7.3類型轉換
1.7.4可變變數
1.8聲明和使用常量13
1.9理解變數的作用域13
1.10使用操作符16
1.10.1算術操作符17
1.10.2字元串操作符17
1.10.3賦值操作符17
1.10.4比較操作符19
1.10.5邏輯操作符20
1.10.6位操作符21
1.10.7其他操作符21
1.11計算表單總金額23
1.12理解操作符的優先順序和結合性:
1.13使用可變函數25
1.13.1測試和設置變數類型26
1.13.2測試變數狀態26
1.13.3變數的重解釋27
1.14根據條件進行決策27
1.14.1if語句28
1.14.2代碼塊28
1.14.3else語句28
1.14.4elseif語句29
1.14.5switch語句30
1.14.6比較不同的條件31
1.15通過迭代實現重復動作32
1.15.1while循環33
1.15.2for和foreach循環34
1.15.3do...while循環35
1.16從控制結構或腳本中跳出35
1.17使用可替換的控制結構語法36
1.18使用declare36
1.19下一章37
第2章數據的存儲與檢索38
2.1保存數據以便後期使用38
2.2存儲和檢索Bob的訂單38
2.3文件處理39
2.4打開文件40
2.4.1選擇文件模式40
2.4.2使用fopen()打開文件40
2.4.3通過FTP或HTTP打開文件42
2.4.4解決打開文件時可能遇到的問題42
2.5寫文件44
2.5.1fwrite()的參數44
2.5.2文件格式45
2.6關閉文件45
2.7讀文件47
2.7.1以只讀模式打開文件:fopen()48
2.7.2知道何時讀完文件:feof()48
2.7.3每次讀取一行數據:fgets()、fgetss()和fgetcsv()49
2.7.4讀取整個文件:readfile()、fpassthru()和file()49
2.7.5讀取一個字元:fgetc()50
2.7.6讀取任意長度:fread()51
2.8使用其他有用的文件函數51
2.8.1查看文件是否存在:file_exists()51
2.8.2確定文件大小:filesize()51
2.8.3刪除一個文件:unlink()51
2.8.4在文件中定位:rewind()、fseek()和ftell()52
2.9文件鎖定52
2.10更好的方式:資料庫管理系統53
2.10.1使用普通文件的幾個問題54
2.10.2RDBMS是如何解決這些問題的54
2.11進一步學習54
2.12下一章55
第3章使用數組56
3.1什麼是數組56
3.2數字索引數組57
3.2.1數字索引數組的初始化57
3.2.2訪問數組的內容57
3.2.3使用循環訪問數組58
3.3使用不同索引的數組59
3.3.1初始化相關數組59
3.3.2訪問數組元素59
3.3.3使用循環語句59
3.4數組操作符60
3.5多維數組61
3.6數組排序64
3.6.1使用sort()函數64
3.6.2使用asort()函數和ksort()函數對相關數組排序64
3.6.3反向排序65
3.7多維數組的排序65
3.7.1用戶定義排序65
3.7.2反向用戶排序66
3.8對數組進行重新排序67
3.8.1使用shuffle()函數67
3.8.2使用array_reverse()函數68
3.9從文件載入數組69
3.10執行其他的數組操作71
3.10.1在數組中瀏覽:each()、current()、reset()、end()、next()、pos()和prev()71
3.10.2對數組的每一個元素應用任何函數:array_walk()72
3.10.3統計數組元素個數:count()、sizeof()和array_count_values()73
3.10.4將數組轉換成標量變數:extract()73
3.11進一步學習75
3.12下一章75
第4章字元串操作與正則表達式76
4.1創建一個示例應用程序:智能表單郵件76
4.2字元串的格式化78
4.2.1字元串的整理:chop()、ltrim()和trim()78
4.2.2格式化字元串以便顯示78
4.2.3格式化字元串以便存儲:addslashes()和stripslashes()81
4.3用字元串函數連接和分割字元串82
4.3.1使用函數explode()、implode()和join()82
4.3.2使用strtok()函數83
4.3.3使用substr()函數83
4.4字元串的比較84
4.4.1字元串的排序:strcmp()、strcasecmp()和strnatcmp()84
4.4.2使用strlen()函數測試字元串的長度85
4.5使用字元串函數匹配和替換子字元串85
4.5.1在字元串中查找字元串:strstr()、strchr()、strrchr()和stristr()85
4.5.2查找子字元串的位置:strpos()、strrpos()86
4.5.3替換子字元串:str_replace()、substr_replace()87
4.6正則表達式的介紹88
4.6.1基礎知識88
4.6.2字元集和類88
4.6.3重復89
4.6.4子表達式89
4.6.5子表達式計數90
4.6.6定位到字元串的開始或末尾90
4.6.7分支90
4.6.8匹配特殊字元90
4.6.9特殊字元一覽91
4.6.10在智能表單中應用91
4.7用正則表達式查找子字元串92
4.8使用正則表達式分割字元串93
4.9比較字元串函數和正則表達式函數93
4.10進一步學習93
4.11下一章93
第5章代碼重用與函數編寫94
5.1代碼重用的好處
5.1.1成本94
5.1.2可靠性94
5.1.3一致性95
5.2使用require()和include()函數95
5.2.1文件擴展名和require()語句96
5.2.2使用require()製作Web站點的模版96
5.2.3使用auto_prepend_file和auto_append_file101
5.3在PHP中使用函數101
5.3.1調用函數101
5.3.2調用未定義的函數103
5.3.3理解字母大小寫和函數名稱103
5.4理解為什麼要定義自己的函數103
5.5了解基本的函數結構104
5.5.1函數命名
5.6使用參數105
5.7理解作用域107
5.8參數的引用傳遞和值傳遞109
5.9使用Return關鍵字110
5.9.1從函數返回一個值111
5.10實現遞歸113
5.10.1名稱空間
5.11進一步學習114
5.12下一章114
第6章面向對象的PHP115
6.1理解面向對象的概念115
6.1.1類和對象115
6.1.2多態性116
6.1.3繼承117
6.2在PHP中創建類、屬性和操作117
6.2.1類的結構117
6.2.2構造函數118
6.2.3析構函數118
6.3類的實例化118
6.4使用類的屬性119
6.5使用private和public關鍵字控制訪問121
6.6類操作的調用121
6.7在PHP中實現繼承122
6.7.1通過繼承使用private和protected訪問修飾符控制可見性123
6.7.2重載124
6.7.3使用final關鍵字禁止繼承和重載125
6.7.4理解多重繼承126
6.7.5實現介面126
6.8類的設計127
6.9編寫類代碼128
6.10理解PHP面向對象新的高級功能135
6.10.1使用Per-Class常量135
6.10.2實現靜態方法135
6.10.3檢查類的類型和類型提示136
6.10.4克隆對象136
6.10.5使用抽象類137
6.10.6使用__call()重載方法137
6.10.7使用__autoload()方法138
6.10.8實現迭代器和迭代138
6.10.9將類轉換成字元串140
6.10.10使用Reflection(反射)API140
6.11下一章141
第7章錯誤和異常處理142
7.1異常處理的概念142
7.2Exception類144
7.3用戶自定義異常144
7.4Bob的汽車零部件商店應用程序的異常146
7.5異常和PHP的其他錯誤處理機制150
7.6進一步學習150
7.7下一章150
第二篇使用MySQL
第8章設計Web資料庫151
8.1關系資料庫的概念152
8.1.1表格152
8.1.2列152
8.1.3行152
8.1.4值152
8.1.5鍵152
8.1.6模式153
8.1.7關系153
8.2如何設計Web資料庫154
8.2.1考慮要建模的實際對象154
8.2.2避免保存冗餘數據154
8.2.3使用原子列值155
8.2.4選擇有意義的鍵156
8.2.5考慮需要詢問資料庫的問題156
8.2.6避免多個空屬性的設計156
8.2.7表格類型的總結157
8.3Web資料庫架構157
8.4進一步學習158
8.5下一章158
第9章創建Web資料庫159
9.1使用MySQL監視程序160
9.2登錄到MySQL160
9.3創建資料庫和用戶161
9.4設置用戶與許可權162
9.5MySQL許可權系統的介紹162
9.5.1最少許可權原則162
9.5.2創建用戶:GRANT命令162
9.5.3許可權的類型和級別163
9.5.4REVOKE命令165
9.5.5使用GRANT和REVOKE的例子165
9.6創建一個Web用戶166
9.7使用正確的資料庫166
9.8創建資料庫表167
9.8.1理解其他關鍵字的意思168
9.8.2理解列的類型169
9.8.3用SHOW和DESCRIBE來查看資料庫170
9.8.4創建索引171
9.9理解MySQL的標識符171
9.10選擇列數據類型172
9.10.1數字類型173
9.10.2日期和時間類型174
9.10.3字元串類型174
9.11進一步學習176
9.12下一章176
第10章使用MySQL資料庫177
10.1SQL是什麼177
10.2在資料庫中插入數據177
10.3從資料庫中獲取數據179
10.3.1獲取滿足特定條件的數據181
10.3.2從多個表中獲取數據182
10.3.3以特定的順序獲取數據186
10.3.4分組與合計數據186
10.3.5選擇要返回的行188
10.3.6使用子查詢188
10.4更新資料庫記錄190
10.5創建後修改表191
10.6刪除資料庫中的記錄193
10.7表的刪除193
10.8刪除整個資料庫193
10.9進一步學習194
10.10下一章194
第11章使用PHP從Web訪問MySQL資料庫195
11.1Web資料庫架構的工作原理195
11.2從Web查詢資料庫的基本步驟198
11.2.1檢查與過濾用戶輸入數據198
11.2.2建立一個連接199
11.2.3選擇使用的資料庫200
11.2.4查詢資料庫200
11.2.5檢索查詢結果201
11.2.6從資料庫斷開連接202
11.3將新信息放入資料庫202
11.4使用Prepared語句205
11.5使用PHP與資料庫交互的其他介面206
11.5.1使用常規的資料庫介面:PEARMDB2206
11.6進一步學習209
11.7下一章209
第12章MySQL高級管理210
12.1深入理解許可權系統210
12.1.1user表211
12.1.2db表和host表212
12.1.3tables_priv表,columns_priv表和procs_priv表212
12.1.4訪問控制:MySQL如何使用Grant表213
12.1.5更新許可權:修改什麼時候生效213
12.2提高MySQL資料庫的安全性214
12.2.1從操作系統角度來保護MySQL214
12.2.2密碼214
12.2.3用戶許可權215
12.2.4Web問題215
12.3獲取更多關於資料庫的信息216
12.3.1使用SHOW獲取信息216
12.3.2使用DESCRIBE獲取關於列的信息218
12.3.3用EXPLAIN理解查詢操作的工作過程218
12.4資料庫的優化221
12.4.1設計優化222
12.4.2許可權222
12.4.3表的優化222
12.4.4使用索引222
12.4.5使用默認值222
12.4.6其他技巧222
12.5備份MySQL資料庫222
12.6恢復MySQL資料庫223
12.7實現復制223
12.7.1設置主伺服器224
12.7.2執行初始的數據傳輸224
12.7.3設置一個/多個從伺服器225
12.8進一步學習225
12.9下一章225
第13章MySQL高級編程226
13.1LOADDATAINFILE語句226
13.2存儲引擎226
13.3事務227
13.3.1理解事務的定義227
13.3.2通過InnoDB使用事務228
13.4外鍵229
13.5存儲過程230
13.5.1基本示例230
13.5.2局部變數232
13.5.3游標和控制結構233
13.6進一步學習236
13.7下一章236
第三篇電子商務與安全性
第14章運營一個電子商務網站237
14.1我們要實現什麼目標237
14.2考慮電子商務網站的類型237
14.2.1使用在線說明書公布信息238
14.2.2接收產品或服務的訂單240
14.2.3提供服務和數字產品243
14.2.4為產品或服務增值243
14.2.5減少成本243
14.3理解風險和威脅244
14.3.1網路黑客244
14.3.2不能招攬足夠的生意245
14.3.3計算機硬體故障245
14.3.4電力、通信、網路或運輸故障245
14.3.5廣泛的競爭245
14.3.6軟體錯誤245
14.3.7不斷變化的政府政策和稅收246
14.3.8系統容量限制246
14.4選擇一個策略246
14.5下一章246
第15章電子商務的安全問題247
15.1信息的重要程度247
15.2安全威脅248
15.2.1機密數據的泄露248
15.2.2數據丟失和數據破壞249
15.2.3數據修改250
15.2.4拒絕服務251
15.2.5軟體錯誤251
15.2.6否認252
15.3易用性,性能、成本和安全性253
15.4建立一個安全政策253
15.5身份驗證原則254
15.6加密技術基礎255
15.6.1私有密鑰加密256
15.6.2公有密鑰加密256
15.6.3數字簽名256
15.7數字證書257
15.8安全的Web伺服器258
15.9審計與日誌記錄259
15.10防火牆259
15.11備份數據259
15.11.1備份常規文件260
15.11.2備份與恢復MySQL資料庫260
15.12自然環境安全260
15.13下一章261
第16章Web應用的安全
16.1處理安全性問題的策略
16.1.1以正確心態為開始
16.1.2安全性和可用性之間的平衡
16.1.3安全監視
16.1.4基本方法
16.2識別所面臨的威脅
16.2.1訪問或修改敏感數據
16.2.2數據丟失或破壞
16.2.3拒絕服務
16.2.4惡意代碼注入
16.2.5伺服器被攻破
16.3了解與我們「打交道」的用戶
16.3.1破解人員
16.3.2受影響機器的未知情用戶
16.3.3對公司不滿的員工
16.3.4硬體被盜
16.3.5我們自身
16.4代碼的安全性
16.4.1過濾用戶輸入
16.4.2轉義輸出
16.4.3代碼組織
16.4.4代碼自身的問題
16.4.5文件系統因素
16.4.6代碼穩定性和缺陷
16.4.7執行引號和exec
16.5Web伺服器和PHP的安全性
16.5.1保持軟體的更新
16.5.2查看php.ini文件
16.5.3Web伺服器配置
16.5.4Web應用的商業主機服務
16.6資料庫伺服器的安全性
16.6.1用戶和許可權系統
16.6.2發送數據至伺服器
16.6.3連接伺服器
16.6.4運行伺服器
16.7保護網路
16.7.1安裝防火牆
16.7.2使用隔離區域(DMZ)
16.7.3應對DoS和DDoS攻擊
16.8計算機和操作系統的安全性
16.8.1保持操作系統的更新
16.8.2隻運行必須的軟體
16.8.3伺服器的物理安全性
16.9災難計劃
16.10下一章
第17章使用PHP和MySQL實現身份驗證262
17.1識別訪問者262
17.2實現訪問控制263
17.2.1保存密碼265
17.2.2密碼的加密267
17.2.3保護多個網頁268
17.3使用基本身份驗證269
17.4在PHP中使用基本身份驗證270
17.5在Apache的.htaccess文件中使用基本身份驗證271
17.6使用mod_auth_mysql身份驗證276
17.6.1安裝mod_auth_mysql276
17.6.2使用mod_auth_mysql277
17.7創建自定義身份驗證277
17.8進一步學習278
17.9下一章278
第18章使用PHP和MySQL實現安全事務279
18.1提供安全的事務處理279
18.1.1用戶機器280
18.1.2Internet281
18.1.3我們的系統281
18.2使用加密套接字層(SSL)282
18.3屏蔽用戶的輸入284
18.4提供安全存儲284
18.5存儲信用卡號碼285
18.6在PHP中使用加密技術286
18.6.1安裝GPG286
18.6.2測試GPG288
18.7進一步學習293
18.8下一章293
第四篇PHP的高級技術
第19章與文件系統和伺服器的交互295
19.1文件上載295
19.1.1文件上載的HTML代碼296
19.1.2編寫處理文件的PHP297
19.1.3避免常見上載問題300
19.2使用目錄函數300
19.2.1從目錄讀取300
19.2.2獲得當前目錄的信息302
19.2.3創建和刪除目錄302
19.3與文件系統的交互302
19.3.1獲取文件信息302
19.3.2更改文件屬性304
19.3.3創建、刪除和移動文件305
19.4使用程序執行函數305
19.5與環境變數交互:getenv()和putenv()308
19.6進一步學習308
19.7下一章308
第20章使用網路函數和協議函數309
20.1了解可供使用的協議309
20.2發送和讀取電子郵件309
20.3使用其他Web站點的數據310
20.4使用網路查找函數312
20.5備份或鏡像一個文件
20.5.1使用FTP備份或鏡像一個文件316
20.5.2上傳文件321
20.5.3避免超時321
20.5.4使用其他的FTP函數322
20.6進一步學習322
20.7下一章323
第21章日期和時間的管理324
21.1在PHP中獲取日期和時間324
21.1.1使用date()函數324
21.1.2使用UNIX時間戳325
21.1.3使用getdate()函數326
21.1.4使用checkdate()函數檢驗日期有效性327
21.1.5格式化時間戳
21.2在PHP日期格式和MySQL日期格式之間進行轉換327
21.3在PHP中計算日期329
21.4在MySQL中計算日期329
21.5使用微秒331
21.6使用日歷函數331
21.7進一步學習332
21.8下一章332
第22章創建圖像333
22.1在PHP中設置圖像支持333
22.2理解圖像格式334
22.2.1JPEG334
22.2.2PNG334
22.2.3WBMP335
22.2.4GIF335
22.3創建圖像335
22.3.1創建一個背景圖像336
22.3.2在圖像上繪圖或列印文本337
22.3.3輸出最終圖形338
22.3.4清理339
22.4在其他頁面中使用自動生成的圖像339
22.5使用文本和字體創建圖像339
22.5.1創建基本畫布342
22.5.2將文本調整到適合按鈕342
22.5.3放置文本345
22.5.4將文本寫到按鈕上345
22.5.5完成345
22.6繪制圖像與用圖表描繪數據346
22.7使用其他的圖像函數352
22.8進一步學習352
22.9下一章353
第23章在PHP中使用會話控制354
23.1什麼是會話控制354
23.2理解基本的會話功能354
23.2.1什麼是cookie354
23.2.2通過PHP設置cookie355
23.2.3在會話中使用cookie355
23.2.4存儲會話ID356
23.3實現簡單的會話356
23.3.1開始一個會話356
23.3.2注冊一個會話變數356
23.3.3使用會話變數357
23.3.4注銷變數與銷毀會話357
23.4創建一個簡單的會話例子357
23.5配置會話控制359
23.6通過會話控制實現身份驗證360
23.7進一步學習365
23.8下一章365
第24章其他有用的特性366
24.1使用eval()函數對字元串求值367
24.2終止執行:die和exit367
24.3序列化變數和對象368
24.4獲取PHP環境信息369
24.4.1找到所載入的PHP擴展部件369
24.4.2識別腳本所有者370
24.4.3確定腳本最近修改時間370
24.5暫時改變運行時環境370
24.6源代碼加亮371
24.7在命令行中使用PHP372
24.8下一章372
第五篇創建實用的PHP和MySQL項目
第25章在大型項目中使用PHP和MySQL373
25.1在Web開發中應用軟體工程374
25.2規劃和運行Web應用程序項目374
25.3重用代碼375
25.4編寫可維護代碼375
25.4.1編碼標准375
25.4.2分解代碼378
25.4.3使用標準的目錄結構378
25.4.4文檔化和共享內部函數378
25.5實現版本控制379
25.6選擇一個開發環境380
25.7項目的文檔化380
25.8建立原型381
25.9將邏輯和內容分離381
25.10優化代碼382
25.10.1使用簡單優化382
25.10.2使用Zend產品382
25.11測試383
25.12進一步學習383
25.13下一章384
第26章調試385
26.1編程錯誤385
26.1.1語法錯誤385
26.1.2運行時錯誤386
26.1.3邏輯錯誤391
26.2使用變數幫助調試392
26.3錯誤報告級別393
26.4改變錯誤報告設置394
26.5觸發自定義錯誤395
26.6巧妙地處理錯誤396
26.7下一章398
第27章建立用戶身份驗證機制和個性化設置399
27.1解決方案的組成399
27.1.1用戶識別和個性化設置399
27.1.2保存書簽400
27.1.3推薦書簽400
27.2解決方案概述400
27.3實現資料庫402
27.4實現基本的網站403
27.5實現用戶身份驗證405
27.5.1注冊405
27.5.2登錄410
27.5.3登出413
27.5.4修改密碼414
27.5.5重設遺忘的密碼416
27.6實現書簽的存儲和檢索420
27.6.1添加書簽420
27.6.2顯示書簽422
27.6.3刪除書簽422
27.7實現書簽推薦424
27.8考慮可能的擴展427
27.9下一章427
第28章創建一個購物車428
28.1解決方案的組成428
28.1.1創建一個在線目錄428
28.1.2在用戶購買商品的時候記錄購買行為429
28.1.3實現一個付款系統429
28.1.4創建一個管理界面429
28.2解決方案概述429
28.3實現資料庫432
28.4實現在線目錄434
28.4.1列出目錄434
28.4.2列出一個目錄中的所有圖書437
28.4.3顯示圖書詳細信息438
28.5實現購物車440
28.5.1使用show_cart.php腳本440
28.5.2瀏覽購物車442
28.5.3將物品添加到購物庫444
28.5.4保存更新後的購物車446
28.5.5列印標題欄摘要447
28.5.6結賬447
28.6實現付款452
28.7實現一個管理界面454
28.8擴展該項目460
28.9使用一個已有系統461
28.10下一章461
第29章創建一個基於Web的電子郵件服務系統486
29.1解決方案的組成486
29.1.1電子郵件協議:POP3和IMAP
29.1.2PHP對POP3和IMAP的支持
29.2解決方案概述488
29.3建立資料庫489
29.4了解腳本架構490
29.5登錄與登出495
29.6建立賬戶498
29.6.1創建一個新賬戶499
29.6.2修改已有賬戶501
29.6.3刪除賬戶501
29.7閱讀郵件502
29.7.1選擇賬戶502
29.7.2查看郵箱內容504
29.7.3閱讀郵件消息507
29.7.4查看消息標題509
29.7.5刪除郵件509
29.8發送郵件510
29.8.1發送一則新消息510
29.8.2回復或轉發郵件512
29.9擴展這個項目514
29.10下一章514
第30章創建一個郵件列表管理器515
30.1解決方案的組成515
30.1.1建立列表和訂閱者資料庫516
30.1.2上載新聞信件516
30.1.3發送帶附件的郵件516
30.2解決方案概述516
30.3建立資料庫518
30.4定義腳本架構520
30.5實現登錄526
30.5.1新賬戶的創建527
30.5.2登錄529
30.6用戶函數的實現531
30.6.1查看列表531
30.6.2查看郵件列表信息535
30.6.3查看郵件列表存檔536
30.6.4訂閱與取消訂閱538
30.6.5更改賬戶設置539
30.6.6更改密碼539
30.6.7登出540
30.7管理功能的實現541
30.7.1創建新的郵件列表541
30.7.2上載新的新聞信件543
30.7.3多文件上載的處理545
30.7.4預覽新聞信件549
30.7.5發送郵件550
30.8擴展這個項目555
30.9下一章555
第31章創建一個Web論壇556
31.1理解流程
31.2解決方案的組成556
31.3解決方案概述557
31.4資料庫的設計558
31.5查看文章的樹型結構560
31.5.1展開和折疊561
31.5.2顯示文章564
31.5.3使用treenode類564
31.6查看單個的文章570
31.7添加新文章572
31.8添加擴充578
31.9使用一個已有的系統578
31.10下一章578
第32章生成PDF格式的個性化文檔579
32.1項目概述
32.1.1評估文檔格式579
32.2解決方案的組成582
32.2.1問題與回答系統583
32.2.2文檔生成軟體583
32.3解決方案概述585
32.3.1提問585
32.3.2給答題評分587
32.3.3生成RTF證書589
32.3.4從模板生成PDF證書591
32.3.5使用PDFlib生成PDF文檔595
32.3.6使用PDFlib的一個「HelloWorld」程序595
32.3.7用PDFlib生成證書598
32.4處理標題的問題605
32.5擴展該項目605
32.6下一章606
第33章使用XML和SOAP來連接Web服務607
33.1項目概述:使用XML和Web服務
33.1.1理解XML
33.1.2理解Web服務611
33.2解決方案的組成612
33.2.1使用Amazon的Web服務介面613
33.2.2XML的解析:REST響應
33.2.3在PHP中使用SOAP614
33.2.4緩存614
33.3解決方案概述614
33.3.1核心應用程序618
33.3.2顯示特定種類的圖書623
33.3.3獲得一個AmazonResultSet類624
33.3.4使用REST發送和接收請求
33.3.5使用SOAP發送和接收請求
33.3.6緩存請求返回的數據636
33.3.7創建購物車639
33.3.8到Amazon付賬642
33.4安裝項目代碼642
33.5擴展這個項目643
33.6進一步學習643
第34章使用Ajax構建Web2.0應用
34.1Ajax是什麼?
34.1.1HTTP請求和響應
34.1.2DHTML和XHTML
34.1.3級聯樣式單(CSS)
34.1.4客戶端編程
34.1.5伺服器端編程
34.1.6XML和XSLT
34.2Ajax基礎
34.2.1XMLHTTPRequest對象
34.2.2與伺服器通信
34.2.3處理伺服器響應
34.2.4整合應用
34.3在以前的項目添加Ajax元素
34.3.1在PHPBookmark應用中添加Ajax元素
34.4進一步學習
34.4.1進一步了解文檔對象模型(DOM)
34.4.2Ajax應用可用的JavaScript函數庫
34.4.3Ajax開發人員網站
第六篇附錄
附錄A安裝PHP及MySQL645
附錄BWeb資源664
第1章PHP快速入門教程
第2章數據的存儲與檢索
第3章使用數組
第4章字元串操作與正則表達式
第5章代碼重用與函數編寫
第6章面向對象的PHP
第7章錯誤和異常處理
……
㈧ 用c語言寫一個動態時間表要源代碼
用到的數據結構:
time_t是一個long類型 代表機器時間,可由time( )函數獲得。
日歷時間用一個(char *) 類型的字元串表示。格式為:星期 月 日 小時:分:秒 年\n\0
可由函數ctime( ) asctime( ) 得到。
以tm結構表達的時間,結構tm定義如下:
struct tm { 可由函數localtime( ), gmtime( )得到
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst; };
//系統日期
struct date {
int da_year; /* Year - 1980 */
char da_day; /* Day of the month */
char da_mon; /* Month (1 = Jan) */ };
//系統時間
struct time {
unsigned char ti_min; /* Minutes */
unsigned char ti_hour; /* Hours */
unsigned char ti_hund; /* Hundredths of seconds */
unsigned char ti_sec; /* Seconds */ };
用到的函數:
char * asctime(struct tm * ptr) 將tm結構的時間轉化為日歷時間。
char *ctime(long time) 將機器時間轉化為日歷時間。
struct tm *gmtime(time_t *time) 將機器時間轉化為tm時間
當ptr為空時,得到機器時間;非空時,設置機器時間。
time_t time(time_t *ptr) 得到或設置機器時間
double difftime(time_t time2, time_t time1) 得到兩次機器時間差,單位為秒
long dostounix(struct data *d, struct time *t) 將DOS的日期和時間格式轉換成UNIX標准
(機器時間(用到dos.h庫).void unixtodos(long utime, struct date *d, struct time *t)
將UNIX格式的時間和日期轉換成DOS格式(由time 和date兩部分組成,只能由機器時間得到,並且用到dos.h庫)
void getdate(struct date *d) 得到系統日期,d 存放得到的日期信息
void setdate(struct date *d)
void gettime(struct date *t) 得到系統時間 d 存放得到的時間信息
void settime(struct date *t)
C語言的標准庫函數包括一系列日期和時間處理函數,它們都在頭文件中說明。下面列出了這些函數。
在頭文件中定義了三種類型:time_t,struct tm和clock_t。
在中說明的C語言時間函數
time_t time(time_t *timer);
double difftime(time_t time1,time_t time2);
struct tm *gmtime(const time_t *timer);
struct tm *localtime(const time_t *timer);
char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timer);
size_t strftime(char *s,size_t maxsize,const char *format,const struct tm *timeptr);
time_t mktime(struct tm *timeptr);
clock_t clock(void);
下面是我從網上收集到的時間函數集
asctime(將時間和日期以字元串格式表示)
相關函數
time,ctime,gmtime,localtime
表頭文件
#i nclude
定義函數
char * asctime(const struct tm * timeptr);
函數說明
asctime()將參數timeptr所指的tm結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果以字元串形態返回。
此函數已經由時區轉換成當地時間,字元串格式為:"Wed Jun 30 21:49:08 1993\n"
返回值
若再調用相關的時間日期函數,此字元串可能會被破壞。此函數與ctime不同處在於傳入的參數是不同的結構。
附加說明
返回一字元串表示目前當地的時間日期。
範例
#i nclude
main()
{
time_t timep;
time (&timep);
printf("%s",asctime(gmtime(&timep)));
}
執行
Sat Oct 28 02:10:06 2000
ctime(將時間和日期以字元串格式表示)
相關函數
time,asctime,gmtime,localtime
表頭文件
#i nclude
定義函數
char *ctime(const time_t *timep);
函數說明
ctime ()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果以字元串形態返回。
此函數已經由時區轉換成當地時間,字元串格式為"Wed Jun 30 21 :49 :08 1993\n"。若再調用相關的時間日期函數,此字元串可能會被破壞。
返回值
返回一字元串表示目前當地的時間日期。
範例
#i nclude
main()
{
time_t timep;
time (&timep);
printf("%s",ctime(&timep));
}
執行
Sat Oct 28 10 : 12 : 05 2000
gettimeofday(取得目前的時間)
相關函數
time,ctime,ftime,settimeofday
表頭文件
#i nclude
#i nclude
定義函數
int gettimeofday ( struct timeval * tv , struct timezone * tz )
函數說明
gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的信息則放到tz所指的結構中。
timeval結構定義為:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
timezone 結構定義為:
struct timezone{
int tz_minuteswest; /*和Greenwich 時間差了多少分鍾*/
int tz_dsttime; /*日光節約時間的狀態*/
};
上述兩個結構都定義在/usr/include/sys/time.h。tz_dsttime 所代表的狀態如下
DST_NONE /*不使用*/
DST_USA /*美國*/
DST_AUST /*澳洲*/
DST_WET /*西歐*/
DST_MET /*中歐*/
DST_EET /*東歐*/
DST_CAN /*加拿大*/
DST_GB /*大不列顛*/
DST_RUM /*羅馬尼亞*/
DST_TUR /*土耳其*/
DST_AUSTALT /*澳洲(1986年以後)*/
返回值
成功則返回0,失敗返回-1,錯誤代碼存於errno。附加說明EFAULT指針tv和tz所指的內存空間超出存取許可權。
範例
#i nclude
#i nclude
main(){
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf("tv_sec; %d\n", tv,.tv_sec) ;
printf("tv_usec; %d\n",tv.tv_usec);
printf("tz_minuteswest; %d\n", tz.tz_minuteswest);
printf("tz_dsttime, %d\n",tz.tz_dsttime);
}
執行
tv_sec: 974857339
tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0
gmtime(取得目前時間和日期)
相關函數
time,asctime,ctime,localtime
表頭文件
#i nclude
定義函數
struct tm*gmtime(const time_t*timep);
函數說明
gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果由結構tm返回。
結構tm的定義為
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒數,正常范圍為0-59,但允許至61秒
int tm_min 代表目前分數,范圍0-59
int tm_hour 從午夜算起的時數,范圍為0-23
int tm_mday 目前月份的日數,范圍01-31
int tm_mon 代表目前月份,從一月算起,范圍從0-11
int tm_year 從1900 年算起至今的年數
int tm_wday 一星期的日數,從星期一算起,范圍為0-6
int tm_yday 從今年1月1日算起至今的天數,范圍為0-365
int tm_isdst 日光節約時間的旗標
此函數返回的時間日期未經時區轉換,而是UTC時間。
返回值
返回結構tm代表目前UTC 時間
範例
#i nclude
main(){
char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
printf("%d%d%d",(1900+p->tm_year), (1+p->tm_mon),p->tm_mday);
printf("%s%d;%d;%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}
執行
2000/10/28 Sat 8:15:38
localtime(取得當地目前時間和日期)
相關函數
time, asctime, ctime, gmtime
表頭文件
#i nclude
定義函數
struct tm *localtime(const time_t * timep);
函數說明
localtime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果由結構tm返回。
結構tm的定義請參考gmtime()。此函
數返回的時間日期已經轉換成當地時區。
返回值
返回結構tm代表目前的當地時間。
範例
#i nclude
main(){
char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep); /*取得當地時間*/
printf ("%d%d%d ", (1900+p->tm_year),( l+p->tm_mon), p->tm_mday);
printf("%s%d:%d:%d\n", wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec);
}
執行
2000/10/28 Sat 11:12:22
mktime(將時間結構數據轉換成經過的秒數)
相關函數
㈨ 下面這段源代碼是什麼意思。。
Private Sub Command1_Click() '單擊按鈕
Dim sql As String '定義語句(資料庫SQL語句)
Dim rs_add As New ADODB.Recordset '定義數據集變數
Call open_db '調用函數,函數未知,不過從字面意思即上下文可判斷是資料庫連接語句
If Trim(Text1.Text) = "" Then '如果文本框Text1沒有輸入內容
MsgBox "操作員名不能為空!", vbOKOnly + vbExclamation, ""
'提示"操作員名不能為空!"
Exit Sub '退出過程
Text1.setfoccus '無意義的語句,可能作者寫錯順序了,設置文本框Text1獲得焦點
Else '如果文本框Text1有內容
sql = "selesc*from 系統操作員表" 'SQL語句賦值,注意還沒運行,不過寫錯了,應該是select * from 系統操作員表,空格也不能少的
rs_add.Open sql, conn, adOpenKeyset, adLockPessimistic
'執行以上SQL語句
While (rs_add.EOF = False) '如果未到數據尾,即找到匹配數據
If Trim(rs_add.Fields(0)) = Trim(Text1.Text) Then
'如果找到的數據第一個欄位跟輸入的文本框Text1一致
MsgBox "已有這個用戶!", vbOKOnly + vbExclamation, ""
'提示"已有這個用戶!"
Text1.setfoccus '設置文本框Text1獲得焦點
Text1.Text = "" '清空文本框1,2,3
Text2.Text = ""
Text3.Text = ""
Exit Sub '退出過程
Else '如果找到的數據第一個欄位跟輸入的文本框Text1不一致
rs_add.MoveNext '移動到下一個記錄
End If
Wend
'以上代碼是打開資料庫,循環查找,看下輸入的系統操作員是否與存在的資料庫一致,不一致就繼續找,一致就提示已有這個用戶,反正找到最後還沒有重復的就可以添加了,這樣才不會使用戶名重復,其實還有更好的SQL語句可以用,我不知道作者的意圖也不敢妄加揣測
If Trim(Text2.Text) <> Trim(Text3.Text) Then
'如果文本框Text2,文本框Text3不一致提示"兩次密碼不一致!"並清空輸入設置文本框Text2獲得焦點,然後退出過程,這次的退出過程意義不大,可能節約了幾微秒時間去執行一條語句而已吧,並不是不對,只是沒必要什麼時候都加上Exit Sub
MsgBox "兩次密碼不一致!", vbOKOnly + vbExclamation, ""
Text2.SetFocus
Text2.Text = ""
Text3.Text = ""
Exit Sub
Else '如果文本框Text2,文本框Text3輸入一致
rs_add.AddNew '准備進行加入
rs_add.Fields(0) = Text1.Text '將文本框的內容導入資料庫,從這里可以看出資料庫的設計不太合理,把重復輸入的兩個密碼框都導入那麼數據的一致性就很難保證了,當然,代碼寫好點也沒事,但浪費空間浪費時間的無意義舉動很不好
rs_add.Fields(1) = Text2.Text
rs_add.Fields(2) = Text3.Text
rs_add.updata '更新資料庫
rs_add.Close '關閉資料庫,提示MsgBox "添加用戶成功!"
MsgBox "添加用戶成功!", vbOKOnly + vbExclamation, ""
Unload Me '卸載窗體
End If
End If
End Sub
這是個添加新用戶的代碼,text1輸入用戶名,text2輸入密碼,text3重復輸入密碼,然後先判斷text1是否為空,為空就提示,不然就在資料庫中查找看看有沒有重復的,重復就提示,沒有繼續判斷輸入的密碼一不一致,不一致提示,一致就可以添加了
不過從邏輯的角度看順序可以改下更合理點,先判斷輸入的密碼一不一致再連接資料庫判斷用戶重復好些,這樣可以減少CPU的負載,嘿嘿
㈩ 微信的一元悅購是不是騙人的
我買了16次,開完獎了我都只有10個悅購碼,碼沒配完就開獎了,是不是騙人的大家自己分辨哈!相信你們懂得