Dreamweaver 教學．CG數位學習網

01 Dreamweaver 軟體介紹
02 Dreamweaver 操作界面
04 檔案的命名原則
05 網站的專案設定
06 文字與影像編輯
07 製作網頁超連結
08 網頁表格的運用
09 網頁的屬性設定
10 認識圖層的功能
03 網站設計的流程
11 製作互動式表單
12 頁框網頁的架構
13 行為指令的運用
14 CSS 串接樣式表
15 Spry 工具的運用
16 多媒體網頁的整合
17 網頁範本的運用
18 擴充程式功能介紹
19 擴充程式進階應用
20 網頁的發佈與更新

Adobe Dreamweaver 官方操作說明 http://helpx.adobe.com/tw/dreamweaver/topics.html


MySQL中文參考手冊-目錄

  • 0 譯者序
  • 1 MySQL的一般的資訊
    • 1.1 什麼是MySQL？
    • 1.2 關於本手冊
      • 1.2.1 本手冊中使用的約定
    • 1.3 MySQL的歷史
    • 1.4 MySQL的主要特徵
    • 1.5 MySQL穩定性？
    • 1.6 順應2000年
    • 1.7 SQL一般資訊和教學課程
    • 1.8 有用的MySQL相關鏈接
  • 2 MySQL 郵件列表及如何提問或報告錯誤
    • 2.1 MySQL郵件列表
    • 2.2 提問或報告錯誤
    • 2.3 怎樣報告錯誤或問題
    • 2.4 在郵件列表上回答問題的指南
  • 3 MySQL的使用授權和技術支援
    • 3.1 MySQL的使用授權政策
    • 3.2 MySQL 使用的版權
      • 3.2.1 可能的未來版權改變
    • 3.3 MySQL商業性分發
    • 3.4 使用授權實例
      • 3.4.1 銷售使用 MySQL的產品
      • 3.4.2 銷售MySQL相關的服務
      • 3.4.3 ISP MySQL服務
      • 3.4.4 運營一個使用MySQL的Web伺服器
    • 3.5 MySQL的使用授權和技術支援費用
      • 3.5.1 付款資訊
      • 3.5.2 聯繫資訊
    • 3.6 商業性支援的類型
      • 3.6.1 基本的電子郵件支援
      • 3.6.2 擴展的電子郵件支援
      • 3.6.3 登錄支援
      • 3.6.4 擴展的登錄支援
  • 4 安裝 MySQL
    • 4.1 怎樣獲得MySQL
    • 4.2 MySQL支援的作業系統
    • 4.3 使用MySQL哪個版本
    • 4.4 怎樣和何時發布更新版本
    • 4.5 安裝布局
    • 4.6 安裝MySQL可執行檔版本
      • 4.6.1 Linux RPM注意事項
      • 4.6.2 構造客戶程式
      • 4.6.3 系統特定的問題
        • 4.6.3.1 Linux 注意事項
        • 4.6.3.2 HP-UX 注意事項
    • 4.7 安裝 MySQL原始碼版本
      • 4.7.1 快速安裝概述
      • 4.7.2 運用修補
      • 4.7.3 典型的configure選項
    • 4.8 編譯問題？
    • 4.9 MIT-pthreads 注意事項
    • 4.10 Perl 安裝說明
      • 4.10.1 在Unix作業系統上安裝 Perl
      • 4.10.2 在 Win32上安裝 ActiveState Perl
      • 4.10.3 在 Win32 上安裝 MySQL Perl 分發
      • 4.10.4 使用 Perl DBI/DBD介面遇到的問題
    • 4.11 系統特定的問題
      • 4.11.1 Solaris注意事項
      • 4.11.2 Solaris 2.7 注意事項
      • 4.11.3 Solaris x86 注意事項
      • 4.11.4 SunOS 4 注意事項
      • 4.11.5 Linux (所有的Linux版本)注意事項
        • 4.11.5.1 Linux-x86 注意事項
        • 4.11.5.2 RedHat 5.0 注意事項
        • 4.11.5.3 RedHat 5.1 注意事項
        • 4.11.5.4 Linux-SPARC 注意事項
        • 4.11.5.5 Linux-Alpha 注意事項
        • 4.11.5.6 MkLinux 注意事項
        • 4.11.5.7 Qube2 Linux 注意事項
      • 4.11.6 Alpha-DEC-Unix 注意事項
      • 4.11.7 Alpha-DEC-OSF1 注意事項
      • 4.11.8 SGI-Irix 注意事項
      • 4.11.9 FreeBSD 注意事項
      • 4.11.10 NetBSD 注意事項
      • 4.11.11 BSD/OS 注意事項
        • 4.11.11.1 BSD/OS 2.x 注意事項
        • 4.11.11.2 BSD/OS 3.x 注意事項
        • 4.11.11.3 BSD/OS 4.x 注意事項
      • 4.11.12 SCO 注意事項
      • 4.11.13 SCO Unixware 7.0 注意事項
      • 4.11.14 IBM-AIX 注意事項
      • 4.11.15 HP-UX 注意事項
    • 4.12 Win32 注意事項
      • 4.12.1 在 Win32 上安裝 MySQL
      • 4.12.2 在 Win95 /Win98上啟動 MySQL
      • 4.12.3 在 NT 上啟動 MySQL
      • 4.12.4 在 Win32 上運行 MySQL
      • 4.12.5 用 SSH 從 Win32 連接一個遠程MySQL
      • 4.12.6 MySQL-Win32與Unix MySQL 比較
    • 4.13 OS/2 注意事項
    • 4.14 TcX 二進制代碼
    • 4.15 安裝後期(post-installation)的設置與測試
      • 4.15.1 運行mysql_install_db 的問題
      • 4.15.2 啟動 MySQL 伺服器的問題
      • 4.15.3 自動啟動和停止 MySQL
      • 4.15.4 選項文件
    • 4.16 升級和降級(downgrading)時有什麼特別要做的事情嗎？
      • 4.16.1 從一個 3.22 版本升級到 3.23
      • 4.16.2 從一個 3.21 版本升級到 3.22
      • 4.16.3 從一個 3.20 版本升級到 3.21
      • 4.16.4 升級到其他的體系結構
  • 5 MySQL 與標準的兼容性？
    • 5.1 MySQL對ANSI SQL92 的擴充
    • 5.2 以ANSI模式運行 MySQL
    • 5.3 MySQL相比ANSI SQL92的差別
    • 5.4 MySQL 缺乏的功能
      • 5.4.1 子選擇(Sub-selects)
      • 5.4.2 SELECT INTO TABLE
      • 5.4.3 事務(Transactions)
      • 5.4.4 儲存程序和觸發器
      • 5.4.5 外鍵(Foreign Keys)
        • 5.4.5.1 不使用外鍵的理由
      • 5.4.6 視圖(Views)
      • 5.4.7 '--'作為一個 注解的開始
    • 5.5 MySQL 遵循什麼標準？
    • 5.6 怎樣處理沒有提交/回卷(COMMIT / ROLLBACK)
  • 6 MySQL 存取權限系統
    • 6.1 權限系統做什麼
    • 6.2 MySQL用戶名和密碼
    • 6.3 與MySQL伺服器連接
    • 6.4 使你的密碼安全
    • 6.5 MySQL 提供的權限
    • 6.6 權限系統工作原理
    • 6.7 存取控制,階段1:連接証實
    • 6.8 存取控制,階段2:請求証實
    • 6.9 權限更改何時生效
    • 6.10 建立初始的 MySQL權限
    • 6.11 向MySQL增加新用戶權限
    • 6.12 怎樣設置密碼
    • 6.13 存取拒絕(Access Denied)錯誤的原因
    • 6.14 怎樣使MySQL安全以對抗解密高手(cracker)
  • 7 MySQL 語言參考
    • 7.1 文字:怎樣寫字符串和數字
      • 7.1.1 字符串
      • 7.1.2 數字
      • 7.1.3 十六進制值
      • 7.1.4 NULL值
      • 7.1.5 資料庫，表，索引，列和別名的命名
        • 7.1.5.1 名字的大小寫敏感性
    • 7.2 用戶變數
    • 7.3 列類型
      • 7.3.1 列類型的儲存要求
      • 7.3.5 數字類型
      • 7.3.6 日期和時間類型
        • 7.3.6.1 問題和日期類型
        • 7.3.6.2 DATETIME,DATE和TIMESTAMP類型
        • 7.3.6.3 TIME類型
        • 7.3.6.4 YEAR類型
      • 7.3.7 字符串類型
        • 7.3.7.1 CHAR和VARCHAR類型
        • 7.3.7.2 BLOB和TEXT類型
        • 7.3.7.3 ENUM類型
        • 7.3.7.4 SET類型
      • 7.3.8 為列選擇正確的類型
      • 7.3.9 列索引
      • 7.3.10 多列索引
      • 7.3.11 使用來自其他資料庫引擎的列類型
    • 7.4 用在SELECT和WHERE子句的函數
      • 7.4.1 分組函數
      • 7.4.2 常用的算術運算
      • 7.4.3 位函數
      • 7.4.4 邏輯運算
      • 7.4.5 比較運算符
      • 7.4.6 字符串比較函數
      • 7.4.7 類型轉換運算符
      • 7.4.8 控制流函數
      • 7.4.9 數學函數
      • 7.4.10 字符串函數
      • 7.4.11 日期和時間函數
      • 7.4.12 其他函數
      • 7.4.13 與GROUP BY子句一起使用的函數
    • 7.5 CREATE DATABASE (創建資料庫)句法
    • 7.6 DROP DATABASE (拋棄資料庫)句法
    • 7.7 CREATE TABLE (創建表)句法
      • 7.7.1 隱含(silent)的列指定變化
    • 7.8 ALTER TABLE (改變表)句法
    • 7.9 OPTIMIZE TABLE (最佳化表) 句法
    • 7.10 DROP TABLE (拋棄表)句法
    • 7.11 DELETE (刪除)句法
    • 7.12 SELECT (選取)句法
    • 7.13 JOIN (聯接)句法
    • 7.14 INSERT (插入)句法
    • 7.15 REPLACE (替換)句法
    • 7.16 LOAD DATA INFILE (裝載數據到文件)句法
    • 7.17 UPDATE (更新)句法
    • 7.18 USE (使用)句法
    • 7.19 FLUSH (清除緩存）句法
    • 7.20 KILL (殺滅)句法
    • 7.21 SHOW (顯示)句法(得到關於表,列等的資訊）
    • 7.22 EXPLAIN (解釋)句法(得到關於SELECT的資訊)
    • 7.23 DESCRIBE (描述)句法(得到列的資訊）
    • 7.24 LOCK TABLES/UNLOCK TABLES (鎖定表/解鎖表)句法
    • 7.25 SET OPTION (設置選項)句法
    • 7.26 GRANT (授權)和REVOKE (撤回)句法
    • 7.27 CREATE INDEX (創建索引)句法
    • 7.28 DROP INDEX (拋棄索引)句法
    • 7.29 注釋句法
    • 7.30 CREATE FUNCTION/DROP FUNCTION (創建函數/拋棄函數)句法
    • 7.31 MySQL對保留字很挑剔嗎？
  • 8 MySQL 教學課程
    • 8.1 聯接和斷開伺服器
    • 8.2 輸入查詢
    • 8.3 常用查詢的例子
      • 8.3.1 列的最大值
      • 8.3.2 擁有某個列的最大值的行
      • 8.3.3 列的最大值:按組:只有值
      • 8.3.4 擁有某個字段的組間最大值的行
      • 8.3.5 使用外鍵
    • 8.4 創建並使用一個資料庫
      • 8.4.1 創建並選用一個資料庫
      • 8.4.2 創建一個資料庫表
      • 8.4.3 將數據裝入資料庫表
      • 8.4.4 從一個資料庫表檢索資訊
        • 8.4.4.1 選擇所有數據
        • 8.4.4.2 選擇特定行
        • 8.4.4.3 選擇特定列
        • 8.4.4.4 排序行
        • 8.4.4.5 日期計算
        • 8.4.4.6 NULL值操作
        • 8.4.4.7 模式匹配
        • 8.4.4.8 行計數
      • 8.4.5 使用多個資料庫表
    • 8.5 獲得資料庫和表的資訊
    • 8.6 以批處理模式使用mysql
    • 8.7 從"雙胞項目"中查詢
      • 8.7.1 找出所有非獨處的雙胞胎
      • 8.7.2 顯示關於雙胞胎近況的表
  • 9 MySQL 伺服器功能
    • 9.1 MySQL 支援哪些語言？
      • 9.1.1 用於數據和排序的字符集
      • 9.1.2 增加一個新的字符集
      • 9.1.3 多字節字符支援
    • 9.2 更新日誌
    • 9.3 MySQL資料庫表可以有多大？
    • 9.4 MySQL資料庫表類型
  • 10 從 MySQL 得到最大的性能
    • 10.1 最佳化概述
    • 10.2 系統/編譯時和啟動參數的調節
      • 10.2.1 編譯和鏈接如何影響 MySQL 的速度
      • 10.2.2 磁碟問題
        • 10.2.2.1 為資料庫和表格使用符號鏈接
      • 10.2.3 調節伺服器參數
      • 10.2.4 MySQL 怎樣打開和關閉資料庫表
      • 10.2.5 在同一個資料庫中創建大量資料庫表的缺點
      • 10.2.6 為什麼有這麼多打開的表？
      • 10.2.7 MySQL 怎樣使用內存
      • 10.2.8 MySQL 怎樣鎖定資料庫表
      • 10.2.9 資料庫表級鎖定的問題
    • 10.3 使你的數據盡可能小
    • 10.4 MySQL 索引的使用
    • 10.5 存取或更新數據的查詢速度
      • 10.5.1 估計查詢性能
      • 10.5.2 SELECT 查詢的速度
      • 10.5.3 MySQL 怎樣最佳化WHERE子句
      • 10.5.4 MySQL 怎樣最佳化LEFT JOIN
      • 10.5.5 MySQL 怎樣最佳化LIMIT
      • 10.5.6 INSERT查詢的速度
      • 10.5.7 UPDATE查詢的速度
      • 10.5.8 DELETE查詢的速度
    • 10.6 選擇一種表類型
      • 10.6.1 靜態(定長)表的特點
      • 10.6.2 動態表的特點
      • 10.6.3 壓縮表的特點
      • 10.6.4 內存(In-memory table)表的特點
    • 10.7 其他最佳化技巧
    • 10.8 使用你自己的效能測試
    • 10.9 設計選擇
    • 10.10 MySQL 設計局限/折衷
    • 10.11 可移植性
    • 10.12 我們已將MySQL用在何處？
  • 11 MySQL 效能套件
  • 12 MySQL 實用程式
    • 12.1 各種 MySQL 程式概述
    • 12.2 管理一個 MySQL 伺服器
    • 12.3 從 MySQL 資料庫和表中倒出(dump)結構和數據
    • 12.4 從文本文件導入數據
    • 12.5 MySQL 壓縮只讀表產生器
  • 13 維護 MySQL 安裝
    • 13.1 使用myisamchk進行表維護和崩潰恢復
      • 13.1.1 myisamchk的調用語法
      • 13.1.2 myisamchk的內存使用
    • 13.2 13.2 建立一個資料庫表維護規範
    • 13.3 獲得關於一個表的資訊
    • 13.4 使用myisamchk進行崩潰恢復
      • 13.4.1 怎樣檢查表的出錯
      • 13.4.2 怎樣修復表
      • 13.4.3 表最佳化
    • 13.5 日誌文件維護
  • 14 為MySQL增加新函數
    • 14.1 增加一個新的用戶定義函數
      • 14.1.1 UDF調用順序
      • 14.1.2 參數處理
      • 14.1.3 返回值和出錯處理
      • 14.1.4 編譯並安裝用戶定義函數
    • 14.2 增加一個新的原生(native)函數
  • 15 為MySQL增加新程序
    • 15.1 analyse程序
    • 15.2 編寫一個程序
  • 16 MySQL對 ODBC 支援
    • 16.1 MyODBC 支援的作業系統
    • 16.2 怎樣報告 MyODBC的問題
    • 16.3 已知可用 MyODBC一起工作的程式
    • 16.4 怎樣填寫 ODBC 管理程式的各種域
    • 16.5 怎樣在ODBC中獲得一個AUTO_INCREMENT列的值
    • 16.6 報告 MyODBC 的問題
  • 17 與一些常用程式一起使用MySQL
    • 17.1 與 Apache一起使用 MySQL
  • 18 問題和常見的錯誤
    • 18.1 如果 MySQL總是崩潰怎麼辦
    • 18.2 使用 MySQL 時一些常見錯誤
      • 18.2.1 MySQL server has gone away錯誤
      • 18.2.2 Can't connect to [local] MySQL server錯誤
      • 18.2.3 Host '...' is blocked錯誤
      • 18.2.4 Out of memory錯誤
      • 18.2.5 Packet too large錯誤
      • 18.2.6 The table is full錯誤
      • 18.2.7 Commands out of sync in client錯誤
      • 18.2.8 Ignoring user錯誤
      • 18.2.9 Table 'xxx' doesn't exist錯誤
    • 18.3 MySQL 怎樣處理一個溢出的磁碟
    • 18.4 怎樣從一個文本文件運行SQL命令
    • 18.5 MySQL 在哪兒儲存臨時文件
    • 18.6 怎樣保護"/tmp/mysql.sock"不被刪除
    • 18.7 Access denied 出錯
    • 18.8 怎樣作為一個一般用戶運行 MySQL
    • 18.9 怎樣重新設置一個忘記的密碼
    • 18.10 文件許可權限問題
    • 18.11 文件沒找到
    • 18.12 使用DATE列的問題
    • 18.13 時區問題
    • 18.14 在搜索中的大小寫敏感性
    • 18.15 NULL值問題
    • 18.16 alias問題
    • 18.17 從相關的表中刪除行
    • 18.18 解決沒有匹配行的問題
    • 18.19 ALTER TABLE問題
    • 18.20 怎樣改變一個表中列的次序
  • 19 解決MySQL 一些常見的問題
    • 19.1 資料庫複製
    • 19.2 資料庫備份
    • 19.3 在同一台機器上運行多個 MySQL 伺服器
  • 20 MySQL 客戶工具和 API
    • 20.1 MySQL C API
    • 20.2 C API數據類型
    • 20.3 C API函數概述
    • 20.4 C API函數描述
      • 20.4.1 mysql_affected_rows (）
      • 20.4.2 mysql_close (）
      • 20.4.3 mysql_connect (）
      • 20.4.4 mysql_change_user (）
      • 20.4.5 mysql_create_db (）
      • 20.4.6 mysql_data_seek (）
      • 20.4.7 mysql_debug (）
      • 20.4.8 mysql_drop_db (）
      • 20.4.9 mysql_dump_debug_info (）
      • 20.4.10 mysql_eof (）
      • 20.4.11 mysql_errno (）
      • 20.4.12 mysql_error (）
      • 20.4.13 mysql_escape_string (）
      • 20.4.14 mysql_fetch_field (）
      • 20.4.15 mysql_fetch_fields (）
      • 20.4.16 mysql_fetch_field_direct (）
      • 20.4.17 mysql_fetch_lengths (）
      • 20.4.18 mysql_fetch_row (）
      • 20.4.19 mysql_field_count (）
      • 20.4.20 mysql_field_seek (）
      • 20.4.21 mysql_field_tell (）
      • 20.4.22 mysql_free_result (）
      • 20.4.23 mysql_get_client_info (）
      • 20.4.24 mysql_get_host_info (）
      • 20.4.25 mysql_get_proto_info (）
      • 20.4.26 mysql_get_server_info (）
      • 20.4.27 mysql_info (）
      • 20.4.28 mysql_init (）
      • 20.4.29 mysql_insert_id (）
      • 20.4.30 mysql_kill (）
      • 20.4.31 mysql_list_dbs (）
      • 20.4.32 mysql_list_fields (）
      • 20.4.33 mysql_list_processes (）
      • 20.4.34 mysql_list_tables (）
      • 20.4.35 mysql_num_fields (）
      • 20.4.36 mysql_num_rows (）
      • 20.4.37 mysql_options (）
      • 20.4.38 mysql_ping (）
      • 20.4.39 mysql_query (）
      • 20.4.40 mysql_real_connect (）
      • 20.4.41 mysql_real_query (）
      • 20.4.42 mysql_reload (）
      • 20.4.43 mysql_row_seek (）
      • 20.4.44 mysql_row_tell (）
      • 20.4.45 mysql_select_db (）
      • 20.4.46 mysql_shutdown (）
      • 20.4.47 mysql_stat (）
      • 20.4.48 mysql_store_result (）
      • 20.4.49 mysql_thread_id (）
      • 20.4.50 mysql_use_result (）
      • 20.4.51 為什麼在mysql_query()返回成功後mysql_store_result()有時返回NULL?
      • 20.4.52 我能從查詢得到什麼結果？
      • 20.4.53 我怎樣才能獲得最後插入的行的唯一ID？
      • 20.4.54 鏈接 C API的問題
      • 20.4.55 怎樣制作一個執行緒安全(thread-safe)的客戶
    • 20.5 MySQL Perl API
      • 20.5.1 DBI與DBD::mysql
      • 20.5.2 DBI介面
      • 20.5.3 更多的DBI/DBD資訊
    • 20.6 MySQL Eiffel 包裝
    • 20.7 MySQL Java 連接(JDBC)
    • 20.8 MySQL PHP API
    • 20.9 MySQL C++ API
    • 20.10 MySQL Python API
    • 20.11 MySQL TCL API
  • 21 怎樣對比MySQL與其他資料庫
    • 21.1 怎樣對比MySQL和mSQL
      • 21.1.1 怎樣將mSQL工具轉換到MySQL
      • 21.1.2 mSQL和MySQL的 客戶機/伺服器通訊協議有何不同
      • 21.1.3 mSQL 2.0 SQL句法與MySQL有何不同
    • 21.2 怎樣對比MySQL與PostgreSQL
  • A 一些 MySQL 用戶
  • B 貢獻的程式
  • C MySQL貢獻者
  • D MySQL 變遷的歷史記錄
  • E MySQL中已知的錯誤和設計缺限
  • F 我們想要在未來加入到MySQL 的計劃表( TODO ）
  • G 對移植到其他系統的說明
  • H MySQL 正則表達式句法的描述
  • I 什麼是 Unireg？
  • J 針對非微軟作業系統的 MySQL 伺服器使用授權
  • K 針對微軟作業系統的 MySQL 使用授權
  • SQL命令，類型和函數索引
  • 概念索引

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html


MySQL中文參考手冊- 1 mysql的一般資訊

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章,前一章， 下一章, 最後一章, 目錄.

1 MySQL 的一般資訊

這是MySQL參考手冊﹔它記載了MySQL版本3.23.7-alpha。

MySQL 是一個快速、多執行緒、多使用者和強壯的SQL資料庫伺服器。

對Unix和 OS/2 平台，MySQL基本上是免費的﹔但對微軟平台，你在30 天的試用期後必須獲得一個MySQL 使用授權。詳見第三節 MySQL使用授權和技術支援。

MySQL 主頁提供有關MySQL的最新資訊。

對於MySQL能力的討論，詳見1.4 MySQL 的主要特徵。

對於安裝指南，見4 安裝 MySQL。對於有關移植MySQL到新機器或作業系統的技巧，參見G 對移植到其他系統的說明。

有關從 3.21 版升級的資訊，詳見4.16.2 從一個 3.21 版本升級到 3.22 。

MySQL的入門教學課程，見8 MySQL 教學課程。

SQL和效能資訊的例子，見效能目錄(在分發中的'sql-bench'目錄)。

對於新特徵和錯誤修復一個歷史記錄，見D MySQL的變遷。

對於當前已知錯誤和功能缺陷的一張列表，見E MySQL已知錯誤和設計缺陷。

未來計劃，見F 我們想要在未來加入到MySQL 的計劃表( TODO ）。

這個計劃的所有貢獻者的名單，見C MySQL 的貢獻者。

重要：

將臭虫(錯誤)報告、問題和建議發到郵件列表（原文未提供）。

對原始碼版本，mysqlbug 腳本可在‘scripts’目錄下找到。 對可執行檔版本，mysqlbug可在‘bin’目錄下找到。

如果你有任何關於這本手冊的增補或修正的任何建議，請將它們發給手冊小組(docs@mysql.com )。

1.1 什麼是 MySQL？

MySQL是一個真正的多使用者、多執行緒SQL資料庫伺服器。SQL（結構化查詢語言）是世界上最流行的和標準化的資料庫語言。MySQL是以一個客戶機/伺服器結構的實現，它由一個伺服器背景執行程式mysqld和很多不同的客戶程式和庫組成。

SQL是一種標準化的語言，它使得儲存、更新和存取資訊更容易。例如，你能用SQL語言為一個網站檢索產品資訊及儲存顧客資訊，同時MySQL也足夠快和靈活以允許你儲存記錄文件和圖像。

MySQL 主要目標是快速、健壯和易用。最初是因為我們需要這樣一個SQL伺服器，它能處理與任何可不昂貴硬件平台上提供資料庫的廠家在一個數量級上的大型資料庫，但速度更快，MySQL就開發出來。自1996年以來，我們一直都在使用MySQL，其環境有超過 40 個資料庫，包含 10,000個表，其中500多個表超過7百萬行，這大約有100 個吉字節(GB)的關鍵應用數據。

MySQL建立的基礎是業已用在高要求的生產環境多年的一套實用例程。盡管MySQL仍在開發中，但它已經提供一個豐富和極其有用的功能集。

MySQL的官方發音是“My Ess Que Ell”(不是 MY-SEQUEL )。

1.2 關於本手冊

目前這本手冊有Texinfo、純文字版、Info、HTML、PostScript和 PDF 等格式的版本。因為它們的長度，PostScript和 PDF 版本沒有包括在主要的MySQL分發中，但是可從http://www.mysql.com 獲得單獨的下載。

主要的文檔是Texinfo文件， HTML版本自動地用一個texi2html改進版本產生。純文字版和Info版本用makeinfo產生。 Postscript版本由texi2dvi和dvips產生。PDF 版本用pdftex產生。

本手冊由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale維護。 而其他的貢獻者，見C MySQL貢獻者。

1.2.1 本手冊中使用的約定

這本手冊使用了一定文字格式的約定：

constant / 固定寬度
固定寬度字體用於命令名字和選擇、SQL語句、資料庫、表和列命名、C 和 Perl 代碼、環境變數。例如：“為了了解mysqladmin如何工作，用--help選項調用它”。
'文件名'
有包圍引號的固定寬度字體用於文件名和路徑。例如：“發行版本被安裝在'/usr/local/'目錄下”。
'c'
有包圍引號的固定寬度字體也用於指明字符序列。例如：“要指定一個通配符，使用'%'字符”。
斜體
斜體的字體被用於強調，like this 。
粗體
粗體用於存取權限名字(例如，“不要輕易授權process權限”)並表達特別強調。

當命令顯示出準備由一個特定的程式執行時，程式由命令所顯示的提示符指出。例如，shell> 表明你從你的殼程式執行一個命令，而mysql>表明你從mysql客戶執行命令：

shell> 在這鍵入一個shell命令
mysql> 在這裡鍵入一個mysql命令

shell命令用 Bourne shell語法顯示。如果你正在使用csh風格的外殼，你可能需要用略微不同的方式發出命令。例如，設置一個環境變數和運行一個命令的序列在 Bourne shell語法看起來像這樣：

shell> VARNAME=value some_command

對於csh，你將執行這樣的序列：

shell> setenv VARNAME value
shell> some_command

資料庫、表和列名字經常必須被代入命令中。為表明這種代入是必要的，本手冊使用db_name、tbl_name和col_name。例如，你可能看到像這樣的語句：

mysql> SELECT col_name FROM db_name.tbl_name;

這意味著如果你想輸入類似的語句，你將提供你自己資料庫、表和列的名字，也許像這樣：

mysql> SELECT author_name FROM biblio_db.author_list;

SQL語句可以寫成大寫或小寫的。當本手冊顯示SQL語句時，如果討論這些關鍵字，大寫被用於特定的關鍵字(強調它們)而小寫被用於語句的其他部分。因此你可能在討論SELECT語句時看到如下顯示：

mysql> SELECT count(*) FROM tbl_name;

另一方面，在討論COUNT()函數時，語句將寫成這樣：

mysql> select COUNT(*) from tbl_name;

如果不有意地特別強調，所有的關鍵字一律寫成大寫。

在句法描述中，方括號('['和']')被用來表示任選的詞或子句：

DROP TABLE [IF EXISTS] tbl_name

當一個語法元素由很多選擇組成時，各選擇用垂直線分開('|')。當可能從一組選擇中選擇一個成員時，選擇在方括號內被列出。當必須從一組選擇中選擇一個成員時，選擇在花括號內被列出('{'和'}')：

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
{DESCRIBE | DESC} tbl_name {col_name | wild}

1.3 MySQL 的歷史

我們曾經開始打算利用mSQL用我們自己的快速底層(ISAM)實用程式連接我們的資料庫表，然而，在一些測試以後我們得到出結論：mSQL對我們的需求來說不夠快速和靈活。這導致了一個連接我們資料庫的新SQL介面，但它幾乎有與mSQL相同的應用編程介面。選擇這個應用編程介面以方便第三方的代碼移植。

MySQL名字的由來不是非常清楚。我們的基目錄和很多的庫和工具具有前綴“my”已超過10年歷史，然而，Monty的女兒(年輕幾歲的)也被命名"my"。因此其中哪一個原因給MySQL起了這個名字仍然是一個謎，甚至對我們。

1.4 MySQL 的主要特徵

下表描述MySQL一些重要的特徵：

  • 使用核心執行緒的完全多執行緒。這意味著它能很容易地利用多CPU（如果有）。
  • C 、C++、 Eiffel 、 Java、 Perl、 PHP、Python、和 TCL API。見20 MySQL 客戶工具和 API。
  • 可運行在不同的平台上，見4.2 MySQL支援的作業系統。
  • 多種列類型：1、 2、 3、4、和 8 字節長度的有符號/無符號整數、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、SET和ENUM類型。 見7.3 列類型。
  • 利用一個最佳化的一遍掃描多重聯結（one-sweep multi-join）非常快速地進行聯結(join)。
  • 在查詢的SELECT和WHERE部分支援全部運算符和函數，例如：
    mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name
           WHERE income/dependents > 10000 AND age > 30;
  • 通過一個高度最佳化的類庫實現SQL函數庫並且像他們能達到的一樣快速，通常在查詢初始化後不應該有任何內存分配。
  • 全面支援SQL的GROUP BY和ORDER BY子句，支援聚合函數( COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、 MAX()和MIN() )。
  • 支援ANSI SQL的LEFT OUTER JOIN和ODBC語法。
  • 你可以在同一查詢中混用來自不同資料庫的表。(與版本 3.22一樣 )。
  • 一個非常靈活且安全的權限和密碼系統，並且它允許基於主機的認証。密碼是安全的，因為當與一個伺服器連接時，所有的密碼傳送被加密。
  • ODBC for Windiws 95。所有的 ODBC 2 . 5 函數和其他許多函數。例如，你可以用Access連接你的 MySQL伺服器。見16 MySQL ODBC 支援。
  • 具備索引壓縮的快速B樹磁碟表。
  • 每個表允許有16個索引。每個索引可以由1∼16個列或列的一部分組成。最大索引長度是 256 個字節(在編譯MySQL時，它可以改變)。一個索引可以使用一個CHAR或VARCHAR字段的前綴。
  • 定長和變長記錄。
  • 用作臨時表的內存散列表。
  • 大資料庫處理。我們正在對某些包含 50,000,000 個記錄的資料庫使用MySQL。
  • 所有列都有預設值，你可以用INSERT插入一個表列的子集，那些沒用明確給定值的列設置為他們的預設值。
  • 為了可移植性使用 GNU Automake , Autoconf 和libtool。
  • 用C和C++編寫，並用大量不同的編譯器測試。
  • 一個非常快速的基於執行緒的內存分配系統。
  • 沒有內存漏洞。用一個商用內存漏洞監測程式測試過(purify)。
  • 包括myisamchk，一個檢查、最佳化和修復資料庫表的快速實用程式，詳見13 維護 MySQL安裝。
  • 全面支援ISO-8859-1 Latin1 字符集。例如，斯堪的納維亞的字符 @ringaccent{a}, @"a and @"o 在表和列名字被允許。
  • 所有數據以 ISO-8859-1 Latin1 格式保存。所有正常的字符串比較是忽略大小寫的。
  • 根據 ISO-8859-1 Latin1 字符集進行排序(目前瑞典語的方式)。通過在原始程式中增加排序順序數組可以改變它。為了理解一個更高級的排序例子，看一看捷克語的排序代碼。MySQL支援可在編譯時指定的很多不同的字符集。
  • 表和列的別名符合 SQL92 標準。
  • DELETE、INSERT、REPLACE和UPDATE 返回有多少行被改變(受影響)。
  • 函數名不會與表或列名衝突。例如ABS是一個有效的列名字。對函數調用的唯一限制是函數名與隨後的“(”不能有空格。詳見7.31 MySQL對保留字很挑剔嗎？。
  • 所有MySQL程式可以用選項--help或-?獲得聯機幫助。
  • 伺服器能為客戶提供多種語言的出錯消息，詳見9.1 MySQL支援哪些語言？。
  • 客戶端使用TCP/IP 連接或Unix套接字（socket）或NT下的命名管道連接MySQL。
  • MySQL特有的SHOW命令可用來檢索資料庫、表和索引的資訊，EXPLAIN命令可用來確定最佳化器如何解決一個查詢。

1.5 MySQL的穩定性？

本小節回答這樣的問題：“MySQL的穩定程度？”和 “我能在本項目中依賴MySQL嗎?”。這裡我們將試圖澄清一些問題並且回答似乎很多人關心的更重要的問題。本節已經與從郵件列表(它在報導錯誤是很活躍的)收集了的資訊綜合在一起。

對TcX，MySQL在我們自1996中期開始的計劃中運行沒有發生任何問題。當MySQL被更公開地發布時，我們注意到了有一些 “未測試代碼”片斷很快地被不同於我們的查詢方式的新用戶發現。每個新版本比前一個都有更少的可移植性問題(盡管每個發行有許多新功能)，並且我們希望有可能把下一個版本之一標記為“穩定”的。

每個MySQL的發行都是可用的，並且只有當用戶使用從“灰色地帶”來的代碼時才有問題，當然,不知情的用戶不能知道灰色地帶是什麼﹔本小節嘗試揭示我們目前已知的東西。這裡的描述涉及MySQL 3. 22.x 版本。所有已知和報告的錯誤都會在最新的版本被更正，除了在錯誤小節中列出的與“設計n”有關的錯誤。詳見E MySQL已知的錯誤和設計缺陷。

MySQL以多層結構和不同的獨立模組編寫，這些模組列舉在下面以表明它們中的每一個是如何很好地被測試過：

ISAM表處理器--穩定
它管理所有在MySQL 3.22和早期版本中的數據的儲存和檢索。在所有MySQL版本中，代碼中已經沒有一個單獨（報告的）錯誤。得到一個損壞的資料庫表的唯一已知方法是在一個更新中途殺死伺服器，即使這樣也不大可能破壞任何數據而不能挽救，因為所有數據在每個查詢之間被倒入(flush)到磁碟，而且從來沒有一個有關由於MySQL中的錯誤而丟失數據的錯誤報告。
MyISAM 表處理器-- Beta
這是 MySQL 3.23的新功能，它大部分是基於ISAM表代碼但有很多新的有用的功能。
語法處理器和詞法分析器 --穩定
很長時間沒有一個在這個系統中的錯誤報告。
C 客戶代碼--穩定
沒有已知的問題。在早期的 3. 20版本中，在發送/接收緩沖器的大小上有一些限制。 3.21.x後，現在緩沖器的大小是動態的，可到一個24M的預設值。
標準客戶程式--穩定
這些包括mysql、mysqladmin和mysqlshow、mysqldump及mysqlimport。
基本結構式查詢語言--穩定
基本SQL函數系統、字符串類和動態內存處理，本系統刈袧見單獨報告的錯誤。
查詢最佳化程式--穩定

範圍最佳化程式-- Gamma

Join最佳化器--穩定

鎖定-- Gamma
這是非常依賴於系統的，在某些系統上，用標準作業系統鎖定(fcntl())有很大問題，在這些情況下，你應該用選項--skip-locking運行MySQL背景執行程式。當使用NFS挂載的文件系統，已知在一些 Linux 系統上和SunOS上出現問題。
Linux 執行緒-- Gamma
唯一發現的問題式fcntl()調用，它通過使用mysqld的--skip-locking選項解決。一些人已經報告了0.5版中的鎖定問題。
Solaris 2.5 + pthreads --穩定
我們在我們的開發工作中使用。
MIT-pthreads (其他系統)-- Gamma
自從 3.20.15版以來，沒有報告的錯誤，而且從3.20.16開始沒有已知的錯誤。在一些系統上，在一些操作是相當慢時(在每查詢之間有 1/20秒的睡眠 )有一個“功能失效”。當然，MIT-pthreads 可能使任何事情慢一點，但是基於索引的SELECT語句通常在一個時幀內完成，因此不應該有一個mutex 鎖定/執行緒的把戲。
其他執行緒實現 -- Alpha - Beta
移植到其他系統仍然是很新的並且可能有錯誤，可能是在MySQL中，但是最通常的是執行緒實現本身。
LOAD DATA ... ,INSERT ... SELECT --穩定
一些人已經認為他們在這裡發現了錯誤，但是這些經常多是誤解。請在報告問題前檢查手冊！
ALTER TABLE --穩定
在 3.22.12中有小的改變。
DBD --穩定
現在由 Jochen Wiedmann 維護了。
mysqlaccess --穩定
由 Yves Carlier 編寫並維護。
GRANT -- Gamma
MySQL 3.22.12.做了很大改變。
MyODBC （使用 ODBC SDK 2.5 )-- Gamma
它與一些程式似乎工作得很好。

TcX 為付費客戶提供電子郵件的支援，但是MySQL郵件列表通常提供常見問題的答案，錯誤通常馬上用一個修補修補，對嚴重的錯誤，幾乎總是有新的版本發行。

1.6 順應2000年（Year 2000 compliance）

MySQL本身己沒有2000年有問題( Y2K ):

  • MySQL使用Unix時間函數並且在2069年前沒有日期問題, 所有2位年份被認為在1970年到2069年的範圍，這意味著如果在一個year類型的列中儲存的01，MySQL把它當作2001。
  • 所有MySQL日期函數儲存在一個文件'sql/time.cc'中，並且很仔細地編碼保証是2000年安全的 。
  • MySQL 3.22 和以後的版本，新的YEAR類型的列能在一個字節中儲存0年和1901年到2155年，並用使用2或4位顯示它們。

你可以用一種不是Y2K-safe的方式使用 MySQL應用程式來深入該問題。例如，許多老的應用程式使用2位數字(它有二義性)而非4位數字儲存或操作年份，這個問題可能與使用諸如00或99作為“丟失的”值的提示的應用程式混淆起來。

很不幸，這些問題可能很難修復，因為不同的應用程式可能由不同程式員編寫，其中每一個可能使用了不同的約定和日期處理函數。

這裡是簡單的示範，顯示MySQL在 2030 年之前沒有任何日期問題。

mysql> DROP TABLE IF EXISTS y2k;
mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959);
mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000);
mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959);
mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000);
mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000);
mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000);
mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000);
mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959);
mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000);
mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959);
mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000);
mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000);
mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000);
mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+

13 rows in set (0.00 sec)

這表示DATE和DATETIME類型將不會有未來日期的任何問題(它們處理日期到 9999 )。

TIMESTAMP類型被用來儲存當前時間，有一個僅2030-01-01的上限。TIMESTAMP在32位的機器上(有符號值)有一個從1970到2030的範圍，在64位機器上它處理時間可達2106（無符號值)。

盡管MySQL是順應Y2K的，但提供無二義性的輸入是你的責任。對於MySQL處理二義性日期的輸入(包含2位數字年份)的規則，詳見7.3.6.1 Y2K 問題和日期類型。

1.7 SQL一般資訊和教學課程

在MySQL郵件列表上，這本書被多人推薦：

Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky
The Practical SQL Handbook: Using Structured Query Language
Second Edition
Addison-Wesley
ISBN 0-201-62623-3
http://www.awl.com

這本書也接受了 MySQL 用戶的一些建議：

Martin Gruber
Understanding SQL
ISBN 0-89588-644-8
Publisher Sybex 510 523 8233
Alameda, CA USA

一本SQL語言教學課程可在 http://www.geocities.com/SiliconValley/Vista/2207/sql1.html 找到。

SQL in 21 Tagen (用德語寫的網上書籍) http://www.mut.de/leseecke/buecher/sql/inhalt.htm 。

1.8 有用的MySQL相關鏈接

1.8.1 教學課程

  • A beginner's tutoral of how to start using MySQL
  • http://www.analysisandsolutions.com/code/mybasic.htm 新手如何在一台Windows 機器上安裝和設置MySQL。
  • 很多MySQL教學課程
  • 建立一個基於 MySQL的網站
  • MySQL- perl 教學課程
  • PHP/MySQL 教學課程

1.8.2 Perl相關鏈接

  • MySQL 的Perl DBI FAQ

1.8.3 MySQL 討論論壇

  • 使用MySQL實例 (check Top 20)

1.8.4 支援 MySQL 的商業應用

  • SupportWizard; Interactive helpdesk on the web (This product includes a licensed copy of MySQL)
  • Right Now Web; Web automation for customer service
  • Bazaar; Interactive Discussion Forums with web interface
  • PhoneSweepT 是世界的第一個商業電話掃描儀.近年來的很多侵入不是通過網際網路，而是通過非法的撥號數據機. PhoneSweep 讓你通過循環地將電話發到你的公司控制的每個號碼上來發現這些數據機， PhoneSweep有一個內置的專家系統，能識別出超過 250 種不同類型的遙遠存取程式，包括Carbon CopyT 、pcANYWHERET 和 Windows NT RAS .所有資訊保存在SQL資料庫，最後產生一份詳細易懂的報告，說明你公司內那個撥號數據機的那項服務被刺探。

1.8.5 SQL客戶程式

  • 微軟Windows 平台上MySQL編輯器/實用程式
  • KDE MySQL 客戶
  • Kiosk：一個用於資料庫管理的 MySQL客戶 用 Perl編寫，將成為Bazaar的一部分。

1.8.6 支援MySQL的Web 開發工具

  • PHP ：一種伺服器端的嵌入HTML的腳本語言
  • Midgard 應用伺服器：基於 MySQL 和 PHP強大的網站開發環境
  • SmartWorker 是一個Web應用開發平台
  • XSP： e(X)tendible (s)erver (p)ages ：是一個用Java 編寫的嵌入 HTML的標簽語言(以前 XTAGS出名)
  • dbServ：是對Web伺服器的擴充，它將到資料庫輸出集成進你的 HTML編碼。你可以在你的輸出使用任何 HTML函數，只有客戶端能阻止你。它作為獨立的伺服器或作為 Java servlet 運行。
  • Chili!Soft 平台無關的ASP
  • MySQL + PHP demos
  • ForwardSQL：操作的MySQL資料庫的 HTML 介面
  • WWW-SQL：顯示資料庫資訊
  • Minivend ：Web購物車
  • HeiTML：是HTML的伺服器端擴充，同時又是一種第四代語言語言
  • Metahtml：一種WWW應用程式的動態編程語言
  • VelocityGen for Perl and TCL
  • Hawkeye 網際網路伺服器套件
  • Linux網路資料庫連接
  • WDBI：是作為一個很好支援MySQL資料庫的通用前端的Web瀏覽器
  • WebGroove 腳本： HTML編譯器和伺服器端腳本語言
  • 一種伺服器端網站腳本語言
  • 怎樣在 Solaris 上用Coldfusion使用MySQL
  • Calistra 的 ODBC MySQL管理器
  • Webmerger：這個CGI工具解釋文件並且產生基於一套簡單標簽的動態輸出，通過 ODBC 提供MySQL和PostgreSQL的Ready-to-run 驅動程式。
  • PHPclub：PHP 的技巧
  • MySQL 和 Perl 腳本
  • Widgetchuck ：網站工具和小配件
  • AdCycle：廣告管理軟件

1.8.7 用 MySQL 支援的資料庫設計工具

  • "Dezign for databases" 是使用一個實體關系圖表的資料庫開發工具( ERD ).

1.8.8 使用MySQL工具的Web伺服器

  • 一個 Apache 認証模組
  • The Roxen Challenger Web server

1.8.9 對其他程式的擴充

  • 一個有原始程式的MySQL的 Delphi 介面. 由 Matthias Fichtner 編寫。
  • TmySQL：一個通過Delphi使用MySQL的庫
  • Delphi TDataset部件
  • 支援BIND(Internel域名伺服器）
  • 使用 MySQL 的 Sendmail擴充

1.8.10 通過其他程式使用MySQL

  • 通過Access使用 MySQL

1.8.11 ODBC有關的鏈接

  • 流行的 iODBC 驅動程式( libiodbc )現在以開放原始程式獲得
  • FreeODBC 主頁

1.8.12 API有關的鏈接

  • www.jppp.com：為MySQL部分實現了TDataset兼容的部件。
  • qpopmysql：一個允許MySQL資料庫進行 POP3 認証修補。還有一個到Paul Khavkine的Procmail修補的連接，允許任何MTA向MySQL資料庫中的用戶投遞信件。
  • 針對Active X的Visual Basic 類產生器
  • Macintosh 的客戶庫
  • Free Pascal的MySQL綁定
  • SCMDB：SCMDB 是SCM的一個插件，SCM移植 mysql的C語言庫到概念框架(scheme)。利用這個庫，框架開發者能連接到一個mySQL資料庫並且在他們的程式鐘使用嵌入式SQL。

1.8.13 其它MySQLx有關的鏈接

  • Registry of Web providers who support MySQL
  • Links about using MySQL / MySQL in Japan/Asia
  • Commercial Web defect tracking system
  • PTS: Project Tracking System
  • Job and software tracking system
  • ExportSQL: A script to export data from Access95+
  • SAL (Scientific Applications on Linux) MySQL entry
  • A consulting company which mentions MySQL in the right company
  • PMP Computer Solutions. Database developers using MySQL and mSQL
  • Airborne Early Warning Association
  • MySQL UDF Registry
  • Y2K tester

1.8.14 SQL和資料庫介面

  • KMySQL：KMySQL 是主要支援MySQL的KDE資料庫庫護程式。
  • JDBC 資料庫存取應用程式介面
  • mSQL TCL 修補
  • EasySQL :一個類ODBC驅動程式管理器
  • SQL資料庫的一個 REXX 介面
  • TCL 介面

1.8.15 使用MySQL的例子

  • Little6 Inc An online contract and job finding site that is powered by MySQL, PHP3 and Linux.
  • DELECis A tool which makes it very easy to create an automatically generated table documentation. They have used MySQL as an example.
  • Steve Fambro Uses MySQL and webmerger. There is an employee database, and a license plate database with all of the registered Utah vehicles (over 1.2 million). The License plate field is indexed.....so the *searches* are instantaneous.
  • World Records A search engine for information about music that uses MySQL and PHP.
  • A Contact Database using MySQL and PHP
  • Web based interface and Community Calender with PHP
  • Perl package to generate html from a SQL table structure and for generating SQL statements from an html form.
  • Basic telephone database using DBI/DBD.
  • Installing new Perl modules that require locally installed modules
  • JDBC examples by Daniel K. Schneider
  • SQL BNF
  • Object Oriented Concepts Inc; CORBA applications with examples in source
  • DBWiz; Includes an example of how to manage own cursors in VB
  • Pluribus Pluribus, is a free search engine that learns to improve the quality of its results over time. Pluribus works by recording which pages a user prefers among those returned for a query. A user votes for a page by selecting it; Pluribus then uses that knowledge to improve the quality of the results when someone else submits the same (or similar) query. Uses PHP and MySQL.
  • Stopbit A technology news site using MySQL and PHP
  • Example scripts at Jokes2000
  • FutureForum Web Discussion Software
  • http://www.linuxsupportline.com/~kalendar/ KDE based calendar manager The calendar manager has both single user (file based) and multi user (MySQL database) support.
  • Example of storing/retrieving images with MySQL and CGI
  • Online shopping cart system
  • Old Photo Album The album is a collaborative popular history of photography project that generates all pages from data stored in a MySQL database. Pages are dynamically generated through a php3 interface to the database content. Users contribute images and descriptions. Contributed images are stored on the web server to avoid storing them in the database as BLOBs. All other information is stored in on the shared MySQL server.

1.8.16 一般的資料庫鏈接

  • Database Jump Site
  • Homepage of the webdb-l (Web Databases) mailing list.
  • Perl DBI/DBD modules homepage
  • Cygwin tools. UNIX on top of Windows
  • dbasecentral.com; Development and distribution of powerful and easy-to-use database applications and systems.
  • Tek-Tips Forums Tek-Tips Forums are 800+ independent peer-to-peer non-commercial support forums for Computer Professionals. Features include automatic e-mail notification of responses, a links library, and member confidentiality guaranteed.

也有很多網頁使用 MySQL。詳見A 一些 MySQL 用戶。將任何新增發送到這張表中，並在某處加上 MySQL 標識(在一個“使用工具”的頁面或類似的地方)。

第一章,前一章，下一章, 最後一章, 目錄.


MySQL中文參考手冊- 2 MySQL郵件列表及如何提問或報告錯誤

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

2 MySQL郵件列表及如何提問或報告錯誤

2.1 MySQL 郵件列表

要訂閱主 MySQL 郵件列表，送一條消息到電子郵件地址 mysql-subscribe@lists.mysql.com 。

要退訂主 MySQL 郵件列表，送一條消息到電子郵件地址 mysql-unsubscribe@lists.mysql.com 。

只有你發送消息的地址是有意義的，消息的主題行和正文將被忽略。

如果你的回復地址不是有效的，你可以明確地指定地址。把短橫加到訂閱或退訂命令詞，隨後是你的地址，“@”由一個字符“=”代替。例如，要訂閱到john@host.domain，送一條消息到mysql-subscribe-john=host.domain@lists.mysql.com。

郵寄到 mysql-subscribe@lists.mysql.com 或 ezmlm 郵件列表處理器。詳細資訊可在 ezmlm 網點得到。

要想郵寄一條消息到列表本身，發送你的消息到 mysql@lists.mysql.com。然而，請千萬不要將關於訂閱或退訂的郵件發到mysql@lists.mysql.com ，因為送到該地址的任何郵件被自動地被散發到上千個其他用戶。

你本地的網站可能有很多 mysql@lists.mysql.com 的訂戶，如果這樣，也可能有一個本地郵件列表，以便使從 lists.mysql.com 發到你網站的消息被傳送到你的本地列表。在這種情況下，請聯繫你的系統主管加入本地 MySQL 列表和從其中刪除。

已有下列 MySQL 郵件列表：

announce
這是MySQL新版本和相關程式的發布通知,這是小資訊量的列表，我們認為所有的 MySQL 用戶應該訂閱。
mysql
為一般 MySQL 討論的主列表。請注意一些話題最好在更專業的列表上討論。如果你郵寄到錯誤的列表上，你可能得不到回答！
mysql digest
文摘形式的mysql列表，這意味著你得到所有單個消息，作為一個大郵件一天發送一次。
java
討論 MySQL 和 Java ，主要關於 JDBC 驅動程式。
java digest
一個文摘版本java 列表。
win32
有關微軟作業系統上例如 Windows NT的 MySQL所有東西。
win32 digest
一個文摘版本win32表。
myodbc
有關用 ODBC聯接 MySQL 的所有東西。
myodbc digest
一個文摘版本 myodbc 列表。
msql-mysql-modules
關於 MySQL中對Perl支援的一個列表。
msql-mysql-modules-digest
一個文摘版本 msql-mysql-modules 列表。
developer
為開發 MySQL 原代碼的人的一個列表。
developer digest
一個文摘版本developer列表.

你可用上述的方法訂閱或退訂所有列表。在你的訂閱或退訂消息中，只是放入不是mysql的適當郵件列表名。例如，訂閱或退訂myodbc列表，送一條消息到（原文未提供）。

2.2 提問或報告錯誤

在郵寄一份錯誤報告或問題前，請按下列步驟做：

  • 由尋找 MySQL 聯機的手冊開始：
     http://www.mysql.com/Manual_chapter/manual_toc.html

    我們通過經常以新發現的問題的解決方法更新手冊，努力使它是最新的！

  • 搜索 MySQL 郵件列表檔案：
     http://www.mysql.com/doc.html
  • 你也可使用 http://www.mysql.com/search.html 尋找在http://www.mysql.com/下的網頁(包括手冊)。

如果你不能在手冊或檔案發現答案，檢查你本地的 MySQL 專家。如果你仍然不能發現你問題的答案，繼續讀下一節關於怎樣發送郵件到 （原文未提供）。

2.3 怎樣報告錯誤或問題

寫一份好的錯誤報告需要耐心，但是第一次就做得正確可節省你我的時間。本節將幫助你正確撰寫你的報告，以使你不浪費時間，也可能做一些根本不能幫助我們的事情。

如果可能的話，我們鼓勵每個人使用 mysqlbug 腳本產生一份錯誤報告(或關於任何問題的一份報告)。mysqlbug可在原始碼版本或可執行檔版本的 MySQL安裝目錄下的'bin'目錄中的'scripts' 目錄下找到。如果你不能使用mysqlbug，你仍然應該包括在本節列出的所有必要的資訊。

mysqlbug 腳本通過自動確定下列很多資訊來幫助你產生一份報告，但是如果一些重要的東西不見了，請在你的消息包含它！請仔細閱讀本節並且保証這裡描述的所有資訊包含在你的報告中。

要記住，有可能回復一條包含太多的資訊消息，但不回復包含極少資訊的消息，因為人們認為他們知道一個問題的原因並且假設某些細節無所謂，所以他們常常忽略事實。一個好的原則是：如果你懷疑所說的事情，繼續說！在你的報告中寫上幾行，比因為第一次沒有包含足夠的資訊而被迫追問和等待答案要快上千倍，而且少些麻煩。

最常見的錯誤是人們不指出他們正在使用的MySQL分發的版本號，或不指出在什麼平台上平台安裝了 MySQL (包括平台版本號)。這是極其相關的資訊，並且沒有它99%錯誤報告是無用的！我們經常得到這樣的提問“為什麼它不給我工作?”，然後我們發現所需的功能還沒有在該版本的 MySQL 中實現，或在一份報告中描述的一個錯誤已經在更新的MySQL 版本修正了。有時錯誤是依賴於平台，在這種情況下，不知道平台作業系統和版本號根本不可能修正任何東西。

還要記住，要提供你的編譯器資訊，如果它與問題有關。人們經常發現錯在編譯器而認為MySQL的問題。大多數編譯器始終都在開發中並且隨版本也逐漸變得更好。為了確定決定你的問題是否依賴於你的編譯器，我們需要知道使用什麼編譯器。注意每個編譯器得問題應該被認為是一個錯誤，因此要報告。

在錯誤報告中包含一個問題的完好描述是最有幫助的。即，你所做的導致這個問題的一個好的例子和確切描述的問題本身。最好的報告是包括顯示如何再次產生錯誤或問題的一個完整例子。

如果一個程式產生一條錯誤資訊，非常重要的是在你的錯誤報告中要包含它！如果我們試著從使用程式的檔案中找一些東西，最好是報告的錯誤消息精確地匹配程式所產生的。（甚至注意大小寫！)你決不應該試圖記住錯誤消息是什麼，相反，將全部消息拷貝並且粘貼進你的報告中！

如果你有一個MyODBC問題，你應該嘗試產生一個 MyODBC 跟蹤文件，詳見16.6 報告 MyODBC的問題.

請記住，將要閱讀你報告的人有很多使用80列顯示。在產生報告或使用mysql命令行工具的例子時，你應該為那些可能超出顯示可用寬度的輸出(例如，EXPLAIN SELECT語句，見下面的例子)使用--vertical選項(或\G語句終止符)。

請在你的報告中加入包括下列資訊：

  • 你正在使用的 MySQL 分發的版本號(例如， MySQL 3.22.22 )。你可以執行mysqladmin version找到你正在運行哪個版本。mysqladmin可以在你的MySQL安裝目錄的'bin'目錄下面找到。
  • 你正在使用的機器的制造商和型號。
  • 作業系統名字和版本。對大多數作業系統，你可以通過執行一條Unix命令uname -a 得到有關資訊。
  • 有時儲存器的數量(物理和虛擬的)是有意義的，如果有疑問，包含這些值。
  • 如果你正在使用一個MySQL原始碼版本 ，則需要使用的編譯器的名稱和版本號。如果你有一個二進制代碼的分發，就需要該分發的名字。
  • 如果問題在編譯期間發生，則包含準確的錯誤消息，並且也包含問題發生的文件刈艴錯代碼周圍的一些上下文。
  • 如果任何資料庫表與問題有關，包含從 mysqldump --db_name  tbl_name1  tbl_name2 …的輸出結果。這是很容易做到的，並且它是一個獲得有關任何資料庫表資訊的有效方法，將幫助我們創造一個匹配你所遇到問題的環境。
  • 對於與速度或SELECT語句有關的問題，你總是應該包括EXPLAIN SELECT．．．的輸出和至少SELECT語句產生的行數。你給出有關你的情況越多的資訊，某些人越能幫助你。例如，下列的例子是一份很好的錯誤報告(當然它應該用與 mysqlbug 腳本郵寄)：運行 mysql 命令行工具的例子(注意對其輸出超過80列顯示設備的語句使用\G終止符)：
    mysql> SHOW VARIABLES;
mysql> SHOW COLUMNS FROM ...\G
       <output-from-SHOW-COLUMNS>
mysql> EXPLAIN SELECT ...\G
       <output-from-EXPLAIN>
mysql> FLUSH STATUS;
mysql> SELECT ...;
       <A short version of the output from SELECT,
       including the time taken to run the query>
mysql> SHOW STATUS;
       <output from SHOW STATUS>
  • 如果在運行 MySQL 時是發生問題，嘗試一下提供一個重現問題的輸入腳本，該腳本應該包括任何必要的源文件，重現你情況的腳本越準確越好。如果你不能提供腳本，你至少應該在你的郵件加入包括從 mysqladmin variables extended-status processlist的輸出以提供你的系統怎樣運行！
  • 如果你認為 MySQL 產生一個奇怪的查詢結果，不僅要包含結果，而且也要包含應該是什麼結果的意見和描述你意見所依據的理由。
  • 當給出問題的一個例子時，最好使用在你的真實情況下的而不是一個新的變數名、表名等等。這個問題應該與一個變數的名、表等有關！也許這些條件是苛刻的，但是安全比擔心更好。不管怎麼說，提供使用你實際情況的例子應該比較容易，並且各方面來講它對我們更好一些。如果你有不想把數據顯示別人看，你可使用ftp把它上傳到ftp://www.mysql.com/pub/mysql/secret/。如果數據確實是高度機密的，甚至不想讓我們看到它們，那麼繼續，並提供使用其它名字的例子，但是請注意這是最後選擇。
  • 如果可能，包括相關程式的所有選項，例如，指明你啟動 mysqld 背景執行程式和運行任何 MySQL 客戶程式所使用的選項，對像mysqld 和 mysql等程式和configure 的選項常常是答案的關鍵和至關重要的！包括他們絕對不是一個壞主意！如果你使用任何模組，例如Perl或PHP，請也包括它們的版本號。
  • 如果你不能產生一個行數少的測試，或如果測試表太大，不能寄給郵件列表(超過10行),你應該使用mysqldump倒出(dump)資料庫表並且創建“README”文件描述你的問題，用tar和gzip造創建你的文件的一個壓縮的檔案，並且使用ftp把檔案文件轉移到ftp://www.mysql.com/pub/mysql/secret/，然後把問題的簡短描述發到mysql@lists.mysql.com 。
  • 如果你的問題與權限系統有關。請包括mysqlaccess 、mysqladmin reload的輸出和所有嘗試連接時得到的錯誤消息！當你測試你的權限時，你應該首先運行mysqlaccess。在這以後，執行 mysqladmin reload version，最後你應該嘗試用你有問題的程式進行連接。 mysqlaccess 可在你的 MySQL 安裝目錄下的“bin”目錄找到。
  • 如果你有一個對錯誤的修補程式，那最好，但是千萬別假設修補程式是我們需要的一切，或即使你不提供一些必要資訊如修補能修正的錯誤的前提條件，就可使用它。我們可能發現你的修補程式問題，或者我們可能根本不理解它。如果是這樣，我們不能使用它。在這裡測試條件將幫助我們，這意味著修補程式將處理一切可能出現的情況。如果我們發現了修補不能工作的邊界條件（即使很怪），它可能毫無用處。
  • 對錯誤是什麼、為什麼發生或它依賴什麼的猜測通常是錯誤的。我們甚至不能在沒有首先使用一個調試器以確定一個錯誤的真正原因時做這種猜測。
  • 在你的郵件消息說明你已經檢查了參考手冊和郵件歸檔，以便讓其他人知道你自己嘗試解決你的問題。
  • 如果你得到一個parse error，請仔細檢查你的語法！如果你不能它發現有什麼不對，極有可能是你當前 MySQL 版本不支援你正在使用的查詢。如果你正在使用最新版而且 http://www.mysql.com/doc.html 的參考手冊沒有涉及你正在使用的語法， MySQL 就不支援你的查詢。在這種情況下，你唯一的選擇是自己實現語法並郵寄過來。如果手冊涉及你正在使用的語法，但是你有一個更舊版本的 MySQL ，你應該檢查 MySQL 的更新歷史來找出語法何時被實現。見D MySQL 變遷歷史。這時你有升級到一個更新 MySQL版本的選擇。
  • 如果你有一個這樣的問題：當你存取某些特定資料庫表時，你的數據好像已破壞或出錯，你應該首先用myisamchk檢查然後嘗試修復你的資料庫表。見 13 維護 MySQL 安裝.
  • 你經常得到破壞了的資料庫表，你應該嘗試發現這何時和為何發生！此時“mysql-data-directory/'hostname'.err”文件可能包含所發生事情的一些資訊。請在你的錯誤報告包含這個文件的任何有用資訊！如果沒有在更新當中殺死了mysqld，通常應該絕對不破壞資料庫表！如果你能找出mysqld為什麼死掉的原因，對於我們，更容易向你提供對問題的修正！
  • 如果可能，下載最新版本的 MySQL ，並且檢查它是否解決你的問題。MySQL的所有版本都被徹底地測試並且應該毫無問題地運行！我們相信使一切盡可能向後兼容，並且你應該能在數分鐘內切換 MySQL 版本！見 4.3 要使用 MySQL 哪個版本。

如果你是一個支援客戶，請直接郵寄錯誤報告到適當的郵件列表，看看是否有其他人有這個問題的經驗（或許已經解決）。

對於報導MyODBC錯誤的資訊，見 16.2 怎樣報告 MyODBC 問題。

一些常見問題的答案，見 18 問題和常見的錯誤。

當答案個別發給你而不是郵件列表時，總結答案並且將總結發到郵件列表以便其它人可以從你收到的幫助你解決問題的答案中受益，這被認為是一個很好的規矩。

2.4 在郵件列表上回答問題的指南

如果你認為你的答案引起廣泛的興趣，你可能想要把它寄到郵件列表中而不是直接答復提問的人。試著讓你的答案足夠普遍，讓不是郵寄者的其他人可從它獲益。當你郵寄到郵件列表時，請保証你的回答不和以前的答案重複。

嘗試總結在你的答復中的問題的主要部分，別感覺不好意思引用全部原文消息。

請不要從有 HTML 模式的瀏覽器投寄郵件消息！許多使用者不用瀏覽器讀郵件！

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-3 MySQL使用授權和技術支援

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章,前一章,下一章,最後一章，目錄.

3 MySQL的使用授權和技術支援

本章描述 MySQL 使用授權和技術支援安排，包括：

  • 我們對於非微軟和微軟作業系統使用授權的政策﹔
  • MySQL 分發遵從的版權(見3.2 MySQL 使用的版權)﹔
  • 當申請一個使用授權時，演示一個例子(見3.4 使用授權實例）﹔
  • 使用授權和支援費用(見3.5 MySQL 的使用授權和技術支援費用)，及技術支援的好處(見 3.6 商業性支援的類型）﹔

3.1 MySQL的使用授權政策

針對非微軟作業系統如Unix或 OS/2 的使用授權的正式條款在 J 針對非微軟作業系統的 MySQL 伺服器使用授權中說明。基本上，我們使用授權政策如下：

  • 對於一般的內部使用，MySQL通常是免費的。如果你不想，就不必付錢給我們。
  • 一個使用授權是必需的，如果：
    • 你直接銷售MySQL伺服器或作為其他產品或服務的一部分﹔
    • 你在某些客戶那裡為了安裝和維護一個 MySQL 伺服器而收費﹔
    • 你在不可再分發的分發中包括 MySQL並且你對該分發的某些部分收費﹔
  • 在必須有 MySQL 使用授權的情況下，對每台運行mysqld伺服器的機器，你都需要一個使用授權，但多CPU機器按單CPU計算，並且在一台機器上運行 MySQL 伺服器的數量或並發連接到這台運行一個伺服器的機器的客戶數量也無限制！
  • 你在商業程式使用包含客戶代碼不需要一個使用授權，MySQL的客戶端存取部分不屬公共領域，mysql命令行客戶程式包含在 GNU 通用使用授權下的 readline 庫的代碼。
  • 對於已經購買了 10 個使用授權或一種足夠級別的技術支援的消費者，我們提供附加的功能。目前，這意味著我們提供 myisampack實用工具，它能產生快速的壓縮的唯讀資料庫（伺服器支援讀取這樣的資料庫，但不包含用於產生它們的壓縮工具)。當支援協議產生了足夠的收入時，我們將在與MySQL 伺服器同樣的使用授權下發行這個工具。
  • 如果你使用不需要一個使用授權的 MySQL，但是你的確喜歡 MySQL 並且有志於更進一步的開發，無論如何肯定歡迎你購買一個使用授權。
  • 如果你在一個商業環境中使用 MySQL以便通過它獲利，我們要求你購買一定級別的技術支援以推進開發。我們感到，如果 MySQL 有助於你的業務，要求你幫助MySQL也是合理的（否則，如果向我們你詢問支援問題，你不僅是正在免費使用我們傾注大量精力的產品，而且你正在要求我們提供免費的支援。）。

對於在微軟作業系統下面( Win95/Win98/WinNT)的使用，你在一個 30 天的試用期後需要一個 MySQL 使用授權，除了教育用途或大學或政府資助的研究機構的使用授權可免費申請獲得，見 K 針對微軟作業系統的 MySQL 使用授權。一個共享軟件版本的 MySQL -Win32 可在購買前從 http://www.mysql.com/mysql_w32.htmy 下載試用。在你付錢後，你將得到一個密碼讓你能夠訪問最新 MySQL - Win32 版本。

如果你對你特定的 MySQL使用是否需要一個使用授權有任何問題，請聯繫我們，見 3.5.2 聯繫資訊.

如果你需要一個 MySQL 使用授權，最容易的付款方法是使用在 https://www.mysql.com/license.htmy網站的 Tcx 的安全伺服器上的使用授權表格。其他付費形式在3.5.1 付款資訊討論。

3.2 MySQL使用的版權

MySQL 分發有若干不同的版權：

  1. 構造mysqlclient庫和“client”目錄下的程式所需的MySQL特定原始程式使屬於公共領域(public domain)，屬於公共領域的每個文件有一個文件頭清楚地說明這點。這包括在“client”目錄下的所有東西和mysys、mystring和dbug庫的某些部分。
  2. 原始程式的某一小部分( GNU  getopt)遵從“ GNU 庫文件通用使用授權(GLPL)”，參見"mysys/COPYING.LIB"文件。
  3. 原代碼的某一小部分( GNU  readline)遵從“ GNU 公共使用授權”。見"readline/COPYING"文件。
  4. 原始程式的某些部分(regexp 庫)遵從Berkerley風格的版權。
  5. 在非微軟平台上的MySQL伺服器所需的其他原始程式遵從“ MySQL 自由公共使用授權”，它基於“阿拉丁自由公共使用授權”。見J 針對非微軟作業系統的 MySQL 伺服器使用授權。當在任何微軟作業系統上運行MySQL時，使用另外的使用授權。

下列幾點闡明了我們的版權政策後的理念：

  • SQL客戶庫應該是完全免費的，以使它能不受限制地包含在商業產品中。
  • 想要自由存取我們花了很多精力開發的軟件的任何人都可以擁有它，只要他們不試圖借助分發它以盈利為目而直接賺錢。
  • 想要有權保護他們自己的軟件專利，但也從我們的工作得到價值的任何人，可以為此權力付費。
  • 這意味著正常的家庭使用是免費的，但是如果你為一些對你很重要的事使用 MySQL，你可以通過購買一個使用授權或一個技術支援合同來幫助進一步開發它。見3.6 商業性支援的類型。

3.2.1 可能的未來版權改變

我們可能在將來用GPL分發較老的 MySQL 版本，然而，這些版本將被標明為 GNU MySQL。另外，在相關文件的所有版權通告將改為 GPL 。

3.3 MySQL商業性分發

本節澄清“ MySQL 自由公共使用授權”( FPL )中提出的使用授權條款。見 J 針對非微軟作業系統的 MySQL 伺服器使用授權。

MySQL可以是自由地使用，包括被商業實體的評估或不受支援的內部使用。然而，MySQL商業目的分發，或任何部分或全部包含或從MySQL派生的東西，都需要從 TcX AB 申請一個書面的商業使用授權，它是唯一的授權發証實體。

你不能“免費”地在一個含有任何收費的東西的軟件包括含MySQL，但下面所說的除外。

在使用授權的第二款提供了例外的目的是允許運營一個FTP伺服器或公告牌的商業組織免費分發 MySQL，如果：

  1. 該組織遵守 FPL 的其他條款，其包括要求分發 MySQL 和任何派生產品的全部原始程式，並且與MySQL一起分發FPL本身﹔
  2. 為下載 MySQL 的唯一費用是基於分發服務的費用，而不是基於正在被檢索的資訊內容(即，費用應該與檢索同樣大小的隨機位組合是一樣的)﹔
  3. 伺服器或BBS可由一般公眾訪問，即，電話號碼或IP地址沒被保密，且任何人可以獲得資訊的存取(可能通過交訂費或存取費用，該費用不依賴於或相關於購買其他東西)。

如果你想要以商業形式分發集成了MySQL的軟件，並且你不想滿足這些條件，你應該聯繫 TcX AB 尋求商業使用授權，它涉及付費。你能合法地分發 MySQL 或任何包含 MySQL的東西的唯一方法是在FPL的要求下分發 MySQL，或通過從 TcX AB 獲得一個商業使用授權。

3.4 使用授權實例

本節描述一些實例以闡述你是否許可使用 MySQL，通常這些例子包括提供 MySQL 伺服器作為一個產品的一部分，或你正在向客戶銷售服務，或要求 MySQL與你的產品一起使用。在這些的情況中，如果必要，為客戶申請一個使用授權是你的責任。（如果你的客戶已經有了 MySQL 使用授權，這個要求就不考慮了，但是賣方必須將客戶資訊和和使用授權號傳到TcX，並且使用授權必須是一個完整的使用授權，而不是一個OEM使用授權。）

注意單個 MySQL 使用授權涵蓋了一台機器上的任何數量的CPU/用戶/客戶的mysqld的伺服器！

3.4.1 銷售使用MySQL的產品

要確定在銷售你的應用程式時，你是否需要一個 MySQL 使用授權，你應該詢問，應用程式的正確運行是否可能使用 MySQL ，且你是否在你的產品刈荺括 MySQL 。有幾種情況要考慮：

  • 你的應用是否需要 MySQL 才能正確工作？如果你的產品需要 MySQL，對於任何運行mysqld伺服器的機器，你都需要一個使用授權。例如，如果你已經圍繞MySQL設計了應用，然後你確實開發了需要該引擎的一個商業產品，因此你需要一個使用授權。如果你的應用不需要 MySQL，你不必獲得一個使用授權。例如，如果 MySQL 只是為你的產品加入一些新的可選功能(例如，如果 MySQL被用來增加日誌到資料庫中，而不是記錄到一個文本文件中)，它應該在正常使用範圍內，並且不需要一個使用授權。換句話說，如果你銷售為MySQL 而專門設計的或需要MySQL才能運行的產品，你需要一個使用授權，不管你是否是為你的客戶提供 MySQL來作為你產品的一部分，這也取決於你在為你的客戶做什麼。你計劃為你的客戶提供與軟件一起安裝 MySQL詳細的指令嗎？那麼你的產品可能使用 MySQL，如果是，你需要購買一個使用授權。如果你簡單地連接在購買你的軟件時你希望已經安裝資料庫的話，那麼你可能不需要一個使用授權。
  • 你在一個分發包括 MySQL並對此分發收費嗎？如果你在銷售給客戶的分發刈荺括 MySQL ，對每台運行mysqld伺服器的機器，你都將需要一個使用授權，因為在這種情況下，你正在銷售一個包括 MySQL的系統，不管與你的產品一起使用 MySQL是你必需的或可選的。
  • 你的產品既不需要也不包含 MySQL 嗎？假定你想銷售一個產品，它設計成通用的以使用“某些資料庫”並且能被配置成可使用它支援的多個其他資料庫選擇( MySQL， PostgreSQL，或其他)，即，你的產品不需要 MySQL，但是能支援任何基本功能水平的資料庫，且你不依賴任何只有 MySQL 才支援的東西。如果你的客戶實際上確實選擇使用MySQL，你們中有人欠我們錢嗎？在這種情況下，如果你不提供，為客戶獲得或設置 MySQL 應由客戶決定是否使用它，你也不需要一個使用授權。如果你確實施行那種服務，見3.4.2 銷售MySQL 相關的服務。

3.4.2 銷售MySQL相關的服務

如果你在一個客戶機器上安裝 MySQL 並為此服務收費(直接或間接地)，那麼你必須購買一個 MySQL 使用授權。

如果你銷售一個應用，而 MySQL 不是完全需要但是能被使用，可能要出示一個使用授權，這取決於怎樣建立 MySQL。假如你的產品既不需要 MySQL 也不在你的產品分發包含它，但是可以為有這種願望的那些客戶配置成使用 MySQL。（例如，你的產品可以使用任何資料庫引擎的一個，可能就是這種情況。）

如果客戶得到並且安裝 MySQL，不需要使用授權。如果你為你的客戶施行這種服務，那麼就需要一個使用授權，因為你正在銷售一種包含 MySQL 的服務。

3.4.3 ISP MySQL 服務

網際網路服務供應商(ISP)經常為他們的客戶配備 MySQL 伺服器。

如果你是一個ISP，允許客戶自己在沒有你幫助的情況下安裝並且管理你機器上的MySQL，你和你的客戶都不需要一個MySQL 使用授權。

如果你對作為你客戶服務一部分的 MySQL安裝和管理的支援收費，那麼因為你正在銷售一種包括 MySQL服務，你需要一個使用授權。

3.4.4 運營一個使用 MySQL的Web伺服器

如果你與一個Web伺服器一起使用 MySQL，你不必支付一個使用授權費用。

就算你運營使用 MySQL的一個商業Web伺服器，也是這樣的，因為你不在銷售 MySQL 本身。然而，在這種情況下，我們希望你購買 MySQL 技術支援，因為 MySQL 正在幫助你的企業。

3.5 MySQL的使用授權和技術支援費用

我們當前的使用授權價格如下。所有的價格以美元計算。如果你用信用卡支付，貨幣單位是歐元(歐洲共同體歐元)，所以價格將略有不同。

使用授權數量 | 每拷貝定價 | 總價
1 | 美元 $200 | 美元 $200
10個包裝 | 美元 $150 | 美元 $1500
50個包裝 | 美元 $120 | 美元 $6000

對於大批量(OEM)購買，適用下列價格：

使用授權數量 | 每拷貝定價 | 一次最少量 | 最少支付
100-999 | 美元 $40 | 100 | 美元 $4000
1000-2499 | 美元 $25 | 200 | 美元 $5000
2500-4999 | 美元 $20 | 400 | 美元 $8000

對於OEM廠家購買，你必須為可能出現的問題或擴展你用戶的需求充當中間人。我們也要求OEM客戶至少有一個擴展的電子郵件支援合同。

如果你有一大批廉價產品，你總可以就另外條件與我們商談(例如，出售價格的一個百分比)。如果你是，請提供關於你的產品、定價、市場和任何其他相關的資訊。

在購買了10個 MySQL 使用授權後，你將得到一個 myisampack 個人拷貝，不允許你再分發這個實用程式，但是你可以分發用它壓縮的資料庫表。

一個全價使用授權不是一個技術支援協議且包含很少的支援。這意味著我們嘗試回答任何相關的問題。如果答案在文檔中，我們將指導你到適當的章節，如果你沒購買一個使用授權或技術支援，我們將根本不可能回答。

如果你發現我們認為的一個真正的錯誤(bug)，我們願意在任何情況下修復它，但是如果你支付支援費用，我們將通知你關於修復進展情況而不是僅在以後的版本修復它。

更全面的支援獨立是單獨銷售的，每個級別所包含的技術支援的說明見3.6 商業性支援的類型。各種類型的商業性支援的費用如下。支援級別的價格以歐元計算，1歐元是大約 1.17 美元。

支援的類型 | 每年花費
基本電子郵件支援 | 歐元 170
擴展電子郵件支援 | 歐元 1000
登錄支援 | 歐元 2000
擴展登錄支援 | 歐元 5000

由於兩個支援級別的價格差異，你可以從任何低級別的支援升級到一個較高級別的支援。

3.5.1 付款資訊

目前，我們能用SWIFT、支票或信用卡方式付款。

付款應該寄到：

Postgirot Bank AB
105 06 STOCKHOLM, SWEDEN

TCX DataKonsult AB
BOX 6434
11382 STOCKHOLM, SWEDEN

SWIFT address: PGSI SESS
Account number: 96 77 06 - 3

指定：使用授權或支援及你的名字和電子郵件地址。

在歐洲和日本你能使用 EuroGiro (應該是稍微便宜)付到相同的帳戶。

如果你想要用支票付款，使它可付到“ Monty Progrem KB ”並且把它寄到下面的地址：

TCX DataKonsult AB
BOX 6434, Torsgatan 21
11382 STOCKHOLM, SWEDEN

如果你想要在網際網路上用信用卡付款，你可以使用Tcx 安全使用授權表格。

你也可以列印使用授權表格，填好它並傳真到：

+46-8-729 69 05

如果你想要我們給你發票，你可以用使用授權表格並在注釋域裡寫上“開發票”。你也可以把一條有關你公司的資訊的消息寄給我們並要求開發票。

3.5.2 聯繫資訊

對商業使用授權，或如果你有本小節任何資訊的任何問題，請聯繫 MySQL 使用授權組，比較受歡迎的方法是通過電子郵件而傳真可能花更長的時間(傳真 +46-8-729 69 05 )。

David Axmark
Detron HB
Kungsgatan 65 B
753 21 UPPSALA
SWEDEN
Voice Phone +46-18-10 22 80     (Timezone GMT+1. 說瑞典語和英語)

3.6 商業性支援的類型

3.6.1 基本的電子郵件支援

基本的電子郵件支援是很便宜的支援選擇，並且更應該認為它是作為支援我們開發 MySQL 的一種方式而不是真正的支援選擇。

在這支援級別上，MySQL 郵件列表是通信的最佳方法，問題通常應該寄給主郵件列表( mysql@lists.mysql.com )或其它常規列表之一(例如對於有關Windows MySQL 問題，mysql-win32@lists.mysql.com )，因為其他人可能已經經歷了並且解決了你的問題。見2.2 提問或報告錯誤。

然而，通過購買基本電子郵件支援，你也能訪問支援地址 mysql-support@mysql.com，它不作為你購買一個使用授權而得到很小支援的一部分，這意味著對於特別緊急的問題，你可以交叉郵寄你的消息到 mysql-support@mysql.com。(如果消息包含敏感數據，你應該只郵寄到 mysql-support@mysql.com)。

記住！當你發送一條消息到時，總要包括你的登記號碼和過期日期。

基本電子郵件支援包括下列服務類型：

  • 如果你的問題已經在手冊被回答了，我們將通知你正確的章節，你能在那找到答案。如果答案不在手冊裡，我們將為你解決問題指出正確方向。
  • 我們保証及時回復你的電子郵件消息。我們不能保証我們能解決任何問題，但是如果我們能用電子郵件聯絡你，至少你將收到一個回復。
  • 當你在一個支援的平台上從一個可執行檔版本安裝MySQL時，我們將幫助解決意外的問題。支援的平台是那些已知的 MySQL 可運行的平台。見4.2 MySQL支援的作業系統。
  • 我們將在關於錯誤和缺少的功能方面幫助你，任何發現的錯誤將在MySQL下一版本中修復。如果錯誤對你是嚴重的，只要錯誤修復，我們將郵寄給你一個修補。嚴重的錯誤對我們總是有最高優先級，以保証它們盡快被修復。
  • 你對MySQL更進一步開發的建議將被考慮，利用電子郵件支援，你已經幫助了MySQL進一步的開發。如果你想要有更多的介入，升級到更高級別的支援。
  • 如果你想要我們幫助最佳化你的系統，你必須升級到高級別的支援。

3.6.2 擴展電子郵件支援

擴展的電子郵件支援包含了基本的電子郵件支援的一切，並增加：

  • 你的電子郵件將在基本的電子郵件支援用戶和非註冊用戶的郵件之前處理。
  • 你對 MySQL 進一步的開發建議將得到更大程度的考慮，適合MySQL基本目標的簡單擴充在幾天時間內實現，有了擴展的電子郵件支援，你已經幫助了MySQL進一步的開發。
  • 我們會包括一個用於快速產生壓縮唯讀資料庫的myisampack包裝工具的二進制版本。目前的伺服器支援讀取這樣的資料庫但不包括用於產生它們的包裝的工具。
  • 擴充的電子郵件支援覆蓋的典型問題是：
    • 我們將回答並且(在原因內)解決與 MySQL可能的錯誤(bug)相關的問題。一旦錯誤被發現並且改正，我們將郵寄修補。
    • 當你在支援的平台上從原始程式或可執行檔版本安裝MySQL時，我們將幫助解決意外的問題。
    • 我們將回答有關缺少的功能的問題並且提供如何解決它的提示。
    • 我們將提供針對你的實際情況最佳化mysqld的提示。
  • 你被允許影響 MySQL TODO表上的項目的優先級，這將保証你確實需要的功能將更快地被實現。

3.6.3 登錄支援

登錄支援包含了擴展的電子郵件支援的一切，並增加：

  • 你的電子郵件甚至將在擴展的電子郵件支援用戶的郵件之前被處理。
  • 你對 MySQL 進一步的開發建議將得到更高程度地考慮，可在幾小時內被實現而且適合MySQL基本目標的可行的擴展將盡快實現。
  • 如果你有一個很特定的問題，我們可以嘗試登錄你的系統以解決“那個地方”的問題。
  • 像任何資料庫供應商一樣，我們不能保証我們能從破壞了的資料庫表中挽救任何數據，但是如果發生最糟的情況，我們將幫助你盡可能挽救。 MySQL 業已証明自己很可靠，但是由於超過我們控制範圍的情況，任何事情都是可能的(例如,如果你的系統崩潰或某人執行一個kill -9殺死伺服器)。
  • 我們將在最佳化你的系統和查詢上提供啟示。
  • 你允許打電話給一個 MySQL 開發者(適度地)並且討論你的 MySQL 相關的問題。

3.6.4 擴展的登錄支援

擴展的登錄支援包括登錄支援的一切，並增加：

  • 你的電子郵件有最高可能的優先級。
  • 我們將踴躍檢查你的系統並且幫助你最佳化它和查詢。我們也可以最佳化或擴充 MySQL 以便更好地適合你的需要。
  • 你也可以申請只特別對你的查詢擴充，如：
    mysql>select MY_CALCULATION(col_name1,col_name2) from tbl_name ;
  • 我們將為你的系統提供所有重要的MySQL版本的可執行檔版本，只要我們能在一個類似的系統上得到一個帳號。在最糟的情況下，我們可以要求訪問你的系統以便能創建一個可執行檔版本。
  • 如果你能提供住所並且支付旅途費用，你甚至能讓一個 MySQL 開發者訪問你並為你的麻煩提供幫助。擴展的登錄支援賦予你每年一次個人會面的權利，但是我們一直對我們的客戶非常靈活！

第一章,前一章,下一章,最後一章，目錄.


MySQL中文參考手冊- 4 安裝MySQL

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

4 安裝MySQL

本章描述怎樣獲得並安裝MySQL：

  • 對於你能從其獲得MySQL的站點列表，見4.1 怎樣獲得MySQL。
  • 要了解支援哪些平台，見4.2 MySQL支援的作業系統。
  • 可獲得MySQL的多個版本，以二進制代碼和原始程式形式分發。為了確定你應該使用的分發的版本和類型，見4.4 怎樣和何時發布更新版本。
  • 針對二進制代碼和原始碼版本的安裝指令在4.6 安裝 MySQL 可執行檔版本和4.7 安裝 MySQL 原始碼版本講述。每套指令均包含一個關於你可能涉及的系統特定問題的部分。
  • 為安裝後期程序，見4.15 安裝後期的設置與測試。不管你是用一個二進制代碼還是原始碼版本來安裝MySQL，這些程序均適用。

4.1 怎樣獲得MySQL

檢查MySQL主頁獲得當前版本的資訊和下載指令。

然而，TcX的網際網路鏈接不是很快的﹔我們更希望讓你從下列鏡像站點之一進行真正的下載。

請向webmaster@mysql.com報告不存在的或過時的鏡像站點。

歐洲：

  • 奧地利 [ 維也納技術大學 ]WWW ftp
  • 保加利亞 [ Naturella ]ftp
  • 克羅地亞 [ HULK ]WWW ftp
  • 捷克共和國 [ 在Brno的Masaryk大學 ]WWW ftp
  • 捷克共和國 [ www.sopik.cz ]WWW
  • 丹麥 [ Borsen ]WWW
  • 丹麥 [ SunSITE ]WWW ftp
  • 愛沙尼亞 [ OKinteractive ]WWW
  • 法國 [ minet ]WWW
  • 芬蘭 [ EUnet ]WWW
  • 芬蘭 [ clinet ]ftp
  • 德國 [ 波恩大學, 波恩 ]WWW ftp
  • 德國 [ Wolfenbuettel ]WWW ftp
  • 德國 [ Staufen ]WWW
  • 德國 [ Cable & Wireless ]ftp
  • 希臘 [ NTUA , 雅典]WWW ftp
  • Island [ GM ]WWW WWW
  • 意大利 [ Teta Srl ]WWW
  • 愛爾蘭 [ Ireland On-Line/Dublin ]WWW ftp
  • 波蘭 [ Sunsite ]WWW ftp
  • 葡萄牙 [ lerianet ]WWW ftp
  • 俄國 [ DirectNet ]WWW
  • 俄國 [ IZHCOM ]WWW ftp
  • 俄國 [ Scientific Center/Chernogolovka ]ftp
  • 羅馬尼亞 [ Timisoara ]WWW ftp
  • 羅馬尼亞 [ Bucharest ]WWW ftp
  • 西班牙 [ MasterD ]WWW
  • 瑞典 [ Sunet ]WWW ftp
  • 瑞士 [ Sunsite ]WWW ftp
  • 英國 [ Omnipotent/UK ]WWW ftp
  • 英國 [ PLiG/UK ]WWW ftp
  • 英國 [ SunSITE ]WWW ftp
  • 烏克蘭 [ PACO ]WWW ftp

北美洲：

  • 加拿大 [ Tryc ]WWW
  • 加拿大 [ Cyberus ]WWW ftp
  • 美國 [ Hurricane Electric/San Jose ]WWW
  • 美國 [ Circle Net/North Carolina ]WWW
  • 美國 [ Gina net/Florida ]WWW
  • 美國 [ pingzero/Los Angeles ]WWW
  • 美國 [ 威斯康星大學 / 威斯康星]WWW ftp
  • 美國 [ DIGEX ]ftp

南美洲：

  • 巴西 [ Matrix ]WWW
  • 智利 [ Vision ]WWW

亞洲：

  • 中國 [ Freecode ]WWW
  • 中國 [ Netfirm ]WWW
  • 朝鮮 [ KREONet ]WWW
  • 日本 [ Soft Agency ]WWW
  • 日本 [ Nagoya Syouka University ]WWW ftp
  • 新加坡 [ HJC ]WWW ftp
  • 台灣 [ HT ]WWW

澳洲：

  • 澳洲 [ AARNet/Queensland ]WWW ftp
  • 澳洲 [ Tas ]WWW ftp
  • 澳洲 [ Blue Planet/Melbourne ]WWW
  • 澳洲 [ ITworks Consulting/Victoria ]WWW

非洲：

  • 南非 [ Mweb/ ]WWW
  • 南非 [ The Internet Solution/Johannesburg ]ftp

4.2 MySQL 支援的作業系統

我們使用 GNU Autoconf，因此將MySQL移植到所有使用 Posix 執行緒和一個 C++ 編譯器的現代系統是可能的。(僅僅為了編譯客戶代碼，只需要一個 C++ 編譯器而不是執行緒)。我們主要在Sun Solaris(版本 2.5 & 2.6)上使用並開發軟件本身，而RedHat Linux 5.0 居其次。

MySQL已經被報告在下列作業系統/執行緒包的組合上成功地編譯。注意，對很多作業系統，原生的執行緒支援僅工作於最新的版本。

  • 有原生執行緒的AIX 4.x
  • 包括 MIT-pthreads 包的BSDI 2.x
  • 有原生執行緒的BSDI 3.0、3.1和4.x
  • 有原生執行緒的DEC UNIX 4.x
  • 包括MIT-pthreads包的FreeBSD 2.x
  • 有原生程的FreeBSD 3.x
  • 包括 MIT-pthreads 包的 HP-UX 10.20
  • 有原生執行緒的 HP-UX 11.x 。
  • 有 LinuxThreads 0.7.1 的 Linux 2.0 + 或glibc2.0.7
  • MacOS X 伺服器
  • NetBSD 1.3/1.4 Intel 和 NetBSD 1.3 Alpha ( 需要 GNU make）
  • 包括 MIT-pthreads 包的 OpenBSD 2.x
  • OS/2 Wrap 3、FixPack 29和OS/2 Wrap 4、FixPack 4
  • 有原生執行緒的SGI Irix 6.x
  • SPARC和x86上有原生執行緒的Solaris 2.5、2.6和2.7
  • 包括 MIT-pthreads 包的SunOS 4.x
  • 有最新FSU Pthreads移植包的SCO OpenServer
  • SCO UnixWare 7.0.1
  • Tru64 Unix
  • Win95、Win98和NT(只有擁有MySQL使用授權或MySQL電子郵件支援的用戶可得到最新版本)。對那些在購買之前想測試的人，我們以共享軟件方式發布了MySQL 3.21.29（一個較老的版本）。

4.3 使用MySQL哪個版本

首先要作出決策，你是否想要使用最新的開發版本或最終的穩定版本：

  • 通常, 如果你是第一次開始使用MySQL或嘗試移植它到一些還沒有可執行檔版本系統上，我們推薦使用開發版本(當前 3.22.x)。這是因為通常在開發版本中沒用真正嚴重的錯誤，並且你能容易用你的機器上的crash-me和效能測試套件來測試它。見10.8 使用你自己的效能測試。
  • 否則，如果你正在運行一個老的系統並且想要升級，但是又不想要用3.22冒險，你應該升級到3.21.33。我們已經試著僅修復致命錯誤，並且對那個版本進行更小的相對安全的改動。

要做的第二項決策是你是否想要使用原始碼版本或可執行檔版本：

  • 如果你想在一個已經存在一個最新可執行檔版本的平台上運行MySQL，就用它。通常，這比一個原始碼版本更容易安裝。
  • 如果你想要閱讀(或修改)構成MySQL的C和C++代碼，你應該拿到原始碼版本。原始程式總是最終的手冊。原始碼版本也比可執行檔版本包含更多的測試和實例。

MySQL的命名機制使用由3個數字和一個後綴組成的版本號。例如，一個像mysql-3.21.17-beta的版本號這樣解釋：

  • 第1數字(3)描述文件格式。所有版本3的發行都有相同的文件格式。當一個版本4出現時，每個資料庫表都將必須轉換到新格式(當然，為此有一個很不錯的工具)。
  • 第2數字(21)是發行級別。通常有2種選擇。一個是發部/穩定分支(當前為21)而其它是開發分支(當前22)。通常兩者都是穩定的，但是開發版本可能有毛病，新功能缺乏文檔或可能在某些系統上編譯失敗。
  • 第3個數字(17)是在此發行級別的版本號，這隨每個新分發遞增。通常你需要你已經選擇的發行(release)的最新版本(version)。
  • 後綴(beta)顯示發行的穩定性級別。可能的後綴有：
    • alpha 表明發行包含大量未被100%測試的新代碼。已知的錯誤(通常沒有)應該在新聞小節被記錄。見D MySQL 變遷的歷史記錄。在大多數 alpha 版本也有新的命令和擴展。
    • beta 意味著所有的新代碼被測試了，沒有增加重要的新特徵，應該沒有已知的錯誤。
    • gamma 是一個發行了一段時間的beta版本，看起來應該運行正常。這就是很多其他公司稱為一個發布的東西。
    • 如果沒有後綴，這意味著該版本已經在很多地方運行一段時間了，而且沒有非平台特定的錯誤報告。這就是我們稱為一個穩定版本的東西。

MySQL所有版本都經過我們的標準測試和效能測試運行，以保証他們可相當安全地使用。因為標準測試不斷擴充以檢測以前發現的錯誤，測試套件一直在改進之中。

注意，所有版本都至少已經用下列套件進行了測試：

一個內部測試套件
這是一個客戶生產系統的一部分。它可能有很多幾百個兆字節數據的資料庫表。
MySQL效能測試套件
它運行一定範圍的常用查詢。它也是一個測試，檢測最新的最佳化處理是否真的使代碼更快。見10.8 使用你自己的效能測試。
crash-me測試
這嘗試決定資料庫支援什麼功能和它的能力與限制是什麼。見10.8 使用你的自己效能測試。

其他測試是在內部的生產環境中使用最新MySQL版本，至少在一台機器上。我們有超過100GB的數據可用使用。

4.4 怎樣和何時發布更新版本

在TcX，MySQL進展的相當快，並且我們想要與其它MySQL用戶分享它。當我們有一個看來其它人似乎需要的非常有用的功能時，我們就試著制作一個發行版本。

我們也嘗試幫助那些需要很容易實現的功能的用戶，我們也關注我們授權的用戶想要什麼，我們更特別關注我們的擴展電子郵件支援的客戶想要什麼，並且盡力幫助他們。

沒有人一定要下載一個新版本，新聞小節中將告訴你新版本是否有一些你確實想要的東西。見D MySQL 變遷的歷史記錄。

當更新MySQL時，我們使用下列方針：

  • 對每個小的改進，在版本字符串的最後數字增加1。當有主要的新功能或與先前版本比有較小不兼容性時，在版本字符串的第2數字增加1。當文件格式變化時，第1數字加1。
  • 穩定的測試過的版本每年準備出現1-2次，但是如果發現小錯誤，只有錯誤修復的一個版本將被發行。
  • 工作版本準備每1-8周出現一次。
  • 對一些平台的可執行檔版本，主要版本由我們制作。其他人可以為其他系統制作可執行檔版本，但是可能不多見。
  • 一旦我們找到並修復了小錯誤，我們通常使用戶可以得到修補。
  • 對非緊急但煩人的錯誤，如果他們被發給我們，我們將使用戶可以得到修補，否則我們將集中許多錯誤到一個更大的修補中。
  • 在任何情況下，如果在一個發行中有一個致命錯誤，我們將盡快制作一個新版本。我們想其他公司也這樣做。:)

當前的穩定版本是3.22﹔我們已經轉移到3.23的積極開發中。在穩定版本中，錯誤仍將被修復。我們不相信一個完全凍結，因為這也留下的錯誤修復和“必須做”的事情。“某種程度的凍結”意味著我們可以增加小東西，它“將幾乎肯定不影響已經能工作的任何東西”。

4.5 安裝布局

這節描述安裝二進制代碼和原始碼版本時創建的預設目錄布局。

可執行檔版本通過在你選擇的安裝地點(典型的“/usr/local/mysql”)解壓縮來安裝，並且在該處創建下列目錄：

目錄 | 目錄的內容
“bin” | 客戶程式和mysqld伺服器
“data” | 日誌文件, 資料庫
“include” | 包含(頭)文件
“lib” | 庫文件
“scripts” | mysql_install_db
“share/mysql ” | 錯誤消息文件
“sql-bench” | 效能程式

原始碼版本在你配置並編譯後進行安裝。預設地，安裝步驟將文件安裝在“/usr/local”下的下列子目錄：

目錄 | 目錄的內容
“bin” | 客戶程式和腳本
“include/mysql” | 包含(頭)文件
“info” | Info格式的文檔
“lib/mysql” | 庫文件
“libexec” | mysqld伺服器
“share/mysql” | 錯誤消息文件
“sql-bench” | 效能程式和crash-me測試
“var” | 資料庫和日誌文件。

在一個安裝目錄內，原始程式安裝的布局在下列方面不同於二進制安裝：

  • mysqld伺服器被安裝在“libexec”目錄而不是“bin”目錄內。
  • 數據目錄是“var”而非“data”。
  • mysql_install_db被安裝在“/usr/local/bin”目錄而非“/usr/local/mysql/scripts”內。
  • 頭文件和庫目錄是“include/mysql”和“lib/mysql”而非“include”和“lib”。

4.6 安裝MySQL可執行檔版本

你需要下列工具安裝一個MySQL可執行檔版本：

  • GNU gunzip解壓縮分發。
  • 一個適當的tar解包分發。 GNU tar已知可以。

在Linux下的另一個安裝方法是使用RPM(RedHat包管理器)分發。見4.6.1 Linux RPM 注意事項。

如果你碰到問題，在把問題郵寄到mysql@lists.mysql.com時，請總是使用 mysqlbug，就算問題不是一個bug，mysqlbug收集系統資訊，將有助於其它人解決你的問題。不使用mysqlbug，你將減少得到你問題的一個解決方案的可能性！在你解包分發後，你會在“bin”目錄下找到mysqlbug。見2.3 怎樣報告錯誤或問題。

你必須執行以便安裝並使用一個MySQL可執行檔版本的基本命令是：

shell> gunzip < mysql-VERSION-OS.tar.gz |tar  xvf -
shell> ln - s  mysql-VERSION-OS  mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &

如果你安裝了DBI和Msql-Mysql-modulesPerl模組，你可以使用bin/mysql_setpermission腳本增加新用戶。

以下是更詳細的描述：

對於安裝可執行檔版本，遵循以下步驟，然後繼續到4.15 安裝後期的設置與測試，進行安裝後期的設置和測試：

  1. 挑選一個你想解開分發包的目錄，進入給目錄。在下面的例子中，我們將分發解包在“/usr/local”下並且創建一個安裝MySQL的“/usr/local/mysql”目錄。（因此，下列指令假設你有權限在“/usr/local”中創建文件，如果該目錄被保護，你需要以root實施安裝。)
  2. 從4.1 怎樣獲得MySQL中列出的站點之一獲得一個分發文件。MySQL可執行檔版本以壓縮的tar文檔提供，並且有類似“mysql-VERSION-OS.tar.gz”的名字，這裡VERSION是一個數字(例如，3.21.15)，且OS表明分發能運行的作業系統類型(例如，pc-linux-gnu-i586)。
  3. 解開分發並且創建立安裝目錄：
    shell> gunzip < mysql-VERSION-OS.tar.gz |tar  xvf -
shell> ln - s  mysql-VERSION-OS  mysql

    第一個命令創建一個名為“mysql-VERSION-OS”的目錄，第二個命令產生到該目錄的一個符號鏈接。這讓你更容易地把安裝目錄指定為“/usr/local/mysql”。

  4. 進入安裝目錄：
    shell> cd  mysql

    你會在mysql目錄下發現幾個文件和子目錄，對安裝目的最重要的是“bin”和“scripts”子目錄。

    “bin”
    這個目錄包含客戶程式和伺服器，你應該把這個目錄的完整路徑加到你的PATH環境變數，以便你的shell能正確的找到MySQL程式。
    “scripts”
    這個目錄包含mysql_install_db腳本，用來初始化伺服器存取權限。
  5. 如果你想使用mysqlaccess而在某個非標準的地點有MySQL分發，你必須改變地點，在哪兒mysqlaccess期望找到mysql客戶。編輯“bin/mysqlaccess”腳本，大約在第18行，尋找類似下面的行：
    $MYSQL = “/usr/local/bin/mysql”;　# path to mysql executable

    改變路徑以反映出mysql實際儲存在你系統上的地點。如果你不這樣做，當你運行mysqlaccess時，你將得到一個broken pipe的錯誤。

  6. 創造MySQL授權表(只有在你以前沒安裝過MySQL是必要的)：
    shell> scripts/mysql_install_db

    注意當你運行時mysql_install_db時，比版本3.22.10老的MySQL版本啟動MySQL伺服器。這不再是真的了！

  7. 如果你想要安裝對Perl DBI/DBD介面的支援，見4.10 Perl安裝注意事項。
  8. 如果你喜歡在引導機器時自動啟動MySQL，你可以拷貝support-files/mysql.server文件到你系統有啟動文件的地方。更多的資訊可以在support-files/mysql.server腳本中和4.15.3 自動啟動和停止MySQL找到。

在所有東西被解包並且安裝以後，你應該初始化並且測試你的分發。

你可以用下列命令啟動MySQL伺服器：

shell> bin/safe_mysqld &

見4.15 安裝後期的設置和測試。

4.6.1 Linux RPM 注意事項

在Linux上安裝MySQL推薦的方法是使用一個RPM文件。MySQL RPM目前是在一個 RedHat 5.2 系統上建立的，但是應該能工作在支援rpm且使用glibc的其他 Linux 版本上。

如果一個RPM文件有問題，例如Sorry, the host 'xxxx' could not be looked up，見4.6.3.1 Linux 注意事項。

你可能要使用的RPM文件有：

  • MySQL-VERSION.i386.rpm MySQL伺服器。除非你只是想要與運行在其他機器上MySQL伺服器連接，否則你將需要它。
  • MySQL-client-VERSION.i386.rpm 標準MySQL客戶程式。你可能總是需要安裝這個包。
  • MySQL-bench-VERSION.i386.rpm 測試和效能程式。需要Perl和msql-mysql-modules RPM。
  • MySQL-devel-VERSION.i386.rpm 所需的庫和包含文件。如果你想要編譯其他MySQL客戶程式, 例如Perl模組。
  • MySQL-VERSION.src.rpm 包含上述所有包的原始程式。它也能被用來嘗試為其他硬件平台構造RPM(例如，Alpha或SPARC)。

查看一個RPM包中的所有文件：

shell> rpm - qpl  MySQL-VERSION.i386.rpm

實施一個標準的最小安裝，運行這個命令：

shell> rpm -i MySQL-VERSION.i386.rpm  MySQL-client-VERSION.i386.rpm

只安裝客戶包：

shell> rpm -i MySQL-client-VERSION.i386.rpm

RPM將數據放在“/var/lib/mysql”裡，RPM也在“/etc/rc.d/”裡創建適當的入口以便在引導時自動啟動伺服器。（這意味著如果你以前已經安裝過，在對它改變之前，你可以把你以前安裝的MySQL啟動文件做個拷貝，因此你不會丟失改動）。

在安裝了RPM文件後，“mysqld”背景執行程式應該正在運行，並且現在你應該可以開始使用MySQL。見4.15 安裝後期的設置和測試。

如果一些東西出錯，可以在二進制的安裝一節裡找到更多的資訊。見4.6 安裝MySQL可執行檔版本。

4.6.2 構造客戶程式

如果你編譯你自己寫的或你從第三方獲得的MySQL客戶程式，他們必須用link命令的-lmysqlclient選項進行鏈接。你可能也需要指定一個 -L 選項，告訴鏈接器在哪兒查找庫文件。例如，如果庫文件安裝在“/usr/local/mysql/lib”裡，在鏈接命令上使用 -L/usr/local/mysql/lib -lmysqlclient。

對使用MySQL頭文件的客戶程式，當你編譯他們時，你可能需要指定一個 -I 選項(例如，-I/usr/local/mysql/include)， 使得編譯器能找到頭文件。

4.6.3 系統特定的問題

下一節說明在從一個可執行檔版本安裝MySQL時，已經在特定的系統上觀察到已發生過一些問題。

4.6.3.1 Linux 注意事項

MySQL需要至少Linux 2.0。

二進制發行版用-static鏈接的，這意味著你一般不必擔心你擁有的系統庫是哪個版本。你也不必安裝LinuxThreads。一個用-static鏈接的程式比一個動態鏈接程式稍大些但更快(3-5%)。然而，一個問題是你不能使用靜態鏈接的用戶定義函數(UDF)。如果你準備編寫或使用UDF函數(這只對C或C++程式員)，你必須編譯MySQL本身，使用動態鏈接。

如果你正在使用一個基於libc-的系統(而不是一個glibc2系統)，你將可能碰到二進制發行的主機名解析和getpwnam()的一些問題（這是因為glibc不幸地依賴於一些包括解析主機名和getwpent()的外部庫，甚至在用-static編譯時)。在這種情況下，當你運行mysql_install_db時，你可能得到下列錯誤資訊：

sorry, the host 'xxxx' could not be looked up

或當你嘗試以 --user 選項運行 mysqld 時的下列錯誤：

getpwnam : No such fileor directory

你能用下列方法之一解決這個問題：

  • 獲得一個MySQL原始碼版本(一個RPM或tar分發)並且安裝它。
  • 執行mysql_install_db --force﹔這將不執行mysql_install_db裡面的resolveip測試。缺點是你不能在授權表中使用主機名字﹔相反你必須使用IP數字(除了localhost)。如果你正在使用一個老的不支援--force的MySQL版本，你必須用編輯器刪除mysql_install中的resolveip測試。
  • 用su啟動mysqld而不使用--user。

MySQL的Linux-Intel二進制代碼和RPM發行版是為最高可能的速度而配置的。我們總是努力使用可用的最快的穩定的編譯器。

MySQL的Perl支援要求Perl 5.004_03或更新。

4.6.3.2 HP-UX 注意事項

針對HP-UX的MySQL可執行檔版本作為一個HP depot（倉庫）或tar 文件格式分發的。為了使用depot文件，你必須運行至少HP-UX 10.x 以便訪問HP的軟件倉庫工具。

MySQL的HP版本在運行HP-UX 10.20下的HP 9000/8xx 伺服器上編譯，並且使用MIT-pthreads。它已知可在這種配置下很好地工作。MySQL 3.22.26和更新版也用HP原生執行緒包構造。

其他可以運行的配置：

  • 運行 HP-UX 10.20 + 的 HP 9000/7xx
  • 運行 HP-UX 10.30 的 HP 9000/8xx

下列配置幾乎肯定不能運行：

  • 運行 HP-UX 10.x 的 HP 9000/7xx 或 8xx ，x < 2
  • 運行 HP-UX 9.x 的 HP 9000/7xx 或 8xx

為了安裝分發，使用下面的命令之一, 這裡/path/to/depot是倉庫文件的完整路徑：

  • 要安裝所有東西，包括伺服器、客戶和開發工具：
     shell> /usr/sbin/swinstall - s  /path/to/depot  mysql.full
  • 僅僅安裝伺服器：
    shell> /usr/sbin/swinstall - s  /path/to/depot  mysql.server
  • 僅僅安裝客戶軟件包：
    shell> /usr/sbin/swinstall - s  /path/to/depot  mysql.client
  • 僅僅安裝開發工具：
    shell> /usr/sbin/swinstall - s  /path/to/depot  mysql.developer

depot在“/opt/mysql”存放二進制代碼和庫文件並在“/var/opt/mysql”存放數據。depot也在“/sbin/init.d”和“ /sbin/rc2.d”裡創建適當的入口以自動地在引導時啟動伺服器。顯然, 這有必要以root身份來安裝。

為了安裝HP-UX tar分發，你必須有GNU tar的一個拷貝。

4.7 安裝MySQL原始碼版本

你需要下列工具構造並安裝MySQL原始程式：

  • GNU gunzip解壓縮該分發。
  • 一個合適的tar解包分發。GNU tar已知可以工作。
  • 一個能運行的ANSI C++編譯器。gcc> = 2.8.1 、egcs> = 1.0.2 、SGI C++和SunPro C++是一些已知能工作編譯器。 當使gcc用時，不需要libg++。gcc2.7.x 有一個bug，使得它可能不能編譯一些完全合法的C++文件，例如“sql/sql_base.cc”。如果你僅有gcc2.7.x，你必須升級gcc才能編譯MySQL。
  • 一個優秀的make程式。GNU make總是被推薦且有時必須。如果你有問題，我們推薦試一試GNU make3.75或更新。

如果你遇到問題，當向mysql@lists.mysql.com郵寄問題時，請一直使用mysqlbug。就算問題不是一個bug，mysqlbug收集系統資訊，將有助於其它人解決你的問題。如果不使用mysqlbug，你減少得到關你問題的一個解決方案的可能性！在你解包分發後，你會在“scripts”目錄下找到mysqlbug。見2.3 怎樣報告錯誤或問題。

4.7.1 快速安裝概述

你必須執行的安裝MySQL原始碼版本的基本命令是(從一個解包的tar文件)：

shell>configure
shell>make
shell>make install
shell>scripts/mysql_install_db
shell>/usr/local/mysql/bin/safe_mysqld &

如果你從一個原始程式RPM開始，那麼執行如下命令。

shell> rpm -- rebuild MySQL-VERSION.src.rpm

這樣你制作一個可以安裝的二進制RPM。

如果你安裝了DBI和Msql-Mysql-modulesPerl模組，你可以利用bin/mysql_setpermission腳本增加新用戶。

以下是更詳細的描述：

為了安裝原始碼版本，按照下列步驟，然後繼續到4.15 安裝後期的設置與測試，進行安裝後期的初始化與測試。

  1. 挑選一個你要在其下面解包分發的目錄，並且進入該目錄。
  2. 從節4.1 怎樣獲得MySQL中列出的站點之一獲得一個分發文件。MySQL原始碼版本以壓縮的tar檔案提供，並且有類似於“mysql-VERSION.tar.gz”的名字，這裡的VERSION是一個類似3.23.7-alpha的數字。
  3. 在當前目錄下解包分發：
    shell> gunzip < mysql-VERSION.tar.gz | tar  xvf -

    這個命令創建名為“mysql-VERSION”的一個目錄。

  4. 進入解包分發的頂級目錄：
     shell> cd  mysql-VERSION
  5. 設置發行版本並且編譯：
    shell>./configure--prefix=/usr/local/mysql
shell>make

    當你運行configure時，你可能想要指定一些選項，運行./configure --help得到一張選項表。4.7.3 典型的configure選項討論一些很有用的選項。如果configure失敗，你將發送包含你認為能幫你解決該問題的“config.log”的郵件，如果configure異常退出，也要包括configure的最後幾行輸出。用mysqlbug腳本郵寄錯誤報告。見2.3 怎樣報告錯誤和問題。如果編譯失敗，見節4.8 編譯問題？，幫助解決很多常見問題。

  6. 安裝所有東西：
    shell>make install

    你可能需要root用戶來運行這個命令。

  7. 創造MySQL授權表(只有你以前沒安裝MySQL是必需的)：
    shell>scripts/mysql_install_db

    注意，在運行mysql_install_db時，那些比3.22.10舊的MySQL版本啟動MySQL伺服器。現在不是這樣了！

  8. 如果你想要安裝對Perl DBI/DBD介面的支援，見4.10 Perl安裝注意說明。
  9. 如果你想要MySQL在你引導機器時自動地啟動，你可以拷貝support-files/mysql.server到你的系統中有啟動文件的地方。更多的資訊可以在support-files/mysql.server腳本裡和4.15.3 自動啟動和停止MySQL找到。

在所有東西安裝完以後，你應該初始化並且測試你的分發。

你可以用下列命令啟動MySQL伺服器，這裡BINDIR是safe_mysqld被安裝的目錄(預設為“/usr/local/bin”)：

shell> BINDIR/safe_mysqld &

如果這個命令提示mysqld daemon ended並馬上失敗，那麼你能在文件“mysql-data-directory/'hostname'.err”找到一些資訊。可能的原因是你已經有另外一個正在運行的mysqld伺服器。見19.3 在同一台機器上運行多個MySQL伺服器。

參見4.15 安裝後期的設置與測試。

4.7.2 運用修補

有時修補出現在郵件列表上或放在MySQL FTP地點的修補區。

為了使用來自郵件列表的一個修補，保存修補出現在文件的消息，進入你的MySQL原始程式樹的頂級目錄並運行這些命令：

shell>patch - p1 <patch-file-name
shell>rm config.cache
shell>make clean

來自FTP地點的修補是作為純文字版文件或作為被壓縮了的gzip文件分發。運用一個文本的修補如上述郵件列表修補，為了使用一個壓縮的修補，進入你的MySQL原始程式樹頂級目錄並運行這些命令：

shell>gunzip <patch-file-name.gz |patch - p1
shell>rm  config.cache
shell>make clean

在使用一個修補以後，按照正常的原始程式安裝的指令，開始./configure步驟。在運行make install後，重啟你的MySQL伺服器。

在運行make install前，你可能需要關閉所有正在運行的伺服器（使用mysqladmin shutdown)。如果一個程式的新版本替代當前正在執行的版本，一些系統不允許你安裝它。

4.7.3 典型的configure選項

configure腳本給你一個很大的控制權來如何配置你的MySQL分發。典型地，你使用configure命令行的選項進行。你也可以用正確的環境變數作用於configure。對於一個由configure支援的選擇列表，運行這個命令：

shell> ./configure -- help

一些更常用的configure選項見下面的描述：

  • 只編譯MySQL客戶庫和客戶程式而不是伺服器，使用--without-server選項：
    shell> ./configure --without-server

    如果你沒有一個 C++ 編譯器，mysql將不編譯(有一個客戶程式需要C++)。在這種情況下，你可以去掉configure裡面測試C++編譯器的代碼，然後運行帶有 --without-server選項的./configure。編譯步驟步將仍然嘗試構造mysql，但是你可以忽笨酚何關於“ mysql.cc ”的警告。（如果make停止，試試make -k告訴它即使出錯繼續剩下的構造步驟）。

  • 如果你不想要位於“/usr/local/var”目錄下面的日誌(log)文件和資料庫，使用類似於下列configure命令的一個：
    shell>./configure--prefix=/usr/local/mysql
shell>./configure--prefix=/usr/local --localstatedir=/usr/local/mysql/data

    第一個命令改變安裝前綴以便任何東西被安裝在“/usr/local/mysql”下面而非預設的“/usr/local”。第二個命令保留預設安裝前綴，但是覆蓋了資料庫目錄預設目錄(通常是“/usr/local/var”)並且把它改/usr/local/mysql/data.

  • 如果你正在使用Unix並且你想要MySQL的套接字位於預設地點以外的某個地方(通常在目錄“/tmp”或“/var/run”，使用像這樣的configure的命令：
    shell> ./configure -- with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock

    注意給出的文件必須是一個絕對路徑！

  • 如果你想編譯靜態鏈接程式(例如，制作可執行檔版本、獲得更快的速度或與解決與RedHat分發的一些)，像這樣運行configure：
    shell>./configure --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
  • 如果你正在使用gcc並且沒有安裝libg++或libstdc++，你可以告訴configure使用gcc作為C++編譯器：
    shell> CC=gcc  CXX=gcc  ./configure

    當你使用時gcc作為C++編譯器是，它將不試圖鏈接libg++或libstdc++。如果構造失敗並且產生有關編譯器或鏈接器的錯誤，不能創建共享庫“libmysqlclient.so.#”(“#”是一個版本號), 你可以通過為configure指定--disable-shared選項來解決此問題。在這種情況下，configure將不構造一個共享libmysqlclient.so.#庫。

  • 你可以設置MySQL對於非NULL的列不使用DEFAULT列值(即，不允許列是NULL)。這導致INSERT語句產生一個錯誤，除非你明確地為所有要求非NULL值的列指定值。為了禁止使用預設值，這樣運行configure：
    shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS  ./configure
  • 預設地，MySQL使用ISO-8859-1(Latin1)字符集。為了改變預設設置，使用--with-charset選項目：
    shell> ./configure -- with-charset=CHARSET

    CHARSET可以是big5、cp1251、cp1257、czech、danish、dec8、dos、euc_kr、gb2312 gbk、german1、hebrew、 hp8、hungarian、koi8_ru、koi8_ukr、latin1、latin2、sjis、swe7、tis620、ujis、usa7、win1251或win1251ukr之一。見9.1.1 用於數據和排序的字符集。注意：如果你想要改變字符集，你必須在配置期間做make distclean！如果你想在伺服器和客戶之間變換字符，你應該看一下SET OPTION CHARACTER SET命令。見7.25 SET OPTION句法。警告：如果你在創建了任何資料庫表之後改變字符集，你將必須對每個表運行myisamchk -r -q，否則你的索引可能不正確地排序。（如果你安裝了MySQL，創建一些表，然後重新配置MySQL使用一個不同的字符集並且重新安裝它，這時就可能發生這種情況。）

  • 為了配置MySQL帶有調試代碼，使用--with-debug選項：
    shell> ./configure --with-debug

    這導致包含一個安全的內存分配器，能發現一些錯誤和並提供關於正在發生的事情的輸出。見G.1調試一個MySQL伺服器。

  • 屬於特定系統的選項可在本章特定系統的小節裡找到。見4.11 系統特定的問題。

4.8 編譯問題？

所有MySQL程式在Solaris上使用gcc編譯並且沒有任何警告。在其他系統上，由於系統包含文件的差別可能會發生警告。對於使用MIT-pthreads時發生的警告，見4.9 MIT-pthreads 注意事項。其他問題，檢查下面的表。

許多問題的解決方案涉及重新配置。如果你確實需要重新配置，注意下列事項：

  • 如果configure在它已經被運行了以後運行，它可以使用先前收集的資訊。這個資訊被儲存在“config.cache”裡面。當configure啟動時，它尋找該文件而且如果它存在，假定資訊仍然是正確的，讀入它的內容。當你重新配置時，該假設是無效的。
  • 每次你運行configure時候，你必須運行make再重新編譯。然而, 你可能想要把先前構造的老的目標文件刪除，因為他們使用不同的配置選項被編譯。

為了防止使用舊的配置資訊或目標文件，在重新運行configure前運行這些命令：

shell>rm  config.cache
shell>make clean

另外，你可以運行make distclean。

下表描述了一些最常發生的編譯MySQL的問題：

  • 如果在編譯“sql_yacc.cc”時，你得到如下的一個錯誤，你可能是儲存器或交換空間溢出：
    Internal compiler error: program cc1plus got fatal signal 11
  或
Out of virtual memory
  或
Virtual memory exhausted

    該問題是gcc要求大量的內存編譯帶有嵌入函數(inline function)的“sql_yacc.cc”。試試以--with-low-memory選項運行configure：

    shell>./configure -- with-low-memory

    如果你正在使用gcc，該選項使得將-fno-inline加到編譯行，如果你正在使用其他的編譯器，則加入-O0。你應該試一試--with-low-memory選項，即使你有特別多的儲存器和交換空間，而你認為不能可能運行得溢出。這個問題甚至在很慷慨的硬件配置的系統上出現，通常用--with-low-memory選項修正它。

  • 預設地，configure挑選c++作為編譯器名字並用-lg++選項的GNU c++鏈接。如果你正在使用gcc，這個特性在配置期間導致如下問題：
    configure: error: installation or configuration problem:
C++ compiler cannot create executables.

    你可能也在編譯期間看到g++、libg++或libstdc++相關的問題。這些問題的一個原因是你可能沒有g++，或你可能有g++但無libg++或libstdc++。看一下“config.log”文件。它應該包含你的c++編譯器不能工作的準確原因！為了解決這些問題，你可以使用gcc作為你的C++編譯器。試試設置環境變數CXX為"gcc -O3"。例如：

    shell>CXX="gcc -O3" ./configure

    它能工作，因為gcc像g++一樣編譯C++原始程式，但預設地它不鏈接libg++或libstdc++。解決這些問題的其他方法當然是安裝g++、libg++和libstdc++。

  • 如果你的編譯以下面任何錯誤而失敗，你必須升級make版本到GNUmake：
    making all in mit-pthreads
make: Fatal error in reader: Makefile, line 18:
Badly formed macro assignment
  or
make: file `Makefile' line 18: Must be a separator (:
  or
pthread.h: No such file or directory

    Solaris和FreeBSD已知make程式有問題。GNU make版本3.75已知能工作。

  • 如果你想要定義你的C或C++編譯器所使用的標誌，把標誌加到CFLAGS和CXXFLAGS環境變數中即可。你也能使用CC和CXX來指定編譯器名字。例如：
    shell>CC=gcc
shell>CFLAGS=-O6
shell>CXX=gcc
shell>CXXFLAGS=-O6
shell>export CC  CFLAGS  CXX  CXXFLAGS

    對於已經知道在不同系統上有用的標誌定義列表，見4.14 TcX 二進制代碼。

  • 如果你得到像如下的一條錯誤消息，你需要升級你的gcc編譯器：
    client/libmysql.c:273: parse error brfore '__attribute__'

    gcc2.8.1已知可以工作，但是我們推薦使用egcs1.0.3a或更新。

  • 如果你在編譯mysqld時顯示例如下面的那些錯誤, configure沒有正確地檢測傳到accept()、getsockname()或getpeername()最後參數的類型：
    cxx: Error: mysqld.cc, line 645: In this statement, the referenced
     type of the pointer value "&length" is "unsigned long", which
     is not compatible with "int".
new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);

    為了修正它，編輯“config.h”文件(它由configure產生)。尋找這些行：

    /* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX

    更改XXX為size_t或int，這取決於你的作業系統。（注意：你每次運行configure都必須這樣做，因為configure重新產生“config.h”。)

  • “sql_yacc.cc”文件由“sql_yacc.yy”產生。通常構造程序不需要創造“sql_yacc.cc”，因為MySQL有一個已經產生的拷貝，然而，如果你確實需要再創建它，你可能碰到這個錯誤：
    "sql_yacc.yy", line xxx fatal: default action causes potential...

    這是一個你的yacc版本不完善的跡像。你可能需要安裝bison（GNU 版本yacc)並使用它。

  • 如果你需要調試mysqld或MySQL客戶，運行configure，使用--with-debug選項，然後重新編譯並且鏈接你客戶程式到新的客戶庫。見G.2 調試一個MySQL客戶。

4.9 MIT-pthreads注意事項

這節描述在使用 MIT-pthreads 所涉及的一些問題。

注意：在Linux上，你應該不使用MIT-pthreads而是安裝LinuxThreads！見4.11.5 Linux 注意事項(所有的Linux 版本)。

如果你的系統不提供原生的執行緒支援，你將需要使用MIT-pthreads包構造MySQL。這包括大多數FreeBSD系統、SunOS 4.x 、Solaris 2.4和更早版本及其他，見4.2 MySQL 支援的作業系統。

  • 在大多數系統上，你能通過使用configure，用--with-mit-threads選項來強迫運行MIT-pthreads：
    shell> ./configure -- with-mit-threads

    當使用MIT-pthreads時，不支援在一個非原始程式目錄構造，因為我們想要使我們對代碼的改變減到最小。

  • MIT-pthreads不支援用於實現Unix套接字的AF_UNIX協議。這意味著如果你使用MIT-pthreads進行編譯，所有的鏈接必須使用TCP/IP進行(它有點慢)。如果在構造MySQL後，你發現你不能與本地的伺服器連接，很可能是客戶程式正在試圖用預設的Unix套接字與localhost連接。使用主機選擇(-h或--host)明確地指定本地的主機名字，嘗試做一個TCP/IP連接到mysql。
  • 決定是否使用MIT-pthreads的檢查僅在處理伺服器代碼的配置程序期間發生。如果已經用--without-server配置了分發並只構造客戶代碼，客戶將不知道MIT-pthreads是否正在被使用並且是否使用預設的Unix套接字連接。因為Unix套接字不能在MIT-pthreads下面工作，這意味著當你運行客戶程式時，你將需要使用-h或--host。
  • 當使用MIT-pthreads編譯MySQL時，因為性能原因，系統鎖定預設為禁止使用。你可以用--use-locking選項告訴伺服器使用系統鎖定。
  • 有時pthreadbind()命令不能綁定一個套接字但沒有任何錯誤消息(至少在Solaris上)，結果是所有到伺服器的連接均失敗。例如：
    shell> mysqladmin version
mysqladmin: connect to server at '' failed;
error: 'Can't connect to mysql server on localhost (146)'

    解決它的方法是殺死mysqld伺服器並且重啟它。這只有當我們強迫伺服器停止並馬上進行重啟時在發生。

  • 使用MIT-pthreads，sleep()系統調用不是可中斷的SIGINT（break)。這只有在你運行mysqladmin --sleep時才能注意到。你在中斷起作用並且進程停止之前必須等待sleep()終止。
  • 當鏈接時，你可能會收到這樣的警告消息(至少在Solaris上)﹔他們可以被忽視：
    ld: warning: symbol `_iob' has differing sizes:
    (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
    /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
ld: warning: symbol `__iob' has differing sizes:
    (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
    /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
  • 一些其他的警告也可被忽略：
    implicit declaration of function `int strtoll(...)'
implicit declaration of function `int strtoul(...)'
  • 我們還沒有讓readline可在MIT-pthreads上工作。（這不需要，但是可能某些人有興趣。）

4.10 Perl 安裝說明

4.10.1 在Unix上安裝Perl

Perl對MySQL的支援借助DBI/DBD客戶介面而提供。見20.5 MySQL Perl API。Perl DBD/DBI客戶代碼要求Perl 5.004或以後版本。如果你有Perl的一個更舊的版本，介面將不能工作。

MySQL Perl支援也要求你安裝了MySQL客戶編程支援。如果你從RPM文件安裝MySQL，客戶程式在客戶RPM中，但是客戶編程支援在開發者RPM。確定你安裝了後一個RPM 。

對於版本3.22.8，Perl支援是與主要MySQL發行版本單獨分發。如果你想要安裝Perl支援，你需要的文件能從http://www.mysql.com/Contrib獲得。

Perl 分發以壓縮的tar檔案提供，並且有一個類似“MODULE-VERSION.tar.gz”的名字，這裡MODULE是模組名字並且VERSION是版本號。你應該得到Data-Dumper、DBI和Msql-Mysql-modules分發並按此次序安裝他們。安裝程序顯示出在下面，顯示的例子針對Data-Dumper模組, 但是所有3個程序是相同的。

  1. 解包分發到當前目錄：
    shell> gunzip < Data-Dumper-VERSION.tar.gz | tar  xvf -

    這個命令創建的一個名為“Data-Dumper-VERSION”的目錄。

  2. 進入解包分發的頂級目錄：
    shell> cd  Data-Dumper-VERSION
  3. 構造分發並且編譯所有東西：
    shell> perl Makefile.PL
shell> make
shell> make test
shell> make install

make test命令很重要，因為它驗証模組正在工作。注意：在你Msql-Mysql-modules安裝期間運行該命令試驗介面代碼時，MySQL伺服器必須正在運行，否則測試將失敗。

無論何時你安裝一個新版本的MySQL，重建並且重新安裝Msql-Mysql-modules分發是一個好主意, 特別是如果你在升級MySQL後，觀察所有異常，如你的DBI腳本核心傾倒(core dump)。

如果你沒有權限在系統目錄下安裝Perl模組，或如果你安裝本地Perl模組，下列參考書可以幫助你：

http://www.iserver.com/support/contrib/perl5/modules.html

在標題Installing New Modules that Require Locally Installed Modules下面查找。

4.10.2 在Win32上安裝ActiveState Perl

在 Win32 上安裝 ActiveState Perl的MySQL DBD的模組, 你應該做下列步驟：

  • 打開一個DOS shell。
  • 如果需要，設置HTTP_proxy變數。例如, 你可以試一試：set HTTP_proxy=my.proxy.com:3128
  • 啟動PPM程式：C:\perl\bin\ppm.pl
  • 如果你還沒有這樣做，安裝DBI： install DBI
  • 如果成功，安裝DBD::mysql：http://www.mysql.com/Contrib/ppd/DBD-mysql.ppd

如果你不能使上述步驟工作，你應該安裝MyODBC驅動程式並且通過ODBC連接MySQL伺服器。

use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") ||
  die "Got error $DBI::errstr when connecting to $dsn\n";

4.10.3 在Win32上安裝MySQL Perl分發

MySQL Perl分發包含DBI、DBD:MySQL和DBD:ODBC。

  • 從http://www.mysql.com/download.html得到Win32的Perl分發。
  • 在C:解壓縮分發，這樣你得到一個“C:\PERL”目錄。
  • 增加目錄“C:\PERL\BIN”到你的路徑。
  • 增加目錄“C:\PERL\BIN\MSWin32-x86-thread”或“C:\PERL\BIN\MSWin32-x86”到你的路徑。
  • 在 DOS shell執行perl -v測試perl的運行。

4.10.4 使用PerlDBI/DBD介面的問題

如果 Perl 報告它不能找到../mysql/mysql.so模組，那麼問題可能是該Perl不能找到共享庫文件“libmysqlclient.so”。

你可用下列任何一個方法修正它這：

  • 用perl Makefile.PL -static而非perl Makefile.PL編譯Msql-Mysql-modules分發。
  • 拷貝libmysqlclient.so到其他共享庫文件所在的目錄(可能是“/usr/lib”或“/lib”)。
  • 在Linux上，你可以把libmysqlclient.so所在目錄的路徑名加到“/etc/ld.so.conf”文件中。
  • 把libmysqlclient.so所在目錄的路徑名加到LD_RUN_PATH環境變數中。

如果你從DBD-mysql得到下列錯誤，你可能正在使用gcc（或使用一個舊的用gcc編譯的二進制代碼)：

/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'

當“mysql.so”庫文件被構造時候，為鏈接命令加上-L/usr/lib/gcc-lib/... -lgcc(當你編譯Perl客戶時檢查針對“mysql.so”的make輸出)。-L選項應該指定“libgcc.a”在你系統上所在目錄的路徑名。

這個問題的另一個原因可能是Perl和MySQL都不是用gcc編譯的。在這種情況下，你可以都用gcc編譯以解決不匹配。

如果你想要在一個不支援動態鏈接(像SCO那樣)的系統上使用Perl模組，你可以產生包括DBI和DBD-mysql的Perl的一個靜態版本。這種運行方法是你產生一個鏈接了DBI代碼的Perl版本並在最新的Perl上安裝它，然後你使用它來構造附加鏈接了DBD代碼的Perl版本，並且安裝它。

在 SCO 上，你必須有下列環境變數設置：

shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
或
shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:

首先, 在DBI分發所在目錄下運行下列命令，創造包括一個靜態鏈接的Perl DBI：

shell> perl Makefile.PL LINKTYPE=static
shell> make
shell> make install
shell> make perl

然後你必須安裝新的Perl。make perl的輸出將顯示正確的你需要執行施行安裝的make的命令。在SCO上，是make -f Makefile.aperl inst_perl MAP_TARGET=perl.

接下來，在Msql-Mysql-modules分發所在目錄下，使用剛才創建的Perl來創建同樣包括一個靜態鏈接的PerlDBD::mysql的另一個Perl：

shell> perl Makefile.PL LINKTYPE=static
shell> make
shell> make install
shell> make perl

最後, 你應該安裝這個新的Perl。而且，make perl的輸出指出使用的命令。

4.11 系統特定的問題

下面的章節說明在從原始碼版本安裝MySQL時，發生在特定的系統上並已觀察到的一些問題。

4.11.1 Solaris注意事項

在Solaris上，甚至在你解開MySQL分發以前，你可能陷入困境！Solaris tar不能處理長文件名字，因此你在打開MySQL時，可能看到這樣的一個錯誤：

x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks
tar: directory checksum error

在這種情況下，你必須使用 GNU tar(gtar) 打開分發。你能在http://www.mysql.com/Downloads/找到為Solaris的一個預編譯的拷貝。

Sun的原生執行緒只工作在Solaris 2.5和更高版本上。對於2.4和更早的版本，MySQL將自動地使用 MIT-pthreads 。見4.9 MIT-pthreads 注意事項。

如果你從配置得到下列錯誤：

checking for restartable system calls... configure: error can not run test
programs while cross compiling

這意味著你的編譯器安裝有些問題！在這種情況下，你應該升級編譯器到一個更新的版本。你也可以把下列行插入到config.cache文件來解決這個問題：

ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}

如果你在一個SPARC上使用Solaris，推薦的編譯器是egcs1.1.2 或更新。你能在http://egcs.cygnus.com/找到它。注意：egs1.1.1 和gcc2.8.1 不能在 SPARC 上可靠地工作！

當使用時egcs1.1.2時，推薦的configure命令行是：

shell> CC=gcc CFLAGS="-O6" \
       CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" \
       ./configure --prefix=/usr/local/mysql --with-low-memory

如果你有Sun Workshop 4.2 編譯器，你能這樣運行configure：

CC=cc CFLAGS="-xstrconst -Xa -xO4 -native -mt" CXX=CC CXXFLAGS="-xO4 -native -noex -mt" ./configure --prefix=/usr/local/mysql

shell> CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \
       CXX=CC CXXFLAGS="-noex -XO4 -mt" \
       ./configure

你也可以編輯configure腳本改變該行：
#if !defined(__STDC__) || __STDC__ != 1

為：
#if !defined(__STDC__)

如果你使用-Xc選項打開__STDC__，Sun編譯器不能用 Solaris 的“pthread.h”頭文件編譯。這是Sun的一個bug。

如果mysqld在運行時發出顯示在下面的錯誤消息，你已經嘗試用Sun編譯器編譯MySQL，沒有啟用多執行緒選擇(-mt)：

libc internal error: _rmutex_unlock: rmutex not held

增加-mt到CFLAGS和CXXFLAGS並且再試一試。

如果你在用gcc編譯MySQL時得到下列錯誤，它意味著你的gcc沒有對你的Solaris版本進行配置！

shell> gcc -O3 -g -O2 -DDBUG_OFF  -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'

在這種情況下正確的做法是得到最新版本的egcs，並且用你當前的gcc編譯器編譯它！至少對於 Solaris 2.5，幾乎所有的gcc二進制版本都有舊的、不可用的包含文件，將破懷使用執行緒的所有程式的文件(並且可能是其他的程式)！

Solaris不提供所有系統庫的靜態版本(libpthreads和libdl)，所以你不能用--static編譯MySQL。如果你嘗試這樣做，你將得到錯誤：

ld: fatal: library -ldl: not found

如果太多進程試圖很快地連接mysqld，你將在MySQL日誌文件中看見這個錯誤：

Error in accept: Protocol error

你可以試著用--set-variable back_log=50選項啟動伺服器作為它的一個解決辦法。

如果你正在鏈接你自己的MySQL客戶，當你試著執行它時，你可能得到下列錯誤：

ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory

這個問題能用下列方法之一避免：

  • 用下列符號連結客戶(而不是-Lpath)： -Wl,r/full-path-to-libmysqlclient.so。
  • 拷貝libmysqclient.so到“/usr/lib”。
  • 在運行你的客戶程式前，把libmysqlclient.so所在目錄的路徑名加到LD_RUN_PATH的環境變數中。

4.11.2 Solaris 2.7 注意事項

通常你能在 Solaris 2.7 上使用 Solaris 2.6 二進制代碼。大多數Solaris 2.6 的問題也適用於Solaris 2.7。

注意：MySQL3.23.4 和更高版本應該能自動檢測 Solaris 2.7 並且啟用下列問題的解決辦法！

Solaris 2.7 在包括文件中有一些bug，在使用gcc時，你可以看見下列錯誤：

/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition

如果出現這種情況，你可以做下列事情解決這個問題：

拷貝/usr/include/widec.h到.../lib/gcc-lib/os/gcc-version/include並且改變第41行：

#if     !defined(lint) && !defined(__lint)

為

#if     !defined(lint) && !defined(__lint) && !defined(getwc)

另外，你可以直接編輯“/usr/include/widec.h”。這兩種方法，在你進行修正以後，你應該刪除“config.cache”並且再運行configure！

如果當你運行make時，你得到像這樣錯誤，那是因為configure沒檢測“curses.h”文件(可能因為/usr/include/widec.h的錯誤)：

In file included from mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'

解決它的方案是做下列步驟之一：

  • 如上所述編輯“/usr/include/widec.h”並且再次運行configure。
  • 從“config.h”文件刪除#define HAVE_TERM行並再次運行make。
  • 用CFLAGS=-DHAVE_CURSES CXXFLAGS=-DHAVE_CURSES ./configure進行配置。

4.11.3 Solaris x86 注意事項

如果你正在在 Solaris x86上使用gcc或egcs，並且你碰到了在裝載時的核心傾倒（core dump）問題，你應該使用下列configure命令：

shell> CC=gcc CFLAGS="-O6 -fomit-frame-pointer" \
       CXX=gcc \
       CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" \
       ./configure --prefix=/usr/local/mysql

用libstdc++庫和與C++異常處理來避免這個問題。

如果這沒有幫助，你應該編譯一個調試版本並且用一個蹤跡文件運行它或在gdb下運行它。見G.1 調試一個 MySQL 伺服器。

4.11.4 SunOS 4 注意事項

在 SunOS 4 上， 需要MIT-pthreads 編譯MySQL，反過來這意味著你將需要GNU make。

一些SunOS 4系統的動態庫和libtool有問題。你可以使用下列configure行來避免這個問題：

shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static

當編譯readline時，你可能得到關於重複定義的警告，這些可以被忽略。

當編譯mysqld時候， 將有一些implicit declaration of function警告，這些可以被忽略。

4.11.5 Linux 注意事項(所有Linux版本)

MySQL在Linux上使用 LinuxThreads 。如果你正在使用一個沒有glibc2的老的Linux版本，你必須在嘗試編譯MySQL前安裝LinuxThreads。http://www.mysql.com/Downloads/Linux

注意：但你做INSERT DELAYED時，所用的包括2.1.1及以前的glibc版本在pthread_mutex_timedwait處理上有一個致命錯誤，如果你正在使用INSERT DELAYED，你必須把下列修補加到你的glibc庫中：http：//www.mysql.com/Downloads/Patches/glibc-pthread_cond_timedwait.patch。MySQL 3.23.7包含了對這個錯誤的一個臨時解決辦法。

如果你不能啟動mysqld或如果mysql_install_db不工作，請繼續讀下去！這僅發生在有LinuxThreads問題或libc/glibc庫為題的Linux系統上。有很多簡單的解決辦法讓MySQL工作！最簡單是使用針對Linux x86的二進制版本的MySQL（不是RPM)，這個版本的一個好的方面是它可能比你編譯你自己的任何版本快10%！見10.2.1 編譯和鏈接如何影響 MySQL 的速度。

可執行檔版本的一個已知問題是與使用libc的更老的Linux系統（如RedHat 4.x 或 Slackware)，你將得到有關主機名解決的一些非致命問題。見4.6.3.1 Linux注意事項。

使用libc.so.5.3.12，myisamchk將掛起，升級到最新libc以解決這個問題。

當使用 LinuxThreads 時，你將看到最少 3 進程在運行。這些事實上的執行緒，對LinuxThreads管理器將有一個執行緒，一個執行緒處理連接，還有一個執行緒處理告警和信號。

如果你用ps看到了一個死掉的mysqld背景執行程式，這通常意味著你發現了MySQL裡面的一個錯誤或你有一個被破壞的資料庫表。見18.1 如果MySQL總是崩潰怎麼辦。

如果你正在使用LinuxThreads並且mysqladmin shutdown不工作，你必須升級到 LinuxThreads 0.7.1 或更新。

如果你正在使用 RedHat ，你可能得到像這樣的錯誤：

/usr/bin/perl is needed...
/usr/sh is needed...
/usr/sh is needed...

如果是這樣，你應該升級rpm版本到“rpm-2.4.11-1.i386.rpm”和“rpm-devel-2.4.11-1.i386.rpm”(或以後)。

你能從ftp://ftp.redhat.com/updates/4.2/i386得到RedHat 4.2的庫文件升級，或對其他分發http://www.sunsite.unc.edu/pub/Linux/distributions/redhat/code/rpm/。

如果你正在鏈接你自己的MySQL客戶並且得到錯誤：

ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory

當執行它們時，這個問題可用下列方法之一避免：

  • 用下列符號連結客戶(而不是-Lpath)： -Wl,r/path-libmysqlclient.so。
  • 拷貝libmysqclient.so到“/usr/lib”。
  • 在運行你的客戶程式前，把libmysqlclient.so所在目錄的路徑名加到LD_RUN_PATH的環境變數中。

如果你正在使用 Fujitsu 編譯器(fcc / FCC)，編譯MySQL你將有一些問題，因為 Linux 頭文件面向gcc。

下列configure行應該與fcc/FCC工作：

CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=const \
-DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib  -K omitfp \
-K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const \
-Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" \
./configure --prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static --disable-shared --with-low-memory

4.11.5.1 Linux-x86 注意事項

MySQL要求libc版本 5.4.12 或更新，已知可工作在libc 5.4.46。glibc版本2.0.6和以後版本應該也工作。使用RedHat的glibc RPM有一些問題，所以如果你有問題，檢查是否有任何更新！glibc2.0.7-19和2.0.7-29 RPM已知可以工作。

在一些更老的 Linux 分發上，configure可能產生像這樣的一個錯誤：

Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
See the Installation chapter in the Reference Manual.

按照錯誤消息所說的去做，並且給只有一條下畫線的_P宏增加一個額外下畫線 ('__P'), 然後再試一試。

在編譯時，你可能得到一些警告﹔顯示在下面的那些可以被忽略：

mysqld.cc -o objs-thread/mysqld.o
mysqld.cc: In function `void init_signals()':
mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int'
mysqld.cc: In function `void * signal_hand(void *)':
mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'

在Debian GNU/Linux上，如果你想要在系統啟動時自動啟動MySQL，做下列命令：

shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> /usr/sbin/update-rc.d mysql.server defaults 99

mysql.server可以在MySQL安裝目錄的“share/mysql”目錄下面找到, 或在MySQL原始程式樹的“support-files”目錄下找到。

如果mysqld在它啟動時總是核心傾倒(core dump), 問題可能是你有一個老版本的“/lib/libc.a”，重命名它，然後刪除“sql/mysqld”並且重新make install再試一試。這個問題在一些 Slackware 安裝上被報告了。有最新版本的glibc的RedHat 5.0也有一些類似的問題。見4.11.5.2 RedHat 5.0 注意事項。

如果再鏈接mysqld時，你得到下列錯誤, 它意味著你的“libg++.a”沒有正確安裝：

/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'

像這樣運行configure，你能避免使用“libg++.a”：

shell> CXX=gcc ./configure

4.11.5.2 RedHat 5.0 注意事項

如果你在RedHat上有MySQL的任何問題，你應該開始升級glibc到最新可能的版本！

如果你安裝所有的官方RedHat修補(包括glibc-2.0.7-19和glibc-devel-2.0.7-19)，MySQL的二進制代碼和原始碼版本運行應該沒有任何麻煩！

因為在glibc2.0.5裡面有關如何釋放pthread_key_create變數有一個錯誤，更新是需要的。用glibc2.0.5，你必須使用一個靜態地鏈接的MySQL可執行檔版本。如果你想要從原始程式編譯，你必須安裝來自於http://www.mysql.com/Downloads/Linux 的LinuxThreads修正版本或升級你的glibc。

如果你有一個不正確的glibc或LinuxThreads版本，其結果是mysqld在每個連接以後崩潰。例如，mysqladmin version完成後，mysqld將崩潰！

另一個不正確的庫的症狀是當mysqld啟動時，馬上崩潰。在一些Linux系統上，這個問題可以通過這樣的配置來修正：

shell> ./configure -- with-mysqld-ldflags=-all-static

在Redhat 5.0上，容易的方法是安裝glibc2.0.7-19 RPM並運行configure --with-mysqld-ldflags=-all-static選項。

對於glibc2.0.7的原始碼版本，容易運用並被MySQL測試的一個修補可以在下面找到：

http://www.mysql.com/Download/Linux/glibc-2.0.7-total-patch.tar.gz

如果當你構造MySQL時，你有類似於這些崩潰的經歷, 你總能下載到最新的MySQL二進制版本。這是靜態鏈接的以避免庫衝突而且應該在所有的Linux系統上工作！

MySQL自帶一個內部的調試器可以有很多資訊產生蹤跡文件，能被用來發現並解決大量不同的問題。見G.1 調試一個MySQL伺服器。

4.11.5.3 RedHat 5.1 注意事項

RedHat 5.1的glibc(glibc2.0.7-13 )有一個內存缺陷，所以要得到一個穩定的MySQL版本，你必須升級glibc到2.0.7-19、降級glibc或使用一個mysqld的二進制版本。如果你不這樣做，你將碰到內存問題(記憶體溢位，等等, 等等)。在這種情況下，最常見的錯誤是：

Can't create a new thread (errno 11). If you are not out of available
memory, you can consult the manual for any possible OS dependent bug

在你升級到glibc2.0.7-19以後，你可以用動態鏈接(預設)配置MySQL，但是在你從原始程式安裝了glibc 2.0.7-19之前，你不能運行configure --with-mysqld-ldflags=-all-static選項！

你可以用rpm -q glibc檢查你有glibc哪個版本。

4.11.5.4 Linux-SPARC 注意事項

在一些實現中，readdir_r()被破壞了。其症狀是SHOW DATABASES總是返回一個空集合。這可以通過在編譯前從“config.h”中刪除HAVE_READDIR_R進行更正。

有些問題將需要給你的Linux安裝打修補。修補可在http://www.mysql.com/patches/Linux-sparc-2.0.30.diff找到，這個修補是針對Linux分發“sparclinux-2.0.30.tar.gz”，它們可從vger.rutgers.edu（一個從來沒有與官方的2.0.30版合並的版本)得到。你也必須安裝LinuxThreads 0.6或更新。

感謝jacques@solucorp.qc.ca提供這個資訊。

4.11.5.5 Linux-Alpha注意事項

在Linux-Alpha上的大問題仍然是在這個平台上的glibc的執行緒有一些問題。你應該從得到你能找到的最新glibc版本開始。

注意：在你運行任何使用執行緒的程式之前(像mysqld、thr_alarm或thr_lock)，你應該增減共享儲存器的限制(用ulimit)。如果你忘記這樣做，MySQL效能測試已知是失敗的！

用下列命令配置MySQL：

shell> CC=gcc CCFLAGS="-Dalpha_linux_port" \
       CXX=gcc CXXFLAGS="-O3 -Dalpha_linux_port -felide-constructors -fno-exceptions -fno-rtti" \
       ./configure --prefix=/usr/local/mysql

試試編譯mysys/thr_lock和mysys/thr_alarm，測試這些程式的運行！（不用參數調用每一個，如果一切正常，每個應該以test_succeeded結束。）

在安裝MySQL以後，在safe_mysqld裡去掉ulimit命令的注釋，並加入選項以增加共享儲存器。

注意對MySQL來說，Linux-Alpha仍然是一個alpha質量的平台。用最新glibc，你有一個讓它工作的很好機會。

如果你用信號方面的問題(MySQL出人意料地在高負載下死掉)，你可能找到了一個執行緒和信號有關的OS錯誤。在這種情況下，你可以告訴MySQL如下配置以不使用信號：

shell> CFLAGS=-DDONT_USE_THR_ALARM \
       CXXFLAGS=-DDONT_USE_THR_ALARM \
       ./configure ...

這不影響MySQL性能，但是有副作用，就是你不能用mysqladmin kill或mysqladmin shutdown殺死在一個連接上“睡眠”的客戶。相反，當客戶發出下一個命令時，它將死掉。

4.11.5.6 MkLinux 注意

MySQL應該能工作在有最新glibc包的MkLinux上(用glibc2.0.7測試過)。

4.11.5.7 Qube2 Linux注意事項

為了讓MySQL在Qube2上工作，(Linux Mips)，你需要最新的glibc庫(glibc-2.0.7-29C2已知可工作)。你也必須使用egcsC++編譯器(egcs-1.0.2-9或更新)。

4.11.6 Alpha-DEC-Unix 注意事項

當在Digital UNIX下編譯執行緒程式時，文檔推薦對於cc和cxx使用-pthread選項而且庫文件用-lmach -lexc（除了-lpthread外)。你應該像下面這樣運行configure：

shell> CC="cc -pthread" CXX="cxx -pthread -O" \
       ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"

當編譯mysqld時，你可能看見這樣一些警告：

mysqld.cc: In function void handle_connections()':
mysqld.cc:626: passing long unsigned int *' as argument 3 of
accept(int,sockadddr *, int *)'

你可以安全地忽略這些警告，他們的發生是因為configure只能檢測出錯誤，而不是警告。

如果你直接從命令行啟動伺服器，當你退出時，你可能有死掉的問題。（當你退出時，你的重要進程收到一個SIGHUP信號)，如果如此，試著像這樣啟動伺服器：

shell> nohup  mysqld [options] &

nohup使得跟隨它的命令忽視從終端發來的任何SIGHUP信號了。另外，通過運行safe_mysqld啟動伺服器，它為你使用nohup調用mysqld。

4.11.7 Alpha-DEC-OSF1注意事項

如果你有編譯問題並安裝了DECCC和gcc，嘗試這樣運行configure：

shell> CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \
       ./configure --prefix=/usr/local/mysql

如果你得到“c_asm.h”文件的問題，你可以創建並使用一個“啞(dummy)”“c_asm.h”文件：

shell> touch include/c_asm.h
shell> CC=gcc CFLAGS=-I./include \
       CXX=gcc CXXFLAGS=-O3 \
       ./configure --prefix=/usr/local/mysql

在OSF1 V4.0D和編譯器"DEC C V5.6-071 on Digital UNIX V4.0 (Rev. 878)" 上，編譯器有了一些奇怪的行為(未定義asm標誌)。/bin/ld好像也被破壞(當鏈接mysqld時，發生_exit undefined問題)。在這個系統上，從OSF 4.0C的版本替換了/bin/ld後，我們設法用下列configure命令行編譯MySQL，：

shell> CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql

用Digital編譯器“C++ V6.1-029”，下列命令應該工作：

CC=cc -pthread
CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host
CXX=cxx -pthread
CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host
export CC CFLAGS CXX CXXFLAGS
./configure --prefix=/usr/mysql/mysql --with-low-memory --enable-large-files \
--with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc"

在OSF1的某些版本中，alloca()函數被破壞，通過刪除定義'HAVE_ALLOCA'的“config.h”的行更正它。

alloca()函數也可能在/usr/include/alloca.h裡面有一個不正確的原型，源於此的警告可以忽略。

configure將自動地使用下列執行緒庫： --with-named-thread-libs="-lpthread -lmach -lexc -lc"。

當使用gcc時，你也可以試試這樣運行configure：

shell> CFLAGS=-D_PTHREAD_USE_D4  CXX=gcc  CXXFLAGS=-O3  ./configure ……

如果你的信號有問題(MySQL出人意料地在高負載下死掉)，你可能找到了一個執行緒和信號有關的OS錯誤。在這種情況下，你可以告訴MySQL如下配置以不使用信號：

shell> CFLAGS=-DDONT_USE_THR_ALARM \
       CXXFLAGS=-DDONT_USE_THR_ALARM \
       ./configure ...

這不影響MySQL性能，但是有負面效應，就是你不能用mysqladmin kill或mysqladmin shutdown殺死在一個連接上“睡眠”的客戶。相反，當客戶發出下一個命令時，它將死掉。

4.11.8 SGI-Irix 注意事項

你可能需要在運行configure後且在編譯前去掉在“config.h”裡面一些東西的定義(underfine)。

在一些Irix實現中，alloca()函數被破壞。如果mysqld伺服器死於一些SELECT語句，把“config.h”定義HAVE_ALLOC和HAVE_ALLOCA_H的行刪除即可。如果mysqladmin create不工作，把“config.h”定義HAVE_READDIR_R的行刪除，你也可能必須刪除HAVE_TERM_H行。

SGI推薦你將本頁上的所有修補作為一個整體來安裝：http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html

最小地，你應該安裝最新的核心卷(rollup)、最新的rld卷和最新的libc卷。

很明確，對於pthreads支援，你需要本頁上所有的POSIX修補：

http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html

如果在編譯“mysql.cc”時，你得到類似於下面的錯誤:

"/usr/include/curses.h", line 82: error(1084): invalid combination of type

那麼，在你的MySQL原始程式樹的頂級目錄打下列命令：

shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
shell> make

應該也有安排上的問題報告。如果只有一個執行緒正在運行，事情會變慢的。通過啟動另外一個客戶來避免它，這可以導致此後其他執行緒的執行速度增加2到10倍。這是Irix執行緒難以理解的問題﹔你可能必須臨時準備找出解決方案直到它能被修正。

如果你正在用gcc編譯，你可以使用下列configure命令：

shell> CC=gcc CXX=gcc CXXFLAGS=-O3 \
       ./configure --prefix=/usr/local/mysql --with-thread-safe-client --with-named-thread-libs=-lpthread

4.11.9 FreeBSD 注意事項

對於運行MySQL，FreeBSD 3.x是被推薦的，因為其執行緒包是更加完整。

最容易因此是比較受喜歡的安裝方法是使用mysql服務者和 mysql客戶的移植，可從http://www.freebsd.org得到。

使用這些給你的東西：

  • 一個全最佳化的工作在你的FreeBSD版本上的MySQL。
  • 自動配置和構造。
  • 啟動腳本安裝在/usr/local/etc/rc.d。
  • 用pkg_info -L察看哪個文件被安裝的能力，並且如果你在那台機器上不再想要MySQL，用pkg_delete完全刪除它們。

建議在FreeBSD 2.x版上使用 MIT-pthreads，在版本3和以上版本用原生執行緒。在一些2.2.x的以後版本使用原生執行緒運行是可能的，但是你可能碰到mysqld關掉的問題。

確定讓你的名字解析程式安裝正確，否則當連接mysqld時，你可能會經歷解析延時或失敗。

保証在“/etc/hosts”文件中的localhost入口是正確的(否則你與資料庫連接時將有問題)。“/etc/hosts”文件應該以一行開始：

127.0.0.1  localhost  localhost.your.domain

如果你注意到configure使用 MIT-pthreads，你應該閱讀MIT-pthreads注意事項，見4.9 MIT-pthreads 注意事項。

如果你從make install得到一個它不能找到“/usr/include/pthreads”的錯誤，configure沒有檢測出你需要 MIT-pthreads。通過執行這些命令修正它：

shell> rm config.cache
shell> ./configure --with-mit-threads

FreeBSD make的行為與make GNU略有不同。如果你有make相關問題，你應該安裝GNU make。

FreeBSD也已知有一個非常低的預設文件句柄限制。見18.11 文件沒找到。去掉在safe_mysqld中的ulimit -n 小節的注釋或在/etc/login.conf為mysqld用戶提高限制(並用cap_mkdb /etc/login.conf重建它)，如果你不使用預設，也要保証你為此用戶在密碼文件(用法：chpass mysqld-user-name ）。

你用SELECT NOW()返回GMT形式的值而不是你的本地時間，如果有這樣的問題，你必須設定TZ環境變數為你的當前時區的。這應該設置伺服器運行的環境，例如在safe_mysqld或mysql.server裡。

為了得到一個安全並且穩定的系統，你應該只僅使用被標記為-STABLE的FreeBSD內核。

4.11.10 NetBSD 注意事項

為了NetBSD上編譯，你需要GNU make，否則當make試圖在C++文件上運行lint時，編譯將崩潰。

4.11.11 OpenBSD 2.5 注意事項

在OpenBSD 2.5上，你可以用下列選項編譯帶原生執行緒的MySQL：

CFLAGS=-pthread  CXXFLAGS=-pthread  ./configure -- with-mit-threads=no

4.11.12 BSD/OS 注意事項

4.11.12.1 BSD/OS 2.x 注意事項

如果在編譯MySQL時，你得到下列錯誤, 你對虛存的ulimit值是太低了：

item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)':
item_func.h:28: virtual memory exhausted
make[2]: *** [item_func.o] Error 1

試試使用ulimit -v 80000並再運行make。如果這還不行並且你正在使用bash，試試換到csh或sh﹔一些BSDI用戶報告了與bash和ulimit有關問題。

如果你正在使用gcc，你也可能必須為configure使用--with-low-memory標誌才能編譯“sql_yacc.cc”。

你用SELECT NOW()返回GMT形式的值而不是你的本地時間，如果有這樣的問題，你必須設定TZ環境變數為你的當前時區的。這應該為伺服器運行的環境設置，例如在safe_mysqld或mysql.server裡。

4.11.12.2 BSD/OS 3.x 注意事項

升級到BSD/OS 3.1。如果那不可能，安裝BSDI patch M300-038。

在配置MySQL時，使用下列命令:

shell> env CXX=shlicc++ CC=shlicc2 \
       ./configure \
           --prefix=/usr/local/mysql \
           --localstatedir=/var/mysql \
           --without-perl \
           --with-unix-socket-path=/var/mysql/mysql.sock

下列也已知可用：

shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
       ./configure \
           --prefix=/usr/local/mysql \
           --with-unix-socket-path=/var/mysql/mysql.sock

如果你願意，你可以改變目錄地點，或不指定任何地點而使用預設。

如果你在重負再下的性能有問題，試試使用對safe_mysqld使用--skip-thread-priority選項！這將以相同優先級運行所有執行緒﹔在BSDI 3.1上，這得到較好的性能(至少直到BSDI修正其執行緒調度程式)。

如果你在編譯時得到virtual memory exhausted錯誤，試試使用ulimit -v 80000並再運行make。如果這還不行並且你正在使用bash，試試換到csh或sh﹔一些BSDI用戶報告了與bash和ulimit有關問題。

4.11.12.3 BSD/OS 4.x 注意事項

BSDI 4.x有一些執行緒有關的錯誤。如果你想要在這上面使用MySQL，你應該安裝所有與執行緒相關的修補，至少應該安裝M400-023。

4.11.13 SCO 注意事項

當前的移植僅在“sco3.2v5.0.4”和“sco3.2v5.0.5”系統上被測試，在“sco 3.2v4.2”一個移植也有很大進展。

此時在OpenServer上推薦的編譯器是gcc 2.95.2，用它你應該能編譯MySQL：

CC=gcc CXX=gcc ./configure ... (options)
  1. 對於OpenServer 5.0.X，你需要在Skunkware 95上使用GDS(95q4c)，這是必要的，因為在Skunkware 97上的GNU gcc 2.7.2 沒有GNU as。你也可以使用egcs1.1.2或更新：http://www.egcs.com/。如果你正在使用egcs1.1.2，你必須執行下列命令：
    shell> cp -p /usr/include/pthread/stdtypes.h \
/usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pthread/
  2. 對該產品和開發系統，你需要GCC 2.5.?的移植。他們在這個SCO UNIX版本上是必需的，你不能只使用GCC Dev系統。
  3. 你應該得到 FSU Pthreads 包並且首先安裝它，它可在http://www.cs.wustl.edu/~ schmidt/ACE_wrappers/FSU-threads.tar.gz找到。你也可以從ftp://www.mysql.com/pub/mysql/Downloads/SCO/FSU-threads-3.5c.tar.gz得到一個預編譯的包。
  4. FSU Pthreads能用帶tcpip的SCO UNIX 4.2編譯，或OpenServer 3.0或Open Desktop 3.0(OS 3.0 ODT 3.0)，安裝帶有使用一個GCC 2.5.X ODT的SCO開發系統，或對OS 3.0你將需要一個GCC 2.5.？的良好移植。 沒有一個良好的移植會有很多問題。對這個產品的移植需要SCO UNIX開發系統，沒有它，你正缺少所需的庫和鏈接器。
  5. 為了在你的系統上構造FSU Pthreads，做下列工作：
    1. 在“thread/src”目錄下運行./configure並且選擇SCO OpenServer選項。這個命令拷貝“Makefile.SCO5”到“Makefile”。
    2. 運行make。
    3. 為了在預設的“/usr/include”目錄安裝，作為root登錄，然後cd 到“thread/src”目錄，並運行make install。
  6. 記得在制作MySQL時要使用GNU make。
  7. 在OSR 5.0.5上，你應該使用下列配置命令行：
    shell> CC="gcc -DSCO" CXX="gcc -DSCO" ./configure

    需要-DSCO幫助配置正確檢測一些執行緒函數。如果你忘記-DSCO，在編譯時，你將得到下列錯誤消息：
    my_pthread.c: In function `my_pthread_mutex_init':
my_pthread.c:374: `pthread_mutexattr_default' undeclared (first use this function)
  8. 如果你不是作為root啟動safe_mysqld，你將可能每進程只有預設的110個打開文件。mysqld將在日誌文件寫下關於此的注解。
  9. 用SCO 3.2 V5.0.5，你應該使用一個FSU Pthreads版本3.5c或更新。下列configure命令應該工作：
    shell> CC="gcc -belf" ./configure --prefix=/usr/local/mysql --disable-shared
  10. 用SCO 3.2V4.2，你應該使用一個FSU Pthreads版本3.5c或更新。下列configure命令應該工作：
    shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
       ./configure \
           --with-debug --prefix=/usr/local/mysql \
           --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \
           --with-named-curses-libs="-lcurses"

    你可能得到一些包括文件的某些問題。在這種情況下，你能在ftp://www.mysql.com/pub/mysql/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz找到新的SCO特定的包括文件。你應該在你的MySQL原始程式樹的“include”目錄下打開這個文件。

SCO開發注意事項：

  • MySQL應該自動地檢測FSU Pthreads並且用-lgthreads -lsocket -lgthreads選項鏈接mysqld。
  • SCO開發庫在FSU Pthreads是重入(reentrant)的。SCO宣稱它的庫函數是重入的，因此他們一定在FSU Pthreads中是重入的。在 OpenServer上的 FSU Pthreads 試圖使用SCO方案制作重入的庫。
  • FSU Pthreads(至少在www.mysql.com的版本)鏈接了GNU malloc，如果你甭到內存使用的問題，確定“gmalloc.o”被包含在“libgthreads.a”和“libgthreads.so”中。
  • 在FSU Pthreads中，下列系統調用是pthreads感知的：read()、write()、getmsg()、connect()、accept()、select()和wait()。

如果你想要在SCO上安裝DBI，你必須編輯在DBI-xxx和每個子目錄下的“Makefiles”：

OLD:                                  NEW:
CC = cc                               CC = gcc -belf
CCCDLFLAGS = -KPIC -W1,-Bexport       CCCDLFLAGS = -fpic
CCDLFLAGS = -wl,-Bexport              CCDLFLAGS =

LD = ld                               LD = gcc -belf -G -fpic
LDDLFLAGS = -G -L/usr/local/lib       LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib      LDFLAGS = -L/usr/local/lib

LD = ld                               LD = gcc -belf -G -fpic
OPTIMISE = -Od         		      OPTIMISE = -O1

OLD:
CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include

NEW:
CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include

這時如果他們用icc或cc編譯，Perl動態裝載器(dynaloader)將不裝載DBI模組。

當用cc編譯時，Perl工作得最好。

4.11.14 SCO Unixware 7.0 注意事項

你必須使用一個最新的MySQL版本，至少是3.22.13，因為該版本在Unixware下面解決一些移植性問題。

在UnixWare 7.0.1上，我們可用下列configure的命令編譯MySQL：

shell> CC=cc CXX=CC ./configure --prefix=/usr/local/mysql

4.11.15 IBM-AIX 注意事項

xlC自動檢測從Autoconf丟失，當使用 IBM 編譯器時，需要如下這樣一個configure命令：

shell> CC="xlc_r -ma -O3 -qstrict -DHAVE_INT_8_16_32" \
CXX="xlC_r -ma -O3 -qstrict -DHAVE_INT_8_16_32" \
./configure

如果你正在使用egcs編譯MySQL，你必須使用-fno-exceptions標誌，因為egcs得異常處理不是對執行緒安全的！（這用egcs1.1被測試過)。在 AIX 上使用egcs和gcc，我們推薦下列configure行：

shell> CXX=gcc \
       CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
       ./configure --prefix=/home/monty --with-debug --with-low-memory

如果你用信號問題(MySQL出人意料地在高負載下死掉)，你可能發現了與執行緒和信號有關的一個OS錯誤。在這種情況下，你可以用如下配置告訴MySQL不使用信號：

shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
       CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \
       ./configure --prefix=/home/monty --with-debug --with-low-memory

這不影響MySQL性能，但是有副作用，就是你不能用mysqladmin kill或mysqladmin shutdown殺死在一個連接上“睡眠”的客戶。相反，當客戶發出下一個命令時，它將死掉。

在 AIX 的一些版本上用libbind.a鏈接使得getservbyname核心傾倒(core dump)，這是AIX的一個bug並且應該被報告到IBM了。

4.11.16 HP-UX 注意事項

在 HP-UX 上編譯MySQL時，有一些“小”問題。我們推薦您使用gcc而不是HP-UX自己的編譯器，因為gcc產生更好一些的代碼！

我們推薦在HP-UX上使用gcc 2.95，不使用高度最佳化標誌(類似-O6)，因為這在 HP-UX 上可能不安全。

注意MIT-pthreads不能用 HP-UX 編譯器編譯，因為它不能編譯.S（匯編器)文件。

下列配置行應該工作：

CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX \
-I/opt/dce/include -felide-constructors -fno-exceptions \
-fno-rtti" CXX=gcc ./configure --with-pthread \
--with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared

如果你正在編譯gcc2.95本身，如果你想要用MIT-pthreads編譯MySQL，你不應該用DCE庫(libdce.a或libcma.a)鏈接它。如果你混合DCE和MIT-pthreads包，你將得到一個使得你不能連接的mysqld。當你編譯gcc2.95時，刪除DCE庫！

4.11.17 MacOS X 注意事項

順著MacOS X移植的鏈接可以得到能讓MySQL載MacOS上工作的資訊，見1.8 有用的MySQL相關鏈接。

MySQL3.23.7 應該包括所有必要的MacOSX上配置它的修補。然而在配置MySQL前，你必須首先安裝來自MacOSX 的MySql伺服器的pthread 包。

你可能也想要把一個別名加到你的shell資源文件刈脛便從命令行訪問mysql和mysqladmin。

alias mysql '/usr/local/mysql/bin/mysql'
alias mysqladmin '/usr/local/mysql/libexec/mysqladmin'

4.12 Win32 注意事項

這節描述在Win32上安裝和使用MySQL，這也在MySQL Win32分發所帶的“readme”文件中描述。

4.12.1 在Win32上安裝MySQL

如果你沒有一個註冊的MySQL版本，你應該首先下載共享軟件版本，從：

MySQL 3.21.29

如果你準備從一些其他程式連接MySQL，你也可能需要MyODBC驅動程式。你可在MySQL下載頁找到。

安裝任何一個分發，在某個空目錄解壓縮它並且運行Setup.exe程式。

預設地，MySQL-Win32被配置安裝在“C:\mysql”。如果你想要在其它地方安裝MySQL，在“C:\mysql”安裝它，然後將安裝移到你想要的地方。如果你真的移走MySQL，你必須通過提供選項給mysqld告訴mysqld那裡的所有一切，使用C:\mysql\bin\mysqld --help顯示所有的選項目！例如，如果你移動MySQL分發到“D:\programs\mysql”，你必須用D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql來啟動mysqld。

用登記的MySQL版本,你也可以創建一個“C:\my.cnf”文件來保存用於MySQL伺服器的任何預設選項。拷貝文件“\mysql\my-example.cnf”到“C:\my.cnf”並且編輯它來適用於你的安裝。注意你應該用"/"而不是"\"指定所有的路徑。如果你使用“\”，你需要指定兩次(“\\”)，因為在MySQL 中“\”是轉義字符，見4.15.4 選項文件。

4.12.2 在Win95/Win98上啟動MySQL

MySQL使用 TCP/IP 把一個客戶連接到一個伺服器。（這將允許在你的網路上任何機器連接你的MySQL伺服器)。因此，你必須在啟動MySQL前在你的機器上安裝TCP/IP，你可以在你的Windows CDROM上找到TCP/IP 。

注意：如果你正在使用一個舊的Win95版本(例如OSR2)，很有可能你有一個老的Winsock包！MySQL需要Winsock 2！你可從微軟得到最新的Winsock。Win98有新的Winsock 2庫作為預設，這樣上述不適用於Win98。

你能使用2個不同的MySQL伺服器：

mysqld | 用完整調試和自動儲存器分配檢查編譯
mysqld-opt | 對Pentium 處理器最佳化。

上面兩個應該在任何 > = i386的Intel處理器上工作 。

為了啟動mysqld伺服器，你應該啟動一個MSDOS窗口並鍵入：

C:\mysql\bin\mysqld

這將在一個沒有窗口的背景啟動mysqld。

你可以這樣殺死MySQL伺服器，執行：

C:\mysql\bin\mysqladmin -u root shutdown

注意Win95/Win98不支援命名管道的創建。在Win95/Win98上，你只能使用命名管道連接運行在一個NT伺服器上的遠程MySQL。

4.12.3 在NT上啟動MySQL

Win95/Win98小節也適用於在NT上的MySQL，有下列差別：

為了是MySQL用TCP/IP工作，你必須安裝服務包3(service pack 3)(或更新)！

對於NT，伺服器名字是mysqld-nt。通常你應該在 NT 上安裝MySQL作為一種服務：

C:\mysql\bin\mysqld-nt --install

（你可以在 NT 上使用mysqld或mysqld-opt伺服器，但是那些不能作為一種服務啟動或使用命名管道。）

你可以用下列命令啟動和停止MySQL服務：

NET START mysql
NET STOP mysql

注意在這種情況下，你不能對mysqld-nt使用任何其他選項!

如果你需要用任何選項啟動mysqld-nt，你也可以作為在NT上的一個獨立程式運行mysqld-nt！如果你在NT上沒有選項啟動mysqld-nt，mysqld-nt嘗試啟動自己作為一種有默認選項的服務。如果你停止了mysqld-nt，你必須用NET START mysql啟動它。

服務用MySql名字被安裝，一旦安裝，它必須使用服務控制管理器(SCM)實用程式啟動服務(在控制面板中找到)或使用NET START MySQL命令。如果需要任何選項，在你啟動MySQL服務前必須作為SCM實用程式的“啟動參數”指定它們。一旦運行，可使用mysqladmin或從SCM實用程式或使用命令NET STOP MySQL停止mysqld-nt。如果你使用SCM停止mysqld-nt，SCM有一條關於mysqld shutdown normally奇怪的消息，當作為一種服務運行時，mysqld-nt沒有控制台的存取權限，所以沒有消息可以看見。

在NT上你可以得到下列服務錯誤消息：

Permission Denied （權限拒絕） | 意味著它不能找到mysqld-nt.exe
Cannot Register （不能登記） | 意味著路徑是不正確的

如果你作為一種服務安裝mysqld-nt有問題，嘗試用完整的路徑啟動它：

C:\mysql\bin\mysqld --install

如果這還不工作，你能通過在註冊表修正路徑使得mysqld-nt正確啟動！

如果你不想作為一種服務啟動mysqld-nt，你可以如下啟動它：

C:\mysql\bin\mysqld-nt --standalone

或

C:\mysql\bin\mysqld-nt --standalone --debug

最新的版本在“C:\mysqld.trace”給你一個調試蹤跡。

4.12.4 在 Win32 上運行 MySQL

MySQL在所有Win32平台上支援TCP/IP和NT上命名管道。如果客戶安裝了TCP/IP，預設是對NT上的本地連接使用命名管道而對所有其他情形使用TCP/IP，主機名指定使用哪個協議：

主機名 | 協議
空 (沒有） | 在NT上，首先嘗試命名管道﹔如果它不工作，使用TCP/IP。在Win95/Win98上，使用TCP/IP。
. | 命名管道
localhost | TCP/IP到當前主機
主機名 | TCP/IP

通過指定命名管道--pipe選項，你可以強制一個MySQL客戶使用命名管道。使用--socket選項指定管道的名字。

通過執行下列命令，你能測試MySQL是否正在工作：

C:\mysql\bin\mysqlshow
C:\mysql\bin\mysqlshow -u root mysql
C:\mysql\bin\mysqladmin version status proc
C:\mysql\bin\mysql test

如果在Win95/Win98上mysqld很慢地回答連接，可能你的DNS有問題。在這種情況中下，用--skip-name-resolve啟動mysqld並且在MySQL授權表中僅使用localhost和IP數字。在你連接運行在NT上一個mysqld-nt的MySQL伺服器時，使用--pipe指定命名管道使用的參數，你也能避開DNS，對大多數MySQL客戶是可行的。

有2個版本的MySQL命令行工具：

mysql | 用原生Win32編譯，它提供很有有限的文本編輯能力。
mysqlc | 用Cygnus GNU 編譯器和庫編譯，它提供readline編輯。

如果你想使用mysqlc.exe，你必須拷貝“C:\mysql\lib\cygwinb19.dll”到“\windows\system”（或類似的地方)。

在Win32上預設的權限給所有本地用戶以所有資料庫的完全權限。為了使MySQL更安全，你應該為每個用戶設置密碼並刪除mysql.user中有Host='localhost'和User=''的行。

你也應該為root用戶增加一個密碼：（下列例子通過刪除匿名用戶，允許任何人存取“測試”資料庫）

C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
C:\mysql\bin\mysqladmin reload
C:\mysql\bin\mysqladmin -u root password your_password

在你設置了密碼以後，如果你想要關掉mysqld伺服器, 你能使用這個命令做到：

mysqladmin -- user=root -- password=your_password  shutdown

如果你正在使用在windows下的MySQL共享軟件版本，上面的命令將以 parse error near 'SET OPTION password'的錯誤而失敗，這是因為，這是共享軟件版本，它基於MySQL 3.21，沒有SET PASSWORD命令。

對共享軟件版本，你能如下設置root用戶密碼：

C:\mysql\bin\mysql mysql
mysql> UPDATE user SET password=PASSWORD('your password') WHERE user='root';
mysql> QUIT
C:\mysql\bin\mysqladmin reload

有註冊的MySQL版本，你能很容易地用GRANT和REVOKE命令增加新用戶和更改權限，見7.26 GRANT和REVOKE句法。對Windows 的共享軟件版本，必須使用INSERT、UPDATE和DELETE在mysql資料庫中的一個表來管理用戶和他們的權限，見6.13 存取拒絕（Access denied）的錯誤原因。

4.12.5 用SSH從Win32連接一個遠程MySQL

這是一個關於怎樣用SSH 得到一個安全的連接遠程MySQL伺服器的注意事項(David Carlson)。

  • 在你的windows機器上安裝SSH客戶 - 我使用了一個來自http://www.doc.ic.ac.uk/~ci2/ssh/的免費SSH客戶。其他有用的鏈接：http://www.npaci.edu/Security/npaci_security_software.html和http://www.npaci.edu/Security/samples/ssh32_windows/index.html.
  • 啟動SSH。設置主機名字 = 你的MySql伺服器名或IP地址，設置userid=你的用戶名登錄到你的伺服器。
  • 點擊“local forwords”。設定local port: 3306, host: localhost, remote port: 3306
  • 保存一切，否則下次你將必須再做一遍。
  • 用SSH登錄到你的伺服器。
  • 啟動一些ODBC應用程式(例如Access）。
  • 創造一個新文件並且用ODBC驅動程式鏈接到mySQL，就像你通常做的一樣，除了對伺服器用用戶“localhost”。

搞定。它對一個直接的網際網路連接工作得很好。我有些問題，SSH與我的Win95網路和Wingate有衝突 - 但是那將是張貼在其他軟件公司的用戶組的話題！

4.12.6 MySQL-Win32與Unix MySQL比較

MySQL- Win32現在已經証明了自己很穩定。這個版本得MySQL有與對應的Unix版本同樣的特徵，除了下面：

Win95和執行緒
Win95 為每個執行緒的創建損失大約200個字節的內存。因此，如果你進行許多連接，你不應該在Win95運行mysqld很長時間，因為MySQL的每個連接都創建一個新執行緒！WinNT和Win98不能容忍這個bug。
阻塞式讀（blocking read）
MySQL為每個連接使用一個阻塞式讀取，這意味著：
  • 一個連接將不在8個小時後自動被斷開，就像MySQL的Unix版本所發生的。
  • 如果一個連接“掛起”，不殺死MySQL就不可能打破它。
  • mysqladmin kill在一個睡眠的連接上將不工作。
  • 只要有睡眠的連接，mysqladmin shutdown不能中途中斷。

我們計劃在不久的將來修正它。

UDF函數
暫時MySQL-Win32不支援用戶可定義函數。
DROP DATABASE
你不能拋棄一個正在被某些執行緒使用的資料庫。
從任務管理器殺死MySQL
在Windows95上，你不能從任務管理器或用shutdown實用程式殺死MySQL。你必須用mysqladmin shutdown關閉它。
大小寫區分的名字
文件名在Win32上是忽略大小寫的，因此Win32上的MySQL資料庫和表的名字也是忽略大小寫的。唯一的限制是資料庫和表的名字必須在整個一個給定的語句中大小寫是一樣的，因為它用my_table和MY_TABLE都指向同一個表子，下列查詢將不工作：
SELECT * FROM my_table WHERE MY_TABLE.col=1;
“ \ ”目錄字符
在Win95上的路徑名組成由“\”字符分隔，它在MySQL中也是轉義字符。如果你正在使用LOAD DATA INFILE或SELECT ... INTO OUTFILE，你必須用兩個“\”字符或使用Unix風格的文件名“/”字符：
LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
SELECT * FROM skr INTO OUTFILE 'C:/tmp/skr.txt';
Can't open named pipe錯誤
如果你使用NT上的MySQL-Win32共享軟件版本，用最新的mysql客戶，你將得到下列錯誤：
error 2017: can't open named pipe to host: . pipe...

這是因為NT上MySQL正式版本預設地使用命名管道。你能通過為新MySQL客戶使用--host=localhost選項或創建一個包含下列資訊的文件“C:\my.cnf”來避免這個錯誤：

[client]
host = localhost
Access denied for user錯誤
在訪問在同一機器上的一個MySQL伺服器時，如果你得到Access denied for user: 'some-user@unknown' to database 'mysql'的錯誤，這意味著MySQL不能正確解釋你的主機名。為了修正它，你應該創建一個文件“\windows\hosts”，有下列資訊：
127.0.0.1  localhost

對於可能想要幫助我們做好Win32版本的任何人，這裡有的一些開放的問題：

  • 制作一個單用戶MYSQL.DLL伺服器。這應該包括一個標準MySQL伺服器的一切，除了執行緒創建外。這將使MySQL在不需要一個真正的客戶機/伺服器和不需要從其他主機存取伺服器的應用程式時更容易使用。
  • 為MySQL安裝增加一些漂亮的“start”和“shutdown”圖標。
  • 為MySQL啟動選項創建造一個工具管理註冊表條目。註冊表條目的度缺已經被編碼進mysqld.cc，但是它應該重新編碼而更加面向“參數”，該工具應該也能更新“ \my.cnf”文件，如果用戶比較喜歡使用它而不是註冊表。
  • 當用--install登記mysqld作為一種服務（在 NT 上 )時，如果你也可以在命令行上增加預設選項，它將更好，目前解決辦法是更新“C:\my.cnf”文件。
  • 當你掛起一個運行Win95的筆記電腦時，當筆記電腦被恢復時，mysqld背景執行程式不接受新連接。我們不知道這是否 Win95、TCP/IP或MySQL的問題。
  • 能從任務管理器殺死mysqld將絕對是好事，目前，你必須使用mysqladmin shutdown。
  • 移植用在 mysql命令行工具的readline到Win32。
  • 標準的GUI版本MySQL客戶(mysql、mysqlshow、mysqladmin和mysqldump) 將更好。
  • 如果在“net.c”中的套接字“讀”和“寫”函數是可中斷的，那將更好。這將有可能在Win32上用mysqladmin kill殺死打開的執行緒。
  • 制作有關哪些Windows程式能工作在MySQL-Win32/MyODBC和必須做什麼在能讓他們工作的文檔。
  • mysqld總是在“C”處啟動而不在預設地點，我們想讓mysqld使用當前地點用於排序順序。
  • 移植sqlclient到Win32(幾乎完成)並加入更多的特徵！
  • 把更多的選項加到Mysql Manager。
  • 在伺服器和客戶之間改變通訊協議，使用Windows內部通訊而不是套接字和TCP/IP。
  • 用.DLL實現UDF函數。
  • 增加宏以使用由Win32提供的更快的對執行緒安全的增加/減少方法。

其他Win32特定問題在MySQL-Win32分發的“README”文件中描述。

4.13 OS/2 注意事項

MySQL使用太多的打開文件。因此，你應該增加類似下面的東西到你的“CONFIG.SYS”文件：

SET EMXOPT=-c -n -h1024

如果你不這樣做，你將可能碰到下列錯誤：

File 'xxxx' not found (Errcode: 24)

當OS/2 Warp 3上使用MySQL時，要求FixPack 29或以上。用OS/2 Wrap 4，要求FixPack 4或以上。這是Pthreads庫的一個要求。MySQL必須安裝在支援長文件名的一個分區上，如HPFS、FAT32等等。

“INSTALL.CMD”腳本必須從OS/2'自己的“CMD.EXE”運行並且不能工作在替代品如“4OS2.EXE”。

“scripts/mysql-install-db”腳本已經被重新命名了：它現在調用“install.cmd”並且是一個 REXX 手跡，將安裝預設的MySQL安全配置並為MySQL創建WorkPlace Shell 圖標。

動態模組支援通過編譯但沒有充分測試，動態模組應該使用Pthreads運行時刻庫編譯。

gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
    -o example udf_example.cc -L../lib -lmysqlclient udf_example.def
mv example.dll example.udf

注意：由於OS/2的限制，UDF模組名字的詞干不能超過8個字符。模組被儲存在“/mysql2/udf”目錄﹔safe-mysqld.cmd腳本將把這個目錄放在BEGINLIBPATH環境變數中。當使用UDF模組時，指定的擴展名被忽略--它被假定為“.udf”。例如，在 Unix上，共享模組可能被命名為“example.so”並且你可以像這樣從它裝載函數：

CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";

正是OS/2，模組將被命名為“example.udf”，但是你不指定模組擴展名：
CREATE FUNCTION metaphon RETURNS STRING SONAME "example";

4.14 TcX二進制代碼

作為一種服務，TcX提供一套MySQL的可執行檔版本，它在TcX或在客戶友好地給與我們訪問他們機器的權限的站點上被編譯。

這些分發用scripts/make_binary_distribution產生並且用下列編譯器和選項配置：

SunOS 4.1.4 2 sun4c with gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --disable-shared
SunOS 5.5.1 sun4u with egcs 1.0.3a
CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory
SunOS 5.6 sun4u with egcs 2.90.27
CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory
SunOS 5.6 i86pc with gcc 2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory
Linux 2.0.33 i386 with pgcc 2.90.29 (egcs 1.0.3a)
CFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static
SCO 3.2v5.0.4 i386 with gcc 2.7-95q4
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
AIX 2 4 with gcc 2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
OSF1 V4.0 564 alpha with gcc 2.8.1
CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory
Irix 6.3 IP32 with gcc 2.8.0
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
BSDI BSD/OS 3.1 i386 with gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql
BSDI BSD/OS 2.1 i386 with gcc 2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql

任何有比上述配置更優的選項的人總是能把他們寄給開發者郵件列表中。

MySQL3.22以前的RPM分發是用戶貢獻的，自3.22開始，一些RPM是TcX 產生的。

4.15 安裝後期的設置和測試

一旦你已經安裝了MySQL（從一個二進制代碼或原始碼版本)，你需要初始化授權表，啟動伺服器並且保証伺服器正確運行。你也可以希望安排伺服器在你的系統開機和關機時自動地被啟動和停止。

通常，對從原始碼版本的安裝，你像這樣安裝授權表並啟動伺服器：

shell> ./scripts/mysql_install_db
shell> cd mysql_installation_directory
shell> ./bin/safe_mysqld &

對可執行檔版本，這樣做：

shell> cd mysql_installation_directory
shell> ./bin/mysql_install_db
shell> ./bin/safe_mysqld &

測試在MySQL發行的頂級目錄是最容易進行的。對可執行檔版本，這是你的安裝目錄(典型地類似“/usr/local/mysql”)。對原始碼版本，這是你的MySQL原始程式樹的主目錄。

在本小節和以後的小節中，下列命令中，BINDIR是到程式如mysqladmin和safe_mysqld被安裝地點的路徑。對可執行檔版本，是在分發內的“bin”目錄。對原始碼版本，BINDIR可能是“/usr/local/bin”，除非在你運行configure時指定了一個“ /usr/local”以外的安裝目錄。EXECDIR是mysqld伺服器安裝的地點，對可執行檔版本，這與BINDIR一樣。對原始碼版本，EXECDIR可能是“/usr/local/libexec”。

測試詳細在下面描述：

  1. 如果必要，啟動mysqld伺服器並且建立初始MySQL授權表，包含決定用戶如何被允許連接伺服器的權限。這通常用mysql_install_db腳本做：
    shell> scripts/mysql_install_db

    典型地，mysql_install_db僅在你第一次安裝MySQL時需要運行，因此，如果你正在升級現有的安裝，你可以跳過這一步。（然而，mysql_install_db的使用相當安全，並且將不更新已經存在的任何表，因此如果你是不能肯定做什麼，你總是可以運行mysql_install_db。) mysql_install_db在mysql資料庫裡創建6個表(user、db、host、tables_priv、columns_priv和func)，初始權限的描述在6.10 設置初始MySQL權限給出。簡單地說，這些權限允許MySQL root用戶做任何事情，並且允許任何人創建立或使用一個名字以'test'或'test_'開始的資料庫。如果你不設置權限表，當你啟動伺服器時，下列錯誤將在日誌文件出現：

    mysqld: Can't find file: 'host.frm'

    如果你不是通過明顯地執行./bin/safe_mysqld來啟動MySQL，上述錯誤可能也發生在MySQL可執行檔版本！你可能需要作為root運行mysql_install_db，然而，如果你喜歡， 如果用戶能在資料庫目錄讀並且寫文件，你可以作為一個非特權(非--root)用戶運行MySQL伺服器。作為一個非特權用戶運行MySQL的指令在18.8 怎樣作為一個一般用戶運行 MySQL中給出。如果你有mysql_install_db的問題，見4.15.1 運行mysql_install_db的問題。因為mysql_install_db在MySQL發行中，還有一些其他方法運行它：

    • 你可能想在運行mysql_install_db前編輯它，改變被安裝到授權表中的初始權限。如果你想要在有相同權限的很多機器安裝MySQL，這很有用。在這種情況下，你可能應該只需要增加幾個額外的INSERT語句到mysql.user和mysql.db表中！
    • 如果你想要在安裝授權表後改變什麼，你可以運行mysql_install_db，然後使用mysql -u root mysql作為MySQL root用戶連接授權表，發出SQL語句直接修改授權表。
    • 在已經創建了授權表後，有可能全部再次創建。如果你已經安裝了表但是隨後又想要在編輯mysql_install_db以後再創建，你可能想要這樣做。

    關於這些選項的更多資訊，見6.10 建立初始MySQL權限。

  2. 像這樣啟動MySQL伺服器：
    shell> cd mysql_installation_directory
shell> bin/safe_mysqld &

    如果你啟動伺服器的問題，見4.15.2 啟動MySQL伺服器的問題.

  3. 使用mysqladmin証實伺服器正在運行。下列命令提供簡單的測試來檢查伺服器啟動和連接的應答：
    shell> BINDIR/mysqladmin version
shell> BINDIR/mysqladmin variables

    從mysqladmin version的輸出根據你的平台和MySQL版本略有不同，但是應該類似如下顯示：
    shell> BINDIR/mysqladmin version
mysqladmin  Ver 6.3 Distrib 3.22.9-beta, for pc-linux-gnu on i686
TCX Datakonsult AB, by Monty

Server version          3.22.9-beta
Protocol version        10
Connection              Localhost via UNIX socket
TCP port                3306
UNIX socket             /tmp/mysql.sock
Uptime:                 16 sec

Running threads: 1  Questions: 20  Reloads: 2  Open tables: 3

    為了感覺你能用BINDIR/mysqladmin做其他事情，用--help選項調用它。

  4. 証實你能關掉伺服器：
    shell> BINDIR/mysqladmin -u root shutdown
  5. 証實你能重啟伺服器。使用safe_mysqld或直接調用mysqld進行，例如：
    shell> BINDIR/safe_mysqld --log &

    如果safe_mysqld失敗，從MySQL安裝目錄嘗試運行它(如果你已經不在那裡)。如果還不工作，見4.15.2 啟動MySQL伺服器的問題。

  6. 運行一些簡單的測試証實伺服器正在工作。輸出應該類似於下面所顯示的：
    shell> BINDIR/mysqlshow
+-----------+
| Databases |
+-----------+
| mysql     |
+-----------+

shell> BINDIR/mysqlshow mysql
Database: mysql
+--------------+
|    Tables    |
+--------------+
| columns_priv |
| db           |
| func         |
| host         |
| tables_priv  |
| user         |
+--------------+

shell> BINDIR/mysql -e "select host,db,user from db" mysql
+------+--------+------+
| host | db     | user |
+------+--------+------+
| %    | test   |      |
| %    | test_% |      |
+------+--------+------+

    在“sql-bench”目錄(在MySQL安裝目錄下)下還有效能測試套件，你能用來比較在不同的平台上MySQL表現如何。“ sql-bench/Results”目錄包含對不同的資料庫和平台許多運行結果。為了運行所有的測試，執行這些命令：

    shell> cd sql-bench
shell> run-all-tests

    如果你沒有“sql-bench”目錄，你可能在對可執行檔版本使用一個RPM（原始碼版本的RPM包括效能目錄)。在這種情況下，在你能使用它以前，你必須首先安裝效能套件。從MySQL 3.22開始，有名為“mysql-bench-VERSION-i386.rpm”的效能RPM包，它們包含效能代碼和數據。如果你有原始碼版本，你也可以在“tests”子目錄下運行測試。例如，運行“auto_increment.tst”，這樣做：

    shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst

    期望的結果被顯示在“ ./tests/auto_increment.res”文件中。

4.15.1 運行mysql_install_db的問題

這節列出在你運行mysql_install_db時，你可能遇見的問題：

mysql_install_db不安裝授權表
在顯示下列消息以後，你可以發現mysql_install_db不能安裝授權表並終止：
starting mysqld daemon with databases from XXXXXX
mysql daemon ended

在這種情況下，你應該很小心地檢驗日誌文件！日誌文件應該位於目錄“XXXXXX”，用錯誤消息命名，並且應該指出為什麼mysqld沒啟動。如果你不理解發生的事情，當你使用mysqlbug郵寄一份錯誤報告時，包含日誌文件！見2.3 怎樣報告錯誤或問題。

已經有一個mysqld背景執行程式在運行
在這種情況下，你可能根本不必運行mysql_install_db。當你第一次安裝MySQL時，你必須只運行mysql_install_db一次。
當一個背景執行程式正在運行時，安裝第二個mysqld背景執行程式不工作
這只有在當你已經有已存在的MySQL安裝但是想要把新安裝放在一個不同的地方時才會發生(例如，為了測試或者也許你簡單地想要同時運行2個安裝)。通常當你試著運行第二個伺服器時，發生的問題是它試圖和舊一個使用同樣的套接字和端口。在這種情況下，你將得到錯誤消息：Can't start server: Bind on TCP/IP port: Address already in use或Can't start server : Bind on unix socket...你能用一個不同的套接字和端口啟動新的伺服器，如下：
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &

在這以後，你應該編輯你的伺服器引導腳本手跡用不同的套接字和端口啟動兩個背景執行程式。例如，它能調用safe_mysqld兩次，但是對每次調用使用不同的--socket、--port和--basedir選項。

你沒有“ /tmp ”的寫權限
如果你沒有寫權限在預設地方(在“/tmp”裡)創建一個套接字文件，或沒有在“/tmp”創建臨時文件的許可，在運行mysql_install_db或當啟動或使用mysqld時，你將得到一個錯誤。你可以如下地指定一個不同的套接字和臨時目錄：
shell> TMPDIR=/some_tmp_dir/
shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock
shell> export TMPDIR MYSQL_UNIX_PORT

“some_tmp_dir”應該是你有寫許可的某個目錄的路徑。在這以後，你應該能運行mysql_install_db並且這些命令啟動伺服器：

shell> scripts/mysql_install_db
shell> BINDIR/safe_mysqld &
mysqld立刻崩潰
如果你正在運行RedHat 5.0，有一個比2.0.7-5舊的glibc版本，你應該保証你安裝了glibc所有修補！在MySQL郵件檔案中有很多關於它的資訊。郵件檔案的鏈接可在聯機MySQL文檔頁得到。也可見4.11.5 Linux 注意事項(所有Linux版本）。你也可以手工啟動mysqld，使用--skip-grant選項並且增加使用mysql本身的權限資訊：
shell> BINDIR/safe_mysqld --skip-grant &
shell> BINDIR/mysql -u root mysql

從mysql，手工執行在mysql_install_db裡面的SQL命令。保証你隨後運行mysqladmin reload告訴伺服器再裝入授權表。

4.15.2 啟動MySQL伺服器的問題

通常，你用3個方法之一啟動mysqld伺服器：

  • 通過調用mysql.server。這個腳本主要用於系統啟動和關閉，更全面的描述在4.15.3 自動啟動和停止MySQL。
  • 通過調用safe_mysqld，它試圖為mysqld決定正確的選項並然後用那些選擇運行它。
  • 通過直接調用mysqld。

無論你使用哪個方法啟動伺服器，如果它沒有正確啟動，檢查日誌文件看你是否能發現為什麼。日誌文件位於數據目錄(對可執行檔版本一般是“/usr/local/mysql/data”，對原始碼版本是“/usr/local/var”)。用“host_name.err”和“host_name.log”形式的名字在數據目錄下查找文件，這裡host_name是你伺服器主機的名字，然後檢查這些文件的最後幾行：

shell> tail host_name.err
shell> tail host_name.log

當mysqld背景執行程式啟動時，它把目錄改變到數據目錄。這是它期望寫日誌文件和pid(進程ID)文件的地方，和它期望在那兒找到資料庫。

數據目錄地點是在分發編譯時定死的。然而，如果mysqld期望它在你的系統上其他某個地方找到數據目錄，它將工作不正常。如果你有不正確路徑的問題，你可使用--help選項調用mysqld，找到mysqld允許什麼選項和預設路徑設置是什麼。你能通過指定正確的路徑作為mysqld命令行參數來覆蓋預設值。（這些選擇也能用於safe_mysqld。）

通常你應該只需要告訴mysqld基本目錄，在它下面安裝MySQL。你可以用--basedir選項做到，你也能使用--help檢查改變路徑選項的效果(注意，--help 必須是mysqld命令的最後選項)。例如：

shell> EXECDIR/mysqld --basedir=/usr/local --help

一旦你確定你想要的路徑設置，不用--help選項啟動伺服器。

如果你得到下列錯誤，它意味著mysqld正在試圖使用某些其他程式(或其他mysqld伺服器)已經正在使用TCP/IP端口或套接字：

Can't start server: Bind on TCP/IP port: Address already in use
  或
Can't start server : Bind on unix socket...

使用ps保証你沒有另外一個mysqld伺服器正在運行。如果你不能發現其他運行的伺服器，你可以嘗試執行命令telnet your-host-name tcp-ip-port-number並且按幾次RETURN鍵，如果你沒有得到一個錯誤消息，像telnet: Unable to connect to remote host: Connection refused，某個東西正在使用mysqld正在試圖使用的TCP/IP端口，見4.15.1 運行mysql_install_db的問題和19.3 在同一台機器上運行多個MySQL伺服器。

safe_mysqld腳本被編寫以便能正常地啟動一個從MySQL原始程式或二進制代碼版本安裝的伺服器，就算這些在稍微不同的地點安裝伺服器。safe_mysqld希望這些條件之一是真的：

  • 伺服器和資料庫能在相對safe_mysqld被調用的目錄下找到。safe_mysqld在它的工作目錄下面找“bin”和“data”目錄(對可執行檔版本)或“libexec”和“var”目錄(對原始碼版本)。如果你從你的MySQL安裝目錄(例如，對可執行檔版本為“/usr/local/mysql”)執行safe_mysqld，這個條件應該滿足。
  • 如果伺服器和資料庫不能在相對其工作目錄找到，safe_mysqld試圖通過絕對路徑找到他們。典型的地點是“ /usr/local/libexec”和“/usr/local/var”。實際的地點在構造來自分發的safe_mysqld時確定，如果MySQL安裝在一個標準的地點，他們應該是正確的。

因為safe_mysqld將試圖在相對它自己的工作目錄下找到伺服器和資料庫，你可以在任何地方安裝MySQL的可執行檔版本，只要你從MySQL安裝目錄啟動safe_mysqld即可：

shell> cd mysql_installation_directory
shell> bin/safe_mysqld &

如果safe_mysqld失敗，甚至在從MySQL安裝目錄調用時，你可以修改它以便使用到mysqld路徑並且對你的系統的路徑選項是正確的。注意，如果在將來你升級MySQL，你的safe_mysqld修改版本將被覆蓋，因此你應該做一個你能重新安裝的編輯過的版本的拷貝。

如果mysqld當前正在運行，通過執行這個命令，你能發現它正在使用什麼路徑設置：

shell> mysqladmin variables

或

shell> mysqladmin -h 'your-host-name' variables

如果safe_mysqld啟動伺服器但是你不能與它連接，你應該保証你在“/etc/hosts”裡面有一個條目，看起來像這樣：

127.0.0.1  localhost

這個問題僅發生在沒有一個能工作的執行緒庫的系統上並且對該系統MySQL必須配置為使用MIT-pthreads。

4.15.3 自動啟動和停止MySQL

mysql.server腳本可以被用來啟動或停止伺服器，通過用start或stop參數調用它：

shell> mysql.server start
shell> mysql.server stop

mysql.server可在MySQL安裝目錄下的“share/mysql”目錄裡找到，或在MySQL原始程式樹的“support-files”目錄下找到。

在mysql.server啟動伺服器之前，它把目錄改變到MySQL安裝目錄，然後調用safe_mysqld。如果你有在一個非標準的地點安裝的可執行檔版本，你可能需要編輯mysql.server。修改它，運行safe_mysqld前，cd到正確的目錄。如果你想要作為一些特定的用戶運行伺服器，你可以改變mysql_daemon_user=root行使用其他用戶，你也能修改mysql.server把其他選項傳給safe_mysqld。

mysql.server stop通過向伺服器發出一個信號停止它。你可手工執行mysqladmin shutdown關閉伺服器。

當你開始使用MySQL作為生產應用時，你可能想要增加這些啟動並且停止命令到在你的“/etc/rc * 文件中適當的地方。注意如果你修改mysql.server，那麼如果某個時候你升級MySQL時，你的修改版本將被覆蓋，因此你應該做一個你可重新安裝的編輯過的版本的拷貝。

如果你的系統使用“/etc/rc.local”啟動外部腳本，你應該添加下列到其中：

/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld &'

你也可以在一個全局“/etc/my.cnf”文件中增加mysql.server的選項。一個典型的“/etc/my.cnf”文件可能看起來像這樣：

mysqld]
datadir=/usr/local/mysql/var
socket=/tmp/mysqld.sock
port=3306

[mysql.server]
user=mysql
basedir=/usr/local/mysql

mysql.server腳本使用下列變數：user、datadir、basedir、bindir和pid-file。

見4.15.4 選項文件。

4.15.4 選項文件

MySQL3.22 可以從選項文件中為伺服器和客戶讀取預設啟動選項。

在Unix上，MySQL從下列文件讀取預設選擇：

文件名 | 用途
/etc/my.cnf | 全局選項
DATADIR/my.cnf | 伺服器特定的選項目
~/.my.cnf | 用戶特定的選項

DATADIR是MySQL的數據目錄(典型地對二進制安裝是“/usr/local/mysql/data”或對原始程式安裝是“/usr/local/var”)。注意：這是在配置時間指定的目錄，不是mysqld啟動時用--datadir指定的目錄！(--datadir在伺服器尋找選項文件的地方無效，因為它以前尋找他們，它處理任何命令行參數。）

MySQL在Win32上從下列文件讀取預設選項：

文件名 | 用途
windows-system-directory\my.ini
C:\my.cnf | 全局選項
C:\mysql\data\my.cnf | 伺服器特定的選項

注意，在Win32上你應該用/而不是\指定所有的路徑，如果你使用\，你需要指定兩個，因為在MySQL裡面\是轉義字符。

MySQL試圖以上述所列的順序讀取選項文件。如果存在多個選項文件，在一個後面文件讀取的選項優先於在先前讀取的一個文件中指定的同一個選項，在命令行上指定的選項優先於在任何選項文件指定了的選項。有些選擇能使用環境變數指定，在命令行或在選項文件指定的選項優先於環境變數。

下列程式支援選項文件：mysql、mysqladmin、mysqld、mysqldump、mysqlimport、mysql.server、myisamchk和myisampack。

你能使用選項文件指定一個程式支援的任意長的選項！用--help選項運行程式可得到的可用選項的表。

一個選項文件可以包含下列形式的行：

#comment
注釋行以“#”或“;”開始，空行被忽略。
[group]
group是你想為其設置選項的程式或組的名字。在一個組行後，任何option或set-variable行應用於命名的組，直到選擇文件結束或其他組的給出。
option
這等價於在命令行上的--option。
option=value
這等價於在命令行上的--option=value。
set-variable = variable=value
這等價於在命令行上的--set-variable variable=value。該語法必須被用來設置一個mysqld變數。

client組允許你指定適用於所有MySQL客戶的選項(不是mysqld)。這是理想的組來指定你用來與伺服器連接的密碼。（但是保証只是選項文件本身是可讀的和可寫的。）

注意，對域選項和值，所有頭部和尾部空白自動被刪除。你可以在的值串中使用轉義順序“\b”、“\t”、“\n”、“\r”、“\\”和“\s”(“\s”==空白)。

這是一個典型的全局選項文件：

[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick

這是典型的用戶選項文件：

[client]
# The following password will be sent to all standard MySQL clients
password=my_password

[mysql]
no-auto-rehash

如果你有一個原始碼版本，你將在“support-files”目錄下找到一個名為“my-example.cnf”樣品配置文件。如果你有可執行檔版本，在“DIR/share/mysql”目錄下查找，在此DIR是MySQL安裝目錄的路徑(一般是“/usr/local/mysql”)。你可以拷貝“my-example.cnf”到你的主目錄(重新命名拷貝為“.my.cnf”)來試驗。

為了告訴一個MySQL程式不讀任何選項文件，在命令行上指定--no-defaults作為第一個選項。這必須是第一個選項，否則它將無效！如果你想檢查使用哪個選項，你可以給出--print-defaults選項作為第一個選項。

如果你想要強制使用一個特定配置文件，你可以使用選項--defaults-file=full-path-to-default-file。如果你這樣做，只有指定的文件將被讀取。

開發者注意：選項文件的處理簡單地通過處理所有在任何命令行前參數的匹配選項來實現(即，在適當的組裡的選項)，這對使用多次指定的一個選項的最後實例的程式工作的很好。如果你有這樣一個處理多重指定選項但不讀選項文件的舊程式， 你只需要增加2行給與它那種能力。檢查任何標準的MySQL客戶的原始程式看怎樣做。

4.16 升級/降級MySQL時有什麼特別的事情要做？

只要你有MySQL同一個的基礎版本，你總可以在同樣的體系結構上的不同版本之間的移動MySQL表格(form)和數據文件。當前的基礎版本是3。如果你通過重新編譯MySQL改變字符集（也可以改變排序順序)，你必須在所有的表上運行myisamchk -r -q，否則你的索引不能正確被排序。

如果你偏執於或擔心新版本，你總能重新命名的舊mysqld為類似於mysqld-'old-version-number'。那麼如果你的新mysqld做一些意外的事情，你可以簡單地關掉它並重啟你的舊mysqld！

當你做一個升級時，當然你也應該備份你的舊資料庫。有時有點偏執狂是好的！

在升級後，如果你重新編譯客戶程遇到問題，像Commands out of sync或意外的核心傾倒，在編譯你的程式時，你可能使用了一個舊的頭文件或庫文件。在這種情況下，你應該檢查你的“mysql.h”文件和“libmysqlclient.a”庫文件的日期以証實他們來自新的MySQL發行。如果不是，請重新編譯你的程式！

如果你有些問題，新的mysqld伺服器不想啟動或你不能沒有密碼連接，檢查你確實沒有來自你的舊安裝的一些舊的“my.cnf”文件！你可以用program-name --print-defaults檢查。如果這輸出任何非程式名字的任何東西，你有一個活躍my.cnf文件將可以影響一些事情！

無論何時你安裝一個新版本的MySQL，重新構造並重新安裝Msql-Mysql-modules分發是一個好主意，特別是在升級MySQL後，如果你注意到諸如你的所有DBI腳本傾倒核心症狀。

4.16.1 從一個3.22版本升級到3.23

MySQL 3.23支援新MyISAM類型和舊ISAM類型的表。你不必須變換你的舊式表給3.23使用。預設地，所有的新表將用類型MyISAM創建（除非你使用--default-table-type=isam選項啟動mysqld）。你可以用ALTER TABLE或Perl腳本mysql_convert_table_format將一個ISAM表轉換成一個MyISA表。

3.22和3.21客戶將毫無問題地與一個3.23伺服器一起工作。

當升級到3.23時，下面列出你必須注意的事情：

  • INNER和DELAYED現在是保留字。
  • FLOAT(X)現在是一個真正的浮點類型。
  • 當聲明DECIMAL(length,dec)時，長度參數不再包括一個符號或小數點位置。
  • 一個TIME字符串必須是下列現有格式之一：[[[DAYS] [H]H:]MM:]SS[.fraction]或[[[[[H]H]H]H]MM]SS[.fraction]。
  • 現在，LIKE使用'='同樣的字符比較規則比較字符串。如果你要求舊的行為，你可以用CXXFLAGS=-DLIKE_CMP_TOUPPER標誌編以MySQL。
  • REGEXP現在對正常(不是二進制的)字符串是忽略大小寫的。
  • 在你檢查/修復表時，對MyISAM表(.MYI)，你應該使用myisamchk，而對ISAM(.ISM)表使用isamchk。
  • 如果你想要你的mysqldumps在MySQL3.22和3.23之間兼容，你應該不使用mysqldump的--opt或--full選項。
  • 檢查所有對DATE_FORMAT()的調用，保証在在每個格式字符前有一個“%”。
  • mysql_fetch_fields_direct現在是函數(它以前是一個宏)並且它返回一個指向MYSQL_FIELD的指針而不是一個MYSQL_FIELD。
  • mysql_num_fields()可以不再被用在一個MYSQL*對像上(它現在是一個函數，拿MYSQL_RES*作為一個參數）。相反你現在應該使用mysql_field_count()。
  • 在MySQL3.22，SELECT DISTINCT ...的輸出幾乎總是被排序的。在3.23上，你必須使用GROUP BY或ORDER BY獲得排序的輸出。
  • 如果沒有匹配的行，SUM()現在返回NULL，而不是 0。這是遵照ANSI SQL。
  • 新的限制詞：CASE、THEN、WHEN、ELSE和END。

4.16.2 從一個3.21版本升級到3.22

沒有影響相容性的東西在3.21和3.22之間已改變。唯一的缺陷是用DATE類類型創建的新表將使用新方法儲存日期。你不能從一個mysqld舊版本存取這些新字段。

在安裝MySQL3.22 以後，你應該啟動新的伺服器並且然後運行mysql_fix_privilege_tables腳本。這將增加你使用GRANT命令所需的新權限。如果你忘記了這個，當你試著使用ALTER TABLE, CREATE INDEX或DROP INDEX時，你將得到Access denied。如果你的MySQL根用戶要求一個密碼，你應該把它作為一個參數給mysql_fix_privilege_tables。

mysql_real_connect()的C API介面改變了。如果你有一個舊的客戶程式調用該函數，你必須放一個0作為新db參數(或為了快速連接重新編碼發送的db單元的客戶)。你在mysql_real_connect()前也必須調用mysql_init()！做這個改變允許新的mysql_options()函數在MYSQL處理程式結構中保存選項。

4.16.3 從一個3.20版本升級到3.21

如果你正在運行一個比3.20.28舊的版本並且想要換到3.21.x，你需要做下列事情：

你能用safe_mysqld --old-protocol啟動mysqld3.21伺服器從3.20分發的客戶使用它。在這種情況下，新客戶函數mysql_errno()將不返回任何伺服器錯誤，而僅僅是CR_UNKNOWN_ERROR(但是它為客戶錯誤服務)並且伺服器使用舊的passwd() 檢查而非新的一個。

如果你在而不是對mysqld使用--old-protocol選項，你將需要做下列改變：

  • 所有的客戶代碼必須重新編譯。如果你正在使用ODBC，你必須得到新的MyODBC 2.x驅動程式。
  • 腳本scripts/add_long_password必須運行以便變換在mysql.user表中的Password字段為CHAR(16)。
  • 所有在mysql.user中的密碼必須被重新賦值(為了得到62位而非31位密碼)。
  • 表格式沒變化，因此你不必須變換任何表。

MySQL3.20.28和以上版本可以處理新的user表格式而不影響客戶。如果你有一個比3.20.28早的MySQL版本，如果你變換user表，密碼將不再與之工作。因此為了安全，你首先應該升級到至少3.20.28並且然後升級到3.21.x。

新的客戶代碼可與一個3.20.x 版的mysqld伺服器一起工作，因此如果你遇到3.21.x的問題，你可以使用舊的3.20.x伺服器而無須重新編譯客戶。

如果你對mysqld不使用--old-protocol選項，舊的客戶將發出錯誤消息：

ERROR: Protocol mismatch. Server Version = 10 Client Version = 9

新的Perl DBI/DBD介面也支援舊的mysqlperl介面。如果你使用mysqlperl，你必須做的唯一改變是改變到connect()函數的參數。新參數是：host、database、user、password（user和password參數改變了位置)。見20.5.2 DBI介面。

下列變化可能影響到舊的應用程式的查詢：

  • 現在HAVING必須在任何ORDER BY子句前被指定。
  • LOCATE()參數被交換了。
  • 有一些新的保留字。最著名是DATE、TIME和TIMESTAMP。

4.16.4 升級到其他體系結構

如果你正在使用MySQL3.23，你能在不同的支援同樣浮點格式的體系結構之間拷貝.frm、.MYI和.MYD。(MySQL考慮了任何字節交換的問題)。

MySQL ISAM數據“ *.ISD”和索引文件“ *.ISM”文件是依賴於系統結構並在某些情況下依賴於OS。如果你想要移動你的應用程式到有與你當前系統不同的體系結構或OS的其他機器上，你不應該試圖通過簡單地拷貝文件到另外的機器上來移動一個資料庫，相反使用mysqldump。

預設地，mysqldump將創建一個滿是SQL語句的文件，然後你可以把文件轉移到其他機器上並且把它作為mysql客戶的輸入。

試一試mysqldump --help看可得到什麼選項。如果你正在移動數據到一個更新的MySQL版本，你應該用得到的更新的版本使用mysqldump --opt得到一個快速、緊湊的倒出(dump)。

最容易(盡管不是最快)的在2台機器之間移動一個資料庫的方法是在資料庫所在的機器上運行下列命令：

shell> mysqladmin -h 'other hostname' create db_name
shell> mysqldump --opt db_name \
        | mysql -h 'other hostname' db_name

如果你想要在一個慢的網路上從一台遠程機器上拷貝一個資料庫，你可以使用：

shell> mysqladmin create db_name
shell> mysqldump -h 'other hostname' --opt --compress db_name \
    | mysql db_name

你也可以在一個文件中儲存結果, 然後把文件轉移到目標機器並且在那裡裝載文件到資料庫。例如，你能像這樣在源機器上傾倒一個資料庫到一個文件：

shell> mysqldump --quick db_name | gzip > db_name.contents.gz

（本例創建的文件被壓縮) 轉移包含資料庫內容的文件到目標機器，並且在那裡運行這些命令：

shell> mysqladmin create db_name
shell> gunzip < db_name.contents.gz | mysql db_name

你也可以使用mysqldump和mysqlimport完成資料庫轉移。對大資料庫表，這比簡單地使用mysqldump更快。在下列命令中，DUMPDIR代表你用來儲存來自mysqldump的輸出的目錄的完整的路徑。

首先，為輸出文件和傾倒資料庫創建目錄：

shell> mkdir DUMPDIR
shell> mysqldump --tab=DUMPDIR db_name

然後轉移在DUMPDIR目錄下的文件到目標機器的一些相應目錄並且在那裡裝載文件到MySQL：

shell> mysqladmin create db_name           # create database
shell> cat DUMPDIR/*.sql | mysql db_name   # create tables in database
shell> mysqlimport db_name DUMPDIR/*.txt   # load data into tables

另外，別忘記拷貝mysql資料庫，因為那是授權表(user、db、host)被儲存的地方。你可能必須作為MySQL root用戶在新機器上運行命令，直到你讓mysql資料庫到位。

當你在新機器上導入mysql資料庫後，執行mysqladmin flush-privileges以便伺服器再次裝入授權表資訊。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-5 MySQL 與標準如何兼容？

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

5 MySQL與標準的兼容性？

5.1 MySQL對ANSI SQL92擴充

MySQL包含了一些可能在其他SQL資料庫找不到的擴充。要注意如果你使用他們，你的代碼將不與其他SQL伺服器兼容。在一些情況下，你可以編寫包括MySQL擴展的代碼，但是仍然是可移植的，通過使用/*! ... */形式的注釋。在這種情況下，MySQL將進行詞法分析並且執行在注釋內的代碼，好像它是任何其它MySQL語句，但是其他SQL伺服器將忽略擴展。例如：

SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

如果你在'!'後增加一個版本數字，該語法將僅在MySQL版本是等於或比使用的版本數字新時才執行：

CREATE /*!32302 TEMPORARY */ TABLE (a int);

上面的意思是如果你有3.23.02或更新，那麼MySQL將使用TEMPORARY關鍵詞。

MySQL擴展被列在下面：

  • 字段類型MEDIUMINT、SET、ENUM和不同的BLOB和TEXT類型。
  • 字段屬性AUTO_INCREMENT、BINARY、UNSIGNED和ZEROFILL。
  • 預設地，所有的字符串比較是忽略大小寫的，由當前的字符集決定了(預設為ISO-8859-1 Latin1)排序順序。如果你不喜歡這樣，你應該用BINARY屬性或使用BINARY強制符聲明列，它導致根據MySQL伺服器主機的ASCII順序進行排序。
  • MySQL將每個資料庫映射一個MySQL數據目錄下面的目錄，將資料庫表映射到資料庫目錄下的資料庫文件名。這有2個含意：
    • 在區分大小寫文件名的作業系統(像大多數 Unix 系統一樣)上的MySQL中資料庫名字和表名是區分大小寫的。如果你有困難記得表名，接受一個一致的約定，例如總是用小寫名字創建資料庫和表。
    • 資料庫、表、索引、列或別名可以以數字開始(但是不能僅由數字組成)。
    • 你可以使用標準的系統命令備份、重命名、移動、刪除和拷貝表。例如，重命名一個表，重命名“.MYD”、“.MYI”和“.frm”文件為相應的表。
  • 在SQL語句中，你可以用db_name.tbl_name語法訪問不同資料庫中的表。一些SQL伺服器提供同樣的功能但是稱它們為這User space（用戶空間）。MySQL不支援類似在create table ralph.my_table...IN my_tablespace中的表空間。
  • LIKE在數字列上被允許。
  • 在一SELECT語句裡面使用INTO OUTFILE和STRAIGHT_JOIN。見7.12 SELECT句法.
  • 在一個SELECT語句中SQL_SMALL_RESULT選項。
  • EXPLAIN SELECT得到如何聯結表的描述。
  • 在一個CREATE TABLE語句裡面使用索引、在字段前綴上的索引和使用INDEX或KEY。見7.7 CREATE TABLE 句法。
  • CREATE TABLE使用TEMPORARY或IF NOT EXISTS。
  • 使用COUNT(DISTINCT list)，這裡“list”超過一個元素。
  • 在一個ALTER TABLE語句裡面使用CHANGE col_name、DROP col_name或DROP INDEX。見7.8 ALTER TABLE句法。
  • 在一個ALTER TABLE裡面語句使用IGNORE。
  • 在一個ALTER TABLE語句中使用多重ADD、ALTER、DROP或CHANGE子句。
  • 使用帶關鍵詞IF EXISTS的DROP TABLE。
  • 你能用單個DROP TABLE語句拋棄多個表。
  • DELETE語句的LIMIT子句。
  • INSERT和REPLACE語句的DELAYED子句。
  • INSERT, REPLACE, DELETE和UPDATE語句的LOW_PRIORITY子句。
  • 使用LOAD DATA INFILE。在多數情況下，這句法與Oracle的LOAD DATA INFILE兼容。見7.16 LOAD DATA INFILE 句法。
  • OPTIMIZE TABLE語句。見7.9 OPTIMIZE TABLE句法。
  • SHOW語句。見7.21 SHOW句法(得到表、列等的資訊)。
  • 字符串可以被“"”或“'”包圍，而不只是“'”。
  • 使用“\”轉義字符。
  • SET OPTION語句。見7.25 SET OPTION句法。
  • 你不需要命名所有在GROUP BY部分的被選擇的列。這為一些很特定的情況給出更好的性能，而不是一般的查詢。見7.4.13 用於GROUP BY子句的函數。
  • 為了方便來自於SQL環境其他為用戶，MySQL對許多函數支援別名。例如，所有的字符串功能都支援ANSI SQL句法和 ODBC句法。
  • MySQL理解||和&&意味著邏輯的OR和AND，就像在C程式語言中。在MySQL中，||和OR是同義詞，&&和AND是同義詞。正因為這個好的句法，MySQL對字符串並置的不支援ANSI SQL ||操作符﹔相反使用CONCAT()，因為CONCAT()接受任何數量的參數，很容易把||操作符使用變換到MySQL。
  • CREATE DATABASE或DROP DATABASE。見7.5 CREATE DATABASE句法。
  • %操作符是MOD()一個同義詞，即，N % M等價於MOD(N,M)。%支援C程式員並與PostgreSQL兼容。
  • =, <>, <=,<, >=,>, <<, >>, <=>, AND, OR或LIKE操作符可以放在SELECT語句的FROM左邊用於比較列。例如：
    mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
  • LAST_INSERT_ID()函數。見20.4.29 mysql_insert_id()。
  • 擴展的正則表達式操作符REGEXP和NOT REGEXP。
  • CONCAT()或CHAR()有一個參數或超過2個參數。（在MySQL中，這些函數可取任何數量的參數。）
  • BIT_COUNT(), CASE, ELT(), FROM_DAYS(),
    FORMAT(), IF(), PASSWORD(), ENCRYPT(),
    md5(), ENCODE(), DECODE(), PERIOD_ADD(),
    PERIOD_DIFF(), TO_DAYS(),或WEEKDAY()函數。
  • 使用TRIM()整修子串。ANSI SQL 只支援單個字符的刪除。
  • GROUP BY函數STD(), BIT_OR()和BIT_AND()。
  • 使用REPLACE而不是DELETE+INSERT。見7.15 REPLACE句法。
  • FLUSH flush_option語句。
  • 在一個語句用:=設置變數的可能性：
    SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

5.2 以ANSI模式運行MySQL

如果你用--ansi選項啟動mysqld，MySQL的下列行為改變。

  • ||是字符串並置而不是OR。
  • 可在一個函數名字之間與“(”有任何數量的空格。這也使所有的功能名字成為保留詞。
  • "將是一個標識符引號字符(像MySQL `引號字符一樣)而不是一個字符串引號字符。
  • REAL將是FLOAT一個同義詞，不是DOUBLE一個同義詞。

5.3 MySQL相比ANSI SQL92的差別

我們嘗試使得MySQL遵照ANSI SQL標準和ODBC SQL標準，但是在一些情況下，MySQL做一些不同的事情：

  • --只是一個注釋，如果後面跟一個白空字符。見5.4.7 `--'作為一個注釋的開始。
  • 對於VARCHAR列，當值被儲存時，拖後的空格被刪除。見E MySQL已知的錯誤和設計缺限。
  • 在一些情況下，CHAR列偷偷地被改變為VARCHAR列。見7.7.1 平靜的列指定變化。
  • 當你刪除一個表時，對表的權限不自動地廢除。你必須明確地發出一個REVOKE來廢除對一個表的權限。見7.26 GRANT和REVOKE句法。

5.4 MySQL缺乏的功能

下列功能在當前的MySQL版本是沒有的。對於一張優先級表指出何時新擴展可以加入MySQL, 你應該咨詢在線MySQL TODO 表。這是本手冊最新的TODO表版本。見F 我們想要在未來加入到MySQL的事情列表(TODO)。

5.4.1 子選擇

在MySQL中下列語句還不能工作：

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);

然而，在很多情況下，你可以重寫查詢，而不用子選擇：

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL

對於更複雜的子查詢，通常你可以創建臨時的表保存子查詢。然而在一些情況下，這種選擇將行不通。最經常遇到的情形是DELETE語句，對於它標準SQL不支援聯結(join)(除了在子選擇)。對於這種情況，有2個可用選擇，直到子選擇被MySQL支援。

第一個選擇是使用一種程序化的程式語言(例如Perl或PHP)來提交一個SELECT查詢獲得要被刪除記錄主鍵，並然後使用這些值構造DELETE語句(DELETE FROM ... WHERE ... IN (key1, key2, ...))。

第二個選擇是使用交互式SQL自動構造一套DELETE語句，使用MySQL擴展CONCAT()（代替標準||操作符)。例如：

SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
  FROM tab1, tab2
 WHERE tab1.col1 = tab2.col2;

你可以把這個查詢放在一個腳本文件並且從它重定向輸入到mysql命令行解釋器，將其輸出作為管道返回給解釋器的第2個實例：

prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb

MySQL僅支援INSERT ... SELECT ...和REPLACE ... SELECT ...，獨立的子選擇將可能在3.24.0得到，然而，在其他環境下，你現在可以使用函數IN()。

5.4.2 SELECT INTO TABLE

MySQL還不支援Oracle SQL的擴展：SELECT ... INTO TABLE ....，相反MySQL支援ANSI SQL句法INSERT INTO ... SELECT ...，基本上他們是一樣的。

另外，你可使用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT解決你的問題。

5.4.3 事務處理

不支援事務處理。MySQL將在短時間內支援原子(atomic)操作，它像沒有回卷的事務。用原子操作，你能執行一組INSERT/SELECT/whatever 命令並且保証沒有其他執行緒介入。在本文中，你通常不會需要回卷。目前，你可通過使用LOCK TABLES和UNLOCK TABLES命令阻止其他執行緒的干擾。見7.24 LOCK TABLES/UNLOCK TABLES句法。

5.4.4 儲存程序和觸發器

一個儲存程序是能在伺服器中編譯並儲存的一套SQL命令。一旦這樣做了，顧客不需要一直重新發出全部查詢，而可以參考儲存程序。因為查詢僅需一次詞法分析並且較少的資訊需要在伺服器和客戶之間傳送，因此這提供了更好的性能。你與可以通過擁有在伺服器中的函數庫提升概念上的層次。

一個觸發器是當一個特別的事件發生時，被調用的一個儲存程序。例如，你可以安裝一個儲存程序，它在每次從一個交易表刪除一條記錄時觸發，並且當它所有交易被刪除時，自動地從一個客戶表中刪除相應的客戶。

計劃修改的語言將能處理儲存程序，但是沒有觸發器。觸發器通常使每件事情變慢，即使對他們不需要的查詢。

為了倆解什麼時候MySQL可能得到儲存程序，見F 我們想在未來加入到MySQL的事情列表(TODO)。

5.4.5 外鍵

注意，在SQL語法的外鍵不用於聯結表，而主要用於檢查參考完整性(RI)。如果你想要得到用一個SELECT語句從多個表得到結果， 你通過聯結表做！

SELECT * from table1,table2 where table1.id = table2.id;

見7.13 JOIN句法。見8.3.5 使用外鍵。

在MySQL裡存在FOREIGN KEY句法僅僅為了與其他SQL供應商的CREATE TABLE命令相兼容﹔它不做任何事情。沒有ON DELETE ...的FOREIGN KEY句法主要用於文檔目的。一些ODBC應用程式可以使用它自動產生WHERE子句，但是這通常很容易的覆蓋。 FOREIGN KEY有時用作一個約束檢查，但是如果行以正確的順序被插入表，該檢查實際上是不必要的。MySQL僅僅支援這些子句(不考慮是否他們工作!)，因為一些應用程式要求他們存在。

在MySQL中，你可以解決ON DELETE ...沒被實現的問題，，在你從一個用外鍵的表刪除記錄時，通過為一個應用程式增加適當的DELETE語句即可。實際上，這很快(在一些情況下更快)並且比使用外鍵更比便於移植。

在不久的將來我們將擴充FOREIGN KEY實現，以便至少資訊將在表說明文件中保存並且可以由mysqldump和ODBC檢索。

5.4.5.1 不使用外鍵的理由

有很多與FOREIGN KEY有關的問題我們不知道從哪兒開始：

  • 外鍵使生活更複雜，因為外鍵的定義必須儲存在一個資料庫中並且實現他們將破壞使用能被移動、拷貝和刪除文件的全部“好方法”。
  • 速度影響對INSERT和UPDATE語句是可怕的，並且在這種情況下幾乎所有的FOREIGN KEY檢查都是無用的，因為不管怎樣你通常以正確的順序在正確的表中插入記錄。
  • 當更新一張表時，也有在許多表上保存鎖的需求，因為副作用可以串聯通過全部資料庫。首先從一張表中刪除記錄並且隨後從其他表中刪除他們，這更快。
  • 你再也不可以通過做一個全面的表刪除並隨後恢復所有的記錄的方法來恢復一張表(從新來源或從一個備份)。
  • 如果你有外鍵，你不能傾倒和恢復表，除非你以一個非常特定的做這些。
  • 很容易做一個“允許的”的循環定義使得不可能用一個單個create語句重建每一個表，就算定義可行又可用。

FOREIGN KEY唯一好的方面是它給ODBC和一些其他客戶程式檢查一張表如何被連接的能力，並且使用它們顯示出連接圖表並幫助構造應用。

MySQL不久將儲存FOREIGN KEY定義以便一個客戶能詢問並收到原來的連接如何進行的一個答案。當前的“.frm 文件格式沒有它應有的地位。

5.4.6 視圖

MySQL不支援視圖，但是它在TODO上。

5.4.7 '--'作為一個注釋的開始

有些其他SQL資料庫使用'--'開始注釋。MySQL有“#”作為開始數注釋的字符，即使mysql命令行工具刪除以'--'開始的所有行。你也可以在MySQL中使用C注釋風格/* this is a comment */。見7.29 注釋句法。

MySQL3.23.3和以上版本支援'--'注釋風格，只要注釋跟在一個空格之後。這是因為這種退化的注釋風格已經引起用像下列代碼那樣的自動產生的SQL查詢的許多問題，這裡我們自動地為!payment!插入支付值：

UPDATE tbl_name SET credit=credit-!payment!

你想出當payment的值是負的時將發生什麼嗎？

因為1--1在SQL中是合法的，我們認為'--'開始注釋是可怕的。

然而在MySQL 3.23中，你可使用：1-- This is a comment

如果你正在運行一個比3.23早的MySQL的版本，下列的討論才涉及你：

如果你在一個文本文件中有一個SQL程式，它包含'--'注釋，你應該使用：

shell> replace " --" " #" < text-file-with-funny-comments.sql \
         | mysql database

而不是通常：
shell> mysql database < text-file-with-funny-comments.sql

你也可以“現場☆弤輯命令文件將'--'注釋改為'#'注釋：

shell> replace " --" " #" -- text-file-with-funny-comments.sql

用這個命令改回他們：

shell> replace " #" " --" -- text-file-with-funny-comments.sql

5.5 MySQL 遵循什麼標準？

Entry level SQL92。ODBC level 0-2。

5.6 怎樣處理沒有COMMIT/ROLLBACK

MySQL不支援COMMIT-ROLLBACK。問題是有效地處理COMMIT-ROLLBACK將需要完全不同於MySQL今天使用的表布局。MySQL也將需要額外的執行緒在表上做自動清除工作，而且磁碟用量將更高。這將使MySQL比現今慢上大約2-4倍。MySQL比幾乎所有其他SQL資料庫都快(一般至少快2-3倍)。原因之一就是缺少COMMIT-ROLLBACK。

目前，我們是更多地實現SQL伺服器語言(像儲存程序)，有了它，你將確實很少需要COMMIT-ROLLBACK，這也將得到更好的性能。

通常需要事務的循環可以借助LOCK TABLES進行編碼，並且當你能即時地更新記錄時，你不需要光標(cursor)。

我們在TODO上有事務和光標，然而並非相當優先。如果我們實現這些，將作為CREATE TABLE的選項，那意味著COMMIT-ROLLBACK將僅工作在那些表上，以便速度損失僅僅強加在那些表上。

我們在TcX有一個更大的需求，一個比100%通用資料庫的真正快速的資料庫。無論何時我們發現一個方法來實現這些特徵而沒有任何速度損失，我們將可能做它。暫時，有許多更重要的事情要做。檢查TODO，看我們此時如何將事情優先排列。（有的較高級別支援的客戶可以改變它，因此事情是可以重新優先化的。）

當前的問題實際上是ROLLBACK，沒有ROLLBACK，你能用LOCK TABLES做任何COMMIT動作。為了支援ROLLBACK，MySQL將必須被改變以儲存所有的舊記錄，如果發出ROLLBACK，它們被更新的並且將任何東西恢復到起點。對於簡單的情形，這不是難做的 (當前isamlog可以用於此目的)，但是為ALTER/DROP/CREATE TABLE實現ROLLBACK將是更困難的。

避免使用ROLLBACK，你可以使用下列策略：

  1. 使用LOCK TABLES ...鎖住所有你想要存取的資料庫表。
  2. 測試條件。
  3. 如果一切無誤，更新。
  4. 使用UNLOCK TABLES釋放你的鎖。

這通常比使用可能帶ROLLBACK的交易是一個更快的方法，盡管不總是這樣。這個解決方案不能處理的唯一狀況是當某人在更新當中殺死執行緒時。在這種情況下，所有的鎖將被釋放，但是一些更改不能被執行。

你也可使函數以單個操作更新記錄。你能通過使用下列技術得到一個很有效率的應用程式：

  • 相對他們的當前的值修改字段
  • 僅僅更新那些實際上更改的字段

例如，當我們正在更新一些客戶資訊時，我們僅僅更新那些改變了的客戶數據並只測試沒有任何數據的改變，或數據取決於改變的數據，與原來的行相比變化了。對於改變了的數據的測試用WHERE子句在UPDATE語句中完成。如果記錄沒被更新，我們給客戶一條消息：“你改變了的一些數據已被其他用戶改變了”，然後我們在一個窗口中顯示新行對照舊行，因此用戶能決定他該使用哪個版本的客戶記錄。

這給了我們類似於“列鎖定”的東西，但是實際上甚至更好，因為我們僅僅更新某些列，使用相對於他們的當前值的值。這意味著典型的UPDATE語句看上去像這些一樣東西：

UPDATE tablename SET pay_back=pay_back+'relative change';

UPDATE customer
  SET
    customer_date='current_date',
    address='new address',
    phone='new phone',
    money_he_owes_us=money_he_owes_us+'new_money'
  WHERE
    customer_id=id AND address='old address' AND phone='old phone';

正如你能看到的，這是很有效的並且就算其他客戶已經改變了pay_back或money_he_owes_us列的也能工作。

在許多情況下，為管理一些表格的唯一標識符目的，用戶已經想要ROLLBACK或LOCK TABLES。這可用一個AUTO_INCREMENT列和一個SQL函數LAST_INSERT_ID()或C API函數mysql_insert_id()更高效地處理。見20.4.29 mysql_insert_id()。

在TcX，我們從來沒有任何對行級鎖定的需求，因為我們總是能通過編碼解決它。一些情況下需要確實行鎖定，但是他們是很少見的。如果你想要行級鎖定，你可以在表中使用標誌列並且這樣做：

UPDATE tbl_name SET row_flag=1 WHERE id=ID;

如果行被找到發現並且row_flag在原來的行已經不是1，對受影響的行數MySQL返回1。

你可以想到它，因為MySQL把上面的查詢變為：

UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1;

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-6 MySQL 存取權限系統

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

6 MySQL 存取權限系統

MySQL有一個先進但非標準的安全/權限系統。本節描述它的工作原理。

6.1 權限系統做什麼

MySQL權限系統的主要功能是証實連接到一台給定主機的一個用戶，並且賦予該用戶在一個資料庫上select、 insert、update和delete的權限。

附加的功能包括有一個匿名的用戶和對於MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。

6.2 MySQL 用戶名和密碼

由MySQL使用用戶名和密碼的方法與Unix或Windows使用的方式有很多不同之處：

  • MySQL使用於認証目的的用戶名，與Unix用戶名(登錄名字)或Windows用戶名無關。預設地，大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄，但是這僅僅為了方便。客戶程式允許用-u或--user選項指定一個不同的名字，這意味著無論如何你不能使得一個資料庫更安全，除非所有的MySQL用戶名都有密碼。任何人可以試圖用任何名字連接伺服器，而且如果他們指定了沒有密碼的任何名字，他們將成功。
  • MySQL用戶名最長可以是16各字符﹔典型地，Unix用戶名限制為8個字符。
  • MySQL密碼與Unix密碼沒關系。在你使用登錄到一台Unix機器密碼和你使用在那台機器上存取一個資料庫的密碼之間沒有必要有關聯。
  • MySQL加密密碼使用了一個Unix登錄期間所用的不同算法，見7.4.12 雜項函數一節中描述PASSWORD()和ENCRYPT()函數部分。

6.3 與MySQL伺服器連接

當你想要存取一個MySQL伺服器時，MySQL客戶程式一般要求你指定連接參數：你想要聯接的主機、你的用戶名和你的密碼。例如，mysql客戶可以像這樣啟動(可選的參數被包括在“[”和“]”之間)：

shell> mysql [-h host_name][-u user_name][-pyour_pass ]

-h, -u和-p選項的另一種形式是--host=host_name、--user=user_name和--password=your_pass。注意在-p或--password=與跟隨它後面的密碼之間沒有空格。

注意：在命令行上指定一個密碼是不安全的！隨後在你系統上的任何用戶可以通過打類似這樣的命令發現你的密碼：ps auxww。見4.15.4 選項文件。

對於命令行沒有的聯接參數，mysql使用預設值：

  • 預設主機名是localhost。
  • 預設用戶名是你的Unix登錄名。
  • 如果沒有-p，則沒有提供密碼。

這樣, 對一個Unix用戶joe，下列命令是等價的：

shell>mysql -h localhost -u joe
shell>mysql -h localhost
shell>mysql -u joe
shell>mysql

其它MySQL客戶程式有同樣表現。

在Unix系統上，當你進行一個連接時，你可以指定要使用的不同的預設值，這樣你不必每次在你調用一個客戶程式是在命令行上輸入他們。這可以有很多方法做到：

  • 你能在你的主目錄下“.my.cnf”的配置文件的[client]小節裡指定連接參數。文件的相關小節看上去可能像這樣：
    [client]
host=host_name
user=user_name
password=your_pass

    見4.15.4 選項文件。

  • 你可以用環境變數指定連接參數。主機可用MYSQL_HOST指定，MySQL用戶名字可用USER指定(僅對 Windows)，密碼可用MYSQL_PWD指定（但是這不安全，見下一節) 。

如果連接參數以多種方法被指定，在命令行上被指定的值優先於在配置文件和環境變數中指定的值，而在配置文件指定的值優先於在環境變數指定的值。

6.4 使你的密碼安全

以一種暴露的可被其他用戶發現的方式指定你的密碼是不妥當的。當你運行客戶程式時，你可以使用下列方法指定你的密碼，還有每個方法的風險評估：

  • 使用一個在命令行上-pyour_pass或--password=your_pass的選項。這很方便但是不安全，因為你的密碼對系統狀態程式(例如ps)變得可見，它可以被其他的用戶調用來顯示命令行。(一般MySQL客戶在他們的初始化順序期間用零覆蓋命令行參數，但是仍然有一個短暫間隔時間內參數值可見的。）
  • 使用一個-p或--password選項(沒有指定your_pass值)。在這種情況下，客戶程式請求來自終端的密碼：
    shell>mysql - u  user_name - p
Enter password: ********

    客戶回應“*”字符到作為輸入你的密碼的終端使得旁觀者不能看見它。因為它對其他用戶不可見，與在命令行上指定它相比，這樣進入你的密碼更安全。然而，這個輸入一個密碼的方法僅僅為你交互式運行程式是合適的。如果你想要從非交互式運行的一個腳本調用一個客戶，就沒有從終端輸入入密碼的機會。

  • 在一個配置文件中儲存你的密碼。例如，你可你的主目錄的“.my.cnf”文件中的[client]節列出你的密碼：
    [client]
password=your_pass

    如果你在“.my.cnf”裡面儲存密碼，文件應該不是組或世界可讀或可寫的。保証文件的存取模式是400或600。見4.15.4 選項文件。

  • 你可在MYSQL_PWD環境變數中儲存密碼，但是這個方法必須想到是極不安全的且應該不使用。ps的某些版本包括顯示運行進程的環境的選項﹔如果你設定MYSQL_PWD，你的密碼將對所有人是顯而易見的，甚至在沒有這樣一個版本的ps系統上，假設沒有其他方法觀察到進程環境是不明智的。

總之，最安全的方法是讓客戶程式提示密碼或在一個適當保護的“.my.cnf”文件中指定密碼。

6.5 MySQL提供的權限

權限資訊用user、db、host、tables_priv和columns_priv表被儲存在mysql資料庫中(即在名為mysql的資料庫中)。在MySQL啟動時和在6.9 權限修改何時生效所說的情況時，伺服器讀入這些資料庫表內容。

本手冊所用的涉及由MySQL提供的權限名稱顯示在下表，還有在授權表中每個權限的表列名稱和每個權限有關的上下文：

權限 | 列 | 上下文
select | Select_priv | 表
insert | Insert_priv | 表
update | Update_priv | 表
delete | Delete_priv | 表
index | Index_priv | 表
alter | Alter_priv | 表
create | Create_priv | 資料庫、表或索引
drop | Drop_priv | 資料庫或表
grant | Grant_priv | 資料庫或表
references | References_priv | 資料庫或表
reload | Reload_priv | 伺服器管理
shutdown | Shutdown_priv | 伺服器管理
process | Process_priv | 伺服器管理
file | File_priv | 在伺服器上的文件存取

select、insert、update和delete權限允許你在一個資料庫現有的表上實施操作。

SELECT語句只有在他們真正從一個表中檢索行是才需要select權限，你可以執行某個SELECT語句，甚至沒有任何到伺服器上的資料庫裡的存取任何東西的許可。例如，你可使用mysql客戶作為一個簡單的計算器：

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

index權限允許你創建或拋棄(刪除)索引。

alter權限允許你使用ALTER TABLE。

create和drop權限允許你創建新的資料庫和表，或拋棄(刪除)現存的資料庫和表。

注意：如果你將mysql資料庫的drop權限授予一個用戶，該用戶能拋棄儲存了MySQL存取權限的資料庫！

grant權限允許你把你自己擁有的那些權限授給其他的用戶。

file權限給予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE語句讀和寫伺服器上的文件，任何被授予這個權限的用戶都能讀或寫MySQL伺服器能讀或寫的任何文件。

其餘的權限用於管理性操作，它使用mysqladmin程式實施。下表顯示mysqladmin支配每個管理性權限允許你執行的命令：

優惠 | 權限擁有者允許執行的命令
reload | reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables
shutdown | shutdown
precess | processlist, kill

reload命令告訴伺服器再讀入授權表，refresh命令清洗所有表並打開和關閉記錄文件，flush-privileges是reload的一個同義詞，其它flush-*命令執行類似refresh的功能，但是範圍更有限，並且在某些情況下可能更好用。例如，如果你只是想清洗記錄文件，flush-logs比refresh是更好的選擇。

shutdown命令關掉伺服器。

processlist命令顯示在伺服器內執行的執行緒的資訊。kill命令殺死伺服器執行緒。你總是能顯示或殺死你自己的執行緒，但是你需要process權限來顯示或殺死其他用戶啟動的執行緒。

總的說來，只授予權限給需要他們的那些用戶是一個好主意，但是你應該在授予某個權限時試驗特定的警告：

  • grant權限允許用戶放棄他們的權限給其他用戶。2個有不同的權限並有grant權限的用戶可以合並權限。
  • alter權限可以用於通過重新命名表來推翻權限系統。
  • file權限可以被濫用在伺服器上讀取任何世界可讀(world-readable，即任何人可讀)的文件到一張資料庫表，然後其內容能用SELECT被存取。
  • shutdown權限通過終止伺服器可以被濫用完全拒絕為其他用戶服務, 。
  • precess權限能被用來察看當前執行的查詢的純文字版，包括設定或改變密碼查詢。
  • 在mysql資料庫上的權限能被用來改變密碼和其他存取權限資訊。（密碼被加密儲存，所以一個惡意的用戶不能簡單地讀取他們。然而，有足夠的權限，同一個用戶能用不同的一個代替一個密碼。）

有一些事情你不能用MySQL權限系統做到：

  • 你不能明顯地指定一個給定用戶應該被拒絕存取。即，你不能明顯地匹配一個用戶並且然後拒絕連接。
  • 你不能指定一個用戶有權創建立或拋棄一個資料庫中的表，也不能創建或拋棄資料庫本身。

6.6 權限系統工作原理

MySQL權限系統保証所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL伺服器時， 你的身份由你從那連接的主機和你指定的用戶名來決定，系統根據你的身份和你想做什麼來授予權限。

MySQL在認定身份中考慮你的主機名和用戶名字，是因為有很小的原因假定一個給定的用戶在網際網路上屬於同一個人。例如，用戶從whitehouse.gov連接的bill不必和從mosoft.com連接bill是同一個人。 MySQL通過允許你區分在不同的主機上碰巧有同樣名字用戶來處理它：你可以對從whitehouse.gov連接授與bill一個權限集，而為從microsoft.com的連接授予一個不同的權限集。

MySQL存取控制包含2個階段：

  • 階段1：伺服器檢查你是否允許連接。
  • 階段2：假定你能連接，伺服器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如，如果你從資料庫中一個表選取(select)行或從資料庫拋棄一個表，伺服器確定你對表有select權限或對資料庫有drop權限。

伺服器在存取控制的兩個階段使用在mysql的資料庫中的user、db和host表，在這些授權表中字段如下：

表名稱 | user | db | host
範圍字段 | Host | Host | Host
 | User | Db | Db
 | Password | User |
權限字段 | Select_priv | Select_priv | Select_priv
 | Insert_priv | Insert_priv | Insert_priv
 | Update_priv | Update_priv | Update_priv
 | Delete_priv | Delete_priv | Delete_priv
 | Index_priv | Index_priv | Index_priv
 | Alter_priv | Alter_priv | Alter_priv
 | Create_priv | Create_priv | Create_priv
 | Drop_priv | Drop_priv | Drop_priv
 | Grant_priv | Grant_priv | Grant_priv
 | Reload_priv |  |
 | Shutdown_priv |  |
 | Process_priv |  |
 | File_priv |  |

對存取控制的第二階段(請求証實)，如果請求涉及表，伺服器可以另外參考tables_priv和columns_priv表。這些表的字段如下：

表名稱 | tables_priv | columns_priv
範圍字段 | Host | Host
 | Db | Db
 | User | User
 | Table_name | Table_name
 |  | Column_name
權限字段 | Table_priv | Column_priv
 | Column_priv |
其他字段 | Timestamp | Timestamp
 | Grantor |

每個授權表包含範圍字段和權限字段。

範圍字段決定表中每個條目的範圍，即，條目適用的上下文。例如, 一個user表條目的Host和User值為'thomas.loc.gov'和'bob'將被用於証實來自主機thomas.loc.gov的bob對伺服器的連接。同樣，一個db表條目的Host、User和Db字段的值是'thomas.loc.gov'、'bob'和'reports'將用在bob從主機聯接thomas.loc.gov存取reports資料庫的時候。 tables_priv和columns_priv表包含範圍字段，指出每個條目適用的表或表／列的組合。

對於檢查存取的用途，比較Host值是忽略大小寫的。User、Password、Db和Table_name值是區分大小寫的。Column_name值在MySQL3.22.12或以後版本是忽略大小寫的。

權限字段指出由一個表條目授予的權限，即，可實施什麼操作。伺服器組合各種的授權表的資訊形成一個用戶權限的完整描述。為此使用的規則在6.8 存取控制, 階段2：請求証實描述。

範圍字段是字符串，如下所述﹔每個字段的預設值是空字符串：

字段名 | 類型
Host | CHAR(60)
User | CHAR(16)
Password | CHAR(16)
Db | CHAR(64) | (tables_priv和columns_priv表為CHAR(60)）

在user、db和host表中，所有權限字段被聲明為ENUM('N','Y')--每一個都可有值'N'或'Y'，並且預設值是'N'.

在tables_priv和columns_priv表中，權限字段被聲明為SET字段：

表名 | 字段名 | 可能的集合成員
tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References'
columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References'

簡單地說，伺服器使用這樣的授權表：

  • user表範圍字段決定是否允許或拒絕到來的連接。對於允許的連接，權限字段指出用戶的全局(超級用戶)權限。
  • db和host表一起使用：
    • db表範圍字段決定用戶能從哪個主機存取哪個資料庫。權限字段決定允許哪個操作。
    • 當你想要一個給定的db條目應用於若干主機時，host表作為db表的擴展被使用。例如，如果你想要一個用戶能在你的網路從若干主機使用一個資料庫，在用戶的db表的Host條目設為空值，然後將那些主機的每一個移入host表。這個機制詳細描述在6.8 存取控制, 階段2：請求証實。
  • tables_priv和columns_priv表類似於db表，但是更精致：他們在表和列級應用而非在資料庫級。

注意管理權限(reload, shutdown, 等等)僅在user表中被指定。這是因為管理性操作是伺服器本身的操作並且不是特定資料庫，因此沒有理由在其他授權表中列出這樣的權限。事實上，只需要請教user表來決定你是否執行一個管理操作。

file權限也僅在user表中指定。它不是管理性權限，但你讀或謝在伺服器主機上的文件的的能力獨立於你正在存取的資料庫。

當mysqld伺服器啟動時，讀取一次授權表內容。對授權表的更改生效在6.9 權限更改何時生效描述。

當你修改授權表的內容時，確保你按你想要的方式更改權限設置是一個好主意。為幫助診斷問題，見6.13 “存取拒絕引起”錯誤的原因。對於安全問題上的忠告，見6.14 怎麼對使MySQL安全對抗解密高手。

一個有用的診斷工具是mysqlaccess腳本，由Carlier Yves 提供給MySQL分發。使用--help選項調用mysqlaccess查明它怎樣工作。注意：mysqlaccess僅用user、db和host表僅檢查存取。它不檢查表或列級權限。

6.7 存取控制, 階段1：連接証實

當你試圖聯接一個MySQL伺服器時，伺服器基於你的身份和你是否能通過供應正確的密碼驗証身份來接受或拒絕連接。如果不是，伺服器完全具結你的存取，否則，伺服器接受連接，然後進入階段2並且等待請求。

你的身份基於2個資訊：

  • 你從那個主機連接
  • 你的MySQL用戶名

身份檢查使用3個user表(Host, User和Password)範圍字段執行。伺服器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的密碼時才接受連接。

在user表範圍字段可以如下被指定：

  • 一個Host值可以是主機名或一個IP數字，或'localhost'指出本地主機。
  • 你可以在Host字段裡使用通配符字符“%”和“_”。
  • 一個Host值'%'匹配任何主機名，一個空白Host值等價於'%'。注意這些值匹配能創建一個連接到你的伺服器的任何主機！
  • 通配符字符在User字段中不允許，但是你能指定空白的值，它匹配任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名，用戶被認為是匿名用戶(沒有名字的用戶)，而非客戶實際指定的名字。這意味著一個空白的用戶名被用於在連接期間的進一步的存取檢查(即，在階段2期間)。
  • Password字段可以是空白的。這不意味著匹配任何密碼，它意味著用戶必須不指定一個密碼進行連接。

非空白Password值代表加密的密碼。 MySQL不以任何人可以看的純文本格式儲存密碼，相反，正在試圖聯接的一個用戶提供的密碼被加密(使用PASSWORD()函數)，並且與儲存了user表中的已經加密的版本比較。如果他們匹配，密碼是正確的。

下面的例子顯示出各種user表中Host和User條目的值的組合如何應用於到來的連接：

Host 值 | User 值 | 被條目匹配的連接
'thomas.loc.gov' | 'fred' | fred, 從thomas.loc.gov 連接
'thomas.loc.gov' | '' | 任何用戶, 從thomas.loc.gov連接
'%' | 'fred' | fred, 從任何主機連接
'%' | '' | 任何用戶, 從任何主機連接
'%.loc.gov' | 'fred' | fred, 從在loc.gov域的任何主機連接
'x.y.%' | 'fred' | fred, 從x.y.net、x.y.com,x.y.edu等聯接。（這或許無用）
'144.155.166.177' | 'fred' | fred, 從有144.155.166.177 IP 地址的主機連接
'144.155.166.%' | 'fred' | fred, 從144.155.166 C類子網的任何主機連接

既然你能在Host字段使用IP通配符值(例如，'144.155.166.%'匹配在一個子網上的每台主機)，有可能某人可能企圖探究這種能力，通過命名一台主機為144.155.166.somewhere.com。為了阻止這樣的企圖，MySQL不允許匹配以數字和一個點起始的主機名，這樣，如果你用一個命名為類似1.2.foo.com的主機，它的名字決不會匹配授權表中Host列。只有一個IP數字能匹配IP通配符值。

一個到來的連接可以被在user表中的超過一個條目匹配。例如，一個由fred從thomas.loc.gov的連接匹配多個條目如上所述。如果超過一個匹配，伺服器怎麼選擇使用哪個條目呢？伺服器在啟動時讀入user表後通過排序來解決這個問題，然後當一個用戶試圖連接時，以排序的順序瀏覽條目，第一個匹配的條目被使用。

user表排序工作如下，假定user表看起來像這樣：

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

當伺服器在表中讀取時，它以最特定的Host值為先的次序排列('%'在Host列裡意味著“任何主機”並且是最不特定的)。有相同Host值的條目以最特定的User值為先的次序排列(一個空白User值意味著“任何用戶”並且是最不特定的)。最終排序的user表看起來像這樣：

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

當一個連接被嘗試時，伺服器瀏覽排序的條目並使用找到的第一個匹配。對於由jeffrey從localhost的一個連接，在Host列的'localhost'條目首先匹配。那些有空白用戶名的條目匹配連接的主機名和用戶名。（'%'/'jeffrey'條目也將匹配，但是它不是在表中的第一匹配。）

這是另外一個例子。假定user桌子看起來像這樣：

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

排序後的表看起來像這樣：

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

一個由jeffrey從thomas.loc.gov的連接被第一個條目匹配，而一個由jeffrey從whitehouse.gov的連接被第二個匹配。

普遍的誤解是認為，對一個給定的用戶名，當伺服器試圖對連接尋找匹配時，明確命名那個用戶的所有條目將首先被使用。這明顯不是事實。先前的例子說明了這點，在那裡一個由jeffrey從thomas.loc.gov的連接沒被包含'jeffrey'作為User字段值的條目匹配，但是由沒有用戶名的題目匹配！

如果你有伺服器連接的問題，列印出user表並且手工排序它看看第一個匹配在哪兒進行。

6.8 存取控制，階段2：請求証實

一旦你建立了一個連接，伺服器進入階段2。對在此連接上進來的每個請求，伺服器檢查你是否有足夠的權限來執行它，它基於你希望執行的操作類型。這正是在授權表中的權限字段發揮作用的地方。這些權限可以來子user、db、host、tables_priv或columns_priv表的任何一個。授權表用GRANT和REVOKE命令操作。見7.26 GRANT和REVOKE 句法。（你可以發覺參考6.6 權限系統怎樣工作很有幫助，它列出了在每個權限表中呈現的字段。）

user表在一個全局基礎上授予賦予你的權限，該權限不管當前的資料庫是什麼均適用。例如，如果user表授予你delete權限， 你可以刪除在伺服器主機上從任何資料庫刪除行！換句話說，user表權限是超級用戶權限。只把user表的權限授予超級用戶如伺服器或資料庫主管是明智的。對其他用戶，你應該把在user表中的權限設成'N'並且僅在一個特定資料庫的基礎上授權， 使用db和host表。

db和host表授予資料庫特定的權限。在範圍字段的值可以如下被指定：

  • 通配符字符“%”和“_”可被用於兩個表的Host和Db字段。
  • 在db表的'%'Host值意味著“任何主機”，在db表中一個空白Host值意味著“對進一步的資訊咨詢host表”。
  • 在host表的一個'%'或空白Host值意味著“任何主機”。
  • 在兩個表中的一個'%'或空白Db值意味著“任何資料庫”。
  • 在兩個表中的一個空白User值匹配匿名用戶。

db和host表在伺服器啟動時被讀取和排序(同時它讀user表)。db表在Host、Db和User範圍字段上排序，並且host表在Host和Db範圍字段上排序。對於user表，排序首先放置最特定的值然後最後最不特定的值，並且當伺服器尋找匹配入條目時，它使用它找到的第一個匹配。

tables_priv和columns_priv表授予表和列特定的權限。在範圍字段的值可以如下被指定：

  • 通配符“%”和“_”可用在使用在兩個表的Host字段。
  • 在兩個表中的一個'%'或空白Host意味著“任何主機”。
  • 在兩個表中的Db、Table_name和Column_name字段不能包含通配符或空白。

tables_priv和columns_priv表在Host、Db和User字段上被排序。這類似於db表的排序，盡管因為只有Host字段可以包含通配符，但排序更簡單。

請求証實進程在下面描述。（如果你熟悉存取檢查的原始程式，你會注意到這裡的描述與在代碼使用的算法略有不同。描述等價於代碼實際做的東西﹔它只是不同於使解釋更簡單。）

對管理請求(shutdown、reload等等)，伺服器僅檢查user表條目，因為那是唯一指定管理權限的表。如果條目許可請求的操作，存取被授權了，否則拒絕。例如，如果你想要執行mysqladmin shutdown，但是你的user表條目沒有為你授予shutdown權限，存取甚至不用檢查db或host表就被拒絕。（因為他們不包含Shutdown_priv行列，沒有這樣做的必要。）

對資料庫有關的請求(insert、update等等)，伺服器首先通過查找user表條目來檢查用戶的全局(超級用戶)權限。如果條目允許請求的操作，存取被授權。如果在user表刈釪局權限不夠，伺服器通過檢查db和host表確定特定的用戶資料庫權限：

  1. 伺服器在db表的Host、Db和User字段上查找一個匹配。 Host和User對應連接用戶的主機名和MySQL用戶名。Db字段對應用戶想要存取的資料庫。如果沒有Host和User的條目，存取被拒絕。
  2. 如果db表中的條目有一個匹配而且它的Host字段不是空白的，該條目定義用戶的資料庫特定的權限。
  3. 如果匹配的db表的條目的Host字段是空白的，它表示host表列舉主機應該被允許存取資料庫的主機。在這種情況下，在host表中作進一步查找以發現Host和Db字段上的匹配。如果沒有host表條目匹配，存取被拒絕。如果有匹配，用戶資料庫特定的權限以在db和host表的條目的權限，即在兩個條目都是'Y'的權限的交集(而不是並集！)計算。（這樣你可以授予在db表條目中的一般權限，然後用host表條目按一個主機一個主機為基礎地有選擇地限制它們。）

在確定了由db和host表條目授予的資料庫特定的權限後，伺服器把他們加到由user表授予的全局權限中。如果結果允許請求的操作，存取被授權。否則，伺服器檢查在tables_priv和columns_priv表中的用戶的表和列權限並把它們加到用戶權限中。基於此結果允許或拒絕存取。

用布爾術語表示，前面關於一個用戶權限如何計算的描述可以這樣總結：

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

它可能不明顯，為什麼呢，如果全局user條目的權限最初發現對請求的操作不夠，伺服器以後把這些權限加到資料庫、表和列的特定權限。原因是一個請求可能要求超過一種類型的權限。例如，如果你執行一個INSERT ... SELECT語句，你就都要insert和select權限。你的權限必須如此以便user表條目授予一個權限而db表條目授予另一個。在這種情況下，你有必要的權限執行請求，但是伺服器不能自己把兩個表區別開來﹔兩個條目授予的權限必須組合起來。

host表能被用來維護一個“安全”伺服器列表。在TcX，host表包含一個在本地的網路上所有的機器的表，這些被授予所有的權限。

你也可以使用host表指定不安全的主機。假定你有一台機器public.your.domain，它位於你不認為是安全的一個公共區域，你可以用下列的host表條目子允許除了那台機器外的網路上所有主機的存取：

+--------------------+----+-
| Host               | Db | ...
+--------------------+----+-
| public.your.domain | %  | ... (所有權限設為 'N')
| %.your.domain      | %  | ... (所有權限設為 'Y')
+--------------------+----+-

當然，你應該總是測試你在授權表中的條目(例如，使用mysqlaccess)讓你確保你的存取權限實際上以你認為的方式被設置。

6.9 權限更改何時生效

當mysqld啟動時，所有的授權表內容被讀進儲存器並且從那點生效。

用GRANT、REVOKE或SET PASSWORD對授權表施行的修改會立即被伺服器注意到。

如果你手工地修改授權表(使用INSERT、UPDATE等等)，你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴伺服器再裝載授權表，否則你的改變將不生效，除非你重啟伺服器。

當伺服器注意到授權表被改變了時，現存的客戶連接有如下影響：

  • 表和列權限在客戶的下一次請求時生效。
  • 資料庫權限改變在下一個USE db_name命令生效。

全局權限的改變和密碼改變在下一次客戶連接時生效。

6.10 建立初始的MySQL權限

在安裝MySQL後，你通過運行scripts/mysql_install_db安裝初始的存取權限。見4.7.1 快速安裝概述。 scripts/mysql_install_db腳本啟動mysqld伺服器，然後初始化授權表，包含下列權限集合：

  • MySQL root用戶作為可做任何事情的一個超級用戶被創造。連接必須由本地主機發出。注意：出世的root密碼是空的，因此任何人能以root而沒有一個密碼進行連接並且被授予所有權限。
  • 一個匿名用戶被創造，他可對有一個'test'或以'test_'開始的名字的資料庫做任何時期事情，連接必須由本地主機發出。這意味著任何本地用戶能連接並且視為匿名用戶。
  • 其他權限被拒絕。例如，一般用戶不能使用mysqladmin shutdown或mysqladmin processlist。

注意：對Win32的初始權限是不同的。見4.12.4 在Win32上運行MySQL。

既然你的安裝初始時廣開大門，你首先應該做的事情之一是為MySQL root用戶指定一個密碼。你可以做如下(注意，你使用PASSWORD()函數指定密碼)：

shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;

在MySQL 3.22和以上版本中，你可以使用SET PASSWORD語句：

shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');

設置密碼的另一種方法是使用mysqladmin命令：

shell> mysqladmin -u root password new_password

注意：如果你使用第一種方法在user表裡直接更新密碼，你必須告訴伺服器再次讀入授權表(用FLUSH PRIVILEGES)，因為否則改變將不被注意到。

一旦root密碼被設置，此後當你作為root與伺服器連接時，你必須供應那個密碼。

你可能希望讓root密碼為空白以便當你施行附加的安裝時，你不需要指定它或測試，但是保証在任何真實的生產工作中使用你的安裝之前，設置它。

看看scripts/mysql_install_db腳本，看它如何安裝預設的權限。你可用它作為一個研究如何增加其他用戶的基礎。

如果你想要初始的權限不同於上面描述的那些，在你運行mysql_install_db之前，你可以修改它。

為了完全重建權限表，刪除在包含mysql資料庫的目錄下所有“*.frm”,“*.MYI”和“*.MYD”文件。（這是在資料庫目錄下面命名為“mysql”的目錄，當你運行mysqld --help時，它被列出。)然後運行mysql_install_db腳本，可能在首先編輯它擁有你想要的權限之後。

注意：對於比MySQL 3.22.10舊的版本，你不應該刪除“*.frm”文件。如果你偶然做了，你應該在運行mysql_install_db之前你的MySQL分發中拷回它們。

6.11 向MySQL增加新用戶權限

你可以有2個不同的方法增加用戶：通過使用GRANT語句或通過直接操作MySQL授權表。比較好的方法是使用GRANT語句，因為他們是更簡明並且好像錯誤少些。

下面的例子顯示出如何使用mysql客戶安裝新用戶。這些例子假定權限根據以前的章節描述的預設被安裝。這意味著為了改變，你必須在mysqld正在運行同一台機器上，你必須作為MySQL root用戶連接，並且root用戶必須對mysql資料庫有insert權限和reload管理權限。另外，如果你改變了root用戶密碼，你必須如下的mysql命令指定它。

你可以通過發出GRANT語句增加新用戶：

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
           IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
           IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

這些GRANT語句安裝3個新用戶：

monty
可以從任何地方連接伺服器的一個完全的超級用戶，但是必須使用一個密碼('something'做這個。注意，我們必須對monty@localhost和monty@"%"發出GRANT語句。如果我們增加localhost條目，對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮，因為它有更特定的Host字段值，所以以user表排列順序看更早到來。
admin
可以從localhost沒有一個密碼進行連接並且被授予reload和process管理權限的用戶。這允許用戶執行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令，還有mysqladmin processlist。沒有授予資料庫有關的權限。他們能在以後通過發出另一個GRANT語句授權。
dummy
可以不用一個密碼連接的一個用戶，但是只能從本地主機。全局權限被設置為'N'--USAGE權限類型允許你無需權限就可設置一個用戶。它假定你將在以後授予資料庫相關的權限。

你也可以直接通過發出INSERT語句增加同樣的用戶存取資訊，然後告訴伺服器再次裝入授權表：

shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin',
                 Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                        VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

取決於你的MySQL版本，對上述，你可能必須使用一個不同數目'Y'值(在3.22.11以前的版本有更少的權限列)。對admin用戶，只用在3.22.11開始的版本具有的更加可讀的INSERT擴充的語法。

注意，為了設置一個超級用戶，你只需創造一個user表條目，其權限字段設為'Y'。不需要db或host表的條目。

在user表中的權限列不是由最後一個INSERT語句明確設置的(對dummy用戶)，因此那些列被賦予預設值'N'。這是GRANT USAGE做的同樣的事情。

下列例子增加一個用戶custom，他能從主機localhost、server.domain和whitehouse.gov連接。他只想要從localhost存取bankaccount資料庫，從whitehouse.gov存取expenses資料庫和從所有3台主機存取customer資料庫。他想要從所有3台主機上使用密碼stupid。

為了使用GRANT語句設置個用戶的權限，運行這些命令：

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON bankaccount.*
           TO custom@localhost
           IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON expenses.*
           TO custom@whitehouse.gov
           IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON customer.*
           TO custom@'%'
           IDENTIFIED BY 'stupid';

通過直接修改授權表設置用戶權限，運行這些命令(注意，在結束時FLUSH PRIVILEGES)：

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

頭3個INSERT語句增加user表條目，允許用戶custom用給定密碼從不同的主機進行連接，但是沒有授予任何許可(所有權限被設置為預設值'N')。後3個INSERT語句增加db表條目，授予custom以bankaccount、expenses和customer資料庫權限，但是只能在從正確的主機存取時。通常，在授權表直接被修改時，伺服器必須被告知再次裝入他們(用FLUSH PRIVILEGES)以便使權限修改生效。

如果你想要給特定的用戶從一個給定的域上的任何機器上存取權限，你可以發出一個如下的GRANT語句：

mysql> GRANT ...
           ON *.*
           TO myusername@"%.mydomainname.com"
           IDENTIFIED BY 'mypassword';

為了通過直接修改授權表做同樣的事情，這樣做：

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
           PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;

你也可以使用xmysqladmin、mysql_webadmin甚至xmysql在授權表中插入、改變和更新值。你可以在MySQL的Contrib目錄找到這些實用程式。

6.12 怎樣設置密碼

在前面小節的例子裡說明了一個重要的原則：當你使用INSERT或UPDATE語句儲存一個非空的密碼時，你必須使用PASSWORD()函數加密它。這是因為在user表刈脛加密形式儲存密碼，而不是作為純文本。如果你忘記這個事實，你可能像這樣試圖設置密碼：

shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES

結果是純文本值'biscuit'作為密碼被儲存在user表中。在用戶jeffrey試圖用這個密碼連接伺服器時，mysql客戶用PASSWORD()加密它並且將結果送給伺服器，伺服器比較在user表中的值(它是純文本值'biscuit')和加密的密碼(而不是 'biscuit')，比較失敗並且伺服器拒絕連接：

shell> mysql -u jeffrey -pbiscuit test
Access denied

因為當他們被插入user表時，密碼必須被加密，相反，INSERT語句應該像這樣被指定：

mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','jeffrey',PASSWORD('biscuit'));

當你使用SET PASSWORD語句時，你也必須使用PASSWORD()函數：

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');

如果你使用GRANT ... IDENTIFIED BY語句或mysqladmin password命令設置密碼，PASSWORD()函數是不必要的。他們都考慮到為你加密密碼，多以你可像這樣指定一個密碼'biscuit'：

mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';

或

shell> mysqladmin -u jeffrey password biscuit

注意： PASSWORD()不是以在Unix密碼加密的同樣方法施行密碼加密。你不應該假定如果你的Unix密碼和你的MySQL密碼是一樣的，PASSWORD()將導致與在Unix密碼文件被儲存的同樣的加密值。見6.2 MySQL 用戶名和密碼。

6.13 Access denied錯誤的原因

當你試著聯接MySQL伺服器時，如果你碰到Access denied錯誤，顯示在下面的表指出一些你能用來更正這個問題的動作：

  • 你是在安裝MySQL以後運行mysql_install_db的腳本，來設置初始授權表內容嗎？如果不是，這樣做。見6.10 設置初始MySQL權限。通過執行這個命令測試初始權限：
    shell> mysql -u root test

    伺服器應該讓你無誤地連接。你也應該保証你在MySQL資料庫目錄有一個文件“user.MYD”。通常，它是“PATH/var/mysql/user.MYD”，在此PATH是MySQL安裝根目錄的路徑。

  • 在一個新的安裝以後，你應該連接伺服器並且設置你的用戶及其存取許可：
    shell> mysql -u root mysql

    伺服器應該讓你連接，因為MySQL root用戶初始時沒有密碼。既然那也是一個安全風險，當你正在設置其他MySQL用戶時，設定root密碼是一件重要的事請。如果你作為root嘗試連接並且得到這個錯誤：

    Access denied for user: '@unknown' to database mysql

    這意味著，你沒有一個條目在user表中的一個User列值為'root'並且mysqld不能為你的客庫解析主機名。在這種情況下，你必須用--skip-grant-tables選項重啟伺服器並且編輯你的“/etc/hosts”或“\windows\hosts”文件為你的主機增加一個條目。

  • 如果你從一個3.22.11以前的版本更新一個現存的MySQL安裝到3.22.11版或以後版本，你運行了mysql_fix_privilege_tables腳本嗎？如果沒有，運行它。在GRANT語句變得能工作時，授權表的結構用MySQL 3.22.11修改 。
  • 如果你直接對授權表做修改(使用INSERT或UPDATE語句)並且你的改變似乎被忽略，記住，你必須發出一個FLUSH PRIVILEGES語句或執行一個mysqladmin flush-privileges命令導致伺服器再次讀入表，否則你的改變要道下一次伺服器被重啟時再生效。記住在你設定root密碼以後，你將不需要指定它，直到在你清洗(flush)權限以後，因為伺服器仍然不會知道你改變了密碼！
  • 如果你的權限似乎在一個會話(session)當中改變了，可能是一個超級用戶改變了他們。再次裝入授權表作用於新客戶連接，但是它也影響現存的連接，如6.9 權限改變何時生效小節所述。
  • 為了測試，用--skip-grant-tables選項啟動mysqld背景執行程式，然後你可以改變MySQL授權表並且使用mysqlaccess腳本檢查你的修改是否有如期的效果。當你對你的改變滿意時，執行mysqladmin flush-privileges告訴mysqld伺服器開始使用新的權限表。注意：再次裝入授權表覆蓋了--skip-grant-tables選項。這允許你告訴伺服器開始使用授權表，而不用停掉並重啟它。
  • 如果你有一個Perl、Python或ODBC程式的存取問題，試著用mysql -u user_name db_name或mysql -u user_name -pyour_pass db_name與伺服器連接。如果你能用mysql客戶連接，這是你程式的一個問題而不是存取權限的問題。（注意在-p和密碼之間沒有空格﹔你也能使用--password=your_pass句法指定密碼。）
  • 如果你不能讓密碼工作，記得如果你用INSERT, UPDATE或SET PASSWORD語句設置密碼，你必須使用PASSWORD()函數。如果你用GRANT ... INDENTIFIED BY語句或mysqladmin password命令指定密碼，PASSWORD()函數是不需要的。見6.12 怎樣設置密碼。
  • localhost是你本地主機名的一個同義詞，並且也是如果你不明確地指定主機而客戶嘗試連接的預設主機。然而，如果你正在運行於一個使用MIT-pthreads的系統上，連接localhost是不行的(localhost連接使用Unix套接字進行，它沒被 MIT-pthreads支援)，為了在這樣的系統上避免這個問題，你應該使用--host選項明確地命名伺服器主機，這將做一個 TCP/IP連接到mysqld伺服器。在這種情況下，你必須有在伺服器主機上的user表中條目的你真實的主機名。（即使你在伺服器同一台的主機上運行一個客戶程式，這也是真的。）
  • 當嘗試用mysql -u user_name db_name與資料庫連接時，如果你得到一個Access denied錯誤，你可能有與user桌有關的問題，通過執行mysql -u root mysql並且發出下面的SQL語句檢查：
    mysql> SELECT * FROM user;

    結果應該包含一個有Host和User列的條目匹配你的計算機主機名和你的MySQL用戶名。

  • Access denied錯誤消息將告訴你，你正在用哪個用戶嘗試登錄，你正在試圖用連接哪個主機，並且你是否正在使用一個密碼。通常，你應該在user表中有一個條目，正確地匹配在錯誤消息給出的主機名和用戶名。
  • 如果當你試著從一個不是MySQL伺服器正在運行的主機上連接時，你得到下列錯誤，那麼在user表中沒有匹配那台主機行：
    Host ... is not allowed to connect to this MySQL server

    你可以通過使用mysql命令行工具（在伺服器主機上！)修正它，把你正在試圖連接的用戶/主機名組合新加一行到user表中。如果你不在運行MySQL 3.22並且你不知道你正在從它連接的機器的IP數字或主機名，你應該把一個'%'條目作為Host列值放在user表中並且在伺服器機器上使用--log選項重啟mysqld。在試圖從客戶機器連接以後，在MySQL記錄文件中的資訊將顯示你如何真正進行連接。（然後用在記錄文件上面顯示出的實際的主機名代替user表中的'%'條目。否則，你將有一個不安全的系統。）

  • 如果mysql -u root test工作但是mysql -h your_hostname -u root test導致Access denied，那麼在user表中你可能沒有你的主機的正確名字。這裡的一個普遍的問題是在user表條目中的Host值指定一個唯一的主機名，但是你系統的名字解析例程返回一個完全正規的域名(或相反)。例如，如果你在user表中有一個主機是'tcx'的條目，但是你的 DNS告訴MySQL你的主機名是'tcx.subnet.se'，條目將不工作。嘗試把一個條目加到user表中，它包含你主機的IP數字作為Host列的值。（另外，你可以把一個條目加到user表中，它有包含一個通配符如'tcx.%'的Host值。然而，使用以“%”結尾的主機名是不安全的並且不推薦！）
  • 如果mysql -u user_name test工作但是mysql -u user_name other_db_name不工作，對other_db_name，你在db表中沒有沒有一個條目列出。
  • 當在伺服器機器上執行mysql -u user_name db_name時，它工作，但是在其它客戶機器上執行mysql -h host_name -u user_name db_name時，它卻不工作，你沒有把客戶機器列在user表或db表中。
  • 如果你不能弄明白你為什麼得到Access denied，從user表中刪除所有Host包含通配符值的條目(包含“%”或“_”的條目)。一個很普遍的錯誤是插入用Host='%'和User='some user'插入一個新條目，認為這將允許你指定localhost從同一台機器進行連接。它不工作的原因是預設權限包括一個有Host='localhost'和User=''的條目，因為那個條目一個比'%'更具體的Host值'localhost'，當從localhost連接時，它用於指向新條目！正確的步驟是插入Host='localhost'和User='some_user'的第2個條目，或刪除Host='localhost'和User=''條目。
  • 如果你得到下列錯誤，你可以有一個與db或host表有關的問題：
    Access to database denied

    如果從db表中選擇了在Host列有空值的條目，保証在host表中有一個或多個相應的條目，指定運用db表中的哪些主機。如果在使用SQL命令SELECT ... INTO OUTFILE或LOAD DATA INFILE時，你得到錯誤，在user表中的你的條目可能啟用file權限。

  • 記住，客戶程式將使用在配置文件或環境變數被指定了的連接參數。如果當你不在命令行上指定他們時，一個客戶似乎正在發送錯誤的預設連接參數，檢查你的環境和在你的主目錄下的“.my.cnf”文件。你也可以檢查系統範圍的MySQL配置文件，盡管更不可能將在那裡指定那個客戶的連接參數。見4.15.4 選項文件。如果當你沒有任何選項運行一個客戶時，你得到Access denied，確認你沒在任何選項文件裡指定一個舊的密碼！見4.15.4 選項文件。
  • 如果任何其它事情失敗，用調試選項(例如，--debug=d,general,query)啟動mysqld背景執行程式。這將列印有關嘗試連接的主機和用戶資訊，和發出的每個命令的資訊。見G.1 調試一個MySQL伺服器。
  • 如果你有任何與MySQL授權表的其它問題，而且覺得你必須郵寄這個問題到郵寄表，總是提供一個MySQL授權表的傾倒副本(dump)。你可用mysqldump mysql命令傾倒資料庫表。像平時一樣，用mysqlbug腳本郵寄你的問題。在一些情況下你可能用--skip-grant-tables重啟mysqld以便能運行mysqldump。

6.14 怎樣使MySQL安全以對抗解密高手

當你連接一個MySQL伺服器時，你通常應該使用一個密碼。密碼不以明文在連接上傳輸。

所有其它資訊作為能被任何人讀懂的文本被傳輸。如果你擔心這個，你可使用壓縮協議(MySQL3.22和以上版本)使事情變得更難。甚至為了使一切更安全，你應該安裝ssh（見http://www.cs.hut.fi/ssh)。用它，你能在一個MySQL伺服器與一個MySQL客戶之間得到一個加密的TCP/IP連接。

為了使一個MySQL系統安全，強烈要求你考慮下列建議：

  • 對所有MySQL用戶使用密碼。記住，如果other_user沒有密碼，任何人能簡單地用mysql -u other_user db_name作為任何其它的人登錄。對客戶機/伺服器應用程式，客戶可以指定任何用戶名是常見的做法。在你運行它以前，你可以通過編輯mysql_install_db腳本改變所有用戶的密碼，或僅僅MySQL root的密碼，像這樣：
    shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;
  • 不要作為Unix的root用戶運行MySQL背景執行程式。mysqld能以任何用戶運行，你也可以創造一個新的Unix用戶mysql使一切更安全。如果你作為其它Unix用戶運行mysqld，你不需要改變在user表中的root用戶名，因為MySQL用戶名與Unix 用戶名沒關系。你可以作為其它Unix用戶編輯mysql.server啟動腳本mysqld。通常這用su命令完成。對於更多的細節，見18.8 怎樣作為一個一般用戶運行MySQL。
  • 如果你把一個Unix root用戶密碼放在mysql.server腳本中，確保這個腳本只能對root是可讀的。
  • 檢查那個運行mysqld的Unix用戶是唯一的在資料庫目錄下有讀/寫權限的用戶。
  • 不要把process權限給所有用戶。mysqladmin processlist的輸出顯示出當前執行的查詢正文，如果另外的用戶發出一個UPDATE user SET password=PASSWORD('not_secure')查詢，被允許執行那個命令的任何用戶可能看得到。mysqld為有process權限的用戶保留一個額外的連接, 以便一個MySQL root用戶能登錄並檢查，即使所有的正常連接在使用。
  • 不要把file權限給所有的用戶。有這權限的任何用戶能在擁有mysqld背景執行程式權限的文件系統那裡寫一個文件！為了使這更安全一些，用SELECT ... INTO OUTFILE產生的所有文件對每個人是可讀的，並且你不能覆蓋已經存在的文件。file權限也可以被用來讀取任何作為運行伺服器的Unix用戶可存取的文件。這可能被濫用，例如，通過使用LOAD DATA裝載“/etc/passwd”進一個資料庫表，然後它能用SELECT被讀入。
  • 如果你不信任你的DNS，你應該在授權表中使用IP數字而不是主機名。原則上講，--secure選項對mysqld應該使主機名更安全。在任何情況下，你應該非常小心地使用包含通配符的主機名！

下列mysqld選項影響安全：

--secure
由gethostbyname()系統調用返回的IP數字被檢查，確保他們解析回到原來的主機名。這對某些外人通過模仿其它主機獲得存取權限變得更難。這個選項也增加一些聰明的主機名檢查。在MySQL3.21裡，選擇預設是關掉的，因為它有時它花很長時間執行反向解析。MySQL 3.22緩存主機名並預設地啟用了這個選項。
--skip-grant-tables
這個選項導致伺服器根本不使用權限系統。這給每個人以完全存取所有的資料庫的權力！（通過執行mysqladmin reload，你能告訴一個正在運行的伺服器再次開始使用授權表。)
--skip-name-resolve
主機名不被解析。所有在授權表的Host的列值必須是IP數字或localhost。
--skip-networking
在網路上不允許TCP/IP連接。所有到mysqld的連接必須經由Unix套接字進行。這個選項對使用MIT-pthreads的系統是不合適的，因為MIT-pthreads包不支援Unix套接字。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊- 7 MySQL 語言參考

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com） 主頁：http://linuxdb.yeah.net

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

7 MySQL語言參考

7.1 文字：怎麼寫字符串和數字

7.1.1 字符串

一個字符串是一個字符序列，由單引號(“'”)或雙引號(“"”)字符(後者只有你不在ANSI模式運行)包圍。例如：

'a string'
"another string"

在字符串內，某個順序有特殊的意義。這些順序的每一個以一條反斜線(“\”)開始，稱為轉義字符。MySQL識別下列轉義字符：

\0
一個ASCII 0 (NUL)字符。
\n
一個新行符。
\t
一個定位符。
\r
一個回車符。
\b
一個退格符。
\'
一個單引號(“'”)符。
\"
一個雙引號(“"”)符。
\\
一個反斜線(“\”)符。
\%
一個“%”符。它用於在正文中搜索“%”的文字實例，否則這裡“%”將解釋為一個通配符。
\_
一個“_”符。它用於在正文中搜索“_”的文字實例，否則這裡“_”將解釋為一個通配符。

注意，如果你在某些正文環境中使用“\%”或“\%_”，這些將返回字符串“\%”和“\_”而不是“%”和“_”。

有幾種方法在一個字符串內包括引號：

  • 一個字符串內用“'”加引號的“'”可以被寫作為“''”。
  • 一個字符串內用“"”加引號的“"”可以被寫作為“""”。
  • 你可以把一個轉義字符（“\”）放在引號前面。
  • 一個字符串內用“"”加引號的“'”不需要特殊對待而且不必被重複或轉義。同理，一個字符串內用“'”加引號的與“"”也不需要特殊對待。

下面顯示的SELECT演示引號和轉義如何工作：

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+

如果你想要把二進制數據插入到一個BLOB列，下列字符必須由轉義序列表示：

NUL
ASCII 0。你應該用'\0'（一個反斜線和一個ASCII '0'）表示它。
\
ASCII 92，反斜線。用'\\'表示。
'
ASCII 39，單引號。用“\'”表示。
"
ASCII 34，雙引號。用“\"”表示。

如果你寫C代碼，你可以使用C API函數mysql_escape_string()來為INSERT語句轉義字符。見20.3 C API 函數概述。在 Perl中，你可以使用DBI包中的quote方法變換特殊的字符到正確的轉義序列。見20.5.2 DBI介面。

你應該在任何可能包含上述任何特殊字符的字符串上使用轉義函數！

7.1.2 數字

整數表示為一個數字順序。浮點數使用“.”作為一個十進制分隔符。這兩種類型的數字可以前置“-”表明一個負值。

有效整數的例子：

1221
0
-32

有效浮點數的例子：

294.42
-32032.6809e+10
148.00

一個整數可以在浮點上下文使用﹔它解釋為等值的浮點數。

7.1.3 十六進制值

MySQL支援十六進制值。在數字上下文，它們表現類似於一個整數(64位精度)。在字符串上下文，它們表現類似於一個二進制字符串，這裡每一對十六進制數字被變換為一個字符。

mysql> SELECT 0xa+0
       -> 10
mysql> select 0x5061756c;
       -> Paul

十六進制字符串經常被ODBC使用，給出BLOB列的值。

7.1.4 NULL值

NULL值意味著“無數據”並且不同於例如數字類型的0為或字符串類型的空字符串。見18.15 NULL值問題。

當使用文本文件導入或導出格式(LOAD DATA INFILE, SELECT ... INTO OUTFILE)時，NULL可以用\N表示。見7.16 LOAD DATA INFILE句法。

7.1.5 資料庫、表、索引、列和別名的命名

資料庫、表、索引、列和別名的名字都遵守MySQL同樣的規則:

注意，從MySQL3.23.6開始規則改變了，此時我們引入了用'引用的標識符(資料庫、表和列命名)（如果你以ANSI模式運行，"也將用於引用標識符）。

標識符 | 最大長度 | 允許的字符
資料庫 | 64 | 在一個目錄名允許的任何字符，除了/.
表 | 64 | 在文件名中允許的任何字符，除了/或.
列 | 64 | 所有字符
別名 | 255 | 所有字符

注意，除了以上，你在一個標識符中不能有ASCII(0)或ASCII(255)。

注意，如果標識符是一個限制詞或包含特殊字符，當你使用它時，你必須總是用`引用它：

SELECT * from `select` where `select`.id > 100;

在 MySQL的先前版本，命名規則如下：

  • 一個名字可以包含來自當前字符集的數字字母的字符和“_”和“$”。預設字符集是ISO-8859-1 Latin1﹔這可以通過重新編譯MySQL來改變。見9.1.1 用於數據和排序的字符集。
  • 一個名字可以以在一個名字中合法的任何字符開始。特別地，一個名字可以以一個數字開始(這不同於許多其他的資料庫系統!)。然而，一個名字不能僅僅由數字組成。
  • 你不能在名字中使用“.”，因為它被用來擴充格式，你能用它引用列(見下面)。

建議你不使用像1e這樣的名字，因為一個表達式如1e+1是二義性的。它可以解釋為表達式1e + 1或數字1e+1。

在MySQL中，你能使用下列表格的任何一種引用列：

列引用 | 含義
col_name | 來自於任意表的列col_name，用於包含該表的一個列的查詢中
tbl_name.col_name | 來自當前的資料庫的表tbl_name的列col_name
db_name.tbl_name.col_name | 行列col_name從表格tbl_name資料庫db_name。這個形式在MySQL3.22或以後版本可用。
`column_name` | 是一個關鍵詞或包含特殊字符的列。

在一條語句的列引用中，你不必指定一個tbl_name或db_name.tbl_name前綴，除非引用會有二義性。例如，假定表t1和t2，每個均包含列c，並且你用一個使用t1和t2的SELECT語句檢索c。在這種情況下，c有二義性，因為它在使用表的語句中不是唯一的，因此你必須通過寫出t1.c或t2.c來指明你想要哪個表。同樣，如果你從資料庫db1中一個表t和在資料庫db2的一個表t檢索，你必須用db1.t.col_name和db2.t.col_name引用這些數據表的列。

句法.tbl_name意味著在當前的資料庫中的表tbl_name，該句法為了ODBC的兼容性被接受，因為一些ODBC程式用一個“.”字符作為資料庫表名的前綴。

7.1.5.1 名字的大小寫敏感性

在MySQL中，資料庫和表對應於在那些目錄下的目錄和文件，因而，內在的作業系統的敏感性決定資料庫和表命名的大小寫敏感性。這意味著資料庫和表名在Unix上是區分大小寫的，而在Win32上忽略大小寫。

注意：在Win32上，盡管資料庫和表名是忽略大小寫的，你不應該在同一個查詢中使用不同的大小寫來引用一個給定的資料庫和表。下列查詢將不工作，因為它作為my_table和作為MY_TABLE引用一個表：

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列名在所有情況下都是忽略大小寫的。

表的別名是區分大小寫的。下列查詢將不工作，: 因為它用a和A引用別名：

mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;

列的別名是忽略大小寫的。

7.2 用戶變數

MySQL支援執行緒特定的變數，用@variablename句法。一個變數名可以由當前字符集的數字字母字符和“_”、“$”和“.”組成。預設字符集是ISO-8859-1 Latin1﹔這可以通過重新編譯MySQL改變。見9.1.1 用於數據和排序的字符集。

變數不必被初始化。預設地，他們包含NULL並能儲存整數、實數或一個字符串值。當執行緒退出時，對於一個執行緒的所有變數自動地被釋放。

你可以用SET句法設置一個變數：

SET @variable= { integer expression | real expression | string expression }
[,@variable= ...].

你也可以用@variable:=expr句法在一個表達式中設置一個變數：

select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

（這裡，我們不得不使用:=句法，因為=是為比較保留的）

7.3 列類型

MySQL支援大量的列類型，它可以被分為3類：數字類型、日期和時間類型以及字符串(字符)類型。本節首先給出可用類型的一個概述，並且總結每個列類型的儲存需求，然後提供每個類中的類型性質的更詳細的描述。概述有意簡化，更詳細的說明應該考慮到有關特定列類型的附加資訊，例如你能為其指定值的允許格式。

由MySQL支援的列類型列在下面。下列代碼字母用於描述中：

M
指出最大的顯示尺寸。最大的合法的顯示尺寸是 255 。
D
適用於浮點類型並且指出跟隨在十進制小數點後的數碼的數量。最大可能的值是30，但是應該不大於M-2。

方括號(“[”和“]”)指出可選的類型修飾符的部分。

注意，如果你指定一個了為ZEROFILL，MySQL將為該列自動地增加UNSIGNED屬性。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]
一個很小的整數。有符號的範圍是-128到127，無符號的範圍是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
一個小整數。有符號的範圍是-32768到32767，無符號的範圍是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
一個中等大小整數。有符號的範圍是-8388608到8388607，無符號的範圍是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
一個正常大小整數。有符號的範圍是-2147483648到2147483647，無符號的範圍是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
這是INT的一個同義詞。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
一個大整數。有符號的範圍是-9223372036854775808到9223372036854775807，無符號的範圍是0到18446744073709551615。注意，所有算術運算用有符號的BIGINT或DOUBLE值完成，因此你不應該使用大於9223372036854775807（63位)的有符號大整數，除了位函數！注意，當兩個參數是INTEGER值時，-、+和*將使用BIGINT運算！這意味著如果你乘2個大整數(或來自於返回整數的函數)，如果結果大於9223372036854775807，你可以得到意外的結果。一個浮點數字，不能是無符號的，對一個單精度浮點數，其精度可以是<=24，對一個雙精度浮點數，是在25 和53之間，這些類型如FLOAT和DOUBLE類型馬上在下面描述。FLOAT(X)有對應的FLOAT和DOUBLE相同的範圍，但是顯示尺寸和小數位數是未定義的。在MySQL3.23中，這是一個真正的浮點值。在更早的MySQL版本中，FLOAT(precision)總是有2位小數。該句法為了ODBC兼容性而提供。
FLOAT[(M,D)] [ZEROFILL]
一個小(單精密)浮點數字。不能無符號。允許的值是-3.402823466E+38到-1.175494351E-38，0 和1.175494351E-38到3.402823466E+38。M是顯示寬度而D是小數的位數。沒有參數的FLOAT或有<24 的一個參數表示一個單精密浮點數字。
DOUBLE[(M,D)] [ZEROFILL]
一個正常大小(雙精密)浮點數字。不能無符號。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是顯示寬度而D是小數位數。沒有一個參數的DOUBLE或FLOAT(X)（25 < = X < = 53）代表一個雙精密浮點數字。
DOUBLE PRECISION[(M,D)] [ZEROFILL]

REAL[(M,D)] [ZEROFILL]
這些是DOUBLE同義詞。
DECIMAL[(M[,D])] [ZEROFILL]
一個未壓縮(unpack)的浮點數字。不能無符號。行為如同一個CHAR列：“未壓縮”意味著數字作為一個字符串被儲存，值的每一位使用一個字符。小數點，並且對於負數，“-”符號不在M中計算。如果D是0，值將沒有小數點或小數部分。DECIMAL值的最大範圍與DOUBLE相同，但是對一個給定的DECIMAL列，實際的範圍可以通過M和D的選擇被限制。如果D被省略，它被設置為0。如果M被省掉，它被設置為10。注意，在MySQL3.22裡，M參數包括符號和小數點。
NUMERIC(M,D) [ZEROFILL]
這是DECIMAL的一個同義詞。
DATE
一個日期。支援的範圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值，但是允許你使用字符串或數字把值賦給DATE列。
DATETIME
一個日期和時間組合。支援的範圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式來顯示DATETIME值，但是允許你使用字符串或數字把值賦給DATETIME的列。
TIMESTAMP[(M)]
一個時間戳記。範圍是'1970-01-01 00:00:00'到2037年的某時。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式來顯示TIMESTAMP值，取決於是否M是14（或省略)、12、8或6，但是允許你使用字符串或數字把值賦給TIMESTAMP列。一個TIMESTAMP列對於記錄一個INSERT或UPDATE操作的日期和時間是有用的，因為如果你不自己給它賦值，它自動地被設置為最近操作的日期和時間。你以可以通過賦給它一個NULL值設置它為當前的日期和時間。見7.3.6 日期和時間類型。
TIME
一個時間。範圍是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式來顯示TIME值，但是允許你使用字符串或數字把值賦給TIME列。
YEAR[(2|4)]
一個2或4位數字格式的年(預設是4位)。允許的值是1901到2155，和0000（4位年格式），如果你使用2位，1970-2069( 70-69)。MySQL以YYYY格式來顯示YEAR值，但是允許你把使用字符串或數字值賦給YEAR列。（YEAR類型在MySQL3.22中是新類型。）
CHAR(M) [BINARY]
一個定長字符串，當儲存時，總是是用空格填滿右邊到指定的長度。M的範圍是1 ∼ 255個字符。當值被檢索時，空格尾部被刪除。CHAR值根據預設字符集以大小寫不區分的方式排序和比較，除非給出BINARY關鍵詞。NATIONAL CHAR（短形式NCHAR)是ANSI SQL的方式來定義CHAR列應該使用預設字符集。這是MySQL的預設。CHAR是CHARACTER的一個縮寫。
[NATIONAL] VARCHAR(M) [BINARY]
一個變長字符串。注意：當值被儲存時，尾部的空格被刪除(這不同於ANSI SQL規範)。M的範圍是1 ∼ 255個字符。 VARCHAR值根據預設字符集以大小寫不區分的方式排序和比較，除非給出BINARY關鍵詞值。見7.7.1 隱式列指定變化。 VARCHAR是CHARACTER VARYING一個縮寫。
TINYBLOB

TINYTEXT
一個BLOB或TEXT列，最大長度為255(2^8-1)個字符。見7.7.1 隱式列指定變化。
BLOB

TEXT
一個BLOB或TEXT列，最大長度為65535(2^16-1)個字符。見7.7.1 隱式列指定變化。
MEDIUMBLOB

MEDIUMTEXT
一個BLOB或TEXT列，最大長度為16777215(2^24-1)個字符。見7.7.1 隱式列指定變化。
LONGBLOB

LONGTEXT
一個BLOB或TEXT列，最大長度為4294967295(2^32-1)個字符。見7.7.1 隱式列指定變化
ENUM('value1','value2',...)
枚舉。一個僅有一個值的字符串對像，這個值式選自與值列表'value1'、'value2', ...,或NULL。一個ENUM最多能有65535不同的值。
SET('value1','value2',...)
一個集合。能有零個或多個值的一個字符串對像，其中每一個必須從值列表'value1', 'value2', ...選出。一個SET最多能有64個成員。

7.3.1 列類型儲存需求

對於每個由MySQL支援的列類型的儲存需求在下面按類列出。

7.3.2 數字類型

列類型 | 需要的儲存量
TINYINT | 1 字節
SMALLINT | 2 個字節
MEDIUMINT | 3 個字節
INT | 4 個字節
INTEGER | 4 個字節
BIGINT | 8 個字節
FLOAT(X) | 4 如果 X < = 24 或 8 如果 25 < = X < = 53
FLOAT | 4 個字節
DOUBLE | 8 個字節
DOUBLE PRECISION | 8 個字節
REAL | 8 個字節
DECIMAL(M,D) | M字節(D+2 , 如果M < D)
NUMERIC(M,D) | M字節(D+2 , 如果M < D)

7.3.3 日期和時間類型

列類型 | 需要的儲存量
DATE | 3 個字節
DATETIME | 8 個字節
TIMESTAMP | 4 個字節
TIME | 3 個字節
YEAR | 1 字節

7.3.4 串類型

列類型 | 需要的儲存量
CHAR(M) | M字節，1 <= M <= 255
VARCHAR(M) | L+1 字節, 在此L <= M和1 <= M <= 255
TINYBLOB, TINYTEXT | L+1 字節, 在此L< 2 ^ 8
BLOB, TEXT | L+2 字節, 在此L< 2 ^ 16
MEDIUMBLOB, MEDIUMTEXT | L+3 字節, 在此L< 2 ^ 24
LONGBLOB, LONGTEXT | L+4 字節, 在此L< 2 ^ 32
ENUM('value1','value2',...) | 1 或 2 個字節, 取決於枚舉值的數目(最大值65535）
SET('value1','value2',...) | 1，2，3，4或8個字節, 取決於集合成員的數量(最多64個成員）

VARCHAR和BLOB和TEXT類型是變長類型，對於其儲存需求取決於列值的實際長度(在前面的表格以 L表示)，而不是取決於類型的最大可能尺寸。例如，一個VARCHAR(10)列能保存最大長度為10個字符的一個字符串，實際的儲存需要是字符串的長度(L)，加上1個字節以記錄字符串的長度。對於字符串'abcd'，L是4而儲存要求是5個字節。

BLOB和TEXT類型需要1，2，3或4個字節來記錄列值的長度，這取決於類型的最大可能長度。

如果一個表包括任何變長的列類型，記錄格式將也是變長的。注意，當一個表被創建時，MySQL可能在某些條件下將一個列從一個變長類型改變為一個定長類型或相反。見7.7.1 隱式列指定變化。

一個ENUM對像的大小由不同枚舉值的數量決定。1字節被用於枚舉，最大到255個可能的值﹔2個字節用於枚舉，最大到65535 值。

一個SET對像的大小由不同的集合成員的數量決定。如果集合大小是N，對像占據(N+7)/8個字節，四捨五入為1，2，3，4或8 個字節。一個SET最多能有64個成員。

7.3.5 數字類型

MySQL支援所有的ANSI/ISO SQL92的數字類型。這些類型包括準確數字的數據類型(NUMERIC, DECIMAL, INTEGER,和SMALLINT)，也包括近似數字的數據類型(FLOAT, REAL,和DOUBLE PRECISION)。關鍵詞INT是INTEGER的一個同義詞，而關鍵詞DEC是DECIMAL一個同義詞。

NUMERIC和DECIMAL類型被MySQL實現為同樣的類型，這在SQL92標準允許。他們被用於保存值，該值的準確精度是極其重要的值，例如與金錢有關的數據。當聲明一個類是這些類型之一時，精度和規模的能被(並且通常是)指定﹔例如：

salary DECIMAL(9,2)

在這個例子中，9(precision)代表將被用於儲存值的總的小數位數，而2(scale)代表將被用於儲存小數點後的位數。因此，在這種情況下，能被儲存在salary列中的值的範圍是從-9999999.99到9999999.99。在ANSI/ISO SQL92中，句法DECIMAL(p)等價於DECIMAL(p,0)。同樣，句法DECIMAL等價於DECIMAL(p,0)，這裡實現被允許決定值p。MySQL當前不支援DECIMAL/NUMERIC數據類型的這些變種形式的任一種。這一般說來不是一個嚴重的問題，因為這些類型的主要益處得自於明顯地控制精度和規模的能力。

DECIMAL和NUMERIC值作為字符串儲存，而不是作為二進制浮點數，以便保存那些值的小數精度。一個字符用於值的每一位、小數點(如果scale>0)和“-”符號(對於負值)。如果scale是0，DECIMAL和NUMERIC值不包含小數點或小數部分。

DECIMAL和NUMERIC值得最大的範圍與DOUBLE一樣，但是對於一個給定的DECIMAL或NUMERIC列，實際的範圍可由制由給定列的precision或scale限制。當這樣的列賦給了小數點後面的位超過指定scale所允許的位的值，該值根據scale四捨五入。當一個DECIMAL或NUMERIC列被賦給了其大小超過指定(或預設的）precision和scale隱含的範圍的值，MySQL儲存表示那個範圍的相應的端點值。

作為對ANSI/ISO SQL92標準的擴展，MySQL也支援上表所列的整型類型TINYINT、MEDIUMINT和BIGINT。另一個擴展是MySQL支援可選地指定一個整型值顯示的寬度，用括號跟在基本關鍵詞之後(例如，INT(4))。這個可選的寬度指定被用於其寬度小於列指定寬度的值得左填補顯示，但是不限制能在列中被儲存的值的範圍，也不限制值將被顯示的位數，其寬度超過列指定的寬度。當與可選的擴展屬性ZEROFILL一起使用時，預設的空格填補用零代替。例如，對於聲明為INT(5) ZEROFILL的列，一個為4的值作為00004被檢索。注意，如果你在一個整型列儲存超過顯示寬度的更大值，當MySQL對於某些複雜的聯結(join)產生臨時表時，你可能會遇到問題，因為在這些情況下，MySQL相信數據確實適合原來的列寬度。

所有的整型類型可以有一個可選(非標準的)屬性UNSIGNED。當你想要在列中僅允許正數並且你需要一個稍大一點的列範圍，可以使用無符號值。

FLOAT類型被用來標示近似數字的數據類型。ANSI/ISO SQL92標準允許一個可選的精度說明(但不是指數的範圍)，跟在關鍵詞FLOAT後面的括號內位數。MySQL實現也支援這個可選的精度說明。當關鍵詞FLOAT被用於一個列類型而沒有精度說明時，MySQL使用4個字節儲存值。一個變種的句法也被支援，在FLOAT關鍵詞後面的括號給出2個數字。用這個選項，第一個數字繼續表示在字節計算的值儲存需求，而第二個數字指定要被儲存的和顯示跟隨小數點後的位數(就像DECIMAL和NUMERIC)。當MySQL要求為這樣一個列，一個小數點後的小數位超過列指定的值，儲存值時，該值被四捨五入，去掉額外的位。

REAL和DOUBLE PRECISION類型不接受精度說明。作為對 ANSI/ISO SQL92 標準的擴展，MySQL識別出DOUBLE作為DOUBLE PRECISION類型的一個同義詞。與REAL精度比用於DOUBLE PRECISION的更小的標準要求相反，MySQL實現了兩種，作為8字節雙精度浮點值(當運行不是“Ansi模式”時)。為了最大的移植性，近似數字的數據值的儲存所需代碼應該使用沒有精度或小數位數說明的FLOAT或DOUBLE PRECISION。

當要求在數字的列儲存超出該列類型允許的範圍的值時，MySQL剪切該值到範圍內的正確端點值並且儲存剪切後的結果值。

例如，一個INT列的範圍是-2147483648到2147483647。如果你試圖插入-9999999999到一個INT列中，值被剪切到範圍的低部端點，並儲存-2147483648。同樣，如果你試圖插入9999999999，2147483647被儲存。

如果INT列是UNSIGNED，列的範圍的大小是相同的，但是它的端點移到了0和4294967295。如果你試圖儲存-9999999999和9999999999，在列被儲存的值變為0和4294967296。

對於ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT語句，由於剪切所發生的變換作為“警告”被報告。

7.3.6 日期和時間類型

日期和時間類型是DATETIME、DATE、TIMESTAMP、TIME和YEAR。這些的每一個都有合法值的一個範圍，而“零”當你指定確實不合法的值時被使用。注意，MySQL允許你儲存某個“不嚴格地”合法的日期值，例如1999-11-31，原因我們認為它是應用程式的責任來處理日期檢查，而不是SQL伺服器。為了使日期檢查更“快”，MySQL僅檢查月份在0-12的範圍，天在0-31的範圍。上述範圍這樣被定義是因為MySQL允許你在一個DATE或DATETIME列中儲存日期，這裡的天或月是零。這對儲存你不知道準確的日期的一個生日的應用程式來說是極其有用的，在這種情況下，你簡單地儲存日期像1999-00-00或1999-01-00。（當然你不能期望從函數如DATE_SUB()或DATE_ADD()得到類似以這些日期的正確值)。

當用日期和時間工作時，這裡是的一些要記住的一般考慮：

  • MySQL對一個給定的日期或時間類型以標準的格式檢索，但是它試圖為你提供的值解釋成許多格式(例如，當你指定一個值被賦給或與比較一個日期或時間類型時)，但是只支援有在下列小節描述的格式。期望你提供合法的值，並且如果你以其他格式使用這些值，可能造成無法預料的結果。
  • 盡管MySQL試圖以多種格式解釋值，但它總是期望日期值的年份部分在最左面，日期必須以年-月-日的順序給出(例如，'98-09-04')，而不是以其他地方常用的月-日-年或日-月-年的次序(例如，'09-04-98'、'04-09-98')。
  • 如果一個值在數字的上下文環境中被使用，MySQL自動變換一個日期或時間類型值到一個數字，反過來也如此。
  • 當MySQL遇到一個日期或時間類型的值超出範圍或對給類型不合法(見本節的開始)時，它將該類型的值變換到“零”值。（例外的是超出範圍的TIME值被剪切為適當的TIME範圍端點值。)下表顯示對每種類型的“零”值的格式：
    列類型 | “零”值
    DATETIME | '0000-00-00 00:00:00'
    DATE | '0000-00-00'
    TIMESTAMP | 00000000000000（長度取決於顯示尺寸）
    TIME | '00:00:00'
    YEAR | 0000
  • “零”值是特殊的，但是你能使用在表中顯示的值來明顯地儲存或引用他們。你也可以使用值'0'或0做到, 這更容易寫。
  • 在MyODBC 2.50.12和以上版本中，由MyODBC使用的“零”日期或時間值被自動變換到NULL，因為ODBC不能處理這樣的值。

7.3.6.1 Y2K問題和日期類型

MySQL本身Y2K安全的(見1.6 2000年一致性)，但是呈交給MySQL的輸入值可能不是。一個包含2位年份值的任何輸入是由二義性的，因為世紀是未知的。這樣的值必須被解釋成4位形式，因為MySQL內部使用4位儲存年份。

對於DATETIME, DATE, TIMESTAMP和YEAR類型，MySQL使用下列規則的解釋二義性的年份值：

  • 在範圍00-69的年值被變換到2000-2069。
  • 在範圍70-99的年值被變換到1970-1999。

記得這些規則僅僅提供對於你數據的含義的合理猜測。如果MySQL使用的啟發規則不產生正確的值，你應該提供無二義的包含4位年值的輸入。

7.3.6.2 DATETIME, DATE和TIMESTAMP類型

DATETIME, DATE和TIMESTAMP類型是相關的。本節描述他們的特徵，他們是如何類似的而又不同的。

DATETIME類型用在你需要同時包含日期和時間資訊的值時。MySQL檢索並且以'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值，支援的範圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。（“支援”意味著盡管更早的值可能工作，但不能保証他們可以。）

DATE類型用在你僅需要日期值時，沒有時間部分。MySQL檢索並且以'YYYY-MM-DD'格式顯示DATE值，支援的範圍是'1000-01-01'到'9999-12-31'。

TIMESTAMP列類型提供一種類型，你可以使用它自動地用當前的日期和時間標記INSERT或UPDATE的操作。如果你有多個TIMESTAMP列，只有第一個自動更新。

自動更新第一個TIMESTAMP列在下列任何條件下發生：

  • 列沒有明確地在一個INSERT或LOAD DATA INFILE語句中指定。
  • 列沒有明確地在一個UPDATE語句中指定且一些另外的列改變值。（注意一個UPDATE設置一個列為它已經有的值，這將不引起TIMESTAMP列被更新，因為如果你設置一個列為它當前的值，MySQL為了效率而忽略更改。）
  • 你明確地設定TIMESTAMP列為NULL.

除第一個以外的TIMESTAMP列也可以設置到當前的日期和時間，只要將列設為NULL，或NOW()。

通過明確地設置希望的值，你可以設置任何TIMESTAMP列為不同於當前日期和時間的值，即使對第一個TIMESTAMP列也是這樣。例如，如果，當你創建一個行時，你想要一個TIMESTAMP被設置到當前的日期和時間，但在以後無論何時行被更新時都不改變，你可以使用這個屬性：

  • 讓MySQL在行被創建時設置列，這將初始化它為當前的日期和時間。
  • 當你執行隨後的對該行中其他列的更改時，明確設定TIMESTAMP列為它的當前值。

另一方面，你可能發現，當行被創建並且遠離隨後的更改時，很容易用一個你用NOW()初始化的DATETIME列。

TIMESTAMP值可以從1970的某時的開始一直到2037年，精度為一秒，其值作為數字顯示。

在MySQL檢索並且顯示TIMESTAMP值取決於顯示尺寸的格式如下表。“完整”TIMESTAMP格式是14位，但是TIMESTAMP列可以用更短的顯示尺寸創造：

列類型 | 顯示格式
TIMESTAMP(14) | YYYYMMDDHHMMSS
TIMESTAMP(12) | YYMMDDHHMMSS
TIMESTAMP(10) | YYMMDDHHMM
TIMESTAMP(8) | YYYYMMDD
TIMESTAMP(6) | YYMMDD
TIMESTAMP(4) | YYMM
TIMESTAMP(2) | YY

所有的TIMESTAMP列都有同樣的儲存大小，不考慮顯示尺寸。最常見的顯示尺寸是6、8、12、和14。你可以在表創建時間指定一個任意的顯示尺寸，但是值0或比14大被強制到14。在從1∼13範圍的奇數值尺寸被強制為下一個更大的偶數。

使用一個常用的格式集的任何一個，你可以指定DATETIME、DATE和TIMESTAMP值：

  • 'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的一個字符串。允許一種“寬松”的語法--任何標點可用作在日期部分和時間部分之間的分隔符。例如，'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等價的。
  • 'YYYY-MM-DD'或'YY-MM-DD'格式的一個字符串。允許一種“寬松”的語法。例如，'98-12-31', '98.12.31', '98/12/31'和'98@12@31'是等價的。
  • 'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的沒有任何分隔符的一個字符串，例如，'19970523091528'和'970523091528'被解釋為'1997-05-23 09:15:28'，但是'971122459015'是不合法的(它有毫無意義的分鐘部分)且變成'0000-00-00 00:00:00'。
  • 'YYYYMMDD'或'YYMMDD'格式的沒有任何分隔符的一個字符串，如果字符串認為是一個日期。例如，'19970523'和'970523'被解釋作為'1997-05-23'，但是'971332'是不合法的( 它有無意義的月和天部分)且變成'0000-00-00'。
  • YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的一個數字，如果數字認為是一個日期。例如，19830905132800和830905132800被解釋作為'1983-09-05 13:28:00'。
  • YYYYMMDD或YYMMDD格式的一個數字，如果數字認為是一個日期。例如，19830905和830905被解釋作為'1983-09-05'。
  • 一個返回值可以在一個DATETIME, DATE或TIMESTAMP上下文環境中接受的函數，例如NOW()或CURRENT_DATE。

不合法DATETIME, DATE或TIMESTAMP值被變換到適當類型的“零”值('0000-00-00 00:00:00', '0000-00-00'或00000000000000)。

對於包括的日期部分分隔符的指定為字符串的值，不必要為小於10的月或天的值指定2位數字，'1979-6-9'與'1979-06-09'是一樣的。同樣, 對於包括的時間部分分隔符的指定為字符串的值，不必為小於10的小時、月或秒指定2位數字，'1979-10-30 1:2:3'與'1979-10-30 01:02:03'是一樣的。

指定為數字應該是6、8、12或14位長。如果數字是8或14位長，它被假定以YYYYMMDD或YYYYMMDDHHMMSS格式並且年份由頭4位數字給出。如果數字是6或12位長，它被假定是以YYMMDD或YYMMDDHHMMSS格式且年份由頭2位數字給出。不是這些長度之一的數字通過填補前頭的零到最接近的長度來解釋。

指定為無分隔符的字符串用它們給定的長度來解釋。如果字符串長度是8或14個字符，年份被假定頭4個字符給出，否則年份被假定由頭2個字符給出。對於字符串中呈現的多個部分，字符串從左到右邊被解釋，以找出年、月、日、小時、分鐘和秒值，這意味著，你不應該使用少於 6 個字符的字符串。例如，如果你指定'9903'，認為將代表1999年3月，你會發現MySQL把一個“零”日期插入到你的表中，這是因為年份和月份值99和03，但是日期部分丟失(零)，因此該值不是一個合法的日期。

TIMESTAMP列使用被指定的值的完整精度的儲存合法的值，不考慮顯示大小。這有幾個含意：

  • 總是指定年，月，和日，即使你的列類型是TIMESTAMP(4)或TIMESTAMP(2)。否則，值將不是一個合法的日期並且0將被儲存。
  • 如果你使用ALTER TABLE拓寬一個狹窄的TIMESTAMP列，以前被“隱蔽”的資訊將被顯示。
  • 同樣，縮小一個TIMESTAMP列不會導致資訊失去，除了感覺上值在顯示時，較少的資訊被顯示出。
  • 盡管TIMESTAMP值被儲存為完整精度，直接操作儲存值的唯一函數是UNIX_TIMESTAMP()，其他函數操作在格式化了的檢索的值上，這意味著你不能使用函數例如HOUR()或SECOND()，除非TIMESTAMP值的相關部分被包含在格式化的值中。例如，一個TIMESTAMP列的HH部分部被顯示，除非顯示大小至少是10，因此在更短的TIMESTAMP值上試試使用HOUR()產生一個無意義的結果。

在某種程度上，你可以把一種日期類型的值賦給一個不同的日期類型的對像。然而，這可能值有一些改變或資訊的損失：

  • 如果你將一個DATE值賦給一個DATETIME或TIMESTAMP對像，結果值的時間部分被設置為'00:00:00'，因為DATE值不包含時間資訊。
  • 如果你將一個DATETIME或TIMESTAMP值賦給一個DATE對像，結果值的時間部分被刪除，因為DATE類型不儲存時間資訊。
  • 記住，盡管DATETIME, DATE和TIMESTAMP值全都可以用同樣的格式集來指定，但所有類型不都有同樣的值範圍。例如，TIMESTAMP值不能比1970早或比2037網晚，這意味著，一個日期例如'1968-01-01'，當作為一個DATETIME或DATE值合法時，它不是一個正確TIMESTAMP值，並且如果賦值給這樣一個對像，它將被變換到0。

當指定日期值時，當心某些缺陷：

  • 允許作為字符串指定值的寬松格式能被欺騙。例如，值例如'10:11:12'可能看起來像時間值，因為“:”分隔符，但是如果在一個日期中使用，上下文將作為年份被解釋成'2010-11-12'。值'10:45:15'將被變換到'0000-00-00'，因為'45'不是一個合法的月份。
  • 以2位數字指定的年值是模糊的，因為世紀是未知的。MySQL使用下列規則解釋2位年值：
    • 在00-69範圍的年值被變換到2000-2069。
    • 在范70-99圍的年值被變換到1970-1999。

7.3.6.3 TIME類型

MySQL檢索並以'HH:MM:SS'格式顯示TIME值(或對大小時值，'HHH:MM:SS'格式)。TIME值的範圍可以從'-838:59:59'到'838:59:59'。小時部分可能很大的的原因是TIME類型不僅可以被使用在表示一天的時間(它必須是不到24個小時)，而且用在表示在2個事件之間經過的時間或時間間隔(它可以是比24個小時大些，或甚至是負值)。

你能用多中格式指定TIME值：

  • 作為'HH:MM:SS'格式的一個字符串。“寬松”的語法被允許--任何標點符號可用作時間部分的分隔符，例如，'10:11:12'和'10.11.12'是等價的。
  • 作為沒有分隔符的'HHMMSS'格式的一個字符串，如果它作為一個時間解釋。例如，'101112'被理解為'10:11:12'，但是'109712'是不合法的(它有無意義的分鐘部分)並變成'00:00:00'。
  • 作為HHMMSS格式的一個數字，如果它能解釋為一個時間。例如，101112被理解為'10:11:12'。
  • 返回值可在一個TIME上下文接受的函數，例如CURRENT_TIME。

對於作為包括一個時間分隔符的字符串被指定的TIME值，不必為小於10的小時、分鐘或秒值指定2位數字，'8:3:2'與'08:03:02'是一樣的。

將“短的”TIME值賦值給一個TIME行列是要格外小心。MySQL使用最右位代表秒的假設來解釋值。(MySQL將TIME值解釋為經過的時間，而非作為一天的時間 )例如，你可能想到'11:12'、'1112'和1112意味著'11:12:00'（11點12分)，但是MySQL解釋他們為'00:11:12'（11分12秒)。同樣，'12'和12被解釋為'00:00:12'。

但是超出TIME範圍之外的值是樣合法的，它被剪切到範圍適當的端點值。例如，'-850:00:00'和'850:00:00'被變換到'-838:59:59'和'838:59:59'。

不合法的TIME值被變換到'00:00:00'。注意，既然'00:00:00'本身是一個合法的TIME值，沒有其他方法區分表中儲存的一個'00:00:00'值，原來的值是否被指定為'00:00:00'或它是否是不合法的。

7.3.6.4 YEAR類型

YEAR類型是一個 1 字節類型用於表示年份。

MySQL檢索並且以YYYY格式顯示YEAR值，其範圍是1901到2155。

你能用多種格式指定YEAR值：

  • 作為在'1901'到'2155'範圍的一個4位字符串。
  • 作為在1901到2155範圍的一個4位數字。
  • 作為在'00'到'99'範圍的一個2位字符串.在'00'到'69'和'70'到'99'範圍的值被變換到在2000到2069範圍和1970到1999的YEAR值。
  • 作為在1到99範圍的一個2位數字。在範圍1到69和70到99的值被變換到在範圍2001到2069和1970到1999的YEAR的值。注意對於2位數字的範圍略微不同於2位數字字符串的範圍，因為你不能直接指定零作為一個數字並且把它解釋為2000。你必須作為一個字符串'0'或'00'指定它，它將被解釋為0000。
  • 其返回值可在一個YEAR上下文環境中接受的函數，例如NOW()。

不合法YEAR值被變換到0000。

7.3.7 字符串類型

字符串類型是CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。

7.3.7.1 CHAR和VARCHAR類型

CHAR和VARCHAR類型是類似的，但是在他們被儲存和檢索的方式不同。

一個CHAR列的長度被修正為在你創造表時你所聲明的長度。長度可以是1和255之間的任何值。（在MySQL 3.23中，CHAR長度可以是0∼255。) 當CHAR值被儲存時，他們被用空格在右邊填補到指定的長度。當CHAR值被檢索時，拖後的空格被刪去。

在VARCHAR列中的值是變長字符串。你可以聲明一個VARCHAR列是在1和255之間的任何長度，就像對CHAR列。然而，與CHAR相反，VARCHAR值只儲存所需的字符，外加一個字節記錄長度，值不被填補﹔相反，當值被儲存時，拖後的空格被刪去。（這個空格刪除不同於ANSI SQL規範。）

如果你把一個超過列最大長度的值賦給一個CHAR或VARCHAR列，值被截斷以適合它。

下表顯示了兩種類型的列的不同，通過演示儲存變長字符串值到CHAR(4)和VARCHAR(4)列：

值 | CHAR(4) | 儲存需求 | VARCHAR(4) | 儲存需求
'' | ' ' | 4 個字節 | '' | 1 字節
'ab' | 'ab ' | 4 個字節 | 'ab' | 3 個字節
'abcd' | 'abcd' | 4 個字節 | 'abcd' | 5 個字節
'abcdefgh' | 'abcd' | 4 個字節 | 'abcd' | 5 個字節

從CHAR(4)和VARCHAR(4)列檢索的值在每種情況下都是一樣的，因為拖後的空格從檢索的CHAR列上被刪除。

在CHAR和VARCHAR列中儲存和比較值是以大小寫不區分的方式進行的，除非當桌子被創建時，BINARY屬性被指定。BINARY屬性意味著該列的值根據MySQL伺服器正在運行的機器的ASCII順序以大小寫區分的方式儲存和比較。

BINARY屬性是“粘性”的。這意味著，如果標記了BINARY的列用於一個表達式中，整個的表達式作為一個BINARY值被比較。

MySQL在表創建時可以隱含地改變一個CHAR或VARCHAR列的類型。見7.7.1 隱含的的列說明改變。

7.3.7.2 BLOB和TEXT類型

一個BLOB是一個能保存可變數量的數據的二進制的大對像。4個BLOB類型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅僅在他們能保存值的最大長度方面有所不同。見7.3.1 列類型儲存需求。

4個TEXT類型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對應於4個BLOB類型，並且有同樣的最大長度和儲存需求。在BLOB和TEXT類型之間的唯一差別是對BLOB值的排序和比較以大小寫敏感方式執行，而對TEXT值是大小寫不敏感的。換句話說，一個TEXT是一個大小寫不敏感的BLOB。

如果你把一個超過列類型最大長度的值賦給一個BLOB或TEXT列，值被截斷以適合它。

在大多數方面，你可以認為一個TEXT行列是你所希望大的一個VARCHAR列。同樣，你可以認為一個BLOB列是一個VARCHAR BINARY列。差別是：

  • 用MySQL版本3.23.2和更新，你能在BLOB和TEXT列上索引。更舊的MySQL版本不支援這個。
  • 當值被儲存時，對BLOB和TEXT列沒有拖後空格的刪除，因為對VARCHAR列有刪除。
  • BLOB和TEXT列不能有DEFAULT值。

MyODBC定義BLOB為LONGVARBINARY，TEXT值為LONGVARCHAR。

因為BLOB和TEXT值可以是非常長的，當使用他們時，你可能遇到一些限制：

  • 如果你想要在一個BLOB或TEXT列上使用GROUP BY或ORDER BY，你必須將列值變換成一個定長對像。這樣做的標準方法是用SUBSTRING函數。例如：
    mysql> select comment from tbl_name,substring(comment,20) as substr ORDER BY substr;

    如果你不這樣做，在排序時，只有列的首max_sort_length個字節被使用，預設的max_sort_length是1024﹔這個值能在啟動mysqld伺服器時使用-O選擇改變。你可以在包含BLOB或TEXT值得一個表達式上分組(group)，通過指定列的位置或使用一個別名：

    mysql> select id,substring(blob_col,1,100) from tbl_name
           GROUP BY 2;
mysql> select id,substring(blob_col,1,100) as b from tbl_name
           GROUP BY b;
  • 一個BLOB或TEXT對像的最大尺寸由其類型決定，但是你能在客戶與伺服器之間是實際傳輸的最大值由可用的內存數量和通訊緩衝區的大小來決定。你能改變消息緩衝區大小，但是你必須在伺服器和客戶兩端做。見10.2.3 調節伺服器參數。

注意，每個BLOB或TEXT值內部由一個獨立分配的對像表示。這與所有的其他列類型相反，它們是在打開表時，按列被分配一次儲存。

7.3.7.3 ENUM類型

一個ENUM是一個字符對像，其值通常從一個在表創建時明確被列舉的允許值的一張表中選擇。

在下列的某個情形下，值也可以空字符串("")或NULL：

  • 如果你把一個無效值插入到一個ENUM（即，一個不在允許的值列表中的字符串)，空字符串作為一個特殊錯誤的值被插入。
  • 如果一個ENUM被聲明為NULL，NULL也是列的合法值，並且預設值是NULL。如果一個ENUM被聲明為NOT NULL，預設值是允許值的列表的第一成員。

每枚舉值有一個編號：

  • 在列說明中來自允許成員值列表值用從1開始編號。
  • 空字符串錯誤值的編號值是0。這意味著，你能使用下列SELECT語句找出被賦給無效ENUM值的行：
    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
  • NULL值的編號是NULL。

例如，指定為ENUM("one", "two", "three")的列可以有顯示在下面的值的任何一個。每個值的編號也被顯示：

值 | 編號
NULL | NULL
"" | 0
"one" | 1
"two" | 2
"three" | 3

枚舉可以有最大65535個成員。

當你把值賦給一個ENUM列時，字母的大小寫是無關緊要的。然而，以後從列中檢索的值大小寫匹配在表創建時用來指定允許值的值的大小寫。

如果你在一個數字的上下文環境中檢索一個ENUM，列值的編號被返回。如果你儲存一個數字到一個ENUM中，數字被當作一個標號，並且儲存的值是該編號的枚舉成員。

ENUM值根據列說明列舉的枚舉成員的次序被排序。（換句話說，ENUM值根據他們的編號數字被排序) 例如，對ENUM("a", "b")，"a"排在"b"前面，但是對ENUM("b", "a")，"b"排在"a"前面。空字符串排序非空字符串之前，並且NULL排在所有其他枚舉值之前。

如果你想要得到一個ENUM列的所有可能的值，你應該使用：SHOW COLUMNS FROM table_name LIKE enum_column_name並且分析在第二列的ENUM定義。

7.3.7.4 SET類型

一個SET是可以有零或多個值的一個字符串對像，其每一個必須從表創建造被指定了的允許值的一張列表中被選擇。由多個集合成員組成的SET列通過由由逗號分隔(“,”)的成員被指定，其推論是該SET成員值不能包含逗號本身。

例如, 一個指定為SET("one", "two") NOT NULL的列可以有這些值的任何一個：

""
"one"
"two"
"one,two"

一個SET能有最多64個不同的成員。

MySQL用數字值儲存SET值，儲存值的低階位對應於第一個集合成員。如果你在數字上下文中檢索一個SET值，檢索的值把位設置位對應組成列值的集合成員。如果一個數字被儲存進一個SET列，在數字的二進制表示中設置的位決定了在列中的集合成員。假定一個列被指定為SET("a","b","c","d")，那麼成員有下列位值：

SET 成員 | 十進制的值 | 二進制的值
a | 1 | 0001
b | 2 | 0010
c | 4 | 0100
d | 8 | 1000

如果你給該列賦值9，即二進制的1001，這樣第一個和第四個SET值成員"a"和"d"被選擇並且結果值是"a,d"。

對於包含超過一個SET成員的值，當你插入值時，無所謂以什麼順序列舉值，也無所謂給定的值列舉了多少次。當以後檢索值時，在值中的每個成員將出現一次，根據他們在表創建時被指定的順序列出成員。例如，如果列指定為SET("a","b","c","d")，那麼"a,d"、"d,a"和"d,a,a,d,d"在檢索時將均作為"a,d"出現。

SET值以數字次序被排序。NULL指排在非NULL SET值之前。

通常，你使用LIKE操作符或FIND_IN_SET()函數執行在一個SET上的一個SELECT：

mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

但是下列也會工作：

mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;

這些語句的第一個語句尋找一個精確的匹配。第二個尋找包含第一個集合成員的值。

如果你想要得到一個SET列的所有可能的值，你應該使用：SHOW COLUMNS FROM table_name LIKE set_column_name並且分析在第二列的SET定義。

7.3.8 為列選擇正確的類型

為了最有效地使用儲存空間，試著在所有的情況下使用最精確的類型。例如，如果一個整數列被用於在之間1和99999的值， MEDIUMINT UNSIGNED是最好的類型。

貨幣值的精確表示是一個常見的問題。在MySQL，你應該使用DECIMAL類型，它作為一個字符串被儲存，不會發生精確性的損失。如果精確性不是太重要，DOUBLE類型也是足夠好的。

對高精度，你總是能變換到以一個BIGINT儲存的定點類型。這允許你用整數做所有的計算，並且僅在必要時將結果轉換回浮點值。見10.6 選擇一個表類型。

7.3.9 列索引

所有的MySQL列類型能被索引。在相關的列上的使用索引是改進SELECT操作性能的最好方法。

一個表最多可有16個索引。最大索引長度是256個字節，盡管這可以在編譯MySQL時被改變。

對於CHAR和VARCHAR列，你可以索引列的前綴。這更快並且比索引整個列需要較少的磁碟空間。在CREATE TABLE語句中索引列前綴的語法看起來像這樣：

KEY index_name (col_name(length))

下面的例子為name列的頭10個字符創建一個索引：

mysql> CREATE TABLE test (
           name CHAR(200) NOT NULL,
           KEY index_name (name(10)));

對於BLOB和TEXT列，你必須索引列的前綴，你不能索引列的全部。

7.3.10 多列索引

MySQL能在多個列上創建索引。一個索引可以由最多15個列組成。（在CHAR和VARCHAR列上，你也可以使用列的前綴作為一個索引的部分)。

一個多重列索引可以認為是包含通過合並(concatenate)索引列值創建的值的一個排序數組。

當你為在一個WHERE子句索引的第一列指定已知的數量時，MySQL以這種方式使用多重列索引使得查詢非常快速，即使你不為其他列指定值。

假定一張表使用下列說明創建：

mysql> CREATE TABLE test (
           id INT NOT NULL,
           last_name CHAR(30) NOT NULL,
           first_name CHAR(30) NOT NULL,
           PRIMARY KEY (id),
           INDEX name (last_name,first_name));

那麼索引name是一個在last_name和first_name上的索引，這個索引將被用於在last_name或last_name和first_name的一個已知範圍內指定值的查詢，因此，name索引將使用在下列查詢中：

mysql> SELECT * FROM test WHERE last_name="Widenius";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name="Michael";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND (first_name="Michael" OR first_name="Monty");

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          AND first_name >="M" AND first_name < "N";

然而，name索引將不用在下列詢問中：

mysql> SELECT * FROM test WHERE first_name="Michael";

mysql> SELECT * FROM test WHERE last_name="Widenius"
                          OR first_name="Michael";

關於MySQL使用索引改進性能的方式的更多的資訊，見10.4 使用MySQL索引。

7.3.11 使用來自其他資料庫引擎的列類型

為了跟容易地使用為其他供應商的SQL實現編寫的代碼，下表顯示了MySQL映射的列類型。這些映射使得從其他資料庫引擎移動表定義到MySQL更容易：

其他供應商類型 | MySQL類型
BINARY(NUM) | CHAR(NUM) BINARY
CHAR VARYING(NUM) | VARCHAR(NUM)
FLOAT4 | FLOAT
FLOAT8 | DOUBLE
INT1 | TINYINT
INT2 | SMALLINT
INT3 | MEDIUMINT
INT4 | INT
INT8 | BIGINT
LONG VARBINARY | MEDIUMBLOB
LONG VARCHAR | MEDIUMTEXT
MIDDLEINT | MEDIUMINT
VARBINARY(NUM) | VARCHAR(NUM) BINARY

列類型映射發生在表創建時。如果你用其他供應商使用的類型創建表，那麼發出一個DESCRIBE tbl_name語句，MySQL使用等價的MySQL類型報告表結構。

7.4 用在SELECT和WHERE子句中的函數

在一個SQL語句中的select_expression或where_definition可由使用下面描述的函數的任何表達式組成。

包含NULL的一個表達式總是產生一個NULL值，否則除非表達式所包含的操作符和函數在文檔中說明。

注意：在一個函數名和跟隨它的括號之間不許沒有空格。這幫助MySQL分析器區分函數調用和具有相同名字的對表或列的引用，盡管允許在參數周圍有空格。

為了簡潔，例子以縮寫形式顯示從mysql程式輸出。因此：

mysql> select MOD(29,9);
1 rows in set (0.00 sec)

+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+

被顯示為這樣：

mysql> select MOD(29,9);
        -> 2

7.4.1 分組函數

( ... )
括號。使用它們來強制在一個表達式的計算順序。
mysql> select 1+2*3;
        -> 7
mysql> select (1+2)*3;
        -> 9

7.4.2 常用的算術操作

一般的算術操作符是可用的。注意在-、+和*情況下，如果兩個參數是整數，結果用BIGINT（64位）精度計算！

+
加法
mysql> select 3+5;
        -> 8
-
減法
mysql> select 3-5;
        -> -2
*
乘法
mysql> select 3*5;
        -> 15
mysql> select 18014398509481984*18014398509481984.0;
        -> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
        -> 0

最後一個表達式的結果是不正確的，因為整數乘積的結果超過用BIGINT計算的64位範圍。

/
除法
mysql> select 3/5;
        -> 0.60

被零除產生一個NULL結果：

mysql> select 102/(1-1);
        -> NULL

一個除法用BIGINT算術計算，只要在它的結果被轉換到一個整數的上下文中執行！

7.4.3 位函數

MySQL為位操作使用BIGINT（64位)算法，因此這些操作符有最大64位的一個範圍。

|
位或
mysql> select 29 | 15;
        -> 31
&
位與
mysql> select 29 & 15;
        -> 13
<<
左移位一個長(BIGINT)數字。
mysql> select 1 << 2
        -> 4
>>
右移位一個長(BIGINT)數字。
mysql> select 4 >> 2
        -> 1
~
顛倒所有的位。
mysql> select 5 & ~1
        -> 4
BIT_COUNT(N)
返回在參數N設定的位的數量。
mysql> select BIT_COUNT(29);
        -> 4

7.4.4 邏輯運算

所有的邏輯函數返回1（TRUE）或0（FALSE）。

NOT
!
邏輯非。如果參數是0，返回1，否則返回0。例外： NOT NULL返回NULL。
mysql> select NOT 1;
        -> 0
mysql> select NOT NULL;
        -> NULL
mysql> select ! (1+1);
        -> 0
mysql> select ! 1+1;
        -> 1

最後的例子返回1，因為表達式作為(!1)+1計算。
OR

||
邏輯或。如果任何一個參數不是0並且不NULL，返回1。
mysql> select 1 || 0;
        -> 1
mysql> select 0 || 0;
        -> 0
mysql> select 1 || NULL;
        -> 1
AND

&&
邏輯與。如果任何一個參數是0或NULL，返回0，否則返回1。
mysql> select 1 && NULL;
        -> 0
mysql> select 1 && 0;
        -> 0

7.4.5 比較運算符

比較操作得出值1（TRUE）、0（FALSE）或NULL等結果。這些函數工作運用在數字和字符串上。當需要時，字符串自動地被變換到數字且數字到字符串(如在Perl)。

MySQL使用下列規則執行比較：

  • 如果一個或兩個參數是NULL，比較的結果是NULL，除了<=>操作符。
  • 如果在比較中操作的兩個參數是字符串，他們作為字符串被比較。
  • 如果兩個參數是整數，他們作為整數被比較。
  • 十六進制的值如果不與一個數字比較，則被當作二進制字符串。
  • 如果參數之一是一個TIMESTAMP或DATETIME列而其他參數是一個常數，在比較執行前，常數被轉換為一個時間標記。這樣做是為了對ODBC更友好。
  • 在所有其他的情況下，參數作為浮點(實數)數字被比較。

預設地，字符串使用當前的字符集以大小寫敏感的方式進行(預設為ISO-8859-1 Latin1，它對英語運用得很出色)。

下面的例子演示了對於比較操作字符串到數字的轉換：

mysql> SELECT 1 > '6x';
         -> 0
mysql> SELECT 7 > '6x';
         -> 1
mysql> SELECT 0 > 'x6';
         -> 0
mysql> SELECT 0 = 'x6';
         -> 1
=
等於
mysql> select 1 = 0;
        -> 0
mysql> select '0' = 0;
        -> 1
mysql> select '0.0' = 0;
        -> 1
mysql> select '0.01' = 0;
        -> 0
mysql> select '.01' = 0.01;
        -> 1
<>

!=
不等於
mysql> select '.01' <> '0.01';
        -> 1
mysql> select .01 <> '0.01';
        -> 0
mysql> select 'zapp' <> 'zappp';
        -> 1
<=
小於或等於
mysql> select 0.1 <= 2;
        -> 1
<
小於
mysql> select 2 <= 2;
        -> 1
>=
大於或等於
mysql> select 2 >= 2;
        -> 1
>
大於
mysql> select 2 > 2;
        -> 0
<=>
安全等於Null
mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1 1 0
IS NULL

IS NOT NULL
測試值是否是或不是NULL
mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL:
        -> 0 0 1
mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
expr BETWEEN min AND max
如果expr對大於或等於min且expr是小於或等於max，BETWEEN返回1，否則它返回0。如果所有的參數類型是一樣得，這等價於表達式(min <= expr AND expr <= max)。第一個參數(expr)決定比較如何被執行。如果expr是一個大小寫不敏感的字符串表達式，進行一個大小寫不敏感的字符串比較。如果expr是一個大小寫敏感的字符串表達式，進行一個大小寫敏感的字符串比較。如果expr是一個整數表達式，進行整數比較。否則，進行一個浮點(實數)比較。
mysql> select 1 BETWEEN 2 AND 3;
        -> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
        -> 1
mysql> select 2 BETWEEN 2 AND '3';
        -> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
        -> 0
expr IN (value,...)
如果expr是在IN表中的任何值，返回1，否則返回0。如果所有的值是常數，那麼所有的值根據expr類型被計算和排序，然後項目的搜索是用二進制的搜索完成。這意味著如果IN值表全部由常數組成，IN是很快的。如果expr是一個大小寫敏感的字符串表達式，字符串比較以大小寫敏感方式執行。
mysql> select 2 IN (0,3,5,'wefwf');
        -> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
        -> 1
expr NOT IN (value,...)
與NOT (expr IN (value,...))相同。
ISNULL(expr)
如果expr是NULL，ISNULL()返回1，否則它返回0。
mysql> select ISNULL(1+1);
        -> 0
mysql> select ISNULL(1/0);
        -> 1

注意，使用=的NULL的值比較總為假！

COALESCE(list)
回來list中第一個非NULL的單元。
mysql> select COALESCE(NULL,1);
        -> 1
mysql> select COALESCE(NULL,NULL,NULL);
        -> NULL
INTERVAL(N,N1,N2,N3,...)
如果N< N1，返回0，如果N< N2，返回1等等。所有的參數被當作整數。為了函數能正確地工作，它要求N1<N2<N3< ...<Nn。這是因為使用二進制搜索(很快)。
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
        -> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
        -> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
        -> 0

7.4.6 字符串比較函數

通常，如果在字符串比較中的任何表達式是區分大小寫的，比較以大小寫敏感的方式執行。

expr LIKE pat [ESCAPE 'escape-char']
使用SQL的簡單的正規表達式比較的模式匹配。返回1（TRUE）或0（FALSE）。用LIKE，你可以在模式中使用下列2個通配符字符：
% 匹配任何數目的字符，甚至零個字符
_ 精確匹配一個字符
mysql> select 'David!' LIKE 'David_';
        -> 1
mysql> select 'David!' LIKE '%D%v%';
        -> 1

為了測試一個通配符的文字實例，用轉義字符的加在字符前面。如果你不指定ESCAPE字符，假定為“\”：

\% 匹配一%字符
\_ 匹配一_字符
mysql> select 'David!' LIKE 'David\_';
        -> 0
mysql> select 'David_' LIKE 'David\_';
        -> 1

為了指定一個不同的轉義字符，使用ESCAPE子句：
mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
        -> 1

LIKE允許用在數字的表達式上！（這是MySQL對ANSI SQL LIKE的一個擴充。)

mysql> select 10 LIKE '1%';
        -> 1

注意：因為MySQL在字符串中使用C轉義語法(例如，“\n”)，你必須在你的LIKE字符串中重複任何“\”。例如，為了查找“\n”，指定它為“ \\n”，為了查找“\”，指定它為“\\\\”（反斜線被分析器剝去一次，另一次是在模式匹配完成時，留下一條單獨的反斜線被匹配)。

expr NOT LIKE pat [ESCAPE 'escape-char']
與NOT (expr LIKE pat [ESCAPE 'escape-char'])相同。
expr REGEXP pat

expr RLIKE pat
執行一個字符串表達式expr對一個模式pat的模式匹配。模式可以是一個擴充的正則表達式。見MySQL 正則表達式句法的 H 描述.如果expr匹配pat，返回1，否則返回0。RLIKE是REGEXP的一個同義詞，提供了與mSQL的兼容性。注意：因為MySQL在字符串中使用C轉義語法(例如，“\n”), 你必須在你的REGEXP字符串重複任何“\”。在MySQL3.23.4中，REGEXP對於正常的(不是二進制)字符串是忽略大小寫。
mysql> select 'Monty!' REGEXP 'm%y%%';
        -> 0
mysql> select 'Monty!' REGEXP '.*';
        -> 1
mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line';
        -> 1
mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A";
        -> 1  0
當決定一個字符的類型時，REGEXP和RLIKE使用當前的字符集(預設為ISO-8859-1 Latin1)。
expr NOT REGEXP pat

expr NOT RLIKE pat
與NOT (expr REGEXP pat)相同。
STRCMP(expr1,expr2)
如果字符串相同，STRCMP()回來0，如果第一參數根據當前的排序次序小於第二個，返回-1，否則返回1。
mysql> select STRCMP('text', 'text2');
        -> -1
mysql> select STRCMP('text2', 'text');
        -> 1
mysql> select STRCMP('text', 'text');
        -> 0

7.4.7 類型轉換運算符

BINARY
BINARY操作符強制跟隨它後面的字符串為一個二進制字符串。即使列沒被定義為BINARY或BLOB，這是一個強制列比較區分大小寫的簡易方法。
mysql> select "a" = "A";
        -> 1
mysql> select BINARY "a" = "A";
        -> 0

BINARY在MySQL 3.23.0中被引入。

7.4.8 控制流函數

IFNULL(expr1,expr2)
如果expr1不是NULL，IFNULL()返回expr1，否則它返回expr2。IFNULL()返回一個數字或字符串值，取決於它被使用的上下文環境。
mysql> select IFNULL(1,0);
        -> 1
mysql> select IFNULL(0,10);
        -> 0
mysql> select IFNULL(1/0,10);
        -> 10
mysql> select IFNULL(1/0,'yes');
        -> 'yes'
IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL)，那麼IF()返回expr2，否則它返回expr3。IF()返回一個數字或字符串值，取決於它被使用的上下文。
mysql> select IF(1>2,2,3);
        -> 3
mysql> select IF(1<2,'yes','no');
        -> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
        -> 'no'

expr1作為整數值被計算，它意味著如果你正在測試浮點或字符串值，你應該使用一個比較操作來做。

mysql> select IF(0.1,1,0);
        -> 0
mysql> select IF(0.1<>0,1,0);
        -> 1

在上面的第一種情況中，IF(0.1)返回0，因為0.1被變換到整數值, 導致測試IF(0)。這可能不是你期望的。在第二種情況中，比較測試原來的浮點值看它是否是非零，比較的結果被用作一個整數。

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一個版本返回result，其中value=compare-value。第二個版本中如果第一個條件為真，返回result。如果沒有匹配的result值，那麼結果在ELSE後的result被返回。如果沒有ELSE部分，那麼NULL被返回。
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;
       -> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
       -> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
       -> NULL

7.4.9 數學函數

所有的數學函數在一個出錯的情況下返回NULL。

-
單目減。改變參數的符號。
mysql> select - 2;

注意，如果這個操作符與一個BIGINT使用，返回值是一個BIGINT！這意味著你應該避免在整數上使用-，那可能有值-2^63！
ABS(X)
返回X的絕對值。
mysql> select ABS(2);
        -> 2
mysql> select ABS(-32);
        -> 32

該功能可安全用於BIGINT值。

SIGN(X)
返回參數的符號，為-1、0或1，取決於X是否是負數、零或正數。
mysql> select SIGN(-32);
        -> -1
mysql> select SIGN(0);
        -> 0
mysql> select SIGN(234);
        -> 1
MOD(N,M)

%
模 (類似C中的%操作符)。返回N被M除的餘數。
mysql> select MOD(234, 10);
        -> 4
mysql> select 253 % 7;
        -> 1
mysql> select MOD(29,9);
        -> 2

這個函數可安全用於BIGINT值。
FLOOR(X)
返回不大於X的最大整數值。

mysql> select FLOOR(1.23);
        -> 1
mysql> select FLOOR(-1.23);
        -> -2

注意返回值被變換為一個BIGINT！

CEILING(X)

返回不小於X的最小整數值。
mysql> select CEILING(1.23);
        -> 2
mysql> select CEILING(-1.23);
        -> -1

注意返回值被變換為一個BIGINT！

ROUND(X)

返回參數X的四捨五入的一個整數。
mysql> select ROUND(-1.23);
        -> -1
mysql> select ROUND(-1.58);
        -> -2
mysql> select ROUND(1.58);
        -> 2

注意返回值被變換為一個BIGINT!

ROUND(X,D)

返回參數X的四捨五入的有D為小數的一個數字。如果D為0，結果將沒有小數點或小數部分。

mysql> select ROUND(1.298, 1);
        -> 1.3
mysql> select ROUND(1.298, 0);
        -> 1

注意返回值被變換為一個BIGINT!

EXP(X)

返回值e（自然對數的底）的X次方。
mysql> select EXP(2);
        -> 7.389056
mysql> select EXP(-2);
        -> 0.135335

LOG(X)

返回X的自然對數。
mysql> select LOG(2);
        -> 0.693147
mysql> select LOG(-2);
        -> NULL

如果你想要一個數字X的任意底B的對數，使用公式LOG(X)/LOG(B)。

LOG10(X)

返回X的以10為底的對數。
mysql> select LOG10(2);
        -> 0.301030
mysql> select LOG10(100);
        -> 2.000000
mysql> select LOG10(-100);
        -> NULL

POW(X,Y)

POWER(X,Y)

返回值X的Y次冪。
mysql> select POW(2,2);
        -> 4.000000
mysql> select POW(2,-2);
        -> 0.250000

SQRT(X)

返回非負數X的平方根。
mysql> select SQRT(4);
        -> 2.000000
mysql> select SQRT(20);
        -> 4.472136

PI()

返回PI的值（圓周率）。
mysql> select PI();
        -> 3.141593

COS(X)

返回X的餘弦, 在這裡X以弧度給出。
mysql> select COS(PI());
        -> -1.000000

SIN(X)

返回X的正弦值，在此X以弧度給出。
mysql> select SIN(PI());
        -> 0.000000

TAN(X)

返回X的正切值，在此X以弧度給出。
mysql> select TAN(PI()+1);
        -> 1.557408

ACOS(X)

返回X反餘弦，即其餘弦值是X。如果X不在-1到1的範圍，返回NULL。

mysql> select ACOS(1);
        -> 0.000000
mysql> select ACOS(1.0001);
        -> NULL
mysql> select ACOS(0);
        -> 1.570796

ASIN(X)

返回X反正弦值，即其正弦值是X。L如果X不在-1到1的範圍，返回NULL。

mysql> select ASIN(0.2);
        -> 0.201358
mysql> select ASIN('foo');
        -> 0.000000

ATAN(X)

返回X的反正切值，即其正切值是X。
mysql> select ATAN(2);
        -> 1.107149
mysql> select ATAN(-2);
        -> -1.107149

ATAN2(X,Y)

返回2個變數X和Y的反正切。它類似於計算Y/X的反正切，除了兩個參數的符號被用來決定結果的像限。

mysql> select ATAN(-2,2);
        -> -0.785398
mysql> select ATAN(PI(),0);
        -> 1.570796

COT(X)

返回X的餘切。
mysql> select COT(12);
        -> -1.57267341
mysql> select COT(0);
        -> NULL

RAND()

RAND(N)

返回在範圍0到1.0內的隨機浮點值。如果一個整數參數N被指定，它被用作種子值。

mysql> select RAND();
        -> 0.5925
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND();
        -> 0.2079
mysql> select RAND();
        -> 0.7888

你不能在一個ORDER BY子句用RAND()值使用列，因為ORDER
    BY將重複計算列多次。然而在MySQL3.23中，你可以做：
    SELECT * FROM table_name ORDER BY RAND()，這是有利於得到一個來自SELECT
    * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的隨機樣本。注意在一個WHERE子句裡的一個RAND()將在每次WHERE被執行時重新評估。

LEAST(X,Y,...)

有2和2個以上的參數，返回最小(最小值)的參數。參數使用下列規則進行比較：

  • 如果返回值被使用在一個INTEGER上下文，或所有的參數都是整數值，他們作為整數比較。

    •

  • 如果返回值被使用在一個REAL上下文，或所有的參數是實數值，他們作為實數比較。

    •

  • 如果任何參數是一個大小敏感的字符串，參數作為大小寫敏感的字符串被比較。

    •

  • 在其他的情況下，參數作為大小寫無關的字符串被比較。
    •

mysql> select LEAST(2,0);
        -> 0
mysql> select LEAST(34.0,3.0,5.0,767.0);
        -> 3.0
mysql> select LEAST("B","A","C");
        -> "A"

在MySQL 3.22.5以前的版本，你可以使用MIN()而不是LEAST。

GREATEST(X,Y,...)

返回最大(最大值)的參數。參數使用與LEAST一樣的規則進行比較。

mysql> select GREATEST(2,0);
        -> 2
mysql> select GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0
mysql> select GREATEST("B","A","C");
        -> "C"

在MySQL在 3.22.5 以前的版本, 你能使用MAX()而不是GREATEST.

DEGREES(X)

返回參數X，從弧度變換為角度。
mysql> select DEGREES(PI());
        -> 180.000000

RADIANS(X)

返回參數X，從角度變換為弧度。
mysql> select RADIANS(90);
        -> 1.570796

TRUNCATE(X,D)

返回數字X，截斷為D位小數。如果D為0，結果將沒有小數點或小數部分。

mysql> select TRUNCATE(1.223,1);
        -> 1.2
mysql> select TRUNCATE(1.999,1);
        -> 1.9
mysql> select TRUNCATE(1.999,0);
        -> 1

7.4.10
字符串函數

如果結果的長度大於伺服器參數max_allowed_packet，字符串值函數返回NULL。見10.2.3 調節伺服器參數。

對於針對字符串位置的操作，第一個位置被標記為1。

ASCII(str)

返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串，返回0。如果str是NULL，返回NULL。

mysql> select ASCII('2');
        -> 50
mysql> select ASCII(2);
        -> 50
mysql> select ASCII('dx');
        -> 100

也可參見ORD()函數。

ORD(str)

如果字符串str最左面字符是一個多字節字符，通過以格式((first
    byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代碼值來返回多字節字符代碼。如果最左面的字符不是一個多字節字符。返回與ASCII()函數返回的相同值。
mysql> select ORD('2');
        -> 50

CONV(N,from_base,to_base)

在不同的數字基之間變換數字。返回數字N的字符串數字，從from_base基變換為to_base基，如果任何參數是NULL，返回NULL。參數N解釋為一個整數，但是可以指定為一個整數或一個字符串。最小基是2且最大的基是36。如果to_base是一個負數，N被認為是一個有符號數，否則，N被當作無符號數。
    CONV以64位點精度工作。
mysql> select CONV("a",16,2);
        -> '1010'
mysql> select CONV("6E",18,8);
        -> '172'
mysql> select CONV(-17,10,-18);
        -> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
        -> '40'

BIN(N)

返回二進制值N的一個字符串表示，在此N是一個長整數(BIGINT)數字，這等價於CONV(N,10,2)。如果N是NULL，返回NULL。

mysql> select BIN(12);
        -> '1100'

OCT(N)

返回八進制值N的一個字符串的表示，在此N是一個長整型數字，這等價於CONV(N,10,8)。如果N是NULL，返回NULL。

mysql> select OCT(12);
        -> '14'

HEX(N)

返回十六進制值N一個字符串的表示，在此N是一個長整型(BIGINT)數字，這等價於CONV(N,10,16)。如果N是NULL，返回NULL。

mysql> select HEX(255);
        -> 'FF'

CHAR(N,...)

CHAR()將參數解釋為整數並且返回由這些整數的ASCII代碼字符組成的一個字符串。NULL值被跳過。

mysql> select CHAR(77,121,83,81,'76');
        -> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
        -> 'MMM'

CONCAT(str1,str2,...)

返回來自於參數連結的字符串。如果任何參數是NULL，返回NULL。可以有超過2個的參數。一個數字參數被變換為等價的字符串形式。

mysql> select CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
        -> NULL
mysql> select CONCAT(14.3);
        -> '14.3'

LENGTH(str)

OCTET_LENGTH(str)

CHAR_LENGTH(str)

CHARACTER_LENGTH(str)

返回字符串str的長度。
mysql> select LENGTH('text');
        -> 4
mysql> select OCTET_LENGTH('text');
        -> 4

注意，對於多字節字符，其CHAR_LENGTH()僅計算一次。

LOCATE(substr,str)

POSITION(substr IN str)

返回子串substr在字符串str第一個出現的位置，如果substr不是在str裡面，返回0.

mysql> select LOCATE('bar', 'foobarbar');
        -> 4
mysql> select LOCATE('xbar', 'foobar');
        -> 0

該函數是多字節可靠的。

LOCATE(substr,str,pos)

返回子串substr在字符串str第一個出現的位置，從位置pos開始。如果substr不是在str裡面，返回0。
mysql> select LOCATE('bar', 'foobarbar',5);
        -> 7

這函數是多字節可靠的。

INSTR(str,substr)

返回子串substr在字符串str中的第一個出現的位置。這與有2個參數形式的LOCATE()相同，除了參數被顛倒。

mysql> select INSTR('foobarbar', 'bar');
        -> 4
mysql> select INSTR('xbar', 'foobar');
        -> 0

這函數是多字節可靠的。

LPAD(str,len,padstr)

返回字符串str，左面用字符串padstr填補直到str是len個字符長。

mysql> select LPAD('hi',4,'??');
        -> '??hi'

RPAD(str,len,padstr)

返回字符串str，右面用字符串padstr填補直到str是len個字符長。

mysql> select RPAD('hi',5,'?');
        -> 'hi???'

LEFT(str,len)

返回字符串str的最左面len個字符。
mysql> select LEFT('foobarbar', 5);
        -> 'fooba'

該函數是多字節可靠的。

RIGHT(str,len)

返回字符串str的最右面len個字符。
mysql> select RIGHT('foobarbar', 4);
        -> 'rbar'

該函數是多字節可靠的。

SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)

從字符串str返回一個len個字符的子串，從位置pos開始。使用FROM的變種形式是ANSI
    SQL92語法。
mysql> select SUBSTRING('Quadratically',5,6);
        -> 'ratica'

該函數是多字節可靠的。

SUBSTRING(str,pos)

SUBSTRING(str FROM pos)

從字符串str的起始位置pos返回一個子串。
mysql> select SUBSTRING('Quadratically',5);
        -> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
        -> 'barbar'

該函數是多字節可靠的。

SUBSTRING_INDEX(str,delim,count)

返回從字符串str的第count個出現的分隔符delim之後的子串。如果count是正數，返回最後的分隔符到左邊(從左邊數)
    的所有字符。如果count是負數，返回最後的分隔符到右邊的所有字符(從右邊數)。

mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'

該函數對多字節是可靠的。

LTRIM(str)

返回刪除了其前置空格字符的字符串str。
mysql> select LTRIM('  barbar');
        -> 'barbar'

RTRIM(str)

返回刪除了其拖後空格字符的字符串str。
mysql> select RTRIM('barbar   ');
        -> 'barbar'

該函數對多字節是可靠的。

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

返回字符串str，其所有remstr前綴或後綴被刪除了。如果沒有修飾符BOTH、LEADING或TRAILING給出，BOTH被假定。如果remstr沒被指定，空格被刪除。

mysql> select TRIM('  bar   ');
        -> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'

該函數對多字節是可靠的。

SOUNDEX(str)

返回str的一個同音字符串。聽起來“大致相同”的2個字符串應該有相同的同音字符串。一個“標準”的同音字符串長是4個字符，但是SOUNDEX()函數返回一個任意長的字符串。你可以在結果上使用SUBSTRING()得到一個“標準”的
    同音串。所有非數字字母字符在給定的字符串中被忽略。所有在A-Z之外的字符國際字母被當作元音。

mysql> select SOUNDEX('Hello');
        -> 'H400'
mysql> select SOUNDEX('Quadratically');
        -> 'Q36324'

SPACE(N)

返回由N個空格字符組成的一個字符串。
mysql> select SPACE(6);
        -> '      '

REPLACE(str,from_str,to_str)

返回字符串str，其字符串from_str的所有出現由字符串to_str代替。

mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'

該函數對多字節是可靠的。

REPEAT(str,count)

返回由重複countTimes次的字符串str組成的一個字符串。如果count
    <= 0，返回一個空字符串。如果str或count是NULL，返回NULL。

mysql> select REPEAT('MySQL', 3);
        -> 'MySQLMySQLMySQL'

REVERSE(str)

返回顛倒字符順序的字符串str。
mysql> select REVERSE('abc');
        -> 'cba'

該函數對多字節可靠的。

INSERT(str,pos,len,newstr)

返回字符串str，在位置pos起始的子串且len個字符長得子串由字符串newstr代替。

mysql> select INSERT('Quadratic', 3, 4, 'What');
        -> 'QuWhattic'

該函數對多字節是可靠的。

ELT(N,str1,str2,str3,...)

如果N= 1，返回str1，如果N= 2，返回str2，等等。如果N小於1或大於參數個數，返回NULL。ELT()是FIELD()反運算。

mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'

FIELD(str,str1,str2,str3,...)

返回str在str1, str2, str3, ...清單的索引。如果str沒找到，返回0。FIELD()是ELT()反運算。

mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0

FIND_IN_SET(str,strlist)

如果字符串str在由N子串組成的表strlist之中，返回一個1到N的值。一個字符串表是被“,”分隔的子串組成的一個字符串。如果第一個參數是一個常數字符串並且第二個參數是一種類型為SET的列，FIND_IN_SET()函數被最佳化而使用位運算！如果str不是在strlist裡面或如果strlist是空字符串，返回0。如果任何一個參數是NULL，返回NULL。如果第一個參數包含一個“,”，該函數將工作不正常。

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2

MAKE_SET(bits,str1,str2,...)

返回一個集合 (包含由“,”字符分隔的子串組成的一個字符串)，由相應的位在bits集合中的的字符串組成。str1對應於位0，str2對應位1，等等。在str1,
    str2, ...中的NULL串不添加到結果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
        -> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
        -> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
        -> ''

EXPORT_SET(bits,on,off,[separator,[number_of_bits]])

返回一個字符串，在這裡對於在“bits”中設定每一位，你得到一個“on”字符串，並且對於每個復位(reset)的位，你得到一個“off”字符串。每個字符串用“separator”分隔(預設“,”)，並且只有“bits”的“number_of_bits”
    (預設64)位被使用。
mysql> select EXPORT_SET(5,'Y','N',',',4)
        -> Y,N,Y,N

LCASE(str)

LOWER(str)

返回字符串str，根據當前字符集映射(預設是ISO-8859-1
    Latin1)把所有的字符改變成小寫。該函數對多字節是可靠的。
mysql> select LCASE('QUADRATICALLY');
        -> 'quadratically'

UCASE(str)

UPPER(str)

返回字符串str，根據當前字符集映射(預設是ISO-8859-1
    Latin1)把所有的字符改變成大寫。該函數對多字節是可靠的。
mysql> select UCASE('Hej');
        -> 'HEJ'

該函數對多字節是可靠的。

LOAD_FILE(file_name)

讀入文件並且作為一個字符串返回文件內容。文件必須在伺服器上，你必須指定到文件的完整路徑名，而且你必須有file權限。文件必須所有內容都是可讀的並且小於max_allowed_packet。如果文件不存在或由於上面原因之一不能被讀出，函數返回NULL。

mysql> UPDATE table_name
           SET blob_column=LOAD_FILE("/tmp/picture")
           WHERE id=1;

MySQL必要時自動變換數字為字符串，並且反過來也如此：

mysql> SELECT 1+"1";
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'

如果你想要明確地變換一個數字到一個字符串，把它作為參數傳遞到CONCAT()。

如果字符串函數提供一個二進制字符串作為參數，結果字符串也是一個二進制字符串。被變換到一個字符串的數字被當作是一個二進制字符串。這僅影響比較。

7.4.11
日期和時間函數

對於每個類型擁有的值範圍以及並且指定日期何時間值的有效格式的描述見7.3.6 日期和時間類型。

這裡是一個使用日期函數的例子。下面的查詢選擇了所有記錄，其date_col的值是在最後30天以內：

mysql> SELECT something FROM table
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

DAYOFWEEK(date)

返回日期date的星期索引(1=星期天，2=星期一,
    ……7=星期六)。這些索引值對應於ODBC標準。
mysql> select DAYOFWEEK('1998-02-03');
        -> 3

WEEKDAY(date)

返回date的星期索引(0=星期一，1=星期二,
    ……6= 星期天)。
mysql> select WEEKDAY('1997-10-04 22:23:00');
        -> 5
mysql> select WEEKDAY('1997-11-05');
        -> 2

DAYOFMONTH(date)

返回date的月份中日期，在1到31範圍內。

mysql> select DAYOFMONTH('1998-02-03');
        -> 3

DAYOFYEAR(date)

返回date在一年中的日數, 在1到366範圍內。

mysql> select DAYOFYEAR('1998-02-03');
        -> 34

MONTH(date)

返回date的月份，範圍1到12。
mysql> select MONTH('1998-02-03');
        -> 2

DAYNAME(date)

返回date的星期名字。
mysql> select DAYNAME("1998-02-05");
        -> 'Thursday'

MONTHNAME(date)

返回date的月份名字。
mysql> select MONTHNAME("1998-02-05");
        -> 'February'

QUARTER(date)

返回date一年中的季度，範圍1到4。
mysql> select QUARTER('98-04-01');
        -> 2

WEEK(date)

WEEK(date,first)

對於星期天是一周的第一天的地方，有一個單個參數，返回date的周數，範圍在0到52。2個參數形式WEEK()允許你指定星期是否開始於星期天或星期一。如果第二個參數是0，星期從星期天開始，如果第二個參數是1，從星期一開始。

mysql> select WEEK('1998-02-20');
        -> 7
mysql> select WEEK('1998-02-20',0);
        -> 7
mysql> select WEEK('1998-02-20',1);
        -> 8

YEAR(date)

返回date的年份，範圍在1000到9999。
mysql> select YEAR('98-02-03');
        -> 1998

HOUR(time)

返回time的小時，範圍是0到23。
mysql> select HOUR('10:05:03');
        -> 10

MINUTE(time)

返回time的分鐘，範圍是0到59。
mysql> select MINUTE('98-02-03 10:05:03');
        -> 5

SECOND(time)

回來time的秒數，範圍是0到59。
mysql> select SECOND('10:05:03');
        -> 3

PERIOD_ADD(P,N)

增加N個月到階段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意階段參數P 不是日期值。

mysql> select PERIOD_ADD(9801,2);
        -> 199803

PERIOD_DIFF(P1,P2)

返回在時期P1和P2之間月數，P1和P2應該以格式YYMM或YYYYMM。注意，時期參數P1和P2 不是日期值。

mysql> select PERIOD_DIFF(9802,199703);
        -> 11

DATE_ADD(date,INTERVAL expr type)

DATE_SUB(date,INTERVAL expr type)

ADDDATE(date,INTERVAL expr type)

SUBDATE(date,INTERVAL expr type)

這些功能執行日期運算。對於MySQL 3.22，他們是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同義詞。在MySQL
    3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（見例子）date是一個指定開始日期的DATETIME或DATE值，expr是指定加到開始日期或從開始日期減去的間隔值一個表達式，expr是一個字符串﹔它可以以一個“-”開始表示負間隔。type是一個關鍵詞，指明表達式應該如何被解釋。EXTRACT(type
    FROM date)函數從日期中返回“type”間隔。下表顯示了type和expr參數怎樣被關聯：

        type 值
         | 含義
         | 期望的 expr 格式

        SECOND
         | 秒
         | SECONDS

        MINUTE
         | 分鐘
         | MINUTES

        HOUR
         | 時間
         | HOURS

        DAY
         | 天
         | DAYS

        MONTH
         | 月
         | MONTHS

        YEAR
         | 年
         | YEARS

        MINUTE_SECOND
         | 分鐘和秒
         | "MINUTES:SECONDS"

        HOUR_MINUTE
         | 小時和分鐘
         | "HOURS:MINUTES"

        DAY_HOUR
         | 天和小時
         | "DAYS HOURS"

        YEAR_MONTH
         | 年和月
         | "YEARS-MONTHS"

        HOUR_SECOND
         | 小時, 分鐘，
         | "HOURS:MINUTES:SECONDS"

        DAY_MINUTE
         | 天, 小時, 分鐘
         | "DAYS HOURS:MINUTES"

        DAY_SECOND
         | 天, 小時, 分鐘, 秒
         | "DAYS HOURS:MINUTES:SECONDS"

MySQL在expr格式中允許任何標點分隔符。表示顯示的是建議的分隔符。如果date參數是一個DATE值並且你的計算僅僅包含YEAR、MONTH和DAY部分(即，沒有時間部分)，結果是一個DATE值。否則結果是一個DATETIME值。

mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
        -> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
        -> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
       -> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 SECOND);
        -> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 DAY);
        -> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL "1:1" MINUTE_SECOND);
        -> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
                       INTERVAL "1 1:1:1" DAY_SECOND);
        -> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
                       INTERVAL "-1 10" DAY_HOUR);
        -> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
        -> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
       -> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
       -> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
       -> 20102

如果你指定太短的間隔值(不包括type關鍵詞期望的間隔部分)，MySQL假設你省掉了間隔值的最左面部分。例如，如果你指定一個type是DAY_SECOND，值expr被希望有天、小時、分鐘和秒部分。如果你像"1:10"這樣指定值，MySQL假設日子和小時部分是丟失的並且值代表分鐘和秒。換句話說，"1:10"
    DAY_SECOND以它等價於"1:10" MINUTE_SECOND的方式解釋，這對那MySQL解釋TIME值表示經過的時間而非作為一天的時間的方式有二義性。如果你使用確實不正確的日期，結果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR並且結果日期大於新月份的最大值天數，日子在新月用最大的天調整。

mysql> select DATE_ADD('1998-01-30', Interval 1 month);
        -> 1998-02-28

注意，從前面的例子中詞INTERVAL和type關鍵詞不是區分大小寫的。

TO_DAYS(date)

給出一個日期date，返回一個天數(從0年的天數)。
mysql> select TO_DAYS(950501);
        -> 728779
mysql> select TO_DAYS('1997-10-07');
        -> 729669

TO_DAYS()不打算用於使用格列高裡歷(1582)出現前的值。

FROM_DAYS(N)

給出一個天數N，返回一個DATE值。
mysql> select FROM_DAYS(729669);
        -> '1997-10-07'

TO_DAYS()不打算用於使用格列高裡歷(1582)出現前的值。

DATE_FORMAT(date,format)

根據format字符串格式化date值。下列修飾符可以被用在format字符串中：

        %M
         | 月名字(January……December)

        %W
         | 星期名字(Sunday……Saturday)

        %D
         | 有英語前綴的月份的日期(1st, 2nd, 3rd,
        等等。）

        %Y
         | 年, 數字, 4 位

        %y
         | 年, 數字, 2 位

        %a
         | 縮寫的星期名字(Sun……Sat)

        %d
         | 月份中的天數, 數字(00……31)

        %e
         | 月份中的天數, 數字(0……31)

        %m
         | 月, 數字(01……12)

        %c
         | 月, 數字(1……12)

        %b
         | 縮寫的月份名字(Jan……Dec)

        %j
         | 一年中的天數(001……366)

        %H
         | 小時(00……23)

        %k
         | 小時(0……23)

        %h
         | 小時(01……12)

        %I
         | 小時(01……12)

        %l
         | 小時(1……12)

        %i
         | 分鐘, 數字(00……59)

        %r
         | 時間,12 小時(hh:mm:ss [AP]M)

        %T
         | 時間,24 小時(hh:mm:ss)

        %S
         | 秒(00……59)

        %s
         | 秒(00……59)

        %p
         | AM或PM

        %w
         | 一個星期中的天數(0=Sunday ……6=Saturday ）

        %U
         | 星期(0……52), 這裡星期天是星期的第一天

        %u
         | 星期(0……52), 這裡星期一是星期的第一天

        %%
        一個文字“%”。

所有的其他字符不做解釋被複製到結果中。

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
        -> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%D %y %a %d %m %b %j');
        -> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'

MySQL3.23中，在格式修飾符字符前需要%。在MySQL更早的版本中，%是可選的。

TIME_FORMAT(time,format)

這像上面的DATE_FORMAT()函數一樣使用，但是format字符串只能包含處理小時、分鐘和秒的那些格式修飾符。其他修飾符產生一個NULL值或0。

CURDATE()

CURRENT_DATE

以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取決於函數是在一個字符串還是數字上下文被使用。

mysql> select CURDATE();
        -> '1997-12-15'
mysql> select CURDATE() + 0;
        -> 19971215

CURTIME()

CURRENT_TIME

以'HH:MM:SS'或HHMMSS格式返回當前時間值，取決於函數是在一個字符串還是在數字的上下文被使用。

mysql> select CURTIME();
        -> '23:50:26'
mysql> select CURTIME() + 0;
        -> 235026

NOW()

SYSDATE()

CURRENT_TIMESTAMP

以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回當前的日期和時間，取決於函數是在一個字符串還是在數字的上下文被使用。

mysql> select NOW();
        -> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
        -> 19971215235026

UNIX_TIMESTAMP()

UNIX_TIMESTAMP(date)

如果沒有參數調用，返回一個Unix時間戳記(從'1970-01-01 00:00:00'GMT開始的秒數)。如果UNIX_TIMESTAMP()用一個date參數被調用，它返回從'1970-01-01
    00:00:00' GMT開始的秒數值。date可以是一個DATE字符串、一個DATETIME字符串、一個TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地時間的一個數字。

mysql> select UNIX_TIMESTAMP();
        -> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580

當UNIX_TIMESTAMP被用於一個TIMESTAMP列，函數將直接接受值，沒有隱含的“string-to-unix-timestamp”變換。

FROM_UNIXTIME(unix_timestamp)

以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp參數所表示的值，取決於函數是在一個字符串還是或數字上下文中被使用。

mysql> select FROM_UNIXTIME(875996580);
        -> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
        -> 19971004222300

FROM_UNIXTIME(unix_timestamp,format)

返回表示 Unix 時間標記的一個字符串，根據format字符串格式化。format可以包含與DATE_FORMAT()函數列出的條目同樣的修飾符。

mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
                            '%Y %D %M %h:%i:%s %x');
        -> '1997 23rd December 03:43:30 x'

SEC_TO_TIME(seconds)

返回seconds參數，變換成小時、分鐘和秒，值以'HH:MM:SS'或HHMMSS格式化，取決於函數是在一個字符串還是在數字上下文中被使用。

mysql> select SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
        -> 3938

TIME_TO_SEC(time)

返回time參數，轉換成秒。
mysql> select TIME_TO_SEC('22:23:00');
        -> 80580
mysql> select TIME_TO_SEC('00:39:38');
        -> 2378

7.4.12
其他函數

DATABASE()

返回當前的資料庫名字。
mysql> select DATABASE();
        -> 'test'

如果沒有當前的資料庫，DATABASE()返回空字符串。

USER()

SYSTEM_USER()

SESSION_USER()

返回當前MySQL用戶名。
mysql> select USER();
        -> 'davida@localhost'

在MySQL 3.22.11或以後版本中，這包括用戶名和客戶主機名。你可以像這樣只提取用戶名部分(值是否包括主機名部分均可工作)：

mysql> select substring_index(USER(),"@",1);
        -> 'davida'

PASSWORD(str)

從純文本密碼str計算一個密碼字符串。該函數被用於為了在user授權表的Password列中儲存密碼而加密MySQL密碼。

mysql> select PASSWORD('badpwd');
        -> '7f84554057dd964b'

PASSWORD()加密是非可逆的。PASSWORD()不以與Unix密碼加密的相同的方法執行密碼加密。你不應該假定如果你的Unix
    密碼和你的MySQL密碼是一樣的，PASSWORD()將導致與在Unix密碼文件儲存的相同的加密值。見ENCRYPT()。

ENCRYPT(str[,salt])

使用Unix crypt()系統調用加密str。salt參數應該是一個有2個字符的字符串。（MySQL
    3.22.16中，salt可以長於2個字符。）
mysql> select ENCRYPT("hello");
        -> 'VxuFAJXVARROc'

如果crypt()在你的系統上不可用，ENCRYPT()總是返回NULL。ENCRYPT()只保留str起始8個字符而忽略所有其他，至少在某些系統上是這樣。這將由底層的crypt()系統調用的行為決定。

ENCODE(str,pass_str)

使用pass_str作為密碼加密str。為了解密結果，使用DECODE()。結果是一個二進制字符串，如果你想要在列中保存它，使用一個BLOB列類型。

DECODE(crypt_str,pass_str)

使用pass_str作為密碼解密加密的字符串crypt_str。crypt_str應該是一個由ENCODE()返回的字符串。

MD5(string)

對字符串計算MD5校驗和。值作為一個32長的十六進制數字被返回可以，例如用作哈希(hash)鍵。

mysql> select MD5("testing")
        -> 'ae2b1fca515949e5d54fb22b8ed95575'

這是一個“RSA數據安全公司的MD5消息摘要算法”。

LAST_INSERT_ID([expr])

返回被插入一個AUTO_INCREMENT列的最後一個自動產生的值。見20.4.29 mysql_insert_id()。
mysql> select LAST_INSERT_ID();
        -> 195

產生的最後ID以每個連接為基礎在伺服器被維護，它不會被其他客戶改變。如果你更新另外一個有非魔術值(即，不是NULL和不是0的一個值)的AUTO_INCREMENT列，它甚至不會被改變。如果expr作為一個參數在一個UPDATE子句的LAST_INSERT_ID()裡面給出，那麼參數值作為一個LAST_INSERT_ID()值被返回。這可以用來模仿順序：首先創建表：

mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);

然後表能被用來產生順序號，像這樣：

mysql> update sequence set id=LAST_INSERT_ID(id+1);

你可以不調用LAST_INSERT_ID()而產生順序，但是這樣使用函數的實用程式在伺服器上自動維護ID值作為最後自動產生的值。你可以檢索新的ID值，就像你能讀入正常MySQL中的任何正常的AUTO_INCREMENT值一樣。例如，LAST_INSERT_ID()（沒有一個參數
    )將返回新ID。C API函數mysql_insert_id()也可被用來得到值。

FORMAT(X,D)

格式化數字X為類似於格式'#,###,###.##'，四捨五入到D為小數。如果D為0，結果將沒有小數點和小數部分。

mysql> select FORMAT(12332.123456, 4);
        -> '12,332.1235'
mysql> select FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> select FORMAT(12332.2,0);
        -> '12,332'

VERSION()

返回表明MySQL伺服器版本的一個字符串。
mysql> select VERSION();
        -> '3.22.19b-log'

GET_LOCK(str,timeout)

試圖獲得由字符串str給定的一個名字的鎖定，第二個timeout為超時。如果鎖定成功獲得，返回1，如果嘗試超時了，返回0，或如果發生一個錯誤，返回NULL(例如從記憶體溢位或執行緒用mysqladmin
    kill被殺死)。當你執行RELEASE_LOCK()時、執行一個新的GET_LOCK()或執行緒終止時，一個鎖定被釋放。該函數可以用來實現應用鎖或模擬記錄鎖，它阻止其他客戶用同樣名字的鎖定請求﹔贊成一個給定的鎖定字符串名字的客戶可以使用字符串執行子協作建議的鎖定。

mysql> select GET_LOCK("lock1",10);
        -> 1
mysql> select GET_LOCK("lock2",10);
        -> 1
mysql> select RELEASE_LOCK("lock2");
        -> 1
mysql> select RELEASE_LOCK("lock1");
        -> NULL

注意，第二個RELEASE_LOCK()調用返回NULL，因為鎖"lock1"自動地被第二個GET_LOCK()調用釋放。

RELEASE_LOCK(str)

釋放字符串str命名的通過GET_LOCK()獲得的鎖。如果鎖被釋放，返回1，如果鎖沒被這個執行緒鎖定(在此情況下鎖沒被釋放)返回0，並且如果命名的鎖不存在，返回NULL。如果鎖從來沒有通過調用GET_LOCK()獲得或如果它已經被釋放了，鎖將不存在。

BENCHMARK(count,expr)

BENCHMARK()函數重複countTimes次執行表達式expr，它可以用於計時MySQL處理表達式有多快。結果值總是0。意欲用於mysql客戶，它報告查詢的執行時間。

mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

報告的時間是客戶端的經過時間，不是在伺服器端的CPU時間。執行BENCHMARK()若干次可能是明智的，並且注意伺服器機器的負載有多重來解釋結果。

7.4.13 與GROUP
BY子句一起使用的函數

如果你在不包含GROUP BY子句的一個語句中使用聚合函數，它等價於聚合所有行。

COUNT(expr)

返回由一個SELECT語句檢索出來的行的非NULL值的數目。

mysql> select student.student_name,COUNT(*)
           from student,course
           where student.student_id=course.student_id
           GROUP BY student_name;

COUNT(*)在它返回的檢索出來的行數目上有些不同，不管他們是否包含NULL值。如果SELECT從一個表檢索，或沒有檢索出其他列並且沒有WHERE子句，COUNT(*)被最佳化以便快速地返回。例如：

mysql> select COUNT(*) from student;

COUNT(DISTINCT expr,[expr...])

返回一個不同值的數目。
mysql> select COUNT(DISTINCT results) from student;

在MySQL中，你可以通過給出一個表達式列表以得到不同的表達式組合的數目。在
    ANSI SQL中，你可能必須在CODE(DISTINCT ..)內進行所有表達式的連接。

AVG(expr)

返回expr的平均值。
mysql> select student_name, AVG(test_score)
           from student
           GROUP BY student_name;

MIN(expr)

MAX(expr)

返回expr的最小或最大值。MIN()和MAX()可以有一個字符串參數﹔在這種的情況下，他們返回最小或最大的字符串值。

mysql> select student_name, MIN(test_score), MAX(test_score)
           from student
           GROUP BY student_name;

SUM(expr)

返回expr的和。注意，如果返回的集合沒有行，它返回NULL！

STD(expr)

STDDEV(expr)

返回expr標準差(deviation)。這是對 ANSI SQL
    的擴展。該函數的形式STDDEV()是提供與Oracle的兼容性。

BIT_OR(expr)

返回expr裡所有位的位或。計算用 64 位(BIGINT)精度進行。

BIT_AND(expr)

返回expr裡所有位的位與。計算用 64 位(BIGINT)精度進行。

MySQL擴展了GROUP BY的用法。你可以不出現在的GROUP
BY部分的SELECT表達式中使用列或計算，這表示這個組的任何可能值。你可以使用它是性能更好，避免在不必要的項目上排序和分組。例如，你在下列查詢中不需要在customer.name上聚合：

mysql> select order.custid,customer.name,max(payments)
       from order,customer
       where order.custid = customer.custid
       GROUP BY order.custid;

在 ANSI SQL中，你將必須將customer.name加到GROUP BY子句。在MySQL中，名字是冗餘的。

如果你從GROUP BY部分省略的列在組中不是唯一的，不要使用這個功能。

在某些情況下，你可以使用MIN()和MAX()獲得一個特定的列值，即使它不是唯一的。下例給出從包含sort列中最小值的行的column值：

substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)))

注意，如果你正在使用MySQL
3.22(或更早)或如果你正在試圖遵從ANSI SQL，你不能在GROUP BY或ORDER
BY子句中使用表達式。你可以通過使用表達式的一個別名解決此限制：

mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name
           GROUP BY id,val ORDER BY val;

在MySQL3.23中，你可以這樣做：

mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();

7.5 CREATE
DATABASE句法

CREATE DATABASE db_name

CREATE DATABASE用給定的名字創建一個資料庫。允許的資料庫名字規則在7.1.5
資料庫、桌子、索引、列和別名命名中給出。如果資料庫已經存在，發生一個錯誤。

在MySQL中的資料庫實現成包含對應資料庫中表的文件的目錄。因為資料庫在初始創建時沒有任何表，CREATE
DATABASE語句只是在MySQL數據目錄下面創建一個目錄。

你也可以用mysqladmin創建資料庫。見12.1 不同的MySQL程式的概述。

7.6 DROP DATABASE句法

DROP DATABASE [IF EXISTS] db_name

DROP DATABASE刪除資料庫中的所有表和資料庫。要小心地使用這個命令！

DROP DATABASE返回從資料庫目錄被刪除的文件的數目。通常，這3倍於表的數量，因為每張表對應於一個“.MYD”文件、一個“.MYI”文件和一個“.frm”文件。

在MySQL 3.22或以後版本中，你可以使用關鍵詞IF
EXISTS阻止一個錯誤的發生，如果資料庫不存在。

你也可以用mysqladmin丟棄資料庫。見12.1 不同的 MySQL 程式的概述。

7.7 CREATE TABLE句法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]

create_definition:
  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
            [PRIMARY KEY] [reference_definition]
  or    PRIMARY KEY (index_col_name,...)
  or    KEY [index_name] (index_col_name,...)
  or    INDEX [index_name] (index_col_name,...)
  or    UNIQUE [INDEX] [index_name] (index_col_name,...)
  or    [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
            [reference_definition]
  or    CHECK (expr)

type:
        TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  or    INT[(length)] [UNSIGNED] [ZEROFILL]
  or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  or    NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  or    CHAR(length) [BINARY]
  or    VARCHAR(length) [BINARY]
  or    DATE
  or    TIME
  or    TIMESTAMP
  or    DATETIME
  or    TINYBLOB
  or    BLOB
  or    MEDIUMBLOB
  or    LONGBLOB
  or    TINYTEXT
  or    TEXT
  or    MEDIUMTEXT
  or    LONGTEXT
  or    ENUM(value1,value2,value3,...)
  or    SET(value1,value2,value3,...)

index_col_name:
        col_name [(length)]

reference_definition:
        REFERENCES tbl_name [(index_col_name,...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE reference_option]
                   [ON UPDATE reference_option]

reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    TYPE = {ISAM | MYISAM | HEAP}
or	AUTO_INCREMENT = #
or	AVG_ROW_LENGTH = #
or	CHECKSUM = {0 | 1}
or	COMMENT = "string"
or	MAX_ROWS = #
or	MIN_ROWS = #
or	PACK_KEYS = {0 | 1}
or	PASSWORD = "string"
or	DELAY_KEY_WRITE = {0 | 1}
or      ROW_FORMAT= { default | dynamic | static | compressed }

select_statement:
    [IGNORE | REPLACE] SELECT ...  (Some legal select statement)

CREATE TABLE在當前資料庫刈谻給出的名字創建一個資料庫表。允許的表名的規則在7.1.5
資料庫，桌子，索引，列和別名命名中給出。如果當前資料庫不存在或如果表已經存在，出現一個錯誤。

在MySQL3.22或以後版本中，表名可以被指定為db_name.tbl_name，不管有沒有當前的資料庫都可以。

在MySQL3.23中，當你創建一張表時，你可以使用TEMPORARY關鍵詞。如果一個連接死掉，臨時表將自動被刪除，並且其名字是按連接命名。這意味著，2個不同的連接能使用相同的暫時表的名字而不會彼此衝突或與相同名字的現有資料庫表衝突。（現有的表被隱蔽直到臨時表被刪除）。

在MySQL3.23或以後版本中，你可以使用關鍵詞IF NOT
EXISTS以便如果表已經存在不發生一個錯誤。注意，無法証實表結構是相同的。

每張表tbl_name由在資料庫目錄的一些文件表示。在MyISAM類型的表的情況下，你將得到：

文件 | 目的
tbl_name.frm | 表定義(表格)文件
tbl_name.MYD | 數據文件
tbl_name.MYI | 索引文件

對於各種列類型的性質的更多資訊，見7.3 列類型。

  • 如果既不指定NULL也不指定NOT NULL，列被視為指定了NULL。

    •

  • 整型列可以有附加的屬性AUTO_INCREMENT。當你插入NULL值（推薦)或0到一個AUTO_INCREMENT列中時，列被設置為value+1，在此value是當前表中的列的最大值。AUTO_INCREMENT順序從1開始。見20.4.29 mysql_insert_id()。如果你刪除了包含一個AUTO_INCREMENT列的最大值的行，值將被重新使用。如果你刪除表中所有的行，順序重新開始。注意：每個表只能有一個AUTO_INCREMENT列，並且它必須被索引。為了使做MySQL兼容一些
    ODBC 應用程式，用下列查詢你可以找出最後插入的行：
    SELECT * FROM tbl_name WHERE auto_col IS NULL

    •

  • NULL值對於TIMESTAMP列的處理不同於其他列類型。你不能在一個TIMESTAMP列中儲存一個文字NULL﹔設置列為NULL將把它設成當前的日期和時間。因為TIMESTAMP列表現就這樣，NULL和NOT
    NULL屬性不以一般方式運用並且如果你指定它們，將被忽略。在另一方面，為了使它MySQL客戶更容易地使用TIMESTAMP列，伺服器報告這樣的列可以被賦值NULL(
    它是對的)，盡管TIMESTAMP實際上絕不包含一個NULL值。當你使用DESCRIBE
    tbl_name得到有關你的表的描述時，你就會明白。注意，設置一個TIMESTAMP列為0不同於將它設置為NULL，因為0是一個有效的TIMESTAMP值。

    •

  • 如果沒有為列指定DEFAULT值，MySQL自動地分配一個。如果列可以取NULL作為值，預設值是NULL。如果列被聲明為NOT
    NULL，預設值取決於列類型：

    • 對於沒有聲明AUTO_INCREMENT屬性的數字類型，預設值是0。對於一個AUTO_INCREMENT列，預設值是在順序中的下一個值。

      •

    • 對於除TIMESTAMP的日期和時間類型，預設值是該類型適當的“零”值。對於表中第一個TIMESTAMP列，預設值是當前的日期和時間。見7.3.6 日期和時間類型。
      •

    • 對於除ENUM的字符串類型，預設是空字符串。對於ENUM，預設值是第一個枚舉值。

      •

    •

  • KEY是INDEX的一個同義詞。
    •

  • 在MySQL中，一個UNIQUE鍵只能有不同的值。如果你試圖用匹配現有行的鍵來增加新行，發生一個錯誤。

    •

  • A PRIMARY KEY是一個唯一KEY，它有額外的限制，即所有的關鍵列必須被定義為NOT
    NULL。在MySQL中，鍵被命名為PRIMARY。一張表只能有一個PRIMARY
    KEY。如果在表中你沒有一個PRIMARY KEY並且一些應用程式要求PRIMARY
    KEY，MySQL將返回第一個UNIQUE鍵，它沒有任何NULL列，作為PRIMARY
    KEY。
    •

  • 一個PRIMARY KEY可以是一個多列索引。然而，你不能在一個列說明中使用PRIMARY
    KEY的關鍵字屬性創建一個多列索引。這樣做將僅僅標記單個列作為主鍵。你必須使用PRIMARY
    KEY(index_col_name, ...)語法。
    •

  • 如果你不能給索引賦予一個名字，這個索引將賦予與第一個index_col_name相同的名字，用一個可選的suffix(_2,
    _3, ...)使它唯一。你能使用SHOW INDEX FROM
    tbl_name看到一張表的索引名字。見7.21
    SHOW句法(得到表、列等的資訊）。
    •

  • 只有MyISAM表類型支援可以有NULL值的列上的索引。在其他情況下，你必須聲明這樣的列為NOT
    NULL，否則導致一個錯。
    •

  • 用col_name(length)語法，你可以指定僅使用部分的CHAR或VARCHAR列的一個索引。這能使索引文件變得更小。見7.3.9 列索引。
    •

  • 只有MyISAM表類型支援BLOB和TEXT列的索引。當在一個BLOB或TEXT列上放置索引時，你必須總是指定索引的長度：

    CREATE TABLE test (blob_col BLOB, index(blob_col(10)));

    •

  • 當你與TEXT或BLOB列一起使用ORDER BY或GROUP
    BY時，只使用頭max_sort_length個字節。見7.3.7.2 BLOB和TEXT類型。

    •

  • FOREIGN KEY、CHECK和REFERENCES子句實際上不做任何事情，其語法僅僅提供兼容性，使得它更容易從其他的SQL伺服器移植代碼並運行借助引用創建表的應用。見5.4 MySQL缺少的功能。
    •

  • 每個NULL列占據額外一位，取舍到最接近的字節。
    •

  • 最大記錄長度以字節計可以如下計算：
    row length = 1
             + (sum of column lengths)
             + (number of NULL columns + 7)/8
             + (number of variable-length columns)

    •

  • table_options和SELECT選項只在MySQL 3.23和以後版本中被實現。不同的表類型是：

        ISAM
         | 原來的表處理器

        MyISAM
         | 全新二進制可移植的表處理器

        HEAP
         | 用於該表的數據僅僅儲存在內存中

    見9.4 MySQL 表類型。其他表選項被用來最佳化表的行為。在大多數情況下，你不必指定他們任何一個。選項對所有表都適用，如果不是則說明。

        AUTO_INCREMENT
         | 你想要為你的表設定的下一個 auto_increment 值 ( MyISAM ）

        AVG_ROW_LENGTH
         | 你的表的平均行長度的近似值。你只需要為有變長記錄的表設置它。

        CHECKSUM
         | 如果你想要MySQL對每行維持一個校驗和(使表變得更慢以更新但是使它更容易找出損壞的表)設置它為1
        ( MyISAM )

        COMMENT
         | 對於你的表的一篇60個字符的注釋

        MAX_ROWS
         | 你計劃在表中儲存的行的最大數目

        MIN_ROWS
         | 你計劃在表中儲存的行的最小數目

        PACK_KEYS
         | 如果你想要有更小的索引，將它設為1。這通常使的更新更慢並且讀取更快(MyISAM，ISAM)。

        PASSWORD
         | 用一個密碼加密.frm文件。該選項在標準MySQL版本中不做任何事情。

        DELAY_KEY_WRITE
         | 如果想要推遲關鍵表的更新直到表被關閉(MyISAM)，將它設置為1。

        ROW_FORMAT
         | 定義行應該如何被儲存(為了將來)。

    當你使用一個MyISAM表時，MySQL使用max_rows
    * avg_row_length的乘積決定最終的表將有多大。如果你不指定上面的任何選項，對一個表的最大尺寸將是4G(或2G，如果你的作業系統僅支援2G的表)。

    •

  • 如果你在CREATE語句後指定一個SELECT，MySQL將為在SELECT中所有的單元創鍵新字段。例如：

    mysql> CREATE TABLE test (a int not null auto_increment,
           primary key (a), key(b))
           TYPE=HEAP SELECT b,c from test2;

    這將創建一個有3個列的HEAP表。注意如果在拷貝數據進表時發生任何錯誤，表將自動被刪除。

    •

7.7.1
隱含的列說明改變

在某些情況下，MySQL隱含地改變在一個CREATE TABLE語句給出的一個列說明。（這也可能在ALTER
TABLE。）

  • 長度小於4的VARCHAR被改變為CHAR。
    •

  • 如果在一個表中的任何列有可變長度，結果是整個行是變長的。因此,
    如果一張表包含任何變長的列(VARCHAR、TEXT或BLOB)，所有大於3個字符的CHAR列被改變為VARCHAR列。這在任何方面都不影響你如何使用列﹔在MySQL中，VARCHAR只是儲存字符的一個不同方法。MySQL實施這種改變，是因為它節省空間並且使表操作更快捷。見10.6 選擇一種表格類型。
    •

  • TIMESTAMP的顯示尺寸必須是偶數且在2 ∼ 14的範圍內。如果你指定0顯示尺寸或比14大，尺寸被強制為14。從1∼13範圍內的奇數值尺寸被強制為下一個更大的偶數。

    •

  • 你不能在一個TIMESTAMP列裡面儲存一個文字NULL﹔將它設為NULL將設置為當前的日期和時間。因為TIMESTAMP列表現就是這樣，NULL和NOT
    NULL屬性不以一般的方式運用並且如果你指定他們，將被忽略。DESCRIBE
    tbl_name總是報告該TIMESTAMP列可能賦予了NULL值。

    •

  • MySQL將其他SQL資料庫供應商使用的某個列類型映射到MySQL類型。見7.3.11
    只用其他資料庫引擎的類型。
    •

如果你想要知道MySQL是否使用了除你指定的以外的一種列類型，在創建或改變你的表之後，發出一個DESCRIBE
tbl_name語句即可。

如果你使用myisampack壓縮一個表，可能會發生改變某些其他的列類型。見10.6.3 壓縮表的特徵。

7.8 ALTER TABLE句法

ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]

alter_specification:
        ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
  or    ADD INDEX [index_name] (index_col_name,...)
  or    ADD PRIMARY KEY (index_col_name,...)
  or    ADD UNIQUE [index_name] (index_col_name,...)
  or    ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  or    CHANGE [COLUMN] old_col_name create_definition
  or    MODIFY [COLUMN] create_definition
  or    DROP [COLUMN] col_name
  or    DROP PRIMARY KEY
  or    DROP INDEX index_name
  or    RENAME [AS] new_tbl_name
  or    table_options

ALTER TABLE允許你修改一個現有表的結構。例如，你可以增加或刪除列、創造或消去索引、改變現有列的類型、或重新命名列或表本身。你也能改變表的注釋和表的類型。見7.7 CREATE TABLE句法。

如果你使用ALTER TABLE修改一個列說明但是DESCRIBE
tbl_name顯示你的列並沒有被修改，這可能是MySQL因為在7.7.1 隱含的列說明改變中描述的原因之一而忽略了你的修改。例如，如果你試圖將一個VARCHAR改為CHAR，MySQL將仍然使用VARCHAR，如果表包含其他變長的列。

ALTER TABLE通過制作原來表的一個臨時副本來工作。修改在副本上施行，然後原來的表被刪除並且重新命名一個新的。這樣做使得所有的修改自動地轉向到新表，沒有任何失敗的修改。當ALTER
TABLE正在執行時，原來的桌可被其他客戶讀取。更新和寫入表被延遲到新表準備好了為止。

  • 為了使用ALTER TABLE，你需要在表上的select、insert、delete、update、create和drop的權限。

    •

  • IGNORE是MySQL對ANSI SQL92
    的一個擴充，如果在新表中的唯一鍵上有重複，它控制ALTER TABLE如何工作。如果IGNORE沒被指定，副本被放棄並且恢復原狀。如果IGNORE被指定，那麼對唯一鍵有重複的行，只有使用第一行﹔其餘被刪除。

    •

  • 你可以在單個ALTER TABLE語句中發出多個ADD、ALTER、DROP和CHANGE子句。這是MySQL對ANSI
    SQL92的一個擴充，SQL92在每個ALTER TABLE語句刈荿允許一個子句。

    •

  • CHANGE col_name、DROP col_name和DROP INDEX是MySQL對
    ANSI SQL92 的擴充。
    •

  • MODIFY是 Oracle 對ALTER TABLE的擴充。
    •

  • 可選的詞COLUMN是一個純粹的噪音且可以省略。
    •

  • 如果你使用ALTER TABLE tbl_name RENAME AS new_name而沒有任何其他選項，MySQL簡單地重命名對應於表tbl_name的文件。沒有必要創建臨時表。

    •

  • create_definition子句使用CREATE TABLE相同的ADD和CHANGE語法。注意語法包括列名字，不只列類型。見7.7 CREATE TABLE句法。
    •

  • 你可以使用CHANGE old_col_name create_definition子句重命名一個列。為了這樣做，指定舊的和新的列名字和列當前有的類型。例如，重命名一個INTEGER列，從a到b，你可以這樣做：

    mysql> ALTER TABLE t1 CHANGE a b INTEGER;

    如果你想要改變列的類型而非名字，就算他們是一樣的，CHANGE語法仍然需要2個列名。例如：

    mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

    然而，在MySQL3.22.16a，你也可以使用MODIFY來改變列的類型而不是重命名它：

    mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

    •

  • 如果你使用CHANGE或MODIFY縮短一個列，一個索引存在於該列的部分(例如，如果你有一個VARCHAR列的頭10個字符的索引)，你不能使列短於被索引的字符數目。

    •

  • 當你使用CHANGE或MODIFY改變一個列類型時，MySQL盡可能試圖很好地變換數據到新類型。

    •

  • 在MySQL3.22或以後，你能使用FIRST或ADD ...
    AFTER col_name在一個表的行內在一個特定的位置增加列。預設是增加到最後一列。

    •

  • ALTER COLUMN為列指定新的預設值或刪除老的預設值。如果老的預設值被刪除且列可以是NULL，新預設值是NULL。如果列不能是NULL，MySQL賦予一個預設值。預設值賦值在7.7 CREATE TABLE句法中描述。

    •

  • DROP INDEX刪除一個索引。這是MySQL對 ANSI SQL92
    的一個擴充。
    •

  • 如果列從一張表中被丟棄，列也從他們是組成部分的任何索引中被刪除。如果組成一個索引的所有列被丟棄，該索引也被丟棄。

    •

  • DROP PRIMARY KEY丟棄主索引。如果這樣的索引不存在，它丟棄表中第一個UNIQUE索引。(如果沒有明確地指定PRIMARY
    KEY，MySQL標記第一個UNIQUE鍵為PRIMARY
    KEY。）
    •

  • 用 C API 函數mysql_info()，你能找出多少記錄被拷貝，
    和(當使用IGNORE時)由於唯一鍵值的重複多少記錄被刪除。
    •

  • FOREIGN KEY、CHECK和REFERENCES子句實際上不做任何事情，他們的句法僅僅提供兼容性，使得更容易地從其他SQL伺服器移植代碼並且運行借助引用來創建表的應用程式。見5.4 MySQL缺少的功能。
    •

這裡是一個例子，顯示了一些ALTER TABLE用法。我們以一個如下創建的表t1開始：

mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

重命名表，從t1到t2:

mysql> ALTER TABLE t1 RENAME t2;

為了改變列a，從INTEGER改為TINYINT NOT NULL(名字一樣)，並且改變列b，從CHAR(10)改為CHAR(20)，同時重命名它，從b改為c：

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

增加一個新TIMESTAMP列，名為d：

mysql> ALTER TABLE t2 ADD d TIMESTAMP;

在列d上增加一個索引，並且使列a為主鍵：

mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

刪出列c：

mysql> ALTER TABLE t2 DROP COLUMN c;

增加一個新的AUTO_INCREMENT整數列，命名為c：

mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);

注意，我們索引了c，因為AUTO_INCREMENT柱必須被索引，並且另外我們聲明c為NOT
NULL，因為索引了的列不能是NULL。

當你增加一個AUTO_INCREMENT列時，自動地用順序數字填入列值。

7.9 OPTIMIZE
TABLE句法

OPTIMIZE TABLE tbl_name

如果你刪除了一個表的大部分或如果你用變長的行對一個表(有VARCHAR、BLOB或TEXT列的表)做了改變，應該使用OPTIMZE
TABLE。刪除的記錄以一個鏈接表維持並且隨後的INSERT操作再次使用老記錄的位置。你可以使用OPTIMIZE
TABLE回收閑置的空間。

OPTIMIZE TABLE通過制作原來的表的一個臨時副本來工作。老的表子被拷貝到新表中(沒有閑置的行)，然後原來的表被刪除並且重命名一個新的。這樣做使得所有更新自動轉向新的表，沒有任何失敗的更新。當時OPTIMIZE
TABLE正在執行時，原來的表可被另外的客戶讀取。對表的更新和寫入延遲到新表是準備好為止。

7.10 DROP TABLE句法

DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]

DROP TABLE刪除一個或多個資料庫表。所有表中的數據和表定義均被刪除，故小心使用這個命令！

在MySQL 3.22或以後版本，你可以使用關鍵詞IF EXISTS類避免不存在表的一個錯誤發生。

7.11 DELETE句法

DELETE [LOW_PRIORITY] FROM tbl_name
    [WHERE where_definition] [LIMIT rows]

DELETE從tbl_name表中刪除滿足由where_definition給出的條件的行，並且返回刪除記錄的個數。

如果你發出一個沒有WHERE子句的DELETE，所有行都被刪除。MySQL通過創建一個空表來完成，它比刪除每行要快。在這種情況下，DELETE返回零作為受影響記錄的數目。(MySQL不能返回實際上被刪除的行數，因為進行再創建而不是打開數據文件。只要表定義文件“tbl_name.frm”是有效的，表才能這樣被再創建，即使數據或索引文件破壞了)。

如果你確實想要知道在你正在刪除所有行時究竟有對少記錄被刪除，並且願意承受速度上的懲罰，你可以這種形式的一個ELETE語句：

mysql> DELETE FROM tbl_name WHERE 1>0;

注意這比沒有WHERE子句的DELETE FROM tbl_name慢的多了，因為它一次刪除一行。

如果你指定關鍵詞LOW_PRIORITY，DELETE的執行被推遲到沒有其他客戶讀取表後。

刪除的記錄以一個鏈接表維持並且隨後的INSERT操作再次使用老的記錄位置。為了回收閑置的空間並減小文件大小，使用OPTIMIZE
TABLE語句或myisamchk實用程式重新組織表。OPTIMIZE
TABLE較容易，但是myisamchk更快。見7.9 OPTIMIZE TABLE句法和13.4.3 表最佳化。

MySQL對DELETE特定的LIMIT rows選項告訴伺服器在控制被返回到客戶之前，將要刪除的最大行數，這可以用來保証一個特定DELETE命令不會花太多的時間。你可以簡單地重複DELETE命令直到受影響的行數小於LIMIT值。

7.12 SELECT句法

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
    select_expression,...
    [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    [FROM table_references
        [WHERE where_definition]
        [GROUP BY col_name,...]
        [HAVING where_definition]
        [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
        [LIMIT [offset,] rows]
        [PROCEDURE procedure_name] ]

SELECT被用來檢索從一個或多個表中選取的行。select_expression指出你想要檢索的列。SELECT也可以用來檢索不引用任何表的計算行。例如：

mysql> SELECT 1 + 1;
         -> 2

所有使用的關鍵詞必須精確地以上面的順序給出。例如，一個HAVING子句必須跟在GROUP
BY子句之後和ORDER BY子句之前。

  • 一個SELECT表達式可以用一個AS給定一個別名，別名被用作表達式的列名並且能使用在ORDER
    BY或HAVING子句中。例如：
    mysql> select concat(last_name,', ',first_name) AS full_name
    from mytable ORDER BY full_name;

    •

  • FROM table_references子句指出從哪個表中檢索行。如果你命名多個表，你正在執行一個聯結(join)。對於聯結的句法資訊，見7.13 JOIN句法。
    •

  • 你可以引用一個列為col_name、tbl_name.col_name或db_name.tbl_name.col_name，你不必在一個SELECT語句中指定一個tbl_name或db_name.tbl_name是一個列引用的前綴，除非引用有二義性。見7.1.5
    資料庫、表、索引、列和別名命名。對於二義性的例子要求更加顯式的列引用格式。

    •

  • 一個表引用可以使用tbl_name [AS]
    alias_name起一個別名。
    mysql> select t1.name, t2.salary from employee AS t1, info AS t2
           where t1.name = t2.name;
mysql> select t1.name, t2.salary from employee t1, info t2
           where t1.name = t2.name;

    •

  • 選取輸出的列可以用列名、列別名或列位置在ORDER BY和GROUP
    BY子句引用，列位置從1開始。
    mysql> select college, region, seed from tournament
           ORDER BY region, seed;
mysql> select college, region AS r, seed AS s from tournament
           ORDER BY r, s;
mysql> select college, region, seed from tournament
           ORDER BY 2, 3;

    為了以降序排列，把DESC（下降 )關鍵詞加到ORDER BY子句中你要排序的列名前。預設是升序﹔這也可以用ASC關鍵詞明確指定。

    •

  • HAVING子句能引用任何列或在select_expression中命名的別名，它最後運用，就在項目被送到客戶之前，沒有最佳化。不要對因該在WHERE子句中的項目使用HAVING。例如，不能寫成這樣：

    mysql> select col_name from tbl_name HAVING col_name > 0;

    相反寫成這樣：

    mysql> select col_name from tbl_name WHERE col_name > 0;

    在MySQL 3.22.5或以後，你也能這樣寫查詢：

    mysql> select user,max(salary) from users group by user HAVING max(salary)>10;

    在裡面更老的MySQL版本中，你能這樣寫：

    mysql> select user,max(salary) AS sum from users
           group by user HAVING sum>10;

    •

  • SQL_SMALL_RESULT、SQL_BIG_RESULT、STRAIGHT_JOIN和HIGH_PRIORITY是MySQL對ANSI
    SQL92的擴展。
    •

  • STRAIGHT_JOIN強制最佳化器以其列在FROM子句的次序聯結(join)桌子。如果最佳化器以非最佳次序聯結表，你能使用它加速查詢。見7.22 EXPLAIN句法(得到關於SELECT的資訊)。

    •

  • SQL_SMALL_RESULT能與GROUP BY或DISTINCT一起使用告訴最佳化器結果集將很小。在這種情況下，MySQL將使用快速臨時表儲存最終的表而不是使用排序。
    SQL_SMALL_RESULT是一個MySQL擴展。
    •

  • SQL_BIG_RESULT能與GROUP BY或DISTINCT一起使用以告訴最佳化器結果集合將有很多行。在這種情況下，如果需要，MySQL將直接使用基於磁碟的臨時表。
    MySQL在這種情況下將選擇用GROUP BY單元上的鍵值進行排序而不是做一個臨時表。

    •

  • HIGH_PRIORITY將賦予SELECT比一個更新表的語句更高的優先級，你應該僅對非常快的並且必須一次完成的查詢使用它。
    如果表為讀而鎖定或甚至有一個等待表釋放的更新語句，一個SELECT
    HIGH_PRIORITY將運行。
    •

  • LIMIT子句可以被用來限制SELECT語句返回的行數。LIMIT取1個或2個數字參數，如果給定2個參數，第一個指定要返回的第一行的偏移量，第二個指定返回行的最大數目。初始行的偏移量是0(不是1)。

    mysql> select * from table LIMIT 5,10;  # Retrieve rows 6-15

    如果給定一個參數，它指出返回行的最大數目。

    mysql> select * from table LIMIT 5;     # Retrieve first 5 rows

    換句話說，LIMIT n等價於LIMIT 0,n。

    •

  • SELECT ... INTO OUTFILE 'file_name'格式的SELECT語句將選擇的行寫入一個文件。文件在伺服器主機上被創建，並且不能是已經存在的(不管別的，這可阻止資料庫表和文件例如“/etc/passwd”被破壞)。在伺服器主機上你必須有file權限以使用這種SELECT。SELECT
    ... INTO OUTFILE是LOAD DATA INFILE逆操作﹔語句的export_options部分的語法與用在LOAD
    DATA INFILE語句中的FIELDS和LINES子句的相同。見7.16 LOAD DATA INFILE句法。在最終的文本文件中，只有下列字符由ESCAPED
    BY字符轉義：

    • ESCAPED BY字符
      •

    • 在FIELDS TERMINATED BY中的第一個字符
      •

    • 在LINES TERMINATED BY中的第一個字符
      •

    另外，ASCII 0被變換到ESCAPED BY後跟0(ASCII 48)。上述的原因是你必須轉義任何FIELDS
    TERMINATED BY、ESCAPED BY或LINES TERMINATED BY字符以便能可靠地能讀回文件。ASCII
    0被轉義使它更容易用分頁器觀看。因為最終的文件不必須遵循SQL句法，沒有別的東西需要轉義。

    •

如果你使用INTO DUMPFILE而不是INTO
OUTFILE，MySQL將只寫一行到文件中，沒有任何列或行結束並且沒有任何轉義。如果你想要在一個文件儲存一個blob，這是很有用的。

7.13 JOIN句法

MySQL支援下列用於SELECT語句的JOIN句法：

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }

上述最後的LEFT OUTER JOIN的句法只是為了與ODBC兼容而存在的。

  • 一個表可以是使用aliasedtbl_name AS alias_name或tbl_name
    alias_name的起的別名。
    mysql> select t1.name, t2.salary from employee AS t1, info AS t2
           where t1.name = t2.name;

    •

  • INNER JOIN和,（逗號)在語義上是等價的，都是進行一個在使用的表之間的全聯結。通常，你指定表應該如何用WHERE條件聯結起來。

    •

  • ON條件是可以用在一個WHERE子句形式的任何條件。

    •

  • 如果在一個LEFT JOIN中沒有右表的匹配記錄，一個所有列設置為NULL的行被用於右表。你可以使用這個事實指出表中在另一個表中沒有對應記錄的記錄：

    mysql> select table1.* from table1
           LEFT JOIN table2 ON table1.id=table2.id
           where table2.id is NULL;

    這個例子找出在table1中所有的行，其id值在table2中不存在（即，所有table1中的在table2中沒有對應行的行)。當然這假定table2.id被聲明為NOT
    NULL。

    •

  • USING (column_list)子句命名一系列必須存在於兩個表中的列。
    例如一個USING子句：
    A LEFT JOIN B USING (C1,C2,C3,...)

    被定義成在語義上等同一個這樣的ON表達式：

    A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...

    •

  • 2個表的NATURAL LEFT JOIN被定義為在語義上等同於一個有USING子句命名在兩表中存在的所有列的一個LEFT
    JOIN。
    •

  • STRAIGHT_JOIN等同於JOIN，除了左表在右表之前被讀入，這能用於這些情況，聯結最佳化器將表的順序放錯了。

    •

一些例子：

mysql> select * from table1,table2 where table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 USING (id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id
           LEFT JOIN table3 ON table2.id=table3.id;

見10.5.4 MySQL怎樣最佳化LEFT
JOIN。

7.14 INSERT句法

    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...),(...),...
或  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
或  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression, ...

INSERT把新行插入到一個存在的表中，INSERT ... VALUES形式的語句基於明確指定的值插入行，INSERT
... SELECT形式插入從其他表選擇的行，有多個值表的INSERT ...
VALUES的形式在MySQL 3.22.5或以後版本中支援，col_name=expression語法在MySQL
3.22.10或以後版本中支援。

tbl_name是行應該被插入其中的表。列名表或SET子句指出語句為那一列指定值。

  • 如果你為INSERT ... VALUES或INSERT ... SELECT不指定列表，所有列的值必須在VALUES()表或由SELECT提供。如果你不知道表中列的順序，使用DESCRIBE
    tbl_name來找出。
    •

  • 任何沒有明確地給出值的列被設置為它的預設值。例如，如果你指定一個列表並沒命名表中所有列，未命名的列被設置為它們的預設值。預設值賦值在7.7 CREATE TABLE句法中描述。

    •

  • 一個expression可以引用在一個值表先前設置的任何列。例如，你能這樣：

    mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

    但不能這樣：

    mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

    •

  • 如果你指定關鍵詞LOW_PRIORITY，INSERT的執行被推遲到沒有其他客戶正在讀取表。在這種情況下，客戶必須等到插入語句完成後，如果表頻繁使用，它可能花很長時間。這與INSERT
    DELAYED讓客馬上繼續正好相反。
    •

  • 如果你在一個有許多值行的INSERT中指定關鍵詞IGNORE，表刈酚何複製一個現有PRIMARY或UNIQUE鍵的行被忽略並且不被插入。如果你不指定IGNORE，插入如果有任何複製現有關鍵值的行被放棄。你可用C
    API函數mysql_info()檢查多少行被插入到表中。
    •

  • 如果MySQL用DONT_USE_DEFAULT_FIELDS選項配置，INSERT語句產生一個錯誤，除非你明確對需要一個非NULL值的所有列指定值。見4.7.3 典型configure選項。

    •

  • INSERT INTO ... SELECT語句滿足下列條件：

    • 查詢不能包含一個ORDER BY子句。
      •

    • INSERT語句的目的表不能出現在SELECT查詢部分的FROM子句，因為這在ANSI
        SQL中被禁止讓從你正在插入的表中SELECT。（問題是SELECT將可能發現在同一個運行期間內先前被插入的記錄。當使用子選擇子句時，情況能很容易混淆）
      •

    • AUTO_INCREMENT列像往常一樣工作。
      •

    •

如果你使用INSERT ... SELECT或INSERT ...
VALUES語句有多個值列表，你可以使用C API函數mysql_info()得到查詢的資訊。資訊字符串的格式如下：

Records: 100 Duplicates: 0 Warnings: 0

Duplicates指出不能被插入的行的數量，因為他們與現有的唯一的索引值重複。Warnings指出在出現某些問題時嘗試插入列值的次數。在下列任何條件下都可能發生錯誤：

  • 插入NULL到被聲明了NOT NULL的列，列被設置為它的預設值。

    •

  • 將超出列範圍的值設置給一個數字列，值被剪切為範圍內適當的端點值。

    •

  • 將數字列設成例如'10.34 a'的值，拖尾的垃圾被剝去並仍然是數字部分被插入。如果值根本不是一個數字，列被設置到0。

    •

  • 把一個字符串插入到超過列的最大長度的一個CHAR、VARCHAR、TEXT或BLOB列中。值被截斷為列的最大長度。

    •

  • 把一個對列類型不合法的值插入到一個日期或時間列。列被設置為該列類型適當的“零”值。

    •

對於INSERT語句的DELAYED選項是MySQL專屬的選項-如果你客戶有不能等到INSERT完成，它是很有用的。當你為日記登錄使用MySQL時，而且你也周期性地運行花很長時間完成的SELECT語句，這是一個常見的問題。DELAYED在面MySQL
3.22.15中被引入，它是MySQL對 ANSI SQL92 的一個擴展。

當你使用INSERT DELAYED時，客戶將馬上準備好，並且當表不被任何其他的執行緒使用時，行將被插入。

另一個使用INSERT DELAYED的主要好處是從很多客戶插入被捆綁在一起並且寫進一個塊。這比做很多單獨的插入要來的快。

注意，當前排隊的行只是儲存在內存中，直到他們被插入到表中。這意味著，如果你硬要殺死mysqld(kill
-9)或如果mysqld出人意料地死掉，沒被寫進磁碟的任何排隊的行被丟失！

下列詳細描述當你為INSERT或REPLACE使用DELAYED選項時，發生什麼。在這個描述中，“執行緒”是收到一個INSERT
DELAYED命令的執行緒並且“處理器”是處理所有對於一個特定表的INSERT
DELAYED語句。

  • 當一個執行緒對一個表執行一個DELAYED語句時，如果不存在這樣的處理程式，一個處理器執行緒被創建以處理對於該表的所有DELAYED語句。

    •

  • 執行緒檢查處理程式是否已經獲得了一個DELAYED鎖﹔如果沒有，它告訴處理程式去獲得。即使其他的執行緒有在表上的一個READ或WRITE鎖，也能獲得DELAYED鎖。然而，處理程式將等待所有ALTER
    TABLE鎖或FLUSH TABLES以保証表結構是最新的。
    •

  • 執行緒執行INSERT語句，但不是將行寫入表，它把最後一行的副本放進被處理器執行緒管理的一個隊列。任何語法錯誤都能被執行緒發覺並報告給客戶程式。

    •

  • 顧客不能報告結果行的重複次數或AUTO_INCREMENT值﹔它不能從伺服器獲得它們，因為INSERT在插入操作完成前返回。如果你使用C
    API，同樣原因，mysql_info()函數不返回任何有意義的東西。
    •

  • 當行被插入到表中時，更新日誌有處理器執行緒更新。在多行插入的情況下，當第一行被插入時，更新日誌被更新。

    •

  • 在每寫入delayed_insert_limit行後，處理器檢查是否任何SELECT語句仍然是未完成，如果這樣，在繼續之前允許執行這些語句。

    •

  • 當處理器在它的隊列中沒有更多行時，表被解鎖。如果在delayed_insert_timeout秒內沒有收到新的INSERT
    DELAYED命令，處理器終止。
    •

  • 如果已經有多於delayed_queue_size行在一個特定的處理器隊列刈袧解決，執行緒等待直到隊列有空間。這有助於保証mysqld伺服器對延遲的內存隊列不使用所有內存。

    •

  • 處理器執行緒將在Command列的MySQL進程表中顯示delayed_insert。如果你執行一個FLUSH
    TABLES命令或以KILL thread_id殺死它，它將被殺死，然而，它在退出前首先將所有排隊的行存進表中。在這期間，這次它將不從其他執行緒接受任何新的INSERT命令。如果你在它之後執行一個INSERT
    DELAYED，將創建一個新的處理器執行緒。
    •

  • 注意，上述意味著，如果有一個INSERT DELAYED處理器已經運行，INSERT
    DELAYED命令有比正常INSERT更高的優先級！其他更新命令將必須等到INSERT
    DELAY排隊變空、殺死處理器執行緒(用KILL thread_id)或執行FLUSH
    TABLES。
    •

  • 下列狀態變數提供了關於INSERT DELAYED命令的資訊：

        Delayed_insert_threads
         | 處理器執行緒數量

        Delayed_writes
         | 用INSERT DELAYED被寫入的行的數量

        Not_flushed_delayed_rows
         | 等待被寫入的行數字

    你能通過發出一個SHOW STATUS語句或通過執行一個mysqladmin
    extended-status命令察看這些變數。

    •

注意如果桌子不在使用，INSERT DELAYED比一個正常的INSERT慢。對伺服器也有額外開銷來處理你對它使用INSERT
DELAYED的每個表的一個單獨執行緒。這意味著，你應該只在你確實肯定需要它的時候才使用INSERT
DELAYED！

7.15 REPLACE句法

    REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...)
或  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
或  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression,...

REPLACE功能與INSERT完全一樣，除了如果在表中的一個老記錄具有在一個唯一索引上的新記錄有相同的值，在新記錄被插入之前，老記錄被刪除。見7.14 INSERT句法。

7.16 LOAD DATA INFILE句法

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]]
    [LINES TERMINATED BY '\n']
    [IGNORE number LINES]
    [(col_name,...)]

LOAD DATA INFILE語句從一個文本文件刈脛很高的速度讀入一個表中。如果指定LOCAL關鍵詞，從客戶主機讀文件。如果LOCAL沒指定，文件必須位於伺服器上。(LOCAL在MySQL3.22.6或以後版本刈莃用。）

為了安全原因，當讀取位於伺服器上的文本文件時，文件必須處於資料庫目錄或可被所有人讀取。另外，為了對伺服器上文件使用LOAD
DATA INFILE，在伺服器主機上你必須有file的權限。見6.5 由MySQL提供的權限。

如果你指定關鍵詞LOW_PRIORITY，LOAD DATA語句的執行被推遲到沒有其他客戶讀取表後。

使用LOCAL將比讓伺服器直接存取文件慢些，因為文件的內容必須從客戶主機傳送到伺服器主機。在另一方面，你不需要file權限裝載本地文件。

你也可以使用mysqlimport實用程式裝載數據文件﹔它由發送一個LOAD
DATA INFILE命令到伺服器來運作。 --local選項使得mysqlimport從客戶主機上讀取數據。如果客戶和伺服器支援壓縮協議，你能指定--compress在較慢的網路上獲得更好的性能。

當在伺服器主機上尋找文件時，伺服器使用下列規則：

  • 如果給出一個絕對路徑名，伺服器使用該路徑名。
    •

  • 如果給出一個有一個或多個前置部件的相對路徑名，伺服器相對伺服器的數據目錄搜索文件。

    •

  • 如果給出一個沒有前置部件的一個文件名，伺服器在當前資料庫的資料庫目錄尋找文件。

    •

注意這些規則意味著一個像“./myfile.txt”給出的文件是從伺服器的數據目錄讀取，而作為“myfile.txt”給出的一個文件是從當前資料庫的資料庫目錄下讀取。也要注意，對於下列哪些語句，對db1文件從資料庫目錄讀取，而不是db2：

mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;

REPLACE和IGNORE關鍵詞控制對現有的唯一鍵記錄的重複的處理。如果你指定REPLACE，新行將代替有相同的唯一鍵值的現有行。如果你指定IGNORE，跳過有唯一鍵的現有行的重複行的輸入。如果你不指定任何一個選項，當找到重複鍵鍵時，出現一個錯誤，並且文本文件的餘下部分被忽略時。

如果你使用LOCAL關鍵詞從一個本地文件裝載數據，伺服器沒有辦法在操作的當中停止文件的傳輸，因此預設的行為好像IGNORE被指定一樣。

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作，見7.12 SELECT句法。為了將一個資料庫的數據寫入一個文件，使用SELECT
... INTO OUTFILE，為了將文件讀回資料庫，使用LOAD DATA INFILE。兩個命令的FIELDS和LINES子句的語法是相同的。兩個子句是可選的，但是如果指定兩個，FIELDS必須在LINES之前。

如果你指定一個FIELDS子句，它的每一個子句(TERMINATED
BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的，除了你必須至少指定他們之一。

如果你不指定一個FIELDS子句，預設值與如果你這樣寫的相同：

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

如果你不指定一個LINES子句，預設值與如果你這樣寫的相同：

LINES TERMINATED BY '\n'

換句話說，預設值導致讀取輸入時，LOAD DATA INFILE表現如下：

  • 在換行符處尋找行邊界
    •

  • 在定位符處將行分進字段
    •

  • 不要期望字段由任何引號字符封裝
    •

  • 將由“\”開頭的定位符、換行符或“\”解釋是字段值的部分字面字符
    •

相反，預設值導致在寫入輸出時，SELECT ... INTO OUTFILE表現如下：

  • 在字段之間寫定位符
    •

  • 不用任何引號字符封裝字段
    •

  • 使用“\”轉義出現在字段中的定位符、換行符或“\”字符
    •

  • 在行尾處寫換行符
    •

注意，為了寫入FIELDS ESCAPED BY '\\'，對作為一條單個的反斜線被讀取的值，你必須指定2條反斜線值。

IGNORE number LINES選項可被用來忽略在文件開始的一個列名字的頭：

mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;

當你與LOAD DATA INFILE一起使用SELECT ... INTO OUTFILE將一個資料庫的數據寫進一個文件並且隨後馬上將文件讀回資料庫時，兩個命令的字段和處理選項必須匹配，否則，LOAD
DATA INFILE將不能正確解釋文件的內容。假定你使用SELECT ...
INTO OUTFILE將由逗號分隔的字段寫入一個文件：

mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'
           FIELDS TERMINATED BY ','
           FROM ...

為了將由逗號分隔的文件讀回來，正確的語句將是：

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY ',';

相反，如果你試圖用下面顯示的語句讀取文件，它不會工作，因為它命令LOAD
DATA INFILE在字段之間尋找定位符：

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY '\t';

可能的結果是每個輸入行將被解釋為單個的字段。

LOAD DATA INFILE能被用來讀取從外部來源獲得的文件。例如，以dBASE格式的文件將有由逗號分隔並用雙引號包圍的字段。如果文件中的行由換行符終止，下面顯示的命令說明你將用來裝載文件的字段和行處理選項：

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';

任何字段或行處理選項可以指定一個空字符串('')。如果不是空，FIELDS
[OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必須是一個單個字符。FIELDS
TERMINATED BY和LINES TERMINATED BY值可以是超過一個字符。例如，寫入由回車換行符對（CR+LF）終止的行，或讀取包含這樣行的一個文件，指定一個LINES
TERMINATED BY '\r\n'子句。

FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包圍字符。對於輸出(SELECT
... INTO OUTFILE)，如果你省略OPTIONALLY，所有的字段由ENCLOSED
BY字符包圍。對於這樣的輸出的一個例子(使用一個逗號作為字段分隔符)顯示在下面：

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"

如果你指定OPTIONALLY，ENCLOSED BY字符僅被用於包圍CHAR和VARCHAR字段：

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20

注意，一個字段值中的ENCLOSED BY字符的出現通過用ESCAPED
BY字符作為其前綴來轉義。也要注意，如果你指定一個空ESCAPED
BY值，可能產生不能被LOAD DATA INFILE正確讀出的輸出。例如，如果轉義字符為空，上面顯示的輸出顯示如下。注意到在第四行的第二個字段包含跟隨引號的一個逗號，它(錯誤地)好像要終止字段：

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20

對於輸入，ENCLOSED BY字符如果存在，它從字段值的尾部被剝去。（不管是否指定OPTIONALLY都是這樣﹔OPTIONALLY對於輸入解釋不起作用)由ENCLOSED
BY字符領先的ESCAPED BY字符出現被解釋為當前字段值的一部分。另外，出現在字段中重複的ENCLOSED
BY被解釋為單個ENCLOSED BY字符，如果字段本身以該字符開始。例如，如果ENCLOSED
BY '"'被指定，引號如下處理：

"The ""BIG"" boss"  -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss

FIELDS ESCAPED BY控制如何寫入或讀出特殊字符。如果FIELDS
ESCAPED BY字符不是空的，它被用於前綴在輸出上的下列字符：

  • FIELDS ESCAPED BY字符
    •

  • FIELDS [OPTIONALLY] ENCLOSED BY字符
    •

  • FIELDS TERMINATED BY和LINES TERMINATED BY值的第一個字符
    •

  • ASCII 0（實際上將後續轉義字符寫成 ASCII'0'，而不是一個零值字節）
    •

如果FIELDS ESCAPED BY字符是空的，沒有字符被轉義。指定一個空轉義字符可能不是一個好主意，特別是如果在你數據中的字段值包含剛才給出的表中的任何字符。

對於輸入，如果FIELDS ESCAPED BY字符不是空的，該字符的出現被剝去並且後續字符在字面上作為字段值的一個部分。例外是一個轉義的“0”或“N”（即，\0或\N，如果轉義字符是“\”)。這些序列被解釋為ASCII
0（一個零值字節）和NULL。見下面關於NULL處理的規則。

對於更多關於“\”- 轉義句法的資訊，見7.1 文字：怎樣寫字符串和數字。

在某些情況下，字段和行處理選項相互作用：

  • 如果LINES TERMINATED BY是一個空字符串並且FIELDS TERMINATED
    BY是非空的，行也用FIELDS TERMINATED BY終止。
    •

  • 如果FIELDS TERMINATED BY和FIELDS ENCLOSED BY值都是空的('')，一個固定行(非限定的)格式被使用。用固定行格式，在字段之間不使用分隔符。相反，列值只用列的“顯示”寬度被寫入和讀出。例如，如果列被聲明為INT(7)，列的值使用7個字符的字段被寫入。對於輸入，列值通過讀取7個字符獲得。固定行格式也影響NULL值的處理﹔見下面。注意如果你正在使用一個多字節字符集，固定長度格式將不工作。

    •

NULL值的處理有多種，取決於你使用的FIELDS和LINES選項：

  • 對於預設FIELDS和LINES值，對輸出，NULL被寫成\N，對輸入，\N被作為NULL讀入(假定ESCAPED
    BY字符是“\”)。
    •

  • 如果FIELDS ENCLOSED BY不是空的，包含以文字詞的NULL作為它的值的字段作為一個NULL值被讀入(這不同於包圍在FIELDS
    ENCLOSED BY字符中的字NULL，它作為字符串'NULL'讀入)。

    •

  • 如果FIELDS ESCAPED BY是空的，NULL作為字NULL被寫入。

    •

  • 用固定行格式(它發生在FIELDS TERMINATED BY和FIELDS ENCLOSED
    BY都是空的時候)，NULL作為一個空字符串被寫入。注意，在寫入文件時，這導致NULL和空字符串在表中不能區分，因為他們都作為空字符串被寫入。如果在讀回文件時需要能區分這兩者，你應該不使用固定行格式。

    •

一些不被LOAD DATA INFILE支援的情況：

  • 固定長度的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY都為空)和BLOB或TEXT列。

    •

  • 如果你指定一個分隔符與另一個相同，或是另一個的前綴，LOAD
    DATA INFILE不能正確地解釋輸入。例如，下列FIELDS子句將導致問題：

    FIELDS TERMINATED BY '"' ENCLOSED BY '"'

    •

  • 如果FIELDS ESCAPED BY是空的，一個包含跟隨FIELDS
    TERMINATED BY值之後的FIELDS ENCLOSED BY或LINES TERMINATED
    BY的字段值將使得LOAD DATA INFILE過早地終止讀取一個字段或行。這是因為LOAD
    DATA INFILE不能正確地決定字段或行值在哪兒結束。
    •

下列例子裝載所有persondata表的行：

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

沒有指定字段表，所以LOAD DATA INFILE期望輸入行對每個表列包含一個字段。使用預設FIELDS和LINES值。

如果你希望僅僅裝載一張表的某些列，指定一個字段表：

mysql> LOAD DATA INFILE 'persondata.txt'
           INTO TABLE persondata (col1,col2,...);

如果在輸入文件中的字段順序不同於表中列的順序，你也必須指定一個字段表。否則，MySQL不能知道如何匹配輸入字段和表中的列。

如果一個行有很少的字段，對於不存在輸入字段的列被設置為預設值。預設值賦值在7.7 CREATE TABLE句法中描述。

如果字段值預設，空字段值有不同的解釋：

  • 對於字符串類型，列被設置為空字符串。
    •

  • 對於數字類型，列被設置為0。
    •

  • 對於日期和時間類型，列被設置為該類型的適當“零”值。見7.3.6 日期和時間類型。
    •

如果列有一個NULL，或(只對第一個TIMESTAMP列)在指定一個字段表時，如果TIMESTAMP列從字段表省掉，TIMESTAMP列只被設置為當前的日期和時間。

如果輸入行有太多的字段，多餘的字段被忽略並且警告數字加1。

LOAD DATA INFILE認為所有的輸入是字符串，因此你不能像你能用INSERT語句的ENUM或SET列的方式使用數字值。所有的ENUM和SET值必須作為字符串被指定！

如果你正在使用C API，當LOAD DATA INFILE查詢完成時，你可通過調用API函數mysql_info()得到有關查詢的資訊。資訊字符串的格式顯示在下面：

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

當值通過INSERT語句插入時，在某些情況下出現警告(見7.14 INSERT句法)，除了在輸入行中有太少或太多的字段時，LOAD
DATA INFILE也產生警告。警告沒被儲存在任何地方﹔警告數字僅能用於表明一切是否順利。如果你得到警告並且想要確切知道你為什麼得到他們，一個方法是使用SELECT
... INTO OUTFILE到另外一個文件並且把它與你的原版輸入文件比較。

對於有關INSERT相對LOAD DATA INFILE的效率和加快LOAD
DATA INFILE的更多資訊，見10.5.6
加速INSERT查詢。

7.17 UPDATE句法

UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
    [WHERE where_definition] [LIMIT #]

UPDATE用新值更新現存表中行的列，SET子句指出哪個列要修改和他們應該被給定的值，WHERE子句，如果給出，指定哪個行應該被更新，否則所有行被更新。

如果你指定關鍵詞LOW_PRIORITY，執行UPDATE被推遲到沒有其他客戶正在讀取表時。

如果你從一個表達式的tbl_name存取列，UPDATE使用列的當前值。例如，下列語句設置age為它的當前值加1：

mysql> UPDATE persondata SET age=age+1;

UPDATE賦值是從左到右計算。例如，下列語句兩倍age列，然後加1：

mysql> UPDATE persondata SET age=age*2, age=age+1;

如果你設置列為其它當前有的值，MySQL注意到這點並且不更新它。

UPDATE返回實際上被改變的行的數量。在MySQL
3.22或以後版本中，C API函數mysql_info()返回被匹配並且更新的行數和在UPDATE期間發生警告的數量。

在MySQL3.23中，你可使用LIMIT #來保証只有一個給定數量的行被改變。

7.18 USE句法

USE db_name

USE db_name語句告訴MySQL使用db_name資料庫作為隨後的查詢的預設資料庫。資料庫保持到會話結束，或發出另外一個USE語句：

mysql> USE db1;
mysql> SELECT count(*) FROM mytable;      # selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable;      # selects from db2.mytable

利用USE語句使得一個特定的資料庫稱為當前資料庫並不阻止你訪問在另外的資料庫中的表。下面的例子訪問db1資料庫中的author表和db2資料庫中的editor表：

mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
           WHERE author.editor_id = db2.editor.editor_id;

USE語句提供了Sybase的兼容性。

7.19 FLUSH句法(清除緩存）

FLUSH flush_option [,flush_option]

如果你想要清除一些MySQL使用內部緩存，你應該使用FLUSH命令。為了執行FLUSH，你必須有reload權限。

flush_option可以是下列任何東西：

HOSTS | 清空主機緩存表。如果你的某些主機改變IP數字，或如果你得到錯誤消息Host ... is blocked，你應該清空主機表。當在連接MySQL伺服器時，對一台給定的主機有多於max_connect_errors個錯誤連續不斷地發生，MySQL認定某些東西錯了並且阻止主機進一步的連接請求。清空主機表允許主機再嘗試連接。見18.2.3 Host '...' is blocked錯誤)。你可用-O max_connection_errors=999999999啟動mysqld來避免這條錯誤消息。
LOGS | 關閉並且再打開標準和更新記錄文件。如果你指定了一個沒有擴展名的更新記錄文件，新的更新記錄文件的擴展數字將相對先前的文件加1。
PRIVILEGES | 從mysql資料庫授權表中重新裝載權限。
TABLES | 關閉所有打開的表。
STATUS | 重置大多數狀態變數到0。

你也可以用mysqladmin實用程式，使用flush-hosts, flush-logs,
reload或flush-tables命令來訪問上述的每一個命令。

7.20 KILL句法

KILL thread_id

每個對mysqld的連接以一個單獨的執行緒運行。你可以用看SHOW
PROCESSLIST命令察看哪個執行緒正在運行，並且用KILL thread_id命令殺死一個執行緒。

如果你有process權限，你能看到並且殺死所有執行緒。否則，你只能看到並且殺死你自己的執行緒。

你也可以使用mysqladmin processlist和mysqladmin kill命令檢查並殺死執行緒。

7.21 SHOW句法 (得到表，列等的資訊）

   SHOW DATABASES [LIKE wild]
or SHOW TABLES [FROM db_name] [LIKE wild]
or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW INDEX FROM tbl_name [FROM db_name]
or SHOW STATUS
or SHOW VARIABLES [LIKE wild]
or SHOW [FULL] PROCESSLIST
or SHOW TABLE STATUS [FROM db_name] [LIKE wild]
or SHOW GRANTS FOR user

SHOW提供關於資料庫、桌子、列或伺服器的資訊。如果使用LIKE
wild部分，wild字符串可以是一個使用SQL的“%”和“_”通配符的字符串。

你能使用db_name.tbl_name作為tbl_name FROM db_name句法的另一種選擇。這兩個語句是相等的：

mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable;

SHOW DATABASES列出在MySQL伺服器主機上的資料庫。你也可以用mysqlshow命令得到這張表。

SHOW TABLES列出在一個給定的資料庫中的表。你也可以用mysqlshow
db_name命令得到這張表。

注意：如果一個用戶沒有一個表的任何權限，表將不在SHOW
TABLES或mysqlshow db_name中的輸出中顯示。

SHOW COLUMNS列出在一個給定表中的列。如果列類型不同於你期望的是基於CREATE
TABLE語句的那樣，注意，MySQL有時改變列類型。見7.7.1 隱含的列說明變化。

DESCRIBE語句提供了類似SHOW COLUMNS的資訊。見7.23 DESCRIBE 句法 (得到列的資訊）。

SHOW TABLE STATUS（在版本3.23引入)運行類似SHOW STATUS，但是提供每個表的更多資訊。你也可以使用mysqlshow
--status db_name命令得到這張表。下面的列被返回：

列 | 含義
Name | 表名
Type | 表的類型 (ISAM，MyISAM或HEAP)
Row_format | 行儲存格式 (固定, 動態, 或壓縮）
Rows | 行數量
Avg_row_length | 平均行長度
Data_length | 數據文件的長度
Max_data_length | 數據文件的最大長度
Index_length | 索引文件的長度
Data_free | 已分配但未使用了字節數
Auto_increment | 下一個 autoincrement(自動加1）值
Create_time | 表被創造的時間
Update_time | 數據文件最後更新的時間
Check_time | 最後對表運行一個檢查的時間
Create_options | 與CREATE TABLE一起使用的額外選項
Comment | 當創造表時，使用的注釋 (或為什麼MySQL不能存取表資訊的一些資訊)。

SHOW FIELDS是SHOW COLUMNS一個同義詞，SHOW KEYS是SHOW
INDEX一個同義詞。你也可以用mysqlshow db_name tbl_name或mysqlshow
-k db_name tbl_name 列出一張表的列或索引。

SHOW INDEX以非常相似於ODBC的SQLStatistics調用的格式返回索引資訊。下面的列被返回：

列 | 含義
Table | 表名
Non_unique | 0，如果索引不能包含重複。
Key_name | 索引名
Seq_in_index | 索引中的列順序號, 從 1 開始。
Column_name | 列名。
Collation | 列怎樣在索引中被排序。在MySQL中，這可以有值A（升序) 或NULL（不排序)。
Cardinality | 索引中唯一值的數量。這可通過運行isamchk -a更改.
Sub_part | 如果列只是部分被索引，索引字符的數量。NULL，如果整個鍵被索引。

SHOW STATUS提供伺服器的狀態資訊(像mysqladmin
extended-status一樣)。輸出類似於下面的顯示，盡管格式和數字可以有點不同：

+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| Aborted_clients          | 0      |
| Aborted_connects         | 0      |
| Connections              | 17     |
| Created_tmp_tables       | 0      |
| Delayed_insert_threads   | 0      |
| Delayed_writes           | 0      |
| Delayed_errors           | 0      |
| Flush_commands           | 2      |
| Handler_delete           | 2      |
| Handler_read_first       | 0      |
| Handler_read_key         | 1      |
| Handler_read_next        | 0      |
| Handler_read_rnd         | 35     |
| Handler_update           | 0      |
| Handler_write            | 2      |
| Key_blocks_used          | 0      |
| Key_read_requests        | 0      |
| Key_reads                | 0      |
| Key_write_requests       | 0      |
| Key_writes               | 0      |
| Max_used_connections     | 1      |
| Not_flushed_key_blocks   | 0      |
| Not_flushed_delayed_rows | 0      |
| Open_tables              | 1      |
| Open_files               | 2      |
| Open_streams             | 0      |
| Opened_tables            | 11     |
| Questions                | 14     |
| Slow_queries             | 0      |
| Threads_connected        | 1      |
| Threads_running          | 1      |
| Uptime                   | 149111 |
+--------------------------+--------+

上面列出的狀態變數有下列含義：

Aborted_clients | 由於客戶沒有正確關閉連接已經死掉，已經放棄的連接數量。
Aborted_connects | 嘗試已經失敗的MySQL伺服器的連接的次數。
Connections | 試圖連接MySQL伺服器的次數。
Created_tmp_tables | 當執行語句時，已經被創造了的隱含臨時表的數量。
Delayed_insert_threads | 正在使用的延遲插入處理器執行緒的數量。
Delayed_writes | 用INSERT DELAYED寫入的行數。
Delayed_errors | 用INSERT DELAYED寫入的發生某些錯誤(可能重複鍵值)的行數。
Flush_commands | 執行FLUSH命令的次數。
Handler_delete | 請求從一張表中刪除行的次數。
Handler_read_first | 請求讀入表中第一行的次數。
Handler_read_key | 請求數字基於鍵讀行。
Handler_read_next | 請求讀入基於一個鍵的一行的次數。
Handler_read_rnd | 請求讀入基於一個固定位置的一行的次數。
Handler_update | 請求更新表中一行的次數。
Handler_write | 請求向表中插入一行的次數。
Key_blocks_used | 用於關鍵字緩存的塊的數量。
Key_read_requests | 請求從緩存讀入一個鍵值的次數。
Key_reads | 從磁碟物理讀入一個鍵值的次數。
Key_write_requests | 請求將一個關鍵字塊寫入緩存次數。
Key_writes | 將一個鍵值塊物理寫入磁碟的次數。
Max_used_connections | 同時使用的連接的最大數目。
Not_flushed_key_blocks | 在鍵緩存中已經改變但是還沒被清空到磁碟上的鍵塊。
Not_flushed_delayed_rows | 在INSERT DELAY隊列中等待寫入的行的數量。
Open_tables | 打開表的數量。
Open_files | 打開文件的數量。
Open_streams | 打開流的數量(主要用於日誌記載）
Opened_tables | 已經打開的表的數量。
Questions | 發往伺服器的查詢的數量。
Slow_queries | 要花超過long_query_time時間的查詢數量。
Threads_connected | 當前打開的連接的數量。
Threads_running | 不在睡眠的執行緒數量。
Uptime | 伺服器工作了多少秒。

關於上面的一些注釋：

  • 如果Opened_tables太大，那麼你的table_cache變數可能太小。

    •

  • 如果key_reads太大，那麼你的key_cache可能太小。緩存命中率可以用key_reads/key_read_requests計算。

    •

  • 如果Handler_read_rnd太大，那麼你很可能有大量的查詢需要MySQL掃描整個表或你有沒正確使用鍵值的聯結(join)。

    •

SHOW VARIABLES顯示出一些MySQL系統變數的值，你也能使用mysqladmin
variables命令得到這個資訊。如果預設值不合適，你能在mysqld啟動時使用命令行選項來設置這些變數的大多數。輸出類似於下面的顯示，盡管格式和數字可以有點不同：

+------------------------+--------------------------+
| Variable_name          | Value                    |
+------------------------+--------------------------+
| back_log               | 5                        |
| connect_timeout        | 5                        |
| basedir                | /my/monty/               |
| datadir                | /my/monty/data/          |
| delayed_insert_limit   | 100                      |
| delayed_insert_timeout | 300                      |
| delayed_queue_size     | 1000                     |
| join_buffer_size       | 131072                   |
| flush_time             | 0                        |
| interactive_timeout    | 28800                    |
| key_buffer_size        | 1048540                  |
| language               | /my/monty/share/english/ |
| log                    | OFF                      |
| log_update             | OFF                      |
| long_query_time        | 10                       |
| low_priority_updates   | OFF                      |
| max_allowed_packet     | 1048576                  |
| max_connections        | 100                      |
| max_connect_errors     | 10                       |
| max_delayed_threads    | 20                       |
| max_heap_table_size    | 16777216                 |
| max_join_size          | 4294967295               |
| max_sort_length        | 1024                     |
| max_tmp_tables         | 32                       |
| net_buffer_length      | 16384                    |
| port                   | 3306                     |
| protocol-version       | 10                       |
| record_buffer          | 131072                   |
| skip_locking           | ON                       |
| socket                 | /tmp/mysql.sock          |
| sort_buffer            | 2097116                  |
| table_cache            | 64                       |
| thread_stack           | 131072                   |
| tmp_table_size         | 1048576                  |
| tmpdir                 | /machine/tmp/            |
| version                | 3.23.0-alpha-debug       |
| wait_timeout           | 28800                    |
+------------------------+--------------------------+

見10.2.3 調節伺服器參數。

SHOW PROCESSLIST顯示哪個執行緒正在運行，你也能使用mysqladmin
processlist命令得到這個資訊。如果你有process權限，
你能看見所有的執行緒，否則，你僅能看見你自己的執行緒。見7.20 KILL句法。如果你不使用FULL選項，那麼每個查詢只有頭100字符被顯示出來。

SHOW GRANTS FOR user列出對一個用戶必須發出以重複授權的授權命令。

mysql> SHOW GRANTS FOR root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root''localhost' WITH GRANT OPTION  |
+---------------------------------------------------------------------+

7.22 EXPLAIN句法(得到關於SELECT的資訊)

    EXPLAIN tbl_name
or  EXPLAIN SELECT select_options

EXPLAIN tbl_name是DESCRIBE tbl_name或SHOW COLUMNS
FROM tbl_name的一個同義詞。

當你在一條SELECT語句前放上關鍵詞EXPLAIN，MySQL解釋它將如何處理SELECT，提供有關表如何聯結和以什麼次序聯結的資訊。

借助於EXPLAIN，你可以知道你什麼時候必須為表加入索引以得到一個使用索引找到記錄的更快的SELECT。你也能知道最佳化器是否以一個最佳次序聯結表。為了強制最佳化器對一個SELECT語句使用一個特定聯結次序，增加一個STRAIGHT_JOIN子句。

對於非簡單的聯結，EXPLAIN為用於SELECT語句中的每個表返回一行資訊。表以他們將被讀入的順序被列出。MySQL用一邊掃描多次聯結的方式解決所有聯結，這意味著MySQL從第一個表中讀一行，然後找到在第二個表中的一個匹配行，然後在第3個表中等等。當所有的表被處理完，它輸出選擇的列並且回溯表列表直到找到一個表有更多的匹配行，從該表讀入下一行並繼續處理下一個表。

從EXPLAIN的輸出包括下面列：

table

輸出的行所引用的表。

type

聯結類型。各種類型的資訊在下面給出。

possible_keys

possible_keys列指出MySQL能使用哪個索引在該表中找到行。注意，該列完全獨立於表的次序。這意味著在possible_keys中的某些鍵實際上不能以產生的表次序使用。如果該列是空的，沒有相關的索引。在這種情況下，你也許能通過檢驗WHERE子句看是否它引用某些列或列不是適合索引來提高你的查詢性能。如果是這樣，創造一個適當的索引並且在用EXPLAIN檢查查詢。見7.8 ALTER TABLE句法。為了看清一張表有什麼索引，使用SHOW
    INDEX FROM tbl_name。

key

key列顯示MySQL實際決定使用的鍵。如果沒有索引被選擇，鍵是NULL。

key_len

key_len列顯示MySQL決定使用的鍵長度。如果鍵是NULL，長度是NULL。注意這告訴我們MySQL將實際使用一個多部鍵值的幾個部分。

ref

ref列顯示哪個列或常數與key一起用於從表中選擇行。

rows

rows列顯示MySQL相信它必須檢驗以執行查詢的行數。

Extra

如果Extra列包括文字Only index，這意味著資訊只用索引樹中的資訊檢索出的。通常，這比掃描整個表要快。如果Extra列包括文字where
    used，它意味著一個WHERE子句將被用來限制哪些行與下一個表匹配或發向客戶。

不同的聯結類型列在下面，以最好到最差類型的次序：

system

桌子僅有一行(=系統表)。這是const聯結類型的一個特例。

const

桌子有最多一個匹配行，它將在查詢開始時被讀取。因為僅有一行，在這行的列值可被剩下的最佳化器認為是常數。
    const表很快，因為它們只讀取一次！

eq_ref

對於每個來自於先前的表的行組合，從該表中讀取一行。這可能是最好的聯結類型，除了const類型。它用在一個索引的所有部分被聯結使用並且索引是UNIQUE或PRIMARY
    KEY。

ref

對於每個來自於先前的表的行組合，所有有匹配索引值的行將從這張表中讀取。如果聯結只使用鍵的最左面前綴，或如果鍵不是UNIQUE或PRIMARY
    KEY（換句話說，如果聯結不能基於鍵值選擇單個行的話)，使用ref。如果被使用的鍵僅僅匹配一些行，該聯結類型是不錯的。

range

只有在一個給定範圍的行將被檢索，使用一個索引選擇行。ref列顯示哪個索引被使用。

index

這與ALL相同，除了只有索引樹被掃描。這通常比ALL快，因為索引文件通常比數據文件小。

ALL

對於每個來自於先前的表的行組合，將要做一個完整的表掃描。如果表格是第一個沒標記const的表，這通常不好，並且通常在所有的其他情況下很差。你通常可以通過增加更多的索引來避免ALL，使得行能從早先的表中基於常數值或列值被檢索出。

通過相乘EXPLAIN輸出的rows行的所有值，你能得到一個關於一個聯結要多好的提示。這應該粗略地告訴你MySQL必須檢驗多少行以執行查詢。當你使用max_join_size變數限制查詢時，也用這個數字。見10.2.3 調節伺服器參數。

下列例子顯示出一個JOIN如何能使用EXPLAIN提供的資訊逐步被最佳化。

假定你有顯示在下面的SELECT語句，你使用EXPLAIN檢驗：

EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
            tt.ProjectReference, tt.EstimatedShipDate,
            tt.ActualShipDate, tt.ClientID,
            tt.ServiceCodes, tt.RepetitiveID,
            tt.CurrentProcess, tt.CurrentDPPerson,
            tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
            et_1.COUNTRY, do.CUSTNAME
        FROM tt, et, et AS et_1, do
        WHERE tt.SubmitTime IS NULL
            AND tt.ActualPC = et.EMPLOYID
            AND tt.AssignedPC = et_1.EMPLOYID
            AND tt.ClientID = do.CUSTNMBR;

對於這個例子，假定：

  • 被比較的列被聲明如下：

        表
         | 列
         | 列類型

        tt
         | ActualPC
         | CHAR(10)

        tt
         | AssignedPC
         | CHAR(10)

        tt
         | ClientID
         | CHAR(10)

        et
         | EMPLOYID
         | CHAR(15)

        do
         | CUSTNMBR
         | CHAR(15)

    •

  • 表有顯示在下面的索引：

        表
         | 索引

        tt
         | ActualPC

        tt
         | AssignedPC

        tt
         | ClientID

        et
         | EMPLOYID（主鍵）

        do
         | CUSTNMBR（主鍵）

    •

  • tt.ActualPC值不是均勻分布的。
    •

開始，在任何最佳化被施行前，EXPLAIN語句產生下列資訊：

table type possible_keys                key  key_len ref  rows  Extra
et    ALL  PRIMARY                      NULL NULL    NULL 74
do    ALL  PRIMARY                      NULL NULL    NULL 2135
et_1  ALL  PRIMARY                      NULL NULL    NULL 74
tt    ALL  AssignedPC,ClientID,ActualPC NULL NULL    NULL 3872
      range checked for each record (key map: 35)

因為type對每張表是ALL，這個輸出顯示MySQL正在對所有表進行一個完整聯結！這將花相當長的時間，因為必須檢驗每張表的行數的乘積次數！對於一個實例，這是74
* 2135 * 74 * 3872 = 45,268,558,720行。如果表更大，你只能想像它將花多長時間……

如果列聲明不同，這裡的一個問題是MySQL(還)不能高效地在列上使用索引。在本文中，VARCHAR和CHAR是相同的，除非他們聲明為不同的長度。因為tt.ActualPC被聲明為CHAR(10)並且et.EMPLOYID被聲明為CHAR(15)，有一個長度失配。

為了修正在列長度上的不同，使用ALTER TABLE將ActualPC的長度從10個字符變為15個字符：

mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

現在tt.ActualPC和et.EMPLOYID都是VARCHAR(15)，再執行EXPLAIN語句產生這個結果：

table type   possible_keys   key     key_len ref         rows    Extra
tt    ALL    AssignedPC,ClientID,ActualPC NULL NULL NULL 3872    where used
do    ALL    PRIMARY         NULL    NULL    NULL        2135
      range checked for each record (key map: 1)
et_1  ALL    PRIMARY         NULL    NULL    NULL        74
      range checked for each record (key map: 1)
et    eq_ref PRIMARY         PRIMARY 15      tt.ActualPC 1

這不是完美的，但是是好一些了(rows值的乘積少了一個74一個因子)，這個版本在幾秒內執行。

第2種改變能消除tt.AssignedPC = et_1.EMPLOYID和tt.ClientID =
do.CUSTNMBR比較的列的長度失配：

mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
                      MODIFY ClientID   VARCHAR(15);

現在EXPLAIN產生的輸出顯示在下面：

table type   possible_keys   key     key_len ref            rows     Extra
et    ALL    PRIMARY         NULL    NULL    NULL           74
tt    ref    AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used
et_1  eq_ref PRIMARY         PRIMARY 15      tt.AssignedPC  1
do    eq_ref PRIMARY         PRIMARY 15      tt.ClientID    1

這“幾乎”像它能得到的一樣好。

剩下的問題是，預設地，MySQL假設在tt.ActualPC列的值是均勻分布的，並且對tt表不是這樣。幸好，很容易告訴MySQL關於這些：

shell> myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt
shell> mysqladmin refresh

現在聯結是“完美”的了，而且EXPLAIN產生這個結果：

table type   possible_keys   key     key_len ref            rows    Extra
tt    ALL    AssignedPC,ClientID,ActualPC NULL NULL NULL    3872    where used
et    eq_ref PRIMARY         PRIMARY 15      tt.ActualPC    1
et_1  eq_ref PRIMARY         PRIMARY 15      tt.AssignedPC  1
do    eq_ref PRIMARY         PRIMARY 15      tt.ClientID    1

注意在從EXPLAIN輸出的rows列是一個來自MySQL聯結最佳化器的“教育猜測”﹔為了最佳化查詢，你應該檢查數字是否接近事實。如果不是，你可以通過在你的SELECT語句裡面使用STRAIGHT_JOIN並且試著在在FROM子句以不同的次序列出表，可能得到更好的性能。

7.23 DESCRIBE句法 (得到列的資訊）

{DESCRIBE | DESC} tbl_name {col_name | wild}

DESCRIBE提供關於一張表的列的資訊。col_name可以是一個列名字或包含SQL的“%”和“_”通配符的一個字符串。

如果列類型不同於你期望的是基於一個CREATE TABLE語句，注意MySQL有時改變列類型。見7.7.1 隱含的列說明變化。

這個語句為了與 Oracle 兼容而提供的。

SHOW語句提供類似的資訊。見7.21
SHOW句法(得到表，列的資訊)。

7.24 LOCK TABLES/UNLOCK
TABLES句法

LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES

LOCK TABLES為當前執行緒鎖定表。UNLOCK TABLES釋放被當前執行緒持有的任何鎖。當執行緒發出另外一個LOCK
TABLES時，或當伺服器的連接被關閉時，當前執行緒鎖定的所有表自動被解鎖。

如果一個執行緒獲得在一個表上的一個READ鎖，該執行緒(和所有其他執行緒)只能從表中讀。如果一個執行緒獲得一個表上的一個WRITE鎖，那麼只有持鎖的執行緒READ或WRITE表，其他執行緒被阻止。

每個執行緒等待(沒有超時)直到它獲得它請求的所有鎖。

WRITE鎖通常比READ鎖有更高的優先級，以確保更改盡快被處理。這意味著，如果一個執行緒獲得READ鎖，並且然後另外一個執行緒請求一個WRITE鎖,
隨後的READ鎖請求將等待直到WRITE執行緒得到了鎖並且釋放了它。當執行緒正在等待WRITE鎖時，你可以使用LOW_PRIORITY
WRITE允許其他執行緒獲得READ鎖。如果你肯定終於有個時刻沒有執行緒將有一個READ鎖，你應該只使用LOW_PRIORITY
WRITE。

當你使用LOCK TABLES時，你必須鎖定你將使用的所有表！如果你正在一個查詢中多次使用一張表(用別名)，你必須對每個別名得到一把鎖！這條政策保証表鎖定不會死鎖。

注意你應該不鎖定任何你正在用INSERT DELAYED使用的表，這是因為在這種情況下，INSERT被一個不同的執行緒執行。

通常，你不必鎖定表，因為所有單個UPDATE語句是原語﹔沒有其他執行緒能防礙任何其它正在執行SQL語句的執行緒。當你想鎖定表，有一些情況：

  • 如果你將在一堆表上運行許多操作，鎖定你將使用的表是較快的。當然缺點是，沒有其他執行緒能更新一個READ鎖定的表並且沒有其他執行緒能讀一個WRITE-鎖定的表。

    •

  • MySQL不支援事務環境，所以如果你想要保証在一個SELECT和一個UPDATE之間沒有其他執行緒到來，你必須使用LOCK
    TABLES。下面顯示的例子要求LOCK TABLES以便安全地執行：

    mysql> LOCK TABLES trans READ, customer WRITE;
mysql> select sum(value) from trans where customer_id= some_id;
mysql> update customer set total_value=sum_from_previous_statement
           where customer_id=some_id;
mysql> UNLOCK TABLES;

    •

沒有LOCK TABLES，另外一個執行緒可能有一個機會在執行SELECT和UPDATE語句之間往trans表中插入一個新行。

通過使用漸增更改(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函數，在很多情況下你能使用LOCK
TABLES來避免。

你也可以使用用戶級鎖定函數GET_LOCK()和RELEASE_LOCK()解決一些情況，這些鎖保存在伺服器的一張哈希表中並且用pthread_mutex_lock()和pthread_mutex_unlock()實現以獲得高速度。見7.4.12 其他函數。

有關鎖定政策的更多資訊，見10.2.8 MySQL 怎樣鎖定表。

7.25 SET OPTION句法

SET [OPTION] SQL_VALUE_OPTION= value, ...

SET OPTION設置影響伺服器或你的客戶操作的各種選項。你設置的任何選擇保持有效直到當前會話結束，或直到你設置選項為不同的值。

CHARACTER SET character_set_name | DEFAULT

這用給定的映射表從/到客戶映射所有字符串。對character_set_name當前唯一的選項是
    cp1251_koi8，但是你能容易通過編輯在MySQL原始碼版本的“sql/convert.cc”文件增加新的映射。預設映射能用character_set_name的DEFAULT值恢復。注意設置CHARACTER
    SET選項的語法不同於設置其他選項目的語法。

PASSWORD = PASSWORD('some password')

設置當前用戶的密碼。任何非匿名的用戶能改變他自己的密碼！

PASSWORD FOR user = PASSWORD('some password')

設置當前伺服器主機上的一個特定用戶的密碼。只有具備存取mysql資料庫的用戶可以這樣做。用戶應該以user@hostname格式給出，這裡user和hostname完全與他們列在mysql.user表條目的User和Host列一樣。例如，如果你有一個條目其User和Host字段是'bob'和'%.loc.gov'，你將寫成：

mysql> SET PASSWORD FOR bob@"%.loc.gov" = PASSWORD("newpass");

或

mysql> UPDATE mysql.user SET password=PASSWORD("newpass") where user="bob' and host="%.loc.gov";

SQL_AUTO_IS_NULL = 0 | 1

如果設置為1（預設 )，那麼對於一個具有一個自動加1的行的表，用下列構件能找出最後插入的行：WHERE
    auto_increment_column IS NULL。這被一些 ODBC 程式入Access使用。

SQL_BIG_TABLES = 0 | 1

如果設置為1，所有臨時表存在在磁碟上而非內存中。這將更慢一些，但是對需要大的臨時表的大SELECT操作，你將不會得到The
    table tbl_name is full的錯誤。對於一個新連接的預設值是0（即，使用內存中的臨時表)。

SQL_BIG_SELECTS = 0 | 1

如果設置為0，如果一個SELECT嘗試可能花很長的時間，MySQL將放棄。這在一個不妥當的WHERE語句發出時是有用的。一個大的查詢被定義為一個將可能必須檢驗多於max_join_size行的SELECT。對一個新連接的預設值是1（它將允許所有SELECT語句)。

SQL_LOW_PRIORITY_UPDATES = 0 | 1

如果設置為1，所有INSERT、UPDATE、DELETE和LOCK
    TABLE WRITE語句等待，直到在受影響的表上沒有未解決的SELECT或LOCK
    TABLE READ。

SQL_SELECT_LIMIT = value | DEFAULT

從SELECT語句返回的記錄的最大數量。如果一個SELECT有一個LIMIT子句，LIMIT優先與SQL_SELECT_LIMIT值。對一個新連接的預設值是“無限”的。如果你改變了限制，預設值能用SQL_SELECT_LIMIT的一個DEFAULT值恢復。

SQL_LOG_OFF = 0 | 1

如果設置為1，如果客戶有process權限，對該客戶沒有日誌記載到標準的日誌文件中。這不影響更新日誌記錄！

SQL_LOG_UPDATE = 0 | 1

如果設置為0, 如果客戶有process權限，對該客戶沒有日誌記載到更新日誌中。這不影響標準日誌文件！

TIMESTAMP = timestamp_value | DEFAULT

為該客戶設置時間。如果你使用更新日誌恢復行，這被用來得到原來的時間標記。

LAST_INSERT_ID = #

設置從LAST_INSERT_ID()返回的值。當你在更新一個表的命令中使用LAST_INSERT_ID()時，它儲存在更新日誌中。

INSERT_ID = #

設置當插入一個AUTO_INCREMENT值時，由INSERT命令使用的值。這主要與更新日誌一起使用。

7.26 GRANT和REVOKE句法

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    TO user_name [IDENTIFIED BY 'password']
        [, user_name [IDENTIFIED BY 'password'] ...]
    [WITH GRANT OPTION]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    FROM user_name [, user_name ...]

GRANT在MySQL 3.22.11或以後版本中實現。對於更早MySQL版本，GRANT語句不做任何事情。

GRANT和REVOKE命令允許系統主管在4個權限級別上授權和撤回賦予MySQL用戶的權利：

全局級別

全局權限作用於一個給定伺服器上的所有資料庫。這些權限儲存在mysql.user表中。

資料庫級別

資料庫權限作用於一個給定資料庫的所有表。這些權限儲存在mysql.db和mysql.host表中。

表級別

表權限作用於一個給定表的所有列。這些權限儲存在mysql.tables_priv表中。

列級別

列權限作用於在一個給定表的單個列。這些權限儲存在mysql.columns_priv表中。

對於GRANT如何工作的例子，見6.11 為MySQL增加新的用戶權限。

對於GRANT和REVOKE語句，priv_type可以指定下列的任何一個：

ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE

ALL是ALL PRIVILEGES的一個同義詞，REFERENCES還沒被實現，USAGE當前是“沒有權限”的一個同義詞。它能用在你想要創建一個沒有權限用戶的時候。

為了從一個用戶撤回grant的權限，使用GRANT OPTION的一個priv_type值：

REVOKE GRANT OPTION ON ... FROM ...;

對於表，你能指定的唯一priv_type值是SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT、INDEX和ALTER。

對於列，你能指定的唯一priv_type值是(即，當你使用一個column_list子句時)是SELECT、INSERT和UPDATE。

你能通過使用ON *.*語法設置全局權限，你能通過使用ON
db_name.*語法設置資料庫權限。如果你指定ON *並且你有一個當前資料庫，你將為該資料庫設置權限。(警告：如果你指定ON
*而你沒有一個當前資料庫，你將影響全局權限！）

為了容納對任意主機的用戶授予的權利，MySQL支援以user@host格式指定user_name值。如果你想要指定一個特殊字符的一個user字符串(例如“-”)，或一個包含特殊字符或通配符的host字符串(例如“%”)，你可以用括號括起能用戶或主機名字
(例如，'test-user'@'test-hostname')。

你能在主機名中指定通配符。例如，user@"%.loc.gov"適用於在loc.gov域刈酚何主機的user，並且user@"144.155.166.%"適用於在144.155.166類
C 子網刈酚何主機的user。

簡單形式的user是user@"%"的一個同義詞。注意：如果你允許匿名用戶連接MySQL伺服器(它是預設的)，你也應該增加所有本地用戶如user@localhost，因為否則，當用戶試圖從本地機器上登錄到MySQL伺服器時，對於mysql.user表中的本地主機的匿名用戶條目將被使用！匿名用戶通過插入有User=''的條目到mysql.user表中來定義。通過執行這個查詢，你可以檢驗它是否作用於你：

mysql> SELECT Host,User FROM mysql.user WHERE User='';

目前，GRANT僅支援最長60個字符的主機、表、資料庫和列名。一個用戶名字能最多到16個字符。

對與一個表或列的權限是由4個權限級別的邏輯或形成的。例如，如果mysql.user表指定一個用戶有一個全局select權限，它不能被資料庫、表或列的一個條目否認。

對於一個列的權限能如下計算：

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

在大多數情況下，你只授予用戶一個權限級別上的權限，因此現實通常不像上面所說的那樣複雜。:)
權限檢查程序的細節在6
MySQL 存取權限系統中給出。

如果你為一個在mysql.user表中不存在的用戶/主機名組合授權，一個條目被增加並且保留直到用一個DELETE命令刪除。換句話說，GRANT可以創建user表的條目，但是REVOKE將不刪除﹔你必須明確地使用DELETE刪除.

在MySQL 3.22.12或以後，如果創建一個新用戶或如果你有全局授予權限，用戶的密碼將被設置為由IDENTIFIED
BY子句指定的密碼，如果給出一個。如果用戶已經有了一個密碼，它被一個新的代替。

警告：如果你創造一個新用戶但是不指定一個IDENTIFIED
BY子句，用戶沒有密碼。這是不安全的。

密碼也能用SET PASSWORD命令設置。見7.25 SET OPTION句法。

如果你為一個資料庫授權，如果需要在mysql.db表中創建一個條目。當所有為資料庫的授權用REVOKE刪除時，這個條目被刪除。

如果一個用戶沒有在一個表上的任何權限，當用戶請求一系列表時，表不被顯示(例如，用一個SHOW
TABLES語句)。

WITH GRANT OPTION子句給與用戶有授予其他用戶在指定的權限水平上的任何權限的能力。你應該謹慎對待你授予他grant權限的用戶，因為具有不同權限的兩個用戶也許能合並權限！

你不能授予其他用戶你自己不具備的權限﹔ agree權限允許你放棄你僅僅擁有的那些權限。

要知道，當你將一個特定權限級別上的grant授予其他用戶，用戶已經擁有(或在未來被授予！)的在該級別上的任何權限也可由該用戶授權。假定你授權一個用戶在一個資料庫上的insert權限，那麼如果你授權在資料庫上select權限並且指定WITH
GRANT OPTION，用戶能不僅放棄select權限，還有insert。如果你授權用戶在資料庫上的update權限，用戶能放棄insert、select和update。

你不應該將alter權限授予一個一般用戶。如果你這樣做，用戶可以通過重命名表試圖顛覆權限系統！

注意，如果你正在使用即使一個用戶的表或列的權限，伺服器要檢查所有用戶的表和列權限並且這將使MySQL慢下來一點。

當mysqld啟動時，所有的權限被讀入儲存器。資料庫、表和列權限馬上生效，而用戶級權限在下一次用戶連接時生效。你用GRANT或REVOKE對受權表執行的更改立即被伺服器知曉。如果你手工修改授權表(使用INSERT、UPDATE等等)，你應該執行一個FLUSH
PRIVILEGES語句或運行mysqladmin flush-privileges告訴伺服器再次裝載授權表。見6.9 權限變化何時生效。

ANSI SQL版本的GRANT與MySQL版本之間的最大差別：

  • ANSI SQL 沒有全局或資料庫級別權限，並且 ANSI SQL 不支援所有MySQL支援的權限。

    •

  • 當你在 ANSI SQL 拋棄一張表時，表的所有權限均被撤消。如果你在
    ANSI SQL 撤銷權限，所有基於該權限的授權也被也被撤消。在MySQL中，權限只能用明確的REVOKE命令或操作MySQL授權表拋棄。

    •

7.27　CREATE INDEX句法

CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length)],... )

CREATE INDEX語句在MySQL版本 3.22
以前不做任何事情。在 3.22 或以後版本中，CREATE INDEX被映射到一個ALTER
TABLE語句來創建索引。見7.8
ALTER TABLE句法。

通常，你在用CREATE TABLE創建表本身時創建表的所有索引。見7.7 CREATE TABLE句法。CREATE
INDEX允許你把索引加到現有表中。

一個(col1,col2,...)形式的列表創造一個多列索引。索引值有給定列的值串聯而成。

對於CHAR和VARCHAR列，索引可以只用一個列的部分來創建，使用col_name(length)句法。（在BLOB和TEXT列上需要長度)。下面顯示的語句使用name列的頭10個字符創建一個索引：

mysql> CREATE INDEX part_of_name ON customer (name(10));

因為大多數名字通常在頭10個字符不同，這個索引應該不比從整個name列的創建的索引慢多少。另外，在索引使用部分的列能使這個索引成為更小的文件大部分, 它能保存很多磁碟空格並且可能也加快INSERT操作！

注意，如果你正在使用MySQL版本 3.23.2
或更新並且正在使用MyISAM桌子類型，你只能在可以有NULL值的列或一個BLOB/TEXT列上增加一個索引，

關於MySQL如何使用索引的更多資訊，見10.4 MySQL索引的使用。

7.28 DROP INDEX句法

DROP INDEX index_name ON tbl_name

DROP INDEX從tbl_name表拋棄名為index_name的索引。DROP
INDEX在MySQL 3.22 以前的版本中不做任何事情。在 3.22
或以後，DROP INDEX被映射到一個ALTER TABLE語句來拋棄索引。見7.8 ALTER TABLE句法。

7.29 注釋句法

MySQL伺服器支援# to end of line、-- to end of
line和/* in-line or multiple-line */注釋風格：

mysql> select 1+1;     # This comment continues to the end of line
mysql> select 1+1;     -- This comment continues to the end of line
mysql> select 1 /* this is an in-line comment */ + 1;
mysql> select 1+
/*
this is a
multiple-line comment
*/
1;

注意--注釋風格要求你在--以後至少有一個空格！

盡管服務者理解剛才描述的注釋句法，mysql客戶分析/*
... */注釋的方式上有一些限制：

  • 單引號和雙引號字符被用來標誌一個括起來的字符串的開始，即使在一篇注釋內。如果引號在主室內沒被第2個引號匹配，分析器不知道注釋已經結束。如果你正在交互式運行mysql，你能告知有些混亂，因為提示符從mysql>變為'>或">。

    •

  • 一個分號被用來指出當前的SQL語句結束並且跟隨它的任何東西表示下一行的開始。

    •

當你交互式運行mysql時和當你把命令放在一個文件中並用mysql
< some-file告訴mysql從那個文件讀它的輸入時，這些限制都適用。

MySQL不支援‘--’的ANSI SQL注釋風格。見5.4.7 ‘--’作為一篇注釋的開始。

7.30 CREATE
FUNCTION/DROP FUNCTION句法

CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|REAL|INTEGER}
       SONAME shared_library_name

DROP FUNCTION function_name

一個用戶可定義函數(UDF)是用一個像MySQL的原生（內置）函數如ABS()和CONCAT()的新函數來擴展MySQL的方法。

AGGREGATE是MySQL 3.23的一個新選項。一個AGGREGATE函數功能就像一個原生MySQL
GROUP函數如SUM或COUNT()。

CREATE FUNCTION在mysql.func系統表中保存函數名、類型和共享庫名。你必須對mysql資料庫有insert和delete權限以創建和拋棄函數。

所有活躍的函數在每次伺服器啟動時被重新裝載，除非你使用--skip-grant-tables選項啟動mysqld，在這種情況下，UDF初始化被跳過並且UDF是無法獲得的。（一個活躍函數是一個已經用CREATE
FUNCTION裝載並且沒用DROP FUNCTION刪除的函數。)

關於編寫用戶可定義函數的指令，見14 為MySQL增加新函數。對於UDF的工作機制，函數必須用
C 或 C++
編寫，你的作業系統必須支援動態裝載並且你必須動態編譯了mysqld(不是靜態)。

7.31 MySQL對保留詞很挑剔嗎？

一個常見的問題源自於試圖使用MySQL內置的數據類型或函數名同名的列來創建資料庫表，例如TIMESTAMP或GROUP。你允許這樣做(例如，ABS是一個允許的列名)，但是當使用其名字也是列名的函數時，在一個函數名和“
( ”之間不允許白空。

下列詞明確地在MySQL中被保留。他們的大多數被 ANSI
SQL92 禁止作為列或表名(例如，group)。一些被保留因為MySQL需要他們並且正在(當前)使用一個yacc分析器：

action | add | aggregate | all
alter | after | and | as
asc | avg | avg_row_length | auto_increment
between | bigint | bit | binary
blob | bool | both | by
cascade | case | char | character
change | check | checksum | column
columns | comment | constraint | create
cross | current_date | current_time | current_timestamp
data | database | databases | date
datetime | day | day_hour | day_minute
day_second | dayofmonth | dayofweek | dayofyear
dec | decimal | default | delayed
delay_key_write | delete | desc | describe
distinct | distinctrow | double | drop
end | else | escape | escaped
enclosed | enum | explain | exists
fields | file | first | float
float4 | float8 | flush | foreign
from | for | full | function
global | grant | grants | group
having | heap | high_priority | hour
hour_minute | hour_second | hosts | identified
ignore | in | index | infile
inner | insert | insert_id | int
integer | interval | int1 | int2
int3 | int4 | int8 | into
if | is | isam | join
key | keys | kill | last_insert_id
leading | left | length | like
lines | limit | load | local
lock | logs | long | longblob
longtext | low_priority | max | max_rows
match | mediumblob | mediumtext | mediumint
middleint | min_rows | minute | minute_second
modify | month | monthname | myisam
natural | numeric | no | not
null | on | optimize | option
optionally | or | order | outer
outfile | pack_keys | partial | password
precision | primary | procedure | process
processlist | privileges | read | real
references | reload | regexp | rename
replace | restrict | returns | revoke
rlike | row | rows | second
select | set | show | shutdown
smallint | soname | sql_big_tables | sql_big_selects
sql_low_priority_updates | sql_log_off | sql_log_update | sql_select_limit
sql_small_result | sql_big_result | sql_warnings | straight_join
starting | status | string | table
tables | temporary | terminated | text
then | time | timestamp | tinyblob
tinytext | tinyint | trailing | to
type | use | using | unique
unlock | unsigned | update | usage
values | varchar | variables | varying
varbinary | with | write | when
where | year | year_month | zerofill

下列符號(來自上表)被ANSI SQL禁止但是被MySQL允許作為列/表名。這是因為這些名字的一些是很自然的名字並且很多人已經使用了他們。

  • ACTION
    •

  • BIT
    •

  • DATE
    •

  • ENUM
    •

  • NO
    •

  • TEXT
    •

  • TIME
    •

  • TIMESTAMP
    •

去第一章, 前一章, 下一章,
最後一章，目錄.


MySQL 中文參考手冊- 8 MySQL 教學課程

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

8 MySQL教學課程

本章通過演示如何使用mysql客戶程式創造和使用一個簡單的資料庫，提供一個MySQL的入門教學課程。mysql（有時稱為“終端監視器”或只是“監視”)是一個交互式程式，允許你連接一個MySQL伺服器，運行查詢並察看結果。mysql可以用於批模式：你預先把查詢放在一個文件中，然後告訴mysql執行文件的內容。使用mysql的兩個方法都在這裡涉及。

為了看清由mysql提供的一個選擇項目表了，用--help選項調用它：

shell> mysql --help

本章假定mysql已經被安裝在你的機器上，並且有一個MySQL伺服器你可以連接。如果這不是真的，聯絡你的MySQL管理員。（如果你是管理員，你將需要請教這本手冊的其他章節。）

本章描述建立和使用一個資料庫的全程序。如果你僅僅對存取一個已經存在資料庫感興趣，你可能想要跳過描述怎樣創建資料庫及它所包含的表的章節。

既然本章本質上是一個教學課程，許多細節有必要被省略。對於這裡所涉及的話題的更多資訊，咨詢本手冊的相關章節。

8.1 連接與斷開服務者

為了連接伺服器，當你調用mysql時，你通常將需要提供一個MySQL用戶名和很可能，一個密碼。如果伺服器運行在不是你登錄的一台機器上，你也將需要指定主機名。聯繫你的管理員以找出你應該使用什麼連接參數進行連接(即，那個主機，用戶名字和使用的密碼)。一旦你知道正確的參數，你應該能像這樣連接：

shell> mysql -h host -u user -p
Enter password: ********

********代表你的密碼﹔當mysql顯示Enter password:提示時輸入它。

如果能工作，你應該看見mysql>提示後的一些介紹資訊：

shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log

Type 'help' for help.

mysql>

提示符告訴你mysql準備為你輸入命令。

一些MySQL安裝允許用戶以“anoymous”(匿名)用戶連接在本地主機上運行的伺服器。如果在你的機器是這種情況，你應該能通過沒有任何選項地調用mysql與該伺服器連接：

shell> mysql

在你成功地連接後，你可以在mysql>提示下打入QUIT隨時斷開：
mysql> QUIT
Bye

你也可以鍵入control-D斷開。

在下列章節的大多數例子都假設你連接到伺服器。由mysql>提示指明他們。

8.2 輸入查詢

確保你連接上了伺服器，如在先前的章節討論的。這樣做本身將不選擇任何資料庫來工作，但是那很好。從這點講，知道關於如何出詢問的一點知識，比馬上跳至創建表、給他們裝載數據並且從他們檢索數據要來的重要寫。本節描述輸入命令的基本原則，使用幾個查詢，你能嘗試讓自己mysql是如何工作的。

這是一個簡單的命令，要求伺服器告訴你它的版本號和當前日期。在mysql>提示打入如下命令並按回車鍵：

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

這詢問說明關於mysql幾件事:

  • 一個命令通常由SQL語句組成，隨後有一個分號。（有一些例外不需要一個分號。早先提到的QUIT是他們之一。我們將以後看到其它。）
  • 當你發出一個命令時，mysql發送它給伺服器並顯示結果，然後打出另外一個mysql>顯示它準備好接受另外的命令。
  • mysql以一張表格(行和列)顯示查詢輸出。第一行包含列的標簽，隨後的行是詢問結果。通常， 列標簽是你取自資料庫表的列的名字。如果你正在檢索一個表達式而非表列的值(如剛才的例子)，mysql用表達式本身標記列。
  • mysql顯示多少行被返回，和查詢花了多長執行，它給你提供伺服器性能的一個大致概念。因為他們表示時鐘時間(不是 CPU 或機器時間)，並且因為他們受到諸如伺服器負載和網路延時的影響，因此這些值是不精確的。（為了簡潔，在本章剩下的例子中不再顯示“集合中的行”。）

關鍵詞可以以任何大小寫字符被輸入。下列詢問是等價的：

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

這裡有另外一個查詢，它說明你能將mysql用作一個簡單的計算器：
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+

至今顯示的命令是相當短的，單行語句。你甚至能在單行上輸入多條語句，只是以一個分號結束每一條：

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+

+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

一個命令不必全在一個單獨行給出，所以需要多行的較長命令不是一個問題。mysql通過尋找終止的分號而不是尋找輸入行的結束來決定你的語句在哪兒結束。（換句話說，mysql接受自由格式輸入：它收集輸入行但執行他們直到它看見分號。）

這裡是一個簡單的多行語句的例子：

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

在這個例子中，在你輸入一個多行查詢的第一行後，要注意提示符如何從mysql>變為->，這正是mysql如何指出它沒見到完整的語句並且正在等待剩餘的部分。提示符是你的朋友，因為它提供有價值的反饋，如果你使用該反饋，你將總是知道mysql正在等待什麼。

如果你決定，你不想要執行你在輸入程序中輸入的一個命令，打入\c取消它：

mysql> SELECT
    -> USER()
    -> \c
mysql>

這裡也要注意提示符，在你打入\c以後，它切換回到mysql>，提供反饋以表明mysql準備接受一個新命令。

下表顯示出你可以看見的各個提示符並總結他們意味著mysql在什麼狀態下：

提示符 | 意思
mysql> | 準備好接受新命令
-> | 等待多行命令的下一行
'> | 等待下一行，收集以單引號(“'”)開始的字符串
"> | 等待下一行，收集以雙引號(“"”)開始的字符串

當你打算在一個單行上發出一個命令時，多行語句通常“偶然”出現，但是忘記終止的分號。在這種情況中，mysql等待進一步輸入：

mysql> SELECT USER()
    ->

如果這發生在你身上(你認為你輸完了語句但是唯一的反應是一個->提示符)，很可能mysql正在等待分號。如果你沒有注意到提示符正在告訴你什麼，在認識到你需要做什麼之前，你可能花一會兒時間呆坐在那兒。進入一個分號完成語句，並且mysql將執行它：

mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@localhost |
+--------------------+

'>和">提示符出現在在字符串收集期間。在MySQL中，你可以寫由“'”或“"”字符括起來的字符串 (例如，'hello'或"goodbye")，並且mysql讓你進入跨越多行的字符串。當你看到一個'>或">提示符時，這意味著你已經輸入了包含以“'”或“"”括號字符開始的字符串的一行，但是還沒有輸入終止字符串的匹配引號。如果你確實正在輸入一個多行字符串，很好，但是果真如此嗎？不盡然。更常見的，'>和">提示符顯示你粗心地省掉了一個引號字符。例如：

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    ">

如果你輸入該SELECT語句，然後按回車鍵並等待結果，什麼都沒有出現。不要驚訝，“為什麼該查詢這麼長呢？”，注意">提示符提供的線索。它告訴你mysql期望見到一個未終止字符串的餘下部分。（你在語句中看見錯誤嗎？字符串"Smith正好丟失第二個引號。）

走到這一步，你該做什麼？最簡單的是取消命令。然而，在這種情況下，你不能只是打入\c，因為mysql作為它正在收集的字符串的一部分來解釋它！相反，輸入關閉的引號字符(這樣mysql知道你完成了字符串)，然後打入\c：

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    "> "\c
mysql>

提示符回到mysql>，顯示mysql準備好接受一個新命令了。

知道'>和">提示符意味著什麼是很重要的，因為如果你錯誤地輸入一個未終止的字符串，任何比你下一步輸入的行好像將要被mysql忽略--包括包含QUIT的行！這可能相當含糊，特別是在你能取消當前命令前，如果你不知道你需要提出終止引號。

8.3 常用查詢的例子

下面是一些學習如何用MySQL解決一些常見問題的例子。

一些例子使用資料庫表“shop”，包含某個商人的每篇文章(物品號)的價格。假定每個商人的每篇文章有一個單獨的固定價格，那麼(物品，商人)是記錄的主鍵。

你能這樣創建例子資料庫表：

CREATE TABLE shop (
 article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
 dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
 price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
 PRIMARY KEY(article, dealer));

INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);

好了，例子數據是這樣的：

SELECT * FROM shop

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

8.3.1 列的最大值

“最大的物品號是什麼？”

SELECT MAX(article) AS article FROM shop

+---------+
| article |
+---------+
|       4 |
+---------+

8.3.2 擁有某個列的最大值的行

“找出最貴的文章的編號、商人和價格”

在ANSI-SQL中這很容易用一個子查詢做到：

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop)

在MySQL中（還沒有子查詢)就用2步做到：

  1. 用一個SELECT語句從表中得到最大值。
  2. 使用該值編出實際的查詢：
    SELECT article, dealer, price
FROM   shop
WHERE  price=19.95

另一個解決方案是按價格降序排序所有行並用MySQL特定LIMIT子句只得到的第一行：

SELECT article, dealer, price
FROM   shop
ORDER BY price DESC
LIMIT 1

注意:如果有多個最貴的文章( 例如每個19.95)，LIMIT解決方案僅僅顯示他們之一！

8.3.3 列的最大值：按組：只有值

“每篇文章的最高的價格是什麼？”

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

8.3.4 擁有某個字段的組間最大值的行

“對每篇文章，找出有最貴的價格的交易者。”

在ANSI SQL中，我可以用這樣一個子查詢做到：

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article)

在MySQL中，最好是分幾步做到：

  1. 得到一個表(文章，maxprice)。見8.3.4 擁有某個域的組間最大值的行。
  2. 對每篇文章，得到對應於儲存最大價格的行。

這可以很容易用一個臨時表做到：

CREATE TEMPORARY TABLE tmp (
        article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
        price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);

LOCK TABLES article read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

SELECT article, dealer, price FROM shop, tmp
WHERE shop.article=tmp.articel AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;

如果你不使用一個TEMPORARY表，你也必須鎖定“tmp”表。

“它能一個單個查詢做到嗎？”

是的，但是只有使用我稱之為“MAX-CONCAT詭計”的一個相當低效的詭計：

SELECT article,
       SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM   shop
GROUP BY article;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

最後例子當然能通過在客戶程式中分割連結的列使它更有效一點。

8.3.5 使用外鍵

不需要外鍵聯結2個表。

MySQL唯一不做的事情是CHECK以保証你使用的鍵確實在你正在引用表中存在，並且它不自動從有一個外鍵定義的表中刪除行。如果你像平常那樣使用你的鍵值，它將工作得很好！

CREATE TABLE persons (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirts (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
    PRIMARY KEY (id)
);

INSERT INTO persons VALUES (NULL, 'Antonio Paz');

INSERT INTO shirts VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO shirts VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't-shirt', 'white', LAST_INSERT_ID());

SELECT * FROM persons;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirts;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+

SELECT s.* FROM persons p, shirts s
 WHERE p.name LIKE 'Lilliana%'
   AND s.owner = p.id
   AND s.color &lt;&gt; 'white';

+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

8.4 創造並使用一個資料庫

既然你知道怎樣輸入命令，現在是存取一個資料庫的時候了。

假定在你的家(你的“動物園”)中有很多寵物，並且你想追蹤關於他們各種各樣類型的資訊。你可以通過創建表來保存你的數據並根據所需要的資訊裝載他們做到，然後你可以通過從表中檢索數據來回答關於你的動物不同種類的問題。本節顯示如何做到所有這些事情：

  • 怎樣創建一個資料庫
  • 怎樣創建一個資料庫表
  • 怎樣裝載數據到資料庫表
  • 怎樣以各種方法從表中檢索數據
  • 怎樣使用多個表

動物園資料庫將會是簡單的(故意的)，但是不難把它想像成可能用到相似類型資料庫的真實世界情況。例如，這樣的一個資料庫能被一個農夫用來追蹤家畜，或由一個獸醫追蹤病畜記錄。

使用SHOW語句找出在伺服器上當前存在什麼資料庫：

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

資料庫列表可能在你的機器上是不同的，但是mysql和test資料庫很可能的在其間。mysql是必需的，因為它描述用戶存取權限，test資料庫經常作為一個工作區提供給用戶試試身手。

如果test資料庫存在，嘗試存取它：

mysql> USE test
Database changed

注意，USE，類似QUIT，不需要一個分號。（如果你喜歡，你可以用一個分號終止這樣的語句﹔這無礙)USE語句在使用上也有另外一個特殊的地方：它必須在一個單行上給出。

你可列在後面的例子中使用test資料庫(如果你能訪問它)，但是你在該資料庫創建的任何東西可以被與訪問它的其他人刪除，為了這個原因，你可能應該詢問你的MySQL管理員許可你自己使用的一個資料庫。假定你想要調用你的menagerie，管理員需要執行一個這樣的命令：

mysql> GRANT ALL ON menagerie.* TO your_mysql_name;

這裡your_mysql_name是分配給你的MySQL用戶名。

8.4.1 創建並選用一個資料庫

如果在設置你的權限時，管理員為你創建了資料庫，你可以開始使用它。否則，你需要自己創建它：

mysql> CREATE DATABASE menagerie;

在Unix下，資料庫名字是區分大小寫的(不像SQL關鍵詞)，因此你必須總是以menagerie引用你的資料庫，不是Menagerie、MENAGERIE或一些其他變種。對表名也是這樣的。（在Windows下，該限制不適用，盡管你必須在一個給定的查詢中使用同樣的大小寫來引用資料庫和表。）

創建了一個資料庫並不選定以使用它，你必須明確地做這件事。為了使menagerie稱為當前的資料庫，使用這個命令：

mysql> USE menagerie
Database changed

你的資料庫只需要創建一次，但是你必須在每次啟動一個mysql會話時為使用而選擇它。你可以由發出上面一個USE語句做到。另外，當你調用時mysql，你可在命令行上選擇資料庫，就在你可能需要提供的任何連接參數之後指定其名字。例如：

shell> mysql -h host -u user -p menagerie
Enter password: ********

注意，menagerie不是你在剛才所示命令的密碼。如果你想要在命令行上在-p選項後提供你的密碼，你必須做到沒有多餘的空格(例如，如-pmypassword，不是-p mypassword)。然而，不建議把你的密碼放在命令行上，因為這樣做把它暴露出來，能被在你的機器上登錄的其他用戶窺探到。

8.4.2 創建一個資料庫表

創建資料庫是容易的部分，但是在這時它是空的，正如SHOW TABLES將告訴你：

mysql> SHOW TABLES;
Empty set (0.00 sec)

較難的部分是決定你的資料庫結構應該是什麼：你將需要什麼資料庫表，和在他們中有什麼樣的列。

你將需要一個包含你每個寵物的記錄的表。它可稱為pet表，並且它應該包含，最少，每個動物的名字。因為名字本身不是很有趣，表應該包含另外的資訊。例如，如果在你豢養寵物的家庭有超過一個人，你可能想要列出每個動物的主人。你可能也想要記錄例如種類和性別的一些基本的描述資訊。

年齡呢？那可能有趣，但是在一個資料庫中儲存不是一件好事情。年齡隨著時間流逝而變化，這意味著你將要不斷地更新你的記錄。相反, 儲存一個固定值例如生日比較好，那麼，無論何時你需要年齡，你可以以當前日期和出生日期之間的差別來計算它。MySQL為日期運算提供了函數，因此這並不困難。儲存出生日期而非年齡也有其他優點：

  • 你可以將資料庫用於這樣的任務例如產生即將到來的寵物生日的提示。（如果你認為這類查詢是點蠢，注意，這與在一個商務資料庫來標示你不久要給它發出生日祝賀的客戶的環境中是同一個問題，因為計算機幫助私人聯絡。）
  • 你可以相對於日期而不止是當前日期來計算年齡。例如，如果你在資料庫儲存死亡日期，你能容易計算一只寵物是何時多大死的。

你可能想到pet表中其他有用的其他類型資訊，但是到目前為止這些現在是足夠了：名字、主人、種類，性別、出生和死亡日期。

使用一個CREATE TABLE語句指定你的資料庫表的布局：

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

VARCHAR對name、owner和species列是個好的選擇，因為列值將會是變長的。這些列的長度都不必是相同的，而且不必是20。你可以挑選從1到255的任何長度，無論哪個對你來說好像最合理。（如果你做了較差的選擇，以後會變得你需要一個更長的字段，MySQL提供一個ALTER TABLE語句。）

動物性表可以用許多方法表示，例如，"m"和"f"，或也許"male"和"female"。使用單個字符"m"和"f"是最簡單的。

為birth和death列使用DATE數據類型是相當明顯的選擇。

既然你創建了一個表，SHOW TABLES應該產生一些輸出：

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet                 |
+---------------------+

為了驗証你的表是按你期望的方式被創建，使用一個DESCRIBE語句：

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

你能隨時DESCRIBE，例如，如果你忘記在你表中的列的名字或他們是什麼類型。

8.4.3 將數據裝入一個資料庫表

在你創建表後，你需要充實它。LOAD DATA和INSERT語句用於此。

假定你的寵物紀錄描述如下。（觀察到MySQL期望日期時以YYYY-MM-DD格式﹔這可能與你習慣的不同。）

name | owner | species | sex | birth | death
Fluffy | Harold | cat | f | 1993-02-04 |
Claws | Gwen | cat | m | 1994-03-17 |
Buffy | Harold | dog | f | 1989-05-13 |
Fang | Benny | dog | m | 1990-08-27 |
Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29
Chirpy | Gwen | bird | f | 1998-09-11 |
Whistler | Gwen | bird |  | 1997-12-09 |
Slim | Benny | snake | m | 1996-04-29 |

因為你是從一張空表開始的，充實它的一個容易方法是創建包含為你的動物各一行一個文本文件，然後用一個單個語句裝載文件的內容到表中。

你可以創建一個文本文件“pet.txt”，每行包含一個記錄，用定位符(tab)把值分開，並且以在CREATE TABLE語句中列出的列次序給出。對於丟失的值(例如未知的性別，或仍然活著的動物的死亡日期)，你可以使用NULL值。為了在你的文本文件表示這些，使用\N。例如，對Whistler鳥的記錄看起來像這樣的(這裡在值之間的空白是一個單個的定位字符)：

Whistler Gwen bird \N 1997-12-09 \N

為了裝載文本文件“pet.txt”到pet表中，使用這個命令：

mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

如果你願意，你能明確地在LOAD DATA語句中指出列值的分隔符和行尾標記，但是預設是定位符和換行符。這些對爭取讀入文件“pet.txt”的語句是足夠的。

當你想要一次增加一個新記錄時，INSERT語句是有用的。在它最簡單的形式，你為每一列提供值，以列在CREATE TABLE語句被列出的順序。假定Diane把一只新倉鼠命名為Puffball，你可以使用一個這樣INSERT語句增加一條新記錄：

mysql> INSERT INTO pet
    -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

注意，這裡字符串和日期值被指定為引號擴起來的字符串。另外，用INSERT，你能直接插入NULL代表不存在的值。你不能使用\N，就像你用LOAD DATA做的那樣。

從這個例子，你應該能看到涉及很多的鍵入用多個INSERT語句而非單個LOAD DATA語句裝載你的初始記錄。

8.4.4 從一個資料庫表檢索資訊

SELECT語句被用來從一張桌子拉出資訊。語句的一般格式是：

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy

what_to_select指出你想要看到的，這可以是列的一張表，或*表明“所有的列”。which_table指出你想要從其檢索數據的表。WHERE子句是可選的，如果它在，conditions_to_satisfy指定行必須滿足的檢索條件。

8.4.4.1 選擇所有數據

SELECT最簡單的形式是從一張表中檢索每樣東西：

mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+

如果你想要考察整個表，這種形式的SELECT是很有用的。例如，在你剛剛給它裝載了你的初始數據集裝以後。當它發生時，剛才顯示的輸出揭示了在你的數據文件的一個錯誤：在Bowser死了以後，它好像要出生了！請教你原來的家譜，你發現正確的出生年是1989，而不是1998。

至少有一些修正它的方法：

  • 編輯文件“pet.txt”改正錯誤，然後使用DELETE和LOAD DATA弄空表並且再次裝載它:
    mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

    然而, 如果你這樣做，你必須重新輸入Puffball記錄。

  • 用一個UPDATE語句僅修正錯誤記錄：
    mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";

如上所示，檢索整個表是容易的，但是一般你不想那樣做，特別地當表變得很大時。相反，你通常對回答一個特別的問題更感興趣，在這種情況下你在你想要的資訊上指定一些限制。讓我們看一些他們回答有關你寵物的問題的選擇查詢。

8.4.4.2 選擇特定行

你能從你的表刈荿選擇特定的行。例如，如果你想要驗証你對Bowser的出生日期所做的改變，像這樣選取Bowser的記錄：

mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

輸出証實年份現在正確記錄為1989，而不是1998。

字符串比較通常是大小些無關的，因此你可以指定名字為"bowser"、"BOWSER"等等，查詢結果將是相同的。

你能在任何列上指定條件，不只是name。例如，如果你想要知道哪個動物在1998以後出生的，測試birth列：

mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+

你能組合條件，例如，找出雌性的狗：

mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

上面的查詢使用AND邏輯操作符，也有一個OR操作符：

mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+

AND和OR可以混用。如果你這樣做，使用括號指明條件應該如何被分組是一個好主意：

mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
    -> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

8.4.4.3 選擇特定列

如果你不想要看到你的表的整個行，就命名你感興趣的列，用逗號分開。例如，如果你想要知道你的動物什麼時候出生的，選取name和birth列：

mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

找出誰擁有寵物，使用這個查詢：

mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+

然而，注意到查詢簡單地檢索每個記錄的owner字段，並且他們中的一些出現多次。為了使輸出減到最少，通過增加關鍵詞DISTINCT檢索出每個唯一的輸出記錄：

mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+

你能使用一個WHERE子句把行選擇與列選擇相結合。例如，為了只得到狗和貓的出生日期，使用這個查詢：

mysql> SELECT name, species, birth FROM pet
    -> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+

8.4.4.4 排序行

你可能已經注意到前面的例子中結果行沒有以特定的次序被顯示。然而，當行以某個有意義的方式排序，檢驗查詢輸出通常是更容易的。為了排序結果，使用一個ORDER BY子句。

這裡是動物生日，按日期排序：

mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

為了以逆序排序，增加DESC（下降 )關鍵字到你正在排序的列名上：

mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+

你能在多個列上排序。例如，按動物的種類排序，然後按生日，首先是動物種類中最年輕的動物，使用下列查詢：

mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+

注意DESC關鍵詞僅適用於緊跟在它之前的列名字(birth)﹔species值仍然以升序被排序。

8.4.4.5 日期計算

MySQL提供幾個函數，你能用來執行在日期上的計算，例如，計算年齡或提取日期的部分。

為了決定你的每個寵物有多大，用出生日期和當前日期之間的差別計算年齡。通過變換2個日期到天數，取差值，並且用365除(在一年裡的天數)：

mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
+----------+-------------------------------------+
| name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
+----------+-------------------------------------+
| Fluffy   |                                6.15 |
| Claws    |                                5.04 |
| Buffy    |                                9.88 |
| Fang     |                                8.59 |
| Bowser   |                                9.58 |
| Chirpy   |                                0.55 |
| Whistler |                                1.30 |
| Slim     |                                2.92 |
| Puffball |                                0.00 |
+----------+-------------------------------------+

盡管查詢可行，關於它還有能被改進的一些事情。首先，如果行以某個次序表示，其結果能更容易被掃描。第二，年齡列的標題不是很有意義的。

第一個問題通過增加一個ORDER BY name子句按名字排序輸出來解決。為了處理列標題，為列提供一個名字以便一個不同的標簽出現在輸出中(這被稱為一個列別名)：

mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
    -> FROM pet ORDER BY name;
+----------+------+
| name     | age  |
+----------+------+
| Bowser   | 9.58 |
| Buffy    | 9.88 |
| Chirpy   | 0.55 |
| Claws    | 5.04 |
| Fang     | 8.59 |
| Fluffy   | 6.15 |
| Puffball | 0.00 |
| Slim     | 2.92 |
| Whistler | 1.30 |
+----------+------+

為了按age而非name排序輸出，只要使用一個不同ORDER BY子句：

mysql>  SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
    ->  FROM pet ORDER BY age;
+----------+------+
| name     | age  |
+----------+------+
| Puffball | 0.00 |
| Chirpy   | 0.55 |
| Whistler | 1.30 |
| Slim     | 2.92 |
| Claws    | 5.04 |
| Fluffy   | 6.15 |
| Fang     | 8.59 |
| Bowser   | 9.58 |
| Buffy    | 9.88 |
+----------+------+

一個類似的查詢可以被用來確定已經死亡動物的死亡年齡。你通過檢查death值是否是NULL來決定那些是哪些動物，然後，對於那些有非NULL值，計算在death和birth值之間的差別：

mysql>  SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
    ->  FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
+--------+------------+------------+------+

差詢使用death IS NOT NULL而非death != NULL，因為NULL是特殊的值，這以後會解釋。見8.4.4.6 用NULL值工作。

如果你想要知道哪個動物下個月過生日，怎麼辦？對於這類計算，年和天是無關的，你簡單地想要提取birth列的月份部分。MySQL提供幾個日期部分的提取函數，例如YEAR()、MONTH()和DAYOFMONTH()。在這裡MONTH()是適合的函數。為了看它怎樣工作，運行一個簡單的查詢，顯示birth和MONTH(birth)的值：

mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+

用下個月的生日找出動物也是容易的。假定當前月是4月，那麼月值是4並且你尋找在5月出生的動物 (5月)， 像這樣：

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

當然如果當前月份是12月，就有點複雜了。你不是只把加1到月份數(12)上並且尋找在13月出生的動物，因為沒有這樣的月份。相反，你尋找在1月出生的動物(1月) 。

你甚至可以編寫查詢以便不管當前月份是什麼它都能工作。這種方法你不必在查詢中使用一個特定的月份數字，DATE_ADD()允許你把時間間隔加到一個給定的日期。如果你把一個月加到NOW()值上，然後用MONTH()提取月份部分，結果產生尋找生日的月份：

mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

完成同樣任務的一個不同方法是加1以得出當前月份的下一個月(在使用取模函數(MOD)後，如果它當前是12，則“繞回”月份到值0)：

mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;

注意，MONTH返回在1和12之間的一個數字，且MOD(something,12)返回在0和11之間的一個數字，因此必須在MOD()以後加1，否則我們將從11月( 11 )跳到1月(1)。

8.4.4.6 NULL值操作

NULL值可能很奇怪直到你習慣於它。概念上，NULL意味著“沒有值”或“未知值”，且它被看作有點與眾不同的值。為了測試NULL，你不能使用算術比較運算符例如=、<或!=。為了說明它，試試下列查詢：

mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

很清楚你從這些比較中得到毫無意義的結果。相反使用IS NULL和IS NOT NULL操作符：

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

在MySQL中，0意味著假而1意味著真。

NULL這樣特殊的處理是為什麼，在前面的章節中，為了決定哪個動物不再是活著的，使用death IS NOT NULL而不是death != NULL是必要的。

8.4.4.7 模式匹配

MySQL提供標準的SQL模式匹配，以及一種基於像Unix實用程式如vi、grep和sed的擴展正則表達式模式匹配的格式。

SQL的模式匹配允許你使用“_”匹配任何單個字符，而“%”匹配任意數目字符(包括零個字符)。在 MySQL中，SQL的模式預設是忽略大小寫的。下面顯示一些例子。注意在你使用SQL模式時，你不能使用=或!=﹔而使用LIKE或NOT LIKE比較操作符。

為了找出以“b”開頭的名字：

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

為了找出以“fy”結尾的名字：

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

為了找出包含一個“w”的名字：

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

為了找出包含正好5個字符的名字，使用“_”模式字符：

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

由MySQL提供的模式匹配的其他類型是使用擴展正則表達式。當你對這類模式進行匹配測試時，使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE，它們是同義詞)。

擴展正則表達式的一些字符是：

  • “.”匹配任何單個的字符。
  • 一個字符類“[...]”匹配在方括號內的任何字符。例如，“[abc]”匹配“a”、“b”或“c”。為了命名字符的一個範圍，使用一個“-”。“[a-z]”匹配任何小寫字母，而“[0-9]”匹配任何數字。
  • “ * ”匹配零個或多個在它前面的東西。例如，“x*”匹配任何數量的“x”字符，“[0-9]*”匹配的任何數量的數字，而“.*”匹配任何數量的任何東西。
  • 正則表達式是區分大小寫的，但是如果你希望，你能使用一個字符類匹配兩種寫法。例如，“[aA]”匹配小寫或大寫的“a”而“[a-zA-Z]”匹配兩種寫法的任何字母。
  • 如果它出現在被測試值的任何地方，模式就匹配(只要他們匹配整個值，SQL模式匹配)。
  • 為了定位一個模式以便它必須匹配被測試值的開始或結尾，在模式開始處使用“^”或在模式的結尾用“$”。

為了說明擴展正則表達式如何工作，上面所示的LIKE查詢在下面使用REGEXP重寫：

為了找出以“b”開頭的名字，使用“^”匹配名字的開始並且“[bB]”匹配小寫或大寫的“b”：

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

為了找出以“fy”結尾的名字，使用“$”匹配名字的結尾：

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

為了找出包含一個“w”的名字，使用“[wW]”匹配小寫或大寫的“w”：

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

既然如果一個正規表達式出現在值的任何地方，其模式匹配了，就不必再先前的查詢中在模式的兩方面放置一個通配符以使得它匹配整個值，就像如果你使用了一個SQL模式那樣。

為了找出包含正好5個字符的名字，使用“^”和“$”匹配名字的開始和結尾，和5個“.”實例在兩者之間：

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

你也可以使用“{n}”“重複n次”操作符重寫先前的查詢：

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

8.4.4.8 行計數

資料庫經常用於回答這個問題，“某個類型的數據在一張表刈艴現的頻度?”例如，你可能想要知道你有多少寵物，或每位主人有多少寵物，或你可能想要在你的動物上施行各種類型的普查。

計算你擁有動物的總數字與“在pet表中有多少行?”是同樣的問題，因為每個寵物有一個記錄。COUNT()函數計數非NULL結果的數目，所以數你的動物的查詢看起來像這樣：

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

在前面，你檢索了擁有寵物的人的名字。如果你想要知道每個主人有多少寵物，你可以使用COUNT()函數：

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

注意，使用GROUP BY對每個owner分組所有記錄，沒有它，你得到的一切是一條錯誤消息：

mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause

COUNT()和GROUP BY對以各種方式分類你的數據很有用。下列例子顯示出實施動物普查操作的不同方式。

每種動物數量：

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+

每中性別的動物數量：

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

（在這個輸出中，NULL表示“未知性別”。）

按種類和性別組合的動物數量：

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

當你使用COUNT()時，你不必檢索整個一張表。例如, 先前的查詢，當只在狗和貓上施行時，看起來像這樣：

mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE species = "dog" OR species = "cat"
    -> GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+

或，如果你僅需要知道已知性別的按性別的動物數目：

mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE sex IS NOT NULL
    -> GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

8.4.5 使用多個資料庫表

pet表追蹤你有哪個寵物。如果你想要記錄他們的其他資訊，例如在他們一生中事件看獸醫或何時後代出生，你需要另外的表。這張表應該像什麼呢？

  • 它需要包含寵物名字因此你知道每個事件屬於此動物。
  • 它需要一個日期因此你知道事件什麼時候發生的。
  • 需要一個字段描述事件。
  • 如果你想要可分類事件，有一個事件類型字段將是有用的。

給出了這些考慮，為event表的CREATE TABLE語句可能看起來像這樣：

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
    -> type VARCHAR(15), remark VARCHAR(255));

就像pet表，最容易的示通過創建包含資訊的一個定位符分隔的文本文件裝載初始記錄：

Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male
Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male
Buffy | 1994-06-19 | litter | 3 puppies, 3 female
Chirpy | 1999-03-21 | vet | needed beak straightened
Slim | 1997-08-03 | vet | broken rib
Bowser | 1991-10-12 | kennel
Fang | 1991-10-12 | kennel
Fang | 1998-08-28 | birthday | Gave him a new chew toy
Claws | 1998-03-17 | birthday | Gave him a new flea collar
Whistler | 1998-12-09 | birthday | First birthday

像這樣裝載記錄：

mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;

基於你從已經運行在pet表上的查詢中學到的，你應該能執行在event表中記錄的檢索﹔原則是一樣的。但是什麼時候是event表本身不足以回答你可能問的問題呢？

當他們有了一窩小動物時，假定你想要找出每只寵物的年齡。 event表指出何時發生，但是為了計算母親的年齡，你需要她的出生日期。既然它被儲存在pet表中，為了查詢你需要兩張表：

mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark
    -> FROM pet, event
    -> WHERE pet.name = event.name AND type = "litter";
+--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy  | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy  | 5.10 | 3 puppies, 3 female         |
+--------+------+-----------------------------+

關於該查詢要注意的幾件事情：

  • FROM子句列出兩個表，因為查詢需要從他們兩個拉出資訊。
  • 當組合(聯結-join)來自多個表的資訊時，你需要指定在一個表中的記錄怎樣能匹配其它表的記錄。這很簡單，因為它們都有一個name列。查詢使用WHERE子句基於name值來匹配2個表中的記錄。
  • 因為name列出現在兩個表中，當引用列時，你一定要指定哪個表。這通過把表名附在列名前做到。

你不必有2個不同的表來執行一個聯結。如果你想要將一個表的記錄與同一個表的其他記錄進行比較，聯結一個表到自身有時是有用的。例如，為了在你的寵物之中繁殖配偶，你可以用pet聯結自身來進行相似種類的雄雌配對：

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
    -> FROM pet AS p1, pet AS p2
    -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
+--------+------+--------+------+---------+
| name   | sex  | name   | sex  | species |
+--------+------+--------+------+---------+
| Fluffy | f    | Claws  | m    | cat     |
| Buffy  | f    | Fang   | m    | dog     |
| Buffy  | f    | Bowser | m    | dog     |
+--------+------+--------+------+---------+

在這個查詢中，我們為表名指定別名以便能引用列並且使得每一個列引用關聯於哪個表實例更直觀。

8.5 獲得資料庫和表的資訊

如果你忘記一個資料庫或表的名字，或一個給定的表的結構是什麼(例如，它的列叫什麼)，怎麼辦？ MySQL通過提供資料庫及其支援的表的資訊的幾個語句解決這個問題。

你已經見到了SHOW DATABASES，它列出由伺服器管理的資料庫。為了找出當前選擇了哪個資料庫，使用DATABASE()函數：

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

如果你還沒選擇任何資料庫，結果是空的。

為了找出當前的資料庫包含什麼表(例如，當你不能確定一個表的名字)，使用這個命令：

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+

如果你想要知道一個表的結構，DESCRIBE命令是有很用的﹔它顯示有關一個表的每個列的資訊：

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Field顯示列名字，Type是為列的數據類型，Null表示列是否能包含NULL值，Key顯示列是否被索引而Default指定列的預設值。

如果你在一個表上有索引，SHOW INDEX FROM tbl_name產生有關它們的資訊。

8.6 以批處理模式使用mysql

在前面的章節中，你交互式地使用mysql輸入查詢並且查看結果。你也可以以批模式運行mysql。為了做到這些，把你想要運行的命令放在一個文件中，然後告訴mysql從文件讀取它的輸入：

shell> mysql < batch-file

如果你需要在命令行上指定連接參數，命令可能看起來像這樣：

shell> mysql -h host -u user -p < batch-file
Enter password: ********

當你這樣使用mysql時，你正在創建一個腳本文件，然後執行腳本。

為什麼要使用一個腳本？有很多原因：

  • 如果你重複地運行查詢(比如說，每天或每周)，把它做成一個腳本使得你在每次執行它時避免重新鍵入。
  • 你能通過拷貝並編輯腳本文件從類似的現有的查詢產生一個新查詢。
  • 當你正在開發查詢時，批模式也是很有用的，特別對多行命令或多行語句序列。如果你犯了一個錯誤，你不必重新打入所有一切，只要編輯你的腳本來改正錯誤，然後告訴mysql再次執行它。
  • 如果你有一個產生很多輸出的查詢，你可以通過一個分頁器而不是盯著它翻屏到你屏幕的頂端來運行輸出：
    shell> mysql < batch-file | more
  • 你能捕捉輸出到一個文件中進行更一步的處理：
    shell> mysql < batch-file > mysql.out
  • 你可以散發腳本給另外的人，因此他們也能運行命令。
  • 一些情況不允許交互地使用，例如, 當你從一個cron任務中運行查詢時。在這種情況下，你必須使用批模式。

當你以批模式運行mysql時，比起你交互地使用它時，其預設輸出格式是不同的(更簡明些)。例如，當交互式運行SELECT DISTINCT species FROM pet時，輸出看起來像這樣：

+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+

但是當以批模式運行時，像這樣：

species
bird
cat
dog
hamster
snake

如果你想要在批模式中得到交互的輸出格式，使用mysql -t。為了回顯以輸出被執行的命令，使用mysql -vvv。

8.7 雙胞胎項目的查詢（實例）

在Analytikerna 和 Lentus，我們為一個大的研究項目工程一直在做系統和現場工作。這個項目是Institute of Environmental Medicine at Karolinska Institutet Stockholm 和 the Section on Clinical Research in Aging and Psychology at the University of Southern California的合作項目。

雙胞胎研究的更多資訊可在下列鏈接找到：

http://www.imm.ki.se/TWIN/TWINUKW.HTM

項目的後面部分是用一個用Perl和MySQL編寫的web介面來管理。

每天晚上所有會談的數據被移入一個MySQL資料庫。

8.7.1 找出所有非獨處的雙胞胎

下列查詢用來決定誰進入項目的第二部分：

select
        concat(p1.id, p1.tvab) + 0 as tvid,
        concat(p1.christian_name, " ", p1.surname) as Name,
        p1.postal_code as Code,
        p1.city as City,
        pg.abrev as Area,
        if(td.participation = "Aborted", "A", " ") as A,
        p1.dead as dead1,
        l.event as event1,
        td.suspect as tsuspect1,
        id.suspect as isuspect1,
        td.severe as tsevere1,
        id.severe as isevere1,
        p2.dead as dead2,
        l2.event as event2,
        h2.nurse as nurse2,
        h2.doctor as doctor2,
        td2.suspect as tsuspect2,
        id2.suspect as isuspect2,
        td2.severe as tsevere2,
        id2.severe as isevere2,
        l.finish_date
from
        twin_project as tp
        /* For Twin 1 */
        left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
        left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
        left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
        left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
        /* For Twin 2 */
        left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
        left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
        left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
        left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
        person_data as p1,
        person_data as p2,
        postal_groups as pg
where
        /* p1 gets main twin and p2 gets his/her twin. */
        /* ptvab is a field inverted from tvab */
        p1.id = tp.id and p1.tvab = tp.tvab and
        p2.id = p1.id and p2.ptvab = p1.tvab and
        /* Just the sceening survey */
        tp.survey_no = 5 and
        /* Skip if partner died before 65 but allow emigration (dead=9) */
        (p2.dead = 0 or p2.dead = 9 or
         (p2.dead = 1 and
          (p2.death_date = 0 or
           (((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
            >= 65))))
        and
        (
        /* Twin is suspect */
        (td.future_contact = 'Yes' and td.suspect = 2) or
        /* Twin is suspect - Informant is Blessed */
        (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
        /* No twin - Informant is Blessed */
        (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - Informant is Blessed */
        (td.participation = 'Aborted'
         and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - No inform - Have partner */
        (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
        and
        l.event = 'Finished'
        /* Get at area code */
        and substring(p1.postal_code, 1, 2) = pg.code
        /* Not already distributed */
        and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
        /* Has not refused or been aborted */
        and not (h.status = 'Refused' or h.status = 'Aborted'
        or h.status = 'Died' or h.status = 'Other')
order by
        tvid;

一些解釋：

concat(p1.id, p1.tvab) + 0 as tvid
我們想要在id和tvab的連接上以數字序排序。結果加0使得MySQL把結果當作一個數字。
列id
這標識一對雙胞胎。它是所有表中的一個鍵。
列tvab
這標識雙胞胎中的一個。它有值1或2。
列ptvab
這是tvab一個逆。當tvab是1，它是2，並且反過來也如此。它存在以保存鍵入並且使它更容易為MySQL最佳化查詢。

這個查詢表明，怎樣用聯結(p1和p2)從同一個表中查找表。在例子中，這被用來檢查雙胞胎的一個是否在65歲前死了。如果因此，行不返回。

上述所有雙胞胎資訊存在於所有表中。我們在id,tvab兩者上的鍵值（所有表)和在id,ptvab上的鍵(person_data)以使查詢更快。

在我們的生產機器上(一台200MHz UltraSPARC)，這個查詢返回大約 150-200 行並且不超過一秒的時間。

上面所用的表的當前記錄數是：

表 | 行數
person_data | 71074
lentus | 5291
twin_project | 5286
twin_data | 2012
informant_data | 663
harmony | 381
postal_groups | 100

8.7.2 顯示關於雙胞胎近況的表

每一次會面以一個稱為event的狀態碼結束。下面顯示的查詢被用來顯示按事件組合的所有雙胞胎的表。這表明多少對雙胞胎已經完成，多少對的其中之一已完成而另一個拒絕了，等等。

select
        t1.event,
        t2.event,
        count(*)
from
        lentus as t1,
        lentus as t2,
        twin_project as tp
where
        /* We are looking at one pair at a time */
        t1.id = tp.id
        and t1.tvab=tp.tvab
        and t1.id = t2.id
        /* Just the sceening survey */
        and tp.survey_no = 5
        /* This makes each pair only appear once */
        and t1.tvab='1' and t2.tvab='2'
group by
        t1.event, t2.event;

到第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-12 MySQL實用程式

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

12 MySQL實用程式

12.1 各種MySQL程式概述

所有使用mysqlclient客戶庫與伺服器通信的MySQL客戶使用下列環境變數：

名字 | 說明
MYSQL_UNIX_PORT | 預設套接字﹔用於連接localhost
MYSQL_TCP_PORT | 預設 TCP/IP 端口
MYSQL_PWD | 預設密碼
MYSQL_DEBUG | 調試時調試-蹤跡選項
TMPDIR | 臨時表/文件被創建的目錄

使用MYSQL_PWD是不安全的。見6.3 與MySQL伺服器連接。

“mysql”客戶使用MYSQL_HISTFILE環境變數中命名的文件來保存命令行歷史，歷史文件的預設值是“$HOME/.mysql_history”，這裡$HOME是HOME環境變數的值。

所有MySQL程式取許多不同的選項，然而，每個MySQL程式提供一個--help選項，你可以使用它得到程式不同選項的完整描述。例如，試一試mysql --help。

你能用一個選項文件覆蓋所有的標準客戶程式的預設選項。見4.15.4 選擇文件。

下表簡單地描述MySQL程式：

myisamchk
描述、檢查、最佳化和修復MySQL表的使用程式。因為myisamchk有許多功能，它在其自己的章節中描述。見13 維護MySQL安裝。
make_binary_release
制作一個編譯MySQL的一個二進制的版本。這能用FTP傳送到在ftp.tcx.se 網站的“/pub/mysql/Incoming”以方便其它MySQL用戶。
msql2mysql
一個外殼腳本，轉換mSQL程式到MySQL。它不能處理所有的情況，但是當轉換時，它給出一個好起點。
mysql
mysql是一個簡單的SQL外殼(具有GNU readline 能力)，它支援交互式和非交互式使用。當交互地使用時，查詢結果以ASCII表的格式被表示。當非交互地使用時(例如，作為一個過濾器)，結果是以定位符分隔的格式表示。（輸出格式可以使用命令行選項改變)你可以簡單地像這樣運行腳本：
shell> mysql database < script.sql > output.tab

如果你在客戶刈豽於內存不足造成問題，使用--quick選項！這迫使mysql使用mysql_use_result()而非mysql_store_result()來檢索結果集合。

mysqlaccess
一個腳本，檢查對主機、用戶和資料庫組合的存取權限。
mysqladmin
執行管理操作的實用程式，例如創建或拋棄資料庫，再裝載授權表，清洗表到磁碟中和再打開日誌文件。mysqladmin也可以被用來從伺服器檢索版本，進程和狀態資訊。見12.2 管理一個 MySQL 伺服器。
mysqlbug
MySQL錯誤報告腳本。當填寫一份錯誤報告到MySQL郵件列表時，應該總是使用該腳本。
mysqld
SQL背景執行程式。它應該一直在運行。
mysqldump
以SQL語句或定位符分隔的文本文件將一個MySQL資料庫傾倒一個文件中。這是最早由Igor Romanenko編寫的自由軟件的增強版本。見12.3 從MySQL資料庫和表傾倒結構和數據。
mysqlimport
使用LOAD DATA INFILE將文本文件倒入其各自的表中。見12.4 從文本文件導入數據。
mysqlshow
顯示資料庫，表，列和索引的資訊。
mysql_install_db
以預設權限創建MySQL授權表。這通常僅被執行一次。就是在系統上第一次安裝MySQL時。
replace
一個實用程式，由msql2mysql使用，但是有更一般的適用性。replace改變文件中或標準輸入上的字符串。使用一台有限狀態機首先匹配更長的字符串，能被用來交換字符串。例如，這個命令在給定的文件刈逌換a和b：
shell> replace a b b a -- file1 file2 ...
safe_mysqld
一個腳本，用某些更安全的特徵啟動mysqld背景執行程式，例如當一個錯誤發生時，重啟伺服器並且記載運行時刻資訊到一個日誌文件中。

12.2 管理一個MySQL伺服器

用於執行管理性操作。語法是：

shell> mysqladmin [OPTIONS] command [command-option] command ...

通過執行mysqladmin --help，你可以得到你mysqladmin的版本所支援的一個選項列表。

目前mysqladmin支援下列命令：

create databasename | 創建一個新資料庫
drop databasename | 刪除一個資料庫及其所有表
extended-status | 給出伺服器的一個擴展狀態消息
flush-hosts | 洗掉所有緩存的主機
flush-logs | 洗掉所有日誌
flush-tables | 洗掉所有表
flush-privileges | 再次裝載授權表(同reload)
kill id,id,... | 殺死mysql執行緒
password | 新密碼，將老密碼改為新密碼
ping | 檢查mysqld是否活著
processlist | 顯示服務其中活躍執行緒列表
reload | 重載授權表
refresh | 洗掉所有表並關閉和打開日誌文件
shutdown | 關掉伺服器
status | 給出伺服器的簡短狀態消息
variables | 列印出可用變數
version | 得到伺服器的版本資訊

所有命令可以被縮短為其唯一的前綴。例如：

shell> mysqladmin proc stat
+----+-------+-----------+----+-------------+------+-------+------+
| Id | User  | Host      | db | Command     | Time | State | Info |
+----+-------+-----------+----+-------------+------+-------+------+
| 6  | monty | localhost |    | Processlist | 0    |       |      |
+----+-------+-----------+----+-------------+------+-------+------+
Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0  Opens: 6  Flush tables: 1
Open tables: 2  Memory in use: 1092K  Max memory used: 1116K

mysqladmin status命令結果有下述列：

Uptime | MySQL伺服器已經運行的秒數
Threads | 活躍執行緒（客戶）的數量
Questions | 從mysqld啟動起來自客戶問題的數量
Slow queries | 已經超過long_query_time秒的查詢數量
Opens | mysqld已經打開了多少表
Flush tables | flush ..., refresh和reload命令數量
Open tables | 現在被打開的表數量
Memory in use | 由mysqld代碼直接分配的內存(只有在MySQL用--with-debug編譯時可用)
Max memory used | 由mysqld代碼直接分配的最大內存(只有在MySQL用--with-debug編譯時可用)

12.3 從MySQL資料庫和表中倒出結構和數據

實用程式，為備份或為把數據轉移到另外的SQL伺服器上傾倒一個資料庫或許多資料庫。傾倒將包含 創建表或充實表的SQL語句。

shell> mysqldump [OPTIONS] database [tables]

如果你不給定任何表，整個資料庫將被傾倒。

通過執行mysqldump --help，你能得到你mysqldump的版本支援的選項表。

注意，如果你運行mysqldump沒有--quick或--opt選項，mysqldump將在傾倒結果前裝載整個結果集到內存中，如果你正在傾倒一個大的資料庫，這將可能是一個問題。

mysqldump支援下列選項：

--add-locks
在每個表傾倒之前增加LOCK TABLES並且之後UNLOCK TABLE。(為了使得更快地插入到MySQL)。
--add-drop-table
在每個create語句之前增加一個drop table。
--allow-keywords
允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。
-c, --complete-insert
使用完整的insert語句(用列名字)。
-C, --compress
如果客戶和伺服器均支援壓縮，壓縮兩者間所有的資訊。
--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT語法。（給出更緊縮並且更快的插入語句）
-#, --debug[=option_string]
跟蹤程式的使用(為了調試)。
--help
顯示一條幫助消息並且退出。
--fields-terminated-by=...

--fields-enclosed-by=...

--fields-optionally-enclosed-by=...

--fields-escaped-by=...

--fields-terminated-by=...
這些選擇與-T選擇一起使用，並且有相應的LOAD DATA INFILE子句相同的含義。見7.16 LOAD DATA INFILE語法。
-F, --flush-logs
在開始傾倒前，洗掉在MySQL伺服器中的日誌文件。
-f, --force,
即使我們在一個表傾倒期間得到一個SQL錯誤，繼續。
-h, --host=..
從命名的主機上的MySQL伺服器傾倒數據。預設主機是localhost。
-l, --lock-tables.
為開始傾倒鎖定所有表。
-t, --no-create-info
不寫入表創建資訊(CREATE TABLE語句）
-d, --no-data
不寫入表的任何行資訊。如果你只想得到一個表的結構的傾倒，這是很有用的！
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。應該給你為讀入一個MySQL伺服器的盡可能最快的傾倒。
-pyour_pass, --password[=your_pass]
與伺服器連接時使用的密碼。如果你不指定“=your_pass”部分，mysqldump需要來自終端的密碼。
-P port_num, --port=port_num
與一台主機連接時使用的TCP/IP端口號。（這用於連接到localhost以外的主機，因為它使用 Unix套接字。）
-q, --quick
不緩沖查詢，直接傾倒至stdout﹔使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
與localhost連接時（它是預設主機)使用的套接字文件。
-T, --tab=path-to-some-directory
對於每個給定的表，創建一個table_name.sql文件，它包含SQL CREATE 命令，和一個table_name.txt文件，它包含數據。 注意：這只有在mysqldump運行在mysqld背景執行程式運行的同一台機器上的時候才工作。.txt文件的格式根據--fields-xxx和--lines--xxx選項來定。
-u user_name, --user=user_name
與伺服器連接時，MySQL使用的用戶名。預設值是你的Unix登錄名。
-O var=option, --set-variable var=option
設置一個變數的值。可能的變數被列在下面。
-v, --verbose
冗長模式。列印出程式所做的更多的資訊。
-V, --version
列印版本資訊並且退出。
-w, --where='where-condition'
只傾倒被選擇了的記錄﹔注意引號是強制的！
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"

最常見的mysqldump使用可能制作整個資料庫的一個備份：

mysqldump --opt database > backup-file.sql

但是它對用來自於一個資料庫的資訊充實另外一個MySQL資料庫也是有用的：

mysqldump --opt database | mysql --host=remote-host -C database

12.4 從文本文件導入數據

mysqlimport提供一個到LOAD DATA INFILESQL語句的命令行介面。mysqlimport的大多數選項直接對應於LOAD DATA INFILE的相同選項。見7.16 LOAD DATA INFILE語法。

mysqlimport像這樣調用：

shell> mysqlimport [options] filename ...

對於在命令行上命名的每個文本文件，mysqlimport剝去文件名的擴展名並且使用它決定哪個表導入文件的內容。例如，名為“patient.txt”、“patient.text”和“patient”將全部被導入名為patient的一個表中。

mysqlimport支援下列選項：

-C, --compress
如果客戶和伺服器均支援壓縮，壓縮兩者之間的所有資訊。
-#, --debug[=option_string]
跟蹤程式的使用(為調試)。
-d, --delete
在導入文本文件前倒空表格。
--fields-terminated-by=...

--fields-enclosed-by=...

--fields-optionally-enclosed-by=...

--fields-escaped-by=...

--fields-terminated-by=...
這些選項與對應於LOAD DATA INFILE的子句相同的含義。見7.16 LOAD DATA INFILE語法。
-f, --force
忽略錯誤。例如，如果對於一個文本文件的一個表不存在，繼續處理任何餘下的文件。沒有--force，如果表不存在，mysqlimport退出。
--help
顯示一條幫助消息並且退出。
-h host_name, --host=host_name
導入數據到命名的主機上的MySQL伺服器。預設主機是localhost。
-i, --ignore
見為--replace選項的描述。
-l, --lock-tables
在處理任何文本文件前為寫入所定所有的表。這保証所有的表在伺服器上被同步。
-L, --local
從客戶讀取輸入文件。預設地，如果你連接localhost(它是預設主機)，文本文件被假定在伺服器上。
-pyour_pass, --password[=your_pass]
與伺服器連接時使用的密碼。如果你不指定“=your_pass”部分，mysqlimport要求來自終端的密碼。
-P port_num, --port=port_num
與一台主機連接時使用的TCP/IP端口號。（這被用於連接到除localhost以外的主機，因為它使用Unix套接字。）
-r, --replace
--replace和--ignore選項控制對輸入在唯一鍵值上有重複的現有記錄的輸入處理。如果你指定--replace，新行將代替有相同唯一鍵的存在的行。如果你指定--ignore，跳過輸入在唯一鍵值上有重複的現有記錄。如果你不指定任何一個選項，當找到一個重複的鍵值，出現一個錯誤，並且文本文件餘下部分被忽略。
-s, --silent
安靜模式。只有在錯誤發生時，寫出輸出。
-S /path/to/socket, --socket=/path/to/socket
與localhost(它是預設主機)連接時使用的套接字文件。
-u user_name, --user=user_name
MySQL使用的用戶名字當與服務者聯接時。預設價值是你的 Unix 登錄名字。
-v, --verbose
冗長模式。列印程式所做的更多資訊。
-V, --version
列印版本資訊並且退出。

以下是使用mysqlimport運行的一個樣本：

$ mysql --version
mysql  Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
$ uname -a
Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
$ ed
a
100     Max Sydow
101     Count Dracula
.
w imptest.txt
32
q
$ od -c imptest.txt
0000000   1   0   0  \t   M   a   x       S   y   d   o   w  \n   1   0
0000020   1  \t   C   o   u   n   t       D   r   a   c   u   l   a  \n
0000040
$ mysqlimport --local test imptest.txt
test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
$ mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id   | n             |
+------+---------------+
|  100 | Max Sydow     |
|  101 | Count Dracula |
+------+---------------+

12.5 MySQL壓縮只讀表產生器

myisampack被用來壓縮MyISAM表，而pack_isam被用來壓縮ISAM表。由於ISAM表被淘汰，這裡我們將只討論myisampack。

myisampack是當你訂購超過10個使用授權或擴展的支援時，你得到的一個額外的實用程式。因為這些僅以二進制形式被分發，他們僅在某些平台上可用。

下面我們僅談論myisampack, 但是每件事情對pack_isam也是持有的。

myisampack通過單獨壓縮表中的每個列來工作。當表被打開時，需要加壓縮的資訊被讀進內存，這使得在存取單個記錄時能得到更好的性能，因為你只需要解壓縮一個記錄，不是更大的磁碟塊，像在 MSDOS上使用Stacker時一樣。通常，myisampack壓縮數據文件40%-70%。

MySQL使用內存映射(mmap())在壓縮表上而如果mmap()的使用不工作，倒回到正常的讀/寫文件。

當前myisampack有2個限制：

  • 在壓縮後，表只能讀。
  • myisampack也能壓縮BLOB或TEXT列。較老的pack_isam不能做到。

修正這些限制以在我們的TODO表上，但是具有低優先級。

myisampack像這樣調用：

shell> myisampack [options] filename ...

每個文件名應該是一個索引(“.MYI”) 文件名。如果你不在資料庫目錄下，你應該指定文件的路徑名。允許省略“.MYI”擴展名。

myisampack支援下列選項：

-b, --backup
制作表的一個備份，為tbl_name.OLD。
-#, --debug=debug_options
輸出調試日誌。debug_options串經常是'd:t:o,filename'。
-f, --force
即使它變得更大或如果臨時文件存在，強制表的壓縮。(myisampack在壓縮表時創建一個名位“tbl_name.TMD”的臨時文件。如果你殺死myisampack，“.TMD”文件不能被刪除。通常，如果myisampack發現“tbl_name.TMD”存在，它以一個錯誤退出。用--force，myisampack不管怎樣都壓縮表。
-?, --help
顯示一條幫助消息並且退出。
-j big_tbl_name, --join=big_tbl_name
聯結所有在命令行上被命名的表到一個單獨的表big_tbl_name中。所有要被合並的表必須是相同的(同樣的列名字和類型，同樣的索引，等等。）
-p #, --packlength=#
指定記錄長度儲存尺寸，按字節。值應該是1、2或3。(myisampack用1、2或3字節的長度指針儲存所有行。在最一般的情況下，myisampack在它開始包裝文件以前，能確定正確的長度值，但是它可能注意到在包裝程序期間，它能使用了更短的長度。在這種情況下，myisampack在下一次你包裝同樣文件時間列印出一條提示，你可以使用更短的記錄長度。）
-s, --silent
安靜模式。只有當錯誤發生時，寫出輸出。
-t, --test
不壓縮表，僅僅測試壓縮它。
-T dir_name, --tmp_dir=dir_name
使用命名的目錄作為寫入臨時表的位置。
-v, --verbose
冗長模式。寫出有關進展和包裝結果的資訊。
-V, --version
顯示版本資訊和出口。
-w, --wait
如果表正在使用，等待並且再試。如果mysqld伺服器以--skip-locking選項被調用，如果表可能在包裝程序中被更新，調用myisampack不是一個好主意。

下面顯示的命令順序說明了一個典型的表壓縮桌子壓縮程序：

shell> ls -l station.*
-rw-rw-r--   1 monty    my         994128 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:     station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-02-02  3:06:43
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
Max datafile length:   54657023  Max keyfile length:   33554431
Recordlength:               834
Record format: Fixed length

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long              1024       1024          1
2   32    30  multip. text                      10240       1024          1

Field Start Length Type
1     1     1
2     2     4
3     6     4
4     10    1
5     11    20
6     31    1
7     32    30
8     62    35
9     97    35
10    132   35
11    167   4
12    171   16
13    187   35
14    222   4
15    226   16
16    242   20
17    262   20
18    282   20
19    302   30
20    332   4
21    336   4
22    340   1
23    341   8
24    349   8
25    357   8
26    365   2
27    367   2
28    369   4
29    373   4
30    377   1
31    378   2
32    380   8
33    388   4
34    392   4
35    396   4
36    400   4
37    404   1
38    405   4
39    409   4
40    413   4
41    417   4
42    421   4
43    425   4
44    429   20
45    449   30
46    479   1
47    480   1
48    481   79
49    560   79
50    639   79
51    718   79
52    797   8
53    805   1
54    806   1
55    807   20
56    827   4
57    831   4

shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics

normal:     20  empty-space:      16  empty-zero:        12  empty-fill:  11
pre-space:   0  end-space:        12  table-lookups:      5  zero:         7
Original trees:  57  After join: 17
- Compressing file
87.14%

shell> ls -l station.*
-rw-rw-r--   1 monty    my         127874 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:     station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-04-17 19:04:26
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
Max datafile length:   16777215  Max keyfile length:     131071
Recordlength:               834
Record format: Compressed

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long             10240       1024          1
2   32    30  multip. text                      54272       1024          1

Field Start Length Type                         Huff tree  Bits
1     1     1      constant                             1     0
2     2     4      zerofill(1)                          2     9
3     6     4      no zeros, zerofill(1)                2     9
4     10    1                                           3     9
5     11    20     table-lookup                         4     0
6     31    1                                           3     9
7     32    30     no endspace, not_always              5     9
8     62    35     no endspace, not_always, no empty    6     9
9     97    35     no empty                             7     9
10    132   35     no endspace, not_always, no empty    6     9
11    167   4      zerofill(1)                          2     9
12    171   16     no endspace, not_always, no empty    5     9
13    187   35     no endspace, not_always, no empty    6     9
14    222   4      zerofill(1)                          2     9
15    226   16     no endspace, not_always, no empty    5     9
16    242   20     no endspace, not_always              8     9
17    262   20     no endspace, no empty                8     9
18    282   20     no endspace, no empty                5     9
19    302   30     no endspace, no empty                6     9
20    332   4      always zero                          2     9
21    336   4      always zero                          2     9
22    340   1                                           3     9
23    341   8      table-lookup                         9     0
24    349   8      table-lookup                        10     0
25    357   8      always zero                          2     9
26    365   2                                           2     9
27    367   2      no zeros, zerofill(1)                2     9
28    369   4      no zeros, zerofill(1)                2     9
29    373   4      table-lookup                        11     0
30    377   1                                           3     9
31    378   2      no zeros, zerofill(1)                2     9
32    380   8      no zeros                             2     9
33    388   4      always zero                          2     9
34    392   4      table-lookup                        12     0
35    396   4      no zeros, zerofill(1)               13     9
36    400   4      no zeros, zerofill(1)                2     9
37    404   1                                           2     9
38    405   4      no zeros                             2     9
39    409   4      always zero                          2     9
40    413   4      no zeros                             2     9
41    417   4      always zero                          2     9
42    421   4      no zeros                             2     9
43    425   4      always zero                          2     9
44    429   20     no empty                             3     9
45    449   30     no empty                             3     9
46    479   1                                          14     4
47    480   1                                          14     4
48    481   79     no endspace, no empty               15     9
49    560   79     no empty                             2     9
50    639   79     no empty                             2     9
51    718   79     no endspace                         16     9
52    797   8      no empty                             2     9
53    805   1                                          17     1
54    806   1                                           3     9
55    807   20     no empty                             3     9
56    827   4      no zeros, zerofill(2)                2     9
57    831   4      no zeros, zerofill(1)                2     9

由myisampack列印的資訊在下面描述：

normal
不是用額外壓縮的列數。
empty-space
僅包含空格值的列數﹔這些將占據1位。
empty-zero
只包含二進制0值的列數﹔這些將占據1位。
empty-fill
不占據其類型全部字節範圍的整形列數﹔這些被改變為一種更小的類型(例如，一個INTEGER列可以被改變為MEDIUMINT)。
pre-space
用前導空間儲存的小數的列數。在這種情況下，每個值將包含一個前導空格的數量的計數。
end-space
有很多拖後空格的列數。在這種情況下，每個值將包含一個拖後空格的數量的計數。
table-lookup
列只有少數不同的值，並且它在哈夫曼壓縮前被變換一個ENUM。
zero
所有值為零的列數。
Original trees
哈夫曼樹的初始數目。
After join
在聯結哈夫曼樹以節省一些表頭空間後餘下的不同樹的數量。

在一張表被壓縮以後，myisamchk -dvv列印出每個字段的額外資訊：

Type
字段類型可以包含下列描述符：
constant
所有行有相同的值。
no endspace
不儲存尾空格。
no endspace, not_always
不儲存尾空格而且不對所有值做尾空格壓縮。
no endspace, no empty
不儲存尾空格。不儲存空值。
table-lookup
列被變換到一個ENUM。
zerofill(n)
值中最高n位總是0並且不被儲存。
no zeros
不儲存零。
always zero
0值以1位被儲存。
Huff tree
與字段相關的哈夫曼樹
Bits
在哈夫曼樹裡使用的位數。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-18 問題和常見錯誤

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

18 問題和常見錯誤

18.1 如果MySQL總是崩潰怎麼辦

所有MySQL在發布它們之前，在許多平台上被測試。這並不意味著在MySQL中沒有任何錯誤，但是如果有錯誤，它們是很少的並且很能難發現。如果你有一個問題並且如果你嘗試找出究竟是什麼摧毀了你的系統，它將總是有幫助的，因為你將有一個更好機會使得它被快速修復。

首先你應該試著找出問題mysqld背景執行程式是否死掉或你的問題是否與你的客戶有關。你可以用mysqladmin version檢查你的mysqld伺服器正常執行了多長時間，如果mysqld死了，你可以在文件“mysql-data-directory/'hostname'.err”中找到其原因。

因為很難知道一些東西為什麼崩潰，首先試著檢查為其它人工作的東西是否使你崩潰。請嘗試下列事情：

  • 與mysqladmin shutdown停止mysqld背景執行程式，在所有表上運行myisamchk --silent --force */*.MYI並重啟mysqld守護經進程。這將保証你從一個干淨的狀態運行。見13 維護MySQL安裝。
  • 使用mysqld --log並且試著從日誌資訊確定是否是某個特定的查詢殺死了伺服器。全部錯誤的95%與特定的查詢有關！通常它是在日誌文件中就在MySQL重啟之前的最後查詢之一。你也許可以使用下列程序驗証它：
    • 停止MySQL背景執行程式(用mysqladmin shutdown)。
    • 在MySQL資料庫目錄下做文件的一個備份。
    • 與myisamchk -s */*.MYI檢查表以驗証所有表是正確的。如果有任何表被損壞，用myisamchk -r path-to-table.MYI修復它。
    • 從MySQL數據目錄刪除(或移走)任何舊的日誌文件。
    • 用safe_mysql --log啟動伺服器。
    • 如果mysqld現在死掉，你可以通過恢復備份並執行mysql < mysql-log-file來測試問題是否是一個特定的查詢引起的。當然你可以通過用safe_mysqld --data=path-to-backup-directory啟動另一個MySQL伺服器，在某個其他目錄而不是標準MySQL資料庫目錄下做後面的測試。
  • 你試用了效能測試嗎？他們應該很好地測試MySQL。你也可以增加代碼模擬你的應用程式！效能程式可在原始碼版本的“bench”目錄下找到，或對可執行檔版本，在你的MySQL安裝目錄下“sql-bench”目錄。
  • 試一下fork_test.pl和fork2_test.pl。
  • 對任何錯誤檢查文件“mysql-data-directory/'hostname'.err”。
  • 如果你配置MySQL以便調試，如果出錯，收集可能的錯誤資訊將更容易。使用--with-debug選項的configure重新配置MySQL然後重新編譯。見G.1 調試一個 MySQL 伺服器。
  • 為調試而配置MySQL使它包含一個安全的內存分配器以便能發現一些錯誤。它也提供關於正在發生什麼的大量輸出。
  • 你為你的作業系統使用了最新的修補嗎？
  • 使用mysql的--skip-locking選項.在一些系統上，lockd鎖管理器不能正確工作﹔--skip-locking選項告訴mysqld不使用外部鎖。（這意味著你不能在同一個數據上運行兩個mysqld伺服器而且如果你使用myisamchk，你一定要小心，但是它對為了測試試用選項可能有益。）
  • 當mysqld好像正在運行但沒有反應時，你嘗試過mysqladmin -u root processlist嗎？有時mysqld不是毫無反應，盡管你可能這樣認為。問題可能是所有在用的連接，或可能用內部鎖定問題。mysqladmin processlist甚至在這些情況下將通常可以進行一個連接，並且能提供有關當前連接數量及其狀態的有用資訊。
  • 在你運行其他查詢時，在一個單獨窗口中運行命令mysqladmin -i 5 status，產生統計。
  • 嘗試下列步驟：
    1. 通過gdb（或其他調試器)啟動mysqld。
    2. 運行你的測試腳本。
    3. 當mysqld核心傾倒(core dump)，做back（或你調試器中的回溯-backtrace命令)。
  • 嘗試用一個Perl腳本模擬你的應用程式以強制MySQL崩潰或表現不正確。
  • 或發一份正式的錯誤報告。見2.3 如何報告錯誤或問題，但是要不平常更詳細。因為MySQL為很多人的工作，導致崩潰的東西可能只存在於你的計算機上(例如，與你的特定系統庫有關的一個錯誤)。
  • 如果你的問題有具有動態長度行的表有關，並且你不使用BLOB/TEXT列(但是僅VARCHAR列)，你可以用ALTER TABLE試著將全部VARCHAR改為CHAR，這將強制MySQL使用固定尺寸的行。固定尺寸的行占據很小的額外空間，但是更能容忍崩潰！當前動態行的代碼在 TCX 至少使用3 年的時間，沒有任何問題，但是從本質上講，動態長度的行對錯誤更敏感，因此如果上述對你有幫助，嘗試一下可能是一個好主意！

18.2 使用MySQL時的一些常見錯誤

18.2.1 MySQL server has gone away錯誤

本小節也涉及有關Lost connection to server during query的錯誤。

對MySQL server has gone away錯誤最常見的原因是伺服器超時了並且關閉了連接。預設地，如果沒有事情發生，伺服器在 8個小時後關閉連接。你可在啟動mysqld時通過設置wait_timeout變數改變時間限制。

你可以通過執行mysqladmin version並且檢驗正常運行的時間來檢查MySQL還沒死掉。

如果你有一個腳本，你只須再發出查詢讓客護進行一次自動的重新連接。

在這種請下，你通常能獲得下列錯誤代碼(你得到的是OS相關的)：

CR_SERVER_GONE_ERROR | 客戶不能發送一個問題給伺服器。
CR_SERVER_LOST | 當寫伺服器時，客戶沒有出錯，但是它沒有得到對問題的一個完整的答案(或任何答案)。

如果你向伺服器發送不正確的或太大的查詢，你也可能得到這些錯誤。如果mysqld得到一個太大或不正常的包，它認為客戶出錯了並關閉連接。如果你需要較大的查詢(例如，如果你正在處理較大的BLOB列)，你可以使用-O max_allowed_packet=#選項(預設1M)啟動mysqld以增加查詢限制。多餘的內存按需分配，這樣mysqld只有在你發出較大差詢時或mysqld必須返回較大的結果行時，才使用更多的內存！

18.2.2 Can't connect to [local] MySQL server錯誤

一個MySQL客戶可以兩種不同的方式連接mysqld伺服器：Unix套接字，它通過在文件系統中的一個文件(預設“/tmp/mysqld.sock”)進行連接﹔或TCP/IP，它通過一個端口號連接。Unix套接字比TCP/IP更快，但是只有用在連接同一台計算機上的伺服器。如果你不指定主機名或如果你指定特殊的主機名localhost，使用Unix套接字。

錯誤(2002）Can't connect to ...通常意味著沒有一個MySQL伺服器運行在系統上或當試圖連接mysqld伺服器時，你正在使用一個錯誤的套接字文件或TCP/IP端口。

由檢查(使用ps)在你的伺服器上有一個名為mysqld的進程啟動！如果沒有任何mysqld程序，你應該啟動一個。見4.15.2 啟動MySQL伺服器的問題。

如果一個mysqld程序正在運行，你可以通過嘗試這些不同的連接來檢查伺服器(當然，端口號和套接字路徑名可能在你的安裝中是不同的)：

shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --socket=/tmp/mysql.sock version

注意hostname命令使用反引號“`”而非正引號“'”﹔這些導致hostname輸出（即，當前主機名)被代替進mysqladmin命令中。

這是可能造成Can't connect to local MySQL server錯誤的一些原因：

  • mysqld不在運行。
  • 你正在使用MIT-pthreads的一個系統上運行。如果正在運行在一個沒有原生執行緒的系統上，mysqld使用 MIT-pthreads 軟件包。見4.2 由MySQL支援的作業系統。然而，MIT-pthreads不支援Unix套接字，因此當與伺服器連接時，在這樣一個系統上，你總是必須明確地指定主機名。試試使用這個命令檢查到伺服器的連接：
    shell> mysqladmin -h `hostname` version
  • 某人刪除了mysqld使用的Unix套接字(預設“/tmp/mysqld.sock”)。你可能有一個cron任務刪除了MySQL套接字(例如，一個把舊文件從“/tmp”目錄中刪除的任務)。你總是可以運行mysqladmin version並且檢查mysqladmin正在試圖使用的套接字確實存在。在這種情況下，修復方法是刪除cron任務而不刪除“mysqld.sock 或將套接字放在其他地方。你能用這個命令在MySQL配置時指定一個不同的套接字地點：
    shell> ./configure --with-unix-socket-path=/path/to/socket

    你也可以使用--socket=/path/to/socket選項啟動safe_mysqld和在啟動你的MySQL客戶前設置環境變數MYSQL_UNIX_PORT為套接字路徑名。你可用--socket=/path/to/socket選項啟動mysqld伺服器。如果你改變了伺服器的套接字路徑名，你也必須通知MySQL客戶關於新路徑的情況。你可以通過設置環境變數MYSQL_UNIX_PORT為套接字路徑名或由提供套接字路徑名作為客戶的參數做到。你可用這個命令測試套接字：

    shell> mysqladmin --socket=/path/to/socket version
  • 你正在使用 Linux和執行緒已經死了(核心傾倒了)。在這種情況中，你必須殺死其它mysqld執行緒(例如在啟動一個新的MySQL伺服器之前，可以用mysql_zap腳本）。見18.1 如果MySQL總是崩潰怎麼辦。

如果你得到錯誤Can't connect to MySQL server on some_hostname，你可以嘗試下列步驟找出問題是什麼：

  • 通過執行telnet your-host-name tcp-ip-port-number並且按幾次回車來檢查伺服器是否正常運行。如果有一個MySQL運行在這個端口上，你應該得到一個包含正在運行的MySQL伺服器的版本號的應答。如果你得到類似於telnet: Unable to connect to remote host: Connection refused的一個錯誤，那麼沒有伺服器在使用的端口上運行。
  • 嘗試連接本地機器上的mysqld背景執行程式，並用mysqladmin variables檢查mysqld被配置使用的TCP/IP端口(變數port)。
  • 檢查你的mysqld伺服器沒有用--skip-networking選項啟動。

18.2.3 Host '...' is blocked錯誤

如果你得到像這樣的一個錯誤：

Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

這意味著，mysqld已經得到了大量(max_connect_errors)的主機'hostname'的在中途被中斷了的連接請求。在max_connect_errors次失敗請求後，mysqld認定出錯了(像來字一個黑客的攻擊)，並且阻止該站點進一步的連接，直到某人執行命令mysqladmin flush-hosts。

預設地，mysqld在10個連接錯誤後阻塞一台主機。你可以通過像這樣啟動伺服器很容易地調整它：

shell> safe_mysqld -O max_connect_errors=10000 &

注意，對給定的主機，如果得到這條錯誤消息，你應該首先檢查該主機的TCP/IP連接有沒有問題。如果你的TCP/IP連接不在運行，增加max_connect_errors變數的值對你也不會有幫助！

18.2.4 Too many connections錯誤

如果在你試土連接MySQL時，你得到錯誤Too many connections，這意味著已經有max_connections個客戶連接了mysqld伺服器。

如果你需要比預設(100)更多的連接，那麼你應該重啟mysqld，用更大的 max_connections 變數值。

注意，mysqld實際上允許(max_connections+1)個客戶連接。最後一個連接是為一個用Process權限的用戶保留的。通過不把這個權限給一般用戶(他們不應該需要它)，有這個權限一個管理員可以登錄並且使用SHOW PROCESSLIST找出什麼可能出錯。見7.21 SHOW句法(得到表，列的資訊）。

18.2.5 Out of memory錯誤

如果你發出查詢並且得到類似於下面的錯誤：

mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

注意，錯誤指向了MySQL客戶mysql。這個錯誤的原因很簡單，客戶沒有足夠的內存儲存全部結果。

為了修正這個問題，首先檢查你的查詢是否正確。它應該返回這麼多的行，這合理嗎？如果是這樣，你可以使用mysql --quick，它使用mysql_use_result()檢索結果集合。這將較少的負擔放在了客戶端(只是伺服器更多)。

18.2.6 Packet too large錯誤

當一個MySQL客戶或mysqld伺服器得到一個比max_allowed_packet個字節長的包，它發出一個Packet too large錯誤並終止連接。

如果你正在使用mysql客戶，你可以通過用mysql --set-variable=max_allowed_packet=8M指定一個更大的緩衝區來啟動客戶程式。

如果你正在使用不允許你指定最大包大小的其他客戶(例如 DBI)，你需要在你啟動伺服器時設置包大小。你可以使用mysqld的命令行選項設置max_allowed_packet為一個更大的尺寸。例如，如果你正期望將一個全長的BLOB存入一張表中，你將需要用--set-variable=max_allowed_packet=24M選項來啟動伺服器。

18.2.7 The table is full錯誤

這個錯誤發生在內存臨時表變得比tmp_table_size字節大時。為了避免這個問題，你可以使用mysqld的-O tmp_table_size=#選項來增加臨時表的大小，或在你發出有疑問的查詢之前使用SQL選項SQL_BIG_TABLES。見7.25 SET OPTION句法。

你也可以使用--big-tables選項啟動mysqld。這與為所有查詢使用SQL_BIG_TABLES完全相同。

18.2.8 Commands out of sync in client錯誤

如果你在你的客戶代碼中得到Commands out of sync; You can't run this command now，你正在以錯誤的次序調用客戶函數！

這可能發生，例如，如果你正在使用mysql_use_result()並且在你已經調用了mysql_free_result()之前試圖執行新查詢。如果你在mysql_use_result()或mysql_store_result()之間試圖執行返回數據的2個查詢，它也可能發生。

18.2.9 Ignoring user錯誤

如果你得到下列錯誤：

Found wrong password for user: 'some_user@some_host'; Ignoring user

這意味著在mysqld啟動時或在它再次裝載權限表時，它在user表中找到了一個有一個無效密碼的條目。結果，條目簡單地被權限系統忽略。

可能導致這個問題的原因和修正：

  • 你可能正在運行一個有一個老的user表的新版本mysqld。你可以通過執行mysqlshow mysql user看看密碼字段是否少於 16個字符來檢查它。如果是這樣，你可以通過運行scripts/add_long_password腳本改正這種情況。
  • 用戶有一個老式的密碼(8個字符長)並且你沒使用--old-protocol選項啟動mysqld。用一個新密碼更新在user表中的用戶或用--old-protocol重啟mysqld。
  • 你沒有使用PASSWORD()函數在在user表中指定了一個密碼。使用mysql以一個新密碼更新在user表中的用戶。確保使用PASSWORD()函數：
    mysql> update user set password=PASSWORD('your password')
           where user='XXX';

18.2.10 Table 'xxx' doesn't exist錯誤

如果你得到錯誤Table 'xxx' doesn't exist或Can't find file: 'xxx' (errno: 2)，這意味著在當前資料庫中沒有名為xxx的表存在。

注意，因為MySQL使用目錄和文件儲存資料庫和表，資料庫和表名件是區分大小寫的！（在Win32上，資料庫和表名不是區分大小寫的，但是在查詢中對所有表的引用必須使用相同的大小寫！）

你可以用SHOW TABLES檢查你在當前資料庫中有哪個表。見7.21 SHOW句法(得到表、列的資訊）。

18.3 MySQL怎樣處理一個溢出的磁碟

當出現一個磁碟溢出的情況時，MySQL做下列事情：

  • 它每分鐘檢查一次看是否有足夠空間寫入當前行。如果有足夠的空間，它繼續好像發生什麼事情。
  • 每6分鐘它將有關磁碟溢出的警告寫入日誌文件。

為了緩和這個問題，你可以采取下列行動：

  • 繼續，你只需釋放足夠的空閑磁碟空間以便插入所有記錄。
  • 放棄執行緒，你必須發一個mysqladmin kill到執行緒。在下一次檢查磁碟時，執行緒將被放棄(在1分鐘內)。
  • 注意，其他執行緒可能正在等待引起“磁碟溢出”條件的表。如果你有幾個“鎖定的”的執行緒，殺死正在等待磁碟溢出條件的那個執行緒將允許其他執行緒繼續。

18.4 如何從一個文本文件運行SQL命令

一般地，mysql客戶被交互性地使用，像這樣：

shell> mysql database

然而，也可以把你的SQL命令放在一個文件中並且告訴mysql從該文件讀取其輸入。要想這樣做，創造一個文本文件“text_file”，它包含你想要執行的命令。然後如下那樣調用mysql：

shell> mysql database < text_file

你也能啟動有一個USE db_name語句的文本文件。在這種情況下，在命令行上指定資料庫名是不必要的：

shell> mysql < text_file

見12.1 不同的MySQL程式概述。

18.5 MySQL在哪兒儲存臨時文件

MySQL使用TMPDIR環境變數的值作為儲存臨時文件的目錄的路徑名。如果你沒有設置TMPDIR，MySQL使用系統預設值，它通常是“/tmp”或“/usr/tmp”。如果包含你的臨時文件目錄的文件系統太小，你應該編輯safe_mysqld設定TMPDIR指向你有足夠空間的一個文件系統！你也可以使用mysqld的--tmpdir選項目設置臨時目錄。

MySQL以“隱含文件”創建所有臨時文件。這保証了如果mysqld被終止，臨時文件也將被刪除。使用隱含文件的缺點是你將看不到一個大的臨時文件填滿了臨時文件目錄所在的文件系統。

當排序(ORDER BY或GROUP BY)時，MySQL通常使用一個或兩個臨時文件。最大磁碟空間需求是：

(儲存東西的長度 + sizeof (資料庫指針))
* 匹配的行數
* 2

sizeof(資料庫指針)通常是4，但是在未來對確實很大的表可能增加。

對一些SELECT查詢，MySQL也創建臨時SQL表。這些沒被隱含且有“SQL_*”格式的名字。

ALTER TABLE和OPTIMIZE TABLE在原資料庫表的同一個目錄中創建一張臨時表。

18.6 怎樣保護“/tmp/mysql.sock ”不被刪除

如果你有這個問題，事實上任何人可以刪除MySQL通訊套接字“/tmp/mysql.sock”，在Unix的大多數版本上，你能通過為其設置sticky（t）位來保護你的“/tmp”文件系統。作為root登錄並且做下列事情：

shell> chmod +t /tmp

這將保護你的“/tmp”文件系統使得文件僅能由他們的所有者或超級用戶(root)刪除。

你能執行ls -ld /tmp檢查sticky位是否被設置，如果最後一位許可位是t，該位被設置了。

18.7 Access denied錯誤

見6.6 權限系統如何工作。並且特別要看6.13 引起Access denied錯誤的原因。

18.8 怎樣作為一個一般用戶運行MySQL

MySQL伺服器mysqld能被任何用戶啟動並運行。為了將mysqld改由Unix用戶user_name來運行，你必須做下列事情：

  1. 如果它正在運行，停止伺服器(使用mysqladmin shutdown)。
  2. 改變資料庫目錄和文件以便user_name有權限讀和寫文件(你可能需要作為Unix的root用戶才能做到)：
    shell> chown -R user_name /path/to/mysql/datadir

    如果在MySQL數據目錄中的目錄或文件是符號鏈接，你也將需要順著那些鏈接並改變他們指向的目錄和文件。chown -R不能跟隨符號鏈接。

  3. 以user_name用戶啟動伺服器，或如果你正在使用MySQL 3.22或以後版本，以Unix root用戶啟動mysqld並使用--user=user_name選項，mysqld將在接受任何連接之前切換到以Unix user_name用戶運行。
  4. 如果在系統被重新啟動時，你使用mysql.server腳本啟動mysqld，你應該編輯mysql.server用su以用戶user_name運行mysqld，或使用--user選項調用mysqld。（不改變safe_mysqld是必要的。）

現在，你的mysqld進程應該正在作為Unix用戶user_name運行，並運行完好。盡管有一件事情沒有變化：權限表的內容。預設 地(就在運行了腳本mysql_install_db安裝的權限表後)，MySQL用戶root是唯一有存取mysql資料庫或創建或拋棄資料庫權限的用戶。除非你改變了那些權限，否則他們仍然保持。當你作為一個Unix用戶而不是root登錄時，這不應該阻止你作為MySQL root用戶來存取MySQL﹔只要為客戶程式指定-u root的選項。

注意通過在命令行上提供-u root，作為root存取MySQL，與作為Unix root用戶或其他Unix用戶運行MySQL 沒有關系。MySQL的存取權限和用戶名與Unix用戶名字是完全分開的。唯一與Unix用戶名有關的是，如果當你調用一個客戶程式時，你不提供一個-u選項，客戶將試圖使用你的Unix登錄名作為你的MySQL用戶名進行連接。

如果你的Unix機器本身不安全，你可能應該至少在存取表中為MySQL root用戶放上一個密碼。否則，在那台機器上有一個帳號的任何用戶能運行mysql -u root db_name並且做他喜歡做的任何事情。

18.9 怎樣重新設置一個忘記的密碼

如果你忘記了MySQL的root用戶的密碼，你可以用下列程序恢復它。

  1. 通過發送一個kill（不是kill -9)到mysqld伺服器來關閉mysqld伺服器。pid 被保存在一個.pid文件中，通常在MySQL資料庫目錄中：
    kill `cat /mysql-data-directory/hostname.pid`

    你必須是一個UNIX root用戶或運行伺服器的相同用戶做這個。

  2. 使用--skip-grant-tables選項重啟mysqld。
  3. 用mysql -h hostname mysql連接mysqld伺服器並且用一條GRANT命令改變密碼。見7.26 GRANT和REVOKE句法。你也可以用mysqladmin -h hostname -u user password 'new password' 進行。
  4. 用mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES來裝載權限表。

18.10 文件許可權限問題

如果你有與文件許可有關的問題，例如，如果當你創建一張表時，mysql發出下列錯誤消息：

ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)

那麼可能是在mysqld啟動時，環境變數UMASK可能設置不正確。預設的umask值是0660。你可以如下啟動safe_mysqld改變其行為：

shell> UMASK=384  # = 600 in octal
shell> export UMASK
shell> /path/to/safe_mysqld &

18.11 文件沒找到

如果你從MySQL得到ERROR '...' not found (errno: 23), Can't open file: ... (errno: 24)或任何其他有errno 23或errno 24的錯誤，它意味著，你沒有為MySQL分配足夠的文件描述符。你能使用perror實用程式得到錯誤號含義是什麼的描述：

shell> perror 23
File table overflow
shell> perror 24
Too many open files

這裡的問題是mysqld正在試圖同時保持打開太多的文件。你也可以告訴mysqld一次不打開那麼多的文件，或增加mysqld可得到的文件描述符數量。

為了告訴mysqld一次保持打開更少的文件，你可以通過使用safe_mysqld的-O table_cache=32選項（預設值是64)使表緩沖更小。減小max_connections值也將減少打開文件的數量(預設值是90)。

要想改變mysqld可用的文件描述符數量，修改safe_mysqld腳本。腳本中有一條注釋了的行ulimit -n 256。你可以刪除'#'字符來去掉該行的注釋，並且改變數字256改變為mysqld可用的文件描述符的數量。

ulimit能增加文件描述符的數量，但是只能到作業系統強加的限制。如果你需要增加每個進程可用的文件描述符數量的OS限制，參見你的作業系統文檔。

注意，如果你運行tcsh外殼，ulimit將不工作！當你請求當前限制時，tcsh也將報告不正確的值！在這種情況下，你應該用sh啟動safe_mysqld！

18.12 使用DATE列的問題

一個DATE值的格式是'YYYY-MM-DD'。根據ANSI SQL，不允許其他格式。你應該在UPDATE表達式和SELECT語句的WHERE子句中使用這個格式。例如：

mysql> SELECT * FROM tbl_name WHERE date >= '1997-05-05';

為了方便，如果日期用在數字上下文，MySQL自動變換一個日期到一個數字(並且反過來也如此)。當更新時和將一個日期與TIMESTAMP、DATE或DATETIME列比較的一個WHERE子句中，也是足夠靈活以允許一種“寬松”的字符串格式。（寬松格式意味著任何標點字符用作在部件之間的分割符。例如，'1998-08-15'和'1998#08#15'是等價的。）MySQL也能變換不包含分割符的一個字符串(例如 '19980815')，如果它作為一個日期說得通。

特殊日期'0000-00-00'可以作為'0000-00-00'被儲存和檢索。當通過MyODBC使用一個'0000-00-00'日期時，在MyODBC 2.50.12和以上版本，它將自動被轉換為NULL，因為ODBC不能處理這種日期。

因為MySQL實行了上述的變換，下列語句可以工作：

mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');

mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

然而，下列將不工作：

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'19970505')=0;

STRCMP()是字符串函數，因此它將idate轉換為一個字符串並且實施字符串比較。它不將'19970505'轉換為一個日期並實施日期比較。

注意，MySQL不檢查日期是否正確。如果你儲存一個不正確的日期，例如'1998-2-31'，錯誤的日期將被儲存。如果日期不能被變換到任何合理的值，在DATE字段中儲存一個0。這主要是一個速度問題並且我們認為檢查日期是應用程式的責任，而不伺服器。

18.13 時區問題

如果你有一個問題，SELECT NOW()以GMT時間返回值而不是你的本地時間，你必須設定TZ環境變數為你的當前時區。這應該在伺服器運行的環境進行，例如在safe_mysqld或mysql.server中。

18.14 在搜索中的大小寫敏感性

預設地，MySQL搜索是大小寫不敏感的(盡管有一些字符集從來不是忽略大小寫的，例如捷克語)。這意味著，如果你用col_name LIKE 'a%'搜尋，你將得到所有以A或a開始的列值。如果你想要使這個搜索大小寫敏感，使用像INDEX(col_name, "A")=0檢查一個前綴。或如果列值必須確切是"A"，使用STRCMP(col_name, "A") = 0。

簡單的比較操作(>=、>、= 、< 、<=、排序和聚合)是基於每個字符的“排序值”。有同樣排序值的字符(像E，e和'e)被視為相同的字符！

LIKE比較在每個字符的大寫值上進行(E==e 但是E<>'e）。

如果你想要一個列總是被當作大小寫敏感的方式，聲明它為BINARY。見7.7 CREATE TABLE句法。

如果你使用以所謂的big5編碼的中文數據，你要使所有的字符列是BINARY，它可行，是因為big5編碼字符的排序順序基於 ASCII代碼的順序。

18.15 NULL值問題

NULL值的概念是造成SQL的新手的混淆的普遍原因，他們經常認為NULL是和一個空字符串''的一樣的東西。不是這樣的！例如，下列語句是完全不同的：

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

兩個語句把值插入到phone列，但是第一個插入一個NULL值而第二個插入一個空字符串。第一個的含義可以認為是“電話號碼不知道”，而第二個則可意味著“她沒有電話”。

在SQL中，NULL值在於任何其他值甚至NULL值比較時總是假的（FALSE）。包含NULL的一個表達式總是產生一個NULL值，除非在包含在表達式中的運算符和函數的文檔中指出。在下列例子，所有的列返回NULL：

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

如果你想要尋找值是NULL的列，你不能使用=NULL測試。下列語句不返回任何行，因為對任何表達式，expr = NULL是假的：

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想尋找NULL值，你必須使用IS NULL測試。下例顯示如何找出NULL電話號碼和空的電話號碼：

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = "";

在MySQL中，就像很多其他的SQL伺服器一樣，你不能索引可以有NULL值的列。你必須聲明這樣的列為NOT NULL，而且，你不能插入NULL到索引的列中。

當用LOAD DATA INFILE讀取數據時，空列用''更新。如果你想要在一個列中有NULL值，你應該在文本文件中使用\N。字面上的詞'NULL'也可以在某些情形下使用。見7.16 LOAD DATA INFILE句法。

當使用ORDER BY時，首先呈現NULL值。如果你用DESC以降序排序，NULL值最後顯示。當使用GROUP BY時，所有的NULL值被認為是相等的。

為了有助於NULL的處理，你能使用IS NULL和IS NOT NULL運算符和IFNULL()函數。

對某些列類型，NULL值被特殊地處理。如果你將NULL插入表的第一個TIMESTAMP列，則插入當前的日期和時間。如果你將NULL插入一個AUTO_INCREMENT列，則插入順序中的下一個數字。

18.16 alias問題

你可以在GROUP BY、ORDER BY或在HAVING部分中使用別名引用列。別名也可以用來為列取一個更好點的名字：

SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0;
SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0;
SELECT id AS "Customer identity" FROM table_name;

注意，你的 ANSI SQL 不允許你在一個WHERE子句中引用一個別名。這是因為在WHERE代碼被執行時，列值還可能沒有終結。例如下列查詢是不合法：

SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id;

WHERE語句被執行以確定哪些行應該包括GROUP BY部分中，而HAVING用來決定應該只用結果集合中的哪些行。

18.17 從關聯的表中刪除行

因為MySQL不支援子選擇或在DELETE語句中使用多個表，你應該使用下列方法從2個關聯的表中刪除行：

  1. 在主表中基於某個WHERE條件SELECT行。
  2. 在主表中基於相同的條件DELETE行。
  3. DELETE FROM related_table WHERE related_column IN (selected_rows)

如果在related_column查詢中的字符的全部數量超過1,048,576(預設值max_allowed_packet），你應該分成更小的部分並且執行多個DELETE語句。如果related_column是一個索引，你每次只刪除100-1000個related_column id將可能使得DELETE最快。如果related_column不是一個索引，速度與IN子句中參數的數量無關。

18.18 解決沒有匹配行的問題

如果你有一個複雜的查詢，涉及多個表，但沒有返回任何行，你應該使用下列程序查找你的詢問有什麼不對：

  1. EXPLAIN測試查詢並且檢查你是否能找出顯然是錯誤的一些東西。見7.22 EXPLAIN句法(得到關於一個SELECT的資訊)。
  2. 僅選擇那些在WHERE子句中使用的字段。
  3. 一次從查詢中刪除一個表，直到它返回一些行。如果表很大，對查詢使用LIMIT 10是一個好主意。
  4. 對應該已經匹配一行的列做一個SELECT，針對從詢問中做後被刪除的表。
  5. 如果你將FLOAT或DOUBLE列與有小數的數字進行比較，你不能使用=!。這個問題在大多數計算機語言是常見的，因為浮點值不是準確的值。
    mysql> SELECT * FROM table_name WHERE float_column=3.5;
   ->
mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55;

    在大多數情況下，將FLOAT改成一個DOUBLE將修正它！

  6. 如果你仍然不能發現錯誤是什麼，創建一個最小的可運行mysql test < query.sql的測試來顯示你的問題。你可以用mysqldump --quick database tables > query.sql創建一個測試文件，在一個編輯器編輯文件，刪除一些插入行(如果有太多這些語句)並且在文件末尾加入你的選擇語句。測試你仍然有問題，可以這樣做：
    shell> mysqladmin create test2
shell> mysql test2 < query.sql

    使用mysqlbug的郵寄測試文件到mysql@lists.mysql.com。

18.19 與ALTER TABLE有關的問題

如果ALTER TABLE死於這樣一個錯誤：

Error on rename of './database/name.frm' to './database/B-a.frm' (Errcode: 17)

問題可能是MySQL在前一個ALTER TABLE中已經崩潰並且留下了一個名為“A-xxx”或“B-xxx”的老的資料庫表。在這種情況下，到MySQL數據目錄中並刪除所有名字以A-或B-開始的文件。（你可以把他們移到別的地方而不是刪除他們)。

ALTER TABLE工作方式是：

  • 以要求的改變創建一個名為“A-xxx”的新表。
  • 從老表把所有行拷貝到“A-xxx”。
  • 老表被改名為“B-xxx”。
  • “A-xxx”被改名為你的老表的名字。
  • “B-xxx”被刪除。

如果某些改名操作出錯，MySQL試圖還原改變。如果出錯嚴重(當然，這不應該發生。)，MySQL可能留下了老表為“B-xxx”但是一個簡單改名就應該恢復你的數據。

18.20 怎樣改變一張表中列的順序

SQL的要點是中抽像應用程式以避免數據儲存格式。你應該總是以你想要檢索數據的意願指定順序。例如：

SELECT col_name1, col_name2, col_name3 FROM tbl_name;

將以col_name1、col_name2、col_name3的順序返回列，而：

SELECT col_name1, col_name3, col_name2 FROM tbl_name;

將以col_name1、col_name3、col_name2的順序返回列。

在一個應用程式中，你應該決不基於他們的位置使用SELECT * 檢索列，因為被返回的列的順序永遠不能保証﹔對你的資料庫的一個簡單改變可能導致你的應用程式相當有戲劇性地失敗。

不管怎樣，如果你想要改變列的順序，你可以這樣做：

  1. 以正確的列順序創建一張新表。
  2. 執行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.
  3. 刪除或改名old_table。
  4. ALTER TABLE new_table RENAME old_table。

去首先, 先前, 下一個, 最終部分，目錄.


SQL語法教學 - 1Keydata

SQL語法教學
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

CSS語法教學

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

無論您是一位 SQL 的新手，或是一位只是需要對 SQL 複習一下的資料倉儲業界老將， 您就來對地方了。這個 SQL 教材網站列出常用的 SQL 指令。這個網站包含以下幾個部分：

♦ SQL 指令: SQL 如何被用來 儲存、讀取、以及處理資料庫之中的資料。

♦ 表格處理: SQL 如何被用來處理 資料庫中的表格。

♦ 進階 SQL: 介紹 SQL 進階概念，以及如何用 SQL 來執行一些較複雜的運算。

♦ SQL 語法: 這一頁列出所有在這個 教材中被提到的 SQL 語法。

對於每一個指令，我們將會先列出及解釋這個指令的語法，然後用一個例子來讓讀者瞭解這個 指令是如何被運用的。當您讀完了這個網站的所有教材後，您將對 SQL 的語法會有一個大致上的瞭解。 另外，您將能夠正確地運用 SQL 來由資料庫中獲取資訊。筆者本身的經驗是，雖然要對 SQL 有很透徹的 瞭解並不是一朝一夕可以完成的，可是要對 SQL 有個基本的瞭解並不難。希望在看完這個網站後，您也 會有同樣的想法。

請您現在將這個網站加入『我的最愛』，以便以後隨時可以回來查詢。 也請您 由這裡 來開始學習 SQL!

若您有在教有關 SQL 或是資料庫之類的課程的話，歡迎您連接此網站，做為輔助之用。

Copyright © 2013 1keydata.com 版權所有


php - MySQL 教學

這邊有個php mysql 教學的網站 http://www.php-mysql-tutorial.com/

用php+mysql也是行之有年了...

紀錄一下在php內怎麼使用mysql相關語法

一開始剛學php的時候

只是很簡單的使用php內建的mysql_connect指令

簡單直覺的方式

<?php
    $dbhost = '127.0.0.1';
    $dbuser = 'mysql_user';
    $dbpass = 'mysql_password';
    $dbname = 'mysql_databaseName';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($dbname);
    $sql = "SELECT COUNT(*) as total FROM `FileList` WHERE `class` = 0;";
    $result = mysql_query($sql) or die('MySQL query error');
    while($row = mysql_fetch_array($result)){
        echo $row['name'];
    }
?>

其中以下四個變數是要設定你的mysql相關設定

    $dbhost = '127.0.0.1';
    $dbuser = 'mysql_user';
    $dbpass = 'mysql_password';
    $dbname = 'mysql_databaseName';

這邊就是建立連線

    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');

設定相關的編碼和選擇要使用的資料庫

    mysql_query("SET NAMES 'utf-8'");
    mysql_select_db($dbname);

接著就準備開始使用mysql的語法了

    $sql = "SELECT COUNT(*) as total FROM `FileList` WHERE `class` = 0;";
    $result = mysql_query($sql) or die('MySQL query error');
    while($row = mysql_fetch_array($result)){
        echo $row['name'];
    }

先用$sql紀錄語法，接著丟到mysql_query($sql)

這函式就會把$sql的語法丟到mysql讓他去執行

然後利用$result = mysql_query($sql)去得到回傳的結果

根據sql語法回傳的資料結構也不一樣

若是最一般的select語法則可以利用while迴圈和mysql_fetch_array去拿到資料

以上是最簡單的php mysql語法

但是後來發現如果一個php file裡面要存取多次database或是存取不只一個database

就會非常麻煩

所以我就改用了物件導向的方式

物件導向的方式

通常我會寫兩個檔案，一個是DB_config.php，另外一個是DB_class.php

DB_config.php就是很簡單的設定database的位址、username、password以及使用的資料表

<?php
    global $_DB;
    $_DB['host'] = "localhost";
    $_DB['username'] = "username";
    $_DB['password'] = "password";
    $_DB['dbname'] = "db_name";
?>

另外再寫一個DB_Class.php檔

<?php

class DB
{
    var $_dbConn = 0;
    var $_queryResource = 0;

    function DB()
    {
        //do nothing
    }

    function connect_db($host, $user, $pwd, $dbname)
    {
        $dbConn = mysql_connect($host, $user, $pwd);
        if (! $dbConn)
            die ("MySQL Connect Error");
        mysql_query("SET NAMES utf8");
        if (! mysql_select_db($dbname, $dbConn))
            die ("MySQL Select DB Error");
        $this->_dbConn = $dbConn;
        return true;
    }

    function query($sql)
    {
        if (! $queryResource = mysql_query($sql, $this->_dbConn))
            die ("MySQL Query Error");
        $this->_queryResource = $queryResource;
        return $queryResource;
    }

    /** Get array return by MySQL */
    function fetch_array()
    {
        return mysql_fetch_array($this->_queryResource, MYSQL_ASSOC);
    }

    function get_num_rows()
    {
        return mysql_num_rows($this->_queryResource);
    }

    /** Get the cuurent id */
    function get_insert_id()
    {
        return mysql_insert_id($this->_dbConn);
    }

}
?>

最後在要使用mysql的php file裡面

<?php
    require_once("DB_config.php");
    require_once("DB_class.php");

    $db = new DB();
    $db->connect_db($_DB['host'], $_DB['username'], $_DB['password'], $_DB['dbname']);
    $db->query("SELECT ....");
    while($result = $db->fetch_array())
    {
        // do something you want...
    }
?>


MySQL 基礎語法手冊

操作功能 SQL 語法

說 明

建立資料庫 | create database 資料庫名稱;
列出所有資料庫 | show databases;
刪除資料庫 | drop database 資料庫名稱;
使用資料庫 | use 資料庫名稱;
建立資料表 create table 資料表名稱(
sn integer auto_increment primary key,
name char(20),
mail char(50),
home char(50),
messages char(50)
); 		常用資料庫資料型態

1. INT (整數)
2. CHAR (1~255字元字串)
3. VARCHAR (不超過255字元不定長度字串)
4. TEXT (不定長度字串最多65535字元)

列出資料表欄位資訊 | describe 資料表名稱;
修改資料表欄位 alter table 資料表名稱
charange column 原來欄位名稱
新欄位名稱 資料型態;
新增資料表欄位 | alter table 資料表名稱 add column 欄位名稱 資料型態;
刪除資料表欄位 | alter table 資料表名稱 drop column 欄位名稱;
刪除資料表 | drop 資料表名稱 ;
插入欄位資料 insert into 資料表名稱(欄位1,欄位2,欄位3,欄位4, ...... 欄位N)
values('值1','值2','值3','值4', ...... '值N');
更新修改欄位資料 update 資料表名稱 set 欄位1='值1',欄位2='值2',欄位3='值3',... 欄位N='值N'
where 條件式 (例如 sn='5' 或 name='蘇國憲' );
查詢單一欄位資料 | select 欄位名 from 資料表名稱;
查詢多個欄位資料 | select 欄位名, 欄位名, 欄位名 from 資料表名稱;
查詢欄位資料的唯一值 | select distinct 欄位名 from 資料表名稱; | 重複值只列一次
查詢所有欄位資料 | select * from 資料表名稱 ;
條件式查詢 select * from 資料表名稱 where 條件式 (例如 sn='5') ; （=, <, >, !=）
條件式查詢 and | select * from 資料表名稱 where 條件式1 and 條件式2;
條件式查詢 or | select * from 資料表名稱 where 條件式1 or 條件式2;
查詢某一範圍 between | select * from 資料表名稱 where 欄位名 between 值1 and 值2 | 值為數字
查詢空值欄位的資料 | select * from 資料表名稱 where 欄位名 is null | not null
查詢特定筆數資料 | select * from 資料表名稱 limit 8, 10; | 第9筆開始選取10筆
查詢結果遞增排序 | select * from 資料表名稱 order by 欄位名;
查詢結果遞減排序 | select * from 資料表名稱 order by 欄位名 desc ;
查詢比對字串列出單一欄位 | select 欄位名 from 資料表名稱 where 欄位名 like '%字串%';
查詢比對字串列出所有欄位 | select * from 資料表名稱 where 欄位名 like '%字串%';
刪除條件值資料 | delete from 資料表名稱 where 條件式 (例如 sn='5' 或 id='91001' );
刪除條件值資料 | delete from 資料表名稱 where 條件式1 and 條件式2;
刪除條件值資料 | delete from 資料表名稱 where 條件式1 or 條件式2;
比對刪除條件值資料 | delete from 資料表名稱 where 欄位名 like '%字串%';

MySql 基本語法(查詢、插入、更新)

1. 資料表查詢

SELECT `欄位` FROM `資料表`;

一般用法： SELECT * FROM `table` ;

翻譯：選擇table這個資料表所有欄位的資料(就是全選啦!!)

備註：星號代表所有欄位，在sql語法、指令中星號代表全部

2. 資料表查詢 + 排序

SELECT `欄位` FROM `資料表` ORDER BY `特定欄位` DESC ;

一般用法： SELECT `id`,`name` FROM `table` ORDER BY `特定欄位` DESC ;

翻譯： 選取table資料表內的 id 和 name 這兩個欄位，並根據id這欄位做降冪排序(由高而低、由大到小、由z到a)

備註：ASC則是(由低而高、由小到大、由a到z)，與DESC相反

3. 資料表查詢 + 查詢條件

SELECT `欄位` FROM `資料表` WHERE `特定欄位` = 數字 ;

一般用法： SELECT * FROM `table` WHERE `id` = 363 ;

翻譯： 在table資料表內的尋找 id 欄位的內容是 363 且將 所有欄位的資料都取出來

SELECT `欄位` FROM `資料表` WHERE `特定欄位` LIKE 字串 ;

一般用法： SELECT `id`,`name` FROM `table` WHERE `name` LIKE 'admin' ;

翻譯： 在table資料表內的尋找 name 欄位的內容是 admin 且將 id 和 name 這兩個欄位都取出來

SELECT `欄位` FROM `資料表` WHERE `特定欄位` LIKE %字串% ;

一般用法： SELECT `id`,`name` FROM `table` WHERE `name` LIKE %'adm'% ;

翻譯： 在table資料表內的尋找 name 欄位的內容包含 adm ( admin 符合、administrator 也符合) 且將 id 和 name 這兩個欄位都取出來

備註：數字形態比對用 = (也可以用 > 、 < 、 >= 、 <=) ; 字串形態比對是使用 LIKE (LIKE 使用的是完全比對);字串如果需要模糊比對需要使用 %

4. 新增(插入)一筆資料

INSERT INTO `資料表`(`欄位1`,`欄位2`) VALUES ( '資料1' , '資料2' );

一般用法： INSERT INTO `table`(`id`,`name`) VALUES ( '12' , 'stanley' );

翻譯： 在 table 資料表內新增一筆資料 在 id 欄位內填入 12 ，在 name 欄位內填入 stanley

備註：在新增一筆資料時，必須將所有欄位和值都填上，預設是空值的欄位值可改成''，且須注意資料表本身的欄位結構、儲存型態，例如： id 欄位禁止存入字串、設有primary屬性的欄位不得輸入空值

5. 更新(修改)一筆資料

UPDATE `資料表` SET `欄位2` = '資料2' WHERE `欄位1` = '資料1' ;

一般用法：UPDATE `table` SET `name` = 'newaurora' WHERE `id` = '12' ;

翻譯： 在 table 資料表內找出 id = 12 的資料，並將 name 欄位內的資料修改為 newaurora

備註：更新資料時必須確定條件設定是否正確，如上例，會把資料表內 id 欄位裡是 12 的資料都找出來並修改成newaurora ，因此使用前必須注意條件判斷

MySQL 基本操作語法

net start mysql
啟動 MySQL

查詢資料庫、資料表、欄位等資訊
mysqlshow [-h ipAddress] -u user_name -p
mysqlshow -u user_name@ipAddress -p
列出所有資料庫

mysqlshow -u user_name -p db_name
列出該 database_name 所有資料表

mysqlshow -u user_name -p db_name table_name
列出該 database_name 裡 table_name 資料表裡的欄位

mysqlshow -u user_name -p db_name table_name field_name
列出該 database_name 裡 table_name 的 field_name 的欄位資訊

更改密碼
mysqladmin password 'new_password'
更改目前系統登入使用者的密碼

於資料庫中導入執行sql script 檔
mysql db_name < sql_filename.sql

與 MySQL 連線
mysql [-h ipAddress] -u user_name -ppassword
mysql [-h ipAddress] -u user_name -p

切換使用資料庫 database_name
mysql> USE db_name

mysql> SELECT DATABASE();
列出目前預設的資料庫名稱

mysql> SHOW DATABASES;
列出所有資料庫

mysql> SHOW DATABASES LIKE 'my%';
列出所有資料庫名稱為 my 開頭的

mysql> SHOW TABLES FROM db_name [LIKE ...];
列出該資料庫所有資料表名稱

mysql> SHOW COLUMNS FROM table_name [LIKE ...];
mysql> SHOW COLUMNS FROM table_name FROM db_name [LIKE ...];
mysql> SHOW FIELDS FROM table_name [LIKE ...];
mysql> DESCRIBE table_name ;
mysql> EXPLAIN table_name ;
列出該資料表所有欄位名稱

mysql> SHOW INDEX FROM table_name [LIKE ...];
mysql> SHOW INDEX FROM table_name FROM db_name [LIKE ...];
mysql> SHOW KEY FROM table_name [LIKE ...];
列出該資料表所有索引資訊

mysql> SHOW TABLE STATUS;
mysql> SHOW TABLE STATUS FROM db_name [LIKE ...];列出資料表的相關資訊

mysql> SHOW VARIABLES [LIKE ...];
顯示 MySQL 相關參數設定

mysql> SHOW VARIABLES LIKE '%character%' ;
顯示資料庫語系設定資訊

mysql> SHOW PROCESSLIST;
列出與 MySQL 連線的 threads 狀態

mysql> SHOW STATUS;
列出與 MySQL 目前的狀態

當進行資料表檢查或修補時，鎖定資料表可確保資料表的安全
(READ：唯讀狀態、WRITE：無法寫入也無法讀取)
mysql> LOCK TABLE table_name READ;
mysql> FLUSH TABLES;
鎖定資料表

mysql> UNLOCK TABLE;
資料表解除鎖定


Articles - PHP MySQL Tutorial

Articles

Tags

  • Authentication
  • Date
  • DateTime
  • Getting Started
  • MySQL Installation
  • PHP
  • PHP Installation
  • Validation
View more
MySQL Tutorials PHP Tutorials

PHP 12-24 hour Time Converter Part 2

In Part 1 of the PHP 12-24 hour Time Converter we generated a simple conversion routine, we now proceed to optimize...
In PHP Tutorials written by admin on 02-22-2010

PHP 12-24 hour Time Converter Part 1

Converting between the 24-hour time used in MySQL Time and DateTime fields, and the 12-hour AM/PM time used in...
In PHP Tutorials written by admin on 02-22-2010

Time Zones and the date() Command

PHP's date() is one of the most versatile commands in the language. With it you can view the date and time...
In PHP Tutorials written by admin on 02-15-2010

Append a String to a File Using PHP

To append a string to a file you will need to open the file using fopen() with the 'a' parameter. For example...
In PHP Tutorials written by admin on 12-20-2008

Determine a File Extension Using PHP

There are several ways determine a file extension using PHP. First is using the combination of strrpos() and substr...
In PHP Tutorials written by admin on 12-20-2008

PHP Number Formats

PHP's solution to formatting number is the number_format() function. This function take 4 arguments but only...
In PHP Tutorials written by admin on 12-20-2008

Reading a File Using PHP

A simple method for reading a file is to use the file() function which will return an array containing each line...
In PHP Tutorials written by admin on 12-20-2008

List a Directory's Contents Using PHP

To list the content of a directory you just need to use the combination of opendir() and readdir() functions. ...
In PHP Tutorials written by admin on 12-20-2008

Executing a Shell Command Using PHP

You can use either system() or exec() . Just remember to ALWAYS use the full path to the command. So instead of...
In PHP Tutorials written by admin on 12-20-2008

Finding Sub-Strings using PHP

PHP already have the function that check if a substring exists in another string. It's called strpos() . This...
In PHP Tutorials written by admin on 12-20-2008

Remove a File Extention Using PHP

To strip the file extension from a file name you can use the combination of strrpos() and substr() function like...
In PHP Tutorials written by admin on 12-20-2008

Remove a File Using PHP

To remove a file from php use the unlink() function. You can enter either the full path or the relative path to...
In PHP Tutorials written by admin on 12-20-2008

Read HTML files using PHP

Reading an html file is just like reading any other file. You could use fopen() combined with fread() or file_get_contents...
In PHP Tutorials written by admin on 12-20-2008

Reading a Remote File Using PHP

To read a remote file from php you have at least four options : 1. Use fopen() 2. Use file_get_contents() 3. CURL...
In PHP Tutorials written by admin on 12-20-2008

Image Gallery : Album List

Here is the page that the gallery visitors see. The code behind it is mostly the same as the one in the admin pages...
In PHP Tutorials written by admin on 12-20-2008

Image Gallery : Image List & Detail

Clicking on one of the album icon from the album list page will bring you to this page. The layout is similar to...
In PHP Tutorials written by admin on 12-20-2008

Image Gallery Administration Page

Login and logout Before you can access the admin pages you will need to login first. The login method is very basic...
In PHP Tutorials written by admin on 12-20-2008

Admin Page For Content Management System (CMS)

Now we start creating the administration page for our content management system. This page will list all the articles...
In PHP Tutorials written by admin on 12-20-2008

Creating A Guestbook Using PHP and MySQL ( Part 2 )

Welcome to the second part of this guestbook tutorial. In case you haven't read the first section then go here...
In PHP Tutorials written by admin on 12-20-2008

PHP and MySQL Resources on the Net

PHP MySQL Resources PHP Homepage Of course, I have to list this site here. This is where you can to download the...
In PHP Tutorials written by admin on 12-20-2008

User Authentication in PHP

Here are some authentication method that we'll discuss Basic authentication We hard code the username and password...
In PHP Tutorials written by admin on 12-20-2008

Uploading Files To the Server Using PHP

Now, we will make another upload script. But this time we won't save the file in the database. We will only...
In PHP Tutorials written by admin on 12-20-2008

Finding PHP and MySQL Hosting

There are a lot of things to consider when choosing a web hosting company. But one thing for sure is that price...
In PHP Tutorials written by admin on 12-20-2008

Paging Using PHP and MySQL (Part II)

When there's more than one column involved in paging there isn't much that we need to modify. We only need...
In PHP Tutorials written by admin on 12-20-2008

Update and Delete in MySQL

Delete Data The DELETE statement deletes rows from a table that satisfy the condition given by the WHERE clause...
In MySQL Tutorials written by admin on 12-19-2008

Retrieve Data from MySQL Table

Retrieving the table data is easy, just use the SELECT statement like this mysql> SELECT * FROM species; +-...
In MySQL Tutorials written by admin on 12-19-2008

Add Data to a MySQL Database

You can insert data to the tables directly from mysql> prompt or by loading a file containing the data. The...
In MySQL Tutorials written by admin on 12-19-2008

Create a Table in MySQL

For this example we'll create two tables. The first one describe the species of animals available in a pet...
In MySQL Tutorials written by admin on 12-19-2008

Create New MySQL Database

You need to use mysqladmin to create MySQL database. The command is simple just write mysqladmin in a dos window...
In MySQL Tutorials written by admin on 12-19-2008

Add New MySQL User

For adding a new user to MySQL you just need to add a new entry to user table in database mysql . Below is an example...
In MySQL Tutorials written by admin on 12-19-2008

Starting MySQL

Before starting the MySQL client make sure the server is turned on. If you run Windows 9x start the mysqld.exe...
In MySQL Tutorials written by admin on 12-19-2008

PHP Editors

Because PHP files are just plain text files you can use any editor to create and edit PHP files. But even though...
In PHP Tutorials written by admin on 12-19-2008

PHP Forms

Using forms in a web based application is very common. Most forms are used to gather information like in a signup...
In PHP Tutorials written by admin on 12-19-2008

PHP Functions

Real world applications are usually much larger than the examples above. In has been proven that the best way to...
In PHP Tutorials written by admin on 12-19-2008

PHP Control Structures

The next examples will show you how to use control structures in PHP. I won't go through all just the ones...
In PHP Tutorials written by admin on 12-19-2008

Strings in PHP

Strings are probably what you will use most in your PHP script. From concatenating, looking for patterns, trim...
In PHP Tutorials written by admin on 12-19-2008

PHP Variable Types

PHP supports eight primitive types. Four scalar types: boolean : expresses truth value, TRUE or FALSE. Any non...
In PHP Tutorials written by admin on 12-19-2008

PHP Variables

Variables in PHP are represented by a dollar sign followed by the name of the variable. The variable name is case...
In PHP Tutorials written by admin on 12-19-2008

Using PHP Comments

Comment is a part of your PHP code that will not be translated by the PHP engine. You can use it to write documentation...
In PHP Tutorials written by admin on 12-19-2008

Opening & Closing PHP Tags

To open a block of PHP code in a page you can use one of these four sets of opening and closing tags Opening Tag...
In PHP Tutorials written by admin on 12-19-2008

Image Gallery : Modify & Delete Images

Here is the snapshot of the modify image form. It's very similar to the form to add the image except for the...
In PHP Tutorials written by admin on 12-18-2008

Image Gallery : Add Image

Adding a new image is easy. Just select in which album you want the image stored, supply the image name, description...
In PHP Tutorials written by admin on 12-18-2008

Image Gallery : Modify & Delete Albums

Here is the page where you can modify an album's name, description and image icon We display the album thumbnail...
In PHP Tutorials written by admin on 12-18-2008

Image Gallery : Add New Album

This is a very simple form where you can enter the album name, description and image. After you click the "Add...
In PHP Tutorials written by admin on 12-18-2008

User Authentication : Storing User ID's and Passwords In a MySQL Database

A more common method of authenticating a user is by checking the database to see if the submitted user id and password...
In MySQL Tutorials written by admin on 12-18-2008

Basic User Authentication

With this basic authentication method we store the user information ( user id and password ) directly in the script...
In PHP Tutorials written by admin on 12-18-2008

User Authentication with Image Verification

In some cases you may want your loging form to be able to prevent automatic login by a robot ( script ). To achieve...
In PHP Tutorials written by admin on 12-18-2008

Content Management System ( CMS ) using PHP and MySQL

A Content Management System ( CMS ) is used to add, edit, and delete content on a website. For a small website...
In MySQL Tutorials written by admin on 12-18-2008

Uploading Files To MySQL Database

Using PHP to upload files into MySQL database sometimes needed by some web application. For instance for storing...
In MySQL Tutorials written by admin on 12-18-2008

Creating A Guestbook Using PHP and MySQL

You've seen it at least once right? Guestbook is one of the most common thing to find in a website. In this...
In PHP Tutorials written by admin on 12-18-2008
1 2 Next >
PHP MySQL Tutorial
Learn PHP and MySQL


CG數位學習網．PHP動態網頁設計線上教學

01 認識 PHP 動態網頁
02 架設執行 PHP 的平台
03 PHP 基本語法介紹
04 MySQL 資料庫介紹
05 MySQL 資料表的資料型態
06 phpMyAdmin 資料庫管理工具
07 MySQL 資料庫的安全問題
08 MySQL 資料庫備份與還原
09 Dreamweaver PHP 訪客留言板
10 Dreamweaver PHP 最新消息系統
11 Dreamweaver PHP 網站會員系統
12 認識 Session 與 Cookie 變數
13 認識伺服器變數
14 Dreamweaver PHP 網路投票系統
15 Dreamweaver PHP 商品型錄系統
16 Dreamweaver PHP 線上購物系統
17 Pure PHP Upload 檔案上傳
附錄．常見的錯誤訊息
附錄．常用的擴充程式


PHP 手冊

陣列函式庫 | IMAP,POP3和NNTP函式庫 | Perl相容正規表達函式庫
拼字檢查函式庫 | LDAP函式庫 | 正規表達函式庫
BC高精準度函式庫 郵件函式庫 信號與共享記憶體函式庫
曆法函式庫 數學函式庫 Session函式庫
COM函式庫 | Mcrypt編碼函式庫 | Shockwave Flash函式庫
類別和物件函式庫 Mhash函式庫 SNMP函式庫
日期與時間函式庫 雜項函式庫 字串函式庫
目錄函式庫 MySQL函式庫 URL函式庫
動態載入函式庫 網路函式庫 變數函式庫
檔案系統函式庫 | PDF函式庫 | Vmailmgr函式庫
FDF函式庫 | 信用卡交易函式庫 | WDDX函式庫
FTP函式庫 | PHP選項與資訊函式庫 | XML函式庫
GNU gettext函式庫 程式執行函式庫 YP/NIS函式庫
HTTP函式庫 Pspell函式庫 壓縮函式庫
ICAP函式庫 | GNU Readline函式庫 | PHP4新增的部份語法

作者 : 林義祥


PHP 手冊

PHP 手冊 PHP函式 PHP

目錄
前言
I. 入門指引
1. 簡介
2. 簡易教學
3. 安裝
4. Configuration
5. Security
II. 語言參考
6. 基本語法
7. 型別
8. 變數
9. 常數
10. 表達式
11. 運算符
12. 流程控制
13. 函式
14. 類與對象
15. 引用的解釋
III. 特點
16. 用 PHP 進行 HTTP 認証
17. Cookies
18. 文件上傳處理
19. 使用遠程文件
20. 連接處理
21. 資料庫永久連接
22. 安全模式
23. PHP 的命令行模式
IV. 函式參考
I. Apache 專用函式
II. 陣列函式庫
III. Aspell functions [deprecated]
IV. BCMath Arbitrary Precision Mathematics Functions
V. Bzip2 Compression Functions
VI. Calendar functions
VII. CCVS API Functions
VIII. COM support functions for Windows
IX. Class/Object Functions
X. ClibPDF functions
XI. Crack functions
XII. CURL, Client URL Library Functions
XIII. Cybercash payment functions
XIV. Crｅdit Mutuel CyberMUT functions
XV. Cyrus IMAP administration functions
XVI. Character type functions
XVII. Database (dbm-style) abstraction layer functions
XVIII. 時間日期函式庫
XIX. dBase functions
XX. DBM Functions
XXI. dbx functions
XXII. DB++ Functions
XXIII. Direct IO functions
XXIV. 目錄函式庫
XXV. DOM XML functions
XXVI. .NET functions
XXVII. Error Handling and Logging Functions
XXVIII. FrontBase Functions
XXIX. filePro functions
XXX. 文件系統函式庫
XXXI. Forms Data Format functions
XXXII. FriBiDi functions
XXXIII. FTP functions
XXXIV. Function Handling functions
XXXV. Gettext
XXXVI. GMP functions
XXXVII. HTTP functions
XXXVIII. Hyperwave functions
XXXIX. Hyperwave API functions
XL. iconv functions
XLI. Image functions
XLII. IMAP, POP3 and NNTP functions
XLIII. Informix functions
XLIV. InterBase functions
XLV. Ingres II functions
XLVI. IRC Gateway Functions
XLVII. PHP / Java Integration
XLVIII. LDAP functions
XLIX. Mail functions
L. mailparse functions
LI. 數學函式
LII. Multi-Byte String Functions
LIII. MCAL functions
LIV. Mcrypt Encryption Functions
LV. MCVE Payment Functions
LVI. Mhash Functions
LVII. Mimetype Functions
LVIII. Microsoft SQL Server functions
LIX. Ming functions for Flash
LX. Miscellaneous functions
LXI. mnoGoSearch Functions
LXII. mSQL functions
LXIII. MySQL 函式庫
LXIV. Mohawk Software session handler functions
LXV. muscat functions
LXVI. Network Functions
LXVII. Ncurses terminal screen control functions
LXVIII. Lotus Notes functions
LXIX. Unified ODBC functions
LXX. Object Aggregation/Composition Functions
LXXI. Oracle 8 函式
LXXII. OpenSSL functions
LXXIII. Oracle 函式
LXXIV. Ovrimos SQL functions
LXXV. Output Control Functions
LXXVI. Object property and method call overloading
LXXVII. PDF functions
LXXVIII. Verisign Payflow Pro functions
LXXIX. PHP Options&Information
LXXX. POSIX functions
LXXXI. PostgreSQL 資料庫函式庫
LXXXII. Process Control Functions
LXXXIII. Program Execution functions
LXXXIV. Printer functions
LXXXV. Pspell Functions
LXXXVI. GNU Readline
LXXXVII. GNU Recode functions
LXXXVIII. Regular Expression Functions (Perl-Compatible)
LXXXIX. qtdom functions
XC. Regular Expression Functions (POSIX Extended)
XCI. Semaphore, Shared Memory and IPC Functions
XCII. SESAM database functions
XCIII. Session handling functions
XCIV. Shared Memory Functions
XCV. Shockwave Flash functions
XCVI. SNMP functions
XCVII. Socket functions
XCVIII. String functions
XCIX. Sybase functions
C. Tokenizer functions
CI. URL Functions
CII. Variable Functions
CIII. vpopmail functions
CIV. W32api functions
CV. WDDX Functions
CVI. XML 語法解析函式
CVII. XML-RPC functions
CVIII. XSLT functions
CIX. YAZ functions
CX. YP/NIS Functions
CXI. Zip File Functions (Read Only Access)
CXII. Zlib Compression Functions
V. Extending PHP 4.0
24. Overview
25. Extension Possibilities
26. Source Layout
27. PHP's Automatic Build System
28. Creating Extensions
29. Using Extensions
30. Troubleshooting
31. Source Discussion
32. Accepting Arguments
33. Creating Variables
34. Duplicating Variable Contents: The Copy Constructor
35. Returning Values
36. Printing Information
37. Startup and Shutdown Functions
38. Calling User Functions
39. Initialization File Support
40. Where to Go from Here
41. Reference: Some Configuration Macros
42. API Macros
43. Streams API for PHP Extension Authors
Overview
Streams Basics
Streams Common API Reference
Streams Dir API Reference
Streams File API Reference
Streams Socket API Reference
Streams Structures
Streams Constants
VI. FAQ: 常見問題
44. 一般訊息
45. 郵件列表
46. 獲取 PHP
47. 資料庫問題
48. 安裝
49. 編譯問題
50. 使用 PHP
51. PHP 和 HTML
52. PHP 和 COM
53. PHP 和其它語言
54. 從 PHP/FI 2 移植到 PHP 3
55. 從 PHP 3 移植到 PHP 4
56. 雜類問題
VII. 附錄
A. PHP 及其相關工程的歷史
B. 從 PHP 3 移植到 PHP 4
C. 從 PHP/FI 2 移植到 PHP 3
D. 排除 PHP 程序的錯誤
E. 擴展 PHP
F. 函式別名列表
G. 保留字列表
H. 資源型別列表
I. 支援的協議／封裝協議列表
J. 解析器代號列表
K. 關於本手冊
L. 補充說明
Stig Sæther Bakken
Alexander Aulbach
Egon Schmid
Jim Winstead
Lars Torben Wilson
Rasmus Lerdorf
Andrei Zmievski
Jouni Ahto

編輯

穆少磊
肖盛文
宋琪
李達
黃嘯宇
王遠之
孫慮

02-11-2002

版權 © 1997, 1998, 1999, 2000, 2001, 2002 PHP 文檔小組


入門指引

PHP 手冊
上一頁 下一頁

I. 入門指引

目錄
1. 簡介
2. 簡易教學
3. 安裝
4. Configuration
5. Security
上一頁 | 首頁 | 下一頁
前言 |  | 簡介


簡介

PHP 手冊
上一頁 下一頁

章 1. 簡介

目錄
PHP 是什麼？
PHP 能做什麼？

PHP 是什麼？

PHP（“PHP: Hypertext Preprocessor”，超文本預處理器的字母縮寫）是一種被廣泛應用的開放原始碼的多用途腳本語言，它可嵌入到 HTML中，尤其適合 WEB 開發。

以上是一個簡單的回答，不過這是什麼意思呢？請看如下例子：

例子 1-1. 一個介紹性的範例

<html>
    <head>
        <title>Example</title>
    </head>
    <body>

        <?php
        echo "Hi, I'm a PHP script!";
        ?>

    </body>
</html>

請注意這個範例和其它用 C 或 Perl 語言寫的腳本之間的區別──與用大量的命令來編寫程序以輸出 HTML 不同的是，我們用 PHP 編寫了一個 HTML 腳本，其中嵌入了一些代碼來做一些事情（例如，在本例中我們輸出了一些文本）。PHP 代碼被特殊的起始符和結束符包含，使得您可以進出“PHP 模式”。

和客戶端的 JavaScript 不同的是，PHP 代碼是執行在伺服端的。如果您在您的伺服器上建立了如上例類似的代碼，則在執行該腳本後，客戶端就能接收到其結果，但他們無法得知其背後的代碼是如何運作的。您甚至可以將 WEB 伺服器設置成讓 PHP 來處理所有的 HTML 文件，這麼一來，用戶就無法得知伺服端到底做了什麼。

使用 PHP 的一大好處是它對於初學者來說及其的簡單，同時也給專業的程序員提供了各種高級的特性。當您看到 PHP 長長的特性列表時，請不要害怕。您可以很快的入門，只需幾個小時您就可以自己寫一些簡單的腳本。

儘管 PHP 的開發是以伺服端腳本為目的地，但事實上其功能遠不局限與此。請繼續讀後面的章節，在“PHP 能做什麼？”一節中您將獲得更多的訊息。

上一頁 | 首頁 | 下一頁
入門指引 | 上一層 | PHP 能做什麼？


簡易教學

PHP 手冊
上一頁 下一頁

章 2. 簡易教學

目錄
我需要些什麼？
您的第一個 PHP 頁面
實用的腳本
處理表單
在新版本的 PHP 中使用舊的 PHP 代碼
下一步做什麼？

本章我們將給出關於 PHP 的簡易教學。雖然 PHP 的功能並不局限於產生動態的 WEB 頁面，但本章的內容僅涉及於此。請查閱題為“PHP 能做什麼？”一節以獲取更多訊息。

使用了 PHP 的 WEB 頁面將被和通常的 HTML 頁面一樣處理，您可以用建立 HTML 頁面的通常方法來建立和編輯它們。

我需要些什麼？

在本教程中，我們假設您的伺服器已經安裝並執行了 PHP，所有以 .php 結尾的文件都將由 PHP 來處理。在大部分的伺服器上，這是 PHP 的預定擴展名，不過，也請詢問您的伺服器管理員以確認。如果您的伺服器支援 PHP，則您不需要做任何事情。您只用建立您的 .php 文件，並把他們放置到您的 WEB 目錄中，伺服器將神奇的自動為您解析這些文件。您不用編譯任何東西，也不用安裝任何其它的工具，您僅僅只需把這些使用了 PHP 的文件想象成簡單的 HTML 文件，其中只不過多了一種新的標籤，在這裡您可以做各種各樣的事情。

上一頁 | 首頁 | 下一頁
PHP 能做什麼？ | 上一層 | 您的第一個 PHP 頁面


安裝

PHP 手冊
上一頁 下一頁

章 3. 安裝

目錄
General Installation Considerations
Unix/HP-UX installs
Unix/Linux installs
Unix/Mac OS X installs
Unix/OpenBSD installs
Unix/Solaris installs
Installation on UNIX systems
Windows 系統下的安裝
Servers-CGI/Commandline
Apache 伺服器
Caudium 伺服器
Servers-fhttpd
IIS/PWS 伺服器
Servers-Netscape and iPlanet
Servers-OmniHTTPd Server
Servers-Oreilly Website Pro
Sambar 伺服器
Servers-Xitami
Servers-Other web servers
Problems?
Complete list of configure options

General Installation Considerations

Before installing first, you need to know what do you want to use PHP for. There are three main fields you can use PHP, as described in the What can PHP do? section:

  • Server-side scripting

  • Command line scripting

  • Client-side GUI applications

For the first and most common form, you need three things: PHP itself, a web server and a web browser. You probably already have a web browser, and depending on your operating system setup, you may also have a web server (eg. Apache on Linux or IIS on Windows). You may also rent webspace at a company. This way, you don't need to set up anything on your own, only write your PHP scripts, upload it to the server you rent, and see the results in your browser. You can find a list of hosting companies at http://hosts.php.net/.

While setting up the server and PHP on your own, you have two choices for the method of connecting PHP to the server. For many servers PHP has a direct module interface (also called SAPI). These servers include Apache, Microsoft Internet Information Server, Netscape and iPlanet servers. Many other servers have support for ISAPI, the Microsoft module interface (OmniHTTPd for example). If PHP has no module support for your web server, you can always use it as a CGI processor. This means you set up your server to use the command line executable of PHP (php.exe on Windows) to process all PHP file requests on the server.

If you are also interested to use PHP for command line scripting (eg. write scripts autogenerating some images for you offline, or processing text files depending on some arguments you pass to them), you always need the command line executable. For more information, read the section about writing command line PHP applications. In this case, you need no server and no browser.

With PHP you can also write client side GUI applications using the PHP-GTK extension. This is a completely different approach than writing web pages, as you do not output any HTML, but manage windows and objects within them. For more information about PHP-GTK, please visit the site dedicated to this extension. PHP-GTK is not included in the official PHP distribution.

From now on, this section deals with setting up PHP for web servers on Unix and Windows with server module interfaces and CGI executables.

Downloading PHP, the source code, and binary distributions for Windows can be found at http://www.php.net/. We recommend you to choose a mirror nearest to you for downloading the distributions.

上一頁 | 首頁 | 下一頁
下一步做什麼？ | 上一層 | Unix/HP-UX installs


Configuration

PHP 手冊
上一頁 下一頁

章 4. Configuration

目錄
The configuration file
How to change configuration settings
Configuration directives

The configuration file

The configuration file (called php3.ini in PHP 3.0, and simply php.ini as of PHP 4.0) is read when PHP starts up. For the server module versions of PHP, this happens only once when the web server is started. For the CGI and CLI version, it happens on every invocation.

The default location of php.ini is a compile time option (see the FAQ entry), but can be changed for the CGI and CLI version with the -c command line switch, see the chapter about using PHP from the command line. You can also use the environment variable PHPRC for an additional path to search for a php.ini file.

Not every PHP directive is documented below. For a list of all directives, please read your well commented php.ini file. You may want to view the latest php.ini here from CVS.

註: The default value for the PHP directive register_globals changed from on to off in PHP 4.2.0.

例子 4-1. php.ini example

; any text on a line after an unquoted semicolon (;) is ignored
[php] ; section markers (text within square brackets) are also ignored
; Boolean values can be set to either:
;    true, on, yes
; or false, off, no, none
register_globals = off
magic_quotes_gpc = yes

; you can enclose strings in double-quotes
include_path = ".:/usr/local/lib/php"

; backslashes are treated the same as any other character
include_path = ".;c:\php\lib"

上一頁 | 首頁 | 下一頁
Complete list of configure options | 上一層 | How to change configuration settings


Security

PHP 手冊
上一頁 下一頁

章 5. Security

目錄
General considerations
Installed as CGI binary
Installed as an Apache module
Filesystem Security
Database Security
Error Reporting
Using Register Globals
User Submitted Data
Hiding PHP
Keeping Current

PHP is a powerful language and the interpreter, whether included in a web server as a module or executed as a separate CGI binary, is able to access files, execute commands and open network connections on the server. These properties make anything run on a web server insecure by default. PHP is designed specifically to be a more secure language for writing CGI programs than Perl or C, and with correct selection of compile-time and runtime configuration options, and proper coding practices, it can give you exactly the combination of freedom and security you need.

As there are many different ways of utilizing PHP, there are many configuration options controlling its behaviour. A large selection of options guarantees you can use PHP for a lot of purposes, but it also means there are combinations of these options and server configurations that result in an insecure setup.

The configuration flexibility of PHP is equally rivalled by the code flexibility. PHP can be used to build complete server applications, with all the power of a shell user, or it can be used for simple server-side includes with little risk in a tightly controlled environment. How you build that environment, and how secure it is, is largely up to the PHP developer.

This chapter starts with some general security advice, explains the different configuration option combinations and the situations they can be safely used, and describes different considerations in coding for different levels of security.

General considerations

A completely secure system is a virtual impossibility, so an approach often used in the security profession is one of balancing risk and usability. If every variable submitted by a user required two forms of biometric validation (such as a retinal scan and a fingerprint), you would have an extremely high level of accountability. It would also take half an hour to fill out a fairly complex form, which would tend to encourage users to find ways of bypassing the security.

The best security is often inobtrusive enough to suit the requirements without the user being prevented from accomplishing their work, or over-burdening the code author with excessive complexity. Indeed, some security attacks are merely exploits of this kind of overly built security, which tends to erode over time.

A phrase worth remembering: A system is only as good as the weakest link in a chain. If all transactions are heavily logged based on time, location, transaction type, etc. but the user is only verified based on a single cookie, the validity of tying the users to the transaction log is severely weakened.

When testing, keep in mind that you will not be able to test all possibilities for even the simplest of pages. The input you may expect will be completely unrelated to the input given by a disgruntled employee, a cracker with months of time on their hands, or a housecat walking across the keyboard. This is why it's best to look at the code from a logical perspective, to discern where unexpected data can be introduced, and then follow how it is modified, reduced, or amplified.

The Internet is filled with people trying to make a name for themselves by breaking your code, crashing your site, posting inappropriate content, and otherwise making your day interesting. It doesn't matter if you have a small or large site, you are a target by simply being online, by having a server that can be connected to. Many cracking programs do not discern by size, they simply trawl massive IP blocks looking for victims. Try not to become one.

上一頁 | 首頁 | 下一頁
Configuration directives | 上一層 | Installed as CGI binary


基本語法

PHP 手冊
上一頁 下一頁

章 6. 基本語法

目錄
從 HTML 中分離
指令分隔符
註釋

從 HTML 中分離

PHP 的腳本由文件中一對特殊的標記所引起的內容，當解釋器分析一個文件時，所有特殊標記 外的普通文件，解釋器不對其做任何處理，而特殊標記內文件將作為 PHP 代碼被解釋器分析 執行。該執行機制將允許您在 HTML 中嵌入 PHP 代碼：PHP 標記外的內容將被完全獨立開， 不做任何處理，而內部的將作為 PHP 代碼解析。

用來標記 PHP 代碼塊的標記共有四套，其中只有兩套總是有效（<?php. . .?> 和 <script language="php">. . .</script>）；另外兩套可以在 php.ini 配置文件中 開啟或者關閉。雖然短格式的標記和 ASP 風格的標記可能比較省力，但是某些情況下您可能 必須要使用長格式的標記。比如，您打算在 XML 或者 XHTML 中嵌入 PHP 代碼，您將需要 使用 <?php. . .?> 形式的標記以適應 XML 的標準。

PHP 支援的標記為：

例子 6-1. 從 HTML 中分離的方式

1.  <?php echo("if you want to serve XHTML or XML documents, do like this\n"); ?>

2.  <? echo ("this is the simplest, an SGML processing instruction\n"); ?>
    <?= expression ?> This is a shortcut for "<? echo expression ?>"

3.  <script language="php">
        echo ("some editors (like FrontPage) don't
              like processing instructions");
    </script>

4.  <% echo ("You may optionally use ASP-style tags"); %>
    <%= $variable; # This is a shortcut for "<% echo . . ." %>

優先選用的方式為第一種方式 <?php. . .?>，因為它允許您在 XML 結構， 如 XHTML 的代碼中使用 PHP。

第二種方式並非總是可用的。只有當您在 php.ini 配置文件中啟動 short_open_tag 選項，才是可用的。 您也可以通過使用 short_tags() 函式（僅用於 PHP 3），或者 使用 --enable-short-tags 選項 configure PHP 來啟動短格式標記。 在 php.ini-dist 配置文件中，預定是開啟短格式標記的，但是建議您不要使用該標記。

在 PHP 配置文件中開啟選項 asp_tags 將啟動 第四種方式。

註: ASP 風格的標記增加於 PHP 3.0.4

註: 當開發大型應用程序或者用於分發的函式庫，或者在不受您控制的 PHP 伺服器上面開發 程序時，請不要使用短格式的標記，因為目標伺服器可能並不支援短格式的標記。為了 便於移植，請保証用於再分發的代碼中不使用短格式的標記。

PHP 代碼塊結束標記獎自動包含最近的一個結尾的新行（如果存在的話）。而且， 結束標記自動隱含一個分號; 您不需要為 PHP 代碼塊的最後行追加一個分號。

PHP 允許您使用如下的結構：

例子 6-2. 更高級的脫離

<?php
if ($expression) {
    ?>
    <strong>This is true.</strong>
    <?php
} else {
    ?>
    <strong>This is false.</strong>
    <?php
}
?>
PHP 將直接輸出結束標記和下一個開始標記中的任何非 PHP 代碼。當需要輸出大量的文本時， 退出 PHP 解析模式將比使用 echo() 或者 print() 或者此類的函式顯示所有文本要更加的有效。

上一頁 | 首頁 | 下一頁
語言參考 | 上一層 | 指令分隔符


型別

PHP 手冊
上一頁 下一頁

章 7. 型別

目錄
介紹
布爾型
整型
浮點型
字串
陣列
對象
資源
NULL
型別戲法

介紹

PHP 支援八種原始型別。

四種標量型別：

  • 布爾型（boolean）

  • 整型（integer）

  • 浮點型（float）

  • 字串（string）

兩種複合型別：

  • 陣列（array）

  • 對象（object）

最後是兩種特殊型別：

  • 資源（resource）

  • NULL

註: 本手冊中你經常會碰到 mixed 參數。這個偽型別表示該參數有多種可能的型別。

變數的型別通常不是由程序員設定的，確切地說，是由 PHP 根據該變數使用的上下文在執行時決定的。

註: 如果你想查看某個表達式的值和型別，用 var_dump()。

如果你只是想得到一個易讀懂的型別的表達方式用於調試，用 gettype()。要查看某個型別，不要用 gettype()，而用 is_type 函式。

如果你要將一個變數強制轉換為某型別，可以對其使用強制轉換或者 settype() 函式。

注意變數根據其當時的型別在特定場合下會表現出不同的風格。更多訊息見型別戲法。

上一頁 | 首頁 | 下一頁
註釋 | 上一層 | 布爾型


變數

PHP 手冊
上一頁 下一頁

章 8. 變數

目錄
基礎
預定義變數
變數範圍
可變變數
PHP 的外部變數

基礎

PHP 中一個美元符號後面跟上一個變數名稱，即表示一個變數。變數的名稱是對大小寫敏感的。

變數名與 PHP 中其它的標簽一樣遵循相同的規則。一個有效的變數名由字母或者下劃線開頭，後面跟上任意數量的字母，數字，或者下劃線。按照正常的正則表達式，它將被表述為：'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

註: 字母為 a-z，A-Z，ASCII 字元從 127 到 255 （0x7f-0xff）。

<?php
$var = "Bob";
$Var = "Joe";
echo "$var, $Var";      // outputs "Bob, Joe"

$4site = 'not yet';     // invalid; starts with a number
$_4site = 'not yet';    // valid; starts with an underscore
$t澌te = 'mansikka';    // valid; '洄 is ASCII 228.
?>

PHP 3 中，變數總是傳值設值。那也就是說，當你將一個表達式的值賦予一個變數時，整個原始表達式的值被設值到目標變數。這意味著，例如，當一個變數的值賦予另外一個變數時，改變其中一個變數的值，將不會影響到另外一個變數。有關這種型別的設值操作，請參閱 表達式 一章。

PHP 4 提供了另外一種方式給變數設值： 傳位址設值。這意味著新的變數簡單的引用（換言之，“成為其別名” 或者 “指向”）了原始變數。更動新的變數將影響到原始變數，反之亦然。這同樣意味著其中沒有執行複制操作；因而，這種設值操作更加快速。儘管如此，任何提速的操作只有在緊密循環或者大陣列或者對象 才可能被注意到。

使用傳位址設值，簡單地追加一個（&）符號到將要設值的變數前（源變數）。例如，下列代碼片斷兩次輸出‘My name is Bob’：

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                 // $foo is altered too.
?>

需要注意的是只有命名變數才可以傳位址設值，這一點非常重要。

<?php
$foo = 25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 * 7);  // Invalid; references an unnamed expression.

function test()
{
   return 25;
}

$bar = &test();    // Invalid.
?>

上一頁 | 首頁 | 下一頁
型別戲法 | 上一層 | 預定義變數


常數

PHP 手冊
上一頁 下一頁

章 9. 常數

目錄
語法
預定義常數

常數是一個簡單值的標籤（名字）。如同其名稱所暗示的，在腳本執行期間該值不能改變。（所謂的“magic constants” __FILE__ 和 __LINE__ 看上去是個例外，但是它們實際上不是常數。）常數預定為大小寫敏感。按照慣例常數標籤總是大寫的。

常數名和其它任何 PHP 標簽遵循同樣的命名規則。合法的常數名以字母或下劃線開始，後面跟著任何字母，數字或下劃線。用正則表達式是這樣表達的：[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

註: 在這裡，字母是 a-z，A-Z，以及從 127 到 255（0x7f-0xff）的 ASCII 字元。

常數的範圍是全域的 － 不用管範圍就可以在代碼的任何地方連接。

語法

可以用 define() 函式來定義常數。一個常數一旦被定義，就不能再改變或者取消定義。

常數只能包含標量資料（boolean，integer，float 和 string）。

可以簡單的通過指定其名字來取得常數的值，不要在常數前面加上 $ 符號。如果常數名是動態的，也可以用函式 constant() 來讀取常數的值。用 get_defined_constants() 可以獲得所有已定義的常數列表。

註: 常數和（全域）變數在不同的名字空間中。這意味著例如 TRUE 和 $TRUE 是不同的。

如果使用了一個未定義的常數，PHP 假定你想要的是該常數本身的名字。此時將發出一個 notice。用 defined() 函式來判斷一個常數是否已被定義。

常數和變數不同：

  • 常數前面沒有美元符號（$）；

  • 常數只能用 define() 函式定義，而不能通過設值語句；

  • 常數可以不用理會變數範圍的規則而在任何地方定義和連接；

  • 常數一旦定義就不能被重新定義或者取消定義；

  • 常數的值只能是標量。

例子 9-1. 定義常數

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
?>

上一頁 | 首頁 | 下一頁
PHP 的外部變數 | 上一層 | 預定義常數


表達式

PHP 手冊
上一頁 下一頁

章 10. 表達式

表達式是 PHP 最重要的基石。在 PHP 中，幾乎你所寫的任何東西都是一個表達式。 簡單但卻最精確的定義一個表達式的方式就是“anything that has a value”。

最基本的表達式形式是常數和變數。當你鍵入“$a = 5”，即將值'5'分配給變數 $a。 '5'，很明顯，值為5，換句話說'5'是一個值為5的表達式（既然如此，'5'是一個整型常數）。

設值之後，你所盼望的情況是 $a 的值為5，因而如果你寫下 $b = $a， 期望的是它猶如 $b = 5 一樣。換句話說，$a 是一個值也為5的表達式。 如果一切執行正確，那這正是將要發生的正確結果。

稍微複雜的表達式例子就是函式。例如，考慮下面的函式：

function foo ()
{
    return 5;
}

假定你已經熟悉了函式的概念（如果不是的話，請看一下函式的相關章節），那麼鍵入
$c = foo() 從本質上來說就如寫下 $c = 5，
而且你是正確的。 函式也是表達式，表達式的值即為它們的傳回值。既然 foo() 傳回5，
表達式 ‘foo()’ 的值也是5。通常函式不會僅僅傳回一個靜態值，而可能會計算一些東西。

當然，PHP 中的值常常並非是整型的。PHP 支援三種標量值型別：整型值，浮點值和字串值 （標量值不能拆分為更小的單元，比如：陣列）。PHP 也支援兩種複合型別：陣列和對象。 這兩種型別具可以設值給變數或者從函式傳回。

到目前為止，PHP/FI 2 的用戶不應該感到任何的變化。然而，當許多其它語言 為之努力的時候，PHP 在相同道路上促進了表達式的成長。PHP 是一種面向表達式 的語言，從這一方面來講幾乎一切都是表達式。考慮剛才我們已經研究過的例子， ‘$a = 5’。可以輕松的看到這裡有兩個相關的值，整型常數 '5'，而且變數 $a 的值也被更新為5。但是事實是：這裡只有一個相關的附加值，即被分配的值本身。 設值操作計算需分配的值，即5。實際上，意味著‘$a = 5’，不必管它是做什麼的， 是一個值為5的表達式。因而，一些像這樣的代碼‘$b = ($a = 5)’和‘$a =5; $b=5’ （分號標志著語句的結束）。因為設值操作的順序是由右到左的，你也可以這麼寫 ‘$b = $a =5’。

另外一個很好的面向表達式的例子就是前、後遞增和遞減。 PHP/FI 2 和多數其它語言的用戶應該比較熟悉變數++和變數--符號。即遞增和遞減 操作符。在 PHP/FI 2 中，語句‘$a++’沒有值（不是表達式），這樣的話你便不能為 其設值或者以任何其它方式來使用它。PHP 通過將其變為了表達式，如 C 語言，增強了 遞增/遞減的能力。在 PHP 和 C 語言 中，有兩種型別的遞增前遞增和後遞增，本質 上來講，前遞增和後遞增均增加了變數的值，並且對於變數的影響是相同的。不同的是 遞增表達式的值。前遞增，寫做‘++$variable’，求增加後的值（PHP 在讀取變數的值 之前，增加變數的值，因而稱之為‘前遞增’）。後遞增，寫做‘$variable++’，求變數 未遞增之前的原始值（PHP 在讀取變數的值之後，增加變數的值，因而叫做‘後遞增’）。 【譯者註:前遞增，++$a, 則該表達式的值加1；後遞增, $a++, 則該表達式的值不變。】

一個常用到表達式型別是比較表達式。這些表達式求值0或者1，即 FALSE 或者 TRUE (分別的)。PHP 支援 >（大於），>=（大於等於）， ==（等於），!=（不等於），<（小於），<= (小於等於)。這些表達式 都是在條件判斷語句，比如，if語句中最常用的。

這裡，我們將要研究的最後一個例子是組合的設值操作符表達式。你已經知道如果 想要為變數 $a 加1，可以簡單的寫‘$a++’或者‘++$a’。但是如果你想為變數增加 大於1的值，比如3，該怎麼做？你可以多次寫‘$a++’，但這樣明顯不是一種 高效舒適的方法，一個更加通用的做法是‘$a = $a + 3’。‘$a + 3’ 計算 $a 加上3 的值，並且得到的值重新賦予變數 $a, 於是 $a 的值增加了3。在 PHP 及其它 幾種類似 C 的語言中，你可以以一種更加簡短的形式完成上述功能，因而也更加清楚快捷。 為 $a 的當前值加3，可以這樣寫：$a += 3。這裡的意思是“取變數 $a 的值，加3， 得到的結果再次分配給變數 $a”。除了更簡略和清楚外，也可以更快的執行。 ‘$a += 3’的值，如同一個正常設值操作的值，是設值後的值。注意它不是3，而是 $a 加上3的組合值（即已經分配給 $a 的值）【譯者注：這裡表達式‘$a += 3’的值是什麼呢？ 不是3，也不是 $a 的原始值，而是完成 +3 操作後變數 $a 的值】。 任何兩位操作符都可以使用在複制操作符模式，例如‘$a -= 5’（從變數 $a 的值中減去5）， ‘$b *= 7’ （變數 $b 乘以 7），等等。

有一些表達式，如果你沒有在別的語言中看到過的話，可能認為它們是多餘的，如三重操作符：

$first ? $second : $third

如果第一個子表達式的值是 TRUE （非零），那麼計算第二個子表達式的值， 其值即為整個表達式的值。否則，將是第三個子表達式的值。

下面的例子一般來說應該可以稍微幫你理解前、後遞增和表達式：

function double($i)
{
    return $i*2;
}
$b = $a = 5;        /* assign the value five into the variable $a and $b */
$c = $a++;          /* post-increment, assign original value of $a
                       (5) to $c */
$e = $d = ++$b;     /* pre-increment, assign the incremented value of
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f = double($d++);  /* assign twice the value of $d <emphasis>before</emphasis>
                       the increment, 2*6 = 12 to $f */
$g = double(++$e);  /* assign twice the value of $e <emphasis>after</emphasis>
                       the increment, 2*7 = 14 to $g */
$h = $g += 10;      /* first, $g is incremented by 10 and ends with the
                       value of 24. the value of the assignment (24) is
                       then assigned into $h, and $h ends with the value
                       of 24 as well. */

在本章的開始，我們說過我們將會描述多種語句型別，並且如同許諾的那樣， 表達式可以是語句。儘管如此，不是每個表達式都是一個語句。而這樣的話， 一個語句，它的形式是'expr' ';'，一個表達式有一個分號結尾。在‘$b=$a=5;’， $a=5 是一個有效的表達式，但是它卻不是一個語句。‘$b=$a=5;’ 卻是一個有效 的語句。

最後一件值得提起的事情就是表達式的真實值。在許多事件中，大體上主要是 在條件執行和循環中，不要專注於表達式中明確的值，反而要注意表達式的 值是否是 TRUE 或者 FALSE。 常數 TRUE 和 FALSE （大小寫無關）是兩種可能的 Boolean 值。如果有 必要，一個表達式將自動轉換為 Boolean。參照 關於型別跳轉的部分。

PHP 提供了一套完整強大的表達式，而為它提供完整的文件資料已經超出了 本手冊的範圍。上面的例子應該為你提供了一個好的關於什麼是表達式和怎 樣構建一個有用的表達式的概念。在本手冊的其餘部分，我們將始終使用 expr來表示一個有效的 PHP 表達式。

上一頁 | 首頁 | 下一頁
預定義常數 | 上一層 | 運算符


運算符

PHP 手冊
上一頁 下一頁

章 11. 運算符

目錄
運算符優先級
算術運算符
設值運算符
位運算符
比較運算符
錯誤控制運算符
執行運算符
加一／減一運算符
邏輯運算符
字串運算符
陣列運算符

運算符優先級

運算符優先級指定了兩個表達式綁定得有多“緊密”。例如，表達式 1 + 5 * 3 的結果是 16 而不是 18 是因為乘號（“*”）的優先級比加號（“+”）高。必要時可以用括號來強制改變優先級。例如：(1 + 5) * 3 的值為 18。

下表從低到高列出了運算符的優先級。

表格 11-1. 運算符優先級

結合方向 | 運算符
左 | ,
左 | or
左 | xor
左 | and
右 | print
左 | = += -= *= /= .= %= &= |= ^= ~= <<= >>=
左 | ? :
左 | ||
左 | &&
左 | |
左 | ^
左 | &
無 | == != === !==
無 | < <= > >=
左 | << >>
左 | + - .
左 | * / %
右 | ! ~ ++ -- (int) (float) (string) (array) (object) @
右 | [
無 | new

上一頁 | 首頁 | 下一頁
表達式 | 上一層 | 算術運算符


流程控制

PHP 手冊
上一頁 下一頁

章 12. 流程控制

目錄
if
else
elseif
流程控制的替代語法
while
do..while
for
foreach
break
continue
switch
declare
return
require()
include()
require_once()
include_once()

任何 PHP 腳本都是由一系列語句構成的。一條語句可以是一個設值語句，一個函式呼叫，一個循環，甚至一個什麼也不做的（空語句）條件語句。語句通常以分號結束。此外，還可以用大括號將一組語句封裝成一個語句組。語句組本身可以當作是一行語句。本章講述了各種語句型別。

if

if 結構是很多語言包括 PHP 在內最重要的特性之一，它允許按照條件執行代碼片段。PHP 的 if 結構和 C 語言相似：

if (expr)
    statement

如同在表達式一章中定義的，expr 按照布爾求值。如果 expr 的值為 TRUE，PHP 將執行 statement，如果值為 FALSE － 將忽略 statement。有關哪些值被視為 FALSE 的更多訊息參見“轉換為布爾值”一節。

如果 $a 大於 $b，則以下例子將顯示 a is bigger than b：

if ($a > $b)
    print "a is bigger than b";

經常需要按照條件執行不止一條語句，當然並不需要給每條語句都加上一個 if 子句。可以將這些語句放入語句組中。例如，如果 $a 大於 $b，以下代碼將顯示 a is bigger than b 並且將 $a 的值賦給 $b：

if ($a > $b) {
    print "a is bigger than b";
    $b = $a;
}

if 語句可以無限層地嵌套在其它 if 語句中，這給程序的不同部分的條件執行提供了充分的彈性。

上一頁 | 首頁 | 下一頁
陣列運算符 | 上一層 | else


函式

PHP 手冊
上一頁 下一頁

章 13. 函式

目錄
用戶自定義函式
函式的參數
傳回值
舊的函式
變數函式

用戶自定義函式

一個函式可由以下的語法來定義：

function foo ($arg_1, $arg_2, ..., $arg_n)
{
    echo "Example function.\n";
    return $retval;
}

任何有效的 PHP 代碼都有可能出現在函式內部，甚至包括其它函式和 類 定義。

在 PHP 3 中，函式必須在被呼叫之前定義。而 PHP 4 則不再有這樣的 條件。

PHP 不支援函式重載，可能也不支援取消定義或者重定義已聲明的函式。

PHP 3 雖然支援預定參數（更多的訊息請參照 預定參數的值） ，但是卻不支援可變的參數個數。 PHP 4 支援: 見 可變長度的參數列表 和涉及到的相關函式 func_num_args()， func_get_arg()， 和 func_get_args() 以獲取更多的訊息。

上一頁 | 首頁 | 下一頁
include_once() | 上一層 | 函式的參數


類與對象

PHP 手冊
上一頁 下一頁

章 14. 類與對象

目錄
類
繼承
建構函式
::
parent
序列化對象－會話中的對象
The magic functions __sleep and __wakeup
References inside the constructor

類

類是變數與作用於這些變數的函式的集合。使用下面的語法定義一個類：

<?php
class Cart
{
    var $items;  // Items in our shopping cart

    // Add $num articles of $artnr to the cart

    function add_item ($artnr, $num)
    {
        $this->items[$artnr] += $num;
    }

    // Take $num articles of $artnr out of the cart

    function remove_item ($artnr, $num)
    {
        if ($this->items[$artnr] > $num) {
            $this->items[$artnr] -= $num;
            return true;
        } else {
            return false;
        }
    }
}
?>

上面的例子定義了一個 Cart 類，這個類由購物車中的商品構成的陣列和兩個用於 從購物車中增加和刪除商品的函陣列成。

注意

下面的警告注解對 PHP4 有效。

名稱 stdClass 已經被 Zend 使用並保留。您不能在您的 PHP 代碼 中定義名為 stdClass 的類。

The function names __sleep and __wakeup are magical in PHP classes. You cannot have functions with these names in any of your classes unless you want the magic functionality associated with them. See below for more information.

PHP reserves all function names starting with __ as magical. It is recommended that you do not use function names with __ in PHP unless you want some documented magic functionality.

註: 在 PHP 4 中，var 變數的值只能初始化為常數。用非常數值初始化變數， 您需要一個初始化函式，該函式在對象被創建時自動被呼叫。這樣一個函式被稱之為建構函式 （見下面）。

<?php
/* None of these will work in PHP 4. */
class Cart
{
    var $todays_date = date("Y-m-d");
    var $name = $firstname;
    var $owner = 'Fred ' . 'Jones';
    var $items = array("VCR", "TV");
}

/* This is how it should be done. */
class Cart
{
    var $todays_date;
    var $name;
    var $owner;
    var $items;

    function Cart()
    {
        $this->todays_date = date("Y-m-d");
        $this->name = $GLOBALS['firstname'];
        /* etc. . . */
    }
}
?>

Classes are types, that is, they are blueprints for actual variables. You have to create a variable of the desired type with the new operator.

<?php
$cart = new Cart;
$cart->add_item("10", 1);

$another_cart = new Cart;
$another_cart->add_item("0815", 3);

上述代碼創建了兩個 Cart 類的對象 $cart 和 $another_cart, 對象 $cart 的方法 add_item() 被呼叫時，增加了1件10號商品。對於對象 $another_cart, 3件0815號商品被增加到購物車中。

$cart 和 $another_cart 都有方法 add_item(), remove_item() 和一個 items 變數。 它們都是明顯的函式和變數。你可以把它們當作文件系統中的某些類似目錄的東西來考慮。 在文件系統中，你可以擁有兩個不同的 README.TXT 文件，只要不在相同的目錄中。 正如從為了根目錄連接每個文件你需要輸入該文件的完整的路徑名一樣，你必須指定需 要呼叫的函式的完整名稱：在 PHP 術語中，根目錄將是全域名稱空間，路徑名符號將是 ->。因而，名稱 $cart->items 和 $another_cart->items 命名了兩個不同的 變數。注意變數 $cart->items，不是 $cart->$items，那是因為在 PHP 中一個變數 名只有一個單獨的美元符號。

// correct, single $
$cart->items = array("10" => 1);

// invalid, because $cart->$items becomes $cart->""
$cart->$items = array("10" => 1);

// correct, but may or may not be what was intended:
// $cart->$myvar becomes $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);

在一個類的定義內部，你無法得知使用何種名稱的對象是可以連接的：在編寫 Cart 類時，並 不知道之後對象的名稱將會命名為 $cart 或者 $another_cart。因而你不能在類中使用 $cart->items。然而為了類定義的內部連接自身的函式和變數， 可以使用偽變數 $this 來達到這個目的。$this 變數可以理解為‘我自己的’或者‘當前對象’。因而 ‘$this->>items[$artnr] += $num’ 可以理解為‘我自己的物品陣列的 $artnr 計數器加 $num’ 或者 ‘在當前對象的物品陣列的 $artnr 計數器加 $num’。

註: 有一些不錯的函式用來處理類和對象。你應該關注一下 類/對象 函式。

上一頁 | 首頁 | 下一頁
變數函式 | 上一層 | 繼承


引用的解釋

PHP 手冊
上一頁 下一頁

章 15. 引用的解釋

目錄
引用是什麼
引用做什麼
引用不是什麼
引用傳遞
引用傳回
取消引用
引用定位

引用是什麼

在 PHP 中引用意味著用不同的名字連接同一個變數內容。這並不像 C 的指針，它們是符號表別名。注意在 PHP 中，變數名和變數內容是不一樣的，因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身 － 變數名是目錄條目，而變數內容則是文件本身。引用可以被看作是 Unix 文件系統中的緊密連接。

上一頁 | 首頁 | 下一頁
References inside the constructor | 上一層 | 引用做什麼


用 PHP 進行 HTTP 認証

PHP 手冊
上一頁 下一頁

章 16. 用 PHP 進行 HTTP 認証

PHP 的 HTTP 認証機制僅在 PHP 以 Apache 模塊方式執行時才有效，因此該功能不適用於 CGI 版本。在 Apache 模塊的 PHP 腳本中，可以用 header() 函式來向客戶端瀏覽器發送“Authentication Required”訊息，使其彈出一個用戶名/密碼輸入視窗。當用戶輸入用戶名和密碼後，包含有 URL 的 PHP 腳本將會再次和預定義變數 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 一起被呼叫，這三個變數分別被設定為用戶名，密碼和認証型別。預定義變數保存在 $_SERVER 或者 $HTTP_SERVER_VARS 陣列中。系統僅支援“基本的”認証。請參閱 header() 函式以獲取更多訊息。

PHP 版本問題: Autoglobals 全域變數，包括 $_SERVER等，在 PHP 4.1.0 以後版本有效， $HTTP_SERVER_VARS 從 PHP 3 開始有效。

以下是在頁面上強迫客戶端認証的腳本範例：

例子 16-1. HTTP 認証範例

<?php
  if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
  } else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
  }
?>

相容性問題: 在編寫 HTTP 表頭訊息代碼時請格外小心。為了對所有的客戶端保証相容性，關鍵字“Basic”的第一個字母必須大寫為“B”，分界字串必須用雙引號（不是單引號）引用；並且在表頭訊息行 HTTP/1.0 401 中，在 401 前必須有且僅有一個空格。

在以上例程中，我們僅僅只顯示出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值，但在實際運用中，您可能需要對用戶名和密碼的合法性進行檢查。或許進行資料庫的查詢，或許從 dbm 文件中檢索。

請注意由 Internet Explorer 瀏覽器本身的問題帶來的錯誤。它對表頭訊息的順序顯得似乎有點吹毛求疵。目前在 HTTP/1.0 401 頭之前發送 WWW-Authenticate 表頭訊息能解決該問題。

為了防止有人編寫惡意代碼來顯示為以前通過傳統外部機制認証的頁面提供的密碼，當某些頁面的外部認証被啟動時，PHP_AUTH 變數將不會被設置。在這種情況下，我們可以使用 REMOTE_USER 變數來辨別外部認証的用戶，即 $_SERVER['REMOTE_USER']。

設置問題: PHP 用 AuthType 選項來判斷外部認証機制是否有效。當您希望使用 PHP 認証的時候，請記得關閉該選項，否則任何認証的嘗試操作都會失敗。

注意，這仍然不能防止有人通過未認証的 URL 來從同一伺服器上認証的 URL 上偷取密碼。

Netscape Navigator 和 Internet Explorer 瀏覽器都會在收到 401 的伺服端傳回訊息時清空所有的本地瀏覽器整個域的 Windows 認証緩存。這能夠有效的注銷一個用戶，並迫使他們重新輸入他們的用戶名和密碼。有些人用這種方法來使登錄狀態“過期”，或者作為“注銷”按鈕的響應行為。

例子 16-2. 強迫重新輸入用戶名和密碼的 HTTP 認証的範例

<?php
  function authenticate() {
    header('WWW-Authenticate: Basic realm="Test Authentication System"');
    header('HTTP/1.0 401 Unauthorized');
    echo "You must enter a valid login ID and password to access this resource\n";
    exit;
  }

  if (!isset($_SERVER['PHP_AUTH_USER']) || ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
   authenticate();
  }
  else {
   echo "<p>Welcome: {$_SERVER['PHP_AUTH_USER']}<br>";
   echo "Old: {$_REQUEST['OldAuth']}";
   echo "<form action='{$_SERVER['PHP_SELF']}' METHOD='POST'>\n";
   echo "<input type='hidden' name='SeenBefore' value='1'>\n";
   echo "<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}'>\n";
   echo "<input type='submit' value='Re Authenticate'>\n";
   echo "</form></p>\n";
  }
?>

該行為對於 HTTP 基本認証標準來說並不是必須的，因此您不能依靠這種方法。對 Lynx 瀏覽器的測試表明 Lynx 在收到 401 的伺服端傳回訊息時不會清空認証文件，因此只要對認証文件的檢查要求沒有變化，只要用戶點擊“後退”按鈕，再點擊“前進”按鈕，其原有資源仍然能夠被連接。不過，用戶可以通過按“_”鍵來清空他們的認証訊息。

同時請注意，由於微軟的 IIS 伺服器的一些限制，該功能對 IIS 和 PHP 的 CGI 版本不適用。

註: 如果安全模式被啟動，腳本的 UID 會被加到 WWW-Authenticate 表頭訊息的 realm 部分。

上一頁 | 首頁 | 下一頁
特點 | 上一層 | Cookies


Cookies

PHP 手冊
上一頁 下一頁

章 17. Cookies

PHP 完全地支援 HTTP Cookies。Cookie 是一種在遠程瀏覽器端儲存資料並以此來跟蹤和識別用戶的機制。您可以使用 setcookie() 函式來設置 Cookie。Cookie 是 HTTP 頭的一部分，因此 setcookie() 函式必須在其它訊息被輸出到瀏覽器前呼叫，這和對 header() 函式的限制是類似的。您可以使用輸出緩衝函式來延遲腳本的輸出，直到按照您的需要設置好了所有的 cookies 或者其它 HTTP 表頭訊息。

任何從客戶端發送給您的 cookies 將會像 GET 和 POST 資料一樣被自動的轉換為 PHP 變數，該過程受 register_globals 和 variables_order 兩個設置變數的影響。如果您希望對一個 cookie 變數設置多個值，則需在 cookie 的名稱後加 [] 符號。

在 PHP 4.1.0 及更高版本，自動全域變數陣列 $_COOKIE 將總是包含所有總客戶端發來的 cookies 資料。在老版本的 PHP 中，當 track_vars 設置變數打開時，系統為 cookies 設置的陣列變數是 $HTTP_COOKIE_VARS。

關於更多細節以及有關瀏覽器問題的注意事項，請參閱 setcookie() 函式。

上一頁 | 首頁 | 下一頁
用 PHP 進行 HTTP 認証 | 上一層 | 文件上傳處理


文件上傳處理

PHP 手冊
上一頁 下一頁

章 18. 文件上傳處理

目錄
POST 方法上傳
關於錯誤訊息的解釋
一些注意事項
上傳多個文件
對 PUT 方法的支援

POST 方法上傳

PHP 能夠接受任何來自符合 RFC-1867 標準的瀏覽器（包括 Netscape Navigator 3 及更高版本，Microsoft Internet Explorer 3 加微軟補丁，或者更高版本）上傳的文件。PHP 的這種特性使得我們既可以上傳文本文件，也可以上傳二進制文件。利用 PHP 的認証和文件操作函式，您就可以控制誰有上傳的權限，以及在文件上傳後進行哪些處理。

相關的設置: 請參閱 php.ini 的 file_uploads、 upload_max_filesize、upload_tmp_dir 以及 post_max_size 設置選項。

請注意 PHP 也支援 PUT 方法的文件上傳，Netscape Composer 和 W3C 的 Amaya 客戶端使用這種方法。請參閱 PUT 方法支援以獲取更多訊息。

您可以如下建立一個特殊的表單來支援文件上傳：

例子 18-1. 文件上傳表單

<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>

該範例中的 _URL_ 應該指向一個 PHP 文件。 MAX_FILE_SIZE 隱藏字段必須在文件輸入字段之前，且其值為接受文件的最大尺寸，單位為字節。

警告

MAX_FILE_SIZE 的值只是對瀏覽器的一個建議，實際上它可以被簡單的繞過。因此不要把對瀏覽器的限制寄希望於該值。實際上，PHP 設置中的上傳文件最大值，是不會失效的。

為上傳文件定義的變數會根據 PHP 的版本及設置的不同而不同。自動全域變數 $_FILES 從 PHP 4.1.0 版本開始被支援。在這之前，從 4.0.0 版本開始，PHP 支援 $HTTP_POST_FILES 陣列。這些陣列將包含所有關於您上傳的文件的訊息，其中，我們推薦您使用 $_FILES。如果 PHP 的設置選項 register_globals 為 on，則相關的變數名將也會存在。從 PHP 4.2.0 版本開始，register_globals 的預設值被設為 off。

以上範例中 $_FILES 陣列的內容如下所示。我們假設文件上傳字段的名稱如上例所示，為 userfile。

$_FILES['userfile']['name']

客戶端機器文件的原名稱。

$_FILES['userfile']['type']

文件的 MIME 型別，需要瀏覽器提供該訊息的支援，例如“image/gif”。

$_FILES['userfile']['size']

已上傳文件的大小，單位為字節。

$_FILES['userfile']['tmp_name']

文件被上傳後在伺服端儲存的臨時文件名。

$_FILES['userfile']['error']

和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。

註: 在 PHP 4.1.0 版本以前該陣列的名稱為 $HTTP_POST_FILES，它並不像 $_FILES 一樣是自動全域變數。PHP 3 不支援 $HTTP_POST_FILES 陣列。

當 php.ini 中的 register_globals 被設置為 on 時，您可以使用更多的變數。例如，$userfile_name 等價於 $_FILES['userfile']['name']，$userfile_type 等價於 $_FILES['userfile']['type'] 等。請記住從 PHP 4.2.0 開始，register_globals 的預設值為 off，因此我們建議您不要依賴於改設置項而使用剛剛提到的那些附加變數。

文件被上傳後，預定地會被儲存到伺服端的預定臨時目錄中，除非您將 php.ini 中的 upload_tmp_dir 設置為了其它的路徑。伺服端的預定臨時目錄可以通過更改 PHP 執行環境的環境變數 TMPDIR 來重新設置，但是在 PHP 腳本內部通過執行 putenv() 函式來設置是不起作用的。該環境變數也可以用來確認其它的操作也是在上傳的文件上進行的。

例子 18-2. 使文件上傳生效

以下例程適用於 PHP 4.0.2 以上版本。請參閱函式 is_uploaded_file() 和 move_uploaded_file()。

<?php
// In PHP earlier then 4.1.0, $HTTP_POST_FILES  should be used instead of $_FILES.
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    copy($_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
} else {
    echo "Possible file upload attack. Filename: " . $_FILES['userfile']['name'];
}
/* ...or... */
move_uploaded_file($_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
?>

接受上傳文件的 PHP 腳本必須在文件上傳後進行判斷，來決定接下來要對該文件進行那些操作。例如，您可以通過 $_FILES['userfile']['size'] 變數來忽略尺寸太大或太小的文件，也可以通過 $_FILES['userfile']['type'] 變數來過濾文件型別和某種標準不相符合的文件。在 PHP 4.2.0 以上版本，您還可以通過 $_FILES['userfile']['error'] 變數來根據不同的錯誤代碼來做相關的判斷。不管做何種的判斷，您必須將該文件從臨時目錄中刪除，要麼將其移動到其它的地方。

如果該文件沒有被移動到其它地方也沒有被改名，則該文件將在表單請求結束時被刪除。

上一頁 | 首頁 | 下一頁
Cookies | 上一層 | 關於錯誤訊息的解釋


使用遠程文件

PHP 手冊
上一頁 下一頁

章 19. 使用遠程文件

只要在 php.ini 文件中啟動了 allow_url_fopen 選項，您可以在大多數需要用文件名作為參數的函式中使用 HTTP 和 FTP URL 來代替文件名。同時，您也可以在 include()、include_once()、require() 及 require_once() 語句中使用 URL。PHP 所支援協議的更多訊息參見 附錄 I。

註: 要在 PHP 4.0.3 及其以後版本中使用 URL，您需要用 --enable-url-fopen-wrapper 參數來配置 PHP。

註: Windows 版本的 PHP 4.3 版之前不支援以下函式的遠程連接：include()，include_once()，require()，require_once() 以及 參考 XLI, Image functions 擴展庫中的 imagecreatefromXXX 函式。

例如，您可以用以下範例來打開遠程 WEB 伺服器上的文件，解析您需要的輸出資料，然後將這些資料用在資料庫的檢索中，或者簡單地將其輸出到您網站剩下內容的樣式匹配中。

例子 19-1. 獲取遠程文件的標題

<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
    echo "<p>Unable to open remote file.\n";
    exit;
}
while (!feof ($file)) {
    $line = fgets ($file, 1024);
    /* This only works if the title and its tags are on one line */
    if (eregi ("<title>(.*)</title>", $line, $out)) {
        $title = $out[1];
        break;
    }
}
fclose($file);
?>

如果您用有合法的連接權限，以一個用戶的身份和某 FTP 伺服器建立了鏈接，您還可以向該 FTP 伺服器端的文件進行寫操作。您僅能用該方法來創建新的文件；如果您嘗試覆蓋已經存在的文件，fopen() 函式的呼叫將會失敗。

要以“anonymous”以外的用戶名連接伺服器，您需要指明用戶名（甚至密碼），例如“ftp://user:password@ftp.example.com/path/to/file”。（如果通過 HTTP 協議連接遠程文件時需要基本身份認証，您也可以用使用的語法。）

例子 19-2. 遠程伺服端的資料存儲

<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
    echo "<p>Unable to open remote file for writing.\n";
    exit;
}
/* Write the data here. */
fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>

註: 您或許可以從以上範例中得到啟發，用該技術來存儲遠程日志文件。但是正如以上提到的，在用 fopen() 方式打開的 URL 中，您僅能對新文件進行寫操作。如果遠程文件已經存在 fopen() 函式的操作將會失敗。要進行類似的分布式日志操作，您可以參考 syslog() 函式。

上一頁 | 首頁 | 下一頁
對 PUT 方法的支援 | 上一層 | 連接處理


連接處理

PHP 手冊
上一頁 下一頁

章 20. 連接處理

註: 以下內容對 PHP 3.0.7 及更高版本適用。

在 PHP 內部，系統維護著連接狀態，其狀態有三種可能的情況：

  • 0 - NORMAL（正常）

  • 1 - ABORTED（退出）

  • 2 - TIMEOUT（超時）

當 PHP 腳本正常地執行 NORMAL 狀態時，連接為有效。當遠程客戶端中斷連接時，ABORTED 狀態的標記將會被打開。遠程客戶端連接的中斷通常是由用戶點擊 STOP 按鈕導致的。當連接時間超過 PHP 的時限（請參閱 set_time_limit() 函式）時，TIMEOUT 狀態的標記將被打開。

您可以決定您的腳本是否需要在客戶端中斷連接時退出。有時候讓您的腳本完整的執行會帶來很多方便，即時沒有遠程瀏覽器接受腳本的輸出。預定的情況是當遠程客戶端連接中斷時腳本將會退出。該處理過程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 設置中對應的“php_value ignore_user_abort”以及 ignore_user_abort() 函式來控制。如果您沒有告訴 PHP 忽略用戶的中斷，您的腳本將會被中斷，除非您通過 register_shutdown_function() 設置了關閉觸發函式。通過該關閉出發函式，當遠程用戶點擊 STOP 按鈕後，您的腳本再次嘗試輸出資料時，PHP 將會檢測到連接已被中斷，並呼叫關閉觸發函式。

您的腳本也有可能被內置的腳本計時器中斷。預設為超時限制為 30 秒。這個值可以通過設置 php.ini 的 max_execution_time 或 Apache .conf 設置中對應的“php_value max_execution_time”參數或者 set_time_limit() 函式來更改。當計數器超時候，腳本將會類似於以上連接中斷的情況退出，先前被註冊過的關閉觸發函式也將在這時被執行。在該關閉觸發函式中，您可以通過呼叫 connection_timeout() 函式來檢查超時是否導致關閉觸發函式被呼叫。如果超時導致了關閉觸發函式的呼叫，該函式將傳回 TRUE。

需要注意的一點是 ABORTED 和 TIMEOUT 狀態可以同時有效。這在你告訴 PHP 忽略用戶的退出操作時是可能的。PHP 將仍然注意用戶已經中斷了連接但腳本仍然在執行的情況。如果到了執行的時間限制，腳本將被退出，設置過的關閉觸發函式也將被執行。在這時您會發現函式 connection_timeout() 和 connection_aborted() 都傳回 TRUE。您也可以通過執行 connection_status() 函式來同時檢查這兩種狀態。該函式將傳回被啟動的狀態的二進制位碼。例如，如果這兩種狀態都被啟動，則函式將傳回 3。

上一頁 | 首頁 | 下一頁
使用遠程文件 | 上一層 | 資料庫永久連接


資料庫永久連接

PHP 手冊
上一頁 下一頁

章 21. 資料庫永久連接

永久的資料庫連接是指在您的腳本結束執行時不關閉的 SQL 連接。當收到一個永久連接的請求時。PHP 將檢查是否已經存在一個（前面已經開啟的）相同的永久連接。如果存在，將直接使用這個連接；如果不存在，則建立一個新的連接。所謂“相同”的連接是指用相同的用戶名和密碼到相同主機的連接。

註: 另外，還有一些其它的擴展庫也支援永久連接，例如 IMAP 擴展庫。

對 WEB 伺服器的工作和分布負載沒有完全理解的讀者可能會錯誤地理解永久連接的作用。特別的，永久連接不會在相同的 SQL 連接上為您提供建立“用戶會話”的能力，也不提供有效建立事務的能力。實際上，從嚴格意義上來講，永久連接不會給您提供任何非永久連接無法提供的特殊功能。

為什麼？

這和 WEB 伺服器工作的方式有關。您的 WEB 伺服器可以用三種方法來利用 PHP 產生 WEB 頁面。

第一種方法是將 PHP 用作一個“外殼”。以這種方法執行，PHP 會為向您的 WEB 伺服器提出的每個 PHP 頁面請求產生並結束一個 PHP 解釋器線程。由於該線程會隨每個請求的結束而結束，因此任何在這個線程中利用的任何資源（例如指向 SQL 資料庫伺服器的連接）都會隨線程的結束而關閉。在這種情況下，您使用永久連接不會獲得任何地改變──因為它們根本不是永久的。

第二，也是最常用的方法，是把 PHP 用作多過程 WEB 伺服器的一個模塊，這種方法目前只適用於 Apache。對於一個多過程的伺服器，其典型特征是有一個父過程和一組子過程協調執行，其中實際產生 WEB 頁面的是子過程。當客戶端向父過程提出請求時，該請求會被傳遞給還沒有被其它的客戶端請求占用的子過程。這也就是說當相同的客戶端第二次向伺服端提出請求時，它將有可能被一個不同的子過程來處理。在這種情況下，永久連接使得每個子過程需要做的只是利用上一個頁面請求時建立的連接。也就是說，當另一個頁面向 SQL 資料庫提出連接請求時，它可以使用處理該請求的子過程先前建立的連接。

最後一種方法是將 PHP 用作多線程 WEB 伺服器的一個插件。目前 PHP 4 已經支援 ISAPI、WSAPI 和 NSAPI（在 Windows 環境下），這些使得 PHP 可以被用作諸如 Netscape FastTrack (iPlanet)、Microsoft's Internet Information Server (IIS) 和 O'Reilly's WebSite Pro 等多線程 WEB 伺服器的插件。永久連接的行為和前面所描述的多過程模型在本質上是相同的。注意 PHP 3 不支援 SAPI。

如果永久連接並沒有任何附加的功能，那麼我們使用它有什麼好處？

答案非常簡單──效率。當客戶端對您的 SQL 伺服器的連接請求非常頻繁時，永久連接將更加高效。連接請求頻繁的標準取決於很多因素。例如，資料庫的種類，資料庫服務和 WEB 服務是否在同一台伺服器上，SQL 伺服器如何加載負載等。但我們至少知道，當連接請求很頻繁時，永久連接將顯著的提高效率。它使得每個子過程在其生命周期中只做一次連接操作，而非每次在處理一個頁面時都要向 SQL 伺服器提出連接請求。這也就是說，每個子過程將對伺服器建立各自獨立的永久連接。例如，如果您有 20 個不同的子過程執行某腳本建立了永久的 SQL 伺服器永久連接，那麼實際上您向該 SQL 伺服器建立了 20 個不同的永久連接，每個過程占有一個。

注意，如果永久連接的子過程數目超過了您設定的資料庫連接數限制，系統將會產生一些缺陷。如果您的資料庫的同時連接數限制為 16，而在繁忙會話的情況下，有 17 個線程試圖連接，那麼有一個線程將無法連接。如果這個時候，在您的腳本中出現了使得連接無法關閉的錯誤（例如無限循環），則該資料庫的 32 個連接將迅速的受到影響。請查閱您使用的資料庫的文檔，以獲取關於如何處理已放棄的及閒置的連接的方法。

警告

在使用永久連接時還有一些特別的問題需要注意。例如在永久連接中使用資料表鎖時，如果腳本不管什麼原因無法釋放該資料表鎖，其隨後使用相同連接的腳本將會被永久的阻塞，使得您需要重新啟動 httpd 服務或者資料庫服務。另外，在使用事務處理時，如果腳本在事務阻塞產生前結束，則該阻塞也會影響到使用相同連接的下一個腳本。不管在什麼情況下，您都可以通過使用 register_shutdown_function() 函式來註冊一個簡單的清理函式來打開資料表鎖，或者滾回事務。或者更好的處理方法，是不在使用資料表鎖或者事務處理的腳本中使用永久連接，這可以從根本上解決這個問題（當然您也可以在其它地方使用永久連接）。

以下是一點重要的總結。永久連接是為通常連接建立一對一的分布而設計的。這意味著您必須能夠保証在將永久連接替換為非永久連接時，您腳本的行為不會改變。使用永久連接將（非常）有可能改變您腳本的效率，但不改變其行為！

請參閱 fbsql_pconnect(),
ibase_pconnect(), ifx_pconnect(),
imap_popen(), ingres_pconnect(),
msql_pconnect(), mssql_pconnect(),
mysql_pconnect(), OCIPLogon(),
odbc_pconnect(), Ora_pLogon(),
pfsockopen(), pg_pconnect() 及
sybase_pconnect().

上一頁 | 首頁 | 下一頁
連接處理 | 上一層 | 安全模式


安全模式

PHP 手冊
上一頁 下一頁

章 22. 安全模式

目錄
保安措施和安全模式
被安全模式限制或屏蔽的函式

PHP 的安全模式是為了試圖解決共享伺服器（shared-server）安全問題而設立的。在結構上，試圖在 PHP 層上解決這個問題是不合理的，但修改 WEB 伺服器層和操作系統層顯得非常不現實。因此許多人，特別是 ISP，目前使用安全模式。

保安措施和安全模式

表格 22-1. 保安措施和安全模式配置指令

名稱 | 預設值 | 作用範圍
safe_mode | "0" | PHP_INI_SYSTEM
safe_mode_gid | "0" | PHP_INI_SYSTEM
safe_mode_include_dir | NULL | PHP_INI_SYSTEM
safe_mode_exec_dir | "" | PHP_INI_SYSTEM
safe_mode_allowed_env_vars | PHP_ | PHP_INI_SYSTEM
safe_mode_protected_env_vars | LD_LIBRARY_PATH | PHP_INI_SYSTEM
open_basedir | NULL | PHP_INI_SYSTEM
disable_functions | "" | PHP_INI_SYSTEM
PHP_INI_* 常數的進一步詳細說明與定義見 ini_set()。

這裡是配置指令的一些簡短解釋。

safe_mode boolean

是否啟用 PHP 的安全模式。更多訊息請閱讀安全一章。

safe_mode_gid boolean

預定情況下，安全模式在打開文件時會做 UID 比較檢查。如果你想將其放寬到 GID 比較，則打開 safe_mode_gid。是否在文件連接時使用 UID（FALSE）或者 GID（TRUE）來做檢查。

safe_mode_include_dir string

當從此目錄及其子目錄（目錄必須在 include_path 中或者用完整路徑來包含）包含文件時越過 UID/GID 檢查。

從 PHP 4.2.0 開始，本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑，而不只是一個目錄。

safe_mode_exec_dir string

如果 PHP 使用了安全模式，system() 和其它執行系統程序的函式將拒絕啟動不在此目錄中的程序。

safe_mode_allowed_env_vars string

設置某些環境變數可能是潛在的安全缺口。本指令包含有一個逗號分隔的前綴列表。在安全模式下，用戶只能改變那些名字具有在這裡提供的前綴的環境變數。預定情況下，用戶只能設置以 PHP_ 開頭的環境變數（例如 PHP_FOO = BAR）。

註: 如果本指令為空，PHP 將使用戶可以修改任何環境變數！

safe_mode_protected_env_vars string

本指令包含有一個逗號分隔的環境變數的列表，最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。

open_basedir string

將 PHP 所能打開的文件限制在指定的目錄樹。本指令不受安全模式打開或者關閉的影響。

當一個腳本試圖用例如 fopen 或者 gzopen 打開一個文件時，該文件的位置將被檢查。當文件在指定的目錄樹之外時 PHP 將拒絕打開它。所有的符號連接都會被解析，所以不可能通過符號連接來避開此限制。

特殊值 . 指定了存放該腳本的目錄將被當做基准目錄。

在 Windows 中，用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為 Apache 模塊時，父目錄中的 open_basedir 路徑自動被繼承。

用 open_basedir 指定的限制實際上是前綴，不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許連接 "/dir/include" 和 "/dir/incls"，如果它們存在的話。如果要將連接限制在僅為指定的目錄，用斜線結束路徑名。例如："open_basedir = /dir/incl/"。

註: 支援多個目錄是 3.0.7 加入的。

預定是允許打開所有文件。

disable_functions string

本指令允許你基於安全原因禁止某些函式。接受逗號分隔的函式名列表作為參數。 disable_functions 不受安全模式的影響。

本指令只能設置在 php.ini 中。例如你不能將其設置在 httpd.conf。

參見 register_globals，display_errors 和 log_errors。

當 safe_mode 設置為 on，PHP 將檢查當前腳本的擁有者是否和將被文件函式操作的文件的擁有者相匹配。例如：
-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd
執行 script.php
<?php
 readfile('/etc/passwd');
?>
如果安全模式被啟動，則將會導致以下錯誤：
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

同時，或許會存在這樣的環境，在該環境下，寬松的 GID 檢查已經足夠，但嚴格的 UID 檢查反而是不適合的。您可以用 safe_mode_gid 選項來控制這種檢查。如果設置為 On 則進行寬松的 GID 檢查；設置為 Off（預設值）則進行 UID 檢查。

除了 safe_mode 以外，如果您設置了 open_basedir 選項，則所有的文件操作將被限制在您指定的目錄下。例如：
<Directory /docroot>
  php_admin_value open_basedir /docroot
</Directory>
如果您在設置了 open_basedir 選項後執行同樣的 script.php，則其結果會是：
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2

您也可以單獨地屏蔽某些函式。請注意 disable_functions 選項不能在 php.ini 文件外部使用，也就是說您無法在 httpd.conf 文件的按不同虛擬主機或不同目錄的方式來屏蔽函式。 如果我們將如下內容加入到 php.ini 文件：
disable_functions readfile,system
則我們會得到如下的輸出：
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2

上一頁 | 首頁 | 下一頁
資料庫永久連接 | 上一層 | 被安全模式限制或屏蔽的函式


PHP 的命令行模式

PHP 手冊
上一頁 下一頁

章 23. PHP 的命令行模式

從版本 4.3 開始，PHP 提供了一種新型別的 SAPI（Server Application Programming Interface，伺服端應用編程端口）支援，名為 CLI，意為 Command Line Interface，即命令行接口。顧名思義，該 SAPI 模塊主要用作 PHP 的開發外殼應用。CLI SAPI 和其它 SAPI 模塊相比有很多的不同之處，我們將在本章中詳細闡述。

CLI SAPI 最先是隨 PHP 4.2.0 版本發布的，但仍舊只是一個實驗性的版本，並需要在執行 ./configure 時加上 --enable-cli 參數。從 PHP 4.3.0 版本開始，CLI SAPI 成為了正式模塊，也因此將被永久地編譯並安裝為 PHP 二進制文件（即 Windows 下的 php.exe 文件）。

以下為 CLI SAPI 和其它 SAPI 模塊相比的顯著區別：

  • 與 CGI SAPI 不同，其輸出沒有任何表頭訊息。

    儘管 CGI SAPI 提供了取消 HTTP 表頭訊息的方法，但在 CLI SAPI 中並不存在類似的方法以開啟 HTTP 表頭訊息的輸出。

    CLI 預定以安靜模式開始，但為了保証相容性， -q 參數使得您可以使用舊的 CGI 腳本。

    在執行時，不會把工作目錄改為腳本的當前目錄。（您可以使用 -C 參數來相容 CGI 模式）。

    出錯時輸出純文字的錯誤訊息（非 HTML 格式）。

  • CLI SAPI 強制更改了 php.ini 中的某些設置，因為這些設置在外殼環境下是沒有意義的。

    表格 23-1. 被更改的 php.ini 設置選項

    設置選項 | CLI SAPI 預設值 | 備注
    html_errors | FALSE | 無意義的 HTML 標記符會使得出錯訊息很凌亂，所以在外殼下閱讀報錯訊息是十分困難的。因此將該選項的預設值改為 FALSE。
    implicit_flush | TRUE | 在命令行模式下，所有來自 print() 和 echo() 的輸出將被立即寫到輸出端，而不作任何地緩衝操作。如果您希望延緩或控制標準輸出，您仍然可以使用 output buffering 設置項。
    max_execution_time | 0 （無限值） | 鑒於在外殼環境下使用 PHP 的無窮的可能性，最大執行時間被設置為了無限值。為 WEB 開發的應用程序可能只需執行幾秒鐘時間，而外殼應用程序的執行時間可能會長的多。
    register_argc_argv | TRUE | 在使用 CLI SAPI 時，PHP 的全域變數 $argc（傳送給應用程序的參數的個數）及 $argv（實際參數的陣列）將總是有效並被賦於對應的值。

    註: 這些設置無法在設置文件 php.ini 或任何指定的其它文件中被初始化為其它值。這些預設值被限制在所有其它的設置文件被解析後改變。不過，它們的值可以在程序執行的過程中被改變（儘管對於該執行過程來說，這些設置項是沒有意義的）。

  • 為了減輕外殼環境下的工作，我們定義了如下常數：

    表格 23-2. CLI 專用常數

    常數名稱 描 述
    STDIN 一個已打開的指向 stdin 的流。您可以用如下方法來呼叫：
    $stdin = fopen('php://stdin', 'r');
    STDOUT 一個已打開的指向 stdout 的流。您可以用如下方式來呼叫：
    $stdout = fopen('php://stdout', 'w');
    STDERR 一個已打開的指向 stdout 的流。您可以用如下方式來呼叫：
    $stderr = fopen('php://stderr', 'w');

    有了以上常數，您就無需自己建立指向諸如 stderr 的流，只需簡單的使用這些常數來代替流指向：
    php -r 'fwrite(STDERR, "stderr\n");'
    您無需自己來關閉這些流，PHP 會自動完成這些操作。

  • CLI SAPI 不會將當前目錄改為已執行的腳本所在的目錄。

    以下範例顯示了本模塊與 CGI SAPI 模塊之間的不同：
    <?php
    /* Our simple test application */
    echo getcwd(), "\n";
?>

    在使用 CGI 版本時，其輸出為
    $ pwd
/tmp

$ php-cgi -f another_directory/test.php
/tmp/another_directory

    我們明顯可以看到 PHP 將當前目錄改成了剛剛執行過的腳本所在的目錄。

    使用 CLI SAPI 模式，我們得到：
    $ pwd
/tmp

$ php -f another_directory/test.php
/tmp
    這使得我們在利用 PHP 編寫外殼工具時獲得了很大的便利。

    註: 您可以在命令行執行時給 CGI SAPI 加上 -C 參數，使其支援 CLI SAPI 的功能。

以下是 PHP 二進制文件（即 php.exe 程序）提供的命令行模式的選項參數，您隨時可以通過 PHP -h 命令來查詢這些參數。
Usage: php [options] [-f] <file> [args...]
       php [options] -r <code> [args...]
       php [options] [-- args...]
  -s               Display colour syntax highlighted source.
  -w               Display source with stripped comments and whitespace.
  -f <file>        Parse <file>.
  -v               Version number
  -c <path>|<file> Look for php.ini file in this directory
  -a               Run interactively
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -z <file>        Load Zend extension <file>.
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -i               PHP information
  -r <code>        Run PHP <code> without using script tags <?..?>
  -h               This help

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

CLI SAPI 模塊有以下三種不同的方法來獲取您要執行的 PHP 代碼：

  1. 讓 PHP 執行指定文件。

    php my_script.php

php -f my_script.php

    以上兩種方法（使用或不使用 -f 參數）都能夠執行給定的 my_script.php 文件。您可以選擇任何文件來執行，您指定的 PHP 腳本並非必須要以 .php 為擴展名，它們可以有任意的文件名和擴展名。

  2. 在命令行直接執行 PHP 代碼。

    php -r 'print_r(get_defined_constants());'

    在使用這種方法時，請您注意外殼變數的替代及引號的使用。

    註: 請仔細閱讀以上範例，在執行代碼時沒有開始和結束的標記符！加上 -r 參數後，這些標記符是不需要的，加上它們會導致語法錯誤。

  3. 通過標準輸入（stdin）提供需要執行的 PHP 代碼。

    以上用法給我們提供了非常強大的功能，使得我們可以如下範例所示，動態地產生 PHP 代碼並通過命令行執行這些代碼：
    $ some_application | some_filter | php | sort -u >final_output.txt

以上三種執行代碼的方法不能同時使用。

和所有的外殼應用程序一樣，PHP 的二進制文件（php.exe 文件）及其執行的 PHP 腳本能夠接受一系列的參數。PHP 沒有限制傳送給腳本程序的參數的個數（外殼程序對命令行的字元數有限制，但您通常都不會超過該限制）。傳遞給您腳本的參數可在全域變數 $argv 中獲取。該陣列中下標為零的成員為腳本的名稱（當 PHP 代碼來自標準輸入獲直接用 -r 參數以命令行方式執行時，該名稱為“-”）。另外，全域變數 $argc 存有 $argv 陣列中成員變數的個數（而非傳送給腳本程序的參數的個數）。

只要您傳送給您腳本的參數不是以 - 符號開頭，您就無需過多的注意什麼。向您的腳本傳送以 - 開頭的參數會導致錯誤，因為 PHP 會認為應該由它自身來處理這些參數。您可以用參數列表分隔符 -- 來解決這個問題。在 PHP 解析完參數後，該符號後所有的參數將會被原樣傳送給您的腳本程序。

# 以下命令將不會執行 PHP 代碼，而只顯示 PHP 命令行模式的使用說明：
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# 以下命令將會把“-h”參數傳送給腳本程序，PHP 不會顯示命令行模式的使用說明：
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

除此之外，我們還有另一個方法將 PHP 用於外殼腳本。您可以在寫一個腳本，並在第一行以 #!/usr/bin/php 開頭，在其後加上以 PHP 開始和結尾標記符包含的正常的 PHP 代碼，然後為該文件設置正確的執行屬性。該方法可以使得該文件能夠像外殼腳本或 PERL 腳本一樣被直接執行。
#!/usr/bin/php
<?php
    var_dump($argv);
?>

假設改文件名為 test 並被放置在當前目錄下，我們可以做如下操作：
$ chmod 755 test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

正如您所看到的，在您向該腳本傳送以 - 開頭的參數時，腳本仍然能夠正常執行。

表格 23-3. 命令行選項

選項名稱 | 描 述
-s

顯示有語法高亮色彩的源文件。

該參數使用內建機制來解析文件並為其產生一個 HTML 高亮版本並將結果寫到標準輸出。請注意該過程所做的只是產生了一個 <code> [...] </code> 的 HTML 標記符塊，並不包含任何的 HTML 頭。

註: 該選項不能和 -r 參數同時使用。

-w

顯示除去了註釋和空格的原始碼。

註: 該選項不能和 -r 參數同時使用。

-f

解析並執行給定的文件名。該參數為可選參數且可以不加，僅指明需要執行的文件名即可。

-v

將 PHP、PHP SAPI 及 Zend 的版本訊息寫入的標準輸出。例如：
$ php -v
PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies

-c

用該參數，您可以指定一個放置 php.ini 文件的目錄，或者直接指定一個自定義的 INI 文件，其文件名可以不是 php.ini。例如：
$ php -c /custom/directory/ my_script.php

$ php -c /custom/directory/custom-file.ini my_script.php

-a

交互地執行 PHP。

-d

用該參數可以自行設置 php.ini 文件中設置變數的值，其語法為：
-d configuration_directive[=value]

範例：
# Ommiting the value part will set the given configuration directive to "1"
$ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"

# Passing an empty value part will set the configuration directive to ""
php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""

# The configuration directive will be set to anything passed after the '=' character
$  php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$  php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"

-e

為調試器等產生擴展訊息。

-z

加載 Zend 擴展庫。如果僅給定一個文件名，PHP 將試圖從您系統擴展庫的預定路徑（在 Linux 系統下，該路徑通常由 /etc/ld.so.conf 指定）加載該擴展庫。如果您用一個絕對路徑指定文件名，則系統的擴展庫預定路徑將不會被使用。如果用相對路徑指定的文件名，PHP 則僅試圖加載相對於當前目錄的擴展庫。

-l

該參數提供了對指定 PHP 代碼進行語法檢查的方便的方法。如果成功，則向標準輸出寫入 No syntax errors detected in <filename> 字串，並且外殼傳回值為 0。如果失敗，則 Errors parsing <filename> 以及內部解析器錯誤訊息會一起被寫入到標準輸出，同時外殼傳回值將別設置為 255。

該參數將無法檢查致命錯誤（如未定義函式），如果您希望檢測之名錯誤，請使用 -f 參數。

註: 該參數不能和 -r 一同使用。

-m

使用該參數，PHP 將顯示出內置以及已加載的 PHP 及 Zend 模塊：
$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype

[Zend Modules]

-i | 該命令行參數會呼叫 phpinfo() 函式，並顯示出結果。如果 PHP 沒有正常工作，我們建議您執行 php -i 命令來查看在訊息表格之前或者對應的地方是否有任何錯誤訊息輸出。請注意輸出的內容為 HTML 格式，因此輸出的訊息篇幅較大。
-r

使用該參數可以在命令行執行 PHP 代碼。您無需加上 PHP 的起始和結束標籤（<?php 和 ?>），否則將會導致語法解析錯誤。

註: 使用這種形式的 PHP 時，應個別注意避免和外殼環境進行的命令行參數替換相衝突。

顯示語法解析錯誤的範例
$ php -r "$foo = get_defined_constants();"
Command line code(1) : Parse error - parse error, unexpected '='

這裡的問題在於即時使用了雙引號 "，sh/bash 仍然實行了參數替換。由於 $foo 沒有被定義，被替換後它所在的位置變成了空字元，因此在執行時，實際被 PHP 讀取的代碼為：
$ php -r " = get_defined_constants();"

正確的方法是使用單引號 '。在用單引號引用的字串中，變數不會被 sh/bash 還原成其原值。
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
  ["E_ERROR"]=>
  int(1)
  ["E_WARNING"]=>
  int(2)
  ["E_PARSE"]=>
  int(4)
  ["E_NOTICE"]=>
  int(8)
  ["E_CORE_ERROR"]=>
  [...]

如果您使用的外殼不是 sh/bash，您可能會碰到其它的問題。請報告您碰到的 bug，或者發郵件到 phpdoc@lists.php.net。

當您試圖將外殼的環境變數引入到馬或者用反斜線來轉義字元時也可能碰到各種各樣的問題，請您在使用時注意！

-h | 使用該參數，您可以得到完整的命令行參數的列表及這些參數作用的簡單描述。

PHP 的命令行模式能使得 PHP 腳本能完全獨立於 WEB 伺服器單獨執行。如果您使用 Unix 系統，您需要在您的 PHP 腳本的最前面加上一行特殊的代碼，使得它能夠被執行，這樣系統就能知道用什麼樣的程序要執行該腳本。在 Windows 平台下您可以將 php.exe 和 .php 文件的雙擊屬性相關聯，您也可以編寫一個批處理文件來用 PHP 執行腳本。為 Unix 系統增加的第一行代碼不會影響該腳本在 Windows 下的執行，因此您也可以用該方法編寫跨平台的腳本程序。以下是一個簡單的PHP 命令行程序的範例。

例子 23-1. 試圖以命令行方式執行的 PHP 腳本（script.php）

#!/usr/bin/php
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

This is a command line PHP script with one option.

  Usage:
  <?php echo $argv[0]; ?> <option>

  <option> can be some word you would like
  to print out. With the --help, -help, -h,
  or -? options, you can get this help.

<?php
} else {
    echo $argv[1];
}
?>

在以上腳本中，我們用第一行特殊的代碼來指明該文件應該由 PHP 來執行。我們在這裡使用 CLI 的版本，因此不會有 HTTP 表頭訊息輸出。在您用 PHP 編寫命令行應用程序時，您可以使用兩個參數：$argc 和 $argv。前面一個的值是比參數個數大 1 的整數（執行的腳本本身的名稱也被當作一個參數）。第二個時包含有參數的陣列，其第一個元素為腳本的名稱，下標為數字 0（$argv[0]）。

在以上程序中我們檢查了參數的個數是大於 1 個還是小於 1 個。即時參數是 --help、-help、-h 或 -?，我們仍然顯示出幫助訊息，並同時動態輸出腳本的名稱。如果還收到了其它參數，我們也把它們顯示出來。

如果您希望在 Unix 下執行以上腳本，您需要使得它成為可執行腳本，然後簡單的執行 script.php echothis 或 script.php -h。在 Windows 下，您可以為此編寫一個批處理文件：

例子 23-2. 執行 PHP 命令行腳本的批處理文件（script.bat）

@c:\php\php.exe script.php %1 %2 %3 %4

假設您將上述程序命名為 script.php，且您的 php.exe 文件放置在 c:\php\php.exe，該批處理文件會幫助您將附加的參數傳給腳本程序： script.bat echothis 或 script.bat -h。

請參閱 Readline 擴展模塊的有關文檔，以獲取更多的函式的訊息。這些函式可以幫助您完善您的 PHP 命令行應用程序。

上一頁 | 首頁 | 下一頁
被安全模式限制或屏蔽的函式 | 上一層 | 函式參考


Apache 專用函式

PHP 手冊
上一頁 下一頁

I. Apache 專用函式

介紹

這些函式僅在 PHP 作為 Apache 1.x 的模塊執行時可用。

安裝

PHP 在 Apache 1.x 下的安裝見安裝一章中的 Apache 伺服器一節。

執行時配置

Apache 的 PHP 模塊的行為受 php.ini 的設置影響。在 php.ini 中的設置可以被伺服器配置文件或本地的 .htaccess 文件所覆蓋。

例子 1. 用 .htaccess 禁用一個目錄的 PHP 解析

php_flag engine off

表格 1. Apache 配置選項

名稱 | 預設值 | 作用範圍 | 功能
engine | On | PHP_INI_ALL | 啟用或禁用 PHP 解析
child_terminate | Off | PHP_INI_ALL | 指定 PHP 腳本是否可以要求子進程在請求結束時終止，參見 apache_child_terminate()
last_modified | Off | PHP_INI_ALL | 在此請求中將 PHP 腳本的最後修改時間以表頭訊息 Last-Modified: 的形式發送
xbit_hack | Off | PHP_INI_ALL | 讓 PHP 不管文件是否結束而將文件作為可執行的比特集來解析

以下是配置指令的簡短解釋。

engine boolean

本指令只在 PHP 的 Apache 模塊版中才有用。有的網站希望根據個別目錄或者個別虛擬主機來打開或者關閉 PHP 解析。在 httpd.conf 文件中的適當位置放上 engine off 就可以啟動或者關閉 PHP。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
apache_child_terminate -- Terminate apache process after this request
apache_lookup_uri -- 為指定的URI執行部分請求並且傳回訊息有關URI的
apache_note -- Get and set apache request notes
apache_request_headers -- Fetch all HTTP request headers
apache_response_headers -- Fetch all HTTP response headers
apache_setenv -- Set an Apache subprocess_env variable
ascii2ebcdic -- Translate string from ASCII to EBCDIC
ebcdic2ascii -- Translate string from EBCDIC to ASCII
getallheaders -- Fetch all HTTP request headers
virtual -- Perform an Apache sub-request
上一頁 | 首頁 | 下一頁
函式參考 | 上一層 | apache_child_terminate


陣列函式庫

PHP 手冊
上一頁 下一頁

II. 陣列函式庫

介紹

這些函式允許你用多種方法來操作陣列和與之交互。陣列的本質是儲存，管理和操作一組變數。

PHP 支援一維和多維陣列，不論是用戶創建或由另一個函式創建。有一些特定的資料庫處理函式可以從資料庫查詢中產生陣列，還有一些函式傳回陣列。

參見手冊中的陣列一節關於 PHP 是怎樣實現和使用陣列的詳細解釋。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

這裡列出的所有常數將作為 PHP 核心的一部分一直有效。

CASE_LOWER (integer)

CASE_LOWER 用在 array_change_key_case() 中將陣列的鍵名轉換成小寫字母。這也是 array_change_key_case() 的預設值。

CASE_UPPER (integer)

CASE_UPPER 用在 array_change_key_case() 中將陣列的鍵名轉換成大寫字母。

排序順序標識：

SORT_ASC (integer)

SORT_ASC 用在 array_multisort() 函式中，使其升序排列。

SORT_DESC (integer)

SORT_DESC 用在 array_multisort() 函式中，使其降序排列。

排序型別標識：用於各種排序函式

SORT_REGULAR (integer)

SORT_REGULAR 用於對對象進行通常比較。

SORT_NUMERIC (integer)

SORT_NUMERIC 用於對對象進行數值比較。

SORT_STRING (integer)

SORT_STRING 用於對對象進行字串比較。

相關參考

參見 is_array()，explode()，implode()，split()，preg_split() 和 join()。

【譯者注】本節中出現的“結合陣列”指的是鍵名為字串的陣列，“索引”和“鍵名”指的是同一樣東西。

目錄
array_change_key_case -- 傳回字串鍵名全為小寫或大寫的陣列
array_chunk -- 將一個陣列分割成多個
array_count_values -- 統計陣列中所有的值出現的次數
array_diff -- 計算陣列的差集
array_fill -- 用給定的值填充陣列
array_filter -- 用回調函式過濾陣列中的單元
array_flip -- 反轉陣列中的鍵和值
array_intersect -- 計算陣列的交集
array_key_exists -- 檢查給定的鍵名或索引是否存在於陣列中
array_keys -- 傳回陣列中所有的鍵名
array_map -- 將回調函式作用到給定陣列的單元上
array_merge_recursive -- 遞歸地合並兩個或多個陣列
array_merge -- 合並兩個或多個陣列
array_multisort -- 對多個陣列或多維陣列進行排序
array_pad -- 用值將陣列填補到指定長度
array_pop -- 將陣列最後一個單元彈出（出棧）
array_push -- 將一個或多個單元壓入陣列的末尾（入棧）
array_rand -- 從陣列中隨機取出一個或多個單元
array_reduce -- 用回調函式迭代地將陣列簡化為單一的值
array_reverse -- 傳回一個單元順序相反的陣列
array_search -- 在陣列中搜索給定的值，如果成功則傳回相應的鍵名
array_shift -- 將陣列開頭的單元移出陣列
array_slice -- 從陣列中取出一段
array_splice -- 把陣列中的一部分去掉並用其它值取代
array_sum -- 計算陣列中所有值的和
array_unique -- 移除陣列中重複的值
array_unshift -- 在陣列開頭插入一個或多個單元
array_values -- 傳回陣列中所有的值
array_walk -- 對陣列中的每個成員應用用戶函式
array -- 新建一個陣列
arsort -- 對陣列進行逆向排序並保持索引關係
asort -- 對陣列進行排序並保持索引關係
compact -- 建立一個陣列，包括變數名和它們的值
count -- 統計變數中的單元數目
current -- 傳回陣列中的當前單元
each -- 傳回陣列中當前的鍵／值對並將陣列指針向前移動一步
end -- 將陣列的內部指針指向最後一個單元
extract -- 從陣列中將變數導入到當前的符號表
in_array -- 如果陣列中存在該值則傳回 TRUE
key -- 從結合陣列中取得鍵名
krsort -- 對陣列按照鍵名逆向排序
ksort -- 對陣列按照鍵名排序
list -- 把陣列中的值賦給一些變數
natcasesort -- 用“自然排序”算法對陣列進行不區分大小寫字母的排序
natsort -- 用“自然排序”算法對陣列排序
next -- 將陣列中的內部指針向前移動一位
pos -- 得到陣列當前的單元
prev -- 將陣列的內部指針倒回一位
range -- 建立一個包含指定範圍單元的陣列
reset -- 將陣列的內部指針指向第一個單元
rsort -- 對陣列逆向排序
shuffle -- 將陣列打亂
sizeof -- 統計變數中的單元數目
sort -- 對陣列排序
uasort -- 使用用戶自定義的比較函式對陣列中的值進行排序並保持索引關聯
uksort -- 使用用戶自定義的比較函式對陣列中的鍵名進行排序
usort -- 使用用戶自定義的比較函式對陣列中的值進行排序
上一頁 | 首頁 | 下一頁
virtual | 上一層 | array_change_key_case


MySQL函式庫

mysql_affected_rows --- 取得先前操作MySQL所受到影響的列的數目

mysql_change_user --- 更改連線的使用者

mysql_close --- 關閉MySQL連線

mysql_connect --- 開啟MySQL伺服器連線

mysql_create_db --- 新增一個MySQL資料庫

mysql_data_seek --- 移動內部指標

mysql_db_query --- 送出MySQL查詢

mysql_drop_db --- 刪除MySQL資料庫

mysql_errno --- 從先前MySQL操作傳回錯誤訊息代號

mysql_error --- 從先前MySQL操作傳回錯誤訊息

mysql_fetch_array --- 取得查詢後的陣列結果

mysql_fetch_field --- 取得欄位資訊

mysql_fetch_lengths --- 取得各欄位最大長度

mysql_fetch_object --- 取得查詢後的物件結果

mysql_fetch_row --- 取得單列結果

mysql_field_flags --- 取得指定欄位的旗標

mysql_field_name --- 取得指定欄位的名稱

mysql_field_len --- 取得指定欄位的長度

mysql_field_seek --- 設定結果指標到指定的欄位偏移量

mysql_field_table --- 取得指定欄位所在的表格名稱

mysql_field_type --- 取得指定欄位的型態

mysql_free_result --- 釋放記憶體

mysql_insert_id --- 取得先前INSERT操作的id

mysql_list_dbs --- 列出MySQL伺服器上可用的資料庫

mysql_list_fields --- 列出欄位

mysql_list_tables --- 列出資料庫中的表格

mysql_num_fields --- 取得欄位的數目

mysql_num_rows --- 取得結果中列的數目

mysql_pconnect --- 開啟MySQL伺服器持續連線

mysql_query --- 送出MySQL查詢

mysql_result --- 取得結果資料

mysql_select_db --- 選擇一個資料庫

mysql_tablename --- 取得表格名稱

首頁


數學函式庫

abs --- 取絕對值

acos --- 取反餘弦值

asin --- 取反正弦值

atan --- 取反正切值

atan2 --- 取二個變數的反正切值

base_convert --- 轉換數值的進位方式

bindec --- 二進制轉十進制

ceil --- 取得大於指定數的最小整數值

cos --- 取餘弦值

decbin --- 十進制轉二進制

dechex --- 十進制轉十六進制

decoct --- 十進制轉八進制

deg2rad --- 將數值從度數轉成徑度

exp --- 取得自然對數的次方值

floor --- 取得小於指定數的最大整數值

getrandmax --- 取得最大亂數值

hexdec --- 十六進制轉十進制

log --- 自然對數

log10 --- 底為10的對數

max --- 傳回參數中最大值

min --- 傳回參數中最小值

mt_rand --- 取得亂數值

mt_srand --- 設定亂數種子

mt_getrandmax --- 取得亂數最大值

number_format --- 將數字字串格式化

octdec --- 八進制轉十進制

pi --- 取得圓週率pi的值

pow --- 傳回次方項的值

rad2deg --- 轉換徑度值為度數

rand --- 產生亂數值

round --- 取四拾五入

sin --- 取正弦值

sqrt --- 取平方根值

srand --- 設定亂數種子

tan --- 取正切值

首頁


檔案系統函式庫

basename --- 傳回不包含路徑的檔案名稱

chgrp --- 變更檔案所屬的群組

chmod --- 改變檔案的屬性

chown --- 改變檔案的擁有者

clearstatcache --- 清除檔案狀態快取

copy --- 複製檔案

delete --- 一個假的項目

dirname --- 傳回路徑的目錄名稱

diskfreespace --- 傳回目錄中可用的空間

fclose --- 關閉已開啟的檔案指標

feof --- 測試指標是否在檔案結束處

fgetc --- 取得檔案指標所指的字元

fgetcsv --- 從檔案指標取得行並且剖析CSV欄位

fgets --- 取得檔案指標所指的行

fgetss --- 取得檔案指標所指的行及去除HTML標籤

file --- 讀取檔案全部內容到陣列中

file_exists --- 檢查檔案是否存在

fileatime --- 取得檔案最後存取的時間

filectime --- 取得檔案最後更改的時間

filegroup --- 取得檔案所屬群組

fileinode --- 取得檔案inode

filemtime --- 取得檔案最後修改的時間

fileowner --- 取得檔案的擁有者

fileperms --- 取得檔案的權限

filesize --- 取得檔案的大小

filetype --- 取得檔案的類型

flock --- 檔案上鎖

fopen --- 開啟檔案或URL

fpassthru --- 輸出所有剩餘資料

fputs --- 將資料寫到檔案指標處

fread --- 以位元組方式讀檔

fscanf --- 按照格式剖析檔案

fseek --- 移動檔案指標

fstat --- 取得檔案的資訊

ftell --- 取得檔案指標讀/寫的位置

ftruncate --- 截短檔案成為給予的長度

fwrite --- 將資料寫入檔案

set_file_buffer --- 設定檔案緩衝區大小

is_dir --- 辨別檔案名稱是否是個目錄

is_executable --- 辨別檔案名稱是否是個可執行檔

is_file --- 辨別檔案名稱是否是個正規的檔案

is_link --- 辨別檔案名稱是否是個符號連結

is_readable --- 辨別檔案名稱是否是可讀的檔案

is_writeable --- 辨別檔案名稱是否是可寫入的檔案

link --- 建立堅固的連結

linkinfo --- 取得連結資訊

mkdir --- 建立目錄

pclose --- 關閉檔案指標

popen --- 開啟檔案

readfile --- 輸出檔案

readlink --- 傳回符號連結的目標

rename --- 檔案重新命名

rewind --- 重置檔案指標

rmdir --- 刪除目錄

stat --- 取得檔案的資訊

lstat --- 取得檔案的資訊

realpath --- 傳回絶對的路徑名稱

symlink --- 建立符號連結

tempnam --- 建立唯一的檔案名稱

tmpfile --- 建立臨時的檔案

touch --- 設定檔案的修改時間

umask --- 改變目前的umask

unlink --- 刪除檔案

首頁


網路函式庫

checkdnsrr --- 檢查DNS記錄

closelog --- 關閉連結到系統記錄者

debugger_off --- 關閉內部的PHP除錯

debugger_on --- 開啟內部的PHP除錯

fsockopen --- 開啟Internet或Unix網域socket連結

gethostbyaddr --- 取得主機名稱

gethostbyname --- 取得IP位址

gethostbynamel --- 取得IP位址的列表

getmxrr --- 取得MX記錄

getprotobyname --- 取得協定編號

getprotobynumber --- 取得協定名稱

getservbyname --- 取得Internet服務和協定的埠號

getservbyport --- 取得Internet服務的名稱

openlog --- 開啟連結到系統記錄者

pfsockopen --- 開啟持續的Internet或Unix網域socket連結

socket_set_blocking --- 設定socket擱置/非擱置模式

syslog --- 產生系統記錄訊息

ip2long --- 轉換 IP(IPv4)成為適當的位址

long2ip --- 轉換 IP(IPv4)成為適當的位址

首頁


圖形函式庫

GetImageSize --- 取得GIF、JPEG、PNG或SWF圖形的大小

ImageArc --- 畫弧線

ImageChar --- 畫一個水平的字元

ImageCharUp --- 畫一個垂直的字元

ImageColorAllocate --- 分配圖形的顏色

ImageColorDeAllocate --- 減少一個分配給圖形的顏色

ImageColorAt --- 取得像素的顏色索引值

ImageColorClosest --- 取得最接近指定的顏色的索引值

ImageColorExact --- 取得指定的顏色的索引值

ImageColorResolve --- 取得指定的或最接近的顏色的索引值

ImageGammaCorrect --- 請求GD圖形gamma修正

ImageColorSet --- 設定調色盤索引值的顏色

ImageColorsForIndex --- 從索引值取得顏色

ImageColorsTotal --- 找出圖形的調色盤中顏色的數目

ImageColorTransparent --- 定義透明的顏色

ImageCopy --- 複製一部份的圖形

ImageCopyResized --- 複製圖形的一部份並且調整大小

ImageCreate --- 建立一個新的圖形

ImageCreateFromGIF --- 從檔案或URL建立一個新的圖形

ImageCreateFromJPEG --- 從檔案或URL建立一個新的圖形

ImageCreateFromPNG --- 從檔案或URL建立一個新的圖形

ImageDashedLine --- 畫虛線

ImageDestroy --- 結束圖形

ImageFill --- 將圖形著色

ImageFilledPolygon --- 建立一個多邊形並且填滿顏色

ImageFilledRectangle --- 建立一個矩形並且填滿顏色

ImageFillToBorder --- 填滿到指定的顏色

ImageFontHeight --- 取得字體的高度

ImageFontWidth --- 取得字體的寬度

ImageGIF --- 輸出圖形到瀏灠器或是檔案

ImagePNG --- 輸出PNG圖形到瀏灠器或是檔案

ImageJPEG --- 輸出圖形到瀏灠器或是檔案

ImageInterlace --- 開啟或關閉交錯

ImageLine --- 畫一條線

ImageLoadFont --- 載入新的字體

ImagePolygon --- 畫一個多邊形

ImagePSBBox --- 使用PostScript Type1字體取得文字矩形的區塊座標

ImagePSEncodeFont --- 改變字元編碼向量

ImagePSFreeFont --- 釋放使用PostScript Type 1字體的記憶體

ImagePSLoadFont --- 從檔案載入PostScript Type 1字體

ImagePsExtendFont --- 延伸或縮短字體

ImagePsSlantFont --- 傾斜字體

ImagePSText --- 使用PostScript Type1字體在圖形上畫出文字字串

ImageRectangle --- 畫一個矩形

ImageSetPixel --- 設定單一像素

ImageString --- 畫出水平的字串

ImageStringUp --- 畫出垂直的字串

ImageSX --- 取得圖形的寬度

ImageSY --- 取得圖形的高度

ImageTTFBBox --- 使用TypeType字體取得文字的區塊座標

ImageTTFText --- 使用TrueType字體寫入文字到圖形中

ImageTypes --- 傳回提供的圖形格式

read_exif_data --- 從JPEG圖形檔讀取EXIF標頭

首頁


陣列函式庫

array --- 建立新陣列

array_count_values --- 計算陣列所有的值

array_diff --- 計算陣列的差異

array_flip --- 翻轉陣列所有的值

array_intersect --- 計算陣列的交點

array_keys --- 傳回陣列的所有索引值

array_merge --- 合併兩個以上的陣列

array_merge_recursive --- 以遞歸方式合併兩個以上的陣列

array_multisort --- 排序複合或多樣尺寸的陣列

array_pad --- 填塞陣列為指定的長度與值

array_pop --- 取得陣列的最後一個元素

array_push --- 增加一個或多個元素到陣列的末端之上

array_rand --- 隨機挑選陣列的一個或多個值出來

array_reverse --- 傳回顛倒元素順序的陣列

array_shift --- 取得陣列的第一個元素

array_slice --- 抽出陣列的一部份

array_splice --- 移除陣列的一部份且替代它

array_unique --- 從陣列移除相同的值

array_unshift --- 增加一個或多個元素到陣列的起始處

array_values --- 傳回陣列所有的值

array_walk --- 使自定的函式能處理陣列的每個元素

arsort --- 顛倒陣列的順序且維持索引值的關係

asort --- 將陣列排列且維持索引值的關係

compact --- 建立陣列包含變數和它們的值

count --- 計算變數中元素的數目

current --- 傳回陣列中目前的元素

each --- 從陣列傳回key/value對

end --- 設定陣列的內部指標指到最後的元素

extract --- 從陣列輸入變數到符號表格中

in_array --- 搜尋陣列中值是否存在

key --- 從陣列中取得索引值

krsort --- 依照索引值的顛倒順序將陣列排列

ksort --- 將陣列的索引值排列

list --- 列出陣列元素

next --- 向前移動陣列的內部指標

pos --- 傳回陣列中目前的元素

prev --- 向後移動陣列的內部指標

range --- 建立整數範圍的陣列

reset --- 設定陣列的內部指標到它的第一個元素

rsort --- 將陣列的值由 z-a 重排

shuffle --- 將陣列的順序弄混

sizeof --- 取得陣列中元素的數目

sort --- 將陣列的值由 a-z 重排

uasort --- 依使用者定義的函式排序且維持索引值與元素的關係

uksort --- 依使用者定義的函式將陣列的索引值排序

usort --- 依使用者定義的函式將陣列的值排序

首頁


字串函式庫

AddCSlashes --- 將指定的字元前面加上反斜線

AddSlashes --- 將字串加上反斜線

bin2hex --- 轉換二進制資料成為十六進制表示

Chop --- 移除多餘的空白

Chr --- 傳回指定的字元

chunk_split --- 將字串切成小段

convert_cyr_string --- 轉換古斯拉夫字體為另一個

count_chars --- 傳回在字串中使用的字元的資訊

crc32 --- 計算字串crc32多項式

crypt --- 使用DES將字串碥碼

echo --- 輸出字串

explode --- 切開字串

flush --- 清除輸出緩衝

get_html_translation_table --- 傳回htmlspecialchars( )和htmlentities( )使用的轉換表格

get_meta_tags --- 從檔案取出所有meta標籤內容屬性並且傳回陣列

hebrev --- 轉換希伯來語文字成為可看見的文字

hebrevc --- 轉換希伯來語文字成為可看見的文字和新行的轉換

htmlentities --- 轉換所有字元成為HTML實體

htmlspecialchars --- 轉換特殊字元成為HTML實體

implode --- 將陣列的元素連結起來成為字串

join --- 將陣列的元素連結起來成為字串

levenshtein --- 計算二字串間的Levenshtein-Distance

ltrim --- 去除字串起始處的空白

md5 --- 計算字串的MD5拼湊

Metaphone --- 計算字串的metaphone key

nl2br --- 轉換新行成為HTML的<BR>

ob_start --- 開啟輸出緩衝

ob_get_contents --- 傳回輸出緩衝的內容

ob_end_flush --- 清除輸出緩衝並且關閉輸出緩衝

ob_end_clean --- 丟棄輸出緩衝的內容並且關閉輸出緩衝

ob_implicit_flush --- 開啟或關閉固有的清除

Ord --- 傳回字元的ASCII碼

parse_str --- 剖析字串使它成為變數

print --- 輸出字串

printf --- 輸出格式化字串

quoted_printable_decode --- 轉換引用可列出字串成為8-bit字串

quotemeta --- 將特殊字元加上反斜線

rtrim --- 移除多餘的空白

sscanf --- 依照格式剖析字串

setlocale --- 設定場所資訊

similar_text --- 計算二字串間的相似度

soundex --- 計算字串的發音鍵

sprintf --- 傳回格式化字串

strcasecmp --- 不分大小寫字串比對

strchr --- 找出第一次出現的字元

strcmp --- 字串比對

strcspn --- 找出沒有比對到的最初部份的長度

strip_tags --- 去除字串中的HTML和PHP標籤

stripcslashes --- 去除addcslashes( )引用的斜線

stripslashes --- 去除addslashes( )引用的斜線

stristr --- 不分大小寫找出字串第一次出現的地方

strlen --- 取得字串長度

strnatcmp --- 使用自然順序演算法來比對字串

strnatcasecmp --- 不分大小寫的使用自然順序演算法來比對字串

strncmp --- 指定字元數目的字串比對

str_pad --- 填塞字串成為指定的長度

strpos --- 找出字串第一次出現的位置

strrchr --- 取得字元最後一次出現處到結尾的字串

str_repeat --- 重複字串

strrev --- 顛倒字串

strrpos --- 找出字元最後一次出現的位置

strspn --- 找出比對到的最初部份的長度

strstr --- 找出字串第一次出現的地方

strtok --- 切開字串

strtoupper --- 將字串轉成小寫

strtolower --- 將字串轉成大寫

str_replace --- 取代所有在字串中出現的字串

strtr --- 轉換某些字元

substr --- 取得部份字串

substr_count --- 計算字串的出現次數

substr_replace --- 取代字串的一部份字串

trim --- 去除字串開始處與結束處的空白

ucfirst --- 將字串的第一個字元大寫

ucwords --- 將字串中各個單字的第一個字元大寫

wordwrap --- 使用字串斷行字元將字串包裹成指定的字元數目

首頁


拼字檢查函式庫

aspell_new --- 載入一個新辭典

aspell_check --- 檢查一單字

aspell_check-raw --- 檢查一單字不改變它的事實或試著去修改它

aspell_suggest --- 建議單字的拼法

首頁


曆法函式庫

JDToGregorian --- 轉換凱撒日計數為格里高里曆法

GregorianToJD --- 轉換格里高里曆法為凱撒日計數

JDToJulian --- 轉換凱撒日計數為凱撒曆法

JulianToJD --- 轉換凱撒曆法為凱撒日計數

JDToJewish --- 轉換凱撒日計數為猶太曆法

JewishToJD --- 轉換猶太曆法日期為凱撒日計數

JDToFrench --- 轉換凱撒日計數為法國共和曆法

FrenchToJD --- 轉換法國共和曆法日期為凱撒日計數

JDMonthName --- 傳回月份名稱

JDDayOfWeek --- 傳回日期在當週的天數

easter_date --- 計算復活節日期

easter_days --- 計算復活節與3月21日間的天數

首頁


信號與共享記憶體函式庫

sem_get --- 取得信號 id

sem_acquire --- 獲得信號

sem_release --- 釋放信號

shm_attach --- 建立或開啟共享記憶體部分

shm_detach --- 從共享記憶體部分分離

shm_remove --- 從Unix系統移除共享記憶體

shm_put_var --- 插入或更新共享記憶體中的變數

shm_get_var --- 從共享記憶體傳回變數

shm_remove_var --- 從共享記憶體移除變數

首頁


郵件函式庫

mail --- 送發電子郵件

ezmlm_hash --- 計算雜湊值

首頁


類別和物件函式庫

get_class --- 傳回物件的類別名稱

get_parent_class --- 傳回物件的父類別名稱

get_class_methods --- 傳回類別中方法的名稱

get_class_vars --- 傳回類別預設的屬性

get_object_vars --- 傳回物件的屬性

is_subclass_of --- 判斷物件是否屬於類別的子類別

class_exists --- 檢查類別是否已經定義

method_exists --- 檢查類別的方法是否存在

get_declared_classes --- 傳回聲明的類別的名稱

call_user_method --- 在一個指定的物件上呼叫指定的方法

首頁


日期與時間函式庫

checkdate --- 有效的日期/時間

date --- 將本地的時間/日期格式化

getdate --- 取得日期/時間資訊

gettimeofday --- 取得目前的時間

gmdate --- 取得目前的時間

gmmktime --- 取得UNIX時間戳記的格林威治時間

gmstrftime --- 按照場所設定將格林威治時間/日期格式化

localtime --- 取得當地時間

microtime --- 傳回目前UNIX時間戳記的百萬分之一秒

mktime --- 取得日期的UNIX時間戳記

time --- 傳回目前UNIX時間戳記

strtotime --- 剖析任何英文的日期時間成為UNIX時間戳記

首頁


正規表達函式庫

ereg --- 正規表達比對

ereg_replace --- 正規表達比對取代

eregi --- 忽略大小寫的正規表達比對

eregi_replace --- 忽略大小寫的正規表達比對取代

split --- 以正規表達式將字串切開

spliti --- 忽略大小寫的以正規表達式將字串切開

sql_regcase --- 使正規表達式不分大小寫比對

首頁


變數函式庫

call_user_func --- 依照參數呼叫使用者函式

doubleval --- 取得變數的倍浮點值

empty --- 測定變數是否設定

gettype --- 取得變數的型態

intval --- 取得變數的整數值

is_array --- 判斷變數是否為陣列

is_bool --- 判斷變數是否為布林

is_double --- 判斷變數是否為倍浮點數

is_float --- 判斷變數是否為浮點數

is_int --- 判斷變數是否為整數

is_integer --- 判斷變數是否為整數

is_long --- 判斷變數是否為整數

is_numeric --- 判斷變數是否為數字或數字的字串

is_object --- 判斷變數是否為物件

is_real --- 判斷變數是否為實數

is_resource --- 判斷變數是否為資源

is_string --- 判斷變數是否為字串

isset --- 測定變數是否設定

print_r --- 列出變數資訊

settype --- 設定變數的型態

strval --- 取得變數的字串值

unset --- 刪除變數

var_dump --- 列出變數資訊

首頁


動態載入函式庫

dl --- 載入PHP擴充模組

首頁


目錄函式庫

chdir --- 變更目錄

dir --- 目錄類別

closedir --- 關閉目錄處理

opendir --- 開啟目錄處理

readdir --- 讀取目錄處理

rewinddir --- 重設目錄處理

首頁


雜項函式庫

create_function --- 建立匿名函式

connection_aborted --- 如果與用戶端失去連線則傳回true

connection_status --- 傳回連線狀態

connection_timeout --- 如果超過限定的執行時間則傳回true

define --- 定義常數名稱

defined --- 檢查常數是否存在

die --- 輸出訊息並且終止程式的剖析

eval --- 求出字串PHP程式碼的值

exit --- 終止目前程式

func_get_arg --- 從參數列表傳回項目

func_get_args --- 傳回包含函式的參數列表的陣列

func_num_args --- 傳回傳遞到函式的參數數目

function_exists --- 檢查函式是否已經定義

get_browser --- 識別使用者的瀏灠器的能力

ignore_user_abort --- 設定是否用戶端失去連線時將終止程式執行

iptcparse --- 剖析二進制IPTC區塊成為它的單一旗標

leak --- 滲漏記憶體

pack --- 包裹資料成為二進制字串

register_shutdown_function --- 設定程式執行完後執行的函式

serialize --- 產生一個可儲存的值的表示

sleep --- 延遲執行

uniqid --- 產生唯一的 id

unpack --- 從二進制字串取出資料

unserialize --- 從儲存的值中建立PHP的值

usleep --- 延遲執行百萬分之一秒

highlight_string --- 顯示語法字串的彩色顏色

highlight_file --- 顯示語法字串的彩色顏色

show_source --- 顯示語法字串的彩色顏色

首頁


信用卡交易函式庫

pfpro_init --- 初始的Payflow Pro

pfpro_cleanup --- 結束Payflow Pro

pfpro_process --- 處理Payflow Pro交易

pfpro_process_raw --- 處理未加工的Payflow Pro交易

pfpro_version --- 傳回Payflow Pro的版本

首頁


程式執行函式庫

escapeshellcmd --- 逃脫特殊字元

exec --- 執行外部程式

passthru --- 執行外部程式並且顯示未加工的(raw)輸出

system --- 執行外部程式並且顯示輸出

首頁


壓縮函式庫

gzclose --- 關閉壓縮檔案指標

gzeof --- 測試壓縮檔案指標是否在檔案結尾

gzfile --- 讀取全部的壓縮檔案到陣列中

gzgetc --- 從壓縮檔案指標取得字元

gzgets --- 從檔案指標取得字串

gzgetss --- 從檔案指標取得字串並去除HTML標籤

gzopen --- 開啟壓縮檔

gzpassthru --- 輸出所有剩餘資料

gzputs --- 將資料寫到壓縮檔案指標

gzread --- 讀取指定長度字串

gzrewind --- 重設壓縮檔案指標的位置

gzseek --- 移動壓縮檔案指標

gztell --- 取得壓縮檔案指標的位置

gzwrite --- 將資料寫入壓縮檔案

readgzfile --- 輸出壓縮檔

gzcompress --- 壓縮一字串

gzuncompress --- 將壓縮的字串解壓縮

首頁


Apache特定函式庫

apache_lookup_uri --- 執行URI的部份請求並且傳回所有資訊

apache_note --- 取得及設定apache 請求記錄

getallheaders --- 取得所有HTTP請求標頭

virtual --- 執行Apache次要請求

首頁


BC高精準度函式庫

bcadd --- 將二個高精準度數字相加

bccomp --- 比較二個高精準度數字

bcdiv --- 將二個高精準度數字相除

bcmod --- 取得高精準度數字的餘數

bcmul --- 將二個高精準度數字相乘

bcpow --- 求高精準度數字的次方值

bcscale --- 設定小數點位數

bcsqrt --- 取得高精準度數字的平方根

bcsub --- 將二個高精準度數字相減

首頁


COM函式庫

com_load --- 建立新的COM

com_invoke --- 呼叫COM的方法

com_propget --- 取得COM屬性的值

com_get --- 取得COM屬性的值

com_propput --- 分配值給COM的屬性

com_propset --- 分配值給COM的屬性

com_set --- 分配值給COM的屬性

首頁


FTP函式庫

ftp_connect --- 開啟FTP連結

ftp_login --- 登入FTP連結

ftp_pwd --- 傳回目前的目錄名稱

ftp_cdup --- 回到父目錄

ftp_chdir --- 切換到指定的目錄

ftp_mkdir --- 建立新目錄

ftp_rmdir --- 移除目錄

ftp_nlist --- 傳回給予的目錄中檔案的列表

ftp_rawlist --- 傳回給予的目錄中檔案的詳細列表

ftp_systype --- 傳回遠端FTP伺服器的系統型態identifier

ftp_pasv --- 開啟或關閉被動模式

ftp_get --- 從FTP伺服器下載檔案

ftp_fget --- 從FTP伺服器下載檔案並且儲存到開啟的檔案

ftp_put --- 上傳檔案到FTP伺服器

ftp_fput --- 從開啟的檔案上傳到FTP伺服器

ftp_size --- 傳回檔案的大小

ftp_mdtm --- 傳回檔案的最後修改時間

ftp_rename --- 將FTP伺服器上的檔案重新命名

ftp_delete --- 刪除FTP伺服器上的檔案

ftp_site --- 送出SITE命令給伺服器

ftp_quit --- 結束FTP連結

首頁


HTTP函式庫

header --- 送出HTTP標頭

header_sent --- 判斷標頭是否已經送出

setcookie --- 送出cookie

首頁


URL函式庫

base64_decode --- 以MIME base64解碼

base64_encode --- 以MIME base64編碼

parse_url --- 剖析URL且傳回它的成分

rawurldecode --- 譯解URL編碼字串

rawurlencode --- 依照RFC1738將URL編碼

urldecode --- 譯解URL編碼字串

urlencode --- URL編碼字串

首頁


GNU記錄函式庫

recode_string --- 按照記錄請求來記錄字串

recode --- 按照記錄請求來記錄字串

recode_file --- 按照記錄請求從檔案記錄到檔案

首頁


GNU Gettext函式庫

bindtextdomain --- 設定網域的路徑

dcgettext --- 撤消個別訊息查詢的網域

dgettext --- 撤消現行的網域

gettext --- 查詢現行網域中的訊息

textdomain --- 設定預設的網域

首頁


ICAP函式庫

icap_open --- 開啟ICAP連結

icap_close --- 關閉ICAP連結

icap_fetch_event --- 從記事錄獲得事件

icap_list_events --- 傳回二個時間日期之間的事件列表

icap_store_event --- 儲存一個事件到ICAP記事錄

icap_delete_event --- 從ICAP記事錄刪除事件

icap_snooze --- 開啟事件警報

icap_list_alarms --- 傳回在給予的時間日期上即將要起動警報的事件的列表

首頁


Mhash函式庫

mhash_get_hash_name --- 取得拼湊的名稱

mhash_get_block_size --- 取得拼湊的區塊大小

mhash_count --- 取得最高的有效的拼湊 id

mhash --- 計算拼湊

首頁


Pspell函式庫

pspell_new --- 載入一個新辭典

pspell_check --- 檢查單字的拼法

pspell_suggest --- 建議單字的拼法

首頁


PHP選項與資訊函式庫

assert --- 如果assertion是false則檢查

assert_options --- 設定(取得)各式的assert旗標

error_log --- 送出錯誤訊息到某處

error_reporting --- 設定PHP錯誤回報等級

extension_loaded --- 判斷擴充模組是否已載入

getenv --- 取得環境變數的值

get_cfg_var --- 取得PHP結構選項的值

get_current_user --- 取得目前PHP程式擁有者的名稱

get_magic_quotes_gpc --- 取得目前magic_quotes_gpc的設定值

get_magic_quotes_runtime --- 取得目前magic_quotes_runtime的設定值

getlastmod --- 取得網頁最後修改的時間

getmyinode --- 取得目前程式的inode

getmypid --- 取得PHP的處理ID

getmyuid --- 取得PHP程式擁有者的ID

getrusage --- 取得目前資源用法

phpcredits --- 列出PHP榮譽

phpinfo --- 輸出PHP資訊

phpversion --- 取得目前PHP版本

php_logo_guid --- 取得logo guid

php_sapi_name --- 傳回web伺服與PHP之間的介面型態

putenv --- 設定環境變數的值

set_magic_quotes_runtime --- 設定目前magic_quotes_runtime的值

set_time_limit --- 限制最大的執行時間

zend_logo_guid --- 取得zend guid

get_loaded_extensions --- 傳回所有編譯模組和載入的名稱

get_extension_funcs --- 傳回模組的函式名稱

get_required_files --- 傳回在程式中require_once( )檔案的名稱

get_included_files --- 傳回在程式中include_once( )檔案的名稱

首頁


PHP4新增的部份語法

作者 : 林義祥

  • 前言

目前使用PHP的人已經相當的多，而PHP也被大家廣泛的討論與應用，相信PHP必定會成為新一代的潮流。從之前我所學習的PHP3，發展到現在的PHP4，PHP4的速度不但加快了許多，而且也增加了蠻多的函式庫，功能真是愈來愈多啊！以下是我在看手冊時的新發現，至少是在別的站上所未曾見過的，而且書上也沒提到的，因此翻譯其中的部份內容來和各位同好們一起分享，也希望大家來信指教。以下的文章及範例皆取自PHP官方網站。

  • foreach

在 PHP4中，新增了一個迴圈 foreach，它很像是 perl和其它的語言，你可以給它一個陣列，讓它來取出陣列的值。它有下列這二個語法，第二個語法是較次要的，但是可用來作為第一個語法的延伸。

foreach(array_expression as $value) statement

foreach(array_expression as $key => $value) statement

第一個形式的迴圈，它會在每個迴圈上，將目前元素的值分配給 $value，並且向後移動陣列的內部指標，所以在下一個迴圈的時候，你就會看到下一個元素了。

第二個形式的迴圈和第一個是相同的，不同的是它會在每個迴圈將目前元素的索引值分配給變數 $key。

注意 : 當 foreach第一次開始執行的時候，它會把陣列的內部指標重新設定到陣列的第一個元素，意思是說，在使用 foreach之前，你不必再去呼叫 reset( )。

注意 : foreach是運作在陣列的複製，而不是陣列它本身，因此並不會改變陣列指標

下面範例的功能都是相同的 :

<?php

reset ($arr);

while (list(, $value) = each ($arr)) {

echo "Value: $value<br>\n";

}

foreach ($arr as $value) {

echo "Value: $value<br>\n";

}

?>

下面範例的功能也都是相同的 :

<?php

reset ($arr);

while (list($key, $value) = each ($arr)) {

echo "Key: $key; Value: $value<br>\n";

}

foreach ($arr as $key => $value) {

echo "Key: $key; Value: $value<br>\n";

}

?>

以下的範例將說明 foreach的用法 :

<?php

/* foreach example 1: value only */

$a = array (1, 2, 3, 17);

foreach ($a as $v) {

print "Current value of \$a: $v.\n";

}

/* foreach example 2: value (with key printed for illustration) */

$a = array (1, 2, 3, 17);

$i = 0;

/* for illustrative purposes only */

foreach($a as $v) {

print "\$a[$i] => $k.\n";

}

/* foreach example 3: key and value */

$a = array (

"one" => 1,

"two" => 2,

"three" => 3,

"seventeen" => 17

);

foreach($a as $k => $v) {

print "\$a[$k] => $v.\n";

}

?>

  • require_once( )

require_once( )以指定的檔案來取代它自己本身，這很像是C語言中的#include，而且和
  require( )也很相似，最大的不同是require_once( )有個包含鏈(inclusion
  chain)，require_once( )的使用將會保證檔案加入你的程式中只有一次，而且會避開與變數值或函式名稱之間的衝突。

為了要測試這個範例，請你建立二個檔案 utils.inc和 foolib.inc

檔案 utils.inc的內容 :

<?php

define(PHPVERSION, floor(phpversion()));

echo "GLOBALS ARE NICE\n";

function goodTea() {

return "Oolong tea tastes good!";

}

?>

檔案 foolib.inc的內容 :

<?php

require ("utils.inc");

function showVar($var) {

if (PHPVERSION == 4) {

print_r($var);

} else {

dump_var($var);

}

}

// bunch of other functions ...

?>

然後建立一個檔名為cause_error_require.php的檔案，這個檔案的內容為 :

<?php

require("foolib.inc");

/* the following will generate an error */

require("utils.inc");

$foo = array("1",array("complex","quaternion"));

echo "this is requiring utils.inc again which is also\n";

echo "required in foolib.inc\n";

echo "Running goodTea: ".goodTea()."\n";

echo "Printing foo: \n"; showVar($foo);

?>

然後當你試著去執行 cause_error_require.php的時候，輸出的結果會是 :

GLOBALS ARE NICE GLOBALS ARE NICE

Fatal error: Cannot redeclare causeerror( ) in utils.inc on line 5

現在我們來修改 foolib.inc和 cause_error_require.php這二個檔案，我們來使用 require_once( )來代替 require( )，並且將 cause_error_require.php這個檔案重新命名為avoid_cause_error_require_once.php。

檔案 foolib.inc修改的內容如下 :

...

require_once("utils.inc");

function showVar($var) {

...

檔案 avoid_cause_error_require_once.php修改完成後的部份內容如下 :

...

require_once("foolib.inc");

require_once("utils.inc");

$foo = array("1",array("complex","quaternion"));

...

然後我們再執行 avoid_cause_error_require_once.php時，輸出的結果會是 :

GLOBALS ARE NICE

this is requiring globals.inc again which is also

required in foolib.inc

Running goodTea: Oolong tea tastes good!

Printing foo:

Array

(

[0] => 1

[1] => Array (

[0] => complex

[1] => quaternion

)

)

  • include_once( )

include_once( )在程式執行的期間，將指定的檔案給包含進來，這和 include( )很相似，而它們最大的不同處是，如果從檔案包含進來的程式碼先前已經有包含過的時候，include_once( )就不會再把它包含進來。

如果要在程式的執行期間包含相同的檔案一次以上，而且又要確定檔案有被包含進來時，便可以使用include_once( )。


Session函式庫

session_start --- 最初的session資料

session_destroy --- 消滅所有session登記過的資料

session_name --- 取得並且(或)設定目前session名稱

session_module_name --- 取得並且(或)設定目前session模組

session_save_path --- 取得並且(或)設定目前session儲存的路徑

session_id --- 取得並且(或)設定目前的session id

session_register --- 在目前session中登記一個或多個變數

session_unregister --- 從目前的session將變數取消登記

session_unset --- 釋放所有變數

session_is_registered --- 判斷變數是否已經登記

session_get_cookie_params --- 取得session cookie參數

session_set_cookie_params --- 設定session cookie參數

session_decode --- 從字串解碼session資料

session_encode --- 將目前session資料編碼

首頁


Shockwave Flash函式庫

swf_openfile --- 開啟新的Shockwave Flash檔案

swf_closefile --- 關閉Shockwave Flash檔案

swf_labelframe --- 標記目前的框架

swf_showframe --- 顯示目前的框架

swf_setframe --- 切換到指定的框架

swf_getframe --- 取得目前框架的框架編號

swf_mulcolor --- 設定指定的多樣顏色值rgba

swf_addcolor --- 增加rgba所指定的顏色值

swf_placeobject --- 放置物件到螢幕上

swf_modifyobject --- 修改物件

swf_removeobject --- 移除物件

swf_nextid --- 傳回下一個物件id

swf_startdoaction --- 起始目前框架動作的說明

swf_actiongotoframe --- 播放一個框架然後停止

swf_actiongeturl --- 從Shockwave Flash影片取得URL

swf_actionnextframe --- 到下一個框架

swf_actionprevframe --- 到上一個框架

swf_actionplay --- 從目前的框架開始播放flash影片

swf_actionstop --- 停止播放目前框架上的flash影片

swf_actiontogglequality --- 拴牢介於高與低質量flash影片

swf_actionwaitforframe --- 如果框架沒有載入則略過動作

swf_actionsettarget --- 設定動作的來龍去脈

swf_actiongotolabel --- 顯示框架和指定的標籤

swf_enddoaction --- 結束目前動作

swf_defineline --- 定義一個線段

swf_definerect --- 定義一個矩形

swf_definepoly --- 定義一個多邊形

swf_startshape --- 起始一個複合的形狀

swf_shapelinesolid --- 設定目前線段樣式

swf_shapefilloff --- 關閉填滿

swf_shapefillsolid --- 設定目前填滿的樣式為指定的顏色

swf_shapefillbitmapclip --- 設定目前填滿到省略一部份的位圖的方式

swf_shapefillbitmaptile --- 設定目前填滿到位圖地磚的方式

swf_shapemoveto --- 移動目前的位置

swf_shapelineto --- 繪製一線段

swf_shapecurveto --- 繪製二點間的曲線

swf_shapecurveto3 --- 繪製三次方的曲線

swf_shapearc --- 畫一圓弧

swf_endshape --- 結束目前形狀的定義

swf_definefont --- 定義一個字體

swf_setfont --- 變更目前的字體

swf_fontsize --- 變更目前字體大小

swf_fontslant --- 設定字體傾斜角度

swf_fonttracking --- 設定目前字體的距離

swf_getfontinfo --- 取得大寫的A與小寫的x其高度為多少像素

swf_definetext --- 定義字串

swf_textwidth --- 取得字串的寬度

swf_definebitmap --- 定義位圖

swf_getbitmapinfo --- 取得關於位圖的資訊

swf_startsymbol --- 定義一個符號

swf_endsymbol --- 結束符號的定義

swf_startbutton --- 起始按鈕的定義

swf_addbuttonrecord --- 控制按鈕出現和動作的區域位置

swf_oncondition --- 描述觸發的一個動作列表

swf_endbutton --- 結束目前按鈕的定義

swf_viewport --- 選擇一個未來繪圖的區域

swf_ortho --- 定義一個垂直線使用者的繪圖到目前的繪圖區域上

swf_ortho2 --- 定義2D垂直線使用者的繪圖到目前的繪圖區域上

swf_perspective --- 定義一個透視圖投射轉變

swf_polarview --- 定義觀看者的位置

swf_lookat --- 定義觀看轉變

swf_pushmatrix --- 推動目前轉變基礎回到堆之上

swf_popmatrix --- 恢愎先前轉變基礎

swf_scale --- 刻度目前的轉變

swf_translate --- 轉譯目前的轉變

swf_rotate --- 旋轉目前的轉變

swf_posround --- 設定是否當物件被放置或移動時能環繞的轉化

首頁


SNMP函式庫

snmpget --- 取得SNMP物件

snmpset --- 設定SNMP物件

snmpwalk --- 取得所有SNMP物件

snmpwalkoid --- 獲得網路實體樹狀的資料

snmp_get_quick_print --- 獲得目前UCD函式庫的quick_print設定值

snmp_set_quick_print --- 設定UCD SNMP函式庫中quick_print的值

首頁


Vmailmgr函式庫

vm_adduser --- 增加虛擬使用者和密碼

vm_addalias --- 增加虛擬使用者的別名

vm_passwd --- 變更虛擬使用者的密碼

vm_delalias --- 移除別名

vm_deluser --- 移除虛擬使用者

首頁


YP/NIS函式庫

yp_get_default_domain --- 獲得預設的NIS網域

yp_order --- 傳回地圖的順序編號

yp_master --- 傳回地圖的主要NIS伺服器名稱

yp_match --- 傳回相配的行

yp_first --- 從地圖傳回首先的key-value對

yp_next --- 傳回地圖中的下一個key-value對

首頁


WDDX函式庫

wddx_serialize_value --- 連載一個值成為WDDX封包

wddx_serialize_vars --- 連載變數成為一個WDDX封包

wddx_packet_start --- 建立一個新的WDDX封包和它內部的結構

wddx_packet_end --- 結束所指定ID的WDDX封包

wddx_add_vars --- 將變數連載到指定的封包

wddx_deserialize --- 分解WDDX封包

首頁


Apache特定函式庫 -- apache_looup_uri

Apache特定函式庫

apache_lookup_uri

(PHP3 >= 3.0.4 , PHP4)

apache_lookup_uri --- 執行URI的部份請求並且傳回所有資訊

語法 : class apache_lookup_uri (string filename)

說明 :

執行URI局部的請求，獲得所有關於資源的重要資訊，並且將這個資訊放入物件中傳回，所傳回的物件有著下列的屬性 :

status
the_request
status_line
method
content_type
handler
uri
filename
path_info
args
boundary
no_cache
no_local_copy
allowed
send_bodyct
bytes_sent
byterange
clength
unparsed_uri
mtime
request_time

注意 : 當PHP是安裝成Apache模組時，apache_looup_uri( )才會運作


Apache特定函式庫 -- apache_note

Apache特定函式庫

apache_note

(PHP3 >= 3.0.2 , PHP4)

apache_note --- 取得及設定apache 請求記錄

語法 : string apache_note (string note_name [, string note_value])

說明 :

apache_note( )是個Apache特定函式，可以取得和設定請求的notes表格中的值。如果呼叫此函式時只有一個參數，則它會傳回目前note_name的值，如果有二個參數，則它會設定note_value為note_name的值，並且傳回note_name先前的值。


Apache特定函式庫 -- getallheaders

Apache特定函式庫

getallheaders

(PHP3 , PHP4)

getallheaders --- 取得所有HTTP請求標頭

語法 : array getallheaders (void)

說明 :

此函式傳回現行的請求的所有HTTP標頭，傳回值是一陣列型態。

Example :

<?php

$headers = getallheaders();

while (list ($header, $value) = each ($headers)) {

echo "$header: $value<br>\n";

}

?>

這個範例將會顯示現行的請求的所有標頭。

注意 : 當PHP是執行在Apache模組時，getallheaders( )才有效


Apache特定函式庫 -- virtual

Apache特定函式庫

virtual

(PHP3 , PHP4)

virtual --- 執行Apache次要請求

語法 : int virtual (string filename)

說明 :

virtual( )是Apache特定函式，相當於是mod_include中的<!--#include virtual...-->，它執行一個Apache次要請求(sub_request)。它可以用來包含CGI程式或是.shtml檔案，CGI程式必須產生有效的CGI標頭，最少必須要產生一個Content-type標頭。PHP檔案，你需要使用include( )或是require( )，virtual( )無法用來包含一個它本身是PHP檔案的文件。


陣列函式庫 -- array

陣列函式庫

array

(unknown)

array --- 建立新陣列

語法 : array array([mixed ...]);

說明 :

傳回參數的陣列，參數能以"=>"運算子來給予索引值，此函式不是正規的函式，主要是用來表示陣列。

以下的範例說明如何建立二維陣列，如何去指定聯合陣列的keys，及如何在標準的陣列中躍過和繼續數字的索引。

Example :

<?php

$fruits = array (

"fruits => array("a" => "orange" , "b" => "banana" , "c" => "apple"),

"numbers" => array(1 , 2 , 3 , 4 , 5 , 6),

"holes" => array("first" , 5 => "second" , "third")

);

?>

參考 : list( )


陣列函式庫 -- array_count_values

陣列函式庫

array_count_values

(PHP4 >= 4.0b4)

array_count_values --- 計算陣列所有的值

語法 : array array_count_values(array input);

說明 :

此函式傳回一計算後之陣列結果，傳回的陣列其索引值為參數input的值，而陣列的值則是參數input所出現的次數。

Example :

<?php

$array = array(1 , "hello" , 1 , "world" , "hello");

array_count_values($array); //returns array(1 => 2 , "hello" => 2 , "world" => 1)

?>


陣列函式庫 -- array_diff

陣列函式庫

array_diff

(PHP4 >= 4.0.1)

array_diff --- 計算陣列的差異

語法 : array array_diff (array array1, array array2 [, array ...])

說明 :

Array_diff( )傳回array1沒有出現在其它引數之中的所有的值，此函式傳回一陣列型態，傳回的陣列其索引值將保留。

Example :

<?php

$array1 = array ("a" => "green", "red", "blue");

$array2 = array ("b" => "green", "yellow", "red");

$result = array_diff ($array1, $array2);

?>

這將使$result有著array("blue")

參考 : array_intersect( )


陣列函式庫 -- array_flip

陣列函式庫

array_flip

(PHP4 >= 4.0b4)

array_flip --- 翻轉陣列所有的值

語法 : array array_flip(array trans);

說明 : 此函式傳回翻轉(flip)順序的陣列。

Example :

<?php

$trans = array_flip($trans);

$original = strtr($str , $trans);

?>


陣列函式庫 -- array_intersect

陣列函式庫

array_intersect

(PHP4 >= 4.0.1)

array_intersect --- 計算陣列的交點

語法 : array array_intersect (array array1, array array2 [, array ...])

說明 :

Array_intersect( )傳回array1出現在所有引數之中的所有的值，此函式將傳回一陣列型態，傳回的陣列其索引值將保留。

Example :

<?php

$array1 = array ("a" => "green", "red", "blue");

$array2 = array ("b" => "green", "yellow", "red");

$result = array_intersect ($array1, $array2);

?>

這將使$result有著array( "a" => "green" , "red" )

參考 : array_diff( )


陣列函式庫 -- array_keys

陣列函式庫

array_keys

(PHP4)

array_keys --- 傳回陣列的所有索引值

語法 : array array_keys(array input [ , mixed search_value] );

說明 :

此函式從參數input傳回數字和字串的索引值，參數search_value是非必需的，若有指定則只傳回所指定的值的索引值，否則將從input傳回所有的索引值。

Example :

<?php

$array = array(0 => 100, "color" => "red");

array_keys($array); // returns array(0, "color")

$array = array(1, 100, 2, 100);

array_keys($array, 100); // returns array(0, 2)

?>

參考 : array_values( )


陣列函式庫 -- array_merge

陣列函式庫

array_merge

(PHP4)

array_merge --- 合併兩個以上的陣列

語法 : array array_merge(array array1, array array2 [ , array ...] );

說明 :

此函式將兩個以上的陣列合併在一起，如此一來它們的值則附加在先前的後面。若輸入的陣列有著相同的字串索引值，則後來的值會將覆蓋到之前的值，無論如何，陣列有著相同的數字索引，但是隨後的值將不會覆蓋過原先的值，但是會被附加上。

Example :

<?php

$array1 = array("color" => "red", 2, 4);

$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid");

array_merge($array1, $array2);

?>

產生的陣列將會是 array("color" => "green", 2, 4, "a", "b", "shape" => "trapezoid")

參考 : array_merge_recursive( )


陣列函式庫 -- array_merge_recursive

陣列函式庫

array_merge_recursive

(PHP4 >= 4.0.1)

array_merge_recursive --- 以遞歸方式合併兩個以上的陣列

語法 : array array_merge_recursive (array array1, array array2 [, array ...])

說明 :

Array_merge_recursive( )將兩個以上的陣列合併在一起，如此一來它們的值則附加在先前的後面。

如果輸入的陣列有著相同的字串索引值，則這些值會合併起來到陣列中，而且是以遞歸的方式，如此一來假使值的本身是個陣列，這個函式將會合併它在另一個陣列之中。無論如何，陣列有著相同的數字的索引，但是隨後的值將不會覆蓋過原先的值，但是會被附加上。

Example :

<?php

$ar1 = array ("color" => array ("favorite" => "red"), 5);

$ar2 = array (10, "color" => array ("favorite" => "green", "blue"));

$result = array_merge_recursive ($ar1, $ar2);

?>

產生的陣列將會是

array( "color" => array ( "favorite" => array( "red" , "green" ), "blue" ),5 ,10)

參考 : array_merge( )


陣列函式庫 -- array_multisort

陣列函式庫

array_multisort

(PHP4 >= 4.0b4)

array_multisort --- 排序複合或多樣尺寸的陣列

語法 : bool array_multisort (array ar1 [,mixed arg [,mixed ...[,array...]]])

說明 :

Array_multisort( )能用來立刻將數個陣列或多樣尺寸(multi-dimensional)陣列排序。

輸入的陣列被看作是表格(table)的欄位，依照列(rows)將它排序，這類似於SQL ORDER BY clause的功能，第一個陣列是首要(primary)排序的陣列，此陣列中的列(值)以下一個輸入的陣列對照相同的排序。

這個函式的引數結構是個獨特(unusual)位元，但是是可變通的。第一個引數必定是個陣列，隨後的引數可以是個陣列或是下個列表的排序旗標(flag)之一。

排序順序旗標 :

SORT_ASC - 排序成上升的順序

SORT_DESC - 排序成下降的順序

排序型態旗標 :

SORT_REGULAR - 正常的比較項目

SORT_NUMERIC - 以數字比較項目

SORT_STRING - 看作是字串來比較項目

不能使用二個相同型態的旗標指定在各各陣列之後，排序的旗標指定在陣列引數的後面，只對此陣列起作用，其它的將重設為預設的SORT_ASC和SORT_REGULAR在陣列引數之後。

成功則傳回true，失敗則傳回false。

Example :

<?php

$ar1 = array ("10", 100, 100, "a");

$ar2 = array (1,3,"2",1);

array_multisort ($ar1,$ar2);

?>

此範例排序後，第一個陣列將會是10 , "a" , 100 , 100，第二個陣列將會是1 , 1 , 2 , "3"。

Example :

<?php

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));

array_multisort ($ar[0], SORT_ASC, SORT_STRING,

$ar[1], SORT_NUMERIC, SORT_DESC);

?>

在此範例排序後，第一個陣列將會是10 , 100 , 100 , "a" (它被看作是字串且上升排序)，且第二個陣列將會是1 , 3 , "2" , 1(它被看作是數值且下降排序)。


陣列函式庫 -- array_pad

陣列函式庫

array_pad

(PHP4 >= 4.0b4)

array_pad --- 填塞陣列為指定的長度與值

語法 : array array_pad(array input, int pad_size, mixed pad_value);

說明 :

此函式將陣列array填塞成大小為pad_size和值為pad_value的陣列，且將填塞後的陣列傳回，若參數pad_size是一正數，則填塞在陣列的右方，若為負數，則填塞在陣列的左方。如果參數pad_size的絕對值小於或等於陣列input的長度，則將不填塞。

Example :

<?php

$input = array(12, 10, 9);

$result = array_pad($input, 5, 0);

// result is array(12, 10, 9, 0, 0)

$result = array_pad($input, -7, -1);

// result is array(-1, -1, -1, -1, 12, 10, 9)

$result = array_pad($input, 2, "noop");

// not padded

?>


陣列函式庫 -- array_pop

陣列函式庫

array_pop

(PHP4)

array_pop --- 取得陣列的最後一個元素

語法 : mixed array_pop(array array);

說明 : 此函式傳回陣列array的最後一個元素，將陣列array縮短一個元素。

Example :

<?php

$stack = array("orange", "apple", "raspberry");

$fruit = array_pop($stack);

?>

在此之後，$stack只有二個元素"orange"與"apple"，且$fruit為"raspberry"。

參考 : array_push( ) array_shift( ) array_unshift( )


陣列函式庫 -- array_push

陣列函式庫

array_push

(PHP4)

array_push --- 增加一個或多個元素到陣列的末端之上

語法 : int array_push(array array, mixed var [ , mixed ...] );

說明 :

此函式將參數array看做是一疊(stack)，且延伸變數在參數array的末端之上，參數array的長度依照變數的數目而增加。

有著相同的效果是 :

<?php

$array[ ] = $var;

?>

重覆各個var。

傳回陣列中元素的新數目。

Example :

<?php

$stack = array(1, 2);

array_push($stack, "+", 3);

?>

此範列將會使$stack有四個元素：1，2，"+"和3

參考 : array_pop( ) array_shift( ) array_unshift( )


陣列函式庫 -- array_rand

陣列函式庫

array_rand

(PHP4 >= 4.0.0)

array_rand --- 隨機挑選陣列的一個或多個值出來

語法 : mixed array_rand (array input [, int num_req])

說明 :

Array_rand( )當你想要隨機挑選陣列的一個或多個值出來時相當有用，引數num_reg是非必需的，它指出你想要挑選出幾個值出來，如果沒有指定，則它的預設值是1。

如果你只挑選一個值，array_rand( )傳回隨機值的索引。否則，它傳回隨機值的索引放在陣列中，將此陣列傳回。如此一來你不但可以挑選隨機索引值而且可將陣列的值輸出。

別忘了呼叫srand( )來設定亂數種子。

Example :

<?php

srand ((double) microtime() * 10000000);

$input = array ("Neo", "Morpheus", "Trinity", "Cypher", "Tank");

$rand_keys = array_rand ($input, 2);

print $input[$rand_keys[0]]."\n";

print $input[$rand_keys[1]]."\n";

?>


陣列函式庫 -- array_reverse

陣列函式庫

array_reverse

(PHP4 >= 4.0b4)

array_reverse --- 傳回顛倒元素順序的陣列

語法 : array array_reverse(array array);

說明 : 此函式將參數array的元素順序顛倒，且傳回新的陣列。

Example :

<?php

$input = array("php", 4.0, array("green", "red"));

$result = array_reverse($input);

?>

此範列使$result成為array(array("green", "red"), 4.0, "php")。


陣列函式庫 -- shift

陣列函式庫

array_shift

(PHP4)

array_shift --- 取得陣列的第一個元素

語法 : mixed array_shift(array array);

說明 :

此函式移動陣列array的第一個元素並將它傳回，將陣列array縮短一個元素，並且全部向下移動。

Example :

<?php

$args = array("-v", "-f");

$opt = array_shift($args);

?>

此範例將會使$arge有一個元素"-f"，且$opt有著"-v"。

參考 : array_unshift( ) array_push( ) array_pop( )


陣列函式庫 -- array_slice

陣列函式庫

array_slice

(PHP4)

array_slice --- 抽出陣列的一部份

語法 : array array_slice(array array, int offset, int [length] );

說明 :

此函式從陣列array傳回元素的一部份，若offset為正數，則取回的部份將起始於陣列中的offset處；若offset為負數，則從陣列的末端開始。若length有給予且是正數，將會取回length個元素，若length是負數，則會停止於陣列末端處第length個元素，若省略此參數，則傳回的部份將會從offset直到陣列的末端。

Example :

<?php

$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2); // returns "c", "d", and "e"

$output = array_slice($input, 2, -1); // returns "c", "d"

$output = array_slice($input, -2, 1); // returns "d"

$output = array_slice($input, 0, 3); // returns "a", "b", and "c"

?>

參考 : array_splice( )


陣列函式庫 -- array_splice

陣列函式庫

array_splice

(PHP4)

array_splice --- 移除陣列的一部份且替代它

語法 : array array_splice(array input, int offset, int [length] , array [replacement] );

說明 :

此函式將陣列input從offset到length移除，若有提供參數replacement則以replacement的元素來替代。

若offset為正數則移除的起始處從陣列array的開始處第offset的位置開始，若offset為負數則從陣列array的末端開始。

若省略參數length則移除的部份是從offset到陣列末端，若有指定length且是正數則移除length個元素，若有指定length且是負數則移除的部份將會止於陣列的末端第length個元素。

若有指定參數replacement則移除的元素將會以此陣列的元素來替代，若offset和length無移除，則replacement中的元素將會插入在offset所指定處。

以下的義意是相等的 :

array_push($input, $x, $y)     array_splice($input, count($input), 0, array($x, $y))

array_pop($input)                 array_splice($input, -1)

  array_shift($input)                 array_splice($input, 0, 1)

  array_unshift($input, $x, $y)  array_splice($input, 0, 0, array($x, $y))

  $a[$x] = $y                           array_splice($input, $x, 1, $y)

Example :

<?php

$input = array("red", "green", "blue", "yellow");

array_splice($input, 2); // $input is now array("red", "green")

array_splice($input, 1, -1); // $input is now array("red", "yellow")

array_splice($input, 1, count($input), "orange"); // $input is now array("red", "orange")

array_splice($input, -1, 1, array("black", "maroon"));

                              // $input is now array("red", "green", "blue", "black", "maroon")

?>

參考 : array_slice( )


陣列函式庫 -- array_unique

陣列函式庫

array_unique

(PHP4 >= 4.0.1)

array_unique --- 從陣列移除相同的值

語法 : array array_unique (array array)

說明 :

Array_unique( )取輸入的陣列array且傳回沒有相同的值的陣列。索引會被保留(preserved)。

Example :

<?php

$input = array ("a" => "green", "red", "b" => "green", "blue", "red");

$result = array_unique ($input);

?>

這將使$result有著array ( "a" => "green" , "red" , "blue");


陣列函式庫 -- array_unshift

陣列函式庫

array_unshift

(PHP4)

array_unshift --- 增加一個或多個元素到陣列的起始處

語法 : int array_unshift(array array, mixed var, [...] );

說明 :

此函式增加元素到陣列array的前面，此函式傳回陣列array中新的元素數目。

Example :

<?php

$queue = array("p1", "p3");

array_unshift($queue, "p4", "p5", "p6");

?>

此範例將會使$queue有五個元素："p4"，"p5"，"p6"，"p1"和"p3"。

參考 : array_shift( ) array_push( ) array_pop( )


陣列函式庫 -- array_values

陣列函式庫

array_values

(PHP4)

array_values --- 傳回陣列所有的值

語法 : array array_values(array input);

說明 :

此函式從陣列array傳回所有的值。

Example :

<?php

$array = array("size" => "XL", "color" => "gold");

array_values($array); // returns array("XL", "gold")

?>


陣列函式庫 -- array_walk

陣列函式庫

array_walk

(PHP3 >= 3.0.0 , PHP4)

array_walk --- 使自定的函式能處理陣列的每個元素

語法 : int array_walk(array arr , string func);

說明 :

使陣列arr的每個元素和函式名稱func相對應，元素傳到函式func的第一個參數，如果函式func超過一個以上的參數，則會有警告訊息，要抑制警告訊息可在此函式前加上’@’，即@array_walk，或是使用error_reporting。

注意 : 此函式確實會將陣列arr的每個元素依序代入，因此任何元素的改變都將影響陣列本身。

注意 : PHP4.0.新增傳送索引(key)和使用者資料(userdata)到函式func。在PHP4 中array_walk( )預設不重設(reset)陣列，因此必須要呼叫reset( )

Example :

<?php

$fruits = array("d" => "lemon" , "a" => "orange" ,"b" => "banana" , "c" => "apple");

function test_alter($item1) {

$item1 = 'bogus';

}

function test_print($item2) {

echo "$item2<br>\n";

}

array_walk($fruits , 'test_print');

reset ($fruits);

array_walk($fruits , 'test_alter');

reset ($fruits);

array_walk($fruits , 'test_print');

?>

參考 : each( ) list( )


陣列函式庫 -- arsort

陣列函式庫

arsort

(PHP3 , PHP4)

arsort --- 顛倒陣列的順序且維持索引值的關係

語法 : void arsort(array array);

說明 :

此函式顛倒陣列元素的順序(z-a)，且維持陣列元素與其索引值對應的關係，這個函式主要是用於需要將陣列元素的順序作顛倒的排列。

Example :

<?php

$fruits = array("d" => "lemon" ,
  "a" => "orange" , "b" =>
  "banana" , "c" => "apple");

arsort($fruits);

for(reset($fruits) ; $key = key($fruits) ; next($fruits)) {

echo "fruits[$key] = " .$fruits[$key]. "\n";

}

?>

此範例的結果為 :

fruits[a] = orange

fruits[d] = lemon

fruits[b] = banana

fruits[c] = apple

由此可見陣列fruits已被顛倒了順序，而且索引值和元素之間的關係依然保持不變。

參考 : asort( ) rsort( ) ksort( ) sort( )


陣列函式庫 -- asort

陣列函式庫

asort

(PHP3 , PHP4)

asort --- 將陣列排列且維持索引值的關係

語法 : void asort(array array);

說明 :

此函式將陣列的元素由a-z重新排列，且保持原先索引值和元素的對應關係，這個函式主要是用於需要將陣列的元素重新排列。

Example :

<?php

$fruits = array("d" => "lemon" ,
  "a" => "orange" , "b" =>
  "banana" , "c" => "apple");

asort($fruits);

for(reset($fruits) ; $key = key($fruits) ; next($fruits)) {

echo "fruits[$key] = " .$fruits[$key]. "\n";

}

?>

此範例的結果為 :

fruits[c] = apple

fruits[b] = banana

fruits[d] = lemon

fruits[a] = orange

由此可見陣列fruits已被重新排列，而且索引值和元素之間的關係依然保持不變。

參考 : arsort( ) rsort( ) ksort( ) sort( )


陣列函式庫 -- compact

陣列函式庫

compact

(PHP4)

compact --- 建立陣列包含變數和它們的值

語法 : array compact(string varname | array varnames, [...] );

說明 :

此函式取一變數參數的數目，各各變數可以是包含變數名稱的字串或是變數的陣列名稱，陣列可以包含其它變數的陣列名稱在裡面。

此函式在符號(symbol)表格中尋找變數名稱，並且將它增加到輸出陣列，如此一來變數的名稱成為了索引值而變數的內容則成為了此索引值的值，此函式和extract( )相反，此函式傳回輸出陣列。

Example :

<?php

$city = "San Francisco";

$state = "CA";

$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);

?>

在此之後，$result將會是array ("event" => "SIGGRAPH", "city" => "San Francisco", "state" => "CA")

參考 : extract( )


陣列函式庫 -- count

陣列函式庫

count

(PHP3 , PHP4)

count --- 計算變數中元素的數目

語法 : int count(mixed var);

說明 :

傳回參數var中，元素的數目，最典型的例子就是用來計算陣列中的元素數目。

如果變數沒有設定,則傳回 0，如果變數不是陣列則傳回 1。

警告 :

變數沒有設定時count( )可能傳回 0，但是變數的開頭是空陣列時，它也會傳回 0，可使用isset( )來測試。

參考 : sizeof( ) isset( ) is_array( )


陣列函式庫 -- current

陣列函式庫

current

(PHP3 , PHP4)

current --- 傳回陣列中目前的元素

語法 : mixed current(array array);

說明 :

每個陣列都有內部指標指到它的現在元素，指標會指到最先插入陣列中的元素，直到程式執行到有移動指標的函式，此函式會傳回內部指標所指到的陣列元素，且不會移動指標的位置，若內部指標指到陣列元素之外，則傳回false。如果陣列包含空的元素（0或是""）則會傳回false。

參考 : end( ) next( ) prev( ) reset( )


陣列函式庫 -- each

陣列函式庫

each

(PHP3 , PHP4)

each --- 從陣列傳回key/value對

語法 : array each(array array);

說明 :

從陣列array傳回目前的key/value對，且向前移動陣列游標(cursor)。傳回的陣列有四個元素，分別是 0、1、key 和 value。元素 0 和 key 是陣列索引值的名稱，1 和 value 則是元素的資料。若陣列的內部指標指到陣列的末端，此函式會傳回false。

Example :

<?php

$foo = array("bob" , "fred" , "jussi" , "jouni");

$bar = each($foo);

?>

$bar現在包含了以下key/value對:

  • 0 => 0
  • 1 => 'bob'
  • key => 0
  • value => 'bob'

<?php

$foo = array("Robert" => "Bob" , "Seppo" => "Sepi");

$bar = each($foo);

?>

$bar現在包含了以下key/value對:

  • 0 => 'Robert'
  • 1 => 'Bob'
  • key => 'Robert'
  • value => 'Bob'

each通常和list一起使用,例如:$HTTP_POST_VARS

Example :

<?php

echo "Values submitted via POST method:<br>";

while(list($key , $val) = each($HTTP_POST_VARS)) {

echo "$key => $val<br>";

}

?>

each( )執行之後，陣列的游標(cursor)將會在陣列的下一個元素的左側，若是到達陣列的末端時，游標則在最後一個元素。

參考 :  key( )  current( )
  reset( )  next(
  )  prev( )


陣列函式庫 -- end

陣列函式庫

end

(PHP3 , PHP4)

end --- 設定陣列的內部指標指到最後的元素

語法 : end(array array);

說明 :

此函式設定陣列的內部指標到最後的元素

參考 : current( ) end( ) next( ) reset( )


陣列函式庫 -- extract

陣列函式庫

extract

(PHP3 >= 3.0.7 , PHP4)

array_extract --- 從陣列輸入變數到符號表格中

語法 : void extract(array var_array, int [extract_type] , string [prefix] );

說明 :

此函式從陣列輸入變數到目前的符號(symbol)表格中，它取陣列var_array並且看待索引值為變數名稱，值為變數值，它將各個key/value對建立一變數在目前符號表格中，以extract_type和prefix為條件。

extract( )檢查現存的變數，由參數extract決定碰撞時處理的方式為何，它可以是以下之一的值 :

EXTR_OVERWRITE

若發生碰撞則覆蓋過現存的變數

EXTR_SKIP

若發生碰撞則不覆蓋過現存的變數

EXTR_PREFIX_SAME

若發生碰撞則將參數prefix加在字首前面成為新變數

EXTR_PREFIX_ALL

把所有變數的字首都加上參數prefix

如果沒有指定參數extract_type，則使用EXTR_OVERWRITE。

注意 : 當extract_type是EXTR_PREFIX_SAME或是 EXTR_PREFIX_ALL時，才需要參數prefix。

Example :

<?php

/* Suppose that $var_array is an array returned from wddx_deserialize */

$size = "large";

$var_array = array("color" => "blue", "size" => "medium","shape" => "sphere");

extract($var_array, EXTR_PREFIX_SAME, "wddx");

print "$color, $size, $shape, $wddx_size\n";

?>

上面的範例將會產生出 :

blue, large, sphere, medium

$size並沒有覆蓋過去，因為我們指定了EXTR_PREFIX_SAME，而$wddx_size中的結果已被建立，若是使用EXTR_SKIP，則$wddx_size不會被建立，若是使用EXTR_OVERWRITE則 $size的值就是medium，若是使用EXTR_PREFIX_ALL則將會有名稱為$wddx_color、$wddx_size和$wddx_shape的新變數存在。


陣列函式庫 -- in_array

陣列函式庫

in_array

(PHP4)

in_array --- 搜尋陣列中值是否存在

語法 : bool in_array(mixed needle, array haystack);

說明 :

此函式搜尋陣列haystack查看參數needle是否存在陣列之中，若在陣列之中找到則傳回true，否則傳回false。

Example :

<?php

$os = array("Mac", "NT", "Irix", "Linux");

if (in_array("Irix", $os))

print "Got Irix";

?>


陣列函式庫 -- key

陣列函式庫

key

(PHP3 , PHP4)

key --- 從陣列中取得索引值

語法 : mixed key(array array);

說明 :

此函式傳回目前陣列指標所指到的索引。

參考 : current( ) next( )


陣列函式庫 -- krsort

陣列函式庫

krsort

(PHP3 >=3.0.13 , PHP4 >= 4.0b4)

krsort --- 依照索引值的顛倒順序將陣列排列

語法 : int krsort(array array);

說明 :

依照索引值的顛倒順序(z-a)將陣列重新排列，而索引值與陣列的值依然保持原來的關係。

Example :

<?php

$fruits = array("d"=>"lemon","a"=>"orange","b"=>"banana","c"=>"apple");

krsort($fruits);

for(reset($fruits); $key = key($fruits); next($fruits)) {

    echo "fruits[$key] = ".$fruits[$key]."\n";
  }

?>
此範例的結果為 :
fruits[d] = lemon
fruits[c] = apple
fruits[b] = banana
fruits[a] = orange

參考 : asort( ) arsort( ) ksort( ) sort( ) rsort( )


陣列函式庫 -- ksort

陣列函式庫

ksort

(PHP3 , PHP4)

ksort --- 將陣列的索引值排列

語法 : int ksort (array array [, int sort_flags] ) );

說明 :

此函式將陣列依照索引值由a-z重新排列

Example :

$fruits = array("d" => "lemon" ,
  "a" => "orange" , "b" =>
  "banana" , "c" => "apple");

ksort($fruits);

for(reset($fruits) ; $key = key($fruits) ; next($fruits)) {

echo "fruits[$key] = " .$fruits[$key]. "\n";

}

此範例的結果為 :

fruits[a] = orange

fruits[b] = banana

fruits[c] = apple

fruits[d] = lemon

參考 : asort( ) arsort( ) sort( ) rsort( )


陣列函式庫 -- list

陣列函式庫

list

(unknown)

list --- 列出陣列元素

語法 : void list(...);

說明 :

與array( )相似，此函式不是個正規的函式，此函式是用來在一運作中分配變數的列表。

Example :

<table>
<tr>
<th>Employee name</th>
<th>Salary</th>
</tr>
<?php

$result = mysql($conn, "SELECT id, name, salary FROM employees");

while (list($id, $name, $salary) = mysql_fetch_row($result)) {

print(" <tr>\n"." <td><a href=\"info.php3?id=$id\">$name</a></td>\n".

" <td>$salary</td>\n"." </tr>\n");
}
?>

</table>

參考 : each( ) array( )


陣列函式庫 -- next

陣列函式庫

next

(PHP3 , PHP4)

next --- 向前移動陣列的內部指標

語法 : mixed next(array array);

說明 :

傳回陣列的內部指標指到的下一個元素，如果沒有下一個元素則會傳回false。

此函式與current()相似，但有一點不同的是此函式在傳回元素之前會先移動陣列的內部指標，意思是說此函式會傳回下一個陣列的元素及移動陣列的內部指標，若陣列的內部指標指到陣列的元素之外，則會傳回false。

警告 : 如果陣列中包含空的元素，則此函式將會傳回false，要處理陣列中包含空的元素，可使用 each() 函式。

參考 : current( ) end( ) prev( ) reset( )


陣列函式庫 -- pos

陣列函式庫

pos

(PHP3 , PHP4)

pos --- 傳回陣列中目前的元素

語法 : mixed pos(array array);

說明 :

此函式為current( )的別名。

參考 : end( ) next( ) prev( ) reset( )


陣列函式庫 -- prev

陣列函式庫

prev

(PHP3 , PHP4)

prev --- 向後移動陣列的內部指標

語法 : mixed prev(array array);

說明 :

傳回先前陣列的內部指標所指到的陣列元素，如果沒有先前的元素則傳回false。

警告 : 如果陣列中包含空的元素，則此函式將會傳回false，要處理陣列中包含空的元素，可使用 each() 函式。

此函式和next( )相似，prev( )是將陣列的內部指標向後移動來替代next()的向前移動。

參考 : current( ) end( ) next( ) reset( )


陣列函式庫 -- range

陣列函式庫

range

(PHP3 >= 3.0.8 , PHP4 >= 4.0b4)

range --- 建立整數範圍的陣列

語法 : array range(int low, int high);

說明 :

傳回從low到high的整數陣列。

參考shuffle( )有使用範例


陣列函式庫 -- reset

陣列函式庫

reset

(PHP3 , PHP4)

reset --- 設定陣列的內部指標到它的第一個元素

語法 : mixed reset(array array);

說明 :

reset( )重設陣列的內部指標到它的第一個元素。

reset( )傳回陣列的第一個元素的值。

參考 : current( ) each( ) next( ) prev( )


陣列函式庫 -- rsort

陣列函式庫

rsort

(PHP3 , PHP4)

rsort --- 將陣列的值由z-a重排

語法 : void rsort(array array);

說明 :

此函式將陣列的值由z-a重新排列。

Example :

<?php

$fruits = array("lemon","orange","banana","apple");

rsort($fruits);

reset($fruits);

for ($i=0; $i<count($fruits);$i++ ){

echo "fruits[$i] = ".$fruits[$i]."<br>";

}

?>

此範例的結果將會產生 :

fruits[0] = orange

fruits[1] = lemon

fruits[2] = banana

fruits[3] = apple

fruits排列成由z-a的順序

參考 : arsort( ) asort( ) ksort( ) sort( ) usort( )


陣列函式庫 -- shuffle

陣列函式庫

shuffle

(PHP3 >= 3.0.8 , PHP4 >= 4.0b4)

shuffle --- 將陣列的順序弄混

語法 : void shuffle(array array);

說明 :

此函式將陣列的元素順序任意排序。

Example :

<?php

$numbers = range(1,20);

srand(time());

shuffle($numbers);

while (list(,$number) = each($numbers)) {

echo "$number ";

}

?>

參考
  : arsort( )  asort( )
  ksort( )  rsort( )
  sort( )  usort( )


陣列函式庫 -- sizeof

陣列函式庫

sizeof

(PHP3 , PHP4)

sizeof --- 取得陣列中元素的數目

語法 : int sizeof(array array);

說明 :

傳回陣列中元素的數目。

參考 : count( )


陣列函式庫 -- sort

陣列函式庫

sort

(PHP3 , PHP4)

sort --- 將陣列的值由a-z重排

語法 : void sort(array array [, int sort_flags] );

說明 :

此函式會將陣列的元素由a-z排列。

Example :

<?php

$fruits = array("lemon","orange","banana","apple");

sort($fruits);

for(reset($fruits); $key = key($fruits); next($fruits)) {

echo "fruits[$key] = ".$fruits[$key]."\n";

}

?>

此範例的結果將會產生出 :

fruits[0] = apple

fruits[1] = banana

fruits[2] = lemon

fruits[3] = orange

fruits排列成由a-z的順序

非必需的第二個參數sort_flags可以使用下列這些值來改變排序的變化:

排序型態旗標:

SORT_REGULAR - 正常的比較項目

SORT_NUMERIC - 以數字比較項目

SORT_STRING - 看作是字串來比較項目

參考
  : arsort( )  asort( )
  ksort( )  rsort( )
  usort( )


陣列函式庫 -- uasort

陣列函式庫

uasort

(PHP3 >= 3.0.4 , PHP4)

uasort --- 依使用者定義的函式排序且維持索引值與元素的關係

語法 : void uasort(array array, function cmp_function);

說明 :

此函式能依使用者定義的函式將陣列重新排序，而陣列的索引值與元素仍然保持原來的關係。

參考usort( ) uksort( )有使用範例

參考
  : usort( )  uksort(
  )  sort( )  asort(
  )  arsort( )  ksort(
  )  rsort( )


陣列函式庫 -- uksort

陣列函式庫

uksort

(PHP3 >= 3.0.4 , PHP4)

uksort --- 依使用者定義的函式將陣列的索引值排序

語法 : void uksort(array array, function cmp_function);

說明 :

此函式會依照使用者定義的函式將陣列的索引值重新排序。

Example :

<?php

function mycompare($a, $b) {

if ($a == $b) return 0;

return ($a > $b) ? -1 : 1;

}

$a = array(4 => "four", 3 => "three", 20 => "twenty", 10 => "ten");

uksort($a, mycompare);

while(list($key, $value) = each($a)) {

echo "$key: $value\n";

}

?>

此範例的結果將會產生出 :

20: twenty 10: ten 4: four 3: three

參考
  : arsort( )  asort( )
  uasort( )  ksort( )
  rsort( )  sort( )


陣列函式庫 -- usort

陣列函式庫

usort

(PHP3 >= 3.0.3 , PHP4)

usort --- 依使用者定義的函式將陣列的值排序

語法 : void usort(array array, function cmp_function);

說明 :

此函式會依照使用者定義的函式將陣列的值重新排序。

Example :

<?php

function cmp($a,$b) {

if ($a == $b) return 0;

return ($a > $b) ? -1 : 1;

}

$a = array(3,2,5,6,1);

usort($a, cmp);

while(list($key,$value) = each($a)) {

echo "$key: $value\n";

}

?>

此範例的結果將會產生出 :

0: 6 1: 5 2: 3 3: 2 4: 1

參考
  : uasort( )  uksort( )
  sort( )   asort( )
  arsort( )   ksort( )  rsort( )


拼字檢查函式庫 -- aspell_check

拼字檢查函式庫

aspell_check

(PHP3 >= 3.0.7 , PHP4)

aspell_check --- 檢查一單字

語法 : boolean aspell_check(int dictionary_link, string word);

說明 :

Aspell_check( )檢查一單字的拼法，若拼法是正確的則傳回true，若是錯誤的則傳回false。

Example :

<?php

$aspell_link=aspell_new("english");

if (aspell_check($aspell_link,"testt")) {

          echo
  "This is a valid spelling";

}
  else {

echo "Sorry, wrong spelling";

}

?>


拼字檢查函式庫 -- aspell_check-raw

拼字檢查函式庫

aspell_check-raw

(PHP3 >= 3.0.7 , PHP4)

aspell_check-raw --- 檢查一單字不改變它的事實或試著去修改它

語法 : boolean aspell_check_raw(int dictionary_link, string word);

說明 :

Aspell_check-raw( )檢查一個單字的拼法，不改變它的事實或試著去修改它，若拼法是正確的則傳回true，若是錯誤的則傳回false。

Example :

<?php

$aspell_link=aspell_new("english");

if (aspell_check_raw($aspell_link,"testt")) {

echo "This is a valid spelling";

} else {

echo "Sorry, wrong spelling";

}

?>


拼字檢查函式庫 -- aspell_new

拼字檢查函式庫

aspell_new

(PHP3 >= 3.0.7 , PHP4)

aspell_new --- 載入一個新辭典

語法 : int aspell_new(string master, string personal);

說明 :

Aspell_new( )開放一個新辭典且傳回辭典連結identifier給其它拼字函式使用。

Example :

<?php

$aspell_link=aspell_new("english");

?>


拼字檢查函式庫 -- aspell_suggest

拼字檢查函式庫

aspell_suggest

(PHP3 >= 3.0.7 , PHP4)

aspell_suggest --- 建議單字的拼法

語法 : array aspell_suggest(int dictionary_link, string word);

說明 :

Aspell_suggest( )將單字可能的拼法放入陣列變數中傳回。

Example :

<?php

$aspell_link=aspell_new("english");

if (!aspell_check($aspell_link,"testt")) {

        $suggestions=aspell_suggest($aspell_link,"testt");

for($i=0;
  $i < count($suggestions); $i++) {

echo "Possible spelling:
  " . $suggestions[$i] . "<br>";

}

}

?>


曆法函式庫 -- easter_date

曆法函式庫

easter_date

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC2)

easter_date --- 計算復活節日期

語法 : int easter_date(int year);

說明 :

輸入某一年份，則以UNIX時間戳記的格式傳回此年的復活節日期，若無輸入年份，則記算當年的復活節日期，輸入的年份必需介於1970到2037年之間。

Example :

<?php

echo date( "M-d-Y", easter_date(1999) ); /* "Apr-04-1999" */

echo date( "M-d-Y", easter_date(2000) ); /* "Apr-23-2000" */

echo date( "M-d-Y", easter_date(2001) ); /* "Apr-15-2001" */

?>

參考 : easter_days( )


曆法函式庫 -- easter_days

曆法函式庫

easter_days

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC2)

easter_days --- 計算復活節與3月21日間的天數

語法 : int easter_days(int year);

說明 :

此函式會傳回輸入的那一年份復活節和3月21日之間的天數，若無指定年份，則以當年計算。

此函式可用來替代easter_date( )計算UNIX範圍之外的年份(例如 : 1970年之前或2037年之後)

Example :

<?php

echo easter_days(1999); /* 14, i.e. April 4 */

echo easter_days(1492); /* 32, i.e. April 22 */

echo easter_days(1913); /* 2, i.e. March 23 */

?>

參考 : easter_date( )


曆法函式庫 -- FrenchToJD

曆法函式庫

FrenchToJD

(PHP3 , PHP4)

FrenchToJD --- 轉換法國共和曆法日期為凱撒日計數

語法 : int frenchtojd(int month, int day, int year);

說明 :

轉換法國共和曆法日期為凱撒日計數。此函式只能轉換法國共和曆法1年到14年，相當於格里高里曆法1792年9月22日到1806年9月22日。


曆法函式庫 -- GregorianToJD

曆法函式庫

GregorianToJD

(PHP3 , PHP4)

GregorianToJD --- 轉換格里高里曆法為凱撒日計數

語法 : int gregoriantojd(int month, int day, int year);

說明 :

格里高里曆法有效的範圍是西元前4714年到西元9999年。僅管這個軟體能處理到西元前4714年的日期，但確沒什麼意義。格里高里曆法在西元1582年10月15日創立（凱撒曆法為西元1582年10月5日），有些國家在稍晚時才開始接受，例如：英國在西元1752年，蘇聯在西元1918年，希臘在西元1923年，多數的歐洲國家先使用凱撒曆法進而使用格里高里曆法。

Example :

<?php

$jd = GregorianToJD(10,11,1970);

echo("$jd\n");

$gregorian = JDToGregorian($jd);

echo("$gregorian\n");

?>


曆法函式庫 -- JDDayOfWeek

曆法函式庫

JDDayOfWeek

(PHP3 , PHP4)

JDDayOfWeek --- 傳回日期在當週的天數

語法 : mixed jddayofweek(int julianday, int mode);

說明 :

傳回日期在當週的天數。參數mode能決定傳回字串或是整數，mode為以下的值：

mode

含義

0

傳回日期數目為整數，0=星期日、1=星期一...等等

1

傳回英文星期幾的字串 (英文-格里高里)

2

傳回英文星期幾的縮寫字串 (英文-格里高里)


曆法函式庫 -- JDMonthName

曆法函式庫

JDMonthName

(PHP3 , PHP4)

JDMonthName --- 傳回月份名稱

語法 : string jdmonthname(int julianday, int mode);

說明 :

傳回月份的名稱。參數mode用來告訴此函式以那一種曆法來轉換凱撒日計數，且傳回何種型態的月份名稱。mode為以下的值：

mode

含義

0

格里高里曆法-縮寫

1

格里高里曆法

2

凱撒曆法-縮寫

3

凱撒曆法

4

猶太曆法

5

法國共和曆法


曆法函式庫 -- JDToFrench

曆法函式庫

JDToFrench

(PHP3 , PHP4)

JDToFrench --- 轉換凱撒日計數為法國共和曆法

語法 : string jdtofrench(int month, int day, int year);

說明 :

轉換凱撒日計數為法國共和曆法。


曆法函式庫 -- JDToGregorian

曆法函式庫

JDToGregorian

(PHP3 , PHP4)

JDToGregorian --- 轉換凱撒日計數為格里高里曆法

語法 : string jdtogregorian(int julianday);

說明 :

轉換凱撒日計數（Julian Day Count）為格里高里曆法（Gregorian date），傳回的字串為"month/day/year"。


曆法函式庫 -- JDToJewish

曆法函式庫

JDToJewish

(PHP3 , PHP4)

JDToJewish --- 轉換凱撒日計數為猶太曆法

語法 : string jdtojewish(int julianday);

說明 :

轉換凱撒日計數為猶太曆法。


曆法函式庫 -- JDToJulian

曆法函式庫

JDToJulian

(PHP3 , PHP4)

JDToJulian --- 轉換凱撒日計數為凱撒曆法

語法 : string jdtojulian(int julianday);

說明 :

轉換凱撒日計數為凱撒曆法，傳回的字串為"month/day/year"。


曆法函式庫 -- JewishToJD

曆法函式庫

JewishToJD

(PHP3 , PHP4)

JewishToJD --- 轉換猶太曆法日期為凱撒日計數

語法 : int jewishtojd(int month, int day, int year);

說明 :

這個軟體能處理的有效範圍為西元前3761年，但確沒什麼意義。猶太曆法已使用數千年之久，但在早期的時候沒有準則來決定月份的起始，第一個月為首次觀測到的新月。


曆法函式庫 -- JulianToJD

曆法函式庫

JulianToJD

(PHP3 , PHP4)

JulianToJD --- 轉換凱撒曆法為凱撒日計數

語法 : int juliantojd(int month, int day, int year);

說明 :

凱撒曆法的有效範圍是西元前4713年到西元9999年。僅管這個軟體能處理到西元前4713年的日期，但確沒什麼意義。凱撒曆法在西元前46年創立，直到西元8年細節才穩定下來。


類別和物件函式庫 -- call_user_method

類別和物件函式庫

call_user_method

(PHP3 >= 3.0.3 , PHP4)

call_user_method --- 在一個指定的物件上呼叫指定的方法

語法 : mixed call_user_method (string method_name, object obj [, mixed parameter [, mixed ...]])

說明 :

從使用者定義的物件 obj來呼叫方法 method_name。下面是使用的範例，我們定義一個物件，說明如何使用call_user_method( )來間接地呼叫方法 print_info。

Example :

<?php

class Country {

var $NAME;

var $TLD;

function Country($name, $tld) {

$this->NAME = $name;

$this->TLD = $tld;

}

function print_info($prestr="") {

echo $prestr."Country: ".$this->NAME."\n";

echo $prestr."Top Level Domain: ".$this->TLD."\n";

}

}

$cntry = new Country("Peru","pe");

echo "* Calling the object method directly\n";

$cntry->print_info();

echo "\n* Calling the same method indirectly\n";

call_user_method ("print_info", $cntry, "\t");

?>

參考 : call_user_func( )


類別和物件函式庫 -- class_exists

類別和物件函式庫

class_exists

(PHP4 >= 4.0b4)

class_exists --- 檢查類別是否已經定義

語法 : bool class_exists (string class_name)

說明 :

如果類別 class_name已經定義了，則此函式會傳回 true，否則傳回 false。


類別和物件函式庫 -- get_class

類別和物件函式庫

get_class

(PHP4 >= 4.0b2)

get_class --- 傳回物件的類別名稱

語法 : string get_class (object obj)

說明 :

此函式傳回物件 obj的類別名稱，obj是個實體(instance)。

參考 : get_parent_class( ) is_subclass_of( )


類別和物件函式庫 -- get_class_methods

類別和物件函式庫

get_class_methods

(PHP4 >= 4.0RC1)

get_class_methods --- 傳回類別中方法的名稱

語法 : array get_class_methods (string class_name)

說明 :

此函式傳回定義在類別 class_name的方法的名稱，傳回的是一個陣列。

參考 : get_class_vars( ) get_object_vars( )


類別和物件函式庫 -- get_class_vars

類別和物件函式庫

get_class_vars

(PHP4 >= 4.0RC1)

get_class_vars --- 傳回類別預設的屬性

語法 : array get_class_vars (string class_name)

說明 :

此函式傳回類別預設的屬性，傳回的是一個陣列。

參考 : get_class_methods( ) get_object_vars( )


類別和物件函式庫 -- get_declared_classes

類別和物件函式庫

get_declared_classes

(PHP4 >= 4.0RC2)

get_declared_classes --- 傳回聲明的類別的名稱

語法 : array get_declared_classes (void)

說明 :

此函式傳回在目前的程式中，聲明的類別的名稱，傳回的是一個陣列。

注意 : 在PHP 4.0.1pl2中，會有三個額外的類別傳回到陣列的開頭 : stdClass(定義在 Zend/zend.c)、overloadedTestClass(定義在ext/standard/basic_functions.c)和 Directory(定義在 ext/standard/dir.c)


類別和物件函式庫 -- get_object_vars

類別和物件函式庫

get_object_vars

(PHP4 >= 4.0RC1)

get_object_vars --- 傳回物件的屬性

語法 : array get_object_vars (object obj)

說明 :

此函式傳回物件 obj的屬性，傳回的是一個陣列。

參考 : get_class_methods( ) get_class_vars( )


類別和物件函式庫 -- get_parent_class

類別和物件函式庫

get_parent_class

(PHP4 >= 4.0b2)

get_parent_class --- 傳回物件的父類別名稱

語法 : string get_parent_class (object obj)

說明 :

此函式傳回物件 obj的父類別名稱，obj是個實體(instance)。

參考 : get_class( ) is_subclass_of( )


類別和物件函式庫 -- is_subclass_of

類別和物件函式庫

is_subclass_of

(PHP4 >= 4.0b4)

is_subclass_of --- 判斷物件是否屬於類別的子類別

語法 : bool is_subclass_of (object obj, string superclass)

說明 :

如果物件 obj是屬於 superclass的子類別時，此函式會傳回 true，否則傳回 false。

參考 : get_class( ) get_parent_class( )


類別和物件函式庫 -- method_exists

類別和物件函式庫

method_exists

(PHP4 >= 4.0b2)

method_exists --- 檢查類別的方法是否存在

語法 : bool method_exists (object object, string method_name)

說明 :

如果方法 method_name已經定義在 object裡，則此函式會傳回 true，否則傳回 false。


COM函式庫 -- com_get

COM函式庫

com_get

(PHP4)

com_get --- 取得COM屬性的值

語法 : mixed com_get (resource com_object, string property)

說明 :

傳回COM com_object的屬性 property的值，錯誤則傳回 false。


COM函式庫 -- com_invoke

COM函式庫

com_invoke

(PHP4)

com_invoke --- 呼叫COM的方法

語法 : mixed com_invoke (resource com_object, string function_name [, mixed function parameters, ...])

說明 :

com_invoke( )請求一個COM com_object的方法，錯誤則傳回 false，成功則傳回 function的值。


COM函式庫 -- com_load

COM函式庫

com_load

(PHP4)

com_load --- 建立新的COM

語法 : string com_load (string module name [, string server name])

說明 :

com_load( )建立新的COM，並且傳回它的關聯，錯誤則傳回 false。


COM函式庫 -- com_propget

COM函式庫

com_propget

(PHP4)

com_propget --- 取得COM屬性的值

語法 : mixed com_propget (resource com_object, string property)

說明 :

此函式是com_get( )的別名。


COM函式庫 -- com_propput

COM函式庫

com_propput

(PHP4)

com_propput --- 分配值給COM的屬性

語法 : void com_propput (resource com_object, string property, mixed value)

說明 :

此函式是com_set( )的別名。


COM函式庫 -- com_propset

COM函式庫

com_propset

(PHP4)

com_propset --- 分配值給COM的屬性

語法 : void com_propset (resource com_object, string property, mixed value)

說明 :

此函式是com_set( )的別名。


COM函式庫 -- com_set

COM函式庫

com_set

(PHP4)

com_set --- 分配值給COM的屬性

語法 : void com_set (resource com_object, string property, mixed value)

說明 :

設定COM com_object的屬性 property的值，成功則傳回 true，失敗則傳回 false。


日期與時間函式庫 -- checkdate

日期與時間函式庫

checkdate

(PHP3 , PHP4)

checkdate --- 有效的日期/時間

語法 : int checkdate (int month, int day, int year)

說明 :

如果給予的日期是有效的則傳回true ; 否則傳回false。依照參數來檢查日期的形式是否正確，有效的範圍為：

年－介於0至32767

月－介於1至12

日－給予的month允許的範圍內的日數，會考慮到閏年的變化


日期與時間函式庫 -- date

日期與時間函式庫

date

(PHP3 , PHP4)

date --- 將本地的時間/日期格式化

語法 : string date (string format [, int timestamp])

說明 :

使用給予的timestamp按照格式化字串傳回一格式化字串，如果沒有給予timestamp則使用本地的時間。

以下是格式化字串中認定的字元：

  • a - "am" 或 "pm"

  • A - "AM" 或 "PM"

  • B - 網際網路時間樣本

  • d - 幾日，例如：" 01" 到 " 31"

  • D - 幾日，以3個英文字表示，例如：" Fri "

  • F - 幾月，以英文全名表示，例如：" January "

  • g - 小時，12小時制不足2位數不補0，例如：" 1" 到 " 12 "

  • G - 小時，24小時制不足2位數不補0，例如：" 0 " 到 " 23 "

  • h - 小時，12小時制，例如：" 01" 到 " 12 "

  • H - 小時，24小時制，例如：" 00 " 到 " 23 "

  • i - 幾分，例如：" 00 " 到 " 59 "

  • I (大寫的 i) - "1" if Daylight Savings Time, "0" otherwise.

  • j - 幾日，不足2位數不補0，例如：" 1" 到 " 31"

  • l (小寫的 'L') - 幾日，以英文全名表示，例如："Friday"

  • L - 布林值，判斷是否為閏年，例如：" 0" 或 " 1"

  • m - 幾月，例如：" 01" 到 " 12"

  • M - 幾月，以3個英文字表示，例如："Jan"

  • n - 幾月，不足2位數不補0，例如：" 1" 到 "12"

  • s - 幾秒，例如：" 01" 到 " 59"

  • S - 以英文後2個字表示，例如："th"，"nd"

  • t - 當月的天數，例如：" 28" 到 " 31"

  • T - 這個機器的時間區域設定，例如 ："MDT"

  • U - 總秒數

  • w - 以數字表示星期幾，例如：" 0" 到 " 6"

  • Y - 幾年，以4位數表示，例如：" 1999"

  • y - 幾年，以2位數表示，例如："99"

  • z - 一年中的第幾天，例如：" 0" 到 " 365"

  • Z - 在短時間內時間區域補償(timezone offset) ，例如："-43200" to "43200"

在格式化字串中未被認出的字元將會被列出來，當使用gmdate( )時"Z"格式將總是傳回"0"。

Example :

<?php

print (date ("l dS of F Y h:i:s A"));

print ("July 1, 2000 is on a " . date ("l", mktime(0,0,0,7,1,2000)));

?>

它可能會和date( )與mktime( )一起使用，來找出是將來或是過去的日期。

Example :

<?php

$tomorrow = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));

$lastmonth = mktime (0,0,0,date("m")-1,date("d"), date("Y"));

$nextyear = mktime (0,0,0,date("m"), date("d"), date("Y")+1);

?>

將日期格式化成其它的語言(languages)，你應該使用setlocal( )和strftime( )函式。


日期與時間函式庫 -- getdate

日期與時間函式庫

getdate

(PHP3 , PHP4)

getdate --- 取得日期/時間資訊

語法 : array getdate (int timestamp)

說明 :

傳回組合的陣列，包含了timestamp的日期資訊，下列為陣列的元素：

  • "seconds" - 秒

  • "minutes" - 分

  • "hours" - 小時

  • "mday" - 月份的天數

  • "wday" - 星期的天數，數字的

  • "mon" - 月份，數字的

  • "year" - 年，數字的

  • "yday" - 年的天數，數字的，例如：" 299"

  • "weekday" - 星期的天數，文字的，例如："Friday"

  • "month" - 月份，文字的，例如：" January"


日期與時間函式庫 -- gettimeofday

日期與時間函式庫

gettimeofday

(PHP3 >=3.0.7 , PHP4 >= 4.0b4)

gettimeofday --- 取得目前的時間

語法 : array gettimeofday (void)

說明 :

這是個gettimeofday(2)的介面，它從呼叫系統傳回一包含了資料的組合陣列。

  • "sec" - 秒

  • "usec" - 百萬分之一秒

  • "minuteswest" - 分，格林威治時間

  • "dsttime" - dst的型態修正


日期與時間函式庫 -- gmdate

日期與時間函式庫

gmdate

(PHP3 , PHP4)

gmdate --- 取得目前的時間

語法 : string gmdate (string format, int timestamp)

說明 :

和date( )相同，不同處在於這個函式傳回的是格林威治標準時間，例如當以下範例在芬蘭(GMT + 0200)執行時，下面的第一行會列出"Jan 01 1998 00:00:00"，第二行會列出"Dec 31 1997 22:00:00"。

Example :

<?php

echo date ("M d Y H:i:s", mktime (0,0,0,1,1,1998));

echo gmdate ("M d Y H:i:s", mktime (0,0,0,1,1,1998));

?>

參考 : date( ) mktime( ) gmmktime( )


日期與時間函式庫 -- gmmktime

日期與時間函式庫

gmmktime

(PHP3 , PHP4)

gmmktime --- 取得UNIX時間戳記的格林威治時間

語法 : int gmmktime (int hour, int minute, int second, int month, int day, int year [, int is_dst])

說明 :

和mktime( )相同，不同處在於參數是格林威治時間。


日期與時間函式庫 -- gmstrftime

日期與時間函式庫

gmstrftime

(PHP3 >= 3.0.12 , PHP4 >= 4.0RC2)

gmstrftime --- 按照場所設定將格林威治時間/日期格式化

語法 : string gmstrftime (string format, int timestamp)

說明 :

作用與strftime( )相同，不同處在於這個函式傳回的時間是格林威治標準時間，例如當執行在東部的標準時間(GMT -0500)時，下面的第一行會列出"Dec 31 1998 20:00:00"，第二行會列出"Jan 01 1999 01:00:00"。

Example :

<?php

setlocale ('LC_TIME', 'en_US');

echo strftime ("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n";

echo gmstrftime ("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n";

?>

參考 : strftime( )


日期與時間函式庫 -- localtime

日期與時間函式庫

localtime

(PHP4 >= 4.0RC2)

localtime --- 取得當地時間

語法 : array localtime ([int timestamp [, bool is_associative]])

說明 :

localtime( )傳回一組合陣列，localtime( )的第一個參數是個timestamp，如果沒有給予則使用目前時間，如果將第二個參數設為0或者是沒有提供這個參數時，會傳回一正常的陣列，以數字表示陣列的索引值，如果設為1則localtime( )傳回一組合陣列，包含了個別的結構化的元素，下列是組合陣列的個別元素的名稱：

  • "tm_sec" - 秒

  • "tm_min" - 分

  • "tm_hour" - 時

  • "tm_mday" - 月份的天數

  • "tm_mon" - 年的月份

  • "tm_year" - 年， 不順從y2k

  • "tm_wday" - 星期的天數

  • "tm_yday" - 年的天數

  • "tm_isdst" - 在實行中是否為dst(daylight savings time)


日期與時間函式庫 -- microtime

日期與時間函式庫

microtime

(PHP3 , PHP4)

microtime --- 傳回目前UNIX時間戳記的百萬分之一秒

語法 : string microtime(void);

說明 :

傳回一字串"msec sec"，sec是從Unix時期(0:00:00 January 1, 1970 GMT)到現在的總秒數，當作業系統提供gettimeofday( )系統呼叫時此函式才有效。

參考 : time( )


日期與時間函式庫 -- mktime

日期與時間函式庫

mktime

(PHP3 , PHP4)

mktime --- 取得日期的UNIX時間戳記

語法 : int mktime (int hour, int minute, int second, int month, int day, int year [, int is_dst])

說明 :

警告 : 此函式參數的順序和正規的Unix mktime( )中參數的順序不同，且不提供由右到左來省略參數，這是程式中常見的錯誤。

給予參數則傳回Unix時間戳記，此時間戳記是介於Unux時期(January 1 1970)與所指定的時間的總秒數，傳回的時間戳記是個長整數。

參數可以由右到左的順序中省略，任何參數以此方式省略時，將會被依照本地日期與時間設定成目前的值。

如果時間是在dst(daylight savings time)的整個期間，is_dst可以設為1；如果不是則設為0；如果不知道是否時間是在dst(daylight savings time)範圍內，則設為 -1(預設)。

注意 : is_dst增加於 3.0.10.

mktime( )有助於日期的計算與確認，它會自動地計算正確的值，例如 : 下列各行都將產生出字串"Jan-01-1998"。

Example :

<?php

echo date ("M-d-Y", mktime (0,0,0,12,32,1997));

echo date ("M-d-Y", mktime (0,0,0,13,1,1997));

echo date ("M-d-Y", mktime (0,0,0,1,1,1998));

echo date ("M-d-Y", mktime (0,0,0,1,1,98));

?>

year可以是二或是四個數字的值，值的範圍是0-69、2000-2069及70-99、1970-1999。

下個月的最後一天可由任何給予的月份表達成"0"來表示，下列範例都將產生出字串"The last day in Feb 2000 is: 29"。

Example :

<?php

$lastday = mktime (0,0,0,3,0,2000);

echo strftime ("Last day in Feb 2000 is: %d", $lastday);

$lastday = mktime (0,0,0,4,-31,2000);

echo strftime ("Last day in Feb 2000 is: %d", $lastday);

?>

參考 : date( ) time( )


日期與時間函式庫 -- strftime

日期與時間函式庫

strftime

(PHP3 , PHP4)

strftime --- 按照場所設定將本地時間/日期格式化

語法 : string strftime (string format [, int timestamp])

說明 :

依照給予的格式化字串使用給予的timestamp傳回一格式化字串，如果沒有給予timestamp則使用目前本地時間，月份和星期幾的(weekday)名稱及其它語言(language)取決於setlocale( )。

以下是格式化字串中認定的轉換 :

  • %a - 星期幾的縮寫 ，取決於目前場所(current locale)

  • %A - 星期幾的全名，取決於目前場所(current locale)

  • %b - 幾月的縮寫，取決於目前場所(current locale)

  • %B - 幾月的全名，取決於目前場所(current locale)

  • %c - 目前場所(current locale)喜好的日期與時間表示

  • %C - 百年數字 (年被100分離且縮短成整數，範圍從 00到 99)

  • %d - 十進制的月份的天數 (範圍從 00到 31)

  • %D - 和 %m/%d/%y相同

  • %e - 十進制的月份的天數，前面加上空白鍵 (範圍從 ' 1'到 '31')

  • %h - 和 %b相同

  • %H - 使用24小時制表示小時數 (範圍從 00到 23)

  • %I - 使用12小時制表示小時數 (範圍從 01到12)

  • %j - 十進制的年的天數(範圍從 001到366)

  • %m - 十進制的月份 (範圍從1到 12)

  • %M - 十進制的分鐘

  • %n - 新行字元

  • %p - 根據給予的時間顯示 `am' or `pm'

  • %r - a.m.和p.m.的時間標記法

  • %R - 24小時的時間標記法

  • %S - 十進制的秒數

  • %t - tab字元

  • %T - 目前時間，等於 %H:%M:%S

  • %u - 十進制的星期幾 [1,7]，1 表示 Monday

  • %U - 十進制的年的第幾個星期，從第一個星期的第一個星期日算起

  • %V - ISO 8601:1988十進制的目前年份的星期數目，範圍從 01到 53，在此年份中至少有四個週一的星期為第一個星期，且星期一為第一天

  • %W - 十進制的年份的第幾個星期，從第一個星期的第一個星期一算起

  • %w - 十進制的星期的第幾天l，Sunday為 0

  • %x - 目前場所(current locale)喜好的日期表示，沒有時間

  • %X - 目前場所(current locale)喜好的時間表示，沒有日期

  • %y - 十進制的年份(範圍從 00到 99)

  • %Y - 十進制的年份(四位數)

  • %Z - 時間區域或是名稱或是縮寫的

  • %% - 一個 `%'字元

Example :

<?php

setlocale ("LC_TIME", "C");

print (strftime ("%A in Finnish is "));

setlocale ("LC_TIME", "fi_FI");

print (strftime ("%A, in French "));

setlocale ("LC_TIME", "fr_CA");

print (strftime ("%A and in German "));

setlocale ("LC_TIME", "de_DE");

print (strftime ("%A.\n"));

?>

如果在你的系統有安裝各別的場所(locale)，此範例會運作

參考 : setlocale( ) mktime( )


日期與時間函式庫 -- strtotime

日期與時間函式庫

strtotime

(PHP3 >= 3.0.12 , PHP4 >= 4.0b2)

strtotime --- 剖析任何英文的日期時間成為UNIX時間戳記

語法 : int strtotime (string time [, int now])

說明 :

給予此函式一包含英文日期格式的字串，將會試著去剖析此字串成為UNIX時間戳記

Example :

<?php

echo strtotime ("10 march 2000") . "\n";

?>


日期與時間函式庫 -- time

日期與時間函式庫

time

(PHP3 , PHP4)

time --- 傳回目前UNIX時間戳記

語法 : int time(void);

說明 :

傳回從Unix時期(January 1 1970 00:00:00 GMT)到現在的總秒數。

參考 : date( )


目錄函式庫 -- chdir

目錄函式庫

chdir

(PHP3 , PHP4)

chdir --- 變更目錄

語法 : int chdir(string directory);

說明 :

變更PHP現在目錄到directory。無法變更目錄時則傳回false，否則則傳回ture。


目錄函式庫 -- closedir

目錄函式庫

closedir

(PHP3 , PHP4)

closedir --- 關閉目錄處理

語法 : void closedir (int dir_handle);

說明 :

關閉參數dir_handle指示的目錄流(stream)，dir_handle指示的目錄流必須是先前以opendir( )所開啟的。


目錄函式庫 -- dir

目錄函式庫

dir

(PHP3 , PHP4)

dir --- 目錄類別

語法 : new dir(string directory);

說明 :

一個類似物件導向的類別物件，用來讀取目錄。在參數directory中給予一個已開啟的directory，一旦目錄開啟後則有handle、path這二個屬性可使用，handle屬性能讓其它的目錄函式所使用，例如readdir()、rewinddir()、closedir()，而path屬性是設定目錄開啟後的路徑。使用此函式後有三個方法可以使用：read、rewind、close。

Example :

<?php

$d = dir("/etc");

echo "Handle: ".$d->handle."<br>\n";

echo "Path: ".$d->path."<br>\n";

while($entry=$d->read()) {

echo $entry."<br>\n";

}

$d->close();

?>


目錄函式庫 -- opendir

目錄函式庫

opendir

(PHP3 , PHP4)

opendir --- 開啟目錄處理

語法 : int opendir(string path);

說明 :

開啟之後能讓closedir( )、readdir( )、rewinddir( )所使用。


目錄函式庫 -- readdir

目錄函式庫

readdir

(PHP3 , PHP4)

readdir --- 讀取目錄處理

語法 : string readdir(int dir_handle);

說明 :

從目錄傳回下一個檔案的檔案名稱，傳回不依照任何特殊順序的檔案名稱。

Example :

<?php

$handle=opendir('.');

echo "Directory handle: $handle\n";

echo "Files:\n";

while ($file = readdir($handle)) {

echo "$file\n";

}

closedir($handle);

?>


目錄函式庫 -- rewinddir

目錄函式庫

rewinddir

(PHP3 , PHP4)

rewinddir --- 重設目錄處理

語法 : void rewinddir(int dir_handle);

說明 :

重設參數dir_handle指示的目錄流到目錄的開始處。


動態載入函式庫 -- dl

動態載入函式庫

dl

(PHP3 , PHP4)

dl --- 載入PHP擴充模組

語法 : int dl (string library)

說明 :

動態載入PHP擴充模組library。


檔案系統函式庫 -- basename

檔案系統函式庫

basename

(PHP3 , PHP4)

basename --- 傳回不包含路徑的檔案名稱

語法 : string basename (string path)

說明 :

給予一個包含路徑的檔案名稱，此函式將會傳回不包含路徑的檔案名稱。

在Windows中路徑可以是斜線（/）或反斜線（\），在UNIX系統中路徑為斜線（/）。

Example :

<?php

$path = "/home/httpd/html/index.php3";

$file = basename ($path); // $file is set to "index.php3"

?>

參考 : dirname( )


檔案系統函式庫 -- chgrp

檔案系統函式庫

chgrp

(PHP3 , PHP4)

chgrp --- 變更檔案所屬的群組

語法 : int chgrp (string filename, mixed group)

說明 :

試著將檔案filename的群組變更成group，只有管理者(superuser) 才能任意地改變檔案的群組，其它的使用者只能改變本身的檔案。

成功則傳回true，否則傳回false。

注意 : 此函式不能運作在Windows系統。

參考 : chown( ) chmod( )


檔案系統函式庫 -- chmod

檔案系統函式庫

chmod

(PHP3 , PHP4)

chmod --- 改變檔案的屬性

語法 : int chmod (string filename, int mode)

說明 :

試著去改變指定的檔案filename的屬性成為mod。

注意 : 此mode並不會自動地假定是八進制的值，所以像是"g+w"這樣的字串將不被運作，為了確保正確的運作，你須要在mode前面加上0(zero)。

Example :

<?php

chmod ("/somedir/somefile", 755); // decimal; probably incorrect

chmod ("/somedir/somefile", "u+rwx,go+rx"); // string; incorrect

chmod ("/somedir/somefile", 0755); // octal; correct value of mode

?>

成功則傳回true，否則傳回false。

注意 : 此函式不能運作在Windows系統。

參考 : chown( ) chgrp( )


檔案系統函式庫 -- chown

檔案系統函式庫

chown

(PHP3 , PHP4)

chown --- 改變檔案的擁有者

語法 : int chown (string filename, mixed user)

說明 :

試著去改變檔案filename的擁有者為使用者user。只有管理者(superuser)可以改變檔案的擁有者。

成功則傳回true，否則傳回false。

注意 : 此函式不能運作在Windows系統。

參考 : chown( ) chmod( )


檔案系統函式庫 -- clearstatcache

檔案系統函式庫

clearstatcache

(PHP3 , PHP4)

clearstatcache --- 清除檔案狀態快取

語法 : void clearstatcache(void);

說明 :

使用stat()及lstat()是相當耗資源的，因此，會將任何狀態(status)函式最後呼叫的結果儲存起來，以便下次使用相同檔名呼叫時可以使用。如果你希望迫使一個新的狀態核對(check)，例如 : 如果檔案是存在(being)核對許多時間，而且可能改變或是消失，使用此函式從記憶體清除最後呼叫的結果。

受影響的函式包括了 : stat( )，lstat( )，file_exists( )，is_writeable( )，is_readable( )， is_executable( )，is_file( )，is_dir( )，is_link( )，filectime( )，fileatime( )，filemtime( )， fileinode( )，filegroup( )，fileowner( )，filesize( )，filetype( )，及 fileperms( )。


檔案系統函式庫 -- copy

檔案系統函式庫

copy

(PHP3 , PHP4)

copy --- 複製檔案

語法 : int copy (string source, string dest)

說明 :

複製檔案，成功則傳回true，否則傳回false。

Example :

<?php

if (!copy($file, $file.'.bak')) {

print ("failed to copy $file...<br>\n");

}

?>

參考 : rename( )


檔案系統函式庫 -- dirname

檔案系統函式庫

dirname

(PHP3 , PHP4)

dirname --- 傳回路徑的目錄名稱

語法 : string dirname (string path)

說明 :

給予一個包含路徑的檔名，此函式會傳回目錄的名稱。

在Windows中路徑可以是斜線( / )或反斜線( \ )，在UNIX系統中路徑為斜線( / )。

Example :

<?php

$path = "/etc/passwd";

$file = dirname ($path); // $file is set to "/etc"

?>

參考 : basename( )


檔案系統函式庫 -- diskfreespace

檔案系統函式庫

diskfreespace

(PHP3 >= 3.0.7 , PHP4 >= 4.0b4)

diskfreespace --- 傳回目錄中可用的空間

語法 : float diskfreespace (string directory)

說明 :

給予一個目錄，此函式會傳回目錄下可用的空間，單位為位元組(bytes)。

Example :

<?php

$df = diskfreespace("/"); // $df contains the number of bytes

// available on "/"

?>


檔案系統函式庫 -- fclose

檔案系統函式庫

fclose

(PHP3 , PHP4)

fclose --- 關閉已開啟的檔案指標

語法 : int fclose (int fp)

說明 :

關閉檔案指標 fp。

成功則傳回true，失敗則傳回false。

檔案指標必須是有效的，且是以fopen( )或 fsockopen( ) 成功開啟時的指標。


檔案系統函式庫 -- feof

檔案系統函式庫

feof

(PHP3 , PHP4)

feof --- 測試指標是否在檔案結束處

語法 : int feof (int fp)

說明 :

如果檔案指標是在檔案結束處(EOF)或是發生錯誤時則傳回true，否則傳回false。

檔案指標必須是有效的，且是以fopen( )、popen( )、 fsockopen( ) 成功開啟時的指標。


檔案系統函式庫 -- fgetc

檔案系統函式庫

fgetc

(PHP3 , PHP4)

fgetc --- 取得檔案指標所指的字元

語法 : string fgetc (int fp)

說明 :

從檔案指標 fp 傳回包含一個單一字元的字串，在檔案結束處時則傳回FALSE。

檔案指標必須是有效的，且是以fopen( )、popen( )、 fsockopen( ) 成功開啟時的指標。

參考
  : fread( )  fopen( )
  popen( )  fsockopen( )
  fgets( )


檔案系統函式庫 -- fgetcsv

檔案系統函式庫

fgetcsv

(PHP3 >= 3.0.8 , PHP4)

fgetcsv --- 從檔案指標取得行並且剖析CSV欄位

語法 : array fgetcsv (int fp, int length [, string delimiter])

說明 :

和fgets( )相似，不同處在於此函式是剖析所讀取行的CSV欄位資料，及將資料放在陣列中傳回，欄位的定義符號是個逗號，除非你在第三個參數中指定其它的定義符號。

檔案指標fp必須是有效的，且是以 fopen( ) 、popen( )、 fsockopen( ) 成功開啟時的指標。

length必須大於在CSV檔案中最長的行(允許超出行的末端)。

fgetcsv( )錯誤時或是在檔案結束處時則傳回false。

CSV檔案中若有空行則傳回的陣列中只有一個單一 null欄位，而且不會當作是錯誤。

Example :

<?php

$row = 1;

$fp = fopen ("test.csv","r");

while ($data = fgetcsv ($fp, 1000, ",")) {

$num = count ($data);

print "<p> $num fields in line $row: <br>";

$row++;

for ($c=0; $c<$num; $c++) {

print $data[$c] . "<br>";

}

}

fclose ($fp);

?>


檔案系統函式庫 -- fgets

檔案系統函式庫

fgets

(PHP3 , PHP4)

fgets --- 取得檔案指標所指的行

語法 : string fgets (int fp, int length)

說明 :

傳回檔案指標所在處length-1 位元組（bytes）長的字串，當length-1位元組（bytes）長的字串已經讀取，或是一個新行，或是在檔案結束處，讀取都會結束。

如果發生錯誤則傳回false。

常見的錯誤 :

人們使用fgets( )的C語言，應該注意到怎樣的EOF是傳回的的差異。

檔案指標必須是有效的，且是以fopen( )、popen( )、 fsockopen( ) 成功開啟時的指標。

Example :

<?php

$fd = fopen ("/tmp/inputfile.txt", "r");

while (!feof ($fd)) {

$buffer = fgets($fd, 4096);

echo $buffer;
}

fclose ($fd);

?>

參考
  : fread( )  fopen( )
  popen( )  fgetc( )
  fsockopen( )


檔案系統函式庫 -- fgetss

檔案系統函式庫

fgetss

(PHP3 , PHP4)

fgetss --- 取得檔案指標所指的行及去除HTML標籤

語法 : string fgetss (int fp, int length [, string allowable_tags])

說明 :

與 fgets( ) 相同，不同處在於此函式會試著去除所讀取檔案中，任何的HTML及PHP的標籤。

你可以使用參數allowable_tags來決定那個標籤不被去除。

注意 : allowable_tags在PHP 3.0.13，PHP4b3中新增。

參考
  :
  fgets( )  fopen( )
  fsockopen( )  popen( )
  strip_tags( )


檔案系統函式庫 -- file

檔案系統函式庫

file

(PHP3 , PHP4)

file --- 讀取檔案全部內容到陣列中

語法 : array file (string filename [, int use_include_path])

說明 :

與 readfile( ) 相同，不同處在於此函式是傳回陣列，各個陣列的元素相當於檔案中的行數。新行(newline)依舊是附屬的。

如果你想要在include_path中搜尋檔案，你可以使用第二個參數並且將它設為"1"。

<?php

// get a web page into an array and print it out

$fcontents = file ('http://www.php.net');

while (list ($line_num, $line) = each ($fcontents)) {

echo "<b>Line $line_num:</b> " . htmlspecialchars ($line) . "<br>\n";

}

// get a web page into a string

$fcontents = join ('', file ('http://www.php.net'));

?>

參考 : readfile( ) fopen( ) popen( )


檔案系統函式庫 -- file_exists

檔案系統函式庫

file_exists

(PHP3 , PHP4)

file_exists --- 檢查檔案是否存在

語法 : int file_exists (string filename)

說明 :

如果指定的檔案filename存在則傳回true，否則傳回false。

file_exists( )將不運作在遠端的檔案，要被檢查的檔案必須是可經由伺服器的檔案系可使用的檔案。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- fileatime

檔案系統函式庫

fileatime

(PHP3 , PHP4)

fileatime --- 取得檔案最後存取的時間

語法 : int fileatime (string filename)

說明 :

傳回檔案最後存取的時間，如果發生錯誤則傳回false，傳回的時間是Unix時間戳記。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- filectime

檔案系統函式庫

filectime

(PHP3 , PHP4)

filectime --- 取得檔案最後更改的時間

語法 : int filectime (string filename)

說明 :

傳回檔案最後更改的時間，如果發生錯誤則傳回false，傳回的時間是Unix時間戳記。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- filegroup

檔案系統函式庫

filegroup

(PHP3 , PHP4)

filegroup --- 取得檔案所屬群組

語法 : int filegroup (string filename)

說明 :

傳回檔案的擁有者的群組ID，發生錯誤時傳回false，傳回數字格式的群組ID，使用posix_getgrgid( )來分析它，使它成為群組名稱。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。

注意 : 此函式無法運作在Windows系統


檔案系統函式庫 -- fileinode

檔案系統函式庫

fileinode

(PHP3 , PHP4)

fileinode --- 取得檔案inode

語法 : int fileinode (string filename)

說明 :

傳回檔案的inode值，發生錯誤則傳回false。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。

注意 : 此函式無法運作在Windows系統


檔案系統函式庫 -- filemtime

檔案系統函式庫

filemtime

(PHP3 , PHP4)

filemtime --- 取得檔案最後修改的時間

語法 : int filemtime (string filename)

說明 :

傳回檔案最後修改的時間，發生錯誤則傳回false，傳回的時間是Unix時間戳記。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- fileowner

檔案系統函式庫

fileowner

(PHP3 , PHP4)

fileowner --- 取得檔案的擁有者

語法 : int fileowner (string filename)

說明 :

傳回檔案的擁有者的使用者ID，發生錯誤時傳回false，傳回數字格式的使用者ID，使用posix_getpwuid( )來分析它，使它成為使用者名稱。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。

注意 : 此函式無法運作在Windows系統


檔案系統函式庫 -- fileperms

檔案系統函式庫

fileperms

(PHP3 , PHP4)

fileperms --- 取得檔案的權限

語法 : int fileperms (string filename)

說明 :

傳回檔案的權限，發生錯誤則傳回false。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- filesize

檔案系統函式庫

filesize

(PHP3 , PHP4)

filesize --- 取得檔案的大小

語法 : int filesize (string filename)

說明 :

傳回檔案的大小，發生錯誤則傳回false。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- filetype

檔案系統函式庫

filetype

(PHP3 , PHP4)

filetype --- 取得檔案的類型

語法 : int filetype (string filename)

說明 :

傳回檔案的類型，可能的值有fifo，char，dir，block，link，file及unkonwn。

發生錯誤則傳回false。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- flock

檔案系統函式庫

flock

(PHP3 >= 3.0.7 , PHP4)

flock --- 檔案上鎖

語法 : bool flock (int fp, int operation [, int wouldblock])

說明 :

PHP提供一個手提式(portable)上鎖的方式，使完整的檔案在一諮詢通道(advisory way)之中。

flock( )運作在開啟的檔案指標fp之上，operation可以是下列之一的值 :

  • 設定operation為LOCK_SH，來獲得一共享的鎖(讀取)。(PHP 4.0.1之前的版本則設為1)
  • 設定operation為LOCK_EX，來獲得一唯一的鎖(寫入)。(PHP 4.0.1之前的版本則設為2)
  • 設定operation為LOCK_UN，來釋放一個鎖(共享或唯一)。(PHP 4.0.1之前的版本則設為3)
  • 如果您不想flock( )鎖住區塊(block)，則設定參數operation為LOCK_NB。(PHP 4.0.1之前的版本則設為4)

flock( )允許你執行一個簡單的讀/寫方式，可用在每一個平台上(包括了UNIX和Windows)。如果鎖能夠區塊，則將第三個選項設為true(EWOULDBLOCK errno condition)。

flock( )成功則傳回true，失敗則傳回false。


檔案系統函式庫 -- fopen

檔案系統函式庫

fopen

(PHP3 , PHP4)

fopen --- 開啟檔案或URL

語法 : int fopen (string filename, string mode [, int use_include_path])

說明 :

如果filename是以"http://"開始的，則HTTP1.0開啟連結到指定的伺服器，而且檔案指標指到傳回的文件的起點。一個'host:'與請求一起送出，是為了處理name-based虛擬主機。

無法處理HTTP轉向(redirects)，因此必須包含延伸的斜線(slashes)在目錄上。

如果filename是以"ftp://"開始的，則ftp開啟連結到指定的伺服器，而且傳回所請求檔案的指標，如果伺服器並不提供被動模式ftp(passive mode ftp)時，這將會失敗。你可以經由ftp開啟檔案來讀或寫(兩者不能同時)。

如果filename是"php://stdin"，"php://stdout"，"php://stderr"其中之一時，將會開啟stdio資料流(stream)。這是在PHP 3.0.13中引見的，在先前的版本中，像是"/dev/stdin" 或 "/dev/fd/0"的檔案名稱，必須用來存取stdio資料流。

如果filename不是上述的樣式，則會從檔案系統開啟檔案，而且傳回檔案指標。

如果開啟失敗，則會傳回false。

mode可以是下列任何一個 :

  • ' r ' -- 開啟檔案成為唯讀，檔案指標指到檔案的開始處

  • ' r+ ' -- 開啟檔案成為讀與寫，檔案指標指到檔案的開始處

  • ' w ' -- 開啟檔案成為只有寫入，檔案指標指到檔案的開始處並且將原本的檔案

內容設為0長度，即刪除原來的資料，若檔案不存在則試著去建立新檔

  • ' w+ ' -- 開啟檔案成為讀與寫，檔案指標指到檔案的開始處並且將原本的檔案內

容設為0長度，即刪除原來的資料，若檔案不存在則試著建立新檔

  • ' a ' -- 開啟檔案成為只有寫入，檔案指標指到檔案的最後處，若檔案不存在則試

著建立新檔

  • ' a+ ' -- 開啟檔案為讀與寫，檔案指標指到檔案的最後處，若檔案不存在則試著

建立新檔

mode可以包含字母'b'，這只有在二進制和文字檔之間有差異的系統才有用(例如在Unix它是無效的)，如果不需要，它將會被忽略。

如果你想要在include_path中搜尋檔案，你可以使用第三個選項並將它設為"1"。

Example :

<?php

$fp = fopen ("/home/rasmus/file.txt", "r");

$fp = fopen ("/home/rasmus/file.gif", "wb");

$fp = fopen ("http://www.php.net/", "r");

$fp = fopen ("ftp://user:password@example.com/", "w");

?>

如果你在讀與寫檔案有問題，而且你是使用PHP的伺服器模組時，記得確認你所使用的檔案與目錄是伺服器程序(process)可利用的。

在Windows平台，檔案的路徑必須小心的使用來逃脫任何的反斜線( \ )，或是使用斜線( / )。

Example :

<?php

$fp = fopen ("c:\\data\\info.txt", "r");

?>

參考 : fclose( ) fsockopen( ) popen( )


檔案系統函式庫 -- fpassthru

檔案系統函式庫

fpassthru

(PHP3 , PHP4)

fpassthru --- 輸出所有剩餘資料

語法 : int fpassthru (int fp)

說明 :

讀取檔案指標到檔案結束處的資料，並且將結果輸出到標準輸出(standard output)。

如果發生錯誤，fpassthru( )則傳回false。

參數fp必須是有效的，而且是以fopen( )、 popen( ) 、fsockopen( )成功開啟時的指標，當fpassthru( )讀取完時會關閉檔案。

如果你只是想要輸出檔案的內容到stdout，你可以使用readfile( )

參考 : readfile( ) fopen( ) popen( ) fsockopen( )


檔案系統函式庫 -- fputs

檔案系統函式庫

fputs

(PHP3 , PHP4)

fputs --- 將資料寫到檔案指標處

語法 : int fputs (int fp, string str [, int length])

說明 :

fputs( )是fwrite( )的別名，而且用法也相同，注意 : length是非必需的，如果沒有指定則會將全部的字串寫入。


檔案系統函式庫 -- fread

檔案系統函式庫

fread

(PHP3 , PHP4)

fread --- 以位元組方式讀檔

語法 : string fread (int fp, int length)

說明 :

fread( )從檔案指標fp讀取length個位元組，當length個位元組已讀取或是到達檔案結尾(EOF)時，停止讀取。

Example :

<?php

// get contents of a file into a string

$filename = "/usr/local/something.txt";

$fd = fopen ($filename, "r");

$contents = fread ($fd, filesize ($filename));

fclose ($fd);

?>

參考
  : fwrite( )  fopen( )
  fsockopen( )  popen( )
  fgets( )  fgetss( )
  fscanf( )  file( )
  fpassthru( )


檔案系統函式庫 -- fscanf

檔案系統函式庫

fscanf

(PHP4 >= 4.0.1)

fscanf --- 按照格式剖析檔案

語法 : mixed fscanf (int handle, string format [, string var1...])

說明 :

此函式fscanf( )類似於sscanf( ) ，但是它從一個檔案取它的輸入，並且按照指定的格式format來解釋其輸入。如果只有二個參數傳遞到此函式，傳回的值將會是個陣列，否則，如果有傳遞非必需的參數時，此函式將會傳回分配(assigned)值的數目，非必需的參數必須依照關係來傳遞。

Example :

<?php

$fp = fopen ("users.txt","r");

while ($userinfo = fscanf ($fp, "%s\t%s\t%s\n")) {

list ($name, $profession, $countrycode) = $userinfo;

//... do something with the values

}

fclose($fp);

?>

users.txt :

javier argonaut pe
hiroshi sculptor jp
robert slacker us
luigi florist it

參考
  : fread( )  fgets( )
  fgetss( )  sscanf( )
  printf( )  sprintf( )


檔案系統函式庫 -- fseek

檔案系統函式庫

fseek

(PHP3 , PHP4)

fseek --- 移動檔案指標

語法 : int fseek (int fp, int offset [, int whence])

說明 :

設定檔案指標fp的位置，由whence來指定增加offset到新位置上的方式，whence有下列的值 :

SEEK_SET -- 設定新位置等於bytes位元組

SEEK_CUR -- 設定新位置為目前位置加上bytes

SEEK_END -- 設定新置為檔案的結尾加上bytes

如果沒有指定whence，則假定是SEEK_SET。

成功則傳回0，否則傳回-1。注意 : 此移動位置若通過檔案結尾並不會認為是錯誤。

如果fopen( )是以"http://"或"ftp://"開啟檔案時，無法使用此檔案指標。

注意 : whence參數在PHP 4.0RC1之後的版本才增加的。

參考 : ftell( ) rewind( )


檔案系統函式庫 -- fstat

檔案系統函式庫

fstat

(PHP4 >= 4.0RC1)

fstat --- 取得檔案的資訊

語法 : array fstat (int fp)

說明 :

聚集檔案指標fp檔案的統計資料，此函式和stat( )類似，不同處在於它是操作在開啟的檔案指標來替代檔名。

傳回檔案的統計資料，傳回的是一陣列，陣列有下列的元素 :

  1. 裝置名稱

  2. inode值

  3. 連結的數目

  4. 擁有者的使用者id

  5. 擁有者的群組id

  6. 裝置型態 *

  7. 多少位元組大小

  8. 最後存取的時間

  9. 最後修改的時間

  10. 最後變更的時間

  11. 檔案系統 I/O 區塊大小(blocksize) *

  12. 分配區塊的數目

*-只有在系統提供st_blksize類型才有效，其它的系統(例如Windows)則傳回-1。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- ftell

檔案系統函式庫

ftell

(PHP3 , PHP4)

ftell --- 取得檔案指標讀/寫的位置

語法 : int ftell (int fp)

說明 :

傳回檔案指標fp的位置，如果發生錯誤則傳回false。

檔案指標必須是有效的，並且是以fopen( )或 popen( ) 成功開啟時的指標。

參考 : fopen( ) popen( ) fseek( ) rewind( )


檔案系統函式庫 -- ftruncate

檔案系統函式庫

ftruncate

(PHP4 >= 4.0RC1)

ftruncate --- 截短檔案成為給予的長度

語法 : int ftruncate (int fp, int size)

說明 :

取一檔案指標fp，並且截短檔案成為size長度，成功則傳回true，失敗則傳回false。


檔案系統函式庫 -- fwrite

檔案系統函式庫

fwrite

(PHP3 , PHP4)

fwrite --- 將資料寫入檔案

語法 : int fwrite (int fp, string string [, int length])

說明 :

fwrite( )將string的內容寫到檔案中，如果有給予參數length，則當length位元組已寫入或是到達string的結尾，寫入都將會停止。

注意 : 如果有給予參數length，則magic_quotes_runtime選項將會被忽略，並且將不會從string去除斜線。

參考
  : fread( )  fopen( )
  fsockopen( )  popen( )
  fputs( )


檔案系統函式庫 -- is_dir

檔案系統函式庫

is_dir

(PHP3 , PHP4)

is_dir --- 辨別檔案名稱是否是個目錄

語法 : bool is_dir (string filename)

說明 :

如果filename存在而且是個目錄則傳回true。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

參考 : is_file( ) is_link( )


檔案系統函式庫 -- is_executable

檔案系統函式庫

is_executable

(PHP3 , PHP4)

is_executable --- 辨別檔案名稱是否是個可執行檔

語法 : bool is_executable (string filename)

說明 :

如果filename存在而且是個可執行檔則傳回true。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

參考 : is_file( ) is_link( )


檔案系統函式庫 -- is_file

檔案系統函式庫

is_file

(PHP3 , PHP4)

is_file --- 辨別檔案名稱是否是個正規的檔案

語法 : bool is_file (string filename)

說明 :

如果filename存在而且是個正規的(regular)檔案則傳回true。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

參考 : is_dir( ) is_link( )


檔案系統函式庫 -- is_link

檔案系統函式庫

is_link

(PHP3 , PHP4)

is_link --- 辨別檔案名稱是否是個符號連結

語法 : bool is_link (string filename)

說明 :

如果filename存在而且是個符號連結(symbolic link)則傳回true。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

注意 : 此函式無法運作在Windows系統

參考 : is_dir( ) is_file( )


檔案系統函式庫 -- is_readable

檔案系統函式庫

is_readable

(PHP3 , PHP4)

is_readable --- 辨別檔案名稱是否是可讀的檔案

語法 : bool is_readable (string filename)

說明 :

如果filename存在而且是個可讀的檔案則傳回true。

PHP可以以web伺服器執行的使用者(通常是nobody)id來存取檔案，安全模式限制不被考慮。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

參考 : is_writeable( )


檔案系統函式庫 -- is_writeable

檔案系統函式庫

is_writeable

(PHP3 , PHP4)

is_writeable --- 辨別檔案名稱是否是可寫入的檔案

語法 : bool is_writeable (string filename)

說明 :

如果filename存在而且是個可寫入的檔案則傳回true，參數filename可以是個目錄名稱，允許你去檢查目錄是否可以寫入。

PHP可以以web伺服器執行的使用者(通常是nobody)id來存取檔案，安全模式限制不被考慮。

此函式的結果會放在快取緩衝區中，詳細資料請參考clearstatcache( )。

參考 : is_readable( )


檔案系統函式庫 -- link

檔案系統函式庫

link

(PHP3 , PHP4)

link --- 建立堅固的連結

語法 : int link (string target, string link)

說明 :

link( )建立一個堅固的(hard)連結。symlink( )可以建立一個柔性的連結。

注意 : 此函式無法運作在Windows系統

參考 : symlink( ) readlink( ) linkinfo( )


檔案系統函式庫 -- linkinfo

檔案系統函式庫

linkinfo

(PHP3 , PHP4)

linkinfo --- 取得連結資訊

語法 : int linkinfo (string path)

說明 :

linkinfo( )傳回UNIX C stat structure的st_dev欄位，此函式用來證實連結(以path指出)是否存在，發生錯誤則傳回0或false。

注意 : 此函式無法運作在Windows系統

參考 : symlink( ) link( ) readlink( )


檔案系統函式庫 -- lstat

檔案系統函式庫

lstat

(PHP3 >= 3.0.4 , PHP4)

lstat --- 取得檔案的資訊

語法 : array lstat (string filename)

說明 :

聚集檔案的統計資料或是符號連結名稱filename，此函式和stat( )相同，不同處在於如果參數filename是個符號連結，則傳回符號連結的狀態。

傳回檔案的統計資料，傳回的是一陣列，陣列有下列的元素 :

  1. 裝置名稱

  2. inode值

  3. 連結的數目

  4. 擁有者的使用者id

  5. 擁有者的群組id

  6. 裝置型態 *

  7. 多少位元組大小

  8. 最後存取的時間

  9. 最後修改的時間

  10. 最後變更的時間

  11. 檔案系統 I/O 區塊大小(blocksize) *

  12. 分配區塊的數目

*-只有在系統提供st_blksize類型才有效，其它的系統(例如Windows)則傳回-1。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- mkdir

檔案系統函式庫

mkdir

(PHP3 , PHP4)

mkdir --- 建立目錄

語法 : int mkdir (string pathname, int mode)

說明 :

試著去建立由pathname指定的目錄。

注意 : 如果你想要去指定權限(八進制)，你必須在前面加上0。

Example :

<?php

mkdir ("/path/to/my/dir", 0700);

?>

成功則傳回true，失敗則傳回false。

參考 : rmdir( )


檔案系統函式庫 -- pclose

檔案系統函式庫

pclose

(PHP3 , PHP4)

pclose --- 關閉檔案指標

語法 : int pclose (int fp)

說明 :

關閉由popen( )開啟的檔案指標。

檔案指標必須是有效的，而且必須是由呼叫popen( )成功開啟的檔案指標。

傳回終止處理(process)的狀態。

參考 : popen( )


檔案系統函式庫 -- popen

檔案系統函式庫

popen

(PHP3 , PHP4)

popen --- 開啟檔案

語法 : int popen (string command, string mode)

說明 :

傳回一個檔案指標，和fopen( )所傳回的指標相同，不同處在於它只能是單向的(可以是讀或是寫)，而且必須以pclose( )關閉。開啟的檔案指標能讓fgets( ) 、fgetss( ) 、 fputs( ) 來使用。

如果發生錯誤時傳回false。

Example :

<?php

$fp = popen ("/bin/ls", "r");

?>

參考 : pclose( )


檔案系統函式庫 -- readfile

檔案系統函式庫

readfile

(PHP3 , PHP4)

readfile --- 輸出檔案

語法 : int readfile (string filename [, int use_include_path])

說明 :

讀取檔案並且將它寫到標準輸出。

傳回從檔案讀取的位元組大小，如果發生錯誤則此函式傳回false，而且會顯示出錯誤訊息，除非是以@readfile( )的方式呼叫，錯誤訊息才不會顯示出來。

如果filename是以"http://"開始的，則HTTP1.0開啟連結到指定的伺服器，並且將答覆(response)的文字寫到標準輸出。

無法處理HTTP轉向(redirects)，因此必須包含延伸的斜線(slashes)在目錄上。

如果filename是以"ftp://"開始的，則ftp開啟連結到指定的伺服器，並且將請求的檔案寫到標準輸出，如果伺服器並不提供被動模式ftp(passive mode ftp)時，這將會失敗。

如果filename的開始都不是上述兩者的字串，則將從檔案系統開啟檔案，並且將它的內容寫到標準輸出。

如果你想在include_path中搜尋檔案，你可以使用第二個參數，並且將它設為1。

參考
  : fpassthru( )  file( )
  fopen( )  include( )  require( )
  virtual( )


檔案系統函式庫 -- readlink

檔案系統函式庫

readlink

(PHP3 , PHP4)

readlink --- 傳回符號連結的目標

語法 : string readlink (string path)

說明 :

readlink( )不像是C語言的readlink，此函式傳回符號連結路徑的內容，發生錯誤則傳回0。

注意 : 此函式無法運作在Windows系統

參考 : symlink( ) linkinfo( )


檔案系統函式庫 -- realpath

檔案系統函式庫

realpath

(PHP4 >= 4.0b4)

realpath --- 傳回絶對的路徑名稱

語法 : string realpath (string path)

說明 :

realpath( )展開所有符號連結並且分析關聯成為'/./', '/../'，並且傳回絶對的路徑名稱，其結果將沒有符號連結'/./' 或 '/../'的成份。

Example :

<?php

$real_path = realpath ("../../index.php");

?>


檔案系統函式庫 -- rename

檔案系統函式庫

rename

(PHP3 , PHP4)

rename --- 檔案重新命名

語法 : int rename (string oldname, string newname)

說明 :

試著將舊名稱oldname重新命名為newname。

成功則傳回true，失敗則傳回false。


檔案系統函式庫 -- rewind

檔案系統函式庫

rewind

(PHP3 , PHP4)

rewind --- 重置檔案指標

語法 : int rewind (int fp)

說明 :

設定檔案指標fp到檔案的開始處。

如果發生錯誤則傳回0。

檔案指標必須是有效的，而且是以 fopen( ) 成功開啟時的指標。

參考 : fseek( ) ftell( )


檔案系統函式庫 -- rmdir

檔案系統函式庫

rmdir

(PHP3 , PHP4)

rmdir --- 刪除目錄

語法 : int rmdir (string dirname)

說明 :

試著去刪除參數dirname指定的目錄，刪除的目錄必須是空的，而且權限許可才行。

發生錯誤時則傳回0。

參考 : mkdir( )


檔案系統函式庫 -- set_file_buffer

檔案系統函式庫

set_file_buffer

(PHP3 >= 3.0.8 , PHP4 >= 4.0.1)

set_file_buffer --- 設定檔案緩衝區大小

語法 : int set_file_buffer (int fp, int buffer)

說明 :

set_file_buffer( )設定在檔案指標fp上，寫入操作緩衝buffer位元組，如果buffer為0，則寫入操作無緩衝，此函式成功則傳回0。

注意 : 任何fopen會呼叫set_file_buffer，預設上是8k。

參考 : fopen( )


檔案系統函式庫 -- stat

檔案系統函式庫

stat

(PHP3 , PHP4)

stat --- 取得檔案的資訊

語法 : array stat (string filename)

說明 :

聚集檔案名稱filename檔案的統計資料。

傳回檔案的統計資料，傳回的是一陣列，陣列有下列的元素 :

  1. 裝置名稱

  2. inode值

  3. 連結的數目

  4. 擁有者的使用者id

  5. 擁有者的群組id

  6. 裝置型態 *

  7. 多少位元組大小

  8. 最後存取的時間

  9. 最後修改的時間

  10. 最後變更的時間

  11. 檔案系統 I/O 區塊大小(blocksize) *

  12. 分配區塊的數目

*-只有在系統提供st_blksize類型才有效，其它的系統(例如Windows)則傳回-1。

此函式的結果會存在快取緩衝區中，詳細資料請參考clearstatcache( )。


檔案系統函式庫 -- symlink

檔案系統函式庫

symlink

(PHP3 , PHP4)

symlink --- 建立符號連結

語法 : int symlink (string target, string link)

說明 :

symlink( )從現行的目標target與指定的名稱link，建立一符號連結。link( )可用來建立堅固的連結。

注意 : 此函式無法運作在Windows系統

參考 : link( ) readlink( ) linkinfo( )


檔案系統函式庫 -- tempnam

檔案系統函式庫

tempnam

(PHP3 , PHP4)

tempnam --- 建立唯一的檔案名稱

語法 : string tempnam (string dir, string prefix)

說明 :

在指定的目錄中建立一個唯一的臨時檔案名稱，如果目錄不存在，tempnam( )可能會在系統的臨時(temporary)目錄中產生一個檔案名稱。

tempnam( )的性能(behaviour)是取決於系統的，在Windows上，TMP環境變數將會使參數dir無效，在Linux上TMPDIR環境變數有著級別高低(precedence)。

成功則傳回臨時的檔案名稱，失敗則傳回null字串。

Example :

<?php

$tmpfname = tempnam ("/tmp", "FOO");

?>

參考 : tmpfile( )


檔案系統函式庫 -- tmpfile

檔案系統函式庫

tmpfile

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

tmpfile --- 建立臨時的檔案

語法 : int tmpfile (void)

說明 :

建立一個臨時的檔案和唯一的名稱，此函式傳回一個檔案指標，就像是以fopen( )所傳回的指標。當使用fclose( )或是程式結束時，此檔案會自動地移除。

參考 : tempnam( )


檔案系統函式庫 -- touch

檔案系統函式庫

touch

(PHP3 , PHP4)

touch --- 設定檔案的修改時間

語法 : int touch (string filename [, int time])

說明 :

試著去設定檔案filename的修改時間，如果選項time沒有給予，則使用目前的時間。

如果檔案不存在，它將會建立一個檔案。

成功則傳回true，否則傳回false。

Example :

<?php

if (touch ($FileName)) {

print "$FileName modification time has been changed to todays date and time";

} else {

print "Sorry Could Not change modification time of $FileName";
}

?>


檔案系統函式庫 -- umask

檔案系統函式庫

umask

(PHP3 , PHP4)

umask --- 改變目前的umask

語法 : int umask (int mask)

說明 :

umask( )設定PHP的umask為mask & 0777，並傳回舊的umask。當PHP是使用伺服器模組時，各個請求完成時umask會恢復(restored)。

umask( )無任何參數則簡單的傳回目前的umask。


檔案系統函式庫 -- unlink

檔案系統函式庫

unlink

(PHP3 , PHP4)

unlink --- 刪除檔案

語法 : int unlink (string filename)

說明 :

刪除檔案filename，類似於Unix C unlink( )。

錯誤則傳回0或是false。

注意 : 此函式可能無法運作在Windows系統

參考 : rmdir( )


Shockwave Flash函式庫 -- swf_actiongeturl

Shockwave Flash函式庫

swf_actiongeturl

(PHP4 >= 4.0RC2)

swf_actiongeturl --- 從Shockwave Flash影片取得URL

語法 : void swf_actiongeturl (string url, string target)

說明 :

swf_actiongeturl( )以參數url和目標target取得URL。


Shockwave Flash函式庫 -- swf_actiongotoframe

Shockwave Flash函式庫

swf_actiongotoframe

(PHP4 >= 4.0RC2)

swf_actiongotoframe --- 播放一個框架然後停止

語法 : void swf_actiongotoframe (int framenumber)

說明 :

swf_actiongotoframe( )將會到framenumber指定的框架播放它，然後停止。


Shockwave Flash函式庫 -- swf_actiongotolabel

Shockwave Flash函式庫

swf_actiongotolabel

(PHP4 >= 4.0RC2)

swf_actiongotolabel --- 顯示框架和指定的標籤

語法 : void swf_actiongotolabel (string label)

說明 :

swf_actiongotolabel( )顯示框架和指定的標籤 label，然後停止。


Shockwave Flash函式庫 -- swf_actionnextframe

Shockwave Flash函式庫

swf_actionnextframe

(PHP4 >= 4.0RC2)

swf_actionnextframe --- 到下一個框架

語法 : void swf_actionnextframe (void);

說明 :

到下一個框架。


Shockwave Flash函式庫 -- swf_actionplay

Shockwave Flash函式庫

swf_actionplay

(PHP4 >= 4.0RC2)

swf_actionplay --- 從目前的框架開始播放flash影片

語法 : void swf_actionplay (void);

說明 :

從目前的框架開始播放flash影片。


Shockwave Flash函式庫 -- swf_actionprevframe

Shockwave Flash函式庫

swf_actionprevframe

(PHP4 >= 4.0RC2)

swf_actionprevframe --- 到上一個框架

語法 : void swf_actionprevframe (void);

說明 :

到上一個框架。


Shockwave Flash函式庫 -- swf_actionsettarget

Shockwave Flash函式庫

swf_actionsettarget

(PHP4 >= 4.0RC2)

swf_actionsettarget --- 設定動作的來龍去脈

語法 : void swf_actionsettarget (string target)

說明 :

swf_actionsettarget( )設定所有動作的來龍去脈(context)，你可以使用這個函式來控制目前播放的flash影片。


Shockwave Flash函式庫 -- swf_actionstop

Shockwave Flash函式庫

swf_actionstop

(PHP4 >= 4.0RC2)

swf_actionstop --- 停止播放目前框架上的flash影片

語法 : void swf_actionstop (void);

說明 :

停止播放目前框架上的flash影片。


Shockwave Flash函式庫 -- swf_actiontogglequality

Shockwave Flash函式庫

swf_actiontogglequality

(PHP4 >= 4.0RC2)

swf_actiontogglequality --- 拴牢介於高與低質量flash影片

語法 : void swf_actiontogglequality (void);

說明 :

拴牢(Toggle)介於高與低質量(quality)flash影片。


Shockwave Flash函式庫 -- swf_actionwaitforframe

Shockwave Flash函式庫

swf_actionwaitforframe

(PHP4 >= 4.0RC2)

swf_actionwaitforframe --- 如果框架沒有載入則略過動作

語法 : void swf_actionwaitforframe (int framenumber, int skipcount)

說明 :

swf_actionwaitforframe( )將會檢查參數framenumber的框架是否已經載入，如果沒有載入，它將略過參數skipcount指定動作的編號。這可以用來做 "Loading......" 的活潑樣式。


Shockwave Flash函式庫 -- swf_addbuttonrecord

Shockwave Flash函式庫

swf_addbuttonrecord

(PHP4 >= 4.0RC2)

swf_addbuttonrecord --- 控制按鈕出現和動作的區域位置

語法 : void swf_addbuttonrecord (int states, int shapeid, int depth)

說明 :

swf_addbuttonrecord( )允許你去定義按鈕使用的細節，第一個參數 states定義按鈕可以有何種狀態，可以是下列的常數任何一個或是全部 : BSHitTest、BSDown、BSOver 或 BSUp。第二個參數 shapeid是按鈕的外表，這通常是按鈕的形狀的物件 id。參數 depth是按鈕在目前的框架中的配置。

Example :

<?php

swf_startButton ($objid, TYPE_MENUBUTTON);

swf_addButtonRecord (BSDown|BSOver, $buttonImageId, 340);

swf_onCondition (MenuEnter);

swf_actionGetUrl ("http://www.designmultimedia.com", "_level1");

swf_onCondition (MenuExit); swf_actionGetUrl ("", "_level1");

swf_endButton ();

?>


Shockwave Flash函式庫 -- swf_addcolor

Shockwave Flash函式庫

swf_addcolor

(PHP4 >= 4.0RC2)

swf_addcolor --- 增加rgba所指定的顏色值

語法 : void swf_addcolor (float r, float g, float b, float a)

說明 :

swf_addcolor( )增加rgba所指定的顏色，這個顏色是讓swf_placeobject( )、swf_modifyobject( )和swf_addbuttonrecord( )來使用。當物件寫到螢幕時，物件的顏色將會增加rgba顏色值。

注意 : rgba值可以是正數或負數


Shockwave Flash函式庫 -- swf_closefile

Shockwave Flash函式庫

swf_closefile

(PHP4 >= 4.0RC2)

swf_closefile --- 關閉Shockwave Flash檔案

語法 : void swf_closefile (void);

說明 :

關閉由swf_openfile( )所開啟的檔案。


Shockwave Flash函式庫 -- swf_definebitmap

Shockwave Flash函式庫

swf_definebitmap

(PHP4 >= 4.0RC2)

swf_definebitmap --- 定義位圖

語法 : void swf_definebitmap (int objid, string image_name)

說明 :

swf_definebitmap( )定義一個位圖(bitmap)給予一個GIF, JPEG, RGB 或 FI圖形，圖形將會轉換成Flash JPEG 或 Flash color map 格式。


Shockwave Flash函式庫 -- swf_definefont

Shockwave Flash函式庫

swf_definefont

(PHP4 >= 4.0RC2)

swf_definefont --- 定義一個字體

語法 : void swf_definefont (int fontid, string fontname)

說明 :

swf_definefont( )定義參數fontname的字體並且給予它參數 fontid所指的 id。它會設定參數 fontname為目前的字體。


Shockwave Flash函式庫 -- swf_defineline

Shockwave Flash函式庫

swf_defineline

(PHP4 >= 4.0RC2)

swf_defineline --- 定義一個線段

語法 : void swf_defineline (int objid, float x1, float y1, float x2, float y2, float width)

說明 :

swf_defineline( )定義一個線段，從 x座標 x1、y 座標 y1到 x座標 x2、y 座標 y2，參數width定義此線段的寛度。


Shockwave Flash函式庫 -- swf_definepoly

Shockwave Flash函式庫

swf_definepoly

(PHP4 >= 4.0RC2)

swf_definepoly --- 定義一個多邊形

語法 : void swf_definepoly (int objid, array coords, int npoints, float width)

說明 :

swf_definepoly( )定義一個多邊形，多邊形的頂點座標(x,y)定義在參數coords中。參數npoints是陣列coords中，所有頂點的數目。參數width是多邊形邊緣的寛度，如果設為0.0則多邊形被填滿。


Shockwave Flash函式庫 -- swf_definerect

Shockwave Flash函式庫

swf_definerect

(PHP4 >= 4.0RC2)

swf_definerect --- 定義一個矩形

語法 : void swf_definerect (int objid, float x1, float y1, float x2, float y2, float width)

說明 :

swf_definerect( )定義一個矩形，從左上角 x座標 x1、y 座標 y1到 右下角 x座標 x2、y 座標 y2，參數width定義此矩形邊緣的寛度，如果width是0.0則矩形是被填滿的。


Shockwave Flash函式庫 -- swf_definetext

Shockwave Flash函式庫

swf_definetext

(PHP4 >= 4.0RC2)

swf_definetext --- 定義字串

語法 : void swf_definetext (int objid, string str, int docenter)

說明 :

使用目前的字體和字體的大小來定義字串 str，如果參數docenter為1，則單字的中心在 x。


Shockwave Flash函式庫 -- swf_endbutton

Shockwave Flash函式庫

swf_endbutton

(PHP4 >= 4.0RC2)

swf_endbutton --- 結束目前按鈕的定義

語法 : void swf_endbutton (void);

說明 :

swf_endbutton( )結束目前按鈕的定義。


Shockwave Flash函式庫 -- swf_enddoaction

Shockwave Flash函式庫

swf_enddoaction

(PHP4 >= 4.0RC2)

swf_enddoaction --- 結束目前動作

語法 : void swf_enddoaction (void);

說明 :

結束目前由swf_startdoaction( )起始的動作。


Shockwave Flash函式庫 -- swf_endshape

Shockwave Flash函式庫

swf_endshape

(PHP4 >= 4.0RC2)

swf_endshape --- 結束目前形狀的定義

語法 : void swf_endshape (void);

說明 :

swf_endshape( )結束目前形狀的定義。


Shockwave Flash函式庫 -- swf_endsymbol

Shockwave Flash函式庫

swf_endsymbol

(PHP4 >= 4.0RC2)

swf_endsymbol --- 結束符號的定義

語法 : void swf_endsymbol (void);

說明 :

swf_endsymbol( )結束由swf_startsymbol( )起始的符號定義


Shockwave Flash函式庫 -- swf_fontsize

Shockwave Flash函式庫

swf_fontsize

(PHP4 >= 4.0RC2)

swf_fontsize --- 變更目前字體大小

語法 : void swf_fontsize (float size)

說明 :

swf_fontsize( )變更字體大小為參數 size的值。


Shockwave Flash函式庫 -- swf_fontslant

Shockwave Flash函式庫

swf_fontslant

(PHP4 >= 4.0RC2)

swf_fontslant --- 設定字體傾斜角度

語法 : void swf_fontslant (float slant)

說明 :

設定目前字體傾斜多少角度，參數 slant指定傾斜的角度，slant如果是正數值則建立一個向前傾斜的角度，如果為負數則建立一個向後傾斜的角度。


Shockwave Flash函式庫 -- swf_fonttracking

Shockwave Flash函式庫

swf_fonttracking

(PHP4 >= 4.0RC2)

swf_fonttracking --- 設定目前字體的距離

語法 : void swf_fonttracking (float tracking)

說明 :

設定字體間隔的值為參數 tracking指定的值，此函式用來增加文字與文字間的距離，參數 tracking如果為正數則增加距離，如果為負數則減少距離。


Shockwave Flash函式庫 -- swf_getbitmapinfo

Shockwave Flash函式庫

swf_getbitmapinfo

(PHP4 >= 4.0RC2)

swf_getbitmapinfo --- 取得關於位圖的資訊

語法 : array swf_getbitmapinfo (int bitmapid)

說明 :

swf_getbitmapinfo( )傳回關於位圖(bitmap) bitmapid的資訊，此函式傳回一陣列，陣列有著有列的元素 :

  • "size" -- 位圖的位元組大小

  • "width" -- 位圖的寬度為多少像素(pixels)

  • "height" -- 位圖的高度為多少像素(pixels)


Shockwave Flash函式庫 -- swf_getfontinfo

Shockwave Flash函式庫

swf_getfontinfo

(PHP4 >= 4.0RC2)

swf_getfontinfo --- 取得大寫的A與小寫的x其高度為多少像素

語法 : array swf_getfontinfo (void);

說明 :

swf_getfontinfo( )傳回的陣列有下列的元素 :

  • Aheight -- 大寫的A其高度為多少像素(pixels)

  • xheight -- 小寫的x其高度為多少像素(pixels)


Shockwave Flash函式庫 -- swf_getframe

Shockwave Flash函式庫

swf_getframe

(PHP4 >= 4.0RC2)

swf_getframe --- 取得目前框架的框架編號

語法 : int swf_getframe (void);

說明 :

swf_getframe( )取得目前框架的編號。


Shockwave Flash函式庫 -- swf_labelframe

Shockwave Flash函式庫

swf_labelframe

(PHP4 >= 4.0RC2)

swf_labelframe --- 標記目前的框架

語法 : void swf_labelframe (string name)

說明 :

標記目前框架，由給予的參數name來指定其名稱。


Shockwave Flash函式庫 -- swf_lookat

Shockwave Flash函式庫

swf_lookat

(PHP4 >= 4.0RC2)

swf_lookat --- 定義觀看轉變

語法 : void swf_lookat (double view_x, double view_y, double view_z, double reference_x, double reference_y, double reference_z, double twist)

說明 :

swf_lookat( )依照給予的觀看位置(參數 view_x和 view_y)和鏡頭中參考點來定義一個觀看的轉變，參考點以參數 reference_x , reference_y , reference_z來定義，參數 twist控制觀看者的 z軸旋轉。


Shockwave Flash函式庫 -- swf_modifyobject

Shockwave Flash函式庫

swf_modifyobject

(PHP4 >= 4.0RC2)

swf_modifyobject --- 修改物件

語法 : void swf_modifyobject (int depth, int how)

說明 :

更新位置和(或)物件的顏色在指定的深度depth，參數how決定更新那一個，how可以是常數MOD_MATRIX或MOD_COLOR之一，或者它可以是兩者的結合(MOD_MATRIX|MOD_COLOR)。

MOD_COLOR使用目前的物件顏色mulcolor(由swf_mulcolor( )指定)和addcolor(由swf_addcolor( )指定)，MOD_MATRIX使用目前的物件位置基礎。


Shockwave Flash函式庫 -- swf_mulcolor

Shockwave Flash函式庫

swf_mulcolor

(PHP4 >= 4.0RC2)

swf_mulcolor --- 設定指定的多樣顏色值rgba

語法 : void swf_mulcolor (float r, float g, float b, float a)

說明 :

swf_mucolor( )設定多樣的(multiply)顏色值為指定的rgba顏色值，這個顏色是讓swf_placeobject( )、swf_modifyobject( )和swf_addbuttonrecord( )來使用，當物件寫到螢幕時，物件的顏色將會是多樣的rgba值。

注意 : rgba值可以是正數或負數


Shockwave Flash函式庫 -- swf_nextid

Shockwave Flash函式庫

swf_nextid

(PHP4 >= 4.0RC2)

swf_nextid --- 傳回下一個物件id

語法 : int swf_nextid (void);

說明 :

swf_nextid( )傳回下一個可利用的物件id。


Shockwave Flash函式庫 -- swf_oncondition

Shockwave Flash函式庫

swf_oncondition

(PHP4 >= 4.0RC2)

swf_oncondition --- 描述觸發的一個動作列表

語法 : void swf_oncondition (int transition)

說明 :

swf_oncondition( )描述即將觸發(trigger)的一個動作列表，這裡有數個可能轉變(transitions)的型態，下列的型態是將按鈕定義成TYPE_MENUBUTTON的 :

  • IdletoOverUp

  • OverUptoIdle

  • OverUptoOverDown

  • OverDowntoOverUp

  • IdletoOverDown

  • OutDowntoIdle

  • MenuEnter (IdletoOverUp|IdletoOverDown)

  • MenuExit (OverUptoIdle|OverDowntoIdle)

將按鈕定義成TYPE_PUSHBUTTON有下列的選項 :

  • IdletoOverUp

  • OverUptoIdle

  • OverUptoOverDown

  • OverDowntoOverUp

  • OverDowntoOutDown

  • OutDowntoOverDown

  • OutDowntoIdle

  • ButtonEnter (IdletoOverUp|OutDowntoOverDown)

  • ButtonExit (OverUptoIdle|OverDowntoOutDown)


Shockwave Flash函式庫 -- swf_openfile

Shockwave Flash函式庫

swf_openfile

(PHP4 >= 4.0RC2)

swf_openfile --- 開啟新的Shockwave Flash檔案

語法 : void swf_openfile (string filename, float width, float height, float framerate, float r, float g, float b)

說明 :

swf_openfile( )開啟一個新的檔案filename，width的寛度和heigth的高度，框架(frame)framerate的比率，和背景色紅色 r、綠色 g 、藍色 b。

swf_openfile( )必須是你第一個呼叫的函式，否則你的程式將會引起錯誤。如果你想要送出你的輸出到螢幕(screen)，可使檔案名稱為"php://stdout"(4.0.1以上才提供此功能)


Shockwave Flash函式庫 -- swf_ortho

Shockwave Flash函式庫

swf_ortho

(PHP4 >= 4.0RC2)

swf_ortho --- 定義一個垂直線使用者的繪圖到目前的繪圖區域上

語法 : void swf_ortho (double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)

說明 :

swf_ortho( )定義一個垂直線(orthographic)使用者的繪圖(mapping)到目前的繪圖區域上。


Shockwave Flash函式庫 -- swf_ortho2

Shockwave Flash函式庫

swf_ortho2

(PHP4 >= 4.0RC2)

swf_ortho2 --- 定義2D垂直線使用者的繪圖到目前的繪圖區域上

語法 : void swf_ortho2 (double xmin, double xmax, double ymin, double ymax)

說明 :

swf_ortho( )定義一個2D垂直線(orthographic)使用者的繪圖(mapping)到目前的繪圖區域上，這預設成一對一Flash影片的區域的繪圖，如果要求透視圖轉變時，可以使用此函式。


Shockwave Flash函式庫 -- swf_perspective

Shockwave Flash函式庫

swf_perspective

(PHP4 >= 4.0RC2)

swf_perspective --- 定義一個透視圖投射轉變

語法 : void swf_perspective (double fovy, double aspect, double near, double far)

說明 :

swf_perspective( )定義一個透視圖投射轉變，參數 fovy是在 y方向中 field-of-view角度，參數 aspect設定成繪圖區域的方向比率，參數 near是接近修剪平面(clipping plane)，參數 far是遠方修剪平面(clipping plane)。


Shockwave Flash函式庫 -- swf_placeobject

Shockwave Flash函式庫

swf_placeobject

(PHP4 >= 4.0RC2)

swf_placeobject --- 放置物件到螢幕上

語法 : void swf_placeobject (int objid, int depth)

說明 :

放置objid指定的物件在目前的框架中，深度為depth的地方。參數objid和depth必須介於1和65535之間。

這物件的顏色使用到由swf_mulcolor( )所傳回的顏色，和由swf_addcolor( )所傳回的增加的顏色，並且它使用目前的基礎(matrix)來放置物件。

注意 : 支援全部的RGBA顏色


Shockwave Flash函式庫 -- swf_polarview

Shockwave Flash函式庫

swf_polarview

(PHP4 >= 4.0RC2)

swf_polarview --- 定義觀看者的位置

語法 : void swf_polarview (double dist, double azimuth, double incidence, double twist)

說明 :

swf_polarview( )定義觀看者的位置在南北極(polar)中，參數 dist給予原本地球空間觀看角之間的距離。參數 azimuth定義 x,y中的方位角角度，從 y軸量過的距離。參數 incidence定義落在 y,z平面中的角度，從 z軸量過的距離，落下角(incidence angle)定義成相對於 z軸的觀看角。最後一個參數 twist指定關於視線使用右手規則(right hand rule)觀看角旋轉的總合。


Shockwave Flash函式庫 -- swf_popmatrix

Shockwave Flash函式庫

swf_popmatrix

(PHP4 >= 4.0RC2)

swf_popmatrix --- 恢愎先前轉變基礎

語法 : void swf_popmatrix (void);

說明 :

swf_popmatrix( )推動目前轉變基礎回到堆(stack)之上。


Shockwave Flash函式庫 -- swf_posround

Shockwave Flash函式庫

swf_posround

(PHP4 >= 4.0RC2)

swf_posround --- 設定是否當物件被放置或移動時能環繞的轉化

語法 : void swf_posround (int round)

說明 :

swf_posround( )當物件被放置或移動時，使能夠或是使不能夠環繞的轉化，有時候文字會因為使能夠環繞而成為更多可讀的，如果將參數 round設為1表示使能夠環繞，如果設為0表示使不能夠環繞。


Shockwave Flash函式庫 -- swf_pushmatrix

Shockwave Flash函式庫

swf_pushmatrix

(PHP4 >= 4.0RC2)

swf_pushmatrix --- 推動目前轉變基礎回到堆之上

語法 : void swf_pushmatrix (void);

說明 :

swf_pushmatrix( )推動目前轉變基礎回到堆(stack)之上。


Shockwave Flash函式庫 -- swf_removeobject

Shockwave Flash函式庫

swf_removeobject

(PHP4 >= 4.0RC2)

swf_removeobject --- 移除物件

語法 : void swf_removeobject (int depth)

說明 :

移除在depth指定深度的物件。


Shockwave Flash函式庫 -- swf_rotate

Shockwave Flash函式庫

swf_rotate

(PHP4 >= 4.0RC2)

swf_rotate --- 旋轉目前的轉變

語法 : void swf_rotate (double angle, string axis)

說明 :

swf_rotate( )依照給予參數 angle的角度和參數 axis環繞軸，來旋轉目前的轉變，有效的軸是 'x' (x軸) , 'y' (y軸) , 'z'(z軸)。


Shockwave Flash函式庫 -- swf_scale

Shockwave Flash函式庫

swf_scale

(PHP4 >= 4.0RC2)

swf_scale --- 刻度目前的轉變

語法 : void swf_scale (double x, double y, double z)

說明 :

swf_scale( )依照參數 x的值刻度曲度 x，依照參數 y的值刻度曲度 y，依照參數 z的值刻度曲度 z。


Shockwave Flash函式庫 -- swf_setfont

Shockwave Flash函式庫

swf_setfont

(PHP4 >= 4.0RC2)

swf_setfont --- 變更目前的字體

語法 : void swf_setfont (int fontid)

說明 :

swf_setfont( )設定目前的字體為參數 fontid的值。


Shockwave Flash函式庫 -- swf_setframe

Shockwave Flash函式庫

swf_setframe

(PHP4 >= 4.0RC2)

swf_setframe --- 切換到指定的框架

語法 : void swf_setframe (int framenumber)

說明 :

swf_setframe( )變更現行的框架為framenumber所指定的框架。


Shockwave Flash函式庫 -- swf_shapearc

Shockwave Flash函式庫

swf_shapearc

(PHP4 >= 4.0RC2)

swf_shapearc --- 畫一圓弧

語法 : void swf_shapearc (float x, float y, float r, float ang1, float ang2)

說明 :

swf_shapearc( )從參數ang1角度A到參數ang2角度B，畫一圓弧，參數 x,y 表示圓心的坐標，參數 r 表示圓的半徑。


Shockwave Flash函式庫 -- swf_shapecurveto

Shockwave Flash函式庫

swf_shapecurveto

(PHP4 >= 4.0RC2)

swf_shapecurveto --- 繪製二點間的曲線

語法 : void swf_shapecurveto (float x1, float y1, float x2, float y2)

說明 :

swf_shapecurveto( )從 x 坐標為參數 x1，y 坐標為參數 y1，到 x 坐標為參數 x2，y 坐標為參數 y2，畫一曲線。目前的位置會設定成 x2 , y2參數的位標。


Shockwave Flash函式庫 -- swf_shapecurveto3

Shockwave Flash函式庫

swf_shapecurveto3

(PHP4 >= 4.0RC2)

swf_shapecurveto3 --- 繪製三次方的曲線

語法 : void swf_shapecurveto3 (float x1, float y1, float x2, float y2, float x3, float y3)

說明 :

swf_shapecurveto3( )使用參數 x1,y1和參數 x2,y2為控制曲線的點與參數 x3,y3為結束的點，來畫一個三次方(cubic)的曲線。目前的位置會設定成 x3 , y3參數的位標。


Shockwave Flash函式庫 -- swf_shapefillbitmapclip

Shockwave Flash函式庫

swf_shapefillbitmapclip

(PHP4 >= 4.0RC2)

swf_shapefillbitmapclip --- 設定目前填滿到省略一部份的位圖的方式

語法 : void swf_shapefillbitmapclip (int bitmapid)

說明 :

設定填滿到省略一部份的(clipped)位圖(bitmap)，空的空間將會被給予的參數bitmapid填滿。


Shockwave Flash函式庫 -- swf_shapefillbitmaptile

Shockwave Flash函式庫

swf_shapefillbitmaptile

(PHP4 >= 4.0RC2)

swf_shapefillbitmapclip --- 設定目前填滿到位圖地磚的方式

語法 : void swf_shapefillbitmaptile (int bitmapid)

說明 :

設定填滿到位圖(bitmap)地磚(tile)，空的空間將會被給予的參數bitmapid填滿。


Shockwave Flash函式庫 -- swf_shapefilloff

Shockwave Flash函式庫

swf_shapefilloff

(PHP4 >= 4.0RC2)

swf_shapefilloff --- 關閉填滿

語法 : void swf_shapefilloff (void);

說明 :

swf_shapefilloff( )關閉填滿目前形狀(shape)。


Shockwave Flash函式庫 -- swf_shapefillsolid

Shockwave Flash函式庫

swf_shapefillsolid

(PHP4 >= 4.0RC2)

swf_shapefillsolid --- 設定目前填滿的樣式為指定的顏色

語法 : void swf_shapefillsolid (float r, float g, float b, float a)

說明 :

swf_shapefillsolid( )設定目前填滿的樣式，設定填滿的顏色為參數 rgba值。


Shockwave Flash函式庫 -- swf_shapelinesolid

Shockwave Flash函式庫

swf_shapelinesolid

(PHP4 >= 4.0RC2)

swf_shapelinesolid --- 設定目前線段樣式

語法 : void swf_shapelinesolid (float r, float g, float b, float a, float width)

說明 :

swf_shapelinesolid( )設定目前線段樣式為參數 rgba的顏色，寛度為參數width，如果width是0.0則沒有線段繪製。


Shockwave Flash函式庫 -- swf_shapelineto

Shockwave Flash函式庫

swf_shapelineto

(PHP4 >= 4.0RC2)

swf_shapelineto --- 繪製一線段

語法 : void swf_shapelineto (float x, float y)

說明 :

swf_shapelineto( )畫一線段到 x 坐標為參數 x，y 坐標為參數 y。目前的位置會設定成 x,y參數的位標。


Shockwave Flash函式庫 -- swf_shapemoveto

Shockwave Flash函式庫

swf_shapemoveto

(PHP4 >= 4.0RC2)

swf_shapemoveto --- 移動目前的位置

語法 : void swf_shapemoveto (float x, float y)

說明 :

swf_shapemoveto( )移動目前的位置到 x 坐標為參數 x，y 坐標為參數 y。


Shockwave Flash函式庫 -- swf_showframe

Shockwave Flash函式庫

swf_showframe

(PHP4 >= 4.0RC2)

swf_showframe --- 顯示目前的框架

語法 : void swf_showframe (void);

說明 :

swf_showframe( )將會顯示目前的框架。


Shockwave Flash函式庫 -- swf_startbutton

Shockwave Flash函式庫

swf_startbutton

(PHP4 >= 4.0RC2)

swf_startbutton --- 起始按鈕的定義

語法 : void swf_startbutton (int objid, int type)

說明 :

swf_startbutton( )起始按鈕的定義，參數 type可以是TYPE_MENUBUTTON或是TYPE_PUSHBUTTON。TYPE_MENUBUTTON常數允許當滑鼠移動到時，將焦點集中到按鈕上，而TYPE_PUSHBUTTON常數表示不允許。


Shockwave Flash函式庫 -- swf_startdoaction

Shockwave Flash函式庫

swf_startdoaction

(PHP4 >= 4.0RC2)

swf_startdoaction --- 起始目前框架動作的說明

語法 : void swf_startdoaction (void);

說明 :

swf_startdoaction( )起始目前框架動作的說明，這必須在目前框架動作定義之前呼叫。


Shockwave Flash函式庫 -- swf_startshape

Shockwave Flash函式庫

swf_startshape

(PHP4 >= 4.0RC2)

swf_startshape --- 起始一個複合的形狀

語法 : void swf_startshape (int objid)

說明 :

swf_startshape( )起始一個複合的形狀(complex shape)，和參數objid指定的物件id。


Shockwave Flash函式庫 -- swf_startsymbol

Shockwave Flash函式庫

swf_startsymbol

(PHP4 >= 4.0RC2)

swf_startsymbol --- 定義一個符號

語法 : void swf_startsymbol (int objid)

說明 :

定義一個物件 id為一個符號(symbol)，符號是可同時地播放的微小Flash影片，參數 objid是你想要將它定義成一個符號的物件 id。


Shockwave Flash函式庫 -- swf_textwidth

Shockwave Flash函式庫

swf_textwidth

(PHP4 >= 4.0RC2)

swf_textwidth --- 取得字串的寬度

語法 : float swf_textwidth (string str)

說明 :

swf_textwidth( )使用目前的字體和字體大小，給予字串 str的寬度。


Shockwave Flash函式庫 -- swf_translate

Shockwave Flash函式庫

swf_translate

(PHP4 >= 4.0RC2)

swf_translate --- 轉譯目前的轉變

語法 : void swf_translate (double x, double y, double z)

說明 :

swf_translate( )轉譯目前的轉變 x , y , z。


Shockwave Flash函式庫 -- swf_viewport

Shockwave Flash函式庫

swf_viewport

(PHP4 >= 4.0RC2)

swf_viewport --- 選擇一個未來繪圖的區域

語法 : void swf_viewport (double xmin, double xmax, double ymin, double ymax)

說明 :

swf_viewport( )選擇一個未來繪圖的區域，從 xmin到 xmax和 ymin到 ymax，如果沒有呼叫此函式，則區域會預設成螢幕(screen)的大小。


FTP函式庫 -- ftp_cdup

FTP函式庫

ftp_cdup

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_cdup --- 回到父目錄

語法 : int ftp_cdup (int ftp_stream)

說明 :

成功則傳回true，失敗則傳回false。

回到父(parent)目錄。


FTP函式庫 -- ftp_chdir

FTP函式庫

ftp_chdir

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_chdir --- 切換到指定的目錄

語法 : int ftp_chdir (int ftp_stream, string directory)

說明 :

成功則傳回true，失敗則傳回false。

切換到指定的目錄directory。


FTP函式庫 -- ftp_connect

FTP函式庫

ftp_connect

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_connect --- 開啟FTP連結

語法 : int ftp_connect (string host [, int port])

說明 :

成功則傳回FTP資料流，錯誤則傳回false。

ftp_connect( )開啟一個FTP連結到host，參數port指定連結的埠號，如果將它省略或者為0，則使用預設的FTP埠號 21。


FTP函式庫 -- ftp_fget

FTP函式庫

ftp_fget

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_fget --- 從FTP伺服器下載檔案並且儲存到開啟的檔案

語法 : int ftp_fget (int ftp_stream, int fp, string remote_file, int mode)

說明 :

成功則傳回true，失敗則傳回false。

ftp_fget( )從FTP伺服器獲得檔案remote_file，並且將它寫入開啟的檔案 fp，傳輸的模式mode必須是FTP_ASCII 或是FTP_BINARY。


FTP函式庫 -- ftp_fput

FTP函式庫

ftp_fput

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_fput --- 從開啟的檔案上傳到FTP伺服器

語法 : int ftp_fput (int ftp_stream, string remote_file, int fp, int mode)

說明 :

成功則傳回true，失敗則傳回false。

ftp_fput( )從開啟的檔案指標 fp直到檔案的結尾的內容上傳，結果儲存在FTP伺服器上的remote_file，傳輸的模式mode必須是FTP_ASCII 或是FTP_BINARY。


FTP函式庫 -- ftp_get

FTP函式庫

ftp_get

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_get --- 從FTP伺服器下載檔案

語法 : int ftp_get (int ftp_stream, string local_file, string remote_file, int mode)

說明 :

成功則傳回true，失敗則傳回false。

ftp_get( )從FTP伺服器獲得檔案remote_file，並且將它儲存在本地的local_file，傳輸的模式mode必須是FTP_ASCII 或是FTP_BINARY。


FTP函式庫 -- ftp_login

FTP函式庫

ftp_login

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_login --- 登入FTP連結

語法 : int ftp_login (int ftp_stream, string username, string password)

說明 :

成功則傳回true，失敗則傳回false。

登入給予的FTP資料流ftp_stream。


FTP函式庫 -- ftp_mdtm

FTP函式庫

ftp_mdtm

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_mdtm --- 傳回檔案的最後修改時間

語法 : int ftp_mdtm (int ftp_stream, string remote_file)

說明 :

成功則傳回UNIX時間戳記，失敗則傳回-1。

ftp_mdtm( )檢查檔案最後修改的時間，並且傳回UNIX時間戳記。如果發生錯誤或是檔案不存在則傳回-1，注意 : 這並不是所有的伺服器都支援。


FTP函式庫 -- ftp_mkdir

FTP函式庫

ftp_mkdir

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_mkdir --- 建立新目錄

語法 : string ftp_mkdir (int ftp_stream, string directory)

說明 :

成功則傳回最新建立的目錄名稱，失敗則傳回false。

參數directory指定新建目錄的名稱。


FTP函式庫 -- ftp_nlist

FTP函式庫

ftp_nlist

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_nlist --- 傳回給予的目錄中檔案的列表

語法 : int ftp_nlist (int ftp_stream, string directory)

說明 :

成功則傳回一個檔案名稱的陣列，失敗則傳回false。


FTP函式庫 -- ftp_pasv

FTP函式庫

ftp_pasv

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_pasv --- 開啟或關閉被動模式

語法 : int ftp_pasv (int ftp_stream, int pasv)

說明 :

成功則傳回true，失敗則傳回false。

如果參數pasv是true，ftp_pasv( )則開啟被動模式；如果參數pasv是false，ftp_pasv( )則關閉被動模式。在被動模式中，資料的連接是由客戶端(client)開始的，而不是由伺服器開始的。


FTP函式庫 -- ftp_put

FTP函式庫

ftp_put

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_put --- 上傳檔案到FTP伺服器

語法 : int ftp_put (int ftp_stream, string remote_file, string local_file, int mode)

說明 :

成功則傳回true，失敗則傳回false。

ftp_put( )將本地的檔案local_file儲存在FTP伺服器上的remote_file，傳輸的模式mode必須是FTP_ASCII 或是FTP_BINARY。


FTP函式庫 -- ftp_pwd

FTP函式庫

ftp_pwd

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_pwd --- 傳回目前的目錄名稱

語法 : int ftp_pwd (int ftp_stream)

說明 :

傳回目前的目錄名稱，失敗則傳回false。


FTP函式庫 -- ftp_quit

FTP函式庫

ftp_quit

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_quit --- 結束FTP連結

語法 : int ftp_quit (int ftp_stream)

說明 :

結束FTP資料流ftp_stream。


FTP函式庫 -- ftp_rawlist

FTP函式庫

ftp_rawlist

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_rawlist --- 傳回給予的目錄中檔案的詳細列表

語法 : int ftp_rawlist (int ftp_stream, string directory)

說明 :

ftp_rawlist( )執行FTP LIST命令，並且傳回陣列結果。各個陣列的元素相當於是一行的文字，由ftp_systype( )所傳回的系統型態 identifier可以用來決定解釋(interpreted)多少結果。


FTP函式庫 -- ftp_rename

FTP函式庫

ftp_rename

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_rename --- 將FTP伺服器上的檔案重新命名

語法 : int ftp_rename (int ftp_stream, string from, string to)

說明 :

成功則傳回true，失敗則傳回false。

ftp_rename( )將from指定的檔案，重新命名成新的名稱 to。


FTP函式庫 -- ftp_rmdir

FTP函式庫

ftp_rmdir

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_rmdir --- 移除目錄

語法 : int ftp_rmdir (int ftp_stream, string directory)

說明 :

成功則傳回true，失敗則傳回false。

移除directory指定的目錄。


FTP函式庫 -- ftp_site

FTP函式庫

ftp_site

(PHP3 >= 3.0.15 , PHP4 >= 4.0b4)

ftp_site --- 送出SITE命令給伺服器

語法 : int ftp_site (int ftp_stream, string cmd)

說明 :

成功則傳回true，失敗則傳回false。

ftp_site( )送出cmd指定的命令到FTP伺服器，SITE命令並不是標準化(standardized)的，它們可以用來處理像是權限(permissions)和群組資格(membership)。


FTP函式庫 -- ftp_size

FTP函式庫

ftp_size

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_size --- 傳回檔案的大小

語法 : int ftp_size (int ftp_stream, string remote_file)

說明 :

成功則傳回檔案的大小，失敗則傳回-1。

ftp_size( )傳回檔案的大小，如果發生錯誤或是檔案不存在則傳回-1，注意 : 這並不是所有的伺服器都支援。


FTP函式庫 -- ftp_systype

FTP函式庫

ftp_systype

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ftp_systype --- 傳回遠端FTP伺服器的系統型態identifier

語法 : int ftp_systype (int ftp_stream)

說明 :

傳回遠端系統型態，失敗則傳回false。


GNU Gettext函式庫 -- bindtextdomain

GNU Gettext函式庫

bindtextdomain

(PHP3 >= 3.0.7 , PHP4)

bindtextdomain --- 設定網域的路徑

語法 : string bindtextdomain (string domain, string directory)

說明 :

bindtextdomain( )設定網域的路徑。


GNU Gettext函式庫 -- dcgettext

GNU Gettext函式庫

dcgettext

(PHP3 >= 3.0.7 , PHP4)

dcgettext --- 撤消個別訊息查詢的網域

語法 : string dcgettext (string domain, string message, int category)

說明 :

此函式允許你去撤消個別訊息查詢的現行網域，它也允許你去指定一個種類。


GNU Gettext函式庫 -- dgettext

GNU Gettext函式庫

dgettext

(PHP3 >= 3.0.7 , PHP4)

dgettext --- 撤消現行的網域

語法 : string dgettext (string domain, string message)

說明 :

此函式允許你去撤消個別訊息查詢的現行網域。


GNU Gettext函式庫 -- gettext

GNU Gettext函式庫

gettext

(PHP3 >= 3.0.7 , PHP4)

gettext --- 查詢現行網域中的訊息

語法 : string gettext (string message)

說明 :

如果在轉化表格中有找到時，此函式傳回一個轉化字串，如果沒有找到則傳回提交的訊息。

Example :

<?php

// Set language to German

putenv ("LANG=de");

// Specify location of translation tables

bindtextdomain ("myPHPApp", "./locale");

// Choose domain

textdomain ("myPHPApp");

// Print a test message

print (gettext ("Welcome to My PHP Application"));

?>


GNU Gettext函式庫 -- textdomain

GNU Gettext函式庫

textdomain

(PHP3 >= 3.0.7 , PHP4)

textdomain --- 設定預設的網域

語法 : int textdomain ([string library])

說明 :

此函式設定當呼叫gettext( )時，要在內部搜尋的網域。呼叫此函式如果沒有給予參數的話，會獲得目前的設定值，但不會改變它。


GNU記錄函式庫 -- recode

GNU記錄函式庫

recode

(PHP4 >= 4.0RC1)

recode --- 按照記錄請求來記錄字串

語法 : string recode_string (string request, string string)

說明 :

此函式是recode_string( )的別名，它是PHP4新增的函式。


GNU記錄函式庫 -- recode_file

GNU記錄函式庫

recode_file

(PHP3 >= 3.0.13 , PHP4 >= 4.0RC1)

recode_file --- 按照記錄請求從檔案記錄到檔案

語法 : bool recode_file (int input, int output)

說明 :

按照記錄請求來記錄檔案指標 input成為檔案指標 output，如果無法順從則傳回FALSE，否則傳回TRUE。

此函式目前還無法處理遠端(URLs)的檔案，這二個檔案指標必須是本地的檔案。


GNU記錄函式庫 -- recode_string

GNU記錄函式庫

recode_string

(PHP3 >= 3.0.13 , PHP4 >= 4.0RC1)

recode_string --- 按照記錄請求來記錄字串

語法 : string recode_string (string request, string string)

說明 :

按照記錄請求 request來記錄字串 string，如果無法順從則傳回FALSE，否則傳回TRUE。

一個簡單的記錄請求可以是"lat1..iso646-de"，請參考GNU 記錄手冊。


HTTP函式庫 -- header

HTTP函式庫

header

(PHP3 , PHP4)

header --- 送出HTTP標頭

語法 : int header (string string)

說明 :

header( )函式是用在HTML檔案的上方，來送出HTTP標頭字串。注意 : header( )必須在任何標準的HTML標籤或是從PHP輸出之前來呼叫此函式。

這裡有二個標頭呼叫的特殊例子，第一個是"header"標頭，它可以引導瀏灠器到新的地方。

Example :

<?php

header ("Location: http://www.php.net"); /* Redirect browser
to PHP web site */
exit; /* Make sure that code below does
not get executed when we redirect. */

?>

第二個特殊的例子是任何的標頭都以字串"HTTP/"開始。例如 : 如果你有ErrorDocument 404 Apache指令指到一個PHP程式，這將是個好主意，來確定你的PHP程式真的可以產生404。你的程式碼將會是 :

Example :

<?php

header ("HTTP/1.0 404 Not Found");

?>

PHP程式通常是用來產生動態的HTML，有時候必須使它不被用戶端(client)的瀏灠器或是任何proxy(介於伺服器與用戶端)儲存起來，許多的proxies和client可以使用下列方式來迫使無法儲存(cache)。

<?php

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past

header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// always modified

header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1

header ("Pragma: no-cache"); // HTTP/1.0

?>

參考 : header_sent( )


HTTP函式庫 -- header_sent

HTTP函式庫

header_sent

(unknown)

header_sent --- 判斷標頭是否已經送出

語法 : boolean headers_sent (void)

說明 :

如果標頭已經送出則此函式傳回true，否則傳回false。

參考 : header( )


HTTP函式庫 -- setcookie

HTTP函式庫

setcookie

(PHP3 , PHP4)

setcookie --- 送出cookie

語法 : int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

說明 :

setcookie( )定義一個cookie和標頭一起送出。cookie必須在任何其它的標頭送出之前送出，這是cookie的限制，而不是PHP。你必須在任何<html>或是<head>標籤之前呼叫此函式。

除了參數name之外，其它都是非必需的。如果只有name這一個參數，則用戶端(client)此名稱的cookie將會被刪除，你也可以使用空字串(" ")來略過此參數，參數expire和secure是個整數，你可以使用0來略過參數，而不是使用空字串。參數expire是一個正規的Unix時間整數，由time( )和mktime( )傳回。參數secure指出此cookie將只有在安全的HTTPS連結時傳送。

常見的錯誤 :

  • cookies將不變成可看見的，直到下次頁面載入時，此cookies才將成為可看見的。
  • cookies必須以它們所設定的相同參數值，才能將它刪除。

在PHP3中，在相同的程式裡多次的呼叫setcookie( )，將會以顛倒的順序來執行。如果你想在插入另一個值之前刪除cookie，你應該先執行插入之後再執行刪除。在PHP4中，多次的呼叫setcookie( )會依照呼叫的順序來執行。

下面的範例說明如何去送出cookies :

Example :

<?php

setcookie ("TestCookie", "Test Value");

setcookie ("TestCookie", $value,time()+3600); /* expire in 1 hour */

setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);

?>

下面的範例說明如何將上面範例所送出的cookies刪除 :

<?php

setcookie ("TestCookie");

setcookie ("TestCookie", "", time());

setcookie ("TestCookie", "", time(), "/~rasmus/", ".utoronto.ca", 1);

?>

當你送出cookie時，cookie一部份的值將會自動地urlencoded，並且當接收到此cookie時，它會自動地decoded並分配它，使它成為變數，變數的名稱則與cookie的名稱相同。我們可以簡單的使用下列範例的其中一個方法，來看見cookie的內容 :

<?php

echo $TestCookie;

echo $HTTP_COOKIE_VARS["TestCookie"];

?>

你也可以在cookie的名稱中使用陣列的標記法，來設定陣列cookies，這種設定的結果就像是你有著許多的cookie，但是當你的程式接收到cookie時，cookie的值全部都會放在陣列之中 :

<?php

setcookie ("cookie[three]", "cookiethree");

setcookie ("cookie[two]", "cookietwo");

setcookie ("cookie[one]", "cookieone");

if (isset ($cookie)) {

while (list ($name, $value) = each ($cookie)) {

echo "$name == $value<br>\n";

}

}

?>


ICAP函式庫 -- icap_close

ICAP函式庫

icap_close

(unknown)

icap_close --- 關閉ICAP連結

語法 : int icap_close (int icap_stream [, int flags])

說明 :

關閉給予的ICAP資料流。


ICAP函式庫 -- icap_fetch_event

ICAP函式庫

icap_fetch_event

(PHP4 >= 4.0b4)

icap_fetch_event --- 從記事錄獲得事件

語法 : int icap_fetch_event (int stream_id, int event_id [, int options])

說明 :

icap_fetch_event( )從參數 event_id指定的記事錄(calendar)傳回一個事件。

傳回的事件物件由下列這些所構成 :

  • int id - 事件的ID

  • int public - 如果事件是公眾的，則傳回TRUE，如果是私人的，則傳回FALSE

  • string category - 事件的種類

  • string title - 事件的標題

  • string description - 事件的描述

  • int alarm - 事件送出警告/提醒之前的分鐘數目

  • object start - 一個包含日期時間的物件

  • object end - 一個包含日期時間的物件

所有的日期時間由下列這些所構成 :

  • int year - 年

  • int month - 月

  • int mday - 月份的日期

  • int hour - 小時

  • int min - 分鐘

  • int sec - 秒數


ICAP函式庫 -- icap_list_alarms

ICAP函式庫

icap_list_alarms

(PHP4 >= 4.0b4)

icap_list_alarms --- 傳回在給予的時間日期上即將要起動警報的事件的列表

語法 : int icap_list_alarms (int stream_id, array date, array time)

說明 :

傳回在給予的時間日期上，即將要進行(going off)警報的事件的ID，傳回的是陣列。

icap_list_alarms( )傳回在那個時間日期上，即將要進行(going off)警報的事件的ID，傳回的是陣列。

所有的日期時間由下列這些所構成 :

  • int year - 年

  • int month - 月

  • int mday - 月份的日期

  • int hour - 小時

  • int min - 分鐘

  • int sec - 秒數


ICAP函式庫 -- icap_list_events

ICAP函式庫

icap_list_events

(PHP4 >= 4.0RC1)

icap_list_events --- 傳回二個時間日期之間的事件列表

語法 : array icap_list_events (int stream_id, int begin_date [, int end_date])

說明 :

傳回介於二個時間日期之間的事件ID，此函式傳回的是陣列。

icap_list_events( )取記事錄的開始時間日期和結束時間日期，傳回這二個時間日期之間的事件ID，傳回的是陣列。

所有的日期時間由下列這些所構成 :

  • int year - 年

  • int month - 月

  • int mday - 月份的日期

  • int hour - 小時

  • int min - 分鐘

  • int sec - 秒數


ICAP函式庫 -- icap_open

ICAP函式庫

icap_open

(PHP4 >= 4.0b4)

icap_open --- 開啟ICAP連結

語法 : stream icap_open (string calendar, string username, string password, string options)

說明 :

成功則傳回ICAP資料流(stream)，錯誤則傳回 false。

icap_open( )開啟ICAP連結到指定的 calendar，如果有指定非必需選項 options，則也會傳遞參數 options到郵箱。


ICAP函式庫 -- icap_snooze

ICAP函式庫

icap_snooze

(PHP4 >= 4.0b4)

icap_snooze --- 開啟事件警報

語法 : string icap_snooze (int stream_id, int uid)

說明 :

icap_snooze( )開啟(turn on)參數 uid指定的記事錄事件的警報(alarm)。


ICAP函式庫 -- icap_store_event

ICAP函式庫

icap_store_event

(PHP4 >= 4.0b4)

icap_store_event --- 儲存一個事件到ICAP記事錄

語法 : string icap_store_event (int stream_id, object event)

說明 :

icap_store_event( )儲存一個事件到ICAP記事錄，事件物件由下列這些所構成 :

  • int public - 如果事件是公眾的，則為1，如果是私人的，則為0

  • string category - 事件的種類

  • string title - 事件的標題

  • string description - 事件的描述

  • int alarm - 事件送出警告之前的分鐘數目

  • object start - 事件起始的時間日期物件

  • object end - 事件結束的時間日期物件

所有的日期時間由下列這些所構成 :

  • int year - 年

  • int month - 月

  • int mday - 月份的日期

  • int hour - 小時

  • int min - 分鐘

  • int sec - 秒數

成功則傳回 true，錯誤則傳回 false。


圖形函式庫 -- GetImageSize

圖形函式庫

GetImageSize

(PHP3 , PHP4)

GetImageSize --- 取得GIF、JPEG、PNG或SWF圖形的大小

語法 : array getimagesize (string filename [, array imageinfo])

說明 :

GetImageSize( )將會測定任何GIF、JPG、 PNG 或 SWF圖檔的大小，並且傳回圖檔的寬和高及檔案的類型，高和寬的字串會使用內部一個標準的HTML IMG標籤。

傳回的陣列有四個元素，索引值 0 表示圖形的寬為多少像素(pixels)，索引值 1表示圖形的高，索引值 2則指出圖形為何種類型，1＝GIF，2＝JPG，3＝PNG，索引值 3是個 "height=xxx width=xxx"的字串，它能直接的用在 IMG標籤中。

Example :

<?php

<?php $size = GetImageSize ("img/flag.jpg"); ?>

<IMG SRC="img/flag.jpg" <?php echo $size[3]; ?>

?>

非必需的參數imageinfo允許你從圖檔中取出一些延伸的資訊，現在這將會傳回不同的JPG APP標識(markers)在組合的陣列中，有些程式會使用到這些APP標識來將文字資訊植入圖形中，一個相當常見的植入IPTC http://www.xe.net/iptc/資訊在APP13標識中。你可以使用iptcparse( )函式來剖析二進制APP13標識，成為可讀的。

Example :

<?php

$size = GetImageSize ("testimg.jpg",&$info);

if (isset ($info["APP13"])) {

$iptc = iptcparse ($info["APP13"]); var_dump ($iptc);

}

?>

注意 : 此函式並不需要GD圖形函式庫


圖形函式庫 -- ImageArc

圖形函式庫

ImageArc

(PHP3 , PHP4)

ImageArc --- 畫弧線

語法 : int imagearc (int im, int cx, int cy, int w, int h, int s, int e, int col)

說明 :

ImageArc( )在im所代表的圖形中，以參數 cx,cy(左上方是 0,0)為圓心畫一弧形，參數 w和 h分別表示弧形的寬和高，參數 s和 e則指出弧形的起始角和結束角的度數。


圖形函式庫 -- ImageChar

圖形函式庫

ImageChar

(PHP3 , PHP4)

ImageChar --- 畫一個水平的字元

語法 : int imagechar (int im, int font, int x, int y, string c, int col)

說明 :

ImageChar( )在圖形 im上，位置在 x,y的地方(左上方是 0,0)，顏色為 col，畫出 c的第一個字元，如果字體 font是1、2、3、4或 5，則使用嵌入的字體(數值愈大字體也愈大)

參考 : imageloadfont( )


圖形函式庫 -- ImageCharUp

圖形函式庫

ImageCharUp

(PHP3 , PHP4)

ImageCharUp --- 畫一個垂直的字元

語法 : int imagecharup (int im, int font, int x, int y, string c, int col)

說明 :

ImageChar( )在圖形 im上，位置在 x,y的地方(左上方是 0,0)，顏色為 col，畫出垂直的 c的第一個字元，如果字體 font是1、2、3、4或 5，則使用嵌入的字體(數值愈大字體也愈大)

參考 : imageloadfont( )


圖形函式庫 -- ImageColorAllocate

圖形函式庫

ImageColorAllocate

(PHP3 , PHP4)

ImageColorAllocate --- 分配圖形的顏色

語法 : int imagecolorallocate (int im, int red, int green, int blue)

說明 :

ImageColorAllocate( )傳回一個顏色的 identifier，表示顏色是由給予的RGB成份所組成的，參數 im是由imagecreate( )傳回的，要用在圖形 im中的顏色，必須呼叫ImageColorAllocate( )來建立各種顏色。

Example :

<?php

$white = ImageColorAllocate ($im, 255, 255, 255);

$black = ImageColorAllocate ($im, 0, 0, 0);

?>


圖形函式庫 -- ImageColorAt

圖形函式庫

ImageColorAt

(PHP3 , PHP4)

ImageColorAt --- 取得像素的顏色索引值

語法 : int imagecolorat (int im, int x, int y)

說明 :

傳回圖形中指定位置的像素的顏色索引值。

參考 : imagecolorset( ) imagecolorsforindex( )


圖形函式庫 -- ImageColorClosest

圖形函式庫

ImageColorClosest

(PHP3 , PHP4)

ImageColorClosest --- 取得最接近指定的顏色的索引值

語法 : int imagecolorclosest (int im, int red, int green, int blue)

說明 :

傳回圖形的調色盤中，最接近指定的RGB值的顏色索引值。

參考 : imagecolorexact( )


圖形函式庫 -- ImageColorDeAllocate

圖形函式庫

ImageColorDeAllocate

(PHP3 >= 3.0.6 , PHP4)

ImageColorDeAllocate --- 減少一個分配給圖形的顏色

語法 : int imagecolordeallocate (int im, int index)

說明 :

ImageColorDeAllocate( )減少一個先前ImageColorAllocate( )分配給圖形的顏色。

Example :

<?php

$white = ImageColorAllocate($im, 255, 255, 255);

ImageColorDeAllocate($im, $white);

?>


圖形函式庫 -- ImageColorExact

圖形函式庫

ImageColorExact

(PHP3 , PHP4)

ImageColorExact --- 取得指定的顏色的索引值

語法 : int imagecolorexact (int im, int red, int green, int blue)

說明 :

傳回圖形的調色盤中，指定的顏色的索引值。

如果顏色不在圖形的調色盤上，則傳回-1。

參考 : imagecolorclosest( )


圖形函式庫 -- ImageColorResolve

圖形函式庫

ImageColorResolve

(PHP3 >= 3.0.2 , PHP4)

ImageColorResolve --- 取得指定的或最接近的顏色的索引值

語法 : int imagecolorresolve (int im, int red, int green, int blue)

說明 :

此函式肯定會傳回一個請求的顏色索引值，會傳回指定的或是接近的顏色的索引值。

參考 : imagecolorclosest( )


圖形函式庫 -- ImageColorSet

圖形函式庫

ImageColorSet

(PHP3 , PHP4)

ImageColorSet --- 設定調色盤索引值的顏色

語法 : bool imagecolorset (int im, int index, int red, int green, int blue)

說明 :

設定調色盤中指定的索引值成為設定的顏色，可使用此函式來改變索引值的顏色，這樣圖形的顏色也會改變。


圖形函式庫 -- ImageColorsForIndex

圖形函式庫

ImageColorsForIndex

(PHP3 , PHP4)

ImageColorsForIndex --- 從索引值取得顏色

語法 : array imagecolorsforindex (int im, int index)

說明 :

此函式傳回指定的顏色索引值的RGB值，傳回的陣列有red、green和blue這三個索引值，陣列的值為指定的顏色索引值的RGB值。


圖形函式庫 -- ImageColorsTotal

圖形函式庫

ImageColorsTotal

(PHP3 , PHP4)

ImageColorsTotal --- 找出圖形的調色盤中顏色的數目

語法 : int imagecolorstotal (int im)

說明 :

傳回圖形的調色盤中顏色的數目。


圖形函式庫 -- ImageColorTransparent

圖形函式庫

ImageColorTransparent

(PHP3 , PHP4)

ImageColorTransparent --- 定義透明的顏色

語法 : int imagecolortransparent (int im [, int col])

說明 :

ImageColorTransparent( )圖形 im中，透明的顏色為 col。參數 im是由ImageCreate( )傳回的圖形 identifier，而參數 col是由ImageColorAllocate( )傳回的顏色identifier。

傳回新的透明色的 identifier，如果沒有指定則傳回當前的顏色 identifier。


圖形函式庫 -- ImageCopy

圖形函式庫

ImageCopy

(PHP3 >= 3.0.6 , PHP4)

ImageCopy --- 複製一部份的圖形

語法 : int ImageCopy (int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)

說明 :

複製 src_im的一部份到 dst_im上，起始點在 src_x , src_y，src_w的寬度，src_y的高度，所定義的這一個部份將會複製到 dst_x , dst_y的位置上。


圖形函式庫 -- ImageCopyResized

圖形函式庫

ImageCopyResized

(PHP3 , PHP4)

ImageCopyResized --- 複製圖形的一部份並且調整大小

語法 : int imagecopyresized (int dst_im, int src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

說明 :

ImageCopyResized( )複製圖形的一個矩形部份到另一個圖形。dst_im是目的地的圖形，src_im是來源的圖形，如果來源和目的地的寬和高相異的話，則將會執行圖形的延伸或是縮短，此函式可以複製在相同的圖形中(如果dst_im和src_im是相同的話)，但是如果複製的範圍重疊時，其結果將會無法預料。


圖形函式庫 -- ImageCreate

圖形函式庫

ImageCreate

(PHP3 , PHP4)

ImageCreate --- 建立一個新的圖形

語法 : int imagecreate (int x_size, int y_size)

說明 :

ImageCreate( )傳回一個圖形的identifier，表示大小為 x_size、y_size的一個空白的圖形。

Example :

<?php

header ("Content-type: image/png");

$im = @ImageCreate (50, 100) or die ("Cannot Initialize new GD image stream");

$background_color = ImageColorAllocate ($im, 255, 255, 255);

$text_color = ImageColorAllocate ($im, 233, 14, 91);

ImageString ($im, 1, 5, 5, "A Simple Text String", $text_color);

ImagePng ($im);

?>


圖形函式庫 -- ImageCreateFromGIF

圖形函式庫

ImageCreateFromGIF

(PHP3 , PHP4)

ImageCreateFromGIF --- 從檔案或URL建立一個新的圖形

語法 : int imagecreatefromgif (string filename)

說明 :

ImageCreateFromGIF( )傳回一個圖形 identifier，表示從給予的檔名中獲得圖形。

ImageCreateFromGIF( )失敗時則傳回一個空字串，它也會傳回一個錯誤訊息，這個錯誤訊息不幸地顯示出像是瀏灠器中一個斷裂的連結，下面的範例將會產生出一個簡易除錯的圖形。

Example :

<?php

function LoadGif ($imgname) {

$im = @ImageCreateFromGIF ($imgname); /* Attempt to open */

if (!$im) { /* See if it failed */

$im = ImageCreate (150, 30); /* Create a blank image */

$bgc = ImageColorAllocate ($im, 255, 255, 255);

$tc = ImageColorAllocate ($im, 0, 0, 0);

ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);

/* Output an errmsg */

ImageString ($im, 1, 5, 5, "Error loading $imgname", $tc);

}

return $im;

}

?>

注意 : GD library在1.6之後的版本已經將所有提供的GIF給移除了 ，所以如果你是使用1.6之後的版本的話，則無法使用此函式


圖形函式庫 -- ImageCreateFromJPEG

圖形函式庫

ImageCreateFromJPEG

(PHP3 >= 3.0.16 , PHP4 >= 4.0RC1)

ImageCreateFromJPEG --- 從檔案或URL建立一個新的圖形

語法 : int imagecreatefromjpeg (string filename)

說明 :

ImageCreateFromJPEG( )傳回一個圖形 identifier，表示從給予的檔名中獲得圖形。

ImageCreateFromJPEG( )失敗時則傳回一個空字串，它也會傳回一個錯誤訊息，這個錯誤訊息不幸地顯示出像是瀏灠器中一個斷裂的連結，下面的範例將會產生出一個簡易除錯的圖形。

Example :

<?php

function LoadJpeg ($imgname) {

$im = @ImageCreateFromJPEG ($imgname); /* Attempt to open */

if (!$im) { /* See if it failed */

$im = ImageCreate (150, 30); /* Create a blank image */

$bgc = ImageColorAllocate ($im, 255, 255, 255);

$tc = ImageColorAllocate ($im, 0, 0, 0);

ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);

/* Output an errmsg */

ImageString ($im, 1, 5, 5, "Error loading $imgname", $tc);

}

return $im;

}

?>


圖形函式庫 -- ImageCreateFromPNG

圖形函式庫

ImageCreateFromPNG

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ImageCreateFromPNG --- 從檔案或URL建立一個新的圖形

語法 : int imagecreatefrompng (string filename)

說明 :

ImageCreateFromPNG( )傳回一個圖形 identifier，表示從給予的檔名中獲得圖形。

ImageCreateFromPNG( )失敗時則傳回一個空字串，它也會傳回一個錯誤訊息，這個錯誤訊息不幸地顯示出像是瀏灠器中一個斷裂的連結，下面的範例將會產生出一個簡易除錯的圖形。

Example :

<?php

function LoadPNG ($imgname) {

$im = @ImageCreateFromPNG ($imgname); /* Attempt to open */

if (!$im) { /* See if it failed */

$im = ImageCreate (150, 30); /* Create a blank image */

$bgc = ImageColorAllocate ($im, 255, 255, 255);

$tc = ImageColorAllocate ($im, 0, 0, 0);

ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);

/* Output an errmsg */

ImageString ($im, 1, 5, 5, "Error loading $imgname", $tc);

}

return $im;

}

?>


圖形函式庫 -- ImageDashedLine

圖形函式庫

ImageDashedLine

(PHP3 , PHP4)

ImageDashedLine --- 畫虛線

語法 : int imagedashedline (int im, int x1, int y1, int x2, int y2, int col)

說明 :

ImageDashedLine( )在圖形 im中，從 x1,y1到 x2,y2畫一條顏色為 col的虛線。

參考 : imageline( )


圖形函式庫 -- ImageDestroy

圖形函式庫

ImageDestroy

(PHP3 , PHP4)

ImageDestroy --- 結束圖形

語法 : int imagedestroy (int im)

說明 :

ImageDestroy( )釋放任何和圖形 im關聯的記憶體，im是由imagecreate( )傳回的圖形 identifier。


圖形函式庫 -- ImageFill

圖形函式庫

ImageFill

(PHP3 , PHP4)

ImageFill --- 將圖形著色

語法 : int imagefill (int im, int x, int y, int col)

說明 :

ImageFill( )在圖形 im中，將顏色 col填滿在 x,y起始的位置上。


圖形函式庫 -- ImageFilledPolygon

圖形函式庫

ImageFilledPolygon

(PHP3 , PHP4)

ImageFilledPolygon --- 建立一個多邊形並且填滿顏色

語法 : int imagefilledpolygon (int im, array points, int num_points, int col)

說明 :

ImageFilledPolygon( )在圖形 im中，建立一個多邊形，並且以顏色 col將多邊形填滿。參數 points是個包含了多邊形的頂點的一個PHP陣列，例如 : points[0] = x0, points[1] = y0, points[2] = x1, points[3] = y1等等，參數 num_points是頂點的總數。


圖形函式庫 -- ImageFilledRectangle

圖形函式庫

ImageFilledRectangle

(PHP3 , PHP4)

ImageFilledRectangle --- 建立一個矩形並且填滿顏色

語法 : int imagefilledrectangle (int im, int x1, int y1, int x2, int y2, int col)

說明 :

ImageFilledRectangle( )在圖形 im中，建立一個填滿顏色 col的矩形，從左上方的坐標 x1,y1到右下方的坐標 x2,y2，坐標 0,0是圖形的左上角。


圖形函式庫 -- ImageFillToBorder

圖形函式庫

ImageFillToBorder

(PHP3 , PHP4)

ImageFillToBorder --- 填滿到指定的顏色

語法 : int imagefilltoborder (int im, int x, int y, int border, int col)

說明 :

ImageFillToBorder( )將邊緣(border)顏色為 border的範圍，以顏色 col將它填滿，填滿的起始點是在 x,y(左上方是 0,0)。


圖形函式庫 -- ImageFontHeight

圖形函式庫

ImageFontHeight

(PHP3 , PHP4)

ImageFontHeight --- 取得字體的高度

語法 : int imagefontheight (int font)

說明 :

傳回指定的字體中，字元的高度為多少像素。

參考 : imagefontwidth( ) imageloadfont( )


圖形函式庫 -- ImageFontWidth

圖形函式庫

ImageFontWidth

(PHP3 , PHP4)

ImageFontWidth --- 取得字體的寬度

語法 : int imagefontwidth (int font)

說明 :

傳回指定的字體中，字元的寬度為多少像素。

參考 : imagefontheight( ) imageloadfont( )


圖形函式庫 -- ImageGammaCorrect

圖形函式庫

ImageGammaCorrect

(PHP3 >= 3.0.13 , PHP4 >= 4.0.0)

ImageGammaCorrect --- 請求GD圖形gamma修正

語法 : int imagegammacorrect (int im, double inputgamma, double outputgamma)

說明 :

ImageGammaCorrect( )請求gd圖形im gamma修正，給予一個輸入的gamma inputgamma，並且輸出gamma outputgamma。


圖形函式庫 -- ImageGIF

圖形函式庫

ImageGIF

(PHP3 , PHP4)

ImageGIF --- 輸出圖形到瀏灠器或是檔案

語法 : int imagegif (int im [, string filename])

說明 :

ImageGIF( )將圖形 im建立在檔名 filename中，參數 im是由imagecreate( )傳回的。

圖形的格式將會是GIF87a，除非是使用imagecolortransparent( )來將圖形成為透明的，這種情況下，圖形的格式將會是GIF89a。

參數 filename是非必需的，如果沒有給這個參數，則會使用header( )來送出一個image/gif content-type，將圖形直接地輸出。你可以建立一個PHP程式，讓它直接地輸出GIF圖形。

注意 : GD library在1.6之後的版本已經將所有提供的GIF給移除了 ，所以如果你是使用1.6之後的版本的話，則無法使用此函式


圖形函式庫 -- ImageInterlace

圖形函式庫

ImageInterlace

(PHP3 , PHP4)

ImageInterlace --- 開啟或關閉交錯

語法 : int imageinterlace (int im [, int interlace])

說明 :

ImageInterlace( )開啟或關閉交錯位元(interlace bit)，如果 interlace為1則圖形 im將會開啟交錯，如果 interlace為0則關閉交錯。

如果沒有設定參數 interlace，則此函式會傳回圖形 im交錯位元的設定值。


圖形函式庫 -- ImageJPEG

圖形函式庫

ImageJPEG

(PHP3 >= 3.0.16 , PHP4 >= 4.0RC1)

ImageJPEG --- 輸出圖形到瀏灠器或是檔案

語法 : int imagejpeg (int im [, string filename [, int quality]])

說明 :

ImageJPEG( )將圖形 im建立在檔名 filename中，參數 im是由imagecreate( )傳回的。

參數 filename是非必需的，如果沒有給這個參數，則會使用header( )來送出一個image/jpeg content-type，將圖形直接地輸出。為了要提供參數 quality，你可以使用空字串('')來略過參數 filename。你可以建立一個PHP程式，讓它直接地輸出JPEG圖形。

注意 : 如果PHP是編譯在GD-1.8或是更新的版本時，才能使JPEG


圖形函式庫 -- ImageLine

圖形函式庫

ImageLine

(PHP3 , PHP4)

ImageLine --- 畫一條線

語法 : int imageline (int im, int x1, int y1, int x2, int y2, int col)

說明 :

ImageLine( )在圖形 im中，從 x1 , y1到 x2 , y2(左上方是 0,0)畫一條線，線段的顏色為參數 col。

參考 : imagecreate( ) imagecolorallocate( )


圖形函式庫 -- ImageLoadFont

圖形函式庫

ImageLoadFont

(PHP3 , PHP4)

ImageLoadFont --- 載入新的字體

語法 : int imageloadfont (string file)

說明 :

ImageLoadFont( )載入一個使用者定義的點陣(bitmap)字體，並且傳回字體的identifier(它永遠是大於5，所以它不會與嵌入的字體互相衝突)。

字體檔格式現在都是二進制並且取決於電腦內部的結構，這個意思是說，你必須產生字體檔在你運作PHP的機器上。

字體檔格式 :

位元組位置 | C資料型態 | 說明
byte 0-3 | int | 字體中字元的數目
byte 4-7 | int | 字體中第一個字元的值(通常是 32或是空白)
byte 8-11 | int | 各個字元的像素寬度
byte 12-15 | int | 各個字元的像素高度
byte 16- | char | 陣列和字元資料，各個字元中一個像素為一位元組，位元組的總數(nchars*width*height)

參考 : imagefontwidth( ) imagefontheight( )


圖形函式庫 -- ImagePNG

圖形函式庫

ImagePNG

(PHP3 >= 3.0.13 , PHP4 >= 4.0b4)

ImagePNG --- 輸出PNG圖形到瀏灠器或是檔案

語法 : int imagepng (int im [, string filename])

說明 :

ImagePNG( )輸出一個PNG格式的GD圖形 im到標準輸出(通常是瀏灠器)，或者如果有給予一個檔案名稱 filename，則它會輸出圖形到指定的檔名。

Example :

<?php

$im = ImageCreateFromPng("test.png");

ImagePng($im);

?>


圖形函式庫 -- ImagePolygon

圖形函式庫

ImagePolygon

(PHP3 , PHP4)

ImagePolygon --- 畫一個多邊形

語法 : int imagepolygon (int im, array points, int num_points, int col)

說明 :

ImagePolygon( )在圖形 im中，建立一個多邊形，參數 points是個包含了多邊形的頂點的一個PHP陣列，例如 : points[0] = x0, points[1] = y0, points[2] = x1, points[3] = y1等等，參數 num_points是頂點的總數。

參考 : imagecreate( )


圖形函式庫 -- ImagePSBBox

圖形函式庫

ImagePSBBox

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePSBBox --- 使用PostScript Type1字體取得文字矩形的區塊座標

語法 : array imagepsbbox (string text, int font, int size [, int space [, int tightness [, float angle]]])

說明 :

size表示(expressed)像素。

space允許你去改變字體中，間隔(space)的預設值，這個總合會和標準的值相加，而且也可以是負數。

tightness允許你去控制二字元間空白的總數，這個總合會和標準的值相加，而且也可以是負數。

angle是度數。

參數 space和tightness表示字元空白的單位，單位1是em-square的1/1000th。

參數 space、tightness和 angle都是非必需的。

傳回的陣列包含了下列的元素 :

0 | 左下角 x坐標
1 | 左下角 y坐標
2 | 右上角 x坐標
3 | 右上角 y坐標

參考 : imagepstext( )


圖形函式庫 -- ImagePSEncode

圖形函式庫

ImagePSEncodeFont

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePSEncodeFont --- 改變字元編碼向量

語法 : int imagepsencodefont (string encodingfile)

說明 :

從檔案載入字元編碼向量，並且將它改變成字體編碼向量，PostScript字體預設的向量缺少了大多數ASCII 127以上的字元，如果你是使用英文之外的語言，你將必須要改變這個值，這個檔案的格式是描述在T1libs文件中，T1lib有二個可用的檔案，IsoLatin1.enc和IsoLatin2.enc。

如果你自己始終使用這個函式，最好的方法是設定結構檔(php3.ini、php.ini)中的ps.default_encoding去指到正確的編碼檔案，而且你載入的所有字體都將會自動地有著正確的編碼。


圖形函式庫 -- ImagePsExtendFont

圖形函式庫

ImagePsExtendFont

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePsExtendFont --- 延伸或縮短字體

語法 : bool imagepsextendfont (int font_index, double extend)

說明 :

延伸或縮短字體 font_index，如果參數 extend的值小於1，將會縮短字體。


圖形函式庫 -- ImagePSFreeFont

圖形函式庫

ImagePSFreeFont

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePSFreeFont --- 釋放使用PostScript Type 1字體的記憶體

語法 : void imagepsfreefont (int fontindex)

說明 :

釋放使用PostScript Type 1字體的記憶體。

參考 : imagepsloadfont( )


圖形函式庫 -- ImagePSLoadFont

圖形函式庫

ImagePSLoadFont

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePSLoadFont --- 從檔案載入PostScript Type 1字體

語法 : int imagepsloadfont (string filename)

說明 :

正確的話則傳回有效的字體索引，而且能讓另外的函式使用。否則函式會傳回false，並且顯示出錯誤訊息，說明那裡弄錯了。

參考 : imagepsfreefont( )


圖形函式庫 -- ImagePsSlantFont

圖形函式庫

ImagePsSlantFont

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePsSlantFont --- 傾斜字體

語法 : bool imagepsslantfont (int font_index, double slant)

說明 :

傾斜字體 font_index，和傾斜的值 slant。


圖形函式庫 -- ImagePSText

圖形函式庫

ImagePSText

(PHP3 >= 3.0.9 , PHP4 >= 4.0RC1)

ImagePSText --- 使用PostScript Type1字體在圖形上畫出文字字串

語法 : array imagepstext (int image, string text, int font, int size, int foreground, int background, int x, int y [, int space [, int tightness [, float angle [, int antialias_steps]]]])

說明 :

size表示(expressed)像素。

foreground是要將文字著色的顏色，background是文字將會試著褪去(fade)的顏色。

坐標 x,y將會定義成第一個字元(字元的左下角)的起源(或參考點)，這和imagestring( )不同，imagestring( )是定義成字元的右上角。

space允許你去改變字體中，間隔(space)的預設值，這個總合會和標準的值相加，而且也可以是負數。

tightness允許你去控制二字元間空白的總數，這個總合會和標準的值相加，而且也可以是負數。

angle是度數。

antialias_steps允許你控制antialiasing文字顏色的數值，允許的值為 4和16。

參數 space和tightness表示字元空白的單位，單位1是em-square的1/1000th。

參數 space、tightness、angle和antialias都是非必需的。

傳回的陣列包含了下列的元素 :

0 | 左下角 x坐標
1 | 左下角 y坐標
2 | 右上角 x坐標
3 | 右上角 y坐標

參考 : imagepsbbox( )


圖形函式庫 -- ImageRectangle

圖形函式庫

ImageRectangle

(PHP3 , PHP4)

ImageRectangle --- 畫一個矩形

語法 : int imagerectangle (int im, int x1, int y1, int x2, int y2, int col)

說明 :

ImageRectangle( )在圖形 im中，建立一個顏色為 col的矩形，從左上方的坐標 x1,y1到右下方的坐標 x2,y2，坐標 0,0是圖形的左上角。


圖形函式庫 -- ImageSetPixel

圖形函式庫

ImageSetPixel

(PHP3 , PHP4)

ImageSetPixel --- 設定單一像素

語法 : int imagesetpixel (int im, int x, int y, int col)

說明 :

ImageSetPixel( )在圖形 im中，在 x,y的位置上(左上角是 0,0)畫出一個顏色為 col的像素。

參考 : imagecreate( ) imagecolorallocate( )


圖形函式庫 -- ImageString

圖形函式庫

ImageString

(PHP3 , PHP4)

ImageString --- 畫出水平的字串

語法 : int imagestring (int im, int font, int x, int y, string s, int col)

說明 :

ImageString( )在圖形 im中，在坐標 x,y的位置上畫出顏色為 col的字串 s，如果字體是1、2、3、4或5，則使用嵌入的字體。

參考 : imageloadfont( )


圖形函式庫 -- ImageStringUp

圖形函式庫

ImageStringUp

(PHP3 , PHP4)

ImageStringUp --- 畫出垂直的字串

語法 : int imagestringup (int im, int font, int x, int y, string s, int col)

說明 :

ImageString( )在圖形 im中，在坐標 x,y的位置上畫出顏色為 col的垂直字串 s，如果字體是1、2、3、4或5，則使用嵌入的字體。

參考 : imageloadfont( )


圖形函式庫 -- ImageSX

圖形函式庫

ImageSX

(PHP3 , PHP4)

ImageSX --- 取得圖形的寬度

語法 : int imagesx (int im)

說明 :

ImageSX( )傳回圖形 im的寬度。

參考 : imagecreate( ) imagesy( )


圖形函式庫 -- ImageSY

圖形函式庫

ImageSY

(PHP3 , PHP4)

ImageSY --- 取得圖形的高度

語法 : int imagesy (int im)

說明 :

ImageSY( )傳回圖形 im的高度。

參考 : imagecreate( ) imagesx( )


圖形函式庫 -- ImageTTFBBox

圖形函式庫

ImageTTFBBox

(PHP3 , PHP4)

Image --- 使用TypeType字體取得文字的區塊座標

語法 : array imagettfbbox (int size, int angle, string fontfile, string text)

說明 :

此函式計算並傳回TrueType文字的區塊坐標。

text : 要被測量的字串。

size : 字體大小。

fontfile : TrueType字體檔的名稱(也可以是URL)。

angle : text將要測量的角度度數。

ImageTTFBBox( )傳回的陣列有8個元素，代表文字區塊的四個頂點。

0 | 左下角X坐標
1 | 左下角Y坐標
2 | 右下角X坐標
3 | 右下角Y坐標
4 | 右上角X坐標
5 | 右上角Y坐標
6 | 左上角X坐標
7 | 左上角Y坐標

頂點是相對於 text，所以不管角度。"左上角"的意思是，以水平的方向看文字時的左上角。

參考 : imagettftext( )


圖形函式庫 -- ImageTTFText

圖形函式庫

ImageTTFText

(PHP3 , PHP4)

ImageTTFText --- 使用TrueType字體寫入文字到圖形中

語法 : array imagettftext (int im, int size, int angle, int x, int y, int col, string fontfile, string text)

說明 :

ImageTTFText( )使用TrueType字體檔 fontfile，在圖形 im中，在坐標 x,y的位置上，角度為 angle，畫出顏色為 col的字串 text。

坐標 x,y將會定義成第一個字元的基準點，這和imagestring( )不同，imagestring( )是定義成第一個字元的右上角。

angle單位是度數，0度將會由左到右讀取文字(3點鐘方向)，而更高的值表示逆時鐘旋轉(例如 : 90度將導致由下到上讀取文字)。

fontfile是你想要使用TrueType字體的路徑。

text是個文字字串，可以包含UTF-8連續字元(&#123的形式)來存取字體中前255個字元以外的字元。

col是顏色索引，使用負數的顏色索引將會關閉antialiasing。

ImageTTFText( )傳回的陣列有8個元素，表示文字區塊的四個頂點，頂點的順序是左上、右上、右下、左下，頂點是相對於文字，所以不管角度。"左上"的意思是，當你以水平的方向看文字時的左上角。

這個範例將會產生出一個黑色的GIF 400x30像素的圖形，和白色的單字"Testing..."字體Arial。

Example :

<?php

Header ("Content-type: image/gif");

$im = imagecreate (400, 30);

$black = ImageColorAllocate ($im, 0, 0, 0);

$white = ImageColorAllocate ($im, 255, 255, 255);

ImageTTFText ($im, 20, 0, 10, 20, $white, "/path/arial.ttf", "Testing... Omega: &#937;");

ImageGif ($im); ImageDestroy ($im);

?>

此函式需要GD library和FreeType library。

參考 : imagettfbbox( )


圖形函式庫 -- ImageTypes

圖形函式庫

ImageTypes

(PHP4 CVS only)

ImageTypes --- 傳回提供的圖形格式

語法 : int imagetypes(void);

說明 :

此函式傳回一個bit-field，來表示連結到PHP裡的GD版本提供了何種圖形格式，下列是會被傳回的位元 : IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP，來檢查是否提供PNG格式，可以像範例這樣做 :

Example :

<?php

if (ImageTypes() & IMG_PNG) {

echo "PNG Support is enabled";

}

?>


圖形函式庫 -- read_exif_data

圖形函式庫

read_exif_data

(PHP4 >= 4.0.1)

read_exif_data --- 從JPEG圖形檔讀取EXIF標頭

語法 : array read_exif_data (string filename)

說明 :

read_exif_data( )從JPEG圖形檔讀取EXIF標頭。它傳回一個陣列，陣列的索引值是Exif標頭名稱，而陣列的值是這些標頭的值。Exif標頭傾向目前由數位相機產生出來的JPEG圖形，但不幸的，各個數位相機製造者都有著不同的如何去實際他們的標籤的構想，所以你無法去信賴目前存在的一個特定的Exif標頭。

Example :

<?php

$exif = read_exif_data ('p0001807.jpg');

while(list($k,$v)=each($exif)) {

echo "$k: $v<br>\n";

}

?>

輸出 :

FileName: p0001807.jpg

FileDateTime: 929353056

FileSize: 378599

CameraMake: Eastman Kodak Company

CameraModel: KODAK DC265 ZOOM DIGITAL CAMERA (V01.00)

DateTime: 1999:06:14 01:37:36

Height: 1024

Width: 1536

IsColor: 1

FlashUsed: 0

FocalLength: 8.0mm

RawFocalLength: 8

ExposureTime: 0.004 s (1/250)

RawExposureTime: 0.0040000001899898

ApertureFNumber: f/ 9.5

RawApertureFNumber: 9.5100002288818

FocusDistance: 16.66m

RawFocusDistance: 16.659999847412

Orientation: 1

ExifVersion: 0200

注意 : 在編譯PHP時需要加入 --enable-exif才能使用此函式

此函式不需要GD圖形 library。


郵件函式庫 -- ezmlm_hash

郵件函式庫

ezmlm_hash

(PHP3 CVS only , PHP4 CVS only)

ezmlm_hash --- 計算雜湊值

語法 : int ezmlm_hash (string addr)

說明 :

ezmlm_hash( )計算雜湊值，MySQL資料庫中需要有EZMLM郵件列表。

Example :

<?php

$user = "kris@koehntopp.de";

$hash = ezmlm_hash ($user);

$query = sprintf ("INSERT INTO sample VALUES (%s, '%s')", $hash, $user);

$db->query($query); // using PHPLIB db interface

?>


郵件函式庫 -- mail

郵件函式庫

mail

(PHP3 , PHP4)

mail --- 送發電子郵件

語法 : bool mail (string to, string subject, string message [, string additional_headers])

說明 :

Mail( )自動地將message中指定的內容郵寄給to中指定的收件人，如果要寄給多位的收件者，可以在to中將各個郵件地址以逗號(，)分隔開來即可。

Example :

<?php

mail("rasmus@lerdorf.on.ca", "My Subject", "Line 1\nLine 2\nLine 3");

?>

如果有給予第四個字串的參數，這個字串會插入在標頭的後面，這是典型的增加額外的標頭，多樣的額外標頭會以新行(newline)來隔開。

Example :

<?php

mail("nobody@aol.com", "the subject", $message,"From: webmaster@$SERVER_NAME\nReply-To:

webmaster@$SERVER_NAME\nX-Mailer: PHP/" . phpversion());

?>


數學函式庫 -- abs

數學函式庫

abs

(PHP3 , PHP4)

abs --- 取絕對值

語法 : mixed abs(mixed number);

說明 :

傳回參數number的絕對值，如果number為浮點數，傳回的型態也是浮點數，除此之外其它傳回的型態為整數。


數學函式庫 -- acos

數學函式庫

acos

(PHP3 , PHP4)

acos --- 取反餘弦值

語法 : float acos(float arg);

說明 :

傳回參數arg的反餘弦值(徑度)。

參考 : asin( ) atan( )


數學函式庫 -- asin

數學函式庫

asin

(PHP3 , PHP4)

asin --- 取反正弦值

語法 : float asin(float arg);

說明 :

傳回參數arg的反正弦值(徑度)。

參考 : acos( ) atan( )


數學函式庫 -- atan

數學函式庫

atan

(PHP3 , PHP4)

atan --- 取反正切值

語法 : float atan(float arg);

說明 :

傳回參數arg的反正切值(徑度)。

參考 : acos( ) asin( )


數學函式庫 -- atan2

數學函式庫

atan2

(PHP3 >= 3.0.5 , PHP4)

atan2 --- 取二個變數的反正切值

語法 : float atan2(float y, float x);

說明 :

此函式計算二個變數x與y的反正切值，這類似去計算x/y的反正切值，但此函式能使用參數x,y的正負號來決定其結果所在的象限。此函式傳回的結果(徑度)坐落在包含-PI與PI之間。

參考 : acos( ) atan( )


數學函式庫 -- base_convert

數學函式庫

base_convert

(PHP3 >= 3.0.6 , PHP4)

base_convert --- 轉換數值的進位方式

語法 : strin base_convert(string number, int frombase, int tobase);

說明 :

傳回由frombase進制轉為tobase進制的字串，參數frombase與tobase介於包含2到36之問。若超過10進制則會以字母a-z表示，a代表10、b代表11、z代表36。

Example :

<?php

$binary = base_convert($hexadecimal, 16, 2);

?>


數學函式庫 -- bindec

數學函式庫

bindec

(PHP3 , PHP4)

bindec --- 二進制轉十進制

語法 : int bindec(string binary_string);

說明 :

將參數binary_string二進制的值轉換成十進制的值，此函式傳回的值為十進制的值。能轉換的最大值為二進制的31個1或是十進制的2147483647。

參考 : decbin( )


數學函式庫 -- ceil

數學函式庫

ceil

(PHP3 , PHP4)

ceil --- 取得大於指定數的最小整數值

語法 : int ceil(float number);

說明 :

傳回大於參數number的最小整數值。在整數上使用ceil( )絶對是很浪費時間的。

參考 : floor( ) round( )


數學函式庫 -- cos

數學函式庫

cos

(PHP3 , PHP4)

cos --- 取餘弦值

語法 : float cos(float arg);

說明 :

傳回參數arg的餘弦值(徑度)。

參考 : sin( ) tan( )


數學函式庫 -- decbin

數學函式庫

decbin

(PHP3 , PHP4)

decbin --- 十進制轉二進制

語法 : string decbin(int number);

說明 :

將參數number十進制的值轉換成二進制的值，此函式傳回的值為二進制的值。能轉換的最大值為二進制的31個1或是十進制的2147483647。

參考 : bindec( )


數學函式庫 -- dechex

數學函式庫

dechex

(PHP3 , PHP4)

dechex --- 十進制轉十六進制

語法 : string dechex(int number);

說明 :

將參數number十進制的值轉換成十六進制的值，此函式傳回的值為十六進制的值。能轉換的最大值為十六進制的7fffffff或是十進制的2147483647。

參考 : hexdec( )


數學函式庫 -- decoct

數學函式庫

decoct

(PHP3 , PHP4)

decoct --- 十進制轉八進制

語法 : string decoct(int number);

說明 :

將參數number十進制的值轉換成八進制的值，此函式傳回的值為八進制的值。能轉換的最大值為八進制的17777777777或是十進制的2147483647。

參考 : octdec( )


數學函式庫 -- deg2rad

數學函式庫

deg2rad

(PHP3 >= 3.0.4 , PHP4)

deg2rad --- 將數值從度數轉成徑度

語法 : double deg2rad (double number)

說明 :

此函式將number從度數轉換成徑度。

參考 : rad2deg( )


數學函式庫 -- exp

數學函式庫

exp

(PHP3 , PHP4)

exp --- 取得自然對數的次方值

語法 : float exp(float arg);

說明 :

傳回自然對數e的arg次方的值。

參考 : pow( )


數學函式庫 -- floor

數學函式庫

floor

(PHP3 , PHP4)

floor --- 取得小於指定數的最大整數值

語法 : int floor(float number);

說明 :

傳回小於number的最大整數值。在整數上使用ceil( )絶對是很浪費時間的。

參考 : ceil( ) round( )


數學函式庫 -- getrandmax

數學函式庫

getrandmax

(PHP3 , PHP4)

getrandmax --- 取得最大亂數值

語法 : int getrandmax(void );

說明 :

傳回最大值，這可由呼叫rand( )傳回。

參考
  :  rand( )  srand( )
  mt_rand( )  mt_srand(
  )  mt_getrandmax( )


數學函式庫 -- hexdec

數學函式庫

hexdec

(PHP3 , PHP4)

hexdec --- 十六進制轉十進制

語法 : int hexdec(string hex_string);

說明 :

將hex_string十六進制的值轉換成十進制的值，能轉換的最大值為十六進制的7 fffffff或是十進制的2147483647。

參考 : dechex( )


數學函式庫 -- log

數學函式庫

log

(PHP3 , PHP4)

log --- 自然對數

語法 : float log(float arg);

說明 :

傳回arg的自然對數值。


數學函式庫 -- log10

數學函式庫

log10

(PHP3 , PHP4)

log10 --- 底為10的對數

語法 : float log10(float arg);

說明 :

傳回arg以底為10的對數值。


數學函式庫 -- max

數學函式庫

max

(PHP3 , PHP4)

max --- 傳回參數中最大值

語法 : mixed max(mixed arg1, mixed arg2, mixed argn);

說明 :

傳回參數中的最大值，若第一個參數為陣列，此函式會傳回此陣列的最大值，若第一個參數為整數、字串或是浮點數，則至少需要二個參數且會傳回這些值的最大值，參數的數目不受限制，可依使用者自行決定。若有一個以上的參數值為浮點數，則所有的參數值都會看成是浮點數，傳回的結果也是浮點數。若參數沒有一個是浮點數，則所有的參數值都會看成是整數，且傳回值也是整數。


數學函式庫 -- min

數學函式庫

min

(PHP3 , PHP4)

min --- 傳回參數中最小值

語法 : mixed min(mixed arg1, mixed arg2, mixed argn);

說明 :

傳回參數中的最小值，若第一個參數為陣列，此函式會傳回此陣列的最小值，若第一個參數為整數、字串或是浮點數，則至少需要二個參數且會傳回這些值的最小值，參數的數目不受限制，可依使用者自行決定。若有一個以上的參數值為浮點數，則所有的參數值都會看成是浮點數，傳回的結果也是浮點數。若參數沒有一個是浮點數，則所有的參數值都會看成是整數，且傳回值也是整數。


數學函式庫 -- mt_getrandmax

數學函式庫

mt_getrandmax

(PHP3 >= 3.0.6 , PHP4)

mt_getrandmax --- 取得亂數最大值

語法 : int mt_getrandmax(void );

說明 :

傳回最大值，這可由呼叫mt_rand( )傳回。

參考
  : mt_rand( )  mt_srand(
  )  srand( )  rand(
  )  getrandmax( )


數學函式庫 -- mt_rand

數學函式庫

mt_rand

(PHP3 >= 3.0.6 , PHP4)

mt_rand --- 取得亂數值

語法 : int mt_rand( [int min [ , int max] ]);

說明 :

許多老舊libc的亂數產生器有著含糊或未知的特性，且速度較慢；此函式使用速度快四倍以上的馬其賽旋轉（Mersenne Twister）來替代libc亂數產生器。

若無參數min與max此函式會傳回一個在0和RAND_MAX之間亂取的數值，例如您想在5與15之間亂取一個數值，您可以在此函式中輸入mt_rand(5,15)。為使亂數的亂度最大，在取亂數前最好使用mt_srand()來設定亂數種子。

參考
  : mt_srand( )  mt_getrandmax(
  )  srand( )  rand(
  )  getrandmax( )


數學函式庫 -- mt_srand

數學函式庫

mt_srand

(PHP3 >= 3.0.6 , PHP4)

mt_srand --- 設定亂數種子

語法 : void mt_srand(int seed);

說明 :

設定亂數種子seed。

Example :

<?php

// seed with microseconds since last "whole" second

mt_srand((double)microtime()*1000000);

$randval = mt_rand();

?>

參考
  : mt_rand( )  mt_getrandmax(
  )  srand( )  rand(
  )  getrandmax( )


數學函式庫 -- number_format

數學函式庫

number_format

(PHP3 , PHP4)

number_format --- 將數字字串格式化

語法 : string number_format(float number, int decimals, string dec_point, string thousands_sep);

說明 :

number_format( )傳回number格式化後的字串，此函式可以是一個、二個或是四個參數，但不能是三個參數。

若只有給予一個參數number，number格式化後會捨去小數點後的值，且每一千就會以逗號（，）來隔開。

若有二個參數，number格式化後會到小數點第decimals位，且每一千就會以逗號來隔開。

若四個參數都存在，number格式化後會到小數點第decimals位，dec_point用來替代小數點（.），thousands_sep用來替代每一千隔開的逗號（，）。


數學函式庫 -- octdec

數學函式庫

octdec

(PHP3 , PHP4)

octdec --- 八進制轉十進制

語法 : int octdec(string octal_string);

說明 :

將參數octal_string八進制的值轉為十進制的值，此函式傳回的值為十進制的值。能轉換的最大值為八進制的17777777777或是十進制的2147483647。

參考 : decoct( )


數學函式庫 -- pi

數學函式庫

pi

(PHP3 , PHP4)

pi --- 取得圓週率pi的值

語法 : double pi(void );

說明 :

傳回圓週率pi的近似值。


數學函式庫 -- pow

數學函式庫

pow

(PHP3 , PHP4)

pow --- 傳回次方項的值

語法 : float pow(float base, float exp);

說明 :

傳回以base為基底，exp為次方項的值。

參考 : exp( )


數學函式庫 -- rad2deg

數學函式庫

rad2deg

(PHP3 >= 3.0.4 , PHP4)

rad2deg --- 轉換徑度值為度數

語法 : double rad2deg (double number)

說明 :

此函式將number從徑度轉換成度數。

參考 : deg2rad( )


數學函式庫 -- rand

數學函式庫

rand

(PHP3 , PHP4)

rand --- 產生亂數值

語法 : int rand( [int min] , [int max] );

說明 :

若無參數min與max，此函式傳回的值會介於0和RAND_MAX之間。例如：您想讓亂數值介於包含5和15之間，可使用rand(5,15)這種方式。在產生亂數值之前記得先使用srand()來設定亂數種子。

參考
  : srand( )  getrandmax(
  )  mt_rand( )  mt_srand(
  )  mt_getrandmax( )


數學函式庫 -- round

數學函式庫

round

(PHP3 , PHP4)

round --- 取四拾五入

語法 : double round(double val [ , int precision] );

說明 :

傳回四拾五入後val的值。

Example :

<?php

$foo = round( 3.4 ); // $foo == 3.0

$foo = round( 3.5 ); // $foo == 4.0

$foo = round( 3.6 ); // $foo == 4.0

?>

參考 : ceil( ) floor( )


數學函式庫 -- sin

數學函式庫

sin

(PHP3 , PHP4)

sin --- 取正弦值

語法 : float sin(float arg);

說明 :

傳回參數arg的正弦值(徑度)。

參考 : cos( ) tan( )


數學函式庫 -- sqrt

數學函式庫

sqrt

(PHP3 , PHP4)

sqrt --- 取平方根值

語法 : float sqrt(float arg);

說明 :

傳回參數arg的平方根值。


數學函式庫 -- srand

數學函式庫

srand

(PHP3 , PHP4)

srand --- 設定亂數種子

語法 : void srand(int seed);

說明 :

設定亂數種子seed。

Example :

<?php

// seed with microseconds since last "whole" second

srand((double)microtime()*1000000);

$randval = rand();

?>

參考
  : rand( )  getrandmax(
  )  mt_rand( )  mt_srand(
  )  mt_getrandmax( )


數學函式庫 -- tan

數學函式庫

tan

(PHP3 , PHP4)

tan --- 取正切值

語法 : float tan(float arg);

說明 :

傳回參數arg的正切值。

參考 : sin( ) cos( )


Mhash函式庫 -- mhash

Mhash函式庫

mhash

(PHP3 >= 3.0.9 , PHP4)

mhash --- 計算拼湊

語法 : string mhash (int hash, string data)

說明 :

mhash( )將參數data依照指定的拼湊方式hash將資料拼湊，並且傳回拼湊的結果。


Mhash函式庫 -- mhash_count

Mhash函式庫

mhash_count

(PHP3 >= 3.0.9 , PHP4)

mhash_count --- 取得最高的有效的拼湊 id

語法 : int mhash_count (void)

說明 :

mhash_count( )傳回最高的有效的拼湊 id，拼湊數值是從0到此拼湊 id。

Example :

<?php

$nr = mhash_count();

for ($i = 0; $i <= $nr; $i++) {

echo sprintf ("The blocksize of %s is %d\n", mhash_get_hash_name ($i), mhash_get_block_size ($i));

}

?>


Mhash函式庫 -- mhash_get_block_size

Mhash函式庫

mhash_get_block_size

(PHP3 >= 3.0.9 , PHP4)

mhash_get_block_size --- 取得拼湊的區塊大小

語法 : int mhash_get_block_size (int hash)

說明 :

mhash_get_block_size( )用來取得參數hash的區塊(block)的大小。

mhash_get_block_size( )取一參數hash，並且傳回位元組大小如果拼湊不存在，則傳回false。


Mhash函式庫 -- mhash_get_hash_name

Mhash函式庫

mhash_get_hash_name

(PHP3 >= 3.0.9 , PHP4)

mhash_get_hash_name --- 取得拼湊的名稱

語法 : string mhash_get_hash_name (int hash)

說明 :

mhash_get_hash_name( )用來取得指定的拼湊(hash)的名稱。

mhash_get_hash_name( )取參數的拼湊 id，並且傳回拼湊的名稱，如果拼湊不存在，則傳回false。

Example :

<?php

$hash = MHASH_MD5;

print mhash_get_hash_name ($hash);

?>

上面的範例將會顯示出 : MD5


雜項函式庫 -- connection_aborted

雜項函式庫

connection_aborted

(PHP3 >= 3.0.7 , PHP4 >= 4.0b4)

connection_aborted --- 如果與用戶端失去連線則傳回true

語法 : int connection_aborted (void )

說明 :

如果與用戶端(client)失去連線則傳回true。


雜項函式庫 -- connection_status

雜項函式庫

connection_status

(PHP3 >= 3.0.7 , PHP4 >= 4.0b4)

connection_status --- 傳回連線狀態

語法 : int connection_status (void )

說明 :

傳回連線狀態。


雜項函式庫 -- connection_timeout

雜項函式庫

connection_timeout

(PHP3 >= 3.0.7 , PHP4 >= 4.0b4)

connection_timeout --- 如果超過限定的執行時間則傳回true

語法 : int connection_timeout (void )

說明 :

如果PHP程式在執行時超過所限定的時間，則此函式傳回true。


雜項函式庫 -- create_function

雜項函式庫

create_function

(PHP4 >= 4.0.1)

create_function --- 建立匿名函式

語法 : string create_function (string args, string code)

說明 :

從傳遞的參數建立一個匿名的函式，並且傳回一個獨一無二的名稱。通常參數args將會傳遞成一個單引號字串，而參數code也是如此，使用單引號字串的理由是為了要從剖析中來保護變數名稱，否則，如果你使用雙引號的話，就必須要逃脫變數名稱，例如 : \$avar。

你可以使用這個函式，從執行時收集到的資訊來建立一個函式。

Example :

<?php

$newfunc = create_function('$a,$b','return "ln($a) + ln($b) = ".log($a * $b);');

echo "New anonymous function: $newfunc\n";

echo $newfunc(2,M_E)."\n";

// outputs

// New anonymous function: lambda_1

// ln(2) + ln(2.718281828459) = 1.6931471805599

?>

或者是擁有處理者(handler)函式，這可以請求一個運作的設定到一個參數的列表。

Example :

<?php

function process($var1, $var2, $farr) {

for ($f=0; $f < count($farr); $f++)

echo $farr[$f]($var1,$var2)."\n";

}

// create a bunch of math functions

$f1 = 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}';

$f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);";

$f3 = 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b;} else {return false;}';

$farr = array(

create_function('$x,$y', 'return "some trig: ".(sin($x) + $x*cos($y));'),

create_function('$x,$y', 'return "a hypotenuse: ".sqrt($x*$x + $y*$y);'),

create_function('$a,$b', $f1), create_function('$a,$b', $f2),

create_function('$a,$b', $f3)

);

echo "\nUsing the first array of anonymous functions\n";

echo "parameters: 2.3445, M_PI\n";

process(2.3445, M_PI, $farr);

// now make a bunch of string processing functions

$garr = array(

create_function('$b,$a','if (strncmp($a,$b,3) == 0) return "** \"$a\" '.

'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),

create_function('$a,$b','; return "CRCs: ".crc32($a)." , ".crc32(b);'),

create_function('$a,$b','; return "similar(a,b) = ".similar_text($a,$b,&$p)."($p%)";')

);

echo "\nUsing the second array of anonymous functions\n";

process("Twas brilling and the slithy toves", "Twas the night", $garr);

?>

當你執行上面的範例時，輸出將會是 :

Using the first array of anonymous functions

parameters: 2.3445, M_PI

some trig: -1.6291725057799

a hypotenuse: 3.9199852871011

b*a^2 = 4.8103313314525

min(b^2+a, a^2,b) = 8.6382729035898

ln(a/b) = 0.27122299212594

Using the second array of anonymous functions

** "Twas the night" and "Twas brilling and the slithy toves"

** Look the same to me! (looking at the first 3 chars)

CRCs: -725381282 , 1908338681

similar(a,b) = 11(45.833333333333%)

匿名函式常見的使用是用來建立callback函式，例如 : 當使用array_walk( )或usort( )時 :

<?php

$av = array("the ","a ","that ","this ");

array_walk($av, create_function('&$v,$k','$v = $v."mango";'));

print_r($av); // for PHP3 use var_dump( )

// outputs:

// Array

// (

// [0] => the mango

// [1] => a mango

// [2] => that mango

// [3] => this mango

// )

// an array of strings ordered from shorter to longer

$sv = array("small","larger","a big string","it is a string thing");

print_r($sv);

// outputs:

// Array

// (

// [0] => small

// [1] => larger

// [2] => a big string

// [3] => it is a string thing

// )

// sort it from longer to shorter

usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));

print_r($sv);

// outputs:

// Array

// (

// [0] => it is a string thing

// [1] => a big string

// [2] => larger

// [3] => small

// )

?>


雜項函式庫 -- define

雜項函式庫

define

(PHP3 , PHP4)

define --- 定義常數名稱

語法 : int define (string name, mixed value [, int case_insensitive])

說明 :

定義一常數名稱，類似於變數，不同處在於：

  • 常數的前面沒有錢($)的符號
  • 常數可在任何地方存取，不需考慮變數範圍規則
  • 常數一旦設定後就不需再下定義
  • 常數可以只求數量的值

參數name是常數的名稱，value是常數的值。

如果把第三個參數case_insensitive設為1，則常數將會定義成不區分大小寫。預設上是區分大小寫的，例如 : CONSTANT和Constant代表著不同的值。

Example :

<?php

define ("CONSTANT", "Hello world.");

echo CONSTANT; // outputs "Hello world."

?>

define( )成功則傳回TRUE，如果發生錯誤則傳回FALSE。

參考 : defined( )


雜項函式庫 -- defined

雜項函式庫

defined

(PHP3 , PHP4)

defined --- 檢查常數是否存在

語法 : int defined (string name)

說明 :

如果常數名稱name已經定義了則傳回true，否則傳回false。

參考 : define( )


雜項函式庫 -- die

雜項函式庫

die

(unknown)

die --- 輸出訊息並且終止程式的剖析

語法 : void die (string message)

說明 :

這個語言建造輸出一個訊息並且終止程式的剖析，它不會傳回任何東西。

Example :

<?php

$filename = '/path/to/data-file';

$file = fopen ($filename, 'r') or die("unable to open file ($filename)");

?>

參考 : exit( )


雜項函式庫 -- eval

雜項函式庫

eval

(unknown)

eval --- 求出字串PHP程式碼的值

語法 : mixed eval (string code_str)

說明 :

eval( )求出字串參數 code_str PHP程式碼的值，除此之外，還可以用來將程式碼儲存在資料庫文字欄位中給後來的程式執行。

使用eval( )時有些要素必須要記得，傳遞給函式的參數必須是有效的PHP程式碼，包括程式終止說明的分號(；)，這樣一來才不會出現錯誤，並且要適當的逃脫參數code_str中的東西。

在eval( )中給予的變數值，將會保留這些值在後來的程式中。

return的說明，將會立刻的終止字串的求值，在PHP4中，你可以使用return來傳回一個值，這個值將會成為eval( )的結果，在PHP3中，它不會傳回任何東西。

Example :

<?php

$string = 'cup';

$name = 'coffee';

$str = 'This is a $string with my $name in it.<br>';

echo $str; eval ("\$str = \"$str\";");

echo $str;

?>

上面的範例將會顯示出 :

This is a $string with my $name in it.

This is a cup with my coffee in it.


雜項函式庫 -- exit

雜項函式庫

exit

(unknown)

exit --- 終止目前程式

語法 : void exit(void);

說明 :

這個語言建造終止程式的剖析，它不會傳回任何值。

參考 : die( )


雜項函式庫 -- func_get_arg

雜項函式庫

func_get_arg

(PHP4 >= 4.0b4)

func_get_arg --- 從參數列表傳回項目

語法 : int func_get_arg (int arg_num)

說明 :

傳回使用者定義函式的參數列表的第arg_num個參數，函式的參數是從0開始計算。如果是從函式定義的外面來呼叫此函式，則func_get_arg( )將會產生警告。

如果arg_num大於函式實際傳遞參數的數目，則將會產生警告並且func_get_arg( )將會傳回FALSE。

Example :

<?php

function foo() {

$numargs = func_num_args();

echo "Number of arguments: $numargs<br>\n";

if ($numargs >= 2) {

echo "Second argument is: " . func_get_arg (1) . "<br>\n";

}

}

foo (1, 2, 3);

?>

func_get_arg( )可以用來結合func_num_args( )和func_get_args( )來允許使用者定義的函式接受variable-length參數列表。

注意 : 此函式是PHP4中新增的函式


雜項函式庫 -- func_get_args

雜項函式庫

func_get_args

(PHP4 >= 4.0b4)

func_get_args --- 傳回包含函式的參數列表的陣列

語法 : int func_get_args (void )

說明 :

傳回一陣列，陣列的各個元素相當於是目前使用者定義函式的參數列的數目。如果是從函式定義的外面來呼叫此函式，則func_get_arg( )將會產生警告。

Example :

<?php

function foo() {

$numargs = func_num_args();

echo "Number of arguments: $numargs<br>\n";

if ($numargs >= 2) {

echo "Second argument is: " . func_get_arg (1) . "<br>\n";

}

$arg_list = func_get_args();

for ($i = 0; $i < $numargs; $i++) {

echo "Argument $i is: " . $arg_list[$i] . "<br>\n";

}

}

foo (1, 2, 3);

?>

func_get_args( )可以用來結合func_num_args( )和func_get_arg( )來允許使用者定義的函式接受variable-length參數列表。

注意 : 此函式是PHP4中新增的函式


雜項函式庫 -- func_num_args

雜項函式庫

func_num_args

(PHP4 >= 4.0b4)

func_num_args --- 傳回傳遞到函式的參數數目

語法 : int func_num_args (void )

說明 :

傳回傳遞到目前使用者定義函式的參數數目。如果是從函式定義的外面來呼叫此函式，則func_get_arg( )將會產生警告。

Example :

<?php

function foo() {

$numargs = func_num_args();

echo "Number of arguments: $numargs\n";

}

foo (1, 2, 3); // Prints 'Number of arguments: 3'

?>

func_num_args( )可以用來結合func_get_arg( )和func_get_args( )來允許使用者定義的函式接受variable-length參數列表。

注意 : 此函式是PHP4中新增的函式


雜項函式庫 -- function_exists

雜項函式庫

function_exists

(PHP3 >= 3.0.7 , PHP4)

function_exists --- 檢查函式是否已經定義

語法 : int function_exists (string function_name)

說明 :

檢查函式名稱function_name是否已經定義了，如果找到給予的函式名稱則傳回true，否則傳回false。


雜項函式庫 -- get_browser

雜項函式庫

get_browser

(PHP3 , PHP4)

get_browser --- 識別使用者的瀏灠器的能力

語法 : object get_browser ([string user_agent])

說明 :

get_browser( )試著去測定使用者的瀏灠器的能力，這是查詢browscap.ini檔案中，瀏灠器的資訊。預設上是使用$HTTP_USER_AGENT的值，不過你可以傳遞參數user_agent來改變它。

所傳回的資訊是一物件型態，代表著各種的資料元素，例如 : 瀏灠器的較大和較小的版本與ID字串，JavaScript，cookies等等。

下面範例顯示獲得使用者的瀏灠器的所有變數資訊 :

Example :

<?php

function list_array ($array) {

while (list ($key, $value) = each ($array)) {

$str .= "<b>$key:</b> $value<br>\n";

} return $str;

}

echo "$HTTP_USER_AGENT<hr>\n";

$browser = get_browser();

echo list_array ((array) $browser);

?>

上面範例的輸出將會像是以下這樣 :

Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)<hr>

<b>browser_name_pattern:</b> Mozilla/4\.5.*<br>

<b>parent:</b> Netscape 4.0<br>

<b>platform:</b> Unknown<br>

<b>majorver:</b> 4<br>

<b>minorver:</b> 5<br>

<b>browser:</b> Netscape<br>

<b>version:</b> 4<br>

<b>frames:</b> 1<br>

<b>tables:</b> 1<br>

<b>cookies:</b> 1<br>

<b>backgroundsounds:</b> <br>

<b>vbscript:</b> <br>

<b>javascript:</b> 1<br>

<b>javaapplets:</b> 1<br>

<b>activexcontrols:</b> <br>

<b>beta:</b> <br> <b>crawler:</b> <br>

<b>authenticodeupdate:</b> <br>

<b>msn:</b> <br>

為了使它能運作，你的browscap結構檔必須指到正確的browscap.ini的位置


雜項函式庫 -- highlight_file

雜項函式庫

highlight_file

(PHP4)

highlight_file --- 顯示語法字串的彩色顏色

語法 : void highlight_file (string filename)

說明 :

highlight_file( )使用PHP中所定義語法的顏色來顯示filename中程式碼的語法的顏色。

Example : Creating a source highlighting URL

安排一個URL，你可以將任何程式碼傳遞給它，它可以顯示程式碼的顏色。我們將利用apache中的"ForceType"指令來產生一個適宜的URL樣式(pattern)，並且使用highlight_file( )來顯示程式。

在 httpd.conf中你可以加入下列這幾行 :

<Location /source>

ForceType application/x-httpd-php

</Location>

然後建立一個檔名為"source"的檔案，並且將它放在你的web根目錄

<HTML>

<HEAD>

<TITLE>Source Display</TITLE>

</HEAD>

<BODY BGCOLOR="white">

<?php

$script = getenv ("PATH_TRANSLATED");

if(!$script) {

echo "<BR><B>ERROR: Script Name needed</B><BR>";

} else {

if (ereg("(\.php|\.inc)$",$script)) {

echo "<H1>Source of: $PATH_INFO</H1>\n<HR>\n";

highlight_file($script);

} else {

echo "<H1>ERROR: Only PHP or include script names are allowed</H1>";

}

} echo "<HR>Processed: ".date("Y/M/d H:i:s",time());

?>

</BODY>

</HTML>

然後你可以使用像是下方的URL來顯示位於"/path/to/script.php"的彩色程式碼

http://your.server.com/source/path/to/script.php

參考 : highlight_string( ) show_source( )


雜項函式庫 -- highlight_string

雜項函式庫

highlight_string

(PHP4)

highlight_string --- 顯示語法字串的彩色顏色

語法 : void highlight_string (string str)

說明 :

highlight_string( )使用PHP中所定義語法的顏色來顯示出參數 str 的語法彩色顏色。

參考 : highlight_file( ) show_source( )


雜項函式庫 -- ignore_user_abort

雜項函式庫

ignore_user_abort

(PHP3 >= 3.0.7 , PHP4 >= 4.0b4)

ignore_user_abort --- 設定是否用戶端失去連線時將終止程式執行

語法 : int ignore_user_abort ([int setting])

說明 :

這個函式設定是否用戶端(client)失去連線時，將終止程式的執行。它會傳回先前的設定值，而且也可以以無參數的方式來呼叫此函式，這樣能不改變目前的設定值，並且傳回目前的設定值。


雜項函式庫 -- iptcparse

雜項函式庫

iptcparse

(PHP3 >= 3.0.6 , PHP4)

iptcparse --- 剖析二進制IPTC區塊成為它的單一旗標

語法 : array iptcparse (string iptcblock)

說明 :

這個函式剖析一個二進制IPTC區塊(block)成為它的單一旗標，它所傳回的陣列是以標籤標誌(tagmarker)為索引，陣列的值為其值。如果沒有找到IPTC資料或是錯誤時則傳回false。


雜項函式庫 -- leak

雜項函式庫

leak

(PHP3 , PHP4)

leak --- 滲漏記憶體

語法 : void leak (int bytes)

說明 :

leak( )滲漏指定的記憶體總數。

當各個請求完成時，將自動地清除"leaked"記憶體。


雜項函式庫 -- pack

雜項函式庫

pack

(PHP3 , PHP4)

pack --- 包裹資料成為二進制字串

語法 : string pack (string format [, mixed args ...])

說明 :

依照參數format來包裹給予的參數成為二進制字串，傳回二進制字串。

這個函式的構想是取自Perl，而且所有的格式碼(formatting code)都一樣，可是確缺少了有一些格式碼，像是Perl的 "u" 格式碼。格式化字串是由格式碼所構成，跟隨一個非必需的 repeater參數，repeater參數可以是個整數值或是 *。參數format為 a , A , h , H時，repeat 計算一個資料參數取多少字元。參數format為@時，它是個放置下一個資料的絶對位置。否則，repeat 計算指定消耗(consumed)多少資料參數，並且包裹成二進制字串。目前format的格式有 :

  • a -- NULL填塞字串

  • A -- SPACE填塞字串

  • h -- 十六進位字串，開始為低字元

  • H -- 十六進位字串，開始為高字元

  • c -- 符號字元

  • C -- 無符號字串

  • s -- 符號短的(永遠是16位元，機器位元組順序)

  • S -- 無符號短的(永遠是16位元，機器位元組順序)

  • n -- 無符號短的(永遠是16位元，大的位元組在字尾的順序)

  • v -- 無符號短的(永遠是16位元，小的位元組在字尾的順序)

  • i -- 符號整數(機器依靠大小和位元組順序)

  • I -- 無符號整數(機器依靠大小和位元組順序)

  • l -- 符號長整數(永遠是32位元，機器位元組順序)

  • L -- 無符號長整數(永遠是32位元，機器位元組順序)

  • N -- 無符號長整數(永遠是32位元，大的位元組在字尾的順序)

  • V -- 無符號長整數(永遠是32位元，小的位元組在字尾的順序)

  • f -- 浮點數(機器依靠大小和表示)

  • d -- 倍浮點數(機器依靠大小和表示)

  • x -- NULL位元組

  • X -- 退後一位元組

  • @ -- 填滿NULL到絶對位置

Example :

<?php

$binarydata = pack ("nvc*", 0x1234, 0x5678, 65, 66);

?>

二進制字串的結果將會是6個位元組長而且包含位元組順序0x12, 0x34, 0x78, 0x56, 0x41, 0x42

注意 : pack( )符號和無符號的區別只對unpack( )有作用


雜項函式庫 -- register_shutdown_function

雜項函式庫

register_shutdown_function

(PHP3 >= 3.0.4 , PHP4)

register_shutdown_function --- 設定程式執行完後執行的函式

語法 : int register_shutdown_function (string func)

說明 :

當程式處理完成時，執行函式名為func的函式。


雜項函式庫 -- serialize

雜項函式庫

serialize

(PHP3 >= 3.0.5 , PHP4)

serialize --- 產生一個可儲存的值的表示

語法 : string serialize (mixed value)

說明 :

serialize( )傳回一個包含由value所表示的byte-stream字串，它能儲存在任何地方。

這可用來儲存或傳遞PHP的值，而不失去它們的型態和結構。

使用unserialize( )能使serialized字串再次成為原來PHP的值。serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized，但方法則會lose)

Example :

<?php

// $session_data contains a multi-dimensional array with session

// information for the current user. We use serialize() to store

// it in a database at the end of the request.

$conn = odbc_connect ("webdb", "php", "chicken");

$stmt = odbc_prepare ($conn, "UPDATE sessions SET data = ? WHERE id = ?");

$sqldata = array (serialize($session_data), $PHP_AUTH_USER);

if (!odbc_execute ($stmt, &$sqldata)) {

$stmt = odbc_prepare($conn, "INSERT INTO sessions (id, data) VALUES(?, ?)");

if (!odbc_execute($stmt, &$sqldata)) {

/* Something went wrong. Bitch, whine and moan. */

}

}

?>


雜項函式庫 -- show_source

雜項函式庫

show_source

(PHP4)

show_source --- 顯示語法字串的彩色顏色

語法 : void show_source (string filename)

說明 :

show_source( )使用PHP中所定義語法的顏色來顯示filename中程式碼的語法的顏色。

注意 : 此函式是highlight_file( )的別名

參考 : highlight_string( ) highlight_file( )


雜項函式庫 -- sleep

雜項函式庫

sleep

(PHP3 , PHP4)

sleep --- 延遲執行

語法 : void sleep (int seconds)

說明 :

sleep( )延遲程式執行seconds秒。

參考 : usleep( )


雜項函式庫 -- uniqid

雜項函式庫

uniqid

(PHP3 , PHP4)

uniqid --- 產生唯一的 id

語法 : int uniqid (string prefix [, boolean lcg])

說明 :

uniqid( )傳回目前時間百萬分之一秒的一個唯一的identifier，如果你同時地在數個主機上產生identifier，可能會發生在相同的百萬分之一秒上產生identifier，這時便可使用參數prefix，參數prefix可以到114個字元長。

如果非必需的參數lcg設為true，uniqid( )將會在傳回值的後面增加額外的"combined LCG"，這可使結果更加的獨一無二。

空的prefix，傳回的字串將會是13個字元長，如果lcg為true，則會是23個字元長。

注意 : 參數lcg只有在PHP4和PHP3.0.13和較新的版中才有效

如果你需要一個唯一的identifier或是標記，並且你打算要經由network(例如 : session cookies)來公佈這個標記，你可以這樣使用 :

Example :

<?php

$token = md5 (uniqid ("")); // no random portion

$better_token = md5 (uniqid (rand())); // better, difficult to guess

?>

這將會產生出32字元長的identifier。


雜項函式庫 -- unpack

雜項函式庫

unpack

(PHP3 , PHP4)

unpack --- 從二進制字串取出資料

語法 : array unpack (string format, string data)

說明 :

unpack( )按照參數format將二進制字串成為陣列，傳回的陣列包含了取出(unpack)二進制字串的元素。

unpack( )的運作與Perl有稍微的不同，此函式取出的資料是儲存在陣列之中。為達到這個，你必須要有不同的格式碼名稱，並且以斜線 / 將它們分隔開來。

Example :

<?php

$array = unpack ("c2chars/nint", $binarydata);

?>

陣列的結果將會包含"chars1"，"chars2"和 "int"。

格式碼的說明請參考 : pack( )


雜項函式庫 -- unserialize

雜項函式庫

unserialize

(PHP3 >= 3.0.5 , PHP4)

unserialize --- 從儲存的值中建立PHP的值

語法 : mixed unserialize (string str)

說明 :

unserialize( )取一個serialized變數(參考serialize( ))，並且將它轉換回PHP的值，傳回轉換後的值，而且可以是integer、double、string、array、object。如果物件有serialized，則它的方法不會保存在所傳回的值之中。

Example :

<?php

// Here, we use unserialize() to load session data from a database

// into $session_data. This example complements the one described

// with serialize( ).

$conn = odbc_connect ("webdb", "php", "chicken");

$stmt = odbc_prepare ($conn, "SELECT data FROM sessions WHERE id = ?");

$sqldata = array ($PHP_AUTH_USER);

if (!odbc_execute ($stmt, &$sqldata) || !odbc_fetch_into ($stmt, &$tmp)) {

// if the execute or fetch fails, initialize to empty array

$session_data = array();

} else {

// we should now have the serialized data in $tmp[0].

$session_data = unserialize ($tmp[0]);

if (!is_array ($session_data)) {

// something went wrong, initialize to empty array

$session_data = array();

}

}

?>


雜項函式庫 -- usleep

雜項函式庫

usleep

(PHP3 , PHP4)

usleep --- 延遲執行百萬分之一秒

語法 : void usleep (int micro_seconds)

說明 :

usleep( )延遲程式執行micro_seconds秒。

注意 : 此函式無法運作在Windows系統

參考 : sleep( )


MySQL函式庫 -- mysql_affected_rows

MySQL函式庫

mysql_affected_rows

(PHP3 , PHP4)

mysql_affected_rows --- 取得先前操作MySQL所受到影響的列的數目

語法 : int mysql_affected_rows ([int link_identifier])

說明 :

mysql_affected_rows( )傳回最後查詢為INSERT、UPDATE或DELETE所影響的列數目，如果沒有指定連結identifier，則假定使用最後開啟的連結。

如果最後的查詢為DELETE，而且無WHERE指令，所有的記錄將會全部從TABLE中刪除，但此函式將會傳回0。

最後的查詢若是使用SELECT指令，則本函式是無效的。


MySQL函式庫 -- mysql_change_user

MySQL函式庫

mysql_change_user

(PHP3 >= 3.0.13)

mysql_change_user --- 更改連線的使用者

語法 : int mysql_change_user (string user, string password [, string database [, int link_identifier]])

說明 :

mysql_change_user( )更改目前連線的使用者，或依照給予的非必需選項link_identifier來連結。如果有指定資料庫，當使用者更改完成時這將是預設或是目前的資料庫，如果新的使用者和密碼授權失敗時，則維持原先的使用者。

注意 : 此函式在PHP3.0.13中引進，且需要MySQL 3.23.3以上的版本


MySQL函式庫 -- mysql_close

MySQL函式庫

mysql_close

(PHP3 , PHP4)

mysql_close --- 關閉MySQL連線

語法 : int mysql_close ([int link_identifier])

說明 :

成功則傳回true，失敗則傳回false。

mysql_close( )關閉連結到MySQL資料庫的連線，如果沒有指定link_identifier，將會關閉最後與MySQL的連線。

注意 : 這通常是非必需的，非持續(persistent)連結所開啟的連結會在程式的執行完成後自動地關閉連結。

mysql_close( )將無法關閉由mysql_pconnect( )所產生的持續連結

Example :

<?php

$link = mysql_connect ("kraemer", "marliesle", "secret") or die ("Could not connect");

print ("Connected successfully");

mysql_close ($link);

?>

參考 : mysql_connect( ) mysql_pconnect( )


MySQL函式庫 -- mysql_connect

MySQL函式庫

mysql_connect

(PHP3 , PHP4)

mysql_connect --- 開啟MySQL伺服器連線

語法 : int mysql_connect ([string hostname [:port] [:/path/to/socket] [, string username [, string password]]])

說明 :

成功則傳回一正數的MySQL連結identifier，失敗則傳回錯誤訊息。

mysql_connect( )建立MySQL伺服器連結，所有的參數都是非必需的，如果都沒給參數值，則預設上假定是( 'localhost' , 擁有伺服器處理的使用者名稱 , 沒有密碼)。

hostname也可以包含埠號，例如 : "hostname:port"或是socket路徑，例如 : ":/path/to/socket"

注意 : PHP3.0B4中增加了提供":port" ， PHP3.0.10中增加了提供":/path/to/socket"，你可使用'@'(@mysql_connect( ) )來抑制錯誤時所傳回的訊息。

假使第二次以相同的參數來呼叫mysql_connect( )，將不會建立新的連結，但會傳回先前開啟的結連identifier來替代。

程式執行結束後，將會立刻關閉連結到伺服器，除非提早呼叫mysql_close( )來關閉。

Example :

<?php

$link = mysql_connect ("kraemer", "marliesle", "secret") or die ("Could not connect");

print ("Connected successfully");

mysql_close ($link);

?>

參考 : mysql_pconnect( ) mysql_close( )


MySQL函式庫 -- mysql_create_db

MySQL函式庫

mysql_create_db

(PHP3 , PHP4)

mysql_create_db --- 新增一個MySQL資料庫

語法 : int mysql_create_db (string database name [, int link_identifier])

說明 :

mysql_create_db( )試著在伺服器上建立一個新的資料庫。

Example :

<?php

$link = mysql_pconnect ("kron", "jutta", "geheim") or die ("Could not connect");

if (mysql_create_db ("my_db")) {

print ("Database created successfully\n");

} else {

printf ("Error creating database: %s\n", mysql_error ());

}

?>

相容的mysql_createdb( )也可以使用

參考 : mysql_drop_db( )


MySQL函式庫 -- mysql_data_seek

MySQL函式庫

mysql_data_seek

(PHP3 , PHP4)

mysql_data_seek --- 移動內部指標

語法 : int mysql_data_seek (int result_identifier, int row_number)

說明 :

成功則傳回true，失敗則傳回false。

mysql_data_seek( )移動MySQL內部的列指標到指定列的數目，之後以呼叫mysql_fetch_row( )將會傳回此列。

row_number起始值為0。

Example :

<?php

$link = mysql_pconnect ("kron", "jutta", "geheim") or die ("Could not connect");

mysql_select_db ("samp_db") or die ("Could not select database");

$query = "SELECT last_name, first_name FROM friends";

$result = mysql_query ($query) or die ("Query failed");

# fetch rows in reverse order

for ($i = mysql_num_rows ($result) - 1; $i >=0; $i--) {

if (!mysql_data_seek ($result, $i)) {

printf ("Cannot seek to row %d\n", $i); continue;

}

if(!($row = mysql_fetch_object ($result)))

continue;

printf ("%s %s<BR>\n", $row->last_name, $row->first_name);

}

mysql_free_result ($result);

?>


MySQL函式庫 -- mysql_db_query

MySQL函式庫

mysql_db_query

(PHP3 , PHP4)

mysql_db_query --- 送出MySQL查詢

語法 : int mysql_db_query (string database, string query [, int link_identifier])

說明 :

成功則傳回一正數的MySQL查詢結果identifier，失敗則傳回false。

mysql_db_query( )選擇一個資料庫且在此資料庫執行查詢，如果非必需選項link_identifier沒有指定，此函式會試著去找出開啟的MySQL連結，如果找不到時，它會試著去建立一個，就像是以呼叫無任何參數的mysql_connect( )。

相容的mysql( )也可以使用。

參考 : mysql_connect( )


MySQL函式庫 -- mysql_drop_db

MySQL函式庫

mysql_drop_db

(PHP3 , PHP4)

mysql_drop_db --- 刪除MySQL資料庫

語法 : int mysql_drop_db (string database_name [, int link_identifier])

說明 :

成功則傳回true，失敗則傳回false。

mysql_drop_db( )試著從伺服器刪除一整個資料庫。

相容的mysql_dropdb( )也可以使用。

參考 : mysql_create_db( )


MySQL函式庫 -- mysql_errno

MySQL函式庫

mysql_errno

(PHP3 , PHP4)

mysql_errno --- 從先前MySQL操作傳回錯誤訊息代號

語法 : int mysql_errno ([int link_identifier])

說明 :

從最後的MySQL函式傳回錯誤訊息代號，如果沒有發生錯誤則傳回0(zero)。

從MySQL資料庫所傳回來的錯誤可以使用mysql_errno( )來獲得錯誤代號，注意 : 此函式只從最近執行MySQL函式 (不包含mysql_error( )與mysql_errno( ) )傳回錯誤代碼，因此如果你想要使用它，請在呼叫其它MySQL函式之前確保你已檢查其值。

Example :

<?php

mysql_connect("marliesle");

echo mysql_errno().": ".mysql_error()."<BR>";

mysql_select_db("nonexistentdb");

echo mysql_errno().": ".mysql_error()."<BR>";

$conn = mysql_query("SELECT * FROM nonexistenttable");

echo mysql_errno().": ".mysql_error()."<BR>";

?>

參考 : mysql_error( )


MySQL函式庫 -- mysql_error

MySQL函式庫

mysql_error

(PHP3 , PHP4)

mysql_error --- 從先前MySQL操作傳回錯誤訊息

語法 : int mysql_error ([int link_identifier])

說明 :

從最後的MySQL函式傳回錯誤訊息代號，如果沒有發生錯誤則傳回0(zero)。

從MySQL資料庫所傳回來的錯誤可以使用mysql_error( )來獲得錯誤訊息，注意 : 此函式只從最近執行MySQL函式 (不包含mysql_error( )與mysql_errno( ) )傳回錯誤訊息，因此如果你想要使用它，請在呼叫其它MySQL函式之前確保你已檢查其值。

Example :

<?php

mysql_connect("marliesle");

echo mysql_errno().": ".mysql_error()."<BR>";

mysql_select_db("nonexistentdb");

echo mysql_errno().": ".mysql_error()."<BR>";

$conn = mysql_query("SELECT * FROM nonexistenttable");

echo mysql_errno().": ".mysql_error()."<BR>";

?>

參考 : mysql_errno( )


MySQL函式庫 -- mysql_fetch_array

MySQL函式庫

mysql_fetch_array

(PHP3 , PHP4)

mysql_fetch_array --- 取得查詢後的陣列結果

語法 : array mysql_fetch_array (int result [, int result_type])

說明 :

傳回一陣列，此陣列相當於取得列，如果沒有更多的列則傳回false。

mysql_fetch_array( )是mysql_fetch_row( )的延伸版本，除了將資料儲存在陣列的數字索引之外，它也能儲存資料在組合的索引之中，使用欄位名稱當作是索引值。

如果查詢的結果有二個以上的欄位都是相同的名稱時，則最後的欄位為有效，為了存取相同名稱的欄位，你必須為欄位取個別名。

select t1.f1 as foo t2.f1 as bar from t1, t2

mysql_fetch_array( )的第二個參數result_type是必非需的，result_type是個常數且有以下的值 : MYSQL_ASSOC，MYSQL_NUM 及 MYSQL_BOTH(這是PHP3.0.7中新增的)

欲知詳情請參考 : mysql_fetch_row( )

Example :

<?php

mysql_connect ($host, $user, $password);

$result = mysql_db_query ("database","select * from table");

while ($row = mysql_fetch_array ($result)) {

echo $row["user_id"];

echo $row["fullname"];

}

mysql_free_result ($result);

?>


MySQL函式庫 -- mysql_fetch_field

MySQL函式庫

mysql_fetch_field

(PHP3 , PHP4)

mysql_fetch_field --- 取得欄位資訊

語法 : object mysql_fetch_field (int result [, int field_offset])

說明 :

傳回一包含欄位資訊的物件。

mysql_fetch_field( )能用來為了獲得某些查詢的結果中欄位的資訊，如果沒有指定欄位的偏移量(offset)，則無法以mysql_fetch_field( )獲得下一個欄位。

傳回的物件其內容有 :

name—欄位名稱

table—欄位所在的table名稱

max_length—欄位的最大長度

not_null— 1表示欄位不能為空(null)的

primary_key—1表示欄位是主要鍵(primary key)

unique_key—1表示欄位是唯一鍵(unique key)

multiple_key—1表示欄位非唯一鍵(non-unique key)

numeric—1表示欄位為數值的

blob—1表示欄位為BLOB

type—欄位的型態

unsigned—1表示欄位為無記號(unsigned)

zerofill—1表示欄位被零填滿(zero-filled)

Example :

<?php

mysql_connect ($host, $user, $password) or die ("Could not connect");

$result = mysql_db_query ("database", "select * from table") or die ("Query failed");

# get column metadata

$i = 0;

while ($i < mysql_num_fields ($result)) {

echo "Information for column $i:<BR>\n";

$meta = mysql_fetch_field ($result);

if (!$meta) {

echo "No information available<BR>\n";

}

echo "<PRE>

blob: $meta->blob

max_length: $meta->max_length

multiple_key: $meta->multiple_key

name: $meta->name

not_null: $meta->not_null

numeric: $meta->numeric

primary_key: $meta->primary_key

table: $meta->table

type: $meta->type

unique_key: $meta->unique_key

unsigned: $meta->unsigned

zerofill: $meta->zerofill

</PRE>";

$i++;

}

mysql_free_result ($result);

?>

參考 : mysql_field_seek( )


MySQL函式庫 -- mysql_fetch_lengths

MySQL函式庫

mysql_fetch_lengths

mysql_fetch_lengths --- 取得各欄位最大長度

語法 : array mysql_fetch_lengths (int result)

說明 :

將mysql_fetch_row( )取得的最後列之中各個欄位的長度放入陣列中傳回，失敗則傳回false。

mysql_fetch_lengths( )儲存由mysql_fetch_row( )、mysql_fetch_array( )、mysql_fetch_object( )所傳回的最後列之中各個欄位的長度。

參考 : mysql_fetch_row( )


MySQL函式庫 -- mysql_fetch_object

MySQL函式庫

mysql_fetch_object

(PHP3 , PHP4)

mysql_fetch_object --- 取得查詢後的物件結果

語法 : object mysql_fetch_object (int result [, int result_typ])

說明 :

傳回一物件，此物件相當於取得列，如果沒有更多列則傳回fales。

mysql_fetch_object( )類似於mysql_fetch_array( )，有一點不同的是此函式傳回的是物件來替代陣列，間接的意思是說你可以以欄位名稱來存取資料，且不是以它們的偏移量(offset)(數字是非法的屬性名稱)

非必需選項 result_type 是個常數且可以是下列的值 : MYSQL_ASSOC， MYSQL_NUM， MYSQL_BOTH。

此函式和mysql_fetch_array( )相同，且在速度上也和mysql_fetch_row( )差不多。

Example :

<?php

mysql_connect ($host, $user, $password);

$result = mysql_db_query ("database", "select * from table");

while ($row = mysql_fetch_object ($result)) {

echo $row->user_id; echo $row->fullname;

}

mysql_free_result ($result);

?>

參考 : mysql_fetch_array( ) mysql_fetch_row( )


MySQL函式庫 -- mysql_fetch_row

MySQL函式庫

mysql_fetch_row

(PHP3 , PHP4)

mysql_fetch_row --- 取得單列結果

語法 : array mysql_fetch_row (int result)

說明 :

傳回一陣列，此陣列相當於取得列，如果沒有更多列則傳回false。

mysql_fetch_row( )從結果取得資料的一列，將列放入陣列中傳回，各個結果欄位儲存在陣列偏移量之中，偏移量的起始值為0。

隨後呼叫mysql_fetch_row( )將傳回結果中的下一列，如果沒有更多列則傳回false。

參考 : mysql_fetch_array( ) mysql_fetch_object( ) mysql_data_seek( ) mysql_fetch_lengths( )

mysql_result( )


MySQL函式庫 -- mysql_field_flags

MySQL函式庫

mysql_field_flags

(PHP3 , PHP4)

mysql_field_flags --- 取得指定欄位的旗標

語法 : string mysql_field_flags (int result, int field_offset)

說明 :

mysql_field_flags( )傳回指定欄位的欄位旗標，所傳回的旗標是個單字且每個旗標之間都以單個空白鍵來區隔，因此你可以使用explode( )將它切開來。

下列是傳回的旗標 ，如果你的MySQL版本足夠去提供它們的話 : "not_null"， "primary_key"，"unique_key"，"multiple_key"，"blob"，"unsigned"，"zerofill"，"binary"， "enum"，"auto_increment"，"timestamp"。

相容的mysql_fieldflages( )也何以使用。


MySQL函式庫 -- mysql_field_len

MySQL函式庫

mysql_field_len

(PHP3 , PHP4)

mysql_field_len --- 取得指定欄位的長度

語法 : int mysql_field_len (int result, int field_offset)

說明 :

mysql_field_len( )傳回指定欄位的長度，相容的mysql_fieldlen( )也可以使用。


MySQL函式庫 -- mysql_field_name

MySQL函式庫

mysql_field_name

(PHP3 , PHP4)

mysql_field_name --- 取得指定欄位的名稱

語法 : string mysql_field_name (int result, int field_index)

說明 :

mysql_field_name( )傳回指定欄位的名稱，函式的參數是結果 identifier與欄位索引，例如 : mysql_field_name($result , 2); 將會傳回結果中第二個欄位的名稱。

相容的mysql_fieldname( )也可以使用。


MySQL函式庫 -- mysql_field_seek

MySQL函式庫

mysql_field_seek

(PHP3 , PHP4)

mysql_field_seek --- 設定結果指標到指定的欄位偏移量

語法 : int mysql_field_seek (int result, int field_offset)

說明 :

指到指定的欄位偏移量，如果下次呼叫mysql_fetch_field( )時沒有包含欄位偏移量，則會傳回此欄位。

參考 : mysql_fetch_field( )


MySQL函式庫 -- mysql_field_table

MySQL函式庫

mysql_field_table

(PHP3 , PHP4)

mysql_field_table --- 取得指定欄位所在的表格名稱

語法 : string mysql_field_table (int result, int field_offset)

說明 :

取得欄位所在的表格名稱，相容的mysql_fieldtable( )也可以使用。


MySQL函式庫 -- mysql_field_type

MySQL函式庫

mysql_field_type

(PHP3 , PHP4)

mysql_field_type --- 取得指定欄位的型態

語法 : string mysql_field_type (int result, int field_offset)

說明 :

mysql_field_type( )類似於mysql_field_name( )，參數也一樣，但是此函式所傳回的是型態，這將會是"int"，"real"，"string"，"blob"之一，或是其它，細節請參考MySQL文件。

Example :

<?php

mysql_connect ("localhost:3306");

mysql_select_db ("wisconsin");

$result = mysql_query ("SELECT * FROM onek");

$fields = mysql_num_fields ($result);

$rows = mysql_num_rows ($result);

$i = 0;

$table = mysql_field_table ($result, $i);

echo "Your '".$table."' table has ".$fields." fields and ".$rows." records <BR>";

echo "The table has the following fields <BR>";

while ($i < $fields) {

$type = mysql_field_type ($result, $i);

$name = mysql_field_name ($result, $i);

$len = mysql_field_len ($result, $i);

$flags = mysql_field_flags ($result, $i);

echo $type." ".$name." ".$len." ".$flags."<BR>";

$i++;

}

mysql_close();

?>

相容的mysql_fieldtype( )也可以使用。


MySQL函式庫 -- mysql_free_result

MySQL函式庫

mysql_free_result

(PHP3 , PHP4)

mysql_free_result --- 釋放記憶體

語法 : int mysql_free_result (int result)

說明 :

當在執行程式時，假如您擔心佔用太多記憶體，可以使用此函式來自動釋放佔用的記憶體空間。所有指定的結果 identifier 將會自動地釋放。

相容的mysql_freeresult( )也可以使用。


MySQL函式庫 -- mysql_insert_id

MySQL函式庫

mysql_insert_id

(PHP3 , PHP4)

mysql_insert_id --- 取得先前INSERT操作的id

語法 : int mysql_insert_id ([int link_identifier])

說明 :

mysql_insert_id( )傳回AUTO_INCREMENTED欄位所產生的id，它將使用給予的 link_identifier傳回最後執行INSERT查詢的ID，如果沒有指定 link_identifier則假定是最後所開啟的連結。


MySQL函式庫 -- mysql_list_dbs

MySQL函式庫

mysql_list_dbs

(PHP3 , PHP4)

mysql_list_dbs --- 列出MySQL伺服器上可用的資料庫

語法 : int mysql_list_dbs ([int link_identifier])

說明 :

mysql_list_dbs( )將從目前的MySQL daemon傳回包含可用的資料庫的結果指標，使用mysql_tablename( )來橫越(traverse)此結果指標。

相容的mysql_listdbs( )也可以使用。


MySQL函式庫 -- mysql_list_fields

MySQL函式庫

mysql_list_fields

(PHP3 , PHP4)

mysql_list_fields --- 列出欄位

語法 : int mysql_list_fields (string database_name, string table_name [, int link_identifier])

說明 :

mysql_list_fields( )獲得給予的表格名稱其資訊，參數是資料庫名稱和表格名稱，此函式會傳回一結果指標，能給
    mysql_field_flags( )、mysql_field_len(
    )、mysql_field_name( )、mysql_field_type(
    )使用。

結果identifier是一正數，如果發生錯誤則傳回-1，一個描述錯誤的字串將會放在 $phperrmsg之中，除非是以@mysql_list_fields( )來呼叫函式，則此錯誤字串將會顯示出來。

相容的mysql_listfields( )也可以使用。


MySQL函式庫 -- mysql_list_tables

MySQL函式庫

mysql_list_tables

(PHP3 , PHP4)

mysql_list_tables --- 列出資料庫中的表格

語法 : int mysql_list_tables (string database [, int link_identifier])

說明 :

mysql_list_tables( )取一個資料庫名稱且傳回一個結果指標，很像是mysql_db_query( )。mysql_tablename( )將用來從結果指標取出實際的表格名稱。

相容的mysql_listtables( )也可以使用。


MySQL函式庫 -- mysql_num_fields

MySQL函式庫

mysql_num_fields

(PHP3 , PHP4)

mysql_num_fields --- 取得欄位的數目

語法 : int mysql_num_fields (int result)

說明 :

mysql_num_fields( )傳回結果中欄位的數目。

相容的mysql_numfields( )也可以使用。

參考 : mysql_db_query( ) mysql_query( ) mysql_fetch_field( ) mysql_num_rows( )


MySQL函式庫 -- mysql_num_rows

MySQL函式庫

mysql_num_rows

(PHP3 , PHP4)

mysql_num_rows --- 取得結果中列的數目

語法 : int mysql_num_rows (int result)

說明 :

mysql_num_rows( )傳回結果中列的數目，此指令只對SELECT語法有效，要從INSERT，UPDATE，或是DELETE中獲得列的數目，請使用 mysql_affected_rows( )

相容的mysql_numrows( )也可以使用。

參考 : mysql_db_query( ) mysql_query( ) mysql_fetch_row( )


MySQL函式庫 -- mysql_pconnect

MySQL函式庫

mysql_pconnect

(PHP3 , PHP4)

mysql_pconnect --- 開啟MySQL伺服器持續連線

語法 : int mysql_pconnect ([string hostname [:port] [:/path/to/socket] [, string username [, string password]]])

說明 :

成功則傳回一正數的MySQL連結identifier，失敗則傳回錯誤訊息。

mysql_connect( )建立MySQL伺服器連結，所有的參數都是非必需的，如果都沒給參數值，則預設上假定是( 'localhost' , 擁有伺服器處理的使用者名稱 , 沒有密碼)。

hostname也可以包含埠號，例如 : "hostname:port"或是socket路徑，例如 : ":/path/to/socket"

注意 : PHP3.0B4中增加了提供":port" ， PHP3.0.10中增加了提供":/path/to/socket"，你可使用'@'(@mysql_connect( ) )來抑制錯誤時所傳回的訊息。

mysql_pconnect( )與mysql_connect( )很相似，兩者間主要有二個不同之處。

首先，當連結時函式將首先試著去找出相同主機、使用者名稱、密碼的先前已開啟的連結，如果有找到，則此 identifier 將被傳回，來替代開啟一個新的連結。

次之，當程式執行完成後將不會關閉連結到MySQL伺服器，反而會保留下來給之後使用。(mysql_close( )將無法關閉以mysql_pconnect( )所開啟的連結)


MySQL函式庫 -- mysql_query

MySQL函式庫

mysql_query

mysql_query --- 送出MySQL查詢

語法 : int mysql_query (string query [, int link_identifier])

說明 :

mysql_query( )送出查詢到伺服器上現行的資料庫，如果 link_identifier沒有指定，則假定是最後開啟的連結，如果是沒有開啟的連結，此函式會試著以mysql_connect( )無任何參數的方式建立一個連結並且使用它。

此查詢字串不該在後面加上分號(；)。

mysql_query( )傳回TRUE(非零)或是FALSE來指出查詢是否成功，傳回一個TRUE的值，表示此查詢是合法的且是伺服器可以執行的，它並不會指出或是傳回關於所影響列的數目。

以下的查詢是語法結構上有錯誤的，因此 mysql_query( )失敗且傳回FALSE。

Example :

<?php

$result = mysql_query ("SELECT * WHERE 1=1") or die ("Invalid query");

?>

如果my_col在表格my_tb1中不是一個欄位，則以下的查詢是語義上有錯誤的，因此 mysql_query( )失敗且傳回FALSE。

Example :

<?php

$result = mysql_query ("SELECT my_col FROM my_tbl") or die ("Invalid query");

?>

如果你的查詢字串沒有權限去存取表格，因此 mysql_query( )也會失敗且傳回FALSE。

查詢成功後，你可以呼叫mysql_affected_rows( )來找出DELETE，INSERT，REPLACE， 或是UPDATE 語法所影響列的數目，SELECT 語法 mysql_query( )會傳回一新的結果 identifier，你可以將它傳遞給 mysql_result( )。當查詢完後，你可以呼叫 mysql_free_result( )來釋放資源(resources)。

參考 : mysql_affected_rows( ) mysql_db_query( ) mysql_free_result( ) mysql_result( )


MySQL函式庫 -- mysql_result

MySQL函式庫

mysql_result

(PHP3 , PHP4)

mysql_result --- 取得結果資料

語法 : int mysql_result (int result, int row [, mixed field])

說明 :

mysql_result( )從MySQL結果傳回一格(cell)的內容，參數field可以是欄位的偏移量(offset)、欄位的名稱、或是fieldname.tablename，如果列(column)的名稱是別名('select foo as bar from...')，則使用別名來替代列的名稱。

當工作在大型的結果時，你應該考慮使用取得整列，這些函式傳回小格(cell)多樣的內容，它們會表mysql_result( )更快速。同樣地，在參數field指定欄位的偏移量，會比指定一個欄位名稱或是tablename.fieldname還要快速。

呼叫mysql_result( )不應該摻雜呼叫其它的函式。

推薦一些高效能的函式 : mysql_fetch_row( ) mysql_fetch_array( ) mysql_fetch_object( )


MySQL函式庫 -- mysql_select_db

MySQL函式庫

mysql_select_db

(PHP3 , PHP4)

mysql_select_db --- 選擇一個資料庫

語法 : int mysql_select_db (string database_name [, int link_identifier])

說明 :

成功則傳回true，失敗則傳回false。

mysql_select_db( )設定在伺服器上現行的資料庫，如果沒有指定 link_identifier，則假定是最後開啟的連結，如果無開啟的連結，此函式會試著去建立一個連結，並且使用它，就好像是呼叫mysql_connect( )一樣。

隨後呼叫mysql_query( )都會在此資料庫上工作。

相容的mysql_selectdb( )也可以使用。

參考 : mysql_connect( ) mysql_pconnect( ) mysql_query( )


MySQL函式庫 -- mysql_tablename

MySQL函式庫

mysql_tablename

(PHP3 , PHP4)

mysql_tablename --- 取得表格名稱

語法 : string mysql_tablename (int result, int i)

說明 :

mysql_tablename( )取mysql_list_tables( )所傳回的結果指標且傳回表格的名稱，mysql_num_rows( )可用來決定結果指標中表格的數目。

Example :

<?php

mysql_connect ("localhost:3306");

$result = mysql_list_tables ("wisconsin");

$i = 0;

while ($i < mysql_num_rows ($result)) {

$tb_names[$i] = mysql_tablename ($result, $i);

echo $tb_names[$i] . "<BR>";

$i++;

}

?>


網路函式庫 -- checkdnsrr.html

網路函式庫

checkdnsrr

(PHP3 , PHP4)

checkdnsrr --- 檢查DNS記錄

語法 : int checkdnsrr (string host [, string type])

說明 :

搜尋DNS型態type的記錄，如果找到記錄則傳回true，如果找不到記錄或是發生錯誤則傳回false。

type可以是A、MX、NS、SOA、PTR、CNAME或是ANY的任何一個，預設是MX。

host可以是IP位址或是主機名稱。

參考 : getmxrr( ) gethostbyaddr( ) gethostbyname( ) gethostbynamel( )


網路函式庫 -- closelog

網路函式庫

closelog

(PHP3 , PHP4)

closelog --- 關閉連結到系統記錄者

語法 : int closelog(void);

說明 :

closelog( )關閉用來寫到系統記錄者(logger)的描述符號(descriptor)，closelog( )的使用是非必需的。


網路函式庫 -- debugger_off

網路函式庫

debugger_off

(PHP3)

debugger_off --- 關閉內部的PHP除錯

語法 : int debugger_off(void);

說明 :

關閉內部的PHP除錯。除錯依然是在發展之下。


網路函式庫 -- debugger_on

網路函式庫

debugger_on

(PHP3)

debugger_on --- 開啟內部的PHP除錯

語法 : int debugger_on (string address)

說明 :

開啟內部的PHP除錯，連結到參數address。除錯依然是在發展之下。


網路函式庫 -- fsockopen

網路函式庫

fsockopen

(PHP3 , PHP4)

fsockopen --- 開啟Internet或Unix網域socket連結

語法 : int fsockopen (string [udp://]hostname, int port [, int errno [, string errstr [, double timeout]]])

說明 :

創始一個Internet或是Unix網域中的資料流連結(AF_INET，使用 TCP 或 UDP)。Internet網域，它將會開啟一個TCP socket連結到參數hostname，埠號為參數port，參數hostname可以是網域名稱或是IP位址。UDP連結，你需要明確的指出協定 : udp://hostname。Unix網域，參數hostname將會使用連結到socket的路徑，參數port必須設為0。非必需選項timeout可用來設定停止連結系統呼叫的秒數。

fsockopen(
    )傳回一個檔案指標，這可以和其它的函式一起使用，例如
    : fgets( )、fgetss(
    )、fputs( )、fclose(
    )、feof( )。

如果呼叫失敗，它將會傳回false並且如果有給予參數errno和errstr，它們將會指出發生在system-level connect( ) 呼叫的錯誤。如果傳回的errno為0而且此函式傳回false，表示錯誤發生在connect( )呼叫之前，注意 : 參數errno和errstr必須依照關係傳遞。

此函式會預設成擱置模式，您可使用set_socket_blocking( )設定成無擱置模式。

Example :

<?php

$fp = fsockopen ("www.php.net", 80, &$errno, &$errstr, 30);

if (!$fp) {

echo "$errstr ($errno)<br>\n";

} else {

fputs ($fp, "GET / HTTP/1.0\r\n\r\n");

while (!feof($fp)) {

echo fgets ($fp,128);

}

fclose ($fp);

}

?>

以下的範例顯示如何在你的機器上從UDP服務"daytime"(port 13)獲得日期和時間。

<?php

$fp = fsockopen("udp://127.0.0.1", 13, &$errno, &$errstr);

if (!$fp) {

echo "ERROR: $errno - $errstr<br>\n";

} else {

fwrite($fp,"\n");

echo fread($fp, 26);

fclose($fp);

}

?>

參考 : pfsockopen( )


網路函式庫 -- gethostbyaddr

網路函式庫

gethostbyaddr

(PHP3 , PHP4)

gethostbyaddr --- 取得主機名稱

語法 : string gethostbyaddr (string ip_address)

說明 :

傳回參數ip_address的主機名稱，如果發生錯誤則傳回ip_address。

參考 : gethostbyname( )


網路函式庫 -- gethostbyname

網路函式庫

gethostbyname

(PHP3 , PHP4)

gethostbyname --- 取得IP位址

語法 : string gethostbyname (string hostname)

說明 :

傳回參數hostname的IP位址。

參考 : gethostbyaddr( )


網路函式庫 -- gethostbynamel

網路函式庫

gethostbynamel

(PHP3 , PHP4)

gethostbynamel --- 取得IP位址的列表

語法 : string gethostbynamel (string hostname)

說明 :

傳回參數hostname的IP位址列表。

參考 : gethostbyname( ) gethostbyaddr( ) checkdnsrr( ) getmxrr( )


網路函式庫 -- getmxrr

網路函式庫

getmxrr

(PHP3 , PHP4)

getmxrr --- 取得MX記錄

語法 : int getmxrr (string hostname, array mxhosts [, array weight])

說明 :

搜尋主機hostname的MX記錄，如果找到記錄則傳回true，如果找不到記錄或發生錯誤則傳回false。

搜尋到MX記錄的列表會放到陣列mxhosts中，如果有給予參數weight，它將會被收集到的資訊填滿。

參考 : checkdnsrr( ) gethostbyname( ) gethostbynamel( ) gethostbyaddr( )


網路函式庫 -- getprotobyname

網路函式庫

getprotobyname

(PHP4 >= 4.0b4)

getprotobyname --- 取得協定編號

語法 : int getprotobyname (string name)

說明 :

getprotobyname( )經由/etc/protocols傳回協定名稱name的協定編號。

參考 : getprotobynumber( )


網路函式庫 -- getprotobynumber

網路函式庫

getprotobynumber

(PHP4 >= 4.0b4)

getprotobynumber --- 取得協定名稱

語法 : string getprotobynumber (int number)

說明 :

getprotobynumber( )經由/etc/protocols傳回協定編號number的協定名稱。

參考 : getprotobyname( )


網路函式庫 -- getservbyname

網路函式庫

getservbyname

(PHP4 >= 4.0b4)

getservbyname --- 取得Internet服務和協定的埠號

語法 : int getservbyname (string service, string protocol)

說明 :

getservbyname( )經由/etc/services傳回參數service服務的埠號，參數protocol是TCP或UDP兩者之一。

參考 : getservbyport( )


網路函式庫 -- getservbyport

網路函式庫

getservbyport

(PHP4 >= 4.0b4)

getservbyport --- 取得Internet服務的名稱

語法 : string getservbyport (int port, string protocol)

說明 :

getservbyport( )經由/etc/services傳回協定名稱protocol和埠號port的服務名稱，參數protocol是TCP或UDP兩者之一。

參考 : getservbyname( )


網路函式庫 -- ip2long

網路函式庫

ip2long

(PHP4 >= 4.0RC1)

ip2long --- 轉換 IP(IPv4)成為適當的位址

語法 : int ip2long (string ip_address)

說明 :

ip2long( )從它的Internet標準格式(有逗點的字串)，產生IPv4 Internet network位址。

Example :

<?php

$ip = gethostbyname("www.php.net");

$out = "The following URLs are equivalent:<br>\n";

$out .= "http://www.php.net/, http://".$ip."/, and http://".ip2long($ip)."/<br>\n";

echo $out;

?>

參考 : long2ip( )


網路函式庫 -- long2ip

網路函式庫

long2ip

(PHP4 >= 4.0RC1)

long2ip --- 轉換 IP(IPv4)成為適當的位址

語法 : string long2ip (int proper_address)

說明 :

long2ip( )從適當的位址表示，產生有逗點的格式的 Internet 位址。

參考 : ip2long( )


網路函式庫 -- openlog

網路函式庫

openlog

(PHP3 , PHP4)

openlog --- 開啟連結到系統記錄者

語法 : int openlog (string ident, int option, int facility)

說明 :

openlog( )開啟連結到系統記錄者(logger)，字串ident是增加到各個訊息。參數option和facility的值是在下一個部份(section)中給予。openlog( )的使用是非必需的，如果必要的話，它會自動地呼叫syslog( )，這種情況下，參數ident將會預設成false。

參考 : syslog( ) closelog( )


網路函式庫 -- pfsockopen

網路函式庫

pfsockopen

(PHP3 >= 3.0.7 , PHP4)

pfsockopen --- 開啟持續的Internet或Unix網域socket連結

語法 : int pfsockopen (string hostname, int port [, int errno [, string errstr [, int timeout]]])

說明 :

此函式的功能和fsockopen( )相同，不同處是在程式結束之後，不會關閉連結。它是fsockopen( )持續的版本。


網路函式庫 -- socket_set_blocking

網路函式庫

socket_set_blocking

(PHP4 >= 4.0b4)

socket_set_blocking --- 設定socket擱置/非擱置模式

語法 : int socket_set_blocking (int socket descriptor, int mode)

說明 :

如果mode是false，則給予的socket descriptor將會切換成非擱置模式，如果mode是true，它將會切換成擱置模式。這會影響到像是fgets( )從socket讀取的函式，在非擱置模式中，呼叫fgets( )將會永遠傳回擱置模式，它將會等待資料成為可用的資料。

此函式是事前呼叫socket_set_blocking( )，但是並不讚成這種用法。


網路函式庫 -- syslog

網路函式庫

syslog

(PHP3 , PHP4)

syslog --- 產生系統記錄訊息

語法 : int syslog (int priority, string message)

說明 :

syslog( )產生一個記錄訊息，它將會以系統記錄者來分散。參數priority是個能力(facility)的組合(combination)與級別，參數message是要送出的訊息，%m這二個字元將會以錯誤訊息字串(strerror)來代替，相當於目前errno的值。

在Windows NT系統上，syslog服務是使用事件檢視器。


YP/NIS函式庫 -- yp_first

YP/NIS函式庫

yp_first

(PHP3 >= 3.0.7 , PHP4)

yp_first --- 從地圖傳回首先的key-value對

語法 : array yp_first (string domain, string map)

說明 :

yp_first( )從名稱 domain中的 map，傳回首先的 key-value對，否則傳回FALSE。

Example :

<?php

$entry = yp_first($domain, "passwd.byname");

$key = key($entry); echo "First entry in this map has key " . $key . " and value " . $entry[$key];

?>

參考 : yp_get_default_domain( )


YP/NIS函式庫 -- yp_get_default_domain

YP/NIS函式庫

yp_get_default_domain

(PHP3 >= 3.0.7 , PHP4)

yp_get_default_domain --- 獲得預設的NIS網域

語法 : int yp_get_default_domain (void )

說明 :

yp_get_default_domain( )傳回預設的網域或FALSE，能用來當作是網域參數，給後來的NIS呼叫使用。

NIS網域可以描述成NIS地圖(maps)的一個群組，每個主機都需要去查詢關於它本身的資訊，來獲得一個可靠的網域。

Example :

<?php

$domain = yp_get_default_domain();

echo "Default NIS domain is: " . $domain;

?>


YP/NIS函式庫 -- yp_master

YP/NIS函式庫

yp_master

(PHP3 >= 3.0.7 , PHP4)

yp_master --- 傳回地圖的主要NIS伺服器名稱

語法 : string yp_master (string domain, string map)

說明 :

yp_master( )傳回地圖(map)的主要NIS伺服器名稱。

Example :

<?php

$number = yp_master ($domain, $mapname);

echo "Master for this map is: " . $master;

?>

參考 : yp_get_default_domain( )


YP/NIS函式庫 -- yp_match

YP/NIS函式庫

yp_match

(PHP3 >= 3.0.7 , PHP4)

yp_match --- 傳回相配的行

語法 : string yp_match (string domain, string map, string key)

說明 :

yp_match( )傳回自指定的地圖(map)離開的 key值或FALSE，這個 key必須是精確無誤的。

Example :

<?php

$entry = yp_match ($domain, "passwd.byname", "joe");

echo "Matched entry is: " . $entry;

?>

這將會是 : joe:##joe:11111:100:Joe User:/home/j/joe:/usr/local/bin/bash

參考 : yp_get_default_domain( )


YP/NIS函式庫 -- yp_next

YP/NIS函式庫

yp_next

(PHP3 >= 3.0.7 , PHP4)

yp_next --- 傳回地圖中的下一個key-value對

語法 : array yp_next (string domain, string map, string key)

說明 :

yp_next( )傳回 map中在指定的 key之後的下一個 key-value對或FALSE。

Example :

<?php

$entry = yp_next ($domain, "passwd.byname", "joe");

if (!$entry) {

echo yp_errno() . ": " . yp_err_string();

}

$key = key ($entry);

echo "The next entry after joe has key " . $key . " and value " . $entry[$key];

?>

參考 : yp_get_default_domain( )


YP/NIS函式庫 -- yp_order

YP/NIS函式庫

yp_order

(PHP3 >= 3.0.7 , PHP4)

yp_order --- 傳回地圖的順序編號

語法 : int yp_order (string domain, string map)

說明 :

yp_order( )傳回地圖(map)的順序編號或FALSE。

Example :

<?php

$number = yp_order($domain,$mapname);

echo "Order number for this map is: " . $order;

?>

參考 : yp_get_default_domain( )


信用卡交易函式庫 -- pfpro_cleanup

信用卡交易函式庫

pfpro_cleanup

(PHP4 CVS only)

pfpro_cleanup --- 結束Payflow Pro

語法 : void pfpro_cleanup(void);

說明 :

pfpro_cleanup( )是用來結束Payflow Pro，它必須在你處理完任何的交易之後，並且在你程式結束之前來呼叫，你也可以省略呼叫這個函式，如此一來，它便會在你的程式終止之後自動地呼叫pfpro_cleanup( )。

參考 : pfpro_init( )


信用卡交易函式庫 -- pfpro_init

信用卡交易函式庫

pfpro_init

(PHP4 CVS only)

pfpro_init --- 初始的Payflow Pro

語法 : void pfpro_init(void);

說明 :

pfpro_init( )是用來做為初始的Payflow Pro，你可以省略呼叫這個函式，如此一來，在第一次交易之前將會自動地呼叫pfpro_init( )。

參考 : pfpro_cleanup( )


信用卡交易函式庫 -- pfpro_process

信用卡交易函式庫

pfpro_process

(PHP4 CVS only)

pfpro_process --- 處理Payflow Pro交易

語法 : array pfpro_process (array parameters [, string address [, int port [, int timeout [, string proxy address [, int proxy port [, string proxy logon [, string proxy password]]]]]]])

說明 :

傳回一個包含答覆的陣列。

pfpro_process( )處理一個Payflow Pro的交易，第一個參數是個包含索引和值的陣列，這個陣列將會被編碼，並且傳送到處理者。

第二個參數是非必需的，是用來指定連結的主機。它的預設值是"test.signio.com"，所以為了要處理線上交易，你必定會想要改變它成為"connect.signio.com"。

第三個參數用來指定連結的埠號，它預設是 443，標準的SSL埠號。

第四個參數指定中止的時間，單位是秒，它預設是30秒。這個中止時間只有在一但和處理者已建立連結時才開始。

第五個參數，如果需要的話，可以指定你的SSL proxy的主機名稱，第六個參數指定它所使用的埠號。

第七個與第八個參數指定登入proxy的身份和密碼。

此函式傳回一個答覆的索引和值的陣列。

注意 : 請閱讀Payflow Pro發展者指南，來獲得參數的細節

Example :

<?php

pfpro_init();

$transaction = array(USER => 'mylogin',

PWD => 'mypassword',

TRXTYPE => 'S',

TENDER => 'C',

AMT => 1.50,

ACCT => '4111111111111111', EXPDATE => '0904'

);

$response = pfpro_process($transaction);

if (!$response) {

die("Couldn't establish link to Verisign.\n");

}

echo "Verisign response code was ".$response[RESULT];

echo ", which means: ".$response[RESPMSG]."\n";

echo "\nThe transaction request: ";

print_r($transaction);

echo "\nThe response: ";

print_r($response);

pfpro_cleanup();

?>


信用卡交易函式庫 -- pfpro_process_raw

信用卡交易函式庫

pfpro_process_raw

(PHP4 CVS only)

pfpro_process_raw --- 處理未加工的Payflow Pro交易

語法 : string pfpro_process_raw (string parameters [, string address [, int port [, int timeout [, string proxy address [, int proxy port [, string proxy logon [, string proxy password]]]]]]])

說明 :

傳回一個答覆的字串。

pfpro_process_raw( )處理Payflow Pro一個未加工的交易字串，你必須使用pfpro_process( )來作為替代，這些交易的編碼規則都是非標準的。

第一個參數是個未加工的交易請求的字串，其它的參數都和pfpro_process( )一樣，傳回的值是個未加工的答覆字串。

注意 : 請閱讀Payflow Pro發展者指南，來獲得參數的細節和編碼的規則，你將會被勸告使用pfpro_process( )來替代此函式

Example :

<?php

pfpro_init();

$response = pfpro_process("USER=mylogin&PWD[5]=m&ndy&TRXTYPE=S&TENDER=C&

AMT=1.50&ACCT=4111111111111111&EXPDATE=0904");

if (!$response) {

die("Couldn't establish link to Verisign.\n");

}

echo "Verisign raw response was ".$response;

pfpro_cleanup();

?>


信用卡交易函式庫 -- pfpro_version

信用卡交易函式庫

pfpro_version

(PHP4 CVS only)

pfpro_version --- 傳回Payflow Pro的版本

語法 : string pfpro_version(void);

說明 :

pfpro_version傳回Payflow Pro的版本。


PHP選項與資訊函式庫 -- assert

PHP選項與資訊函式庫

assert

(PHP4 >= 4.0b4)

assert --- 如果assertion是false則檢查

語法 : int assert (string|bool assertion)

說明 :

如果它的結果是false，assert( )將會檢查給予的assertion並且取適當的動作。字串assertion的優點是較少在頭上的(less overhead)，當assertion檢查結束，並且訊息包含了assertion表示，當assertion失敗。

assertion應該用來像是除錯的特色而已，你可以使用它們來做健全的檢查(sanity-checks)來探測狀態(conditions)，這將永遠為true而且指出一些程式錯誤。

assertions將不用來作為正常的執行運作，像是輸入參數的檢查。如果assertion檢查是非活性化的(not activated)，將永遠能作糾正(correct)。

assert( )的性能，可由assert_option( )或是.ini-setting來配置。


PHP選項與資訊函式庫 -- assert_options

PHP選項與資訊函式庫

assert_options

(PHP4 >= 4.0b4)

assert_options --- 設定(取得)各式的assert旗標

語法 : mixed assert_options (int what [, mixed value])

說明 :

使用assert_options( )你可以設定各式的assert( )控制選項，或只是查詢它們目前的設定。

assert選項 :

選項 | ini-參數 | 預設值 | 說明
ASSERT_ACTIVE | assert.active | 1 | 使assert( )能夠計算
ASSERT_WARNING | assert.warning | 1 | assertion失敗時發佈PHP警告
ASSERT_BAIL | assert.bail | 0 | assertion失敗時終止執行
ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | 在assertion表達計算期間使無法error_reporting
ASSERT_CALLBACK | assert_callback | (null) | assertion失敗時呼叫使用者函式

assert_options( )將傳回任何選項的原先設定值，失敗則傳回false。


PHP選項與資訊函式庫 -- error_log

PHP選項與資訊函式庫

error_log

(PHP3 , PHP4)

error_log --- 送出錯誤訊息到某處

語法 : int error_log (string message, int message_type [, string destination [, string extra_headers]])

說明 :

送出一個錯誤訊息到web伺服器的錯誤記錄，一個TCP埠號或是一個檔案。第一個參數message是將要被記錄的一個錯誤訊息內容，第二個參數message_type說明訊息要送往何處 :

error_log( )記錄的型態 :

0 | message送到PHP的系統記錄者，使用作業系統的系統記錄機制或是檔案，取決於error_log的設定值。
1 | 以email的方式將message送到參數destination指定的地址，只有這個型態才會使用到extra_headers，此型態使用相同的內部函式mail( )。
2 | message送到PHP除錯連結，只有在遠端的除錯設為enable時，這個選項才有效。參數destination用來指定接收除錯訊息的主機名稱或是IP位址，埠號。
3 | message附加在檔案destination。

Example :

<?php

// Send notification through the server log if we can not

// connect to the database.

if (!Ora_Logon($username, $password)) {

error_log("Oracle database not available!", 0);

}

// Notify administrator by email if we run out of FOO

if (!($foo = allocate_new_foo()) {

error_log ("Big trouble, we're all out of FOOs!", 1, "operator@mydomain.com");

}

// other ways of calling error_log():

error_log ("You messed up!", 2, "127.0.0.1:7000");

error_log ("You messed up!", 2, "loghost");

error_log ("You messed up!", 3, "/var/tmp/my-errors.log");

?>


PHP選項與資訊函式庫 -- error_reporting

PHP選項與資訊函式庫

error_reporting

(PHP3 , PHP4)

error_reporting --- 設定PHP錯誤回報等級

語法 : int error_reporting ([int level])

說明 :

設定PHP的錯誤回報等級並且傳回舊的等級。錯誤回報等級是一位元罩，有下列的值 :

值 | 內部的名稱
1 | E_ERROR
2 | E_WARNING
4 | E_PARSE
8 | E_NOTICE
16 | E_CORE_ERROR
32 | E_CORE_WARNING

E_ERROR : 預設上是列出錯誤，並且在函式傳回之後終止程式的執行

E_WARNING : 預設上是列出警告，但是不中斷程式的執行

E_PARSE : 剖析語法上的錯誤

E_NOTICE : 預設上是列出注意，並且指出程式衝突的地方

E_CORE_ERROR : 這像是E_ERROR，不同處在於它是由PHP的核心所產生的，函式將不會產生此型態的錯誤

E_CORE_WARNING : 這像是E_WARNING，不同處在於它是由PHP的核心所產生的，函式將不會產生此型態的錯誤


PHP選項與資訊函式庫 -- extension_loaded

PHP選項與資訊函式庫

extension_loaded

(PHP3 >= 3.0.10 , PHP4 >= 4.0b4)

extension_loaded --- 判斷擴充模組是否已載入

語法 : bool extension_loaded (string name)

說明 :

如果參數name指定的擴充模組已載入則此函式傳回true，你可以使用phpinfo( )來看見各種擴充模組的名稱。

注意 : 這是PHP3.0.10.中新增的函式

參考 : phpinfo( )


PHP選項與資訊函式庫 -- get_cfg_var

PHP選項與資訊函式庫

get_cfg_var

(PHP3 , PHP4)

get_cfg_var --- 取得PHP結構選項的值

語法 : string get_cfg_var (string varname)

說明 :

傳回PHP結構(configuration)變數varname目前的值，發生錯誤則傳回false。

當PHP在編譯(compiled)的時候，它將不會傳回結構資訊，或從Apache結構檔案讀取。

可以試著獲得cfg_file_path結構設定的值，來檢查系統是否使用結構檔案(在PHP3中叫作php3.ini，而在PHP4中則叫作php.ini)。


PHP選項與資訊函式庫 -- get_current_user

PHP選項與資訊函式庫

get_current_user

(PHP3 , PHP4)

get_current_user --- 取得目前PHP程式擁有者的名稱

語法 : string get_current_user (void)

說明 :

傳回目前PHP程式擁有者的名稱。

參考 : getmyuid( ) getmypid( ) getmyinode( ) getlastmod( )


PHP選項與資訊函式庫 -- get_extension_funcs

PHP選項與資訊函式庫

get_extension_funcs

(PHP4 >= 4.0b4)

get_extension_funcs --- 傳回模組的函式名稱

語法 : array get_extension_funcs (string module_name)

說明 :

此函式傳回模組(module)module_name中定義的所有函式的名稱。

Example :

<?php

print_r (get_extension_funcs ("xml"));

print_r (get_extension_funcs ("gd"));

?>

這將會列出模組xml和gd各自的函式的列表。

參考 : get_loaded_extensions( )


PHP選項與資訊函式庫 -- get_included_files

PHP選項與資訊函式庫

get_included_files

(PHP4 >= 4.0RC1)

get_included_files --- 傳回在程式中include_once( )檔案的名稱

語法 : array get_included_files (void)

說明 :

此函式傳回使用include_once( )已經載入到程式的所有檔案的名稱，此函式將傳回一組合陣列，陣列的索引值是使用在include_once( )中而沒有".php"的檔案名稱。

注意 : 在PHP 4.0.1pl2中，這個函式假定此include_once檔案以擴充的".php"為結果，其它的擴充將不運作。

參考 : require_once( ) include_once( ) get_required_files( )


PHP選項與資訊函式庫 -- get_loaded_extensions

PHP選項與資訊函式庫

get_loaded_extensions

(PHP4 >= 4.0b4)

get_loaded_extensions --- 傳回所有編譯模組和載入的名稱

語法 : array get_loaded_extensions (void)

說明 :

此函式傳回所有編譯模組(module)的名稱，並且載入PHP解譯者(interpreter)之中。

Example :

<?php

print_r (get_loadedextensions());

?>

將會產生像是這樣的列表 :

Array

(

[0] => xml

[1] => wddx

[2] => standard

[3] => session

[4] => posix

[5] => pgsql

[6] => pcre

[7] => gd

[8] => ftp

[9] => db

[10] => Calendar

[11] => bcmath

)

參考 : get_extension_funcs( )


PHP選項與資訊函式庫 -- get_magic_quotes_gpc

PHP選項與資訊函式庫

get_magic_quotes_gpc

(PHP3 >= 3.0.6 , PHP4)

get_magic_quotes_gpc --- 取得目前magic_quotes_gpc的設定值

語法 : long get_magic_quotes_gpc (void)

說明 :

傳回目前magic_quotes_gpc的設定值，0表示關閉，1表示開啟。

參考 : get_magic_quotes_runtime( ) set_magic_quotes_runtime( )


PHP選項與資訊函式庫 -- get_magic_quotes_runtime

PHP選項與資訊函式庫

get_magic_quotes_runtime

(PHP3 >= 3.0.6 , PHP4)

get_magic_quotes_runtime --- 取得目前magic_quotes_runtime的設定值

語法 : long get_magic_quotes_runtime (void)

說明 :

傳回目前magic_quotes_runtime的設定值，0表示關閉，1表示開啟。

參考 : get_magic_quotes_gpc( ) set_magic_quotes_runtime( )


PHP選項與資訊函式庫 -- get_required_files

PHP選項與資訊函式庫

get_required_files

(PHP4 >= 4.0RC2)

get_required_files --- 傳回在程式中require_once( )檔案的名稱

語法 : array get_required_files (void)

說明 :

此函式傳回使用require_once( )已經載入到程式的所有檔案的名稱，此函式將傳回一組合陣列，陣列的索引值是使用在require_once( )中而沒有".php"的檔案名稱。

Example :

<?php

require_once ("local.php");

require_once ("../inc/global.php");

for ($i=1; $i<5; $i++)

include "util".$i."php";

echo "Required_once files\n";

print_r (get_required_files());

echo "Included_once files\n";

print_r (get_included_files());

?>

這將會產生以下的輸出 :

Required_once files

Array

(

[local] => local.php

[../inc/global] => /full/path/to/inc/global.php

)

Included_once files

Array

(

[util1] => util1.php

[util2] => util2.php

[util3] => util3.php

[util4] => util4.php

)

注意 : 在PHP 4.0.1pl2中，這個函式假定此required_once檔案以擴充的".php"為結果，其它的擴充將不運作。

參考 : require_once( ) include_once( ) get_included_files( )


PHP選項與資訊函式庫 -- getenv

PHP選項與資訊函式庫

getenv

(PHP3 , PHP4)

getenv --- 取得環境變數的值

語法 : string getenv (string varname)

說明 :

傳回環境變數varname的值，發生錯誤則傳回false。

Example :

<?php

$ip = getenv ("REMOTE_ADDR"); // get the ip number of the user

?>

你可以使用phpinfo( )來看見所有環境變數的列表。


PHP選項與資訊函式庫 -- getlastmod

PHP選項與資訊函式庫

getlastmod

(PHP3 , PHP4)

getlastmod --- 取得網頁最後修改的時間

語法 : int getlastmod (void)

說明 :

傳回目前網頁的最後修改的時間，傳回的值是一Unix時間戳記，可以傳遞給date( )使用。發生錯誤則傳回false。

Example :

<?php

// outputs e.g. 'Last modified: March 04 1998 20:43:59.'

echo "Last modified: ".date ("F d Y H:i:s.", getlastmod());

?>

參考
  : date( )  getmyuid(
  )  get_current_user( )  getmyinode(
  )  getmypid( )


PHP選項與資訊函式庫 -- getmyinode

PHP選項與資訊函式庫

getmyinode

(PHP3 , PHP4)

getmyinode --- 取得目前程式的inode

語法 : int getmyinode (void)

說明 :

傳回目前程式的inode，失敗則傳回false。

注意 : 此函式無法運作在Windows系統

參考 : getmyuid( ) get_current_user( ) getmypid( ) getlastmod( )


PHP選項與資訊函式庫 -- getmypid

PHP選項與資訊函式庫

getmypid

(PHP3 , PHP4)

getmypid --- 取得PHP的處理ID

語法 : int getmypid (void)

說明 :

傳回目前PHP處理(process)ID，失敗則傳回false。

參考 : getmyuid( ) get_current_user( ) getmyinode( ) getlastmod( )


PHP選項與資訊函式庫 -- getmyuid

PHP選項與資訊函式庫

getmyuid

(PHP3 , PHP4)

getmyuid --- 取得PHP程式擁有者的ID

語法 : int getmyuid (void)

說明 :

傳回目前程式的使用者ID，失敗則傳回false。

參考 : getmypid( ) get_current_user( ) getmyinode( ) getlastmod( )


PHP選項與資訊函式庫 -- getrusage

PHP選項與資訊函式庫

getrusage

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

getrusage --- 取得目前資源用法

語法 : array getrusage ([int who])

說明 :

這是getrusage(2)的界面，它從系統呼叫傳回一組合陣列，如果who為1，getrusage將會呼叫RUSAGE_CHILDREN。

Example :

<?php

$dat = getrusage();

echo $dat["ru_nswap"]; # number of swaps

echo $dat["ru_majflt"]; # number of page faults

echo $dat["ru_utime.tv_sec"]; # user time used (seconds)

echo $dat["ru_utime.tv_usec"]; # user time used (microseconds)

?>


PHP選項與資訊函式庫 -- php_logo_guid

PHP選項與資訊函式庫

php_logo_guid

(PHP4 >= 4.0b4)

php_logo_guid --- 取得logo guid

語法 : string php_logo_guid (void)

說明 :

注意 : 此功能是PHP4 Beta 4新增的功能。

參考 : phpinfo( ) phpversion( ) phpcredits( )


PHP選項與資訊函式庫 -- php_sapi_name

PHP選項與資訊函式庫

php_sapi_name

(PHP4 >= 4.0.1)

php_sapi_name --- 傳回web伺服與PHP之間的介面型態

語法 : string php_sapi_name (void)

說明 :

php_sapi_name( )傳回一個小寫的字串，說明web伺服器與PHP(Server API, SAPI)之間的介面型態。CGI PHP，此字串將會是"cgi"；Aapache的mod_php，此字串將會是"apache"等等。

Example :

<?php

$inter_type = php_sapi_name();

if ($inter_type == "cgi")

print "You are using CGI PHP\n";

else

print "You are not using CGI PHP\n";

?>


PHP選項與資訊函式庫 -- phpcredits

PHP選項與資訊函式庫

phpcredits

(PHP4)

phpcredits --- 列出PHP榮譽

語法 : void phpcredits (int flag)

說明 :

此函式列出PHP開發者榮譽(credits)列表，它產生適當的HTML碼，在網頁中插入資訊。參數flag指出將列出何種資訊，例如 : 要列出一般的榮譽，你可以放在你的程式碼的某個地方 :

Example :

<?php

. . .

phpcredits(CREDITS_GENERAL);

. . .

?>

如果你想要列出核心開發者及手冊群組，在網頁中屬於它們自己的地方，你可以使用:

<?php

phpcredits(CREDITS_GROUP + CREDITS_DOCS + CREDITS_FULLPAGE);

?>

如果你覺得想要將所有的榮譽放在你的網頁中的話，以下的程式碼將可以做到 :

Example :

<html>

<head>

<title>My credits page</title>

</head>

<body>

<?php

// some code of your own

phpcredits(CREDITS_ALL + CREDITS_FULLPAGE);

// some more code

?>

</body>

</html>

phpcredits( )旗標

名稱 | 說明
CREDITS_ALL | 所有的榮譽，等於使用CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_FULLPAGE。它產生一個完整的獨立的HTML網頁。
CREDITS_DOCS | 手冊團隊的榮譽。
CREDITS_FULLPAGE | 通常是和其它的旗標一起使用，由其它的旗標來指出那些資訊需要完整的獨立的HTML網頁來列出。
CREDITS_GENERAL | 一般的榮譽，語法的設計與觀念，PHP4.0作者與SAPI模組(module)。
CREDITS_GROUP | 核心開發者的列表。
CREDITS_MODULES | PHP擴充模組的列表，和它們的作者。
CREDITS_SAPI | 有定義此旗標，但是像是PHP 4.0.1pl2，並沒有使用到它。

參考 : phpinfo( ) phpversion( ) php_logo_guid( )


PHP選項與資訊函式庫 -- phpinfo

PHP選項與資訊函式庫

phpinfo

(PHP3 , PHP4)

phpinfo --- 輸出PHP資訊

語法 : int phpinfo (void)

說明 :

輸出全部關於目前PHP的狀態的資訊，這包含了關於PHP編譯選項、擴充模組、PHP版本、伺服器資訊和環境、PHP環境、作業平台資訊、路徑、結構(configuration)選項的值、HTTP標頭、GNU Public License。

參考 : phpversion( ) phpcredits( ) php_logo_guid( )


PHP選項與資訊函式庫 -- phpversion

PHP選項與資訊函式庫

phpversion

(PHP3 , PHP4)

phpversion --- 取得目前PHP版本

語法 : string phpversion (void)

說明 :

傳回現在所安裝的PHP的版本。

Example :

<?php

// prints e.g. 'Current PHP version: 3.0rel-dev'

echo "Current PHP version: ".phpversion();

?>

參考 : phpinfo( ) phpcredits( ) php_logo_guid( )


PHP選項與資訊函式庫 -- putenv

PHP選項與資訊函式庫

putenv

(PHP3 , PHP4)

putenv --- 設定環境變數的值

語法 : void putenv (string setting)

說明 :

增加setting到伺服器環境。

Example :

<?php

putenv ("UNIQID=$uniqid");

?>


PHP選項與資訊函式庫 -- set_magic_quotes_runtime

PHP選項與資訊函式庫

set_magic_quotes_runtime

(PHP3 >= 3.0.6 , PHP4)

set_magic_quotes_runtime --- 設定目前magic_quotes_runtime的值

語法 : long set_magic_quotes_runtime (int new_setting)

說明 :

設定目前magic_quotes_runtime的值，0表示關閉，1表示開啟。

參考 : get_magic_quotes_gpc( ) get_magic_quotes_runtime( )


PHP選項與資訊函式庫 -- set_time_limit

PHP選項與資訊函式庫

set_time_limit

(PH3 , PHP4)

set_time_limit --- 限制最大的執行時間

語法 : void set_time_limit (int seconds)

說明 :

設定一個程式所允許執行的秒數，如果到達限制的時間，程式將會傳回錯誤。它預設的限制時間是30秒，max_execution_time的值定義在結構檔案中(在PHP3中叫做php3.ini，在PHP4則叫做php.ini)，如果將秒數設為0，表示無時間上的限制。

當呼叫此函式時，set_time_limit( )會從零重新開始計算最長執行的時間，也就是說，如果最長執行時間為預設的30秒，而在呼叫此函式set_time_limit(20)之前已花了25秒來執行程式，則程式最長執行的時間將會是45秒。

注意 : 當PHP是執行在安全模式時，set_time_limit( )將不會有結果，除非是關閉安全模式或是修改結構檔案中(在PHP3中叫做php3.ini，在PHP4則叫做php.ini)的時間限制。


PHP選項與資訊函式庫 -- zend_logo_guid

PHP選項與資訊函式庫

zend_logo_guid

(PHP4 >= 4.0b4)

zend_logo_guid --- 取得zend guid

語法 : string zend_logo_guid (void)

說明 :

注意 : 此功能是PHP4 Beta 4中新增的功能


BC高精準度函式庫 -- bcadd

BC高精準度函式庫

bcadd

(PHP3 , PHP4)

bcadd --- 將二個高精準度數字相加

語法 : string bcadd(string left operand, string right operand [ , int scale] );

說明 :

將參數left operand與right operand相加，傳回的字串為相加的和。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcsub( )


BC高精準度函式庫 -- bccomp

BC高精準度函式庫

bccomp

(PHP3 , PHP4)

bccomp --- 比較二個高精準度數字

語法 : int bccomp(string left operand, string right operand [ , int scale] );

說明 :

比較參數left operand與right operand，且傳回值為整數。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。若二個數相等則傳回值為0，若left operand大於right operand則傳回值為+1，若left operand小於right operand則傳回值為-1。


BC高精準度函式庫 -- bcdiv

BC高精準度函式庫

bcdiv

(PHP3 , PHP4)

bcdiv --- 將二個高精準度數字相除

語法 : string bcdiv(string left operand, string right operand [ , int scale] );

說明 :

將參數left operand除以right operand，且傳回結果。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcmul( )


BC高精準度函式庫 -- bcmod

BC高精準度函式庫

bcmod

(PHP3 , PHP4)

bcmod --- 取得高精準度數字的餘數

語法 : string bcmod(string left operand, string modulus);

說明 :

傳回參數modulus除以left operand後的餘數。

參考 : bcdiv( )


BC高精準度函式庫 -- bcmul

BC高精準度函式庫

bcmul

(PHP3 , PHP4)

bcmul --- 將二個高精準度數字相乘

語法 : string bcmul(string left operand, string right operand [ , int scale] );

說明 :

將left operand與right operand相乘，且傳回結果。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcdiv( )


BC高精準度函式庫 -- bcpow

BC高精準度函式庫

bcpow

(PHP3 , PHP4)

bcpow --- 求高精準度數字的次方值

語法 : string bcpow(string x, string y [ , int scale] );

說明 :

傳回參數x的y次方項的值。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcsqrt( )


BC高精準度函式庫 -- bcscale

BC高精準度函式庫

bcscale

(PHP3 , PHP4)

bcscale --- 設定小數點位數

語法 : string bcscale(int scale);

說明 :

此函式用來設定傳回值小數點的位數給所有隨後的BC高精準度函式使用，若隨後的函式無明確指定傳回值小數點的位數，則使用此函式所設定的值。


BC高精準度函式庫 -- bcsqrt

BC高精準度函式庫

bcsqrt

(PHP3 , PHP4)

bcsqrt --- 取得高精準度數字的平方根

語法 : string bcsqrt(string operand, int scale);

說明 :

傳回參數operand平方根的值。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcpow( )


BC高精準度函式庫 -- bcsub

BC高精準度函式庫

bcsub

(PHP3 , PHP4)

bcsub --- 將二個高精準度數字相減

語法 : string bcsub(string left operand, string right operand [ , int scale] );

說明 :

將參數left operand減掉right operand，且傳回相減後的值。參數scale是非必需的，scale是用來設定傳回的值到小數點第幾位。

參考 : bcadd( )


程式執行函式庫 -- escapeshellcmd

程式執行函式庫

escapeshellcmd

(PHP3 , PHP4)

escapeshellcmd --- 逃脫特殊字元

語法 : string escapeshellcmd (string command)

說明 :

escapeshellcmd( )逃脫字串中任何可能用來哄騙(trick)shell命令的字串，此函式用來確定資料傳送到exec( )或system( )之前，由使用者輸入的任何資料已經逃脫，標準的用法如下 :

Example :

<?php

system(EscapeShellCmd($cmd));

?>

參考 : exec( ) popen( ) system( )


程式執行函式庫 -- exec

程式執行函式庫

exec

(PHP3 , PHP4)

exec --- 執行外部程式

語法 : string exec (string command [, string array [, int return_var]])

說明 :

exec( )執行給予的命令command，不過它並不會輸出任何東西，它簡單的從命令的結果中傳回最後一行，如果你需要去執行一個命令，並且從命令去取得所有資料時，可以使用passthru( )這個函式。

如果有給予參數array，則指定的陣列將會被命令所輸出的每一行填滿，注意 : 如果陣列先前已經包含了一些元素的話，exec( )將會把它附加在陣列的後面，如果你不想要此函式附加元素的話，你可以在傳遞此陣列給exec( )之前呼叫unset( )。

如果有給予參數array和return_var，則傳回執行的狀態命令將會寫到這個變數。

注意 : 如果你允許來自使用者輸入的資料，可以傳遞到此函式，那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。

注意 : 如果你使用此函式來啟動一個程式，而且希望在背景裡(background)執行的時候離開它，你必須確定此程式的輸出是轉向(redirected)到一個檔案或是一些輸出的資料流，否則PHP將會懸掛(hang)直到程式執行結束。

參考 : system( ) passthru( ) popen( ) escapeshellcmd( )


程式執行函式庫 -- passthru

程式執行函式庫

passthru

(PHP3 , PHP4)

passthru --- 執行外部程式並且顯示未加工的(raw)輸出

語法 : void passthru (string command [, int return_var])

說明 :

passthru( )類似於exec( )，如果有給予參數return_var，則傳回的Unix命令的狀態將會放在這裡。從Unix命令輸出的是二進制資料，這些資料需要直接地傳送到瀏灠器時，可用此函式來代替exec( )或 system( )。用來執行像是pbmplus效用的指令，可以直接地輸出圖形資料流，設定content-type為image/gif，然後呼叫pbmplus程式來輸出一個gif，你可以建立PHP程式直接地輸出圖形。

注意 : 如果你使用此函式來啟動一個程式，而且希望在背景裡(background)執行的時候離開它，你必須確定此程式的輸出是轉向(redirected)到一個檔案或是一些輸出的資料流，否則PHP將會懸掛(hang)直到程式執行結束。

參考 : exec( ) system( ) popen( ) escapeshellcmd( )


程式執行函式庫 -- system

程式執行函式庫

system

(PHP3 , PHP4)

system --- 執行外部程式並且顯示輸出

語法 : string system (string command [, int return_var])

說明 :

system( )執行給予的命令command，並且輸出結果。如果有給予參數return_var，則執行命令的狀態碼將會寫到這個變數。

注意 : 如果你允許來自使用者輸入的資料，可以傳遞到此函式，那麼你應該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統來執行武斷的(arbitrary)命令。

注意 : 如果你使用此函式來啟動一個程式，而且希望在背景裡(background)執行的時候離開它，你必須確定此程式的輸出是轉向(redirected)到一個檔案或是一些輸出的資料流，否則PHP將會懸掛(hang)直到程式執行結束。

如果PHP是運作成伺服器模組，在輸出每一行後，system( )會試著自動地清除web伺服器的輸出緩衝。

成功則傳回命令的最後一行，失敗則傳回false。

如果你需要去執行一個命令，並且從命令去取得所有資料時，可以使用passthru( )這個函式。

參考 : exec( ) passthru( ) popen( ) escapeshellcmd( )


Pspell函式庫 -- pspell_check

Pspell函式庫

pspell_check

(PHP4 CVS only)

pspell_check --- 檢查單字的拼法

語法 : boolean pspell_check (int dictionary_link, string word)

說明 :

pspell_check( )檢查單字的拼法，如果拼法是正確的則傳回true，如果是錯誤的則傳回false。

Example :

<?php

$pspell_link = pspell_new ("en");

if (pspell_check ($pspell_link, "testt")) {

echo "This is a valid spelling";

} else {

echo "Sorry, wrong spelling";

}

?>


Pspell函式庫 -- pspell_new

Pspell函式庫

pspell_new

(PHP4 CVS only)

pspell_new --- 載入一個新辭典

語法 : int pspell_new (string language [, string spelling [, string jargon [, string encoding [, int mode]]]])

說明 :

pspell_new( )開放一個新辭典且傳回辭典連結identifier給其它拼字函式使用。

參數 language是語言代碼 ，是由二個字母的ISO 639語言代碼和非必需的二個字母的ISO 3166國別代碼所組成的。

參數 spelling是所請求的語言拼字有超過一種以上的拼字，像是英文就有'american'、 'british' 和 'canadian'。

參數 jargon包含了額外的資訊，來區別有著相同的語言和參數 spelling的二個不同單字的列表。

參數 encoding是要將單字編碼，有效的值有 : 'utf-8'、'iso8859-*'、'koi8-r'、 'viscii'、 'cp1252'、 'machine unsigned 16'、'machine unsigned 32'。這個參數大部份還未測試，所以使用時要小心點。

參數 mode說明要使用何種拼字檢查方式，共有下列幾種可使用的方式 :

  • PSPELL_FAST - 快速的方式 (最少的建議)

  • PSPELL_NORMAL - 標準的方式 (較多的建議)

  • PSPELL_BAD_SPELLERS - 緩慢的方式 (最多的建議)

  • PSPELL_RUN_TOGETHER - 將合在一起的單字視為是合法的合成，意思是說，"thecat"將會被視為合法的合成，僅管它應該在二個單字間以空白將單字隔開來，但它還是會被視為合法的合成。改變這個設定只會影響到pspell_check( )傳回的結果，但pspell_suggest( )還是會傳回建議的拼法。

參數 mode是由上列的常數所構成的一個位元罩遮(bitmask)，而PSPELL_FAST、 PSPELL_NORMAL和 PSPELL_BAD_SPELLERS是互相獨立的，所以你只能選擇它們其中一個。

更多的資訊和範例，可以去看看 pspell 的網站http://pspell.sourceforge.net/上的線上手冊。

Example :

<?php

$pspell_link = pspell_new ("en", "", "", "", (PSPELL_FAST|PSPELL_RUN_TOGETHER));

?>


Pspell函式庫 -- pspell_suggest

Pspell函式庫

pspell_suggest

(PHP4 CVS only)

pspell_suggest --- 建議單字的拼法

語法 : array pspell_suggest (int dictionary_link, string word)

說明 :

pspell_suggest( )傳回給予的單字可能的拼法，此函式會傳回一個陣列。

Example :

<?php

$pspell_link = pspell_new ("en");

if (!pspell_check ($pspell_link, "testt")) {

$suggestions = pspell_suggest ($pspell_link, "testt");

for ($i=0; $i < count ($suggestions); $i++) {

echo "Possible spelling: " . $suggestions[$i] . "<br>";

}

}

?>


正規表達函式庫

ereg

(PHP3 , PHP4)

ereg --- 正規表達比對

語法 : int ereg (string pattern, string string [, array regs])

說明 :

搜尋string來和pattern正規表示比對。

若找到比對則會呼叫第三個參數regs，比對的結果會儲存在regs的元素之中，$regs[1]為符合第一個左邊括弧(parenthesis)的部份字串，$regs[2]為符合第二個括弧的部份字串，以此類推，$regs[0]為參數string。

如果ereg( )找到比對，則$regs會被十個元素來填滿，即使是多於或少於十個括弧內的部份字串，也可以比對，這將不影響ereg( )去比對更多部份字串的能力。如果比對不到，$regs將不會被ereg( )改變。

搜尋是會區分大小寫的。

如果在string中比對到pattern則傳回true，如果比對不到或是發生錯誤則傳回false。

以下的範例會將日期格式YYYY-MM-DD切斷，並且把它顯示成DD.MM.YYYY的格式。

Example :

<?php

if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {

echo "$regs[3].$regs[2].$regs[1]";

}

else {

echo "Invalid date format: $date";

}

?>

參考 : eregi( ) ereg_replace( ) eregi_replace( )


正規表達函式庫 -- ereg_replace

正規表達函式庫

ereg_replace

(PHP3 , PHP4)

ereg_replace --- 正規表達比對取代

語法 : string ereg_replace (string pattern, string replacement, string string)

說明 :

此函式掃描string來和pattern比對，然後以replacement來取代比對到的文字。

此函式傳回修改過的字串，如果比對不到則傳回原來的字串。

如果pattern包含括弧的部份字串，則replacement可以包含" \\數字"的部份字串，這將會以第幾個括弧內的部份字串來替代。\\0將會產生整個字串的內容，最多可使用到九個部份字串，這種情況下它會以開啟的括弧來計算。

如果在string中找不到比對，則將會傳回未改變的字串string。

以下的範例會將字串切斷，並顯示三次 "This was a test" :

<?php

$string = "This is a test";

echo ereg_replace (" is", " was", $string);

echo ereg_replace ("( )is", "\\1was", $string);

echo ereg_replace ("(( )is)", "\\2was", $string);

?>

有一個地方需要去注意的是，如果你在參數replacement中使用整數值的時候，你可能無法取得到結果，這是因為ereg_replace( )將會把數字解釋成字元的順序(ordinal)值，並且執行它，例如 :

<?php

/* This will not work as expected. */

$num = 4;

$string = "This string has four words.";

$string = ereg_replace('four', $num, $string);

echo $string; /* Output: 'This string has words.' */

/* This will work. */ $num = '4';

$string = "This string has four words.";

$string = ereg_replace('four', $num, $string);

echo $string; /* Output: 'This string has 4 words.' */

?>

參考 : ereg( ) eregi( ) eregi_replace( )


正規表達函式庫 -- eregi

正規表達函式庫

eregi

(PHP3 , PHP4)

eregi --- 忽略大小寫的正規表達比對

語法 : int eregi (string pattern, string string [, array regs])

說明 :

此函式和ereg( )相同，不同處在於當它在比對字母的字元時，它是忽略大小寫的。

參考 : ereg( ) ereg_replace( ) eregi_replace( )


正規表達函式庫 -- eregi_replace

正規表達函式庫

eregi_replace

(PHP3 , PHP4)

eregi_replace --- 忽略大小寫的正規表達比對取代

語法 : string eregi_replace (string pattern, string replacement, string string)

說明 :

此函式和ereg_replace( )相同，不同處在於當它在比對字母的字元時，它是忽略大小寫的。

參考 : ereg( ) eregi( ) ereg_replace( )


正規表達函式庫 -- split

正規表達函式庫

split

(PHP3 , PHP4)

split --- 以正規表達式將字串切開

語法 : array split (string pattern, string string [, int limit])

說明 :

傳回字串的陣列，以正規表達式pattern為界限，將字串string切開。如果有設定limit，則傳回的陣列最多將會包含limit個元素，而最後的元素會包含全部string所剩下部份。如果發生錯誤，split( )則傳回false。

以下的範例可以從/etc/passwd的一行裡，取得五個欄位的資料 :

<?php

$passwd_list = split (":", $passwd_line, 5);

?>

可以用斜線、逗點、或是連字號，來剖析日期 :

<?php

date = "04/30/1973"; // Delimiters may be slash, dot, or hyphen

list ($month, $day, $year) = split ('[/.-]', $date);

echo "Month: $month; Day: $day; Year: $year<br>\n";

?>

注意 : pattern是有區分大小寫的

注意 : 如果你不需要正規表達的功能，你可以使用速度更快的explode( )

參考 : spliti( ) explode( ) implode( )


正規表達函式庫 -- spliti

正規表達函式庫

spliti

(PHP4 >= 4.0.1)

spliti --- 忽略大小寫的以正規表達式將字串切開

語法 : array split (string pattern, string string [, int limit])

說明 :

此函式和split( )相同，不同處在於當它在比對字母的字元時，它是忽略大小寫的。

參考 : split( ) explode( ) implode( )


正規表達函式庫 -- sql_regcase

正規表達函式庫

sql_regcase

(PHP3 , PHP4)

sql_regcase --- 使正規表達式不分大小寫比對

語法 : string sql_regcase (string string)

說明 :

傳回一個有效的正規表達式比對string，忽略大小寫的。這個表達式是將各個字元轉換成一個中括弧( [ ] )來表示，如果這個字元是可用的，則中括弧會包含字元的大寫與小寫，否則它會包含原來字串兩次。

Example :

<?php

echo sql_regcase ("Foo bar");

?>

顯示出 :

[Ff][Oo][Oo][ ][Bb][Aa][Rr]

這可以用來達到不分大小寫的pattern比對，這只有在區分大小寫的正規表達中才行。


Session函式庫 -- decode

Session函式庫

session_decode

(PHP4)

session_decode --- 從字串解碼session資料

語法 : bool session_decode (string data)

說明 :

session_decode( )將參數data中的session資料解碼，設定變數儲存在session中。

注意 : 此函式是PHP4.0中新增的函式


Session函式庫 -- session_destroy

Session函式庫

session_destroy

(PHP4)

session_destroy --- 消滅所有session登記過的資料

語法 : bool session_destroy(void);

說明 :

session_destroy( )將目前session關聯的所有的資料全部消滅。

此函式成功則傳回true，消滅session資料失敗則傳回false。


Session函式庫 -- encode

Session函式庫

session_encode

(PHP4)

session_encode --- 將目前session資料編碼

語法 : bool session_encode(void);

說明 :

session_encode( )傳回目前session編碼在裡面的內容，此函式傳回一字串。

注意 : 此函式是PHP4.0中新增的函式


Session函式庫 -- session_get_cookie_params

Session函式庫

session_get_cookie_params

(PHP4 >= 4.0RC2)

session_get_cookie_params --- 取得session cookie參數

語法 : array session_get_cookie_params (void);

說明 :

session_get_cookie_params( )傳回session cookie資訊，此函式傳回一陣列，陣列包含了下列的項目 :

  • "lifetime" -- cookie的存活時間
  • "path" -- 資訊儲存的路徑
  • "domain" -- cookie的領域


Session函式庫 -- session_id

Session函式庫

session_id

(PHP4)

session_id --- 取得並且(或)設定目前的session id

語法 : string session_id ([string id])

說明 :

session_id( )傳回目前session的session id，如果有指定參數 id，它將會取代目前的session id。

常數SID也可以用來取回目前的名稱與session id，可以適當的加在URLs。


Session函式庫 -- session_is_registered

Session函式庫

session_is_registered

(PHP4)

session_is_registered --- 判斷變數是否已經登記

語法 : bool session_is_registered (string name)

說明 :

如果變數name在目前的session中已經登記過了，則session_is_registered( )傳回true。

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_module_name

Session函式庫

session_module_name

(PHP4)

session_module_name --- 取得並且(或)設定目前session模組

語法 : string session_module_name ([string module])

說明 :

session_module_name( )傳回目前session模組(module)的名稱，如果有指定module，則此模組將會用來替代。

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_name

Session函式庫

session_name

(PHP4)

session_name --- 取得並且(或)設定目前session名稱

語法 : string session_name ([string name])

說明 :

session_name( )傳回目前session的名稱，如果有指定參數name，則目前session的名稱會變成它的值。

session名稱和 cookies 及 URLs中的session id有關聯，它應該包含只有由字母與數字所構成的字元，在每個請求起動的時候，session的名稱會重置成儲存在 session.name 中預設的值，因此，你必須在各個請求中呼叫session_name( )，並且要在呼叫session_start( )或是session_register( )之前來呼叫session_name( )。

Example :

<?php

# set the session name to WebsiteID

$previous_name = session_name ("WebsiteID");

echo "The previous session name was $previous_name<p>";

?>

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_register

Session函式庫

session_register

(PHP4)

session_register --- 在目前session中登記一個或多個變數

語法 : bool session_register (mixed name [, mixed ...])

說明 :

session_register( )的參數可以是一字串變數名稱或是一個由變數名稱或其它陣列所構成的陣列。各個衝突的變數名稱，session_register( )會將它的名稱登記(registers)成全域變數。

當變數登記成功時，此函式傳回true。

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_save_path

Session函式庫

session_save_path

(PHP4)

session_save_path --- 取得並且(或)設定目前session儲存的路徑

語法 : string session_save_path ([string path])

說明 :

session_save_path( )傳回目前用來儲存session資料的目錄的路徑，如果有指定path，則資料儲存的路徑將會改變。

注意 : 在有些作業系統上，你可以在檔案系統上指定一個路徑，此路徑處理小檔案非常有效率。例如 : 在Linux上，reiserfs可以提供比ext2fs更好的效率

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_set_cookie_params

Session函式庫

session_set_cookie_params

(PHP4 >= 4.0RC2)

session_set_cookie_params --- 設定session cookie參數

語法 : void session_set_cookie_params (int lifetime [, string path [, string domain]])

說明 :

設定cookie的參數定義在 php.ini中，此函式的結果只有在程式執行期間有效。


Session函式庫 -- session_start

Session函式庫

session_start

(PHP4)

session_start --- 最初的session資料

語法 : bool session_start(void);

說明 :

session_start( )建立一個session，或是經由GET變數或cookie，繼續目前的session id。

此函式永遠傳回true。

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_unregister

Session函式庫

session_unregister

(PHP4)

session_unregister --- 從目前的session將變數取消登記

語法 : bool session_unregister (string name)

說明 :

session_unregister( )從目前的session，將變數名稱name取消登記(放棄)。

當變數成功的從session取消登記時，此函式傳回true。

注意 : 這是PHP4.0中新增的函式


Session函式庫 -- session_unset

Session函式庫

session_unset

(PHP4 >= 4.0b4)

session_unset --- 釋放所有變數

語法 : void session_unset(void);

說明 :

session_unset( )釋放所有目前登記的變數。


信號與記憶體共享函式庫 -- sem_acquire

信號與共享記憶體函式庫

sem_acquire

(PHP3 >= 3.0.6, PHP4)

sem_acquire --- 獲得信號

語法 : int sem_acquire (int sem_identifier)

說明 :

成功則傳回true，失敗則傳回false。

sem_acquire( )封鎖(非必要的話)直到信號能被獲得，如果獲得信號超出max_acquire的值，則會先鎖住信號再試著去獲得信號。

在處理一請求之後，任何以處理所獲得的信號但是卻沒有明確的釋放，將會自動地釋放並且將會產生警告。

參考 : sem_get( ) sem_release( )


信號與記憶體共享函式庫 -- sem_get

信號與共享記憶體函式庫

sem_get

(PHP3 >= 3.0.6 , PHP4)

sem_get --- 取得信號 id

語法 : int sem_get (int key [, int max_acquire [, int perm]])

說明 :

成功則傳回一正數的信號 identifier，錯誤則傳回false。

sem_get( )傳回的id能用來存取System V信號，如果必要的話，使用參數perm中指定的權限位元(預設是0666)來建立信號。max_auquire用來設定同時能獲得信號處理的數目，其預設值為1。

以相同的key第二次呼叫此函式，將會傳回不同的信號 identifier，但這兩個identifier都是存取在相同的信號之下。

參考 : sem_acquire( ) sem_release( )


信號與記憶體共享函式庫 -- sem_release

信號與共享記憶體函式庫

sem_release

(PHP3 >= 3.0.6 , PHP4)

sem_release --- 釋放信號

語法 : int sem_release (int sem_identifier)

說明 :

成功則傳回true，失敗則傳回false。

如果它是目前以呼叫處理來獲得信號，sem_release( )可用來釋放信號，否則會產生警告。

在釋放信號之後，可以呼叫sem_acquire( )來重新獲得它。

參考 : sem_get( ) sem_acquire( )


信號與記憶體共享函式庫 -- shm_attach

信號與共享記憶體函式庫

shm_attach

(PHP3 >= 3.0.6 , PHP4)

shm_attach --- 建立或開啟共享記憶體部分

語法 : int shm_attach (int key [, int memsize [, int perm]])

說明 :

shm_attach( )傳回的id能用來存取System V共享記憶體，第一次呼叫時則建立共享記憶體memsize部分(segment)(預設是php3.ini或php.ini中的sysvshm.init_mem設定值，否則以10000 bytes)和非必需選項perm(預設是0666)。

相同的key之下第二次呼叫shm_attach( )將會傳回不同的共享記憶體identifier，但這兩個identifier都是存取在相同的共享記憶體之下，memsize和perm將會被忽略。


信號與記憶體共享函式庫 -- shm_detach

信號與共享記憶體函式庫

shm_detach

(PHP3 >= 3.0.6 , PHP4)

shm_detach --- 從共享記憶體部分分離

語法 : int shm_detach (int shm_identifier)

說明 :

shm_detach( )從給予的shm_identifier共享記憶體分離(disconnects)，shm_identifier是由shm_attach( )建立的。

記住，此共享記憶體依然存在Unix系統中而且資料依然存在。


信號與記憶體共享函式庫 -- shm_get_var

信號與共享記憶體函式庫

shm_get_var

(PHP3 >= 3.0.6 , PHP4)

shm_get_var --- 從共享記憶體傳回變數

語法 : mixed shm_get_var (int id, int variable_key)

說明 :

shm_get_var( )傳回一變數和給予的variable_key，變數依然存在共享記體中。


信號與記憶體共享函式庫 -- shm_put_var

信號與共享記憶體函式庫

shm_put_var

(PHP3 >= 3.0.6 , PHP4)

shm_put_var --- 插入或更新共享記憶體中的變數

語法 : int shm_put_var (int shm_identifier, int variable_key, mixed variable)

說明 :

插入或更新variable和給予的variable_key，所有的變數型態都支援(double、int、string、array)。


信號與記憶體共享函式庫 -- shm_remove

信號與共享記憶體函式庫

shm_remove

(PHP3 >= 3.0.6 , PHP4)

shm_remove --- 從Unix系統移除共享記憶體

語法 : int shm_remove (int shm_identifier)

說明 :

從Unix系統移除共享記憶體，所有的資料都將會消滅。


信號與記憶體共享函式庫 -- shm_remove_var

信號與共享記憶體函式庫

shm_remove_var

(PHP3 >= 3.0.6 , PHP4)

shm_remove_var --- 從共享記憶體移除變數

語法 : int shm_remove_var (int id, int variable_key)

說明 :

移除一變數和給予的variable_key，並且釋放所佔據的記憶體。


SNMP函式庫 -- snmp_get_quick_print

SNMP函式庫

snmp_get_quick_print

(PHP3 >= 3.0.8 , PHP4 >= 4.0b2)

snmp_get_quick_print --- 獲得目前UCD函式庫的quick_print設定值

語法 : boolean snmp_get_quick_print (void )

說明 :

傳回目前儲存在UCD函式庫中quick_print的值，quick_print的預設值為關閉(off)。

Example :

<?php

$quickprint = snmp_get_quick_print();

?>

如果quick_print是關閉的(off)，則上面的範例會傳回false，如果quick_print是開啟的(on)，則會傳回true。

當使用UCD SNMP函式庫時，snmp_get_quick_print( )才有效，當使用Windows SNMP函式庫時，此函式是無效的。

參考 : snmp_set_quick_print( )


SNMP函式庫 -- snmp_set_quick_print

SNMP函式庫

snmp_set_quick_print

(PHP3 >= 3.0.8 , PHP4 >= 4.0b2)

snmp_set_quick_print --- 設定UCD SNMP函式庫中quick_print的值

語法 : void snmp_set_quick_print (boolean quick_print)

說明 :

設定UCD SNMP函式庫內部quick_print的值。當它設為(1)時，SNMP函式庫將會傳回 'quick_print'的值，意思是說它只會顯示出它的值。當它設為(0)時，UCD SNMP函式庫顯示出額外的資訊，包含了值的型態(例如 : IpAddress 或 OID)，除此之外，它還會顯示出額外的三個字元或少於三個字元的十六進制的值。

當使用傳回的資訊而不會將它顯示出來時，通常會使用到quick_print。

Example :

<?php

snmp_set_quick_print(0);

$a = snmpget("127.0.0.1", "public", ".1.3.6.1.2.1.2.2.1.9.1");

echo "$a<BR>\n"; snmp_set_quick_print(1);

$a = snmpget("127.0.0.1", "public", ".1.3.6.1.2.1.2.2.1.9.1");

echo "$a<BR>\n";

?>

上面的範例第一個顯示出來的值可能是 : 'Timeticks: (0) 0:00:00.00'，若設為1則只會顯示出 '0:00:00.00'。

UCD SNMP函式庫預設上是傳回冗長的值，使用quick_print可以只傳回值。

現在字串仍然傳回額外的引號，這將會在後來的版本中修正。

當使用UCD SNMP函式庫時，snmp_get_quick_print( )才有效，當使用Windows SNMP函式庫時，此函式是無效的。


SNMP函式庫 -- snmpget

SNMP函式庫

snmpget

(PHP3 , PHP4)

snmpget --- 取得SNMP物件

語法 : string snmpget (string hostname, string community, string object_id [, int timeout [, int retries]])

說明 :

成功則傳回SNMP物件，錯誤則傳回false。

snmpget( )用來讀取參數 object_id指定的SNMP物件的值，SNMP代理人(agent)是由參數 hostname來指定，參數 community指定讀取公眾(read community)。

Example :

<?php

$syscontact = snmpget("127.0.0.1", "public", "system.SysContact.0");

?>


SNMP函式庫 -- snmpset

SNMP函式庫

snmpset

(PHP3 >= 3.0.12 , PHP4 >= 4.0b2)

snmpset --- 設定SNMP物件

語法 : bool snmpset (string hostname, string community, string object_id, string type, mixed value [, int timeout [, int retries]])

說明 :

設定指定的SNMP物件值，成功則傳回true，錯誤則傳回false。

snmpset( )是用來設定object_id所指定的SNMP物件的值，SNMP代理人(agent)是由參數 hostname來指定，參數 community指定讀取公眾(read community)。


SNMP函式庫 -- snmpwalk

SNMP函式庫

snmpwalk

(PHP3 , PHP4)

snmpwalk --- 取得所有SNMP物件

語法 : array snmpwalk (string hostname, string community, string object_id [, int timeout [, int retries]])

說明 :

從object_id傳回SNMP物件值的陣列，錯誤則傳回false。

snmpwalk( )是用來從hostname所指定的SNMP代理人(agent)讀取所有的值，參數 community指定讀取公眾(read community)，一個null object_id是獲得SNMP物件樹狀的根目錄，並且傳回在此根目錄下的所有物件，傳回一個陣列。如果有指定 object_id，則傳回在此 object_id下的所有物件。

Example :

<?php

$a = snmpwalk("127.0.0.1", "public", "");

?>

上面的範例將會從執行在localhost的SNMP代理人，傳回所有SNMP物件，我們可使用迴圈來取得它的值

Example :

<?php

for ($i=0; $i<count($a); $i++) {

echo $a[$i];

}

?>


SNMP函式庫 -- snmpwalkoid

SNMP函式庫

snmpwalkoid

(PHP3 >= 3.0.8 , PHP4 >= 4.0b2)

snmpwalkoid --- 獲得網路實體樹狀的資料

語法 : array snmpwalkoid (string hostname, string community, string object_id [, int timeout [, int retries]])

說明 :

傳回一個陣列變數和物件ids，並且它們各自的物件值起始於object_id，錯誤則傳回false。

snmpwalkoid( )是用來從hostname指定的SNMP代理人，讀取所有物件 ids和它們各自的值。參數 community指定讀取公眾(read community)，一個null object_id是獲得SNMP物件樹狀的根目錄，並且傳回在此根目錄下的所有物件，傳回一個陣列。如果有指定 object_id，則傳回在此 object_id下的所有物件。

snmpwalkoid( )的存在和snmpwalk( )有著歷史的原因，這二個函式都是為了後來的兼容性作準備。

Example :

<?php

$a = snmpwalkoid("127.0.0.1", "public", "");

?>

上面的範例將會從執行在localhost的SNMP代理人，傳回所有SNMP物件，我們可使用迴圈來取得它的值

Example :

<?php

for (reset($a); $i = key($a); next($a)) {

echo "$i: $a[$i]<br>\n";

}

?>


字串函式庫 -- AddCSlashes

字串函式庫

AddCSlashes

(PHP4 >= 4.0b4)

AddCSlashes --- 將指定的字元前面加上反斜線

語法 : string addcslashes (string str, string charlist)

說明 :

將參數 charlist列表中的字元前面加上反斜線，傳回加上反斜線後的字串。它逃脫 \n , \r等等，在C-like style中，低於32和高於126的ASCII碼會轉換成八進制來表示。當逃脫字母和數字字元時需要留意點，你可以在參數 charlist中指定一個範圍，例如 : "\0..\37"，這樣一來便會逃脫介於ASCII碼 0和31之於的任何字元。

Example :

<?php

$escaped = addcslashes ($not_escaped, "\0..\37!@\177..\377");

?>

參考 : stripcslashes( ) stripslashes( ) htmlspecialchars( ) quotemeta( )


字串函式庫 -- AddSlashes

字串函式庫

AddSlashes

(PHP3 , PHP4)

AddSlashes --- 將字串加上反斜線

語法 : string addslashes (string str)

說明 :

將需要引用在資料庫查詢等等中的字元前面加上反斜線，傳回加上反斜線的字串，這些字元有單引號(')、雙引號( " )、斜線( \ )及NULL(null byte)。

參考 : stripslashes( ) htmlspecialchars( ) quotemeta( )


字串函式庫 -- bin2hex

字串函式庫

bin2hex

(PHP3 >=3.0.9 , PHP4)

bin2hex --- 轉換二進制資料成為十六進制表示

語法 : string bin2hex (string str)

說明 :

傳回包含 str的十六進位表示的ASCII字串，轉換是以byte-wise和高位元在前(high-nibble first)。


字串函式庫 -- Chop

字串函式庫

Chop

(PHP3 , PHP4)

Chop --- 移除多餘的空白

語法 : string chop (string str)

說明 :

傳回參數 str移除後面多餘的空白後的字串，包括新行(newlines)。

Example :

<?php

$trimmed = chop ($line);

?>

參考 : trim( )


字串函式庫 -- Chr

字串函式庫

Chr

(PHP3 , PHP4)

Chr --- 傳回指定的字元

語法 : string chr (int ascii)

說明 :

傳回參數 ascii指定的字元。

Example :

<?php

$str .= chr (27); /* add an escape character at the end of $str */

/* Often this is more useful */

$str = sprintf ("The string ends in escape: %c", 27);

?>

此函式是ord( )的互補，參考sprintf( )


字串函式庫 -- chunk_split

字串函式庫

chunk_split

(PHP3 >= 3.0.6 , PHP4)

chunk_split --- 將字串切成小段

語法 : string chunk_split (string string [, int chunklen [, string end]])

說明 :

能用來將字串切成小段，例如 : 轉換base64_encode( )的輸出來比對RFC 2045 semantics。它每隔chunklen(預設值為76)個字元便插入參數end(預設值為"\r\n")。它會傳回新的字串，但不會改變原來的字串。

Example :

<?php

# format $data using RFC 2045 semantics

$new_string = chunk_split (base64_encode($data));

?>

此函式比ereg_replace( )更快速

注意 : 此函式是3.0.6中新增的函式


字串函式庫 -- convert_cyr_string

字串函式庫

convert_cyr_string

(PHP3 >= 3.0.6 , PHP4)

convert_cyr_string --- 轉換古斯拉夫字體為另一個

語法 : string convert_cyr_string (string str, string from, string to)

說明 :

此函式將給予的字串從古斯拉夫字元轉換成另一個，參數 from和 to是個字元，代表古斯拉夫字元設定的來源和目標，所提供的型態有 :

  • k - koi8-r

  • w - windows-1251

  • i - iso8859-5

  • a - x-cp866

  • d - x-cp866

  • m - x-mac-cyrillic


字串函式庫 -- count_chars

字串函式庫

count_chars

(PHP4 >= 4.0b4)

count_chars --- 傳回在字串中使用的字元的資訊

語法 : mixed count_chars (string string [, mode])

說明 :

計算參數 string中，每byte-value(0..255)的出現的數目，並且以各種方式將它傳回，依照參數 mode(預設值為0)來決定count_chars( )傳回的方式。

  • 0 - 傳回一個陣列 ，陣列的索引值為byte-value，陣列的值為每個位元的出現次數

  • 1 - 和0相同，但是只有大於零的byte-value才會列出來

  • 2 - 和0相同，但是只有等於零的byte-value才會列出來

  • 3 - 傳回所有使用byte-value的字串

  • 4 - 傳回所有非使用byte-value的字串

注意 : 此函式是PHP4.0中新增的函式


字串函式庫 -- crc32

字串函式庫

crc32

(PHP4 >= 4.0.1)

crc32 --- 計算字串crc32多項式

語法 : int crc32 (string str)

說明 :

產生參數 str的32-bit長的crc多項式(cyclic redundancy checksum polynomial)。

參考 : md5


字串函式庫 -- crypt

字串函式庫

crypt

(PHP3 , PHP4)

crypt --- 使用DES將字串碥碼

語法 : string crypt (string str [, string salt])

說明 :

crypt( )將會使用標準的Unix DES加密方式將字串編碼，參數 str是要編碼的字串，參數 salt是加密的基底(base)。

如果沒有提供參數 salt，它將會由PHP任意地產生。

有些作業系統提供了一種以上的加密型態，事實上，有時候標準的DES加密是以MD5加密演算法來代替。加密的型態是取決於參數 salt，在安裝的時候，PHP決定了crypt函式的能力，並且接受 salt為其它的加密型態，如果沒有提供 salt，PHP預設上是會自動地產生一個標準的2-character DES salt，除非系統預設的加密型態是MD5，這種情況下，便會產生任意的MD5-compatible salt。PHP設定了一個常數名稱CRYPT_SALT_LENGTH，告訴你是否一個正規的2-character salt適用於你的系統，或是可使用12-char MD5 salt。

在系統上crypt( )函式是否提供多樣的加密型態，下列的常數設為0或1依靠著是否給予的型態是可使用的。

  • CRYPT_STD_DES - 標準的DES加密和 2-char SALT

  • CRYPT_EXT_DES - 延伸的DES加密和 9-char SALT

  • CRYPT_MD5 - MD5加密和 12-char SALT 起始為 $1$

  • CRYPT_BLOWFISH - 延伸的DES加密和16-char SALT 起始為 $2$

參考 : md5


字串函式庫 -- echo

字串函式庫

echo

(unknown)

echo --- 輸出字串

語法 : echo (string arg1, string [argn]...)

說明 :

輸出參數。

echo( )不是個真的函式(它是個語言結構)，所以你並不必使用括弧。

Example :

<?php

echo "Hello World";

echo "This spans multiple lines. The newlines will be output as well";

echo "This spans\nmultiple lines. The newlines will be\noutput as well.";

?>

注意 : 事實上，如果你想要傳遞一個以上的參數到此函式時，你不能使用括弧來將參數圍在裡面

參考 : print( ) printf( ) flush( )


字串函式庫 -- explode

字串函式庫

explode

(PHP3 , PHP4)

explode --- 切開字串

語法 : array explode (string separator, string string [, int limit])

說明 :

傳回一個字串的陣列，以參數 separator為界線將參數 string切開，如果有設定參數 limit，則傳回的陣列最多將會包含 limit個元素，而最後一個元素將會包含 string全部剩餘的部份。

Example :

<?php

$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";

$pieces = explode (" ", $pizza);

?>

參考 : split( ) implode( )


字串函式庫 -- flush

字串函式庫

flush

(PHP3 , PHP4)

flush --- 清除輸出緩衝

語法 : void flush(void);

說明 :

清除PHP的輸出緩衝。


字串函式庫 -- get_html_translation_table

字串函式庫

get_html_translation_table

(PHP4 >= 4.0b4)

get_html_translation_table --- 傳回htmlspecialchars( )和htmlentities( )使用的轉換表格

語法 : string get_html_translation_table (int table)

說明 :

get_html_translation_table( )將會傳回htmlspecialchars( )和htmlentities( )內部使用的轉換表格，這裡有二個新的定義HTML_ENTITIES和HTMLSPECIALCHARS，這允許你去指定你想要的表格。

Example :

<?php

$trans = get_html_translation_table (HTML_ENTITIES);

$str = "Hallo & <Frau> & Kr鄝er";

$encoded = strtr ($str, $trans);

?>

變數$encoded將會包含 : "Hallo &amp; &lt;Frau&gt; &amp; Kr&auml;mer"

使用array_flip( )能改變轉化的方向

Example :

<?php

$trans = array_flip ($trans);

$original = strtr ($str, $trans);

?>

$original的內容將會是 : "Hallo & <Frau> & Kr鄝er"

注意 : 此函式是PHP4.0中新增的函式

參考 : htmlspecialchars( ) htmlentities( ) strtr( ) array_flip( )


字串函式庫 -- get_meta_tags

字串函式庫

get_meta_tags

(PHP3 >= 3.0.4 , PHP4)

get_meta_tags --- 從檔案取出所有meta標籤內容屬性並且傳回陣列

語法 : array get_meta_tags (string filename [, int use_include_path])

說明 :

開啟檔案filename，並且一行一行的剖析<meta>標籤。

Example :

<meta name="author" content="name">

<meta name="tags" content="php3 documentation">

</head> <!-- parsing stops here -->

name屬性的值會成為索引值，而content屬性的值會成為陣列的值，如此一來你便可以使用陣列函式庫來存取它的值，在name屬性的值的特殊字元會用"_"來替代，其餘的會轉換成小寫。

設定參數use_include_path為1，將會使PHP試著去開啟include_path中的檔案。


字串函式庫 -- hebrev

字串函式庫

hebrev

(PHP3 , PHP4)

hebrev --- 轉換希伯來語文字成為可看見的文字

語法 : string hebrev (string hebrew_text [, int max_chars_per_line])

說明 :

非必需的參數 max_chars_per_line指出每行最多輸出多少個字元，此函式會試著去避開破損的單字(breaking words)。

參考 : hebrevc( )


字串函式庫 -- hebrevc

字串函式庫

hebrevc

(PHP3 , PHP4)

hebrevc --- 轉換希伯來語文字成為可看見的文字和新行的轉換

語法 : string hebrevc (string hebrew_text [, int max_chars_per_line])

說明 :

此函式和hebrev( )類似，不同的地方是它會轉換新行( \n)為 "<br>\n"非必需的參數 max_chars_per_line指出每行最多輸出多少個字元，此函式會試著去避開破損的單字(breaking words)。

參考 : hebrev( )


字串函式庫 -- htmlentities

字串函式庫

htmlentities

(PHP3 , PHP4)

htmlentities --- 轉換所有字元成為HTML實體

語法 : string htmlentities (string string)

說明 :

此函式和htmlspecialchars( )相同，不同的是它會轉換所有HTML實體的字元。

參考 : htmlspecialchars( ) nl2br( )


字串函式庫 -- htmlspecialchars

字串函式庫

htmlspecialchars

(PHP3 , PHP4)

htmlspecialchars --- 轉換特殊字元成為HTML實體

語法 : string htmlspecialchars (string string)

說明 :

在HTML中有些字元有著特殊的含義，如果要保留它們的意義則需要以HTML實體來表示它，此函式傳回轉換後的字串。

此函式用在預防使用者提供的文字中包含了HTML的標記，像是佈告欄或是訪客留言板這方面的應用。

目前轉換的字元有以下幾種：

  • '&' (and符號)轉換成 '&amp;'

  • '"' (雙引號)轉換成 '&quot;'

  • '<' (小於)轉換成 '&lt;'

  • '>' (大於)轉換成 '&gt;'

此函式不轉換上面以外的符號，要完整的實體轉換請使用htmlentities( ) 。

參考 : htmlentities( ) nl2br( )


字串函式庫 -- implode

字串函式庫

implode

(PHP3 , PHP4)

implode --- 將陣列的元素連結起來成為字串

語法 : string implode (string glue, array pieces)

說明 :

以參數 glue將陣列 pieces的各個元素結合起來，此函式傳回字串來表示所有陣列的元素，字串的順序和陣列相同。

Example :

<?php

$colon_separated = implode (":", $array);

?>

參考 : explode( ) join( ) split( )


字串函式庫 -- join

字串函式庫

join

(PHP3 , PHP4)

join --- 將陣列的元素連結起來成為字串

語法 : string join (string glue, array pieces)

說明 :

join( )是implode( )的別名，用法也相同。

參考 : explode( ) implode( ) split( )


字串函式庫 -- levenshtein

字串函式庫

levenshtein

(PHP3 CVS only , PHP4 >= 4.0.1)

levenshtein --- 計算二字串間的Levenshtein-Distance

語法 : int levenshtein (string str1, string str2)

說明 :

此函式傳回二參數間的Levenshtein-Distance，如果參數的長度超過255個字元的限制時，則傳回-1。

Levenshtein-Distance是定義成最小的字元數目，你必須取代、插入或刪除來改變 str1成為 str2。演算法的錯綜性是 0(m*n)，n是參數 str1的長度，m是參數 str2的長度。

參考 : soundex( ) similar_text( ) metaphone( )


字串函式庫 -- ltrim

字串函式庫

ltrim

(PHP3 , PHP4)

ltrim --- 去除字串起始處的空白

語法 : string ltrim (string str)

說明 :

此函式去除字串起始處的空白並且傳回去除後的字串，會被去除的有 : "\n"、"\r"、"\t"、 "\v"、"\0"及一般的空白。

參考 : chop( ) trim( )


字串函式庫 -- md5

字串函式庫

md5

(PHP3 , PHP4)

md5 --- 計算字串的MD5拼湊

語法 : string md5 (string str)

說明 :

使用RSA Data Security, Inc. MD5 Message-Digest Algorithm來計算字串 str的MD5拼湊。

參考 : crc32( )


字串函式庫 -- metaphone

字串函式庫

metaphone

(PHP4 >= 4.0b4)

metaphone --- 計算字串的metaphone key

語法 : string metaphone (string str)

說明 :

計算 str的metaphone key。

此函式類似於soundex( ) ，metaphone建立出相同的key給發音相似的單字。它比 soundex( )還要準確，就像是它知道英文發音的規則一樣，metaphone產生的key並沒有固定的長度。

metaphone是由Lawrence Philips<lphilips@verity.com>所發展的，描述在["Practical Algorithms for Programmers", Binstock & Rex, Addison Wesley, 1995]。

注意 : 此函式是PHP4.0中新增的函式


字串函式庫 -- nl2br

字串函式庫

nl2br

(PHP3 , PHP4)

nl2br --- 轉換新行成為HTML的<BR>

語法 : string nl2br (string string)

說明 :

在所有的新行(newline)前面插入'<BR>'，此函式傳回一字串。

參考 : htmlspecialchars( ) htmlentities( ) wordwrap( )


字串函式庫 -- ob_end_clean

字串函式庫

ob_end_clean

(PHP4)

ob_end_clean --- 丟棄輸出緩衝的內容並且關閉輸出緩衝

語法 : void ob_end_clean(void);

說明 :

此函式丟棄輸出緩衝的內容並且關閉輸出緩衝。

參考 : ob_start( ) ob_end_flush( )


字串函式庫 -- ob_end_flush

字串函式庫

ob_end_flush

(PHP4)

ob_end_flush --- 清除輸出緩衝並且關閉輸出緩衝

語法 : void ob_end_flush(void);

說明 :

此函式將送出輸出緩衝的內容並且關閉輸出緩衝，如果你想要進一步的處理緩衝的內容，你必須在此函式之前呼叫ob_get_contents( )。

參考 : ob_start( ) ob_get_contents( ) ob_end_clean( )


字串函式庫 -- ob_get_contents

字串函式庫

ob_get_contents

(PHP4)

ob_get_contents --- 傳回輸出緩衝的內容

語法 : string ob_get_contents(void);

說明 :

這將會傳回輸出緩衝的內容，如果輸出緩衝並沒有開啟則傳回FALSE。

參考 : ob_start( ) ob_end_flush( ) ob_end_clean( )


字串函式庫 -- ob_implicit_flush

字串函式庫

ob_implicit_flush

(PHP4 >= 4.0b4)

ob_implicit_flush --- 開啟或關閉固有的清除

語法 : void ob_implicit_flush ([int flag])

說明 :

ob_implicit_flush( )將會開啟或關閉固有的(implicit)清除(如果沒有給予參數 flag，則它預設上是開啟)，固有的清除將會導致在每次呼叫輸出後便會執行清除，如此一來將不再需要呼叫flush( )。

開啟固有的清除將會使輸出緩衝失去能力，如果有呼叫ob_end_flush( )則輸出緩衝現行的輸出將會被送出。

參考 : flush( ) ob_start( ) ob_end_flush( )


字串函式庫 -- ob_start

字串函式庫

ob_start

(PHP4)

ob_start --- 開啟輸出緩衝

語法 : void ob_start(void);

說明 :

此函式將會開啟輸出緩衝，當輸出緩衝開啟後將沒有輸出從程式釋放(rel)，輸出是附加在內部的緩衝作為替代。

內部緩衝的內容可以使用ob_get_contents( )複製成一個字串變數，真實的輸出發生在呼叫ob_end_flush( )和ob_end_clean( )丟棄緩衝的內容時。

參考 : ob_get_contents( ) ob_end_flush( ) ob_end_clean( ) ob_implicit_flush( )


字串函式庫 -- Ord

字串函式庫

Ord

(PHP3 , PHP4)

Ord --- 傳回字元的ASCII碼

語法 : int ord (string string)

說明 :

傳回字串 string第一個字元的ASCII碼，此函式和chr( )互補。

Example :

<?php

if (ord ($str) == 10) {

echo "The first character of \$str is a line feed.\n";

}

?>

參考 : chr( )


字串函式庫 -- parse_str

字串函式庫

parse_str

(PHP3 , PHP4)

parse_str --- 剖析字串使它成為變數

語法 : void parse_str (string str)

說明 :

剖析像是經由URL傳遞查詢字串的字串，並且設定變數在目前的範圍中。

Example :

<?php

$str = "first=value&second[]=this+works&second[]=another";

parse_str($str);

echo $first; /* prints "value" */

echo $second[0]; /* prints "this works" */

echo $second[1]; /* prints "another" */

?>


字串函式庫 -- print

字串函式庫

print

(unknown)

print --- 輸出字串

語法 : print (string arg)

說明 :

輸出參數 arg。

參考 : echo( ) printf( ) flush( )


字串函式庫 -- printf

字串函式庫

printf

(PHP3 , PHP4)

printf --- 輸出格式化字串

語法 : int printf (string format [, mixed args...])

說明 :

依照參數format的內容將字串格式化，格式化的內容請參考sprintf( )

參考
  : print( )  sprintf( )
  sscanf( )  fscanf( )
  flush( )


字串函式庫 -- quoted_printable_decode

字串函式庫

quoted_printable_decode

(PHP3 >= 3.0.6 , PHP4)

quoted_printable_decode --- 轉換引用可列出字串成為8-bit字串

語法 : string quoted_printable_decode (string str)

說明 :

此函式傳回一個8-bit二進制字串，相當於將引用可列出(quoted printable)字串解碼。此函式類似於imap_qprint( )，不同處是此函式不需要IMAP模組。


字串函式庫 -- quotemeta

字串函式庫

quotemeta

(PHP3 , PHP4)

quotemeta --- 將特殊字元加上反斜線

語法 : string quotemeta (string str)

說明 :

將字串 str中的下列字元前面加上反斜線。

. \\ + * ? [ ^ ] ( $ )

參考
  : addslashes( )  htmlentities(
  )  htmlspecialchars( )  nl2br(
  )  stripslashes( )


字串函式庫 -- rtrim

字串函式庫

rtrim

(PHP3 , PHP4)

rtrim --- 移除多餘的空白

語法 : string rtrim (string str)

說明 :

傳回參數 str移除後面多餘的空白後的字串，包括新行(newlines)。此函式是chop( )的別名。

Example :

<?php

$trimmed = rtrim ($line);

?>

參考 : trim( ) ltrim( )


字串函式庫 -- setlocale

字串函式庫

setlocale

(PHP3 , PHP4)

setlocale --- 設定場所資訊

語法 : string setlocale (string category, string locale)

說明 :

參數 category是個字串，指定函式的種類，會受到 locale設定的影響 :

  • LC_ALL - 下列全部的設定

  • LC_COLLATE - 字串比較 - 不是目前PHP的工具

  • LC_CTYPE - 字元分類和轉換，例如 : strtoupper( )

  • LC_MONETARY - 作為 localeconv( ) - 不是目前PHP的工具

  • LC_NUMERIC - 小數點的區分者

  • LC_TIME - 日期和時間格式，和strftime( )一起

如果參數 locale是空字串 " "，則 locale的名稱將會設成與上面categories相同名稱的環境變數值， 或是從 "LANG"。

如果參數 locale是 zero或 "0"，則 locale的設定不會受到影響，只會傳回目前的設定值。

setlocale( )傳回一個新的現行場所(locale)，如果平臺無法執行場所的機能，指定的場所不存在或是種類(category)名稱是無效時，則傳回false。一個無效的種類名稱會導致一個警告的訊息。


字串函式庫 -- similar_text

字串函式庫

similar_text

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

similar_text --- 計算二字串間的相似度

語法 : int similar_text (string first, string second [, double percent])

說明 :

計算二字串間的相似度，敘述在Oliver [1993]。這個執行不使用Oliver假定碼(pseudo code)中的堆放(stack)，但遞歸的呼叫或許會加快全部處理的速度，這個演算法的錯綜性是 0(N**3)，N是最長字串的長度。

傳遞第三個參數給函式，similar_text( )將會計算出以百分比表示的相似度，它傳回二字串間相配的字串的數目。


字串函式庫 -- soundex

字串函式庫

soundex

(PHP3 , PHP4)

soundex --- 計算字串的發音鍵

語法 : string soundex (string str)

說明 :

計算字串 str的發音鍵(soundex key)值。

發音鍵有個特性是，相同發音的單字會產生出相同的發音鍵。如果你知道單字的發音但是確不知道拼法時，你就可以使用這個特性，在資料庫中作個簡單的搜尋。此函式會傳回一個4字元長的字串，字串的開頭是個字母。

這個特殊的函式由Donald Knuth敘述在"The Art Of Computer Programming, vol. 3: Sorting And Searching", Addison-Wesley (1973), pp. 391-392。

Example :

soundex ("Euler") == soundex ("Ellery") == 'E460';

soundex ("Gauss") == soundex ("Ghosh") == 'G200';

soundex ("Knuth") == soundex ("Kant") == 'H416';

soundex ("Lloyd") == soundex ("Ladd") == 'L300';

soundex ("Lukasiewicz") == soundex ("Lissajous") == 'L222';


字串函式庫 -- sprintf

字串函式庫

sprintf

(PHP3 , PHP4)

sprintf --- 傳回格式化字串

語法 : string sprintf (string format [, mixed args...])

說明 :

依照格式化字串 format，傳回一字串。

格式化字串是由 0(zero)或是一些命令所構成的，普通的字元(不包含%)會直接地複製到結果，這適用於sprintf( )和printf( )。

各個轉換的規格是由這些元素所構成，依序是 :

  1. 非必需選項指定填塞，說明使用何種字元來填塞結果成為適當的字串長度，它可以是個空白字元或是 0(字元 0)，它預設上是使用空白來填塞。要替換填塞字元，可以在字首前面加上單引號( ' )來指定，參考下面的範例。

  2. 非必需選項指定對齊方式，說明結果應該要靠左對齊還是靠右對齊，預設是靠右對齊，可以使用字元 - 來使它靠左對齊。

  3. 非必需選項指定寬度，說明這個轉換要產生出多少(最少)字元。

  4. 非必需選項指定精準度，說明要顯示到小數點第幾位，這個選項對於浮點數以外的型態沒有影響，另外一個函式number_format( )有助於將數字格式化。

  5. 指定型態說明要將參數看待成何種型態，可能的型態有 :

% - 百分比字元，不需要參數

b - 將參數看待成整數，而且結果為二進制的值

c - 將參數看待成整數，而且結果為此ASCII值的字元

d - 將參數看待成整數，而且結果為十進位的數值

f - 將參數看待成浮點數，而且結果為浮點數

o - 將參數看待成整數，而且結果為八進制的數值

s - 將參數和結果都看待成字串

x - 將參數看待成整數，而且結果為十六進制的數值(小寫字母)

X - 將參數看待成整數，而且結果為十六進制的數值(大寫字母)

Example :

<?php

$isodate = sprintf ("%04d-%02d-%02d", $year, $month, $day);

?>

Example :

<?php

$money1 = 68.75;

$money2 = 54.35;

$money = $money1 + $money2;

// echo $money will output "123.1";

$formatted = sprintf ("%01.2f", $money);

// echo $formatted will output "123.10"

?>

參考 : printf( ) sscanf( ) fscanf( ) number_format( )


字串函式庫 -- sscanf

字串函式庫

sscanf

(PHP4 >= 4.0.1)

sscanf --- 依照格式剖析字串

語法 : mixed sscanf (string str, string format [, string var1...])

說明 :

sscanf( )輸入的參數和printf( )類似，sscanf( )讀取字串 str，並且依照指定的格式 format來解釋它。如果只傳遞二個參數給此函式，則傳回剖析後的值將會是個陣列。

Example :

<?php

// getting the serial number

$serial = sscanf("SN/2350001","SN/%d");

// and the date of manufacturing

$mandate = "January 01 2000";

list($month, $day, $year) = sscanf($mandate,"%s %d %d");

echo "Item $serial was manufactured on: $year-".substr($month,0,3)."-$day\n";

?>

如果有傳遞非必需參數時，函式將會傳回分配值的數目，非必需參數必須依照關係傳遞。

Example :

<?php

// get author info and generate DocBook entry

$auth = "24\tLewis Carroll";

$n = sscanf($auth,"%d\t%s %s", &$id, &$first, &$last);

echo "<author id='$id'> <firstname>$first</firstname> <surname>$last</surname> </author>\n";

?>

參考 : fscanf( ) printf( ) sprintf( )


字串函式庫 -- str_pad

字串函式庫

str_pad

(PHP4 >= 4.0.1)

str_pad --- 填塞字串成為指定的長度

語法 : string str_pad (string input, int pad_length [, string pad_string [, int pad_type]])

說明 :

此函式填塞到字串參數 input的左邊、右邊或是左邊及右邊，成為指定的填塞長度。如果沒有提供非必需選項 pad_string，則使用空白將參數 input填塞，否則，它會使用 pad_string填塞到指定的長度。

非必需選項 pad_type可以是STR_PAD_RIGHT、STR_PAD_LEFT或是STR_PAD_BOTH，如果沒有指定 pad_type，則假定為 STR_PAD_RIGHT。

如果 pad_length的值是負數或是小於輸入字串的長度時，則不會填塞。

Example :

<?php

$input = "Alien";

print str_pad($input, 10); // produces "Alien "

print str_pad($input, 10, "-=", STR_PAD_LEFT); // produces "-=-=-Alien"

print str_pad($input, 10, "_", STR_PAD_BOTH); // produces "__Alien___"

?>


字串函式庫 -- str_repeat

字串函式庫

str_repeat

(PHP4 >= 4.0b4)

str_repeat --- 重複字串

語法 : string str_repeat (string input, int multiplier)

說明 :

傳回 input重複 multiplier次後的字串，參數 multiplier必須大於 0。

Example :

<?php

echo str_repeat ("-=", 10);

?>

上面的範例將會輸出 "-=-=-=-=-=-=-=-=-=-="。

注意 : 此函式是PHP4.0中新增的函式


字串函式庫 -- str_replace

字串函式庫

str_replace

(PHP3 >= 3.0.6 , PHP4)

str_replace --- 取代所有在字串中出現的字串

語法 : string str_replace (string needle, string str, string haystack)

說明 :

此函式將所有在參數 haystack中出現的 needle以參數 str取代。如果你不需要這個取代的規則，你可以使用ereg_replace( )來代替此函式。

Example :

<?php

$bodytag = str_replace ("%body%", "black", "<body text=%body%>");

?>

注意 : 此函式是PHP 3.0.6中新增的函式

參考 : ereg_replace( ) strtr( )


字串函式庫 -- strcasecmp

字串函式庫

strcasecmp

(PHP3 >= 3.0.2 , PHP4)

strcasecmp --- 不分大小寫字串比對

語法 : int strcasecmp (string str1, string str2)

說明 :

如果 str1小於 str2則傳回小於零的值；如果 str1大於 str2則傳回大於零的值；若二字串相等則傳回零。

Example :

<?php

$var1 = "Hello";

$var2 = "hello";

if (!strcasecmp ($var1, $var2)) {

echo '$var1 is equal to $var2 in a case-insensitive string comparison';

}

?>

參考
  : ereg( )  strcmp(
  )  substr( )  stristr(
  )  strstr( )


字串函式庫 -- strchr

字串函式庫

strchr

(PHP3 , PHP4)

strchr --- 找出第一次出現的字元

語法 : string strchr (string haystack, string needle)

說明 :

此函式是strstr( )的別名，而且用法也都相同。


字串函式庫 -- strcmp

字串函式庫

strcmp

(PHP3 , PHP4)

strcmp --- 字串比對

語法 : int strcmp (string str1, string str2)

說明 :

如果 str1小於 str2則傳回小於零的值；如果 str1大於 str2則傳回大於零的值；若二字串相等則傳回零。

注意 : 這個比對是會區分大小寫

參考 : ereg( ) strcasecmp( ) substr( ) stristr( ) strncmp( ) strstr( )


字串函式庫 -- strcspn

字串函式庫

strcspn

(PHP3 >= 3.0.3 , PHP4)

strcspn --- 找出沒有比對到的最初部份的長度

語法 : int strcspn (string str1, string str2)

說明 :

傳回 str1最初的部份的長度，這個部份是不包含任何 str2中的字元。

參考 : strspn( )


字串函式庫 -- strip_tags

字串函式庫

strip_tags

(PHP3 >= 3.0.8 , PHP4 >= 4.0b2)

strip_tags --- 去除字串中的HTML和PHP標籤

語法 : string strip_tags (string str [, string allowable_tags])

說明 :

此函式試著從給予的字串中去除所有HTML和PHP標籤，如果是不完整或是假的標籤時則會有錯誤，它和fgetss( )使用相同的方法去除標籤。

你可以使用第三個參數來指定不去除那些標籤。

注意 : allowable_tags增加在PHP 3.0.13，PHP 4B3中


字串函式庫 -- stripcslashes

字串函式庫

stripcslashes

(PHP4 >= 4.0b4)

stripcslashes --- 去除addcslashes( )引用的斜線

語法 : string stripcslashes (string str)

說明 :

傳回去除反斜線後的字串，認出C-like \n , \r ...,八進制和十六進制表示。

注意 : 新增在PHP4b3-dev

參考 : addcslashes( )


字串函式庫 -- stripslashes

字串函式庫

stripslashes

(PHP3 , PHP4)

stripslashes --- 去除addslashes( )引用的斜線

語法 : string stripslashes (string str)

說明 :

傳回去除反斜線後的字串，連續的二個反斜線會成為一個反斜線。

參考 : addslashes( )


字串函式庫 -- stristr

字串函式庫

stristr

(PHP3 >= 3.0.6 , PHP4)

stristr --- 不分大小寫找出字串第一次出現的地方

語法 : string stristr (string haystack, string needle)

說明 :

傳回 needle第一次出現在 haystack的地方，到 haystack結尾的字串，needle和 haystack都是以不區分大小寫的方式。

如果沒有找到 needle則傳回false。

如果 needle不是字串，則會將它轉換成整數，並且按照字元的順序值來使用。

參考 : strchr( ) strrchr( ) substr( ) ereg( )


字串函式庫 -- strlen

字串函式庫

strlen

(PHP3 , PHP4)

strlen --- 取得字串長度

語法 : int strlen (string str)

說明 :

傳回字串 str的長度。


字串函式庫 -- strnatcasecmp.html

字串函式庫

strnatcasecmp

(PHP4 >= 4.0RC2)

strnatcasecmp --- 不分大小寫的使用自然順序演算法來比對字串

語法 : int strnatcasecmp (string str1, string str2)

說明 :

此函式執行一個比對演算法，它會按照字母與數字排列。此函式的功能和strnatcmp( )相似，不同處在於此函式的比對是不區分大小寫。更多的資訊請參考 : Martin Pool's Natural Order String Comparison page。

類似於其它的字串比對函式，如果 str1小於 str2則傳回小於零的值；如果 str1大於 str2則傳回大於零的值；若二字串相等則傳回零。

參考
  : ereg( )  strcasecmp(
  )  substr( )  stristr(
  )  strcmp( )  strncmp(
  )  strnatcmp( )  strstr(
  )


字串函式庫 -- strnatcmp

字串函式庫

strnatcmp

(PHP4 >= 4.0RC2)

strnatcmp --- 使用自然順序演算法來比對字串

語法 : int strnatcmp (string str1, string str2)

說明 :

此函式執行一個比對演算法，它會按照字母與數字排列，這描述成一個"natural ordering"。下列的範例說明這個演算法和一般的字串排列演算法(使用strcmp( ))有何不同 :

Example :

<?php

$arr1 = $arr2 = array ("img12.png","img10.png","img2.png","img1.png");

echo "Standard string comparison\n";

usort($arr1,"strcmp"); print_r($arr1);

echo "\nNatural order string comparison\n";

usort($arr2,"strnatcmp");

print_r($arr2);

?>

上面的範例將會產生出下面的結果 :

Standard string comparison

Array

(

[0] => img1.png

[1] => img10.png

[2] => img12.png

[3] => img2.png

)

Natural order string comparison

Array

(

[0] => img1.png

[1] => img2.png

[2] => img10.png

[3] => img12.png

)

更多的資訊請參考 : Martin Pool's Natural Order String Comparison page。

類似於其它的字串比對函式，如果 str1小於 str2則傳回小於零的值；如果 str1大於 str2則傳回大於零的值；若二字串相等則傳回零。

注意 : 此函式的比對是會區分大小寫

參考
  : ereg( )  strcasecmp(
  )  substr( )  stristr(
  )  strcmp( )  strncmp(
  )  strnatcasecmp( )  strstr(
  )


字串函式庫 -- strncmp

字串函式庫

strncmp

(PHP4 >= 4.0b4)

strncmp --- 指定字元數目的字串比對

語法 : int strncmp (string str1, string str2, int len)

說明 :

此函式和strcmp( )相似，不同的是，你可以指定要用來比對的字串的字元數目。如果任何一個字串比 len還短時，則會使用那個字串的長度來比對。

如果 str1小於 str2則傳回小於零的值；如果 str1大於 str2則傳回大於零的值；若二字串相等則傳回零。

注意 : 此函式的比對是會區分大小寫

參考
  : ereg( )  strcasecmp(
  )  substr( )  stristr(
  )  strcmp( )  strstr(
  )


字串函式庫 -- strpos

字串函式庫

strpos

(PHP3 , PHP4)

strpos --- 找出字串第一次出現的位置

語法 : int strpos (string haystack, string needle [, int offset])

說明 :

傳回參數 needle在字串 haystack中第一次出現的位置，以數字表示。不像strrpos( )，此函式可以取參數 needle全部的字串，而且會使用全部的字串。

如果找不到參數 needle，則傳回 false。

注意 : 會容易的被傳回值"character found at position 0" 和 "character not found"給弄錯，下列是如何去察覺其中的差異 :

// in PHP 4.0b3 and newer:

$pos = strpos ($mystring, "b");

if ($pos === false) { // note: three equal signs

// not found...

}

// in versions older than 4.0b3:

$pos = strpos ($mystring, "b");

if (is_string ($pos) && !$pos) {

// not found...

}

如果參數 needle不是字串時，它會轉換成整數並且按照字元的順序值來使用。

參數 offset允許你去指定在 haystack中從那一個字元開始搜尋，傳回的位置依然是相對於 haystack的起點。

參考
  : strrpos( )  strrchr(
  )  substr( )  stristr(
  )  strstr( )


字串函式庫 -- strrchr

字串函式庫

strrchr

(PHP3 , PHP4)

strrchr --- 取得字元最後一次出現處到結尾的字串

語法 : string strrchr (string haystack, string needle)

說明 :

此函式傳回 haystack的一部份字串，從參數 needle最後一次出現的地方到 haystack的結尾。

如果沒有找到 needle則傳回 false。

如果 needle包含超過一個以上的字元時，則使用第一個字元。

如果參數 needle不是字串時，它會轉換成整數並且按照字元的順序值來使用。

Example :

<?php

// get last directory in $PATH

$dir = substr (strrchr ($PATH, ":"), 1);

// get everything after last newline

$text = "Line 1\nLine 2\nLine 3";

$last = substr (strrchr ($text, 10), 1 );

?>

參考 : substr( ) stristr( ) strstr( )


字串函式庫 -- strrev

字串函式庫

strrev

(PHP3 , PHP4)

strrev --- 顛倒字串

語法 : string strrev (string string)

說明 :

傳回顛倒的字串 string。


字串函式庫 -- strrpos

字串函式庫

strrpos

(PHP3 , PHP4)

strrpos --- 找出字元最後一次出現的位置

語法 : int strrpos (string haystack, char needle)

說明 :

傳回參數 needle在字串 haystack中最後一次出現的位置，以數字表示。注意 : 此函式的參數 needle只可以是個單一字元 ，如果是傳遞字串給 needle的話，則將只會使用此字串的第一個字元。

如果找不到 needle則傳回 false。

如果參數 needle不是字串時，它會轉換成整數並且按照字元的順序值來使用。

參考
  : strpos( )  strrchr( )
  substr( )  stristr( )
  strstr( )


字串函式庫 -- strspn

字串函式庫

strspn

(PHP3 >= 3.0.3 , PHP4)

strspn --- 找出比對到的最初部份的長度

語法 : int strspn (string str1, string str2)

說明 :

傳回 str1最初的部份的長度，這個部份是完全地由 str2中的字元所構成的。

Example :

<?php

strspn ("42 is the answer, what is the question ...", "1234567890");

?>

傳回的結果將會是 2

參考 : strcspn( )


字串函式庫 -- strstr

字串函式庫

strstr

(PHP3 , PHP4)

strstr --- 找出字串第一次出現的地方

語法 : string strstr (string haystack, string needle)

說明 :

傳回參數 needle在 haystack中，第一次出現處到 haystack結尾的字串。

如果沒有找到 needle則傳回 false。

如果參數 needle不是字串時，它會轉換成整數並且按照字元的順序值來使用。

注意 : 此函式是會區分大小寫的，要不區分大小寫的搜尋可以使用stristr( )

Example :

<?php

$email = 'sterling@designmultimedia.com';

$domain = strstr ($email, '@');

print $domain; // prints @designmultimedia.com

?>

參考 : stristr( ) strrchr( ) substr( ) ereg( )


字串函式庫 -- strtok

字串函式庫

strtok

(PHP3 , PHP4)

strtok --- 切開字串

語法 : string strtok (string arg1, string arg2)

說明 :

strtok( )是用來切開字串，那就是如果你有一個字串像是"This is an example string" ，你可以使用空白字元當作是標記，將字串切開來，成為個別的單字。

Example :

<?php

$string = "This is an example string";

$tok = strtok ($string," ");

while ($tok) {

echo "Word=$tok<br>";

$tok = strtok (" ");

}

?>

注意 : 只有在第一次呼叫strtok( )時，才使用字串參數，之後的呼叫只需要使用到標記，就像是它會記錄目前的字串。要切開另一個新的字串時，你只需要再一次呼叫 strtok( )和字串參數即可。你可以在標記參數中放置多樣的標記，當找到任何參數中的字元時，字串將會被切開。

你的標記也許會等於 "0"，這相當於是條件表達示裡的 false。

參考 : split( ) explode( )


字串函式庫 -- strtolower

字串函式庫

strtolower

(PHP3 , PHP4)

strtolower --- 將字串轉成小寫

語法 : string strtolower (string str)

說明 :

傳回 str所有字母字元轉換成小寫後的字串。

注意 : 字母字元是由目前場所來決定的，意思是說，例如在預設的 "C"場所時，像是曲音A就不會被轉換。

Example :

<?php

$str = "Mary Had A Little Lamb and She LOVED It So";

$str = strtolower($str);

print $str; # Prints mary had a little lamb and she loved it so

?>

參考 : strtoupper( ) ucfirst( )


字串函式庫 -- strtoupper

字串函式庫

strtoupper

(PHP3 , PHP4)

strtoupper --- 將字串轉成大寫

語法 : string strtoupper (string string)

說明 :

傳回 str所有字母字元轉換成大寫後的字串。

注意 : 字母字元是由目前場所來決定的，意思是說，例如在預設的 "C"場所時，像是曲音A就不會被轉換。

Example :

<?php

$str = "Mary Had A Little Lamb and She LOVED It So";

$str = strtoupper ($str);

print $str; # Prints MARY HAD A LITTLE LAMB AND SHE LOVED IT SO

?>

參考 : strtolower( ) ucfirst( )


字串函式庫 -- strtr.html

字串函式庫

strtr

(PHP3 , PHP4)

strtr --- 轉換某些字元

語法 : string strtr (string str, string from, string to)

說明 :

此函式運作在參數 str上，將參數 from中所有出現的各個字元轉換成參數 to相對應的字元，並且傳回結果。

如果參數 from和 to的長度不同時，這二個參數多餘的字元將會被忽略。

Example :

<?php

$addr = strtr($addr, "麧?, "aao");

?>

呼叫 strtr( )可以只有二個參數，如果只有二個參數，那麼它的運作將會有新的方式 : 參數 from必定是個包含字串 => 字串對的陣列，這將會在原來的字串中取代。strtr( )將會尋找首先可能的比對，並且不會試著去取代先前已經處理過的字串。

Example :

<?php

$trans = array ("hello" => "hi", "hi" => "hello");

echo strtr("hi all, I said hello", $trans) . "\n";

?>

這將會顯示出 : "hello all, I said hi"。

注意 : 二個參數的特性是新增在PHP 4.0

參考 : ereg_replace( )


字串函式庫 -- substr

字串函式庫

substr

(PHP3 , PHP4)

substr --- 取得部份字串

語法 : string substr (string string, int start [, int length])

說明 :

substr( )傳回 string的一部份字串，由參數 start和 length指定。

如果 start是正數，傳回的字串將會從 string的第 start個字元開始。

Example :

<?php

$rest = substr ("abcdef", 1); // returns "bcdef"

$rest = substr ("abcdef", 1, 3); // returns "bcd"

?>

如果 start是負數，傳回的字串將會從 string結尾的第 start個字開始。

Example :

<?php

$rest = substr ("abcdef", -1); // returns "f"

$rest = substr ("abcdef", -2); // returns "ef"

$rest = substr ("abcdef", -3, 1); // returns "d"

?>

如果有給予參數 length而且是正數時，傳回的字串將會從 start傳回 length個字元。

如果有給予參數 length而且是負數時，傳回的字串將會結束於 string結尾的第 length個字元。

Example :

<?php

$rest = substr ("abcdef", 1, -1); // returns "bcde"

?>

參考 : strrchr( ) ereg( )


字串函式庫 -- substr_count

字串函式庫

substr_count

(PHP4 >= 4.0RC2)

substr_count --- 計算字串的出現次數

語法 : int substr_count (string haystrack, string needle)

說明 :

substr_count( )傳回參數 needle在 haystrack中出現的次數。

Example :

<?php

print substr_count("This is a test", "is"); // prints out 2

?>


字串函式庫 -- substr_replace

字串函式庫

substr_replace

(PHP4 >= 4.0b4)

substr_replace --- 取代字串的一部份字串

語法 : string substr_replace (string string, string replacement, int start [, int length])

說明 :

substr_replace( )取代 string的部份字串，由參數 start和 length來指定界限，以參數 replacement來取代。

如果參數 start是正數，取代的字串將會開始於 string的第 start個字元。

如果參數 start是正數，取代的字串將會開始於 string結尾的第 start個字元。

如果有給予參數 length而且是正數時，它表示 string要被取代的部份字串的長度。如果 length是負數時，它表示從 string結尾算起，要中止取代的字元的數目。如果沒有給予這個參數，則它會預設成參數 string的長度。

Example :

<?php

$var = 'ABCDEFGH:/MNRPQR/';

echo "Original: $var<hr>\n";

/* These two examples replace all of $var with 'bob'. */

echo substr_replace ($var, 'bob', 0) . "<br>\n";

echo substr_replace ($var, 'bob', 0, strlen ($var)) . "<br>\n";

/* Insert 'bob' right at the beginning of $var. */

echo substr_replace ($var, 'bob', 0, 0) . "<br>\n";

/* These next two replace 'MNRPQR' in $var with 'bob'. */

echo substr_replace ($var, 'bob', 10, -1) . "<br>\n";

echo substr_replace ($var, 'bob', -7, -1) . "<br>\n";

/* Delete 'MNRPQR' from $var. */

echo substr_replace ($var, '', 10, -1) . "<br>\n";

?>

注意 : 此函式是PHP 4.0中新增的函式

參考 : str_replace( ) substr( )


字串函式庫 -- trim

字串函式庫

trim

(PHP3 , PHP4)

trim --- 去除字串開始處與結束處的空白

語法 : string trim (string str)

說明 :

此函式去除字串開始處與結束處的空白，並且傳回去除空白後的字串。它目前會去除的空白字元有 : "\n"、"\r"、"\t"、"\v"、"\0" 和一般的空白。

參考 : chop( ) ltrim( )


字串函式庫 -- ucfirst

字串函式庫

ucfirst

(PHP3 , PHP4)

ucfirst --- 將字串的第一個字元大寫

語法 : string ucfirst (string str)

說明 :

如果參數 str的第一個字元是字母，則將它轉成大寫的。

注意 : 字母字元是由目前場所來決定的，意思是說，例如在預設的 "C"場所時，像是曲音A就不會被轉換。

Example :

<?php

$text = 'mary had a little lamb and she loved it so.';

$text = ucfirst ($text); // $text is now Mary had a little lamb // and she loved it so.

?>

參考 : strtoupper( ) strtolower( )


字串函式庫 -- ucwords

字串函式庫

ucwords

(PHP3 >= 3.0.3 , PHP4)

ucwords --- 將字串中各個單字的第一個字元大寫

語法 : string ucwords (string str)

說明 :

如果參數 str中的各個單字的第一個字元是字母時，則將它轉成大寫的。

Example :

<?php

$text = "mary had a little lamb and she loved it so.";

$text = ucwords($text); // $text is now: Mary Had A Little // Lamb And She Loved It So.

?>

參考 : strtoupper( ) strtolower( ) ucfirst( )


字串函式庫 -- wordwrap.html

字串函式庫

wordwrap

(PHP4 CVS only)

wordwrap --- 使用字串斷行字元將字串包裹成指定的字元數目

語法 : string wordwrap (string str [, int width [, string break]])

說明 :

每隔 width個字元就將 str包裹起來，使用參數 break將它斷行。

如果沒有給予參數 width和 break，wordwrap( )會自動地每隔75個字元就將 str包裹起來，並且使用斷行 '\n'。

Example :

<?php

$text = "The quick brown fox jumped over the lazy dog.";

$newtext = wordwrap( $text, 20 );

echo "$newtext\n";

?>

此範例將會顯示 :

The quick brown fox

jumped over the lazy

dog.

參考 : nl2br( )


URL函式庫 -- base64_decode

URL函式庫

base64_decode

(PHP3 , PHP4)

base64_decode --- 以MIME base64解碼

語法 : string base64_decode (string encoded_data)

說明 :

base64_decode( )將encoded_data解碼，且傳回原來的資料，傳回的資料可能是二進制資料。

參考 : base64_encode( )


URL函式庫 -- base64_encode

URL函式庫

base64_encode

(PHP3 , PHP4)

base64_encode --- 以MIME base64編碼

語法 : string base64_encode (string data)

說明 :

base64_encode( )傳回以base64編碼的字串，此編碼目的是使二進制資料能在傳輸中存活下來。

編碼後的字串會比原來的多出33%空間。

參考 : base64_decode( ) chunk_split( )


URL函式庫 -- parse_url

URL函式庫

parse_url

(PHP3 , PHP4)

parse_url --- 剖析URL且傳回它的成分

語法 : array parse_url (string url)

說明 :

此函式傳回一組合的陣列，傳回 URL各種的成份，包括"scheme"，"host"，"port"， "user"，"pass"，"path"，"query"及"fragment"。


URL函式庫 -- rawurldecode

URL函式庫

rawurldecode

(PHP3 , PHP4)

rawurldecode --- 譯解URL編碼字串

語法 : string rawurldecode (string str)

說明 :

將一連串百份比符號(%)後面跟隨二個迷惑的數字的字串，照其字面上的意義將它譯解，並傳回譯解後的字串。

例如 : 字串

foo%20bar%40baz

譯解成

foo bar@baz

參考 : rawurlencode( ) urldecode( ) urlencode( )


URL函式庫 -- rawurlencode

URL函式庫

rawurlencode

(PHP3 , PHP4)

rawurldecode --- 依照RFC1738將URL編碼

語法 : string rawurlencode (string str)

說明 :

將所有非字母字元的字串除了-_.之外，以百分比符號（%）後跟隨二個迷惑的數字的方式表示，這是以RFC1738中敘述的，照字面上的意義將其編碼保護(像是email系統)，例如 : 如果你想在ftp url中包含密碼

Example :

<?php

echo '<A HREF="ftp://user:', rawurlencode ('foo @+%/'),
'@ftp.my.com/x.txt">';

?>

或是你想在URL的成份中傳遞資訊

<?php

echo '<A HREF="http://x.com/department_list_script/',
rawurlencode ('sales and marketing/Miami'), '">';

?>

參考 : rawurldecode( ) urldecode( ) urlencode( )


URL函式庫 -- urldecode

URL函式庫

urldecode

(PHP3 , PHP4)

urldecode --- 譯解URL編碼字串

語法 : string urldecode (string str)

說明 :

譯解給予的字串中任何的%##編碼，傳回譯解後的字串。

Example :

<?php

$a = split ('&', $querystring);

$i = 0;

while ($i < count ($a)) {

$b = split ('=', $a [$i]);

echo 'Value for parameter ', htmlspecialchars (urldecode ($b [0])),
' is ', htmlspecialchars (urldecode ($b [1])), "<BR>";
$i++;
}

?>

參考 : urlencode( ) rawurlencode( ) rawurldecode( )


URL函式庫 -- urlencode

URL函式庫

urlencode

(PHP3 , PHP4)

urlencode --- URL編碼字串

語法 : string urlencode (string str)

說明 :

將所有非字母字元的字串除了-_.之外，以百分比符號(%)後跟隨二個迷惑的數字的方式表示，而空白則會被編碼成正的(+)符號。此編碼方式與WWW表單post資料的編碼方式相同，這和RFC1738編碼方式不同，空白鍵會被編碼成正的(+)符號，此函式適合用在查詢的URL的一部份，適合將變數傳遞到下一個網頁。

Example :

<?php

echo '<A HREF="mycgi?foo=', urlencode ($userinput), '">';

?>

參考 : urldecode( ) rawurlencode( ) rawurldecode( )


變數函式庫 -- call_user_func

變數函式庫

call_user_func

(PHP3 >= 3.0.3 , PHP4)

call_user_func --- 依照參數呼叫使用者函式

語法 : mixed call_user_func (string function_name [, mixed parameter [, mixed ...]])

說明 :

依照給予的第一個參數function_name來呼叫使用者定義的函式

Example :

<?php

function barber ($type) {

print "You wanted a $type haircut, no problem";

}

call_user_func ('barber', "mushroom");

call_user_func ('barber', "shave");

?>


變數函式庫 -- doubleval

變數函式庫

doubleval

(PHP3 , PHP4)

doubleval --- 取得變數的倍浮點值

語法 : double doubleval(mixed var);

說明 :

傳回參數var的倍浮點值，var可以是任何的型態，但在陣列或物件上不能使用此函式。

Example :

<?php

$var = '122.34343The';

$double_value_of_var = doubleval($var);

print $double_value_of_var; // prints 122.34343

?>

參考 : intval( ) strval( ) settype( )


變數函式庫 -- empty

變數函式庫

empty

(unknown)

empty --- 測定變數是否設定

語法 : int empty(mixed var);

說明 :

若變數存在而且有設定變數值則傳回false，否則傳回true。

Example :

<?php

$var = 0;

if (empty($var)) { #evaluates true

print '$var is either 0 or not at all set';

}

if (!isset($var)) { // evaluates false

print 'The $var is not set at all';

}

?>

注意 : 當用在任何不是變數上時，是無意義的。例如 : empty (addslashes($name))是無意義的。

參考 : isset( ) unset( )


變數函式庫 -- gettype

變數函式庫

gettype

(PHP3 , PHP4)

gettype --- 取得變數的型態

語法 : string gettype(mixed var);

說明 :

傳回PHP變數var的型態，傳回的字串為以下可能的值：

  • "integer"

  • "double"

  • "string"

  • "array"

  • "object"

  • "unknown type"

參考 : settype( )


變數函式庫 -- intval

變數函式庫

intval

(PHP3 , PHP4)

intval --- 取得變數的整數值

語法 : int intval(mixed var, int [base] );

說明 :

傳回參數var的整數值，使用指定的base做為轉換的基底（預設值為10），var可以是任何的型態，但在陣列或物件上不能使用此函式。

參考 : doubleval( ) strval( ) settype( )


變數函式庫 -- is_array

變數函式庫

is_array

(PHP3 , PHP4)

is_array --- 判斷變數是否為陣列

語法 : int is_array(mixed var);

說明 :

若參數var是陣列則傳回true，否則傳回false。

參考
  : is_double( )  is_float(
  )  is_int( )  is_integer(
  )  is_real( )  is_string(
  )  is_long( )

is_object( )


變數函式庫 -- is_bool

變數函式庫

is_bool

(PHP4 >= 4.0b4)

is_bool --- 判斷變數是否為布林

語法 : int is_bool (mixed var)

說明 :

若參數var是布林(boolean)則傳回true。

參考 : is_array( ) is_double( ) is_float( ) is_int( ) is_integer( ) is_real( ) is_string( )


變數函式庫 -- is_double

變數函式庫

is_double

(PHP3 , PHP4)

is_double --- 判斷變數是否為倍浮點數

語法 : int is_double(mixed var);

說明 :

若參數var是倍浮點數則傳回true，否則傳回false。

參考
  : is_array( )  is_bool(
  )  is_float(
  )  is_int( )  is_integer(
  )  is_real( )  is_string(
  )  is_long( )

is_object( )


變數函式庫 -- is_float

變數函式庫

is_float

(PHP3 , PHP4)

is_float --- 判斷變數是否為浮點數

語法 : int is_float(mixed var);

說明 :

此函式為is_double( )的別名。

參考 : is_double( ) is_bool( ) is_real( ) is_int( ) is_integer( ) is_string( ) is_object( )


變數函式庫 -- is_int

變數函式庫

is_int

(PHP3 , PHP4)

is_int --- 判斷變數是否為整數

語法 : int is_int(mixed var);

說明 :

此函式為is_long( )的別名。

參考
  : is_bool( )  is_double( )  is_float(
  )  is_integer( )  is_string(
  )  is_real( )  is_object(
  )


變數函式庫 -- is_integer

變數函式庫

is_integer

(PHP3 , PHP4)

is_integer --- 判斷變數是否為整數

語法 : int is_integer(mixed var);

說明 :

此函式為is_long( )的別名。

參考
  : is_bool( )  is_double( )  is_float(
  )  is_int( )  is_string(
  )  is_real( )  is_object(
  )  is_array( )

is_long( )


變數函式庫 -- is_long

變數函式庫

is_long

(PHP3 , PHP4)

is_long --- 判斷變數是否為整數

語法 : int is_long(mixed var);

說明 :

若參數var為整數（長）則傳回true，否則傳回false。

參考
  : is_bool( )  is_double( )  is_float(
  )  is_int( )  is_real(
  )  is_string( )  is_object(
  )  is_array( )

is_integer( )


變數函式庫 -- is_numeric

變數函式庫

is_numeric

(PHP4 >= 4.0RC1)

is_numeric --- 判斷變數是否為數字或數字的字串

語法 : int is_numeric (mixed var)

說明 :

若參數var為數字或數字的字串則傳回true，否則傳回false。

參考
  : is_bool( )  is_double( )  is_float(
  )  is_int( )  is_real(
  )  is_string( )  is_object(
  )  is_array( )

is_integer( )


變數函式庫 -- is_object

變數函式庫

is_object

(PHP3 , PHP4)

is_object --- 判斷變數是否為物件

語法 : int is_object(mixed var);

說明 :

若參數var為物件則傳回true，否則傳回false。

參考 : is_bool( ) is_long( ) is_int( ) is_integer( ) is_float( ) is_double( ) is_real( ) is_string( )

is_array( )


變數函式庫 -- is_real

變數函式庫

is_real

(PHP3 , PHP4)

is_real --- 判斷變數是否為實數

語法 : int is_real(mixed var);

說明 :

此函式為is_double( )的別名。

參考 : is_bool( ) is_long( ) is_int( ) is_integer( ) is_float( ) is_double( ) is_object( ) is_string( )

is_array( )


變數函式庫 -- is_resource

變數函式庫

is_resource

(PHP4 >= 4.0b4)

is_resource --- 判斷變數是否為資源

語法 : int is_resource (mixed var)

說明 :

如果給予的參數var是個資源(resource)則is_resource( )傳回true，否則傳回false。

資源(resource)是個像檔案或是資料庫結果操作(result handle)的東西，它們以內部的PHP函式來分配與釋放，當它們不再被使用但確沒有被釋放時，也許需要去清除一下了。


變數函式庫 -- is_string

變數函式庫

is_string

(PHP3 , PHP4)

is_string --- 判斷變數是否為字串

語法 : int is_string(mixed var);

說明 :

若參數var為字串則傳回true，否則傳回false。

參考 : is_bool( ) is_long( ) is_int( ) is_integer( ) is_float( ) is_double( ) is_real( ) is_object( )

is_array( )


變數函式庫 -- isset

變數函式庫

isset

(unknown)

isset --- 測定變數是否設定

語法 : int isset(mixed var);

說明 :

若參數var存在則傳回true，否則傳回false。

Example :

<?php

$a = "test";

echo isset($a); // true

unset($a);

echo isset($a); // false

?>

參考 : empty( ) unset( )


變數函式庫 -- print_r

變數函式庫

print_r

(PHP4)

print_r --- 列出變數資訊

語法 : void print_r(mixed expression);

說明 :

此函式列出人們可讀(human-readable)的變數資訊，如果給予的值是字串、整數或是浮點數時，則列出它本身的值。如果給予的陣列，則值會在索引值及元素的格式中顯示出來。

Example :

<?php

$a = array (1, 2, array ("a", "b", "c"));

print_r ($a);

?>

警告 : 如果給予的陣列或是物件包含了它本身直接或間接的關係，或是它包含了陣列或物件在深層上時，此函式會不斷的延續下去。


變數函式庫 -- settype

變數函式庫

settype

(PHP3 , PHP4)

settype --- 設定變數的型態

語法 : int settype(string var, string type);

說明 :

設定變數var的型態為type，參數type有以下可能的值：

  • "integer"

  • "double"

  • "string"

  • "array"

  • "object"

成功則傳回true，否則傳回false。

參考 : gettype( )


變數函式庫 -- strval

變數函式庫

strval

(PHP3 , PHP4)

strval --- 取得變數的字串值

語法 : string strval(mixed var);

說明 :

傳回參數var的字串值，var可以是任何的型態，但在陣列或物件上不能使用此函式。

參考 : doubleval( ) intval( ) settype( )


變數函式庫 -- unset

變數函式庫

unset

(unknown)

unset --- 刪除變數

語法 : int unset(mixed var);

說明 :

unset( )刪除指定的變數，且傳回true。

Example :

<?php

unset ($foo);

unset ($bar['quux']);

?>

參考 : isset( ) empty( )


變數函式庫 -- var_dump

變數函式庫

var_dump

(PHP3 >= 3.0.5 , PHP4)

var_dump --- 列出變數資訊

語法 : void var_dump(mixed expression);

說明 :

此函式傳回關於表達的結構資訊，它包含了它的型態與值。陣列以縮排的方式顯示結構。

Example :

<?php

<pre>

<?php

$a = array (1, 2, array ("a", "b", "c"));

var_dump ($a);

?>

</pre>

?>


Vmailmgr函式庫 -- vm_addalias

Vmailmgr函式庫

vm_addalias

(PHP3 , PHP4 <= 4.0.0)

vm_addalias --- 增加虛擬使用者的別名

語法 : int vm_addalias (string vdomain, string basepwd, string username, string alias)

說明 :

增加虛擬使用者的別名，username是email登錄的名稱，alias是這位使用者的別名。


Vmailmgr函式庫 -- vm_adduser

Vmailmgr函式庫

vm_adduser

(PHP3 , PHP4 <= 4.0.0)

vm_adduser --- 增加虛擬使用者和密碼

語法 : int vm_adduser (string vdomain, string basepwd, string newusername, string newuserpassword)

說明 :

增加一個新的虛擬(virtual)使用者和密碼，newusername是email登錄的名稱與使用者密碼newuserpassword。


Vmailmgr函式庫 -- vm_delalias

Vmailmgr函式庫

vm_delalias

(PHP3 , PHP4 <= 4.0.0)

vm_delalias --- 移除別名

語法 : int vm_delalias (string vdomain, string basepwd, string alias)

說明 :

移除別名。


Vmailmgr函式庫 -- vm_deluser

Vmailmgr函式庫

vm_deluser

(PHP3 , PHP4 <= 4.0.0)

vm_deluser --- 移除虛擬使用者

語法 : int vm_deluser (string vdomain, string username)

說明 :

移除虛擬使用者。


Vmailmgr函式庫 -- vm_passwd

Vmailmgr函式庫

vm_passwd

(PHP3 , PHP4 <= 4.0.0)

vm_passwd --- 變更虛擬使用者的密碼

語法 : int vm_passwd (string vdomain, string username, string password, string newpassword)

說明 :

變更虛擬使用者的密碼，username是email登錄的名稱，password是這位使用者舊的密碼，newpassword是新的密碼。


WDDX函式庫 -- wddx_add_vars

WDDX函式庫

wddx_add_vars

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_add_vars --- 將變數連載到指定的封包

語法 : wddx_add_vars (int packet_id, mixed name_var [, mixed ...])

說明 :

wddx_add_vars( )是用來將傳遞到函式的參數連載起來，並且增加結果到參數packet_id所指定的封包，被連載的變數與wddx_serialize_vars( )是相同的方式。


WDDX函式庫 -- wddx_deserialize

WDDX函式庫

wddx_deserialize

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_deserialize --- 分解WDDX封包

語法 : mixed wddx_deserialize (string packet)

說明 :

wddx_deserialize( )取一個packet字串並且將它分解，它傳回的值可能是字串、數字或是陣列，此結構會分解成組合的陣列。


WDDX函式庫 -- wddx_packet_end

WDDX函式庫

wddx_packet_end

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_packet_end --- 結束所指定ID的WDDX封包

語法 : string wddx_packet_end (int packet_id)

說明 :

wddx_packet_end( )結束packet_id指定的封包，並且傳回封包內的字串。


WDDX函式庫 -- wddx_packet_start

WDDX函式庫

wddx_packet_start

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_packet_start --- 建立一個新的WDDX封包和它內部的結構

語法 : int wddx_packet_start ([string comment])

說明 :

使用wddx_packet_start( )起始一個新的WDDX封包，來增加額外的變數，它取一個非必需的參數comment，並且傳回一個封包ID給後來的函式使用。它自動地建立一個定義在內部結構的封包來包含變數。


WDDX函式庫 -- wddx_serialize_value

WDDX函式庫

wddx_serialize_value

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_serialize_value --- 連載一個值成為WDDX封包

語法 : string wddx_serialize_value (mixed var [, string comment])

說明 :

wddx_serialize_value( )是用來從一個給予的值來建立一個WDDX封包，它取參數var中的值，和出現在封包標頭的字串comment，並且傳回WDDX封包。


WDDX函式庫 -- wddx_serialize_vars

WDDX函式庫

wddx_serialize_vars

(PHP3 >= 3.0.7 , PHP4 >= 4.0b2)

wddx_serialize_vars --- 連載變數成為一個WDDX封包

語法 : string wddx_serialize_vars (mixed var_name [, mixed ...])

說明 :

wddx_serialize_vars( )是用來將傳遞給函式的參數連載成一個WDDX封包。

wddx_serialize_vars( )取變數參數的數目，參數可以是一個變數字串名稱，或是一個陣列包含變數字串名稱，或是又再另一個陣列等等。

Example :

<?php

$a = 1;

$b = 5.5;

$c = array("blue", "orange", "violet");

$d = "colors";

$clvars = array("c", "d");

print wddx_serialize_vars("a", "b", $clvars);

?>

上面的範例將會產生出 :

<wddxPacket version='1.0'><header/><data><struct><var
    name='a'><number>1</number></var> <var
    name='b'><number>5.5</number></var><var
    name='c'><array length='3'>
    <string>blue</string><string>orange</string><string>violet</string></array></var>
    <var name='d'><string>colors</string></var></struct></data></wddxPacket>


壓縮函式庫 -- gzclose

壓縮函式庫

gzclose

(PHP3 , PHP4)

gzclose --- 關閉壓縮檔案指標

語法 : int gzclose (int zp)

說明 :

關閉壓縮檔案指標zp。

成功則傳回true，失敗則傳回false。

壓縮檔案指標必須是有效的，並且是以gzopen( )成功開啟時的指標。


壓縮函式庫 -- gzcompress

壓縮函式庫

gzcompress

(PHP4 >= 4.0.1)

gzcompress --- 壓縮一字串

語法 : string gzcompress (string data [, int level])

說明 :

此函式傳回一個輸入值data的gzip壓縮版本，失敗則傳回false。非必需參數level可以給予0到9，0表示無壓縮，9表示最大的壓縮。

參考 : gzuncompress( )


壓縮函式庫 -- gzeof

壓縮函式庫

gzeof

(PHP3 , PHP4)

gzeof --- 測試壓縮檔案指標是否在檔案結尾

語法 : int gzeof (int zp)

說明 :

如果壓縮檔案指標在檔案結尾或是發生錯誤則傳回true，否則傳回false。

壓縮檔案指標必須是有效的，並且是以gzopen( )成功開啟時的指標。


壓縮函式庫 -- gzfile

壓縮函式庫

gzfile

(PHP3 , PHP4)

gzfile --- 讀取全部的壓縮檔案到陣列中

語法 : array gzfile (string filename [, int use_include_path])

說明 :

與 readgzfile( ) 相同，不同處在於gzfile( )將檔案放到陣列中，再將陣列傳回。

若您想在include_path中搜尋檔案，你可以使用第二個參數，並且將它設為1。

參考 : readgzfile( ) gzopen( )


壓縮函式庫 -- gzgetc

壓縮函式庫

gzgetc

(PHP3 , PHP4)

gzgetc --- 從壓縮檔案指標取得字元

語法 : string gzgetc (int zp)

說明 :

傳回檔案指標zp所指到的一個單一字元(解壓縮後)，在檔案結尾時則傳回false。

壓縮檔案指標必須是有效的，並且是以 gzopen( ) 成功開啟時的指標。

參考 : gzopen( ) gzgets( )


壓縮函式庫 -- gzgets

壓縮函式庫

gzgets

(PHP3 , PHP4)

gzgets --- 從檔案指標取得字串

語法 : string gzgets (int zp, int length)

說明 :

從檔案指標zp傳回length-1位元組的字串(解壓縮後)，當length-1位元組已讀取、在新行上或是到達檔案結尾時，讀取將會結束。

如果發生錯誤則傳回false。

壓縮檔案指標必須是有效的，並且是以 gzopen( ) 成功開啟時的指標。

參考 : gzopen( ) gzgetc( ) fgets( )


壓縮函式庫 -- gzgetss

壓縮函式庫

gzgetss

(PHP3 , PHP4)

gzgetss --- 從檔案指標取得字串並去除HTML標籤

語法 : string gzgetss (int zp, int length [, string allowable_tags])

說明 :

與gzgets( )相同，不同處在於gzgetss( )會從它讀取的文字中試著去除任何HTML和PHP標籤

你可以使用第三個參數來指定那個標籤不被去除。

注意 : allowable_tags在PHP 3.0.13、PHP 4B3中新增。

參考 : gzgets( ) gzopen( ) strip_tags( )


壓縮函式庫 -- gzopen

壓縮函式庫

gzopen

(PHP3 , PHP4)

gzopen --- 開啟壓縮檔

語法 : int gzopen (string filename, string mode [, int use_include_path])

說明 :

開啟一個gzip(.gz)檔案，用來讀取或寫入，參數mode和fopen( )("rb" 或 "wb")相同，但也可以包括一個壓縮等級("wb9")或是一個策略(strategy) : 'f'用來濾出(filtered)資料，像是"wb6f"。

gzopen( )可以用來讀取不是gzip格式的檔案，如此一來gzopen( )將會從沒有解壓的檔案直接地讀取。

開啟失敗此函式則傳回false。

如果你想在include_path中搜尋檔案，你可以使用第三個參數並且將它設為１。

Example :

<?php

$fp = gzopen ("/tmp/file.gz", "r");

?>

參考 : gzclose( )


壓縮函式庫 -- gzpassthru

壓縮函式庫

gzpassthru

(PHP3 , PHP4)

gzpassthru --- 輸出所有剩餘資料

語法 : int gzpassthru (int zp)

說明 :

讀取檔案指標到檔案結尾的資料，並且將結果寫到標準輸出。

如果發生錯誤則傳回false。

壓縮檔案指標必須是有效的，並且是以gzopen( )成功開啟時的指標。

當gzpassthru( )已經它讀取完時，則關閉壓縮檔案指標。


壓縮函式庫 -- gzputs

壓縮函式庫

gzputs

(PHP3 , PHP4)

gzputs --- 將資料寫到壓縮檔案指標

語法 : int gzputs (int zp, string str [, int length])

說明 :

gzputs( )是gzwrite( )的別名，而且用法也相同。


壓縮函式庫 -- gzread

壓縮函式庫

gzread

(PHP3 , PHP4)

gzread --- 讀取指定長度字串

語法 : string gzread (int zp, int length)

說明 :

gzread( )從壓縮檔案指標fp讀取length位元組，當length位元組已讀取或是到達檔案的結尾時，讀取都將會停止。

Example :

<?php

// get contents of a gz-file into a string

$filename = "/usr/local/something.txt.gz";

$zd = gzopen ($filename, "r");

$contents = gzread ($zd, 10000);

gzclose ($zd);

?>

參考
  : gzwrite( )  gzopen( )
  gzgets( )  gzgetss( )
  gzfile( )  gzpassthru(
  )


壓縮函式庫 -- gzrewind

壓縮函式庫

gzrewind

(PHP3 , PHP4)

gzrewind --- 重設壓縮檔案指標的位置

語法 : int gzrewind (int zp)

說明 :

設定檔案指標fp的位置到檔案的開始處。

如果發生錯誤則傳回0。

壓縮檔案指標必須是有效的，並且是以 gzopen( ) 成功開啟時的指標。

參考 : gzseek( ) gztell( )


壓縮函式庫 -- gzseek

壓縮函式庫

gzseek

(PHP3 , PHP4)

gzseek --- 移動壓縮檔案指標

語法 : int gzseek (int zp, int offset)

說明 :

設定壓縮檔案指標zp到offset位元組處，相當於呼叫C語言的gzseek( zp , offset , SEEK_SET)。

成功則傳回0，失敗則傳回-1，注意 : 此移動通過檔案的結尾並不會認為是個錯誤。

參考 : gztell( ) gzrewind( )


壓縮函式庫 -- gztell

壓縮函式庫

gztell

(PHP3 , PHP4)

gztell --- 取得壓縮檔案指標的位置

語法 : int gztell (int zp)

說明 :

傳回壓縮檔案指標zp的位置。

如果發生錯誤則傳回false。

壓縮檔案指標必須是有效的，且是以 gzopen( ) 成功開啟時的指標。

參考 : gzopen( ) gzseek( ) gzrewind( )


壓縮函式庫 -- gzuncompress

壓縮函式庫

gzuncompress

(PHP4 >= 4.0.1)

gzuncompress --- 將壓縮的字串解壓縮

語法 : string gzcompress (string data [, int length])

說明 :

此函式取gzcompress( )所壓縮的資料data，並且傳回原本未壓縮的資料，發生錯誤則傳回false。如果解壓縮的資料大於參數length時，此函式傳回false。

參考 : gzcompress( )


壓縮函式庫 -- gzwrite

壓縮函式庫

gzwrite

(PHP3 , PHP4)

gzwrite --- 將資料寫入壓縮檔案

語法 : int gzwrite (int zp, string string [, int length])

說明 :

gzwrite( )將string的內容寫到指標zp的壓縮檔案資料流，如果有給予參數length，當length位元組已寫入或是到達string的結尾時，將會停止寫入。

注意 : 如果有給予參數length，則magic_quotes_runtime的選項將會被忽略，並且不會從string去除任何斜線

參考 : gzread( ) gzopen( ) gzputs( )


壓縮函式庫 -- readgzfile

壓縮函式庫

readgzfile

(PHP3 , PHP4)

readgzfile --- 輸出壓縮檔

語法 : int readgzfile (string filename [, int use_include_path])

說明 :

讀取一個檔案，將它解壓縮並且寫到標準輸出。

gzopen( )可以用來讀取不是gzip格式的檔案，如此一來gzopen( )將會從沒有解壓的檔案直接地讀取。

傳回從檔案讀取的位元組數目，如果發生錯誤則傳回false並且顯示錯誤訊息，除非是以@readgzfile( )的方式呼叫，這樣就不會顯示錯誤訊息了。

檔案filename將會從檔案系統開啟，並且將它的內容寫到標準輸出。

如果你想在include_path中搜尋檔案，你可以使用第三個參數並且將它設為１。

參考 : gzpassthru( ) gzfile( ) gzopen( )


MySQL中文參考手冊-14 向MySQL增加新函數

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

14 為MySQL增加新函數

有2種方法把新函數加到MySQL中：

  • 你可以通過用戶定義函數(UDF)介面加入函數。用戶定義函數用CREATE FUNCTION和DROP FUNCTION語句動態地增加和刪除。見7.30 CREATE FUNCTION/DROP FUNCTION句法。
  • 你可以加入函數作為一個原生的(內置的)MySQL函數。原生函數被編譯進mysqld伺服器並且在一個永久的基礎上可得到。

每種方法都有優點和缺點：

  • 如果你編寫一個用戶定義函數，你必須安裝伺服器外還得自己安裝對像文件。如果你編譯函數進伺服器中，你不需要那樣做。
  • 你能把UDF加到MySQL二進制代碼發行中。原生函數要求你修改原始碼版本。
  • 如果你升級你的MySQL分發，你能繼續使用你的以前安裝的UDF。對於原生函數，你必須在每次升級時重複你的修改。

無論你使用哪種方法增加新函數，他們可以像原生函數例如ABS()或SOUNDEX()那樣使用。

14.1 增加一個新的用戶定義函數

對於UDF的工作機制，函數必須用C或C++編寫並且你的作業系統必須支援動態裝載。MySQL原始碼版本包括一個文件“sql/udf_example.cc”，它定義了5個新函數。請教這個文件看UDF調用約定怎樣工作。

對每一個你想在SQL語句中使用的函數，你應該定義對應的C(或 C++)函數。在下面的討論中，“xxx”用於一個函數名的例子。為了區別SQL和C/C++用法，XXX()(大寫)表明SQL函數調用，而xxx()((小寫)表明C/C++函數調用。

你編寫實現XXX()的介面的C/C++函數是：

xxx()（必需的）
主函數。這是計算函數結果的地方。SQL 類型於你的C/C++函數返回類型的對應關系如下：
SQL 類型 | C/C++ 類型
STRING | char *
INTEGER | long long
REAL | double
xxx_init()（可選）
為xxx()的初始化函數，它可用於：
  • 檢查傳到XXX()的參數數量。
  • 檢查參數是一種所需的類型，或，另外地，當主函數被調用時，告訴MySQL，為了強制參數到你想要的類型。
  • 分配任何由主函數所需的內存。
  • 指定結果的最大長度。
  • 指定(對REAL函數)小數位的最大數目。
  • 指定結果是否能是NULL。
xxx_deinit()（可選）
為xxx()的結束函數，它應該釋放初始化函數分配了的任何內存。

當一條SQL語句調用XXX()時，MySQL調用初始化函數xxx_init()，讓它執行任何所需的設置，例如參數檢查或內存分配。如果xxx_init()返回一個錯誤，SQL語句用一條錯誤消息並被放棄而主函數和結束函數不被調用，否則，為每行調用主函數xxx()一次。在所有行被處理完後，結束函數xxx_deinit()被調用，因此它能執行任何必要的清除。

所有函必須是執行緒安全的(不只是主函數，還有初始化和結束函數)。這意味著，你不允許分配任何改變的全局或靜態變數！如果你需要內存，你應該在xxx_init()種分配它並且在xxx_deinit()中釋放它。

14.1.1 UDF的調用順序

主函數應該如下定義。注意返回類型和參數不同，取決於你是否在CREATE FUNCTION語句中聲明SQL函數XXX()返回STRING、INTEGER或REAL：

對STRING函數：

char *xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *result, unsigned long *length,
              char *is_null, char *error);

對INTEGER函數：

long long xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);

對於REAL函數：

double xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);

初始化和結束函數像這樣被聲明：

my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

void xxx_deinit(UDF_INIT *initid);

initid參數被傳給所有3個函數，它指向一個UDF_INIT結構，被用來在函數之間傳遞資訊。UDF_INIT結構成員列在下面。初始化函數應該填寫它想要改變的任何成員。（對一個成員使用預設值，不改變它。）

my_bool maybe_null
如果xxx()能返回NULL，xxx_init()應該設置maybe_null為1。如果參數的任何一個被聲明maybe_null，預設值是1。
unsigned int decimals
小數位數目。預設值是在被傳給主函數的參數中小數位的最大數目。（例如，如果函數傳遞1.34、1.345和1.3，預設值將是3，因為1.345有3個小數位。
unsigned int max_length
字符串結果的最大長度。預設值不同，取決於函數的結果類型。對字符串函數，預設是最長的參數的長度。對整數函數，預設是21位。對實數函數，預設是13加上由initid->decimals指出的小數位數。（對數字函數，長度包括任何符號位或小數點字符。）
char *ptr
函數可為它自己的目的使用的一個指針。例如，函數能使用initid->ptr在函數之間傳遞分配的內存。在xxx_init()中，分配內存並將它賦給這個指針：
initid->ptr = allocated_memory;

在xxx()和xxx_deinit()中，參照initid->ptr來使用或釋放內存。

14.1.2 參數處理

args參數指向一個UDF_ARGS成員，其結構列在下面：

unsigned int arg_count
參數個數。如果你想要函數用一個特定數量的參數被調用，在初始化函數中檢查這個值。例如：
if (args->arg_count != 2)
{
    strcpy(message,"XXX() requires two arguments");
    return 1;
}
enum Item_result *arg_type
為每個參數的類型。可能的類型值是STRING_RESULT、INT_RESULT和REAL_RESULT。為了確保參數是一種給定的類型，而如果他們不是，返回一個錯誤，在初始化函數中檢查arg_type數組。例如：
if (args->arg_type[0] != STRING_RESULT
      && args->arg_type[1] != INT_RESULT)
{
    strcpy(message,"XXX() requires a string and an integer");
    return 1;
}

作為另一種要求你的函數的參數類型是特定類型的選擇，你可以使用初始化函數設置arg_type成員是你想要的類型。這導致MySQL為每個xxx()調用強制參數為那些類型，例如，為了指定頭 2個參數到字符串和整數的強制，在xxx_init()中做這些：

args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;
char **args
args->args將關於你的函數用它調用的參數的一般特性的資訊傳遞到初始化函數。對一個常數參數i，args->args[i]指向參數值。（見下面關於如何正確存取值的指令) 對一個非常數的參數，args->args[i]是0。一個常數參數只是使用常數的一個表達式，例如3或4*7-2或SI(3.14)。一個非常數參數是引用可能每行不同的值的一個表達式，例如列名字或用非常數參數調用的函數。對主函數的每次調用，args->args包含對當前正在處理的行所傳遞的實際參數。函數可以如下地引用一個參數i：
  • 一個STRING_RESULT類型的參數由一個字符串指針加一個長度給出，允許處理任意的長度的二進制的數據或數據。字符串內容可由args->args[i]得到並且字符串長度是args->lengths[i]。你不應該假設字符串是以空(null)結束的。
  • 對於一個INT_RESULT類型的參數，你必須強制轉換args->args[i]為一個long long值：
    long long int_val;
int_val = *((long long*) args->args[i]);
  • 對一個REAL_RESULT類型的參數，你必須強制轉換args->args[i]為一個double值：
    double    real_val;
real_val = *((double*) args->args[i]);
unsigned long *lengths
對初始化函數，lengths數組指出每個參數的最大字符串長度。對於主函數調用，lengths包含為當前正在被處理的行傳遞的任何字符串參數的實際長度。對INT_RESULT或REAL_RESULT類型的參數，lengths仍然包含參數的最大長度(就像對初始化函數)。

14.1.3 返回值和出錯處理

如果沒有出現錯誤，初始化函數應該返回0，否則返回1。如果發生一個錯誤，xxx_init()應該在message參數中儲存一條空字符結束的錯誤消息，消息將被返回給客戶。消息緩衝區是MYSQL_ERRMSG_SIZE個字符長，但是你應該試著保持消息不到80個字符以便它適合一幅標準終端屏幕的寬度。

對long long和double函數，主函數xxx()的返回值是函數值。對字符串函數，字符串在result和length參數中被返回。result是至少255個字節長的一個緩衝區，設置這些為返回值的內容和長度。例如：

memcpy(result, "result string", 13);
*length = 13;

字符串函數返回值也通常指向結果。

為了在主函數中表明一個NULL返回值，設定is_null為1：

*is_null = 1;

為了在函數中表明一個錯誤返回，設定error參數為1：

*error = 1;

如果對任何行xxx()設置*error為1，對當前行函數值是NULL，並且在該語句中處理的後續行，XXX()被調用。(xxx()甚至將不為隨後的行被調用。）注意：在MySQL 3.22.10以前的版本中，你應該都設置*error和*is_null：

*error = 1;
*is_null = 1;

14.1.4 編譯並安裝用戶定義函數

實現UDF的文件必須在伺服器運行的主機上被編譯並且安裝。這個程序下面描述，UDF例子文件包含在MySQL原始碼版本的“udf_example.cc”中，這個文件包含下列函數：

  • metaphon()返回字符串參數的一個變音位(metaphon)字符串。這有點像一個soundex字符串，但是它更針對英語音調。
  • myfunc_double()返回在其參數中所有字符的ASCII值的和，除以其參數長度之和。
  • myfunc_int()返回其參數長度之和。
  • lookup()返回對主機名的IP數。
  • reverse_lookup()返回對一個IP數的主機名。函數可以以一個字符串"xxx.xxx.xxx.xxx"或4位數字被調用。

一個可動態裝載的文件應該編譯為一個共享的對像文件，使用像這樣的命令：

shell> gcc -shared -o udf_example.so myfunc.cc

通過運行在你的MySQL原始程式樹的“sql”目錄下的下列命令，你能很容易地找出對你的系統正確的編譯器選項：

shell> make udf_example.o

你應該運行一個類似於make顯示的編譯命令，除了你應該刪除接近行結尾的-c選項並且在行最後增加-o udf_example.so。（在一些系統上，你可能需要在命令上保留-c。）

一旦你編譯了包含UDF 的一個共享對像，你必須安裝它並且把它告訴MySQL。自“udf_example.cc”編譯一個共享對像產生一個名字類似“udf_example.so”的文件（準確的名字可以依平台不同而不同)。拷貝這個文件到被某個ld尋找的目錄，例如“/usr/lib”。在許多系統上，你能設定LD_LIBRARY或LD_LIBRARY_PATH環境變數，指向有UDF函數文件的目錄。dopen手冊頁告訴你你應該在你的系統上使用哪個變數。你應該在mysql.server或safe_mysqld中設置它並且重啟mysqld。

在庫被安裝以後，用這些命令通知mysqld有關新的函數的資訊：

mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";

函數可使用DROP FUNCTION刪除：

mysql> DROP FUNCTION metaphon;
mysql> DROP FUNCTION myfunc_double;
mysql> DROP FUNCTION myfunc_int;
mysql> DROP FUNCTION lookup;
mysql> DROP FUNCTION reverse_lookup;

CREATE FUNCTION和DROP FUNCTION語句在mysql資料庫中更新系統表func。函數名、類型和共享庫名被保存在該表中。你必須有對mysql的insert和delete權限以創建和拋棄函數。

你不應該使用CREATE FUNCTION增加一個已經被創建的函數。如果你需要重新安裝函數，你應該用DROP FUNCTION刪除它，然後用CREATE FUNCTION重新安裝它。你將需要這樣做，例如，如果你重新編譯你的函數的一個新版本，以便mysqld獲得新版本，否則伺服器將繼續使用舊版本。

活躍函數在每次伺服器啟動時再次裝載，除非你使用--skip-grant-tables選項啟動mysqld。在這種情況下，UDF初始化被跳過並且UDF不可用。（活躍函數是一個用CREATE FUNCTION裝載並且沒有用DROP FUNCTION刪除的函數。)

14.2 增加一個新的原生函數

增加一個新的原生函數的程序在下面描述。注意，你不能往一個可執行檔版本刈莨入新函數，因為該程序涉及修改MySQL原始程式。你必須從原始碼版本自行編譯MySQL。也要注意，如果你遷移到MySQL的其他版本（例如，當一個新版本被釋放時)，你將需要用新版本重複該程序。

為了加入一個新的原生MySQL函數，遵循這些步驟：

  1. 在“lex.h”加入1行，它在sql_functions[]數組中定義函數名。
  2. 在“sql_yacc.yy”加入2行。一行指出示yacc應該定義的預處理器符號(這應該加在文件的開始)，然後定義函數參數並且將一個具有這些參數“項目”加到simple_expr語法分析規則中。有一個例子，檢查在“sql_yacc.yy 所有的SOUNDEX出現看看它使怎樣做的。
  3. 在“item_func.h”中，聲明一個繼承Item_num_func或Item_str_func的類，取決於你的函數是返回一個數字或是一個字符串。
  4. 在“item_func.cc”，增加下列聲明之一，取決於你是正在定義一個數字或是字符串函數：
    double   Item_func_newname::val()
longlong Item_func_newname::val_int()
String  *Item_func_newname::Str(String *str)
  5. 你也可能應該定義下列函數：
    void Item_func_newname::fix_length_and_dec()

    這個函數至少應該基於給定的參數計算max_length，max_length是函數可以返回的字符的最大數目。如果主函數不能返回一個NULL值，這個函數也應該設置maybe_null = 0。函數可以通過檢查參數的maybe_null變數以便檢查函數參數的任何一個是否能返回NULL。

所有函數必須是執行緒安全的（thread-safed）。

對字符串函數，已知有一些額外的考慮：

  • String *str參數提供一個可以用來保存結果的字符串緩衝區。
  • 函數應該返回保存結果的字符串。
  • 所有的當前字符串函數試圖避免分配任何內存，除非絕對必要！

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-15 為MySQL增加新程序

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

15 為MySQL增加新程序

在MySQL中，你可以定義一個用C++寫地程序，它能在查詢被送到客戶前存取和修改查詢中的數據。修改可一行一行地或在GROUP BY層次上進行。

我們已經在MySQL3.23中創建了一個程序例子來顯示它能做什麼。

15.1 analyse程序

analyse([max elements,[max memory]])

這個程序定義在“sql/sql_analyse.cc”，它檢驗來自你的查詢的結果並返回結果的分析。

  • max elements（預設256)是analyse將注意的每列不同值的最大數量。這被analyse用來檢查最佳的列類型是否應該是ENUM類型。
  • max memory（預設8192)是在analyse嘗試尋找所有不同值的時候應該分配給每列的最大內存量。
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])

15.2 編寫一個程序

暫時，對此的唯一文檔是原始程式。:(

你可以檢驗下列文件找到關於程序的所有資訊：

  • “sql/sql_analyse.cc”
  • “sql/procedure.h”
  • “sql/procedure.cc”
  • “sql/sql_select.cc”

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL Reference Manual for version 3.23.7-alpha. - E Known errors and design deficiencies in MySQL

Go to the first, previous, next, last section, table of contents.

E Known errors and design deficiencies in MySQL

  • You cannot build in another directory when using MIT-pthreads. Since this requires changes to MIT-pthreads, we are not likely to fix this.
  • BLOB values can't ``reliably'' be used in GROUP BY or ORDER BY or DISTINCT. Only the first max_sort_length bytes (default 1024) are used when comparing BLOBbs in these cases. This can be changed with the -O max_sort_length option to mysqld. A workaround for most cases is to use a substring: SELECT DISTINCT LEFT(blob,2048) FROM tbl_name.
  • Calculation is done with BIGINT or DOUBLE (both are normally 64 bits long). It depends on the function which precision one gets. The general rule is that bit functions are done with BIGINT precision, IF, and ELT() with BIGINT or DOUBLE precision and the rest with DOUBLE precision. One should try to avoid using bigger unsigned long long values than 63 bits (9223372036854775807) for anything else than bit fields!
  • All string columns, except BLOB and TEXT columns, automatically have all trailing spaces removed when retrieved. For CHAR types this is okay, and may be regarded as a feature according to ANSI SQL92. The bug is that in MySQL, VARCHAR columns are treated the same way.
  • You can only have up to 255 ENUM and SET columns in one table.
  • safe_mysqld re-directs all messages from mysqld to the mysqld log. One problem with this is that if you execute mysqladmin refresh to close and reopen the log, stdout and stderr are still redirected to the old log. If you use --log extensively, you should edit safe_mysqld to log to `'hostname'.err' instead of `'hostname'.log' so you can easily reclaim the space for the old log by deleting the old one and executing mysqladmin refresh.
  • In the UPDATE statement, columns are updated from left to right. If you refer to a updated column, you will get the updated value instead of the original value. For example:
    mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1

    will update KEY with 2 instead of with 1.

  • You can't use temporary tables more than once in the same query.
    select * from temporary_table, temporary_table as t2;

The following is known bugs in earlier versions of MySQL:

  • Before MySQL 3.23.2 an UPDATE that updated a key with a WHERE on the same key may have failed because the key was used to search for records and the same row may have been found multiple times:
    UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;

    A workaround is to use:

    mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;

    This will work because MySQL will not use index on expressions in the WHERE clause.

  • Before MySQL 3.23 all numeric types where treated as fixed-point fields. That means you had to specify how many decimals a floating-point field shall have. All results was returned with the correct number of decimals.

For platform-specific bugs, see the sections about compiling and porting.

Go to the first, previous, next, last section, table of contents.


MySQL中文參考手冊- 20 MySQL客戶工具和API

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

20 MySQL客戶工具和API

20.1 MySQL C API

C API代碼是隨MySQL分發的，它被包含在mysqlclient庫且允許C程式存取一個資料庫。

在 MySQL原始碼版本中的很多客戶是用C編寫的。如果你正在尋找演示怎樣使用C API的例子，看一下這些客戶程式。

大多數其他客戶 API(除了Java的所有)都使用mysqlclient庫與MySQL伺服器通信。這意味著，例如，你能利用很多被其他客戶程式使用的同一環境變數，因為他們從庫中引用。對這些變數的一張表，見12.1 不同的MySQL程式的概述。

客戶有一個最大通訊緩衝區大小。初始分配的緩衝區大小(16K字節) 自動地增加到最大尺寸(預設的最大值是24M)。因為緩衝區大小只是按保証需求而被增加，簡單地增加預設的最大限制並不造成更多被消耗。該尺寸檢查主要是一個對錯誤的查詢和通訊包的檢查。

通訊緩衝區必須足夠大以便一個單獨的SQL語句(對客戶-伺服器傳輸)和一行返回的數據(對伺服器-客戶傳輸)。每個執行緒的通訊緩衝區被動態擴大到最大限制來處理任何查詢或行。例如，如果你包含大到16M數據的BLOB值，你必須有一個至少16M通訊緩衝區限制(在伺服器和客戶兩端)。客戶的預設最大值是24M，但是在伺服器端的預設最大值是1M。你可以在伺服器啟動時通過改變max_allowed_packet參數的值來改變它。見10.2.3 調節伺服器參數。

MySQL伺服器在每個查詢後縮小每個通訊緩衝區到net_buffer_length個字節。對客戶，與一個連接相關的緩衝區的大小沒被減少，直到連接被關閉，在此時客戶內存被回收。

如果你用執行緒的編程，你應該用--with-thread-safe-client編譯MySQL C API，這將使C API執行緒對每個連接更安全。你可以讓2個執行緒共享相同的連接，只要如果你做下列事情：

兩個執行緒不能同時在同一個連接上發送查詢到MySQL。特別是你必須保証在一個mysql_query()和mysql_store_result()之間沒有其他執行緒正在使用同一個連接。
許多執行緒能存取用mysql_store_result()檢索出來的不同結果集合。
如果你使用mysql_use_result，你必須保証沒有其他執行緒在同一個連接上正在詢問任何東西，直到結果集合被關閉。

20.2 C API數據類型

MYSQL
這個結構表示對一個資料庫連接的句柄，它被用於幾乎所有的MySQL函數。
MYSQL_RES
這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。從查詢返回的資訊在本章下文稱為結果集合。
MYSQL_ROW
這是一個行數據的類型安全(type-safe)的表示。當前它實現為一個計數字節的字符串數組。（如果字段值可能包含二進制數據，你不能將這些視為空終止串，因為這樣的值可以在內部包含空字節) 行通過調用mysql_fetch_row()獲得。
MYSQL_FIELD
這個結構包含字段資訊，例如字段名、類型和大小。其成員在下面更詳細地描述。你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。字段值不是這個結構的部分﹔他們被包含在一個MYSQL_ROW結構中。
MYSQL_FIELD_OFFSET
這是一個相對一個MySQL字段表的偏移量的類型安全的表示。（由mysql_field_seek()使用。) 偏移量是在一行以內的字段編號，從0開始。
my_ulonglong
該類型用於行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。這種類型提供0到1.84e19的一個範圍。在一些系統上，試圖列印類型my_ulonglong的值將不工作。為了列印出這樣的值，將它變換到unsigned long並且使用一個%lu列印格式。例如：
printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));

MYSQL_FIELD結構包含列在下面的成員：

char * name
字段名，是一個空結尾的字符串。
char * table
包含該字段的表的名字，如果它不是可計算的字段。對可計算的字段，table值是一個空字符串。
char * def
這字段的預設值，是一個空結尾的字符串。只要你使用，只有你使用mysql_list_fields()才可設置它。
enum enum_field_types type
字段類型。type值可以是下列之一：
類型值 | 類型含義
FIELD_TYPE_TINY | TINYINT字段
FIELD_TYPE_SHORT | SMALLINT字段
FIELD_TYPE_LONG | INTEGER字段
FIELD_TYPE_INT24 | MEDIUMINT字段
FIELD_TYPE_LONGLONG | BIGINT字段
FIELD_TYPE_DECIMAL | DECIMAL或NUMERIC字段
FIELD_TYPE_FLOAT | FLOAT字段
FIELD_TYPE_DOUBLE | DOUBLE或REAL字段
FIELD_TYPE_TIMESTAMP | TIMESTAMP字段
FIELD_TYPE_DATE | DATE字段
FIELD_TYPE_TIME | TIME字段
FIELD_TYPE_DATETIME | DATETIME字段
FIELD_TYPE_YEAR | YEAR字段
FIELD_TYPE_STRING | 字符串(CHAR或VARCHAR)字段
FIELD_TYPE_BLOB | BLOB或TEXT字段(使用max_length決定最大長度）
FIELD_TYPE_SET | SET字段
FIELD_TYPE_ENUM | ENUM字段
FIELD_TYPE_NULL | NULL- 類型字段
FIELD_TYPE_CHAR | 不推薦﹔使用FIELD_TYPE_TINY代替

你可以使用IS_NUM()宏來測試字段是否有一種數字類型。將type值傳給IS_NUM()並且如果字段是數字的，它將計算為TRUE：

if (IS_NUM(field->type))
    printf("Field is numeric\n");
unsigned int length
字段寬度，在表定義中指定。
unsigned int max_length
對結果集合的字段的最大寬度(對實際在結果集合中的行的最長字段值的長度)。如果你使用mysql_store_result()或mysql_list_fields()，這包含字段最大長度。如果你使用mysql_use_result()，這個變數的值是零。
unsigned int flags
字段的不同位標誌。flags值可以是零個或多個下列位設置：
標誌值 | 標誌含義
NOT_NULL_FLAG | 字段不能是NULL
PRI_KEY_FLAG | 字段是一個主鍵的一部分
UNIQUE_KEY_FLAG | 字段是一個唯一鍵的一部分
MULTIPLE_KEY_FLAG | 字段是一個非唯一鍵的一部分。
UNSIGNED_FLAG | 字段有UNSIGNED屬性
ZEROFILL_FLAG | 字段有ZEROFILL屬性
BINARY_FLAG | 字段有BINARY屬性
AUTO_INCREMENT_FLAG | 字段有AUTO_INCREMENT屬性
ENUM_FLAG | 字段是一個ENUM（不推薦）
BLOB_FLAG | 字段是一個BLOB或TEXT（不推薦）
TIMESTAMP_FLAG | 字段是一個TIMESTAMP（不推薦）

BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG標誌的使用是不推薦的，因為他們指出字段的類型而非它的類型屬性。對FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或FIELD_TYPE_TIMESTAMP，最好是測試field->type。下面例子演示了一個典型的flags值用法：

if (field->flags & NOT_NULL_FLAG)
    printf("Field can't be null\n");

你可以使用下列方便的宏決來確定flags值的布爾狀態：

IS_NOT_NULL(flags) | 真，如果該字段被定義為NOT NULL
IS_PRI_KEY(flags) | 真，如果該字段是一個主鍵
IS_BLOB(flags) | 真，如果該字段是一個BLOB或TEXT（不推薦﹔相反測試field->type）
unsigned int decimals
對數字字段的小數位數。

20.3 C API函數概述

在 C API 刈莃用的函數列在下面，並且在下一節更詳細地描述。見20.4 C API函數描述。

mysql_affected_rows() | 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
mysql_close() | 關閉一個伺服器連接。
mysql_connect() | 連接一個MySQL伺服器。該函數不推薦﹔使用mysql_real_connect()代替。
mysql_change_user() | 改變在一個打開的連接上的用戶和資料庫。
mysql_create_db() | 創建一個資料庫。該函數不推薦﹔而使用SQL命令CREATE DATABASE。
mysql_data_seek() | 在一個查詢結果集合中搜尋一任意行。
mysql_debug() | 用給定字符串做一個DBUG_PUSH。
mysql_drop_db() | 拋棄一個資料庫。該函數不推薦﹔而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() | 讓伺服器將調試資訊寫入日誌文件。
mysql_eof() | 確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() | 返回最近被調用的MySQL函數的出錯編號。
mysql_error() | 返回最近被調用的MySQL函數的出錯消息。
mysql_escape_string() | 用在SQL語句中的字符串的轉義特殊字符。
mysql_fetch_field() | 返回下一個表字段的類型。
mysql_fetch_field_direct () | 返回一個表字段的類型，給出一個字段編號。
mysql_fetch_fields() | 返回一個所有字段結構的數組。
mysql_fetch_lengths() | 返回當前行中所有列的長度。
mysql_fetch_row() | 從結果集合中取得下一行。
mysql_field_seek() | 把列光標放在一個指定的列上。
mysql_field_count() | 返回最近查詢的結果列的數量。
mysql_field_tell() | 返回用於最後一個mysql_fetch_field()的字段光標的位置。
mysql_free_result() | 釋放一個結果集合使用的內存。
mysql_get_client_info() | 返回客戶版本資訊。
mysql_get_host_info() | 返回一個描述連接的字符串。
mysql_get_proto_info() | 返回連接使用的協議版本。
mysql_get_server_info() | 返回伺服器版本號。
mysql_info() | 返回關於最近執行得查詢的資訊。
mysql_init() | 獲得或初始化一個MYSQL結構。
mysql_insert_id() | 返回有前一個查詢為一個AUTO_INCREMENT列產生的ID。
mysql_kill() | 殺死一個給定的執行緒。
mysql_list_dbs() | 返回匹配一個簡單的正則表達式的資料庫名。
mysql_list_fields() | 返回匹配一個簡單的正則表達式的列名。
mysql_list_processes() | 返回當前伺服器執行緒的一張表。
mysql_list_tables() | 返回匹配一個簡單的正則表達式的表名。
mysql_num_fields() | 返回一個結果集合重的列的數量。
mysql_num_rows() | 返回一個結果集合中的行的數量。
mysql_options() | 設置對mysql_connect()的連接選項。
mysql_ping() | 檢查對伺服器的連接是否正在工作，必要時重新連接。
mysql_query() | 執行指定為一個空結尾的字符串的SQL查詢。
mysql_real_connect() | 連接一個MySQL伺服器。
mysql_real_query() | 執行指定為帶計數的字符串的SQL查詢。
mysql_reload() | 告訴伺服器重裝授權表。
mysql_row_seek() | 搜索在結果集合中的行，使用從mysql_row_tell()返回的值。
mysql_row_tell() | 返回行光標位置。
mysql_select_db() | 連接一個資料庫。
mysql_shutdown() | 關掉資料庫伺服器。
mysql_stat() | 返回作為字符串的伺服器狀態。
mysql_store_result() | 檢索一個完整的結果集合給客戶。
mysql_thread_id() | 返回當前執行緒的ID。
mysql_use_result() | 初始化一個一行一行地結果集合的檢索。

為了連接伺服器，調用mysql_init()以初始化一個連接處理器，然後用該處理器調用mysql_real_connect()(還有其他資訊例如主機名、用戶名和密碼)。當你用該連接完成工作後，調用mysql_close()終止它。

當一個連接活躍時，客戶可以用mysql_query()或mysql_real_query()將SQL查詢發送到伺服器。兩者的差別是mysql_query()期望查詢作為一個空結尾的字符串來指定而mysql_real_query()期望一個計數的字符串。如果字符串包含二進制數據(它可以包括空字節)，你必須使用mysql_real_query()。

對與每個非--SELECT查詢(例如，INSERT、UPDATE、DELETE等)，你可以調用mysql_affected_rows()知道有多少行受到影響(改變)。

對於SELECT查詢，你作為一個結果集合來檢索選擇的行。（注意一些語句是類SELECT的，他們返回行。這些包括SHOW、DESCRIBE和EXPLAIN。他們應該像SELECT語句相同的方式來對待。）

對客戶，有兩種方法處理結果集合。一種方法是通過調用mysql_store_result()立刻檢索全部結果。該函數從伺服器獲得查詢返回的所有行，並將他們儲存在客戶端。第二種方法是對客戶通過調用mysql_use_result()初始化一個一行一行地結果集合的檢索。該函數初始化檢索，但是實際上不從伺服器獲得任何行。

在兩種情況中，你通過mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()儲存取已經從伺服器被取出的行。用mysql_use_result()、mysql_fetch_row()實際上從伺服器檢索行。調用mysql_fetch_lengths()可獲得關於每行中數據值尺寸的資訊。

在你用完一個結果集合以後，調用mysql_free_result()釋放由它使用的內存。

兩種檢索機制是互補的。客戶程式應該選擇最適合他們的要求的途徑。在實踐中，客戶通常更願意使用mysql_store_result()。

mysql_store_result()的一個優點是既然行均被客戶取到，你不僅能順序存取行，你也能mysql_data_seek()或mysql_row_seek()在結果集合中前後移動以改變在結果集合中的當前行位置。你也能通過調用mysql_num_rows()知道有多少行。另一方面，mysql_store_result()的內存需求對較大結果集合可能很高，並且你最可能遇到out-of-memory情況。

mysql_use_result()的一個優點是客戶為結果集合需要較少的內存，因為它一次只是維持一行(並且因為有較少的分配開銷，mysql_use_result()能更快些)。缺點是你必須盡快處理每一行以避免困住伺服器，你不必再結果集合中隨意存取行(你只能順序存取行)，而且你不知道在結果集合中有多少行，直到你檢索全部結果。還有，你必須檢索出所有行，即使你在檢索中途確定你已找到了想尋找的資訊。

API使得客戶正確應答查詢成為可能(僅檢索必要的行)，不用知道查詢是否是一個SELECT。你可以通過在mysql_query()（或mysql_real_query())之後調用mysql_store_result()做到。如果結果集合調用成功並且查詢是一個SELECT，你能讀取行。如果結果集合調用，調用mysql_field_count()確定結果是否是實際期望的。如果mysql_field_count()返回0，查詢沒有返回數據(表明它是一個INSERT、UPDATE、DELETE等)，所以不期望返回行。如果mysql_field_count()是非零，查詢應該有返回行，但是沒有。這表明查詢是一個失敗的SELECT。見mysql_field_count()如何能做到的例子的描述。

mysql_store_result()和mysql_use_result()都允許你獲得有關組成結果集合的字段的資訊(字段數量、他們的名字和類型等等)。你可以通過重複調用mysql_fetch_field()在行中順序存取字段資訊，或調用mysql_fetch_field_direct()存取行中的字段編號。當前字段光標位置可以通過調用mysql_field_seek()改變，設置字段光標影響到後續mysql_fetch_field()調用。你也能通過調用mysql_fetch_fields()馬上獲得字段資訊。

對於檢測和報告錯誤，MySQL借助於mysql_errno()和mysql_error()函數提供錯誤資訊的存取。他們返回最近調用的可能成功或失敗的函數的錯誤代碼或錯誤消息，允許你確定何時發生一個錯誤和什麼錯誤。

20.4 C API函數描述

在下面的描述中，一個NULL參數或返回值含義是在C編程語言環境的NULL，不是一個MySQL NULL值。

返回一個值的函數一般返回一個指針或一個整數。除非另外指定，返回一個指針的函數返回一個非 NULL值表明成功，或一個NULL值表明一個錯誤，而返回一個整數的函數返回零表示成功，或非零表示一個錯誤。注意，“非零”只有這個含義。除非函數描述另外說明，不要測試一個零以外的其他值：

if (result)                   /* 正確 */
    ... error ...

if (result < 0)               /* 不正確 */
    ... error ...

if (result == -1)             /* 不正確 */
    ... error ...

當函數返回一個錯誤時，函數描述的錯誤小節列出錯誤可能的類型。你可以調用mysql_errno()找出發生了這些重的哪一個。錯誤的字符串表示可以調用mysql_error()獲得。

20.4.1 mysql_affected_rows()

my_ulonglong mysql_affected_rows(MYSQL *mysql)

20.4.1.1 說明

返回受到最後一個UPDATE、DELETE或INSERT查詢影響(變化)的行數。可以在針對UPDATE、DELETE或INSERT語句的mysql_query()之後立即調用。對於SELECT語句，mysql_affected_rows()的功能於mysql_num_rows()相同。

mysql_affected_rows()目前以一個宏(macro)來實現。

20.4.1.2 返回值

大於零的一個整數表示受到影響或檢索出來的行數。零表示沒有匹配查序中WHERE子句的記錄或目前還沒有查詢被執行。-1表示查詢返回一個錯誤，或對於一個SELECT查詢，mysql_affected_rows()在調用mysql_store_result()之前被調用。

20.4.1.3 錯誤

沒有。

20.4.1.4 範例

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%d products updated",mysql_affected_rows(&mysql));

20.4.2 mysql_close()

void mysql_close(MYSQL *mysql)

20.4.2.1 說明

關閉一個以前打開了的連接。如果句柄由mysql_init()或mysql_connect()自動分配，mysql_close()也釋放被mysql指向的連接句柄。

20.4.2.2 返回值

沒有。

20.4.2.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對服務者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.3 mysql_connect()

MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)

20.4.3.1 說明

該函數不推薦使用，而更好使用mysql_real_connect()。

mysql_connect()試圖建立一個對運行在host的一個MySQL資料庫引擎的連接。mysql_connect()必須在你能執行其他API函數之前成功地完成，除了mysql_get_client_info()。

參數的含義與mysql_connect()相應的參數相同，不同的是連接參數可以是NULL。在這種情況下，C API 自動為連接結構分配內存，並且當你調用mysql_close()，釋放它。這種方法的缺點是如果連接失敗，你不能檢索出一條錯誤消息。（為了從mysql_errno()或mysql_error()得到錯誤資訊，你必須提供一個有效的MYSQL指針。）

20.4.3.2 返回值

同mysql_real_connect()。

20.4.3.3 錯誤

同mysql_real_connect()。

20.4.4mysql_change_user()

my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)

20.4.4.1 說明

改變用戶並且使得由db指定資料庫成為由mysql指定的連接上的預設(當前)資料庫。在隨後的查詢中，這個資料庫是不包括一個明確的資料庫指定符的表引用的預設值。

這個函數功能在MySQL 3.23.3中引入。

除非連接的用戶能被認証或如果他沒有權限使用資料庫，mysql_change_user()失敗。在這種情況下，用戶和資料庫都沒被改變。

如果你不想有一個預設資料庫，db參數可以被設置為NULL。

20.4.4.2 返回值

成功，零。如果發生一個錯誤發生，非零。

20.4.4.3 錯誤

與你能從mysql_real_connect()得到的相同。

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL服務者關閉了。
CR_SERVER_LOST
對服務者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。
ER_UNKNOWN_COM_ERROR
MySQL伺服器未實現這個命令(可能是一個老的伺服器）
ER_ACCESS_DENIED_ERROR
用戶或密碼錯誤。
ER_BAD_DB_ERROR
資料庫不存在。
ER_DBACCESS_DENIED_ERROR
用戶沒有資料庫的存取權利。
ER_WRONG_DB_NAME
資料庫名字太長。

20.4.4.4 範例

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}

20.4.5 mysql_create_db()

int mysql_create_db(MYSQL *mysql, const char *db)

20.4.5.1 說明

創建由db參數命名的資料庫。

這個函數不推薦，而最好使用mysql_query()發出一條SQL CREATE DATABASE語句。

20.4.5.2 返回值

如果資料庫成功地被創造，零。如果發生一個錯誤，非零。

20.4.5.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對服務者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.5.4 範例

if(mysql_create_db(&mysql, "my_database"))
{
   fprintf(stderr, "Failed to create new database.  Error: %s\n",
           mysql_error(&mysql));
}

20.4.6 mysql_data_seek()

void mysql_data_seek(MYSQL_RES *result, unsigned long long offset)

20.4.6.1 說明

在一個查詢結果集合中定位任意行。這要求結果集合結構包含查詢的全部結果，這樣mysql_data_seek()可以僅需與mysql_store_result()一起使用，不是與mysql_use_result()。

偏移量應該是從0到mysql_num_rows(result)-1範圍的一個值。

20.4.6.2 返回值

無。

20.4.6.3 錯誤

無。

20.4.7 mysql_debug()

void mysql_debug(char *debug)

20.4.7.1 說明

用一個給定字符串做一個DBUG_PUSH。mysql_debug()使用Fred Fish 調試庫。為了使用這個函數，你必須編譯客戶庫以支援調試。見G.1 調試一個MySQL伺服器和節G.2 調試一個MySQL客戶。

20.4.7.2 返回值

無。

20.4.7.3 錯誤

無。

20.4.7.4 範例

下面所示的調用使得客戶庫在客戶機器上的“/tmp/client.trace”中產生一個跟蹤文件：

mysql_debug("d:t:O,/tmp/client.trace");

20.4.8 mysql_drop_db()

int mysql_drop_db(MYSQL *mysql, const char *db)

20.4.8.1 說明

拋棄由db參數命名的資料庫。

這個函數不推薦，而最好使用mysql_query()發出一條SQL DROP DATABASE語句。

20.4.8.2 返回值

如果資料庫成功地被破拋棄，零。如果發生一個錯誤，非零。

20.4.8.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對服務者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.8.4 範例

if(mysql_drop_db(&mysql, "my_database"))
  fprintf(stderr, "Failed to drop the database: Error: %s\n",
          mysql_error(&mysql));

20.4.9 mysql_dump_debug_info()

int mysql_dump_debug_info(MYSQL *mysql)

20.4.9.1 說明

指示服務者將一些調試資訊寫入日誌文件。連接的用戶對此必須有precess權限才能工作。

20.4.9.2 返回值

如果命令成功，零。如果發生一個錯誤，非零。

20.4.9.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL服務者關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.10 mysql_eof()

my_bool mysql_eof(MYSQL_RES *result)

20.4.10.1 說明

這個函數不推薦，而使用mysql_errno()或mysql_error()。

mysql_eof()確定是否已經讀到了一個結果集合的最後一行。

如果你從成功的mysql_store_result()調用獲得一個結果集合，客戶程式用一個操作收到全部集合。在這種情況下，從mysql_fetch_row()返回一個NULL總是意味著已經到達了結果集合的尾部，沒必要調用mysql_eof()。

在另一方面，如果你使用mysql_use_result()初始化一個結果集合的檢索，該集合的行隨著你重複調用mysql_fetch_row()一個一個地從伺服器獲得。因為在這個程序中在連接上可能發生一個錯誤，從mysql_fetch_row()返回一個NULL值並不意味著集合正常到達了尾部。在這種情況下，你能使用mysql_eof()確定發生了什麼。如果到達結果集合的尾部，mysql_eof()返回非零值，並且如果發生一個錯誤，返回零。

在時間上，mysql_eof()先於標準MySQL錯誤函數mysql_errno()和mysql_error()。因為這些錯誤函數提供相同的資訊，他們的使用更好mysql_eof()，它現在不建議使用。（事實上，他們提供更多的資訊，因為mysql_eof()值返回一個布爾值，而錯誤函數指出當發生錯誤時的出錯原因。）

20.4.10.2 返回值

如果發生一個錯誤，零。如果到達結果集合的結束，非零。

20.4.10.3 錯誤

無。

20.4.10.4 範例

下列例子顯示你必須如何使用mysql_eof()：

mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(!mysql_eof(result))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}

然而，你可以用標準MySQL錯誤函數完成同樣的效果：

mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(mysql_errno(&mysql))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}

20.4.11 mysql_errno()

unsigned int mysql_errno(MYSQL *mysql)

20.4.11.1 說明

對於由mysql指定的連接，mysql_errno()返回最近調用的可能成功或失敗的API函數的錯誤代碼。返回值零意味著沒有錯誤發生。客戶錯誤消息編號列出在MySQL“errmsg.h”頭文件中。伺服器錯誤消息編號列出在“mysqld_error.h”中。

20.4.11.2 返回值：

一個錯誤代碼值。如果沒有錯誤發生，零。

20.4.11.3 錯誤

無。

20.4.12 mysql_error()

char *mysql_error(MYSQL *mysql)

20.4.12.1 說明

對於由mysql指定的連接，mysql_errno()返回最近調用的可能成功或失敗的API函數的錯誤代碼。如果沒有錯誤發生，返回空字符串("")。這意味著下列兩個測試是等價的：

if(mysql_errno(&mysql))
{
    // an error occurred
}

if(mysql_error(&mysql)[0] != '\0')
{
    // an error occurred
}

客戶錯誤消息的語言可通過重新編譯MySQL客戶庫來改變。目前，你能在幾種不同的語言間選取錯誤消息。見9.1 MySQL支援什麼語言？。

20.4.12.2 返回值

一個描述錯誤的字符串。如果沒有錯誤發生，空字符串。

20.4.12.3 錯誤

無。

20.4.13 mysql_escape_string()

unsigned int mysql_escape_string(char *to, const char *from, unsigned int length)

20.4.13.1 說明

把在from中的字符串編碼為在一條SQL語句刈莃以發給伺服器的轉義的SQL字符串，將結果放在to中， 並且加上一個終止的空字節。編碼的字符是NUL（ASCII 0)、‘\n’、‘\r’、‘\’、‘'’、‘"’和Control-Z(見7.1 文字：如何寫字符串和數字)。

由from指向的字符串必須是length個字節長。你必須分配to的緩衝區至少length*2+1個字節長。（在更壞的情況，每個字符可能需要使用2個字節被編碼，並且你需要為終止空字節的空間) 當mysql_escape_string()返回時，to的內容將是空字符終止的字符串。返回值是編碼後的字符串的長度，不包括終止空字符。

20.4.13.2 範例

char query[1000],*end;

end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_escape_string(end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_escape_string(end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';

if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
   fprintf(stderr, "Failed to insert row, Error: %s\n",
           mysql_error(&mysql));
}

例子中所用的strmov()函數被包括在mysqlclient庫刈聇功能類似於strcpy()，但是返回一個指向空終止的第一個參數的指針。

20.4.13.3 返回值

放進to的值的長度，不包括終止空字符。

20.4.13.4 錯誤

無。

20.4.14 mysql_fetch_field()

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

20.4.14.1 說明

返回作為一個MYSQL_FIELD結構的一個結果集合的一個列的定義。重複調用這個函數在結果集合中檢索所有關於列的資訊。當沒有剩下更多的字段時，mysql_fetch_field()返回NULL。

在每次你執行一個新的SELECT查詢，mysql_fetch_field()被重置（reset)以返回有關第一列的資訊。由mysql_fetch_field()返回的字段也受調用mysql_field_seek()的影響。

如果你調用mysql_query()在一張表上執行一個SELECT，但是沒調用mysql_store_result()，如果你調用mysql_fetch_field()詢問一個BLOB字段的長度，MySQL返回預設BLOB長度(8K字節)。（選擇8K的長度是因為MySQL不知道BLOB的最大長度。這應該在某個時候是它可配置) 一旦你已經檢索了結果集合，field->max_length包含了在特定查詢中對於該列最大值的長度。

20.4.14.2 返回值

當前列的MYSQL_FIELD結構。如果沒有列剩下，NULL。

20.4.14.3 錯誤

無。

20.4.14.4 範例

MYSQL_FIELD *field;

while((field = mysql_fetch_field(result)))
{
    printf("field name %s\n", field->name);
}

20.4.15 mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

20.4.15.1 說明

返回一個結果集合的所有MYSQL_FIELD結構的數組。每個結構提供結果結合中一列的字段定義。

20.4.15.2 返回值

一個結果集合的所有MYSQL_FIELD結構的一個數組。

20.4.15.3 錯誤

無。

20.4.15.4 範例

unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;

num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
   printf("Field %u is %s\n", i, fields[i].name);
}

20.4.16 mysql_fetch_field_direct()

MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)

20.4.16.1 說明

給定在一個結果集合中的一個列的字段編號fieldnr，返回作為MYSQL_FIELD結構的列的字段定義。你可以使用這個函數檢索任意列的義。fieldnr的值應該在從0到mysql_num_fields(result)-1範圍內。

20.4.16.2 返回值

指定列的MYSQL_FIELD結構。

20.4.16.3 錯誤

無。

20.4.16.4 範例

unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;

num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
    field = mysql_fetch_field_direct(result, i);
    printf("Field %u is %s\n", i, field->name);
}

20.4.17 mysql_fetch_lengths()

unsigned long *mysql_fetch_lengths(MYSQL_RES *result)

20.4.17.1 說明

返回在結果集合內的當前行的列長度。如果你計劃拷貝字段值，這個長度資訊對最佳化也是有用的，因為你可以避免調用strlen()。另外，如果結果集合刈荺含二進制數據，你必須使用這個函數確定數據的大小，因為strlen()對包含空字符的任何字段返回不正確的結果。

空列和包含NULL的列的長度值是零。為了看清如何區分這兩種情況，見mysql_fetch_row()的說明。

20.4.17.2 返回值

表示每列大小的無符號長整數的一個數組(不包括任何終止空字符)。如果出現一個錯誤，NULL。

20.4.17.3 錯誤

mysql_fetch_lengths()只對結果集合的當前行有效。如果你在調用mysql_fetch_row()之前或在檢索出在結果中的所有以後，它返回NULL。

20.4.17.4 範例

MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;

row = mysql_fetch_row(result);
if (row)
{
    num_fields = mysql_num_fields(result);
    lengths = mysql_fetch_lengths(result);
    for(i = 0; i < num_fields; i++)
    {
         printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
    }
}

20.4.18 mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

20.4.18.1 說明

檢索一個結果集合的下一行。當在mysql_store_result()之後使用時，如果沒有更多的行可見所時，mysql_fetch_row()返回NULL。當在mysql_use_result()之後使用時，當沒有更多的行可檢索時或如果出現一個錯誤，mysql_fetch_row()返回NULL。

在行中值的數量由mysql_num_fields(result)給出。如果row保存了從一個對用mysql_fetch_row()調用返回的值，指向該值的指針作為row[0]到row[mysql_num_fields(result)-1]來存取。在行中的NULL值由NULL指針指出。

在行中字段值的長度可以通過調用mysql_fetch_lengths()獲得。空字段和包含NULL的字段長度都是 0﹔你可以通過檢查該值的指針區分他們。如果指針是NULL，字段是NULL﹔否則字段是空的。

20.4.18.2 返回值

下一行的一個MYSQL_ROW結構。如果沒有更多的行可檢索或如果出現一個錯誤，NULL。

20.4.18.3 錯誤

CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.18.4 範例

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

20.4.19 mysql_field_count()

unsigned int mysql_field_count(MYSQL *mysql)

如果你正在使用一個比3.22.24早MySQL版本，你應該使用unsigned int mysql_num_fields(MYSQL *mysql)。

20.4.19.1 說明

返回在連接上的最近查詢的列的數量。

這個函數一般用在mysql_store_result()返回NULL時（這樣你沒有結果設置指針)。在這種情況中，你能調用mysql_field_count()確定mysql_store_result()是否應該產生了一個非空的結果。這允許一個客戶程式執行正確的操作，而不必知道查詢是否是一條SELECT（或類SELECT)語句。下面顯示的例子說明這怎樣可以做到。

見20.4.51 為什麼在mysql_query()返回成功後，mysql_store_result()有時返回NULL?。

20.4.19.2 返回值

在結果集合中表示字段數量字的一個無符號整數。

20.4.19.3 錯誤

無。

20.4.19.4 範例

MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;

if (mysql_query(&mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&mysql);
    if (result)  // there are rows
    {
        num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else  // mysql_store_result() returned nothing; should it have?
    {
        if(mysql_field_count(&mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
        else // mysql_store_result() should have returned data
        {
            fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
        }
    }
}

另一個選擇是用mysql_errno(&mysql)代替mysql_field_count(&mysql)調用。在這種情況中，你直接檢查來自mysql_store_result()的一個錯誤而非從mysql_field_count()值來推斷語句是否是一個SELECT。

20.4.20 mysql_field_seek()

MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)

20.4.20.1 說明

將字段光標設置到給定的偏移量。下一次調用mysql_fetch_field()將檢索與該偏移量關聯的列的字段定義。

為了定位於行的起始，傳遞一個值為0的offset值。

20.4.20.2 返回值

字段光標的先前的值。

20.4.20.3 錯誤

無。

20.4.21mysql_field_tell()

MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)

20.4.21.1 說明

返回用於最後一個mysql_fetch_field()的字段光標的位置。這個值可用作mysql_field_seek()的一個參數。

20.4.21.2 返回值

字段光標的當前偏移量。

20.4.21.3 錯誤

無。

20.4.22 mysql_free_result()

void mysql_free_result(MYSQL_RES *result)

20.4.22.1 說明

釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為一個結果集合分配的內存。當你用完了一個結果集合時，你必須調用mysql_free_result()來釋放它使用的內存。

20.4.22.2 返回值

無。

20.4.22.3 錯誤

無。

20.4.23 mysql_get_client_info()

char *mysql_get_client_info(void)

20.4.23.1 說明

返回代表客戶庫的版本的字符串。

20.4.23.2 返回值

代表MySQL客戶庫版本的一個字符串。

20.4.23.3 錯誤

無。

20.4.24 mysql_get_host_info()

char *mysql_get_host_info(MYSQL *mysql)

20.4.24.1 說明

返回描述正在使用的連接類型的字符串，包括服務其主機名。

20.4.24.2 返回值

表示伺服器主機名者和連接類型的字符串。

20.4.24.3 錯誤

無。

20.4.25 mysql_get_proto_info()

unsigned int mysql_get_proto_info(MYSQL *mysql)

20.4.25.1 說明

返回當前連接使用的協議版本。

20.4.25.2 返回值

表示被當前連接使用的協議版本的一個無符號整數。

20.4.25.3 錯誤

無。

20.4.26 mysql_get_server_info()

char *mysql_get_server_info(MYSQL *mysql)

20.4.26.1 說明

返回表示伺服器版本號的字符串。

20.4.26.2 返回值

表示伺服器版本號的一個字符串。

20.4.26.3 錯誤

無。

20.4.27 mysql_info()

char *mysql_info(MYSQL *mysql)

20.4.27.1 說明

檢索一個字符串，它提供有關最近執行的查詢的資訊，但是對下面列出的語句。對其他語句，mysql_info()返回NULL。字符串的格式隨查詢類型而變化，如下所述。數字僅僅是說明性的﹔字符串將包含對查詢適當的值。

INSERT INTO ... SELECT ...
字符串格式： Records: 100 Duplicates: 0 Warnings: 0
INSERT INTO ... VALUES (...),(...),(...)...
字符串格式： Records: 3 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ...
字符串格式： Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE
字符串繩格式： Records: 3 Duplicates: 0 Warnings: 0
UPDATE
字符串格式： Rows matched: 40 Changed: 40 Warnings: 0

注意，只有多個值在語句中指定，mysql_info()對INSERT ... VALUES語句才返回非NULL值。

20.4.27.2 返回值

表示最近執行的查詢的附加資訊的一個字符串。如果得不到查詢的任何資訊，NULL。

20.4.27.3 錯誤

無。

20.4.28 mysql_init()

MYSQL *mysql_init(MYSQL *mysql)

20.4.28.1 說明

分配或初始化適合mysql_real_connect()的一個MYSQL對像。如果mysql是一個NULL指針，函數分配、初始化並且返回一個新對像。否則對像被初始化並且返回對像的地址。如果mysql_init()分配一個新對像，它將在調用mysql_close()關閉連接時被釋放。

20.4.28.2 返回值

一個被初始化的MYSQL*句柄。如果沒有足夠的內存來分配一個新對像，NULL。

20.4.28.3 錯誤

在內存不夠的情況下，返回NULL。

20.4.29 mysql_insert_id()

my_ulonglong mysql_insert_id(MYSQL *mysql)

20.4.29.1 說明

返回由先前的查詢為一個AUTO_INCREMENT列產生的ID。在你執行一個INSERT查詢向一個包含AUTO_INCREMENT字段的表中插入後，使用這個函數。

注意，如果先前的查詢不產生一個AUTO_INCREMENT值，mysql_insert_id()返回0。如果你需要在以後保存該值，必須在查詢產生了該值後馬上調用mysql_insert_id()。

也要注意，SQL的LAST_INSERT_ID()函數總是包含最近產生的AUTO_INCREMENT值，並且在查詢之間不被重置，因為該函數的值在伺服器端維護。

20.4.29.2 返回值

有先前的查詢更新的AUTO_INCREMENT字段的值。如果在連接上沒有先前的詢問或如果查詢沒更新AUTO_INCREMENT值，返回零。

20.4.29.3 錯誤

無。

20.4.30 mysql_kill()

int mysql_kill(MYSQL *mysql, unsigned long pid)

20.4.30.1 說明

要求伺服器殺死由pid指定的執行緒。

20.4.30.2 返回值

成功，零。如果出現一個錯誤，非零。

20.4.30.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.31 mysql_list_dbs()

MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)

20.4.31.1 說明

返回一個結果集合，它用在伺服器上的匹配wild參數指定的簡單正則表達式的資料庫名組成。wild可以包含通配符字符“%”或“_”，或可以是匹配所有的資料庫的一個NULL指針。調用mysql_list_dbs()類似於執行查詢SHOW databases [LIKE wild]。

你必須用mysql_free_result()釋放結果集合。

20.4.31.2 返回值

成功，一個MYSQL_RES結果集合。如果出現一個錯誤，NULL。

20.4.31.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_OUT_OF_MEMORY
內存溢出。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.32 mysql_list_fields()

MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)

20.4.32.1 說明

返回一個結果集合，它用在給定表中的匹配wild參數指定的簡單正則表達式的列名組成。wild可以包含通配符字符“%”或“_”，或可以是匹配所有列的一個NULL指針。調用mysql_list_fields()類似於執行查詢SHOW COLUMNS FROM tbl_name [LIKE wild]。

注意，建議你使用SHOW COLUMNS FROM tbl_name而不是mysql_list_fields()。

你必須用mysql_free_result()釋放結果集合。

20.4.32.2 返回值

成功，一個MYSQL_RES的結果集合。如果出線一個錯誤，NULL。

20.4.32.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL服務者關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.33 mysql_list_processes()

MYSQL_RES *mysql_list_processes(MYSQL *mysql)

20.4.33.1 說明

返回一個描述當前伺服器執行緒的結果集合。這是與mysqladmin processlist或SHOW PROCESSLIST查詢報告的相同資訊。

你必須用mysql_free_result()釋放結果集合。

20.4.33.2 返回值

成功，一個MYSQL_RES結果集合。如果發生一個錯誤，NULL。

20.4.33.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL服務者關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.34 mysql_list_tables()

MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)

20.4.34.1 說明

返回一個結果集合，它用在當前資料庫中的匹配wild參數指定的簡單正則表達式的表名組成。wild可以包含通配符字符“%”或“_”，或可以是匹配所有表的一個NULL指針。調用mysql_list_tables()類似於執行詢問SHOW tables [LIKE wild]。

你必須用mysql_free_result()釋放結果集合。

20.4.34.2 返回值

成功，一個MYSQL_RES結果集合。如果出現一個錯誤，NULL。

20.4.34.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不正確的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.35 mysql_num_fields()

unsigned int mysql_num_fields(MYSQL_RES *result)

或

unsigned int mysql_num_fields(MYSQL *mysql)

第二中形式在MySQL 3.22.24或更新版本上不能工作。為了傳遞一個MYSQL* 參數，你必須使用unsigned int mysql_field_count(MYSQL *mysql)。

20.4.35.1 說明

在結果集合中返回列的數量。

注意，你也可以通過一個指向一個結果集合或一個連接句柄的指針獲得列的數量。如果mysql_store_result()或mysql_user_result()返回NULL，你將使用連接句柄（而這樣你沒有結果集合指針)。在這種情況下，你可以調用mysql_field_count()確定mysql_store_result()是否應該產生非空的結果。這允許客戶程式采取成正確的行動，不必知道查詢是否是一個SELECT（或類SELECT)語句。下面被顯示出的例子說明這怎麼可以被做。

見20.4.51 為什麼在mysql_query()返回成功後，mysql_store_result()有時返回NULL?。

20.4.35.2 返回值

表示一個結果集合中字段數量的一個無符號整數。

20.4.35.3 錯誤

無。

20.4.35.4 範例

MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;

if (mysql_query(&mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&mysql);
    if (result)  // there are rows
    {
        num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else  // mysql_store_result() returned nothing; should it have?
    {
        if (mysql_errno(&mysql))
    {
           fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
    }
        else if (mysql_field_count(&mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
    }
}

另一個選擇(如果你知道你查詢應該返回了一個結果結合)是用mysql_field_count(&mysql) = 0的一個檢查來代替mysql_errno(&mysql)。這只會發生在出錯了的情形。

20.4.36 mysql_num_rows()

my_ulonglong mysql_num_rows(MYSQL_RES *result)

20.4.36.1 說明

在結果集合中返回行的數量。

mysql_num_rows()的使用取決於你是否使用mysql_store_result()或mysql_use_result()返回一個結果集合。如果你使用mysql_store_result()，mysql_num_rows()可以馬上被調用。如果你使用mysql_use_result()，mysql_num_rows()將不會返回正確的值，直到在結果集合中的所有行均被檢索了。

20.4.36.2 返回值

在結果集合中行的數量。

20.4.36.3 錯誤

無。

20.4.37 mysql_options()

int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)

20.4.37.1 說明

能用於設置額外連接選項並且影響一個連接的行為。這個函數可以被多次調用來設置多個選項。

mysql_options()應該在mysql_init()之後和mysql_connect()或mysql_real_connect()之前調用。

option參數是你想要設置的選項﹔arg參數是選項的值。如果選項是一個整數，那麼arg應該指向整數值。

可能的選項值：

選項 | 參數類型 | 功能
MYSQL_OPT_CONNECT_TIMEOUT | unsigned int * | 以秒計的連接超時。
MYSQL_OPT_COMPRESS | 不使用 | 使用壓縮的客戶機/伺服器協議。
MYSQL_OPT_NAMED_PIPE | 不使用 | 使用命名管道連接一個在NT上的MySQL伺服器。
MYSQL_INIT_COMMAND | char * | 當連接MySQL伺服器時執行的命令。當重新連接時，將自動重新執行。
MYSQL_READ_DEFAULT_FILE | char * | 從命名的選項文件而不是從“my.cnf”讀取選項。
MYSQL_READ_DEFAULT_GROUP | char * | 從“my.cnf”或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名組中讀取選項。

注意，如果你使用MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP，總是讀取client。

在選項文件中指定的組可能包含下列選項：

compress | 使用壓縮的客戶機/伺服器協議。
database | 如果在連接命令中沒有指定資料庫，使用這個資料庫。
debug | 調試選項
host | 預設主機名
init-command | 在連接MySQL伺服器時，執行的命令。當重新連接時，將自動重新執行。
password | 預設密碼
pipe | 使用命名管道連接一個在NT上的MySQL伺服器。
port | 預設端口號
return-found-rows | 告訴mysql_info()返回找到的行，而不是在使用UPDATE時，返回更新的行。
socket | 預設套接字號
timeout | 以秒計的連接超時。
user | 預設用戶

對於選項文件的更多資訊，見4.15.4 選項文件。

20.4.37.2 返回值

成功，零。如果你使用了未知的選項，非零。

20.4.37.3 範例

MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

上例請求客戶使用壓縮的客戶機/伺服器協議並且從my.cnf文件的odbc小節讀取額外的選項。

20.4.38 mysql_ping()

int mysql_ping(MYSQL *mysql)

20.4.38.1 說明

檢查到伺服器的連接是否正在工作。如果它關閉了，自動嘗試一個再連接。

這個函數可被已經空閑很長時間的客戶使用，來檢查伺服器是否關閉了連接並且如有必要重新連接。

20.4.38.2 返回值

如果伺服器活著，零。如果出現一個錯誤，非零。

20.4.38.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.39 mysql_query()

int mysql_query(MYSQL *mysql, const char *query)

20.4.39.1 說明

執行指向空終止的字符串query的SQL查詢，查詢必須由一個單個的SQL語句組成。你不應該在語句後加上一個終止的分號(“﹔”)或\g。

mysql_query()不能被用於包含二進制數據的查詢﹔相反你應該使用mysql_real_query()。（二進制數據可能包含“\0”字符，而mysql_query()將解釋為查詢字符串的結束。）

20.4.39.2 返回值

如果查詢成功，零。如果出現一個錯誤，非零。

20.4.39.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
到伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.40 mysql_real_connect()

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)

20.4.40.1 說明

mysql_real_connect()試圖建立到運行host的一個MySQL資料庫引擎的一個連接。 mysql_real_connect()在你可以執行任何其他API函數之前必須成功地完成，除了mysql_get_client_info()。

參數指定如下：

  • 第一個參數應該是一個現存MYSQL結構的地址。在調用mysql_real_connect()之前，你必須調用mysql_init()初始化MYSQL結構。見下面的例子。
  • host值可以是一個主機名或一個IP地址。如果host是NULL或字符串"localhost"，假定是到本地主機的一個連接。如果OS支援套接字(Unix)或命名管道(Win32)，使用他們而不是TCP/IP與伺服器連接。
  • user參數包含用戶的MySQL登錄ID。如果user是NULL，假定是當前用戶。在Unix下，它是當前登錄名。在Windows ODBC下，必須明確地指定當前用戶名字。見16.4 怎樣填寫ODBC管理程式中各種域。
  • passwd參數為user包含密碼。如果passwd是NULL，只有在user表中對於有一個空白密碼字段的用戶的條目將被檢查一個匹配。這允許資料庫主管設置MySQL權限，使用戶獲得不同的密碼，取決於他們是否已經指定一個密碼。注意：不要試圖在調用mysql_real_connect()前加密密碼﹔密碼加密自動被客戶API處理。
  • db是資料庫名。如果db不是NULL，連接將預設資料庫設置為這個值。
  • 如果port不是0，值對於TCP/IP連接將用作端口號。注意host參數決定連接的類型。
  • 如果unix_socket不是NULL，字符串指定套接字或應該被使用的命名管道。注意host參數決定連接的類型。
  • client_flag值通常是0，但是在很特殊的情況下可以被設置為下列標誌的組合：
    標誌名字 | 意味著的標誌
    CLIENT_FOUND_ROWS | 返回找到的(匹配的)行數，不是受到影響的行數。
    CLIENT_NO_SCHEMA | 不允許db_name.tbl_name.col_name語法。這是為了ODBC﹔如果你使用該語法，導致語法分析器產生一個錯誤，它是為在一些ODBC程式捕捉錯誤是有用的。
    CLIENT_COMPRESS | 使用壓縮協議。
    CLIENT_ODBC | 客戶是一個ODBC客戶。這使mysqld變得對ODBC更友好。

20.4.40.2 返回值

如果連接成功，一個 MYSQL*連接句柄。如果連接失敗，NULL。對一個成功的連接，返回值與第一個參數值相同，除非你傳遞NULL給該參數。

20.4.40.3 錯誤

CR_CONN_HOST_ERROR
不能連接MySQL伺服器。
CR_CONNECTION_ERROR
不能連接本地MySQL伺服器。
CR_IPSOCK_ERROR
不能創建一個IP套接字。
CR_OUT_OF_MEMORY
內存溢出。
CR_SOCKET_CREATE_ERROR
不能創建一個Unix套接字。
CR_UNKNOWN_HOST
不能找到主機名的IP地址。
CR_VERSION_ERROR
由於試圖使用一個不同協議版本的一個客戶庫與一個伺服器連接導致的一個協議失配。如果你使用一個非常老的客戶庫連接一個沒有使用--old-protocol選項啟動的新伺服器，這就能發生。
CR_NAMEDPIPEOPEN_ERROR;
不能在 Win32 上創建一個命名管道。
CR_NAMEDPIPEWAIT_ERROR;
不能在 Win32 上等待一個命名管道。
CR_NAMEDPIPESETSTATE_ERROR;
不能在 Win32 上得到一個管道處理器。

20.4.40.4 範例

MYSQL mysql;

mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

20.4.41 mysql_real_query()

int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)

20.4.41.1 說明

執行由query指向的SQL查詢，它應該是一個length個字節的字符串。查詢必須由一個單個的SQL語句組成。你不應該在語句後增加一個終止的分號(“;”)或\g。

對於包含二進制數據的查詢，你必須使用mysql_real_query()而不是mysql_query()，因為二進制代碼數據可能包含“\0”字符，而且，mysql_real_query()比mysql_query()更快，因為它對查詢字符串調用strlen()。

20.4.41.2 返回值

如果查詢成功，零。如果發生一個錯誤，非零。

20.4.41.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.42 mysql_reload()

int mysql_reload(MYSQL *mysql)

20.4.42.1 說明

要求MySQL伺服器再次裝載授權表。連接的用戶必須擁有reload權限。

不推薦這個函數。最好使用mysql_query()發出一條SQL FLUSH PRIVILEGES語句。

20.4.42.2 返回值

成功，零。如果發生一個錯誤，非零。

20.4.42.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.43 mysql_row_seek()

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)

20.4.43.1 說明

設置行光標為在結果集合中的任意行。這要求結果集合結構包含查詢的全部結果，這樣mysql_row_seek()只能與mysql_store_result()一起使用，而不與mysql_use_result()。

偏移量應該是調用mysql_row_tell()或mysql_row_seek()返回的值。這個值不是簡單地一個行號﹔如果你想要在結果集合內用行號來尋找行，使用mysql_data_seek()。

20.4.43.2 返回值

行光標先前的值。該值可以被傳遞給隨後的mysql_row_seek()調用。

20.4.43.3 錯誤

無。

20.4.44 mysql_row_tell()

MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)

20.4.44.1 說明

返回為了mysql_fetch_row()的行光標的當前位置。這個值可以作為一個參數用於mysql_row_seek()。

你應該僅在mysql_store_result()後使用mysql_row_tell()，而不是在mysql_use_result()後。

20.4.44.2 返回值

行光標當前的偏移量。

20.4.44.3 錯誤

無。

20.4.45 mysql_select_db()

int mysql_select_db(MYSQL *mysql, const char *db)

20.4.45.1 說明

使得由db指定的資料庫成為 在由mysql指定的連接上的預設(當前)資料庫。在隨後的查詢中，這個資料庫對於不包括一個顯式的資料庫指定符的表的引用是預設資料庫。

除非連接的用戶能被認証允許使用資料庫，否則mysql_select_db()失敗。

20.4.45.2 返回值

成功，零。如果發生一個錯誤，非零。

20.4.45.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.46 mysql_shutdown()

int mysql_shutdown(MYSQL *mysql)

20.4.46.1 說明

讓資料庫伺服器關閉。連接的用戶必須有shutdown權限。

20.4.46.2 返回值

成功，零。如果出現一個錯誤，非零

20.4.46.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.47 mysql_stat()

char *mysql_stat(MYSQL *mysql)

20.4.47.1 說明

返回包含類似於由mysqladmin status命令提供的資訊的一個字符串。它包括正常運行的秒數和正在運行執行緒、問題、再次裝載和打開的表的數目。

20.4.47.2 返回值

描述伺服器狀態的一個字符串。如果出現一個錯誤，NULL。

20.4.47.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.48 mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)

20.4.48.1 說明

對於成功地檢索數據的每個詢問(SELECT、SHOW、DESCRIBE、EXPLAIN)，你必須調用mysql_store_result()或mysql_use_result()。

mysql_store_result()讀取一個到客戶的查詢的全部結果，分配一個MYSQL_RES結構，並且把結果放進這個結構中。

如果沒有行返回，返回一個空集合集合。（空結果集合不同於一個NULL返回值。）

一旦你調用了mysql_store_result()，你可以調用mysql_num_rows()找出結果集合中有多少行。

你能調用mysql_fetch_row()從結果集合中取出行，或mysql_row_seek()和mysql_row_tell()結果集合中獲得或設置當前的行位置。

一旦你用完結果集合，你必須調用mysql_free_result()。

見20.4.51 為什麼mysql_query()返回成功後，mysql_store_result()有時返回NULL?。

20.4.48.2 返回值

一個保存結果的MYSQL_RES結構。如果出現一個錯誤，NULL。

20.4.48.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_OUT_OF_MEMORY
內存溢出。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.49 mysql_thread_id()

unsigned long mysql_thread_id(MYSQL *mysql)

20.4.49.1 說明

返回當前連接的執行緒ID。這個值可用作mysql_kill()的一個參數以殺死執行緒。

如果失去連接並且你用mysql_ping()重新連接，執行緒ID將改變。這意味著你不應該為以後使用獲得執行緒ID並且儲存它，當你需要它時，你應該獲得它。

20.4.49.2 返回值

當前連接的執行緒 ID 。

20.4.49.3 錯誤

無。

20.4.50 mysql_use_result()

MYSQL_RES *mysql_use_result(MYSQL *mysql)

20.4.50.1 說明

對於成功地檢索數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN)，你必須調用mysql_store_result()或mysql_use_result()。

mysql_use_result()初始化一個結果集合的檢索，但不真正將結果集合讀入客戶，就像mysql_store_result()那樣。相反，必須通過調用mysql_fetch_row()單獨檢索出每一行，這直接從伺服器讀出結果而不在一個臨時表或本地緩衝區中儲存它，它比mysql_store_result()更快一點並且使用較少的內存。客戶將只為當前行和一個可能最大max_allowed_packet字節的通信緩衝區分配內存。

在另一方面，如果你在客戶端對每一行正在做很多的處理，或如果輸出被送到屏幕，用戶可以打一個^S（停止滾動)，你不應該使用mysql_use_result()。這將阻塞伺服器並且阻止另外的執行緒從數據被取出的任何表中更新數據。

當使用mysql_use_result()時，你必須執行mysql_fetch_row()直到返回一個NULL值，否則未取出的行將作為下一個查詢的結果集合一部分被返回。如果你忘記做這個，C API將給出錯誤Commands out of sync; You can't run this command now！

你不能在一個從mysql_use_result()返回的結果集合上使用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows()，你也不能發出另外的查詢直到mysql_use_result()完成。（然而，在你取出所有的行以後，mysql_num_rows()將精確地返回取出的行數。）

一旦你用完結果集合，你必須調用mysql_free_result()。

20.4.50.2 返回值

一個MYSQL_RES結果結構。 如果發生一個錯誤發生，NULL。

20.4.50.3 錯誤

CR_COMMANDS_OUT_OF_SYNC
命令以一個不適當的次序被執行。
CR_OUT_OF_MEMORY
內存溢出。
CR_SERVER_GONE_ERROR
MySQL伺服器關閉了。
CR_SERVER_LOST
對伺服器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發生一個未知的錯誤。

20.4.51 為什麼在mysql_query()返回成功後，mysql_store_result()有時返回NULL?

有可能在一個對mysql_query()成功的調用後，mysql_store_result()返回NULL。當這發生時，它意味著出現了下列條件之一：

  • 有一個malloc()失敗(例如，如果結果集合太大)。
  • 數據不能被讀取(發生在連接上的一個錯誤)。
  • 查詢沒有返回數據(例如，它是一個INSERT、UPDATE或DELETE)。

你總是可以通過調用mysql_field_count()檢查語句是否應該產生非空的結果。如果mysql_field_count()返回零，結果是空的並且最後一個查詢是不回值的一條語句(例如，一條INSERT或DELETE)。如果mysql_field_count()返回非零值，語句應該產生非空的結果。見對mysql_field_count()描述的一個例子。

你可以調用mysql_error()或mysql_errno()測試一個錯誤。

20.4.52 我能從查詢中得到什麼結果？

除了由查詢返回的結果集合外，你也能得到下列資訊：

  • 當執行一條INSERT、UPDATE或DELETE時，mysql_affected_rows()返回受到最後一個查詢影響的行數。一個例外是如果使用一條沒有WHERE子句的DELETE，表被截斷，它更快！在這種情況下，mysql_affected_rows()對於影響的記錄數量返回零。
  • mysql_num_rows()返回結果集合中的行數。用mysql_store_result()，一旦mysql_store_result()返回，就可以調用mysql_num_rows()。用mysql_use_result()，只有在你已經用mysql_fetch_row()取出了所有行後，才能調用mysql_num_rows()。
  • mysql_insert_id()返回由將一行插入一個具有AUTO_INCREMENT索引的表中的最後查詢產生的ID。見20.4.29 mysql_insert_id()。
  • 某些查詢(LOAD DATA INFILE ...、INSERT INTO ... SELECT ...、UPDATE)返回附加的資訊。結果由返mysql_info()返回。對其返回字符串的格式，見mysql_info()的描述。如果沒有附加的資訊，mysql_info()返回一個NULL指針。

20.4.53 我怎樣能得到最後插入的行的唯一ID？

如果你往包含一個具有AUTO_INCREMENT屬性的列的一張表中插入一個記錄，你能通過mysql_insert_id()函數獲得最近產生的ID。

你也可以通過在你傳遞給mysql_query()的一個查詢字符串中使用LAST_INSERT_ID()函數檢索出ID。

你可以執行下列代碼檢查是否使用一個AUTO_INCREMENT索引。這也檢查查詢是否是有一個AUTO_INCREMENT索引的一條INSERT：

if (mysql_error(&mysql)[0] == 0 &&
    mysql_num_fields(result) == 0 &&
    mysql_insert_id(&mysql) != 0)
{
    used_id = mysql_insert_id(&mysql);
}

最近產生的ID是在一個按連接的基礎上在伺服器上進行維護，它將不被其他客戶改變。如果你更新另外一個有非奇特(non-magic)值(即一個既不是NULL也不是0的值)的AUTO_INCREMENT列，它甚至將不被改變。

如果你想要使用為一張表產生的ID並且把它插入到第2張表，你可以使用像這樣的SQL語句：

INSERT INTO foo (auto,text)
    VALUES(NULL,'text');              # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

20.4.54 鏈接C API的問題

當與C API鏈接時，下列錯誤可能發生一些系統上：

gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnsl

Undefined        first referenced
 symbol          in file
floor            /usr/local/lib/mysql/libmysqlclient.a(password.o)
ld: fatal: Symbol referencing errors. No output written to client

如果它發生在你的系統上，你必須通過在編譯/鏈接命令行的最後增加-lm以包括數學庫。

20.4.55 怎樣制作一個執行緒安全的客戶

客戶“幾乎”是執行緒安全的。最大的問題是在從套接字讀取的“net.c”中的子程式不是中斷安全的(interruot-safe)。這樣做是這樣考慮的，即你可能想有你自己的報警來中斷一個長時間的讀取伺服器。

標準客戶庫沒有用執行緒選項來編譯。

為了獲得一個執行緒安全的客戶，使用-lmysys, -lstring和-ldbug庫和伺服器使用的net_serv.o。

當使用一個執行緒化的客戶時，你可以充分利用在“thr_alarm.c”文件中的函數。如果你正在使用來自mysys庫的函數，你唯一必須記住的是首先調用my_init()！

所有函數除了mysql_real_connect()目前是執行緒安全的。下列注意事項描述怎樣編譯一個執行緒安全的客戶庫並且以一種執行緒安全的方式使用它。（下面對mysql_real_connect()的注意事項實際上也適用於mysql_connect()，但是因為mysql_connect()不提倡使用，無論如何你應該使用mysql_real_connect()。）

為了使mysql_real_connect()是執行緒安全的，你必須用這個命令重新編譯客戶庫：

shell> CPPFLAGS=-DTHREAD_SAFE_CLIENT ./configure ...

當鏈接標準客戶時，你可能得到的某些因為未定義符號的錯誤，因為pthread庫沒有被預設地包括。

最終的“libmysqlclient.a”庫現在是執行緒安全的。它的含義是只要2個執行緒不同時查詢mysql_real_connect()返回的同一個連接句柄，客戶代碼是執行緒安全的﹔客戶機/伺服器協議在一個給定的連接上一次只允許一個請求。如果你想在同一個的連接上使用多個執行緒，你必須在mysql_query()和mysql_store_result()調用組合附近有一個mutex鎖定。一旦mysql_store_result()就緒，鎖可以被釋放並且其他執行緒可以查詢同一個連接。（換句話說，不同的執行緒能使用不同被mysql_store_result()創建的MYSQL_RES指針，只要他們使用適當的鎖定協議) 如果你用POSIX執行緒編程，你能使用pthread_mutex_lock()和pthread_mutex_unlock()建立並且釋放一個mutex鎖定。

如果你使用mysql_use_result()而不是mysql_store_result()，鎖定將需要包圍mysql_use_result()和mysql_fetch_row()的調用，然而，它確實對不使用mysql_use_result()執行緒客戶是最好的。

20.5 MySQL Perl API

本節記載了Perl DBI介面。以前的介面被稱為mysqlperl。因為DBI/DBD現在是推薦的Perl介面，mysqlperl是過時的並且不在這裡記載。

20.5.1 DBI與DBD::mysql

DBI是對於很多資料庫的一個通用介面。這意味著你能編寫一個腳本，不用改變就能工作於很多資料庫引擎。你需要為每種資料庫類型定義了的一個資料庫驅動程式(DBD)。對於MySQL，該驅動程式稱為DBD::mysql。

有關Perl5 DBI的更多資訊，請訪問DBI網頁並且閱讀文檔：

http://www.symbolstone.org/technology/perl/DBI/index.html

關於在Perl5定義的面向對像的編程(OOP)的更多資訊，參見Perl OOP頁：

http://language.perl.com/info/documentation.html

對於MySQL Perl支援的安裝指令在4.10 Perl安裝說明中給出。

20.5.2 DBI介面

可移植的DBI方法

connect | 建立到一個資料庫伺服器的連接
disconnect | 斷開資料庫伺服器的連接
prepare | 準備執行一個SQL語句
execute | 執行準備好的語句
do | 準備並執行一個SQL語句
quote | 加引號於要插入的字符串或BLOB值
fetchrow_array | 作為一個字段數組取出下一行
fetchrow_arrayref | 作為一個字段的引用數組取出下一行
fetchrow_hashref | 作為一個哈希表的引用取出下一行
fetchall_arrayref | 作為一個字段數組取出所有數據
finish | 完成一條語句並且讓系統釋放資源
rows | 返回受影響的行數
data_sources | 返回可在localhost上得到的資料庫的數組
ChopBlanks | 控制fetchrow_*方法是否剝去空格
NUM_OF_PARAMS | 在準備的語句中的占位（placeholder-參數）的數目
NULLABLE | 其列可以是NULL
trace | 執行調試跟蹤

MySQL特定的方法

insertid | 最後一個AUTO_INCREMENT值
is_blob | 該列是BLOB值
is_key | 該列是鍵
is_num | 該列是數字的
is_pri_key | 該列是主鍵
is_not_null | 該列不能是NULL，見NULLABLE。
length | 最大可能的列大小
max_length | 結果中實際上存在的最大列大小
NAME | 列名字
NUM_OF_FIELDS | 返回的字段數目
table | 在返回的集合中的表名
type | 所有的列類型

Perl方法在下一節更詳細地描述。用於方法返回值的變數有這些含義：

$dbh
資料庫句柄
$sth
語句句柄
$rc
返回代碼 (經常是一個狀態）
$rv
返回值 (經常是一個行數）

可移植DBI方法

connect($data_source, $username, $password)
使用connect方法使得一個資料庫連接到數據源。$data_source值應該以DBI:driver_name:開始。以DBD::mysql驅動程式使用connect的例子：
$dbh = DBI->connect("DBI:mysql:$database", $user, $password);
$dbh = DBI->connect("DBI:mysql:$database:$hostname",
                    $user, $password);
$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",
                    $user, $password);

如果用戶名或密碼未定義，DBI分別使用DBI_USER和DBI_PASS環境變數的值。如果你不指定主機名，它預設為'localhost'。如果你不指定一個端口號，它預設為MySQL的預設端口(3306)。對Msql-Mysql-modules版本1.2009，$data_source值允許某些修飾詞：

mysql_read_default_file=file_name
讀取作為一個選項文件的“filename”。有關選項文件的資訊，見4.15.4 選項文件。
mysql_read_default_group=group_name
當讀取選項文件時的預設組通常是[client]組。通過指定mysql_read_default_group選項，預設組變成[group_name]組。
mysql_compression=1
在客戶和伺服器之間使用壓縮通信(MySQL 3.22.3或以後)。
mysql_socket=/path/to/socket
指定用於與伺服器連接的Unix套接字的路徑名(MySQL 3.21.15或以後)。

可以給出多個修飾詞﹔每一個必須前置一個分號。例如，如果你想要避免在一個DBI腳本中硬編碼用戶名和密碼，你可以從用戶的“~/.my.cnf”選項文件中取出它們，而不是這樣編寫你的connect調用：

$dbh = DBI->connect("DBI:mysql:$database"
                . ";mysql_read_default_file=$ENV{HOME}/.my.cnf",
                $user, $password);

這個調用將讀取在選項文件中為[client]組而定義的選項。如果你想做同樣的事情，但是也使用未[perl]組指定的選項，你可以使用：

$dbh = DBI->connect("DBI:mysql:$database"
                . ";mysql_read_default_file=$ENV{HOME}/.my.cnf"
                . ";mysql_read_default_group=perl",
                $user, $password);
disconnect
disconnect方法從資料庫斷開資料庫句柄。它一般就在你從程式退出之前被調用。範例：
$rc = $dbh->disconnect;
prepare($statement)
準備一條由資料庫引擎執行的SQL語句並且返回語句句柄($sth)，你可以使用它調用execute方法。一般地你借助於prepare和execute來處理SELECT語句(和類SELECT語句，例如SHOW、DESCRIBE和EXPLAIN)。範例：
$sth = $dbh->prepare($statement)
    or die "Can't prepare $statement: $dbh->errstr\n";
execute
execute方法執行一個準備好的語句。對非SELECT語句，execute返回受影響的行數。如果沒有行受影響，execute返回"0E0"，Perl將它視作零而不是真。對於SELECT語句，execute只是在資料庫中啟動SQL查詢﹔你需要使用在下面描述的fetch_*方法之一檢索數據。範例：
$rv = $sth->execute
          or die "can't execute the query: $sth->errstr;
do($statement)
do方法準備並且執行一條SQL語句並且返回受影響的行數。如果沒有行受到影響，do返回"0E0"，Perl將它視為零而不是真。這個方法通常用於事先無法準備好(由於驅動程式的限制)或不需要執行多次(插入、刪除等等)的非SELECT語句。範例：
$rv = $dbh->do($statement)
        or die "Can't execute $statement: $dbh- >errstr\n";
quote($string)
quote方法被用來“轉義”包含在string中的任何特殊字符並增加所需的外部的引號。範例：
$sql = $dbh->quote($string)
fetchrow_array
這個方法取下一行數據並且作為一個字段值數組返回它。範例：
while(@row = $sth->fetchrow_array) {
        print qw($row[0]\t$row[1]\t$row[2]\n);
}
fetchrow_arrayref
這個方法取下一行數據並且作為一個對一個字段值數組的引用返回它。範例：
while($row_ref = $sth->fetchrow_arrayref) {
        print qw($row_ref->[0]\t$row_ref->[1]\t$row_ref->[2]\n);
}
fetchrow_hashref
這個方法取一行數據並且返回包含字段名/值對的一個哈希表的一個引用。這個方法不如使用上述數組引用那樣有效。範例：
while($hash_ref = $sth->fetchrow_hashref) {
        print qw($hash_ref->{firstname}\t$hash_ref->{lastname}\t\
                $hash_ref- > title}\n);
}
fetchall_arrayref
這個方法被用來獲得從SQL語句被返回的所有數據(行)。它返回一個數組的引用，該數組包含對每行的數組的引用。你用一個嵌套循環來存取或列印數據。範例：
my $table = $sth->fetchall_arrayref
                or die "$sth->errstr\n";
my($i, $j);
for $i ( 0 .. $#{$table} ) {
        for $j ( 0 .. $#{$table->[$i]} ) {
                print "$table->[$i][$j]\t";
        }
        print "\n";
}
finish
便名沒有更多的數據將從這個語句句柄取出。你調用這個方法釋放語句句柄和任何與它相關的系統資源。範例：
$rc = $sth->finish;
rows
返回由最後一條命令改變(更新、刪除等)的行數。這通常用在非SELECT的execute語句之後。範例：
$rv = $sth->rows;
NULLABLE
返回一個對一個布爾值數組的引用﹔對數組的每個成員，一個TRUE值表示該列可以包含NULL值。範例：
$null_possible = $sth->{NULLABLE};
NUM_OF_FIELDS
這個屬性表明由一條SELECT或SHOW FIELDS語句返回的字段數目。你可以用它檢查一條語句是否返回了結果：一個零值表明一個像INSERT、DELETE或UPDATE的非SELECT語句。範例：
$nr_of_fields = $sth->{NUM_OF_FIELDS};
data_sources($driver_name)
這個方法返回一個數組，它包含在主機'localhost'上的MySQL伺服器可得到的資料庫名。範例：
@dbs = DBI->data_sources("mysql");
ChopBlanks
這個屬性確定fetchrow_*方法是否將去掉返回值的頭和尾的空白。範例：
$sth->{'ChopBlanks'} =1;
trace($trace_level)

trace($trace_level, $trace_filename)
trace方法開啟或關閉跟蹤。當作為一個DBI類方法調用時，它影響對所有句柄的跟蹤。當作為一個資料庫或語句句柄方法調用時，它影響對給定句柄的跟蹤(和句柄的未來子孫)。設置$trace_level為2以提供詳細的蹤跡資訊，設置$trace_level為0以關閉跟蹤。蹤跡輸出預設地輸出到標準錯誤輸出。如果指定$trace_filename，文件以添加模式打開並且所有跟蹤的句柄的手被寫入該文件。範例：
DBI->trace(2);                # trace everything
DBI->trace(2,"/tmp/dbi.out"); # trace everything to /tmp/dbi.out
$dth->trace(2);               # trace this database handle
$sth->trace(2);               # trace this statement handle

你也可以通過設置DBI_TRACE環境變數開啟DBI跟蹤。將它設置為等價於調用DBI->(value)的數字值，將它設置為等價於調用DBI->(2,value)的路徑名。

MySQL特定的方法

下面顯示的方法是MySQL特定的並且不是DBI標準的部分。他們中有幾個現在不建議使用：is_blob、is_key、is_num、is_pri_key、is_not_null、length、max_length和table。這些已有DBI標準的另一種方法存在，他們在下面說明。

insertid
如果你使用MySQL的AUTO_INCREMENT功能，新的自動加1的值將儲存在這裡。範例：
$new_id = $sth->{insertid};

作為另一種選擇，你可以使用$dbh->{'mysql_insertid'}。

is_blob
返回一個對一個布爾值數組的引用﹔對數組的每個單元，一個TRUE值表明相應的列是一個BLOB。範例：
$keys = $sth->{is_blob};
is_key
返回一個對一個布爾值數組的引用﹔對數組的每個單元，一個TRUE值表明相應的列是鍵。範例：
$keys = $sth->{is_key};
is_num
返回一個對一個布爾值數組的引用﹔對數組的每個單元，一個TRUE值表明相應的列包含數字值。範例：
$keys = $sth->{is_key};
is_pri_key
返回一個對一個布爾值數組的引用﹔對數組的每個單元，一個TRUE值表明相應的列是主鍵。範例：
pri_keys = $sth->{is_pri_key};
is_not_null
返回一個對一個布爾值數組的引用﹔對數組的每個單元，一個FALSEE值表明該列可以包含NULL值。範例：
$not_nulls = $sth->{is_not_null};

is_not_null不建議使用﹔最好使用NULLABLE屬性(在上面描述了)，因為那是一個 DBI 標準。

length

max_length
這些方法的每個返回一個對列大小數組的引用。length數組指出每列可以有的最大可能的尺寸 (如在表描述中聲明的)。max_length數組指出在結果表中實際存在的最大尺寸。範例：
$lengths = $sth->{length};
$max_lengths = $sth->{max_length};
NAME
返回一個對一個列名數組的引用。範例：
$names = $sth->{NAME};
table
返回一個對一個表名數組的引用。範例：
$tables = $sth->{table};
type
返回一個對一個列類型數組的引用。範例：
$types = $sth->{type};

20.5.3 更多的DBI/DBD資訊

你可以使用perldoc命令得到更多的關於DBI的資訊。

perldoc DBI
perldoc DBI::FAQ
perldoc DBD::mysql

你也可以使用pod2man、pod2html等工具轉換到其他格式。

而且你當然可以在DBI網頁中找到最新的DBI資訊：

http://www.symbolstone.org/technology/perl/DBI/index.html

20.6 MySQL Eiffel包裝

MySQL Contrib目錄包含Michael Ravits編寫的一個Eiffel包裝程式。

你也能在這裡找到：http://www.netpedia.net/hosting/newplayer/

20.7 MySQL Java連接(JDBC)

有2個為MySQL支援的JDBC驅動程式(twz和mm驅動程式)。你可以在http://www.mysql.com/Contrib找到這些的一個拷貝。對於文檔，請教任何JDBC文檔和驅動程式本身擁有的針對MySQL特定功能的文檔。

20.8 MySQL PHP API

PHP是一個伺服器端、HTML嵌入式腳本語言，可以用來創建動態網頁。它包含對存取若干資料庫的支援，包括MySQL。PHP可以作為一個單獨的程式運行，或編譯為與Apache伺服器一起使用的一個模組。

分發和文檔可在PHP網站得到。

20.9 MySQL C++ APIs

在MySQL Contrib 目錄刈莃得到兩個API。

20.10 MySQL Python API

MySQL Contrib 目錄包含Joseph Skinner編寫的一個Python介面。

你也可以使用對iODBC的Python介面來存取一個MySQL伺服器。mxODBC

20.11 MySQL TCL API

TCL at binevolve。Contrib 目錄包含一個基於msqltcl 1.50的一個TCL介面。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊- 19 用MySQL解決一些常見問題

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

19 用MySQL解決一些常見問題

19.1 資料庫複製

一方面複製可以用來增加健壯性和速度。對健壯性，你有2個系統，而如果你出了問題，切換到備份即可。額外的速度通過把非更新查詢的一部分送到複製伺服器來達到。當然，這只在非更新查詢為主時有用，但是這正是一般的情形。

一方面複製計劃在不久的未來實現。這將被實現，使得從伺服器將以較低優先級的更新和延遲插入被同步到最新數據(這將給讀者以比寫者更高的優先級)。

MySQL(至今)沒有資料庫複製，但是有一些如何實現的資訊。

複製一個資料庫最一般的方法是使用更新日誌。見9.2 更新日誌。這要求充當一個主資料庫(進行數據改變的)並且另一個或多個充當從資料庫。要更新一個從資料庫，只要運行mysql < update_log。提供對於從資料庫適當的主機、用戶和密碼選項，並且將主資料庫的更新日誌作為輸入。

如果你從未從一張表中刪除任何東西，你可以使用一個TIMESTAMP列找出自上一次複製以來(通過比較作你上次做複製的時間）表中哪個行被插入和被改變，且僅拷貝這些行到鏡像中。

有可能使用更新日誌(對刪除)和時間戳記（在兩端）做成一個雙向更新系統統，但是在這種情況下，當同一數據在兩端被改變時，你必須能處理衝突。你可能想保持舊版本以幫助決定什麼被更新了。

因為在這種情況中複製用SQL語句進行，你不應該在更新資料庫的語句中使用下列函數﹔他們不能返回與原資料庫相同的值：

  • DATABASE()
  • GET_LOCK()和RELEASE_LOCK()
  • RAND()
  • USER(), SYSTEM_USER()或SESSION_USER()
  • VERSION()

所有的時間函數可安全地使用，比如如果需要，時間戳記被送到鏡像。LAST_INSERT_ID()也可安全地使用。

19.2 資料庫備份

因為MySQL表作為文件儲存，做一個備份是容易的。為了得到一個一致的備份，在相關的表上做一個LOCK TABLES。見7.24 LOCK TABLES/UNLOCK TABLES句法。你只需一個讀鎖定﹔當你在資料庫目錄中做文件的一個拷貝時，這允許其他執行緒繼續查詢該表。如果你想要做一個SQL級的備份，你可以SELECT INTO OUTFILE。

備份一個資料庫的另一個方法是使用mysqldump程式：

  1. 為你的資料庫做一個完整的備份：
    shell> mysqldump --tab=/path/to/some/dir --opt --full

    你也可以簡單地拷貝所有的表文件(“*.frm”、“*.MYD”和“*.MYI”文件)，只要伺服器不在更新任何東西。

  2. 停止mysqld如果它正在運行，然後以--log-update選項啟動它。你將得到一個名為“hostname.n”形式的日誌文件， 這裡n是隨著你每次執行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS語句、或重啟伺服器而遞增的一個數字。這些日誌文件向你提供了在你執行mysqldump處後面進行的複製資料庫改變的所需資訊。

如果你必須恢復一些東西，嘗試首先用myisamchk -r恢復你的表。這應該處理所有情況的99.9%。如果myisamchk失敗，嘗試下列程序：

  1. 恢復原來的mysqldump備份。
  2. 執行下列命令以再次運行更新日誌中的更改：
    shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql

ls被用來以正確的順序得到所有的日誌文件。

你也可以與SELECT * INTO OUTFILE 'file_name' FROM tbl_name做有選擇的備份並且用LOAD DATA INFILE 'file_name' REPLACE ...恢復。為了避免重複記錄，在表中你需要一個PRIMARY KEY或UNIQUE鍵。當在唯一鍵值上一個新記錄與一個老記錄重複時，REPLACE關鍵詞使得老記錄用一個新記錄替代。

19.3 在同一台機器上運行多個MySQL伺服器

有些情況下你可能想要在同一台機器上運行多個伺服器。例如，你可能想要測試一個新的MySQL版本而讓你現有生產系統的設置不受到干擾，或你可能是想要為不同的客戶提供獨立的MySQL安裝一個網際網路服務供應商。

如果你想要運行多個伺服器，最容易的方法是用不同的TCP/IP端口和套接字文件重新編譯伺服器，因此他們不是偵聽同一個TCP/IP端口或套接字。

假設一個現存伺服器配置為預設端口號和套接字文件，那麼用一個這樣的configure命令行設置新的伺服器：

shell> ./configure  --with-tcp-port=port_number \
             --with-unix-socket=file_name \
             --prefix=/usr/local/mysql-3.22.9

這裡port_number和file_name應該不同於預設端口號和套接字文件路徑名，而且--prefix值應該指定一個不同於現存的MySQL安裝所在的安裝目錄。

你可以用這個命令檢查由任何當前執行的MySQL所使用的套接字和端口：

shell> mysqladmin -h hostname --port=port_number variables

如果你有一個MySQL伺服器正運行在你使用了的端口上，你將得到MySQL的一些最重要的可配置變數的一張表，包括套接字名等。

你也應該編輯你機器的初始化腳本(可能是“mysql.server”)來啟動並殺死多個mysqld伺服器。

你不必重新編譯一個新MySQL伺服器，只要以一個不同的端口和套接字啟動即可。你可以通過指定在運行時safe_mysqld使用的選項來改變端口和套接字：

shell> /path/to/safe_mysqld --socket=file_name --port=port_number

如果你在與開啟日誌的另一個伺服器相同的一個資料庫目錄下運行新伺服器，你也應該用safe_mysqld的--log和--log-update選項來指定日誌文件的名字，否則，兩個伺服器可能正在試圖寫入同一個日誌文件。

警告：通常你決不應該有在同一個資料庫中更新數據的2個伺服器！如果你的OS不支援無故障(fault-free)的系統鎖定，這可能導致令人驚訝的事情發生！

如果你想要為第二個伺服器使用另一個資料庫目錄，你可以使用safe_mysqld的--datadir=path選項。

當你想要連接一個正在運行的使用一個不同於編譯進你的客戶程式中端口的MySQL伺服器時，你可以使用下列方法之一：

  • 以--host 'hostname' --port=port_numer或[--host localhost] --socket=file_name啟動客戶。
  • 在你的C或Perl程式中，當連接MySQL伺服器時，你可以給出端口和套接字參數。
  • 在你啟動客戶程式之前，設置MYSQL_UNIX_PORT和MYSQL_TCP_PORT環境變數，指向Unix套接字和TCP/IP的端口。如果你通常使用一個特定的套接字或端口，你應該將設置這些環境變數的命令放進你的“.login”文件中。見12.1 不同的 MySQL程式概述。
  • 在你的主目錄下的“.my.cnf”文件中指定預設套接字和TCP/IP端口。見4.15.4 選項文件。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-17 與一些常用程式一起使用MySQL

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

17 與一些常用程式一起使用MySQL

17.1 與Apache一起使用MySQL

貢獻者小節包括讓你從MySQL資料庫驗証你的用戶並且也讓你將你的日誌文件記載到一個MySQL表中的程式。見B 貢獻的程式。

你可以改變 Apache日誌格式以使它很容易被MySQL讀取，把下列行放進Apache配置文件中：

LogFormat \
        "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\",  \
        \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""

在MySQL中，現在你可以這樣做：

LOAD DATA INFILE '/local/access_log' INTO TABLE table_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-21 如何比較MySQL與其他資料庫

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

21 怎樣對比MySQL與其他資料庫

21.1 怎樣對比MySQL與mSQL

這一節由MySQL開發者編寫，因此應該理智地閱讀它，但是沒有我們聽說的事實錯誤。

對於所有支援的限制、函數和類型的一個列表，看crash-me網頁。

性能
對於速度的真實比較，請教不斷成熟的MySQL效能套件。見10.8 使用你自己的效能。因為沒有執行緒創建開銷、一個較小的語法分析器、較少功能和簡單的安全性，mSQL應該在下列方面更快些：
  • 執行重複的連接和斷開的測試，在每個連接期間運行一個非常簡單的查詢。
  • 有很少的列和鍵的插入很簡單的表的INSERT操作。
  • CREATE TABLE和DROP TABLE。
  • 在不是一個索引的一些東西上SELECT。（一個表掃描是很容易的。）

因為這些操作是如此簡單，當你有更高的啟動開銷時，很難在這些方面變得更好。在連接被建立以後，MySQL應該性能好一些。在另一方面，MySQL比mSQL（以及大多數其他的SQL實現)在下列方面更好些：

  • 複雜的SELECT操作。
  • 檢索較大的結果(MySQL有一個更好、更快並且更安全的協議)。
  • 有變長字符串的表，因為MySQL有更有效的並可在VARCHAR列上索引。
  • 有很多列的表的處理。
  • 由長記錄的表的處理。
  • 有很多許多表達式的SELECT。
  • 在大表上的SELECT。
  • 同時處理很多連接。MySQL充分是完全多執行緒化的，每個連接有它自己的執行緒，這意味著沒有執行緒必須等待另一個執行緒(除非一個執行緒正在修改一張表，另外的執行緒想要存取)在mSQL中，一旦一個連接被建立了，所有其它執行緒必須等到第一個執行緒完成，不管連接正在運行的查詢是短的或是長的。當第一個連接終止時，下一個才能工作，而此時所有其它執行緒再次等待，等等。
  • 聯結。如果你改變一個SELECT中的表的順序，mSQL可能變得異常地慢。在效能套件中，比MySQL要慢超過15000倍的時間。這是由於mSQL缺乏一個聯結最佳化器以便以最佳的順序排定表。然而，如果你把表按完全正確的順序放在mSQL2中並且WHERE是很簡單的並使用索引列，聯結將相對快些！見10.8 使用你自己的效能。
  • ORDER BY和GROUP BY。
  • DISTINCT。
  • 使用TEXT或BLOB列。
SQL功能
  • GROUP BY和HAVING。mSQL根本不支援GROUP BY。MySQL支援一個有兩個HAVING和下列函數： COUNT()、AVG()、MIN()、MAX()、SUM()和STD()的完整的GROUP BY。如果SELECT從一張表中檢索，沒有其他列被檢索並且沒有WHERE子句，COUNT(*)被最佳化以很快地返回。 MIN()和MAX()可以取字符串參數。
  • 帶計算的INSERT和UPDATE。MySQL能在一個INSERT或UPDATE中做計算。例如：
    mysql> UPDATE SET x=x*10+y WHERE x<20;
  • 別名。MySQL有列的別名。
  • 限制列名。在MySQL中，如果一個列名在用於查詢的表之間唯一的，你不必須使用完整的 合格者。
  • 帶函數的SELECT。MySQL有很多函數(太多不能在這裡列出﹔見7.4 用在SELECT和WHERE子句中的函數)。
磁碟空間效率
即，你能使你的表有多小？MySQL有很精確的類型，因此你可以創建占據很小空間的表。一個有用的MySQL數據類型的例子是MEDIUMINT，它是3個字節長。如果你有100,000,000個記錄，每個記錄節省甚至一個字節也是很重要的。mSQL2有一個較有限的列類型集合，因此更難於使表更小。
穩定性
這較難客觀地評價。對於MySQL穩定性的討論，見1.5 MySQL有多麼穩定？。我們沒有mSQL穩定性的經驗，因此我們對此不能說任何東西。
價格
另一個重要的問題是使用授權。MySQL有一個比mSQL更靈活的使用授權，並且也不比mSQL昂貴。無論你選擇使用哪個產品，記得要至少考慮支付一個使用授權或電子郵件支援的費用。（當然如果你把你出售的一個產品包括在MySQL中，你將被要求獲得一個使用授權。）
Perl介面
MySQL有與mSQL基本相同Perl介面，當有一些增加的功能。
JDBC ( Java ）
MySQL目前有4個JDBC驅動程式：
  • gwe 驅動程式：由GWE technologies 開發的一個Java介面(不再支援)。
  • jms 驅動程式：由Xiaokun Kelvin ZHU的開發的一個改進的gwe驅動程式。
  • twz 驅動程式：由Terrence W. Zellers 開發的一個type 4 JDBC驅動程式並用於學習目的。
  • mm 驅動程式：由Mark Matthews 開發的一個type 4 JDBC驅動程式。

推薦的驅動程式是twz或mm驅動程式。兩者均被報導工作出色。我們知道mSQL有一個 JDBC 驅動程式，但是我們對它有太少的經驗不能進行比較。

開發速度
MySQL有一個非常小的開發者黑郔，但是我們是非常習慣於用C和C++編碼，非常快速。因為執行緒、函數、GROUP BY等在mSQL中仍未實現，它有很多追趕工作要做。要想得到關於它的一些前景，你可以查看mSQL最後一年的 “HISTIRY”文件，並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史)。哪個快開發得最快應該是相當明顯的。
實用程式
mSQL和MySQL都有許多有趣的第三方工具。因為向上移植(從mSQL到MySQL)是很容易的，幾乎所有mSQL可用的有趣的應用程式也可被MySQL使用。MySQL帶有一個簡單的msql2mysql程式修正在mSQL和MySQL使用的大多數C API函數之間拼寫差別。例如，它將msqlConnect()實例改變為mysql_connect()。變換一個客戶程式從mSQL到MySQL通常花幾分鐘時間。

21.1.1 怎樣將mSQL的工具轉換到MySQL

根據我們的經驗，轉換諸如使用mSQL C API的msql-tcl和msqljava工具將只花不大一小時時間，使得他們用MySQL C API工作。

轉換程序是：

  1. 在原始程式上運行外殼腳本msql2mysql。這需要replace程式，它與MySQL一起散發。
  2. 編譯。
  3. 修正所有編譯器錯誤。

mSQL C API與MySQL C API 之間差別是：

  • MySQL使用一個MYSQL結構作為一種連接類型(mSQL使用一個int)。
  • mysql_connect()取一個指向一個MYSQL結構的指針作為一個參數。很容易定義全局性定義一個或使用malloc()獲得一個。mysql_connect()也取兩個參數指定用戶和密碼。你可以為了預設使用將這些設置為NULL,NULL。
  • mysql_error()取MYSQL結構作為一個參數。如果你正在移植老的代碼，只是把參數加到你的老的msql_error()編碼中。
  • MySQL對所有錯誤返回一個錯誤號和一條文本錯誤消息。mSQL僅返回一條文字錯誤消息。
  • 存在某些不兼容性，因為MySQL支援從同一個進程的到伺服器多個連接。

21.1.2 mSQL和MySQL的客戶機/伺服器通訊協議有何不同

有足夠的差別使得不可能(或至少不容易)支援兩者。

它MySQL協議不同於mSQL協議的最重要的方面列在下面：

  • 一個消息緩衝區可以包含很多結果行。
  • 如果查詢或結果比當前緩衝區大，消息緩衝區動態地被擴大，直到一個可配置的伺服器和客戶上限。
  • 所有的包被編號以捕捉重複或丟失的包。
  • 所有的列值以ASCII碼發送。列和行的長度以緊湊的二進制編碼(1、2或3個字節)發送。
  • MySQL能在未緩沖得結果中讀取(不必在客戶端儲存完整的集合)。
  • 如果一個單獨寫/讀花了超過30秒時間，伺服器關閉連接。
  • 如果一個連接空閑8個小時，伺服器關閉連接。

21.1.3 mSQL 2.0的SQL句法與MySQL有何不同

列類型

MySQL
有下列額外的類型(比較其他的﹔見7.7 CREATE TABLE句法)： 、
  • 對於一個字符串集中之一的ENUM類型。
  • 對於一個字符串集中多個的SET類型。
  • 對於64位整數的BIGINT類型。
MySQL也支援下列額外的類型屬性：
  • UNSIGNED選項。
  • 對於整數列的ZEROFILL選項。
  • 對於是一個PRIMARY KEY的整數列的AUTO_INCREMENT選項。見20.4.29 mysql_insert_id()。
  • 對所有列的DEFAULT值。
mSQL2
mSQL列類型對應於MySQL類型顯示在下面：
mSQL 類型 | 相應的MySQL類型
CHAR(len) | CHAR(len)
TEXT(len) | TEXT(len)，len是最大長度。並且LIKE可運用。
INT | INT，有很多的選項！
REAL | REAL，或FLOAT。有4和8字節版本。
UINT | INT UNSIGNED
DATE | DATE，使用 ANSI SQL 格式而非mSQL自己的。
TIME | TIME
MONEY | DECIMAL(12,2)，有2個小數位的定點值。

索引創建

MySQL
索引可以在表創建時用CREATE TABLE語句指定。
mSQL
在表被創建了以後，索引必須被創建，用單獨的CREATE INDEX語句。

把一個唯一標識符插入到一張表中

MySQL
使用AUTO_INCREMENT作為列類型修飾符。見20.4.29 mysql_insert_id()。
mSQL
在一張表上創建一個SEQUENCE並且選擇_seq列。

為行獲得一個唯一標識符

MySQL
向表中增加一個PRIMARY KEY或UNIQUE鍵。
mSQL
使用_rowid列。注意_rowid可以將來改變，取決於很多因素。

得到列最後被修改的時間

MySQL
在表中增加一個TIMESTAMP列。如果你不給出列值或如果你給它一個NULL值，該列自動為INSERT或UPDATE語句設置為當前的日期和時間。
mSQL
使用_timestamp列。

NULL值的比較

MySQL
MySQL遵從ANSI SQL且與NULL的比較總是NULL。
mSQL
在mSQL中，NULL = NULL是TRUE（真）。當從mSQL到MySQL移植老的代碼時，你必須將=NULL改委IS NULL，並將<>NULL改為IS NOT NULL。

字符串的比較

MySQL
通常，字符串比較以大小寫無關方式按當前字符集(預設為ISO-8859-1 Latin1)決定的排序次序實施。如果你不喜歡這樣，聲明你的列有BINARY屬性，它使得比較根據用在MySQL伺服器主機上的ASCII順序進行。
mSQL
所有的字符串比較以大小寫敏感的方式以ASCII順序排序來進行。

大小寫不敏感的搜索

MySQL
LIKE是一個大小寫不敏感或大小寫敏感的運算符，這取決於涉及的列。如果LIKE參數不以一個通配符字符開始，如有可能，MySQL則使用索引。
mSQL
使用CLIKE。

尾部空格的處理

MySQL
剝去CHAR和VARCHAR列尾部的空格。如果不希望這種行為，使用一個TEXT行列。
mSQL
保留尾部的空格。

WHERE子句

MySQL
MySQL正確地優先化任何東西(AND在OR前計算)。要想在MySQL裡得到mSQL的行為，使用括號(如下所示)。
mSQL
從左到右計算任何東西。這意味著超過3個參數的一些邏輯運算不能以任何方式表示，它也意味著當你升級到MySQL時，你必須改變一些查詢。你通過增加括號很容易做到這點。假定你有下列mSQL查詢：
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;

為了使MySQL像mSQL那樣計算它，你必須增加括號：

mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));

存取控制

MySQL
有表來儲存對每個用戶、主機和資料庫的授權(許可)選項。見6.6 權限系統如何工作。
mSQL
有一個文件“mSQL.acl”，在哪裡你能為用戶授權讀/寫權限。

21.2 怎樣對比MySQL與PostgreSQL

PostgreSQL有一些更高級的功能如定義用戶類型、觸發器、規則和一些事務支援。然而，PostgreSQL 缺乏很多來自 ANSI SQL和ODBC的很多標準類型和函數。對於一個完整的限制列表及其支援或不支援哪一個類型和函數，見crash-me網頁。

通常，PostgreSQL是比MySQL慢很多。見10.8 使用你自己的效能。這大部分是由於他們的事務系統。如果你確實需要事務或PostgreSQL提供的豐富的類型體系並且你能承受速度的損失，你應該看看 PostgreSQL。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL Reference Manual for version 3.23.7-alpha. - Concept Index

Go to the first, previous, next, last section, table of contents.

Concept Index

A

  • Adding native functions
  • Adding user-definable functions
  • Alias names, case sensitivity
  • Aliases, for expressions
  • Aliases, for tables
  • Aliases, in GROUP BY clauses
  • Aliases, in ORDER BY clauses
  • Aliases, on expressions
  • Anonymous user, Anonymous user, Anonymous user
  • ANSI SQL, differences from
  • Arithmetic expressions
  • AUTO_INCREMENT, and NULL values

    • B

  • Backups
  • Big5 Chinese character encoding
  • BLOB columns, default values
  • BLOB columns, indexing
  • BLOB, inserting binary data
  • Bug reports

    • C

  • C++ compiler cannot create executables
  • Case sensitivity, in access checking
  • Case sensitivity, in searches
  • Case sensitivity, in string comparisons
  • Case sensitivity, of alias names
  • Case sensitivity, of column names
  • Case sensitivity, of database names, Case sensitivity, of database names
  • Case sensitivity, of table names, Case sensitivity, of table names
  • Casts
  • cc1plus problems
  • Checking tables for errors
  • Chinese
  • Choosing table types
  • Choosing types
  • Choosing version
  • Client programs, building
  • Column names, case sensitivity
  • Command line history
  • Commands out of sync
  • Compatibility, between MySQL versions, Compatibility, between MySQL versions
  • Compatibility, with ANSI SQL
  • Compatibility, with mSQL
  • Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC, Compatibility, with ODBC
  • Compatibility, with Oracle, Compatibility, with Oracle, Compatibility, with Oracle
  • Compatibility, with PostgreSQL
  • Compatibility, with Sybase
  • Configuration files
  • configure, running after prior invocation
  • Constant table, Constant table
  • Contact information
  • Copyright
  • Costs, licensing and support

    • D

  • Database mirroring
  • Database names, case sensitivity, Database names, case sensitivity
  • Database replication, Database replication
  • Date and Time types
  • db table, sorting
  • DBI Perl module
  • Default options
  • Default values, BLOB and TEXT columns
  • Disk full
  • Downloading

    • E

  • Environment variables, Environment variables, Environment variables, Environment variables
  • Expression aliases
  • Expressions, aliases for

    • F

  • fatal signal 11
  • Foreign keys
  • FreeBSD troubleshooting
  • Full disk
  • Functions for SELECT and WHERE clauses
  • Functions, native, adding
  • Functions, user-definable, adding

    • G

  • Getting MySQL
  • Grant tables, sorting, Grant tables, sorting
  • GROUP BY, aliases in
  • Grouping of expressions

    • H

  • HEAP table type
  • History file
  • host table, sorting
  • How to pronounce MySQL

    • I

  • In memory tables
  • Indexes, Indexes
  • Indexes, and BLOB columns
  • Indexes, and IS NULL
  • Indexes, and LIKE
  • Indexes, and NULL values
  • Indexes, and TEXT columns
  • Indexes, leftmost prefix of
  • Indexes, multi-part
  • Internal compiler errors
  • ISAM table type

    • K

  • Keys
  • Keywords

    • L

  • Language support
  • Leftmost prefix of indexes
  • Licensing costs
  • Licensing policy
  • Licensing terms
  • Linking
  • Log file, names

    • M

  • make_binary_release
  • Manual information
  • Memory use
  • Mirroring, database
  • mSQL compatibility
  • msql2mysql
  • Multi-byte characters
  • Multi-part index
  • Multiple servers
  • MyISAM table type
  • myisamchk, myisamchk
  • myisampack, myisampack, myisampack, myisampack, myisampack
  • MyODBC
  • mysql
  • MySQL binary distribution
  • MySQL mailing lists
  • MySQL source distribution
  • MySQL version, MySQL version
  • MySQL, how to pronounce
  • MySQL, what it is
  • mysql_fix_privilege_tables
  • mysql_install_db
  • mysqlaccess
  • mysqladmin, mysqladmin, mysqladmin, mysqladmin, mysqladmin, mysqladmin
  • mysqlbug
  • mysqld
  • mysqldump, mysqldump
  • mysqlimport, mysqlimport, mysqlimport
  • mysqlshow

    • N

  • Native functions, adding
  • Net etiquette, Net etiquette
  • NULL values vs. empty values
  • NULL values, and indexes
  • NULL values, and AUTO_INCREMENT columns
  • NULL values, and TIMESTAMP columns

    • O

  • ODBC
  • ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility, ODBC compatibility
  • Optimization
  • Optimizations
  • Option files
  • Oracle compatibility, Oracle compatibility, Oracle compatibility
  • ORDER BY, aliases in

    • P

  • pack_isam
  • Password encryption, reversibility of
  • Passwords, setting, Passwords, setting, Passwords, setting, Passwords, setting
  • Payment information
  • Performance
  • PostgreSQL compatibility
  • Protocol mismatch

    • Q

  • Quoting
  • Quoting binary data
  • Quoting strings

    • R

  • RedHat Package Manager, RedHat Package Manager
  • References
  • Release numbers
  • replace
  • Replication
  • Replication, database, Replication, database
  • Reporting bugs
  • Reporting errors
  • Reserved words
  • Reserved words, exceptions
  • Row-level locking
  • RPM, RPM
  • Running configure after prior invocation

    • S

  • safe_mysqld
  • Scripts
  • Sequence emulation
  • Server functions
  • Size of tables
  • Solaris troubleshooting
  • Sorting, grant tables, Sorting, grant tables
  • sql_yacc.cc problems
  • Stability
  • Startup parameters
  • Storage requirements
  • String comparisons, case sensitivity
  • Strings
  • Strings, escaping characters
  • Strings, quoting
  • Support costs
  • Support terms
  • Support, types
  • Sybase compatibility
  • System table

    • T

  • Table aliases
  • Table cache
  • Table names, case sensitivity, Table names, case sensitivity
  • Table size
  • Table types
  • Table types, Choosing
  • Table, constant, Table, constant
  • Table, system
  • Tables, In memory
  • TEXT columns, default values
  • TEXT columns, indexing
  • The table is full, The table is full
  • TIMESTAMP, and NULL values
  • Timezone problems, Timezone problems, Timezone problems
  • TODO
  • Troubleshooting, FreeBSD
  • Troubleshooting, Solaris
  • Type conversions
  • Type portability
  • Types of support
  • Types, choosing
  • Types, Date and Time

    • U

  • Update log
  • user table, sorting
  • User-definable functions, adding

    • V

  • Version, choosing
  • Version, latest
  • Virtual memory problems while compiling

    • W

  • Which languages MySQL supports
  • Wildcards, and LIKE
  • Wildcards, in mysql.columns_priv table
  • Wildcards, in mysql.db table
  • Wildcards, in mysql.host table
  • Wildcards, in mysql.tables_priv table
  • Wildcards, in mysql.user table
  • Windows

    • Y

  • Year 2000 compliance
  • Year 2000 issues

    • Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - B Contributed programs

Go to the first, previous, next, last section, table of contents.

B Contributed programs

Many users of MySQL have contributed very useful support tools and addons.

A list of what is available at http://www.mysql.com/Contrib (or any mirror) is shown below. If you want to build MySQL support for the Perl DBI/DBD interface, you should fetch the Data-Dumper, DBI, and Msql-Mysql-modules files and install them. See section 4.10 Perl installation comments.

00-README This listing.

B.1 API's

  • Perl modules
    • Data-Dumper-2.09.tar.gz Perl Data-Dumper module. Useful with DBI/DBD support.
    • DBI-1.11.tar.gz Perl DBI module.
    • KAMXbase1.0.tar.gz Convert between `.dbf' files and MySQL tables. Perl module written by Pratap Pereira pereira@ee.eng.ohio-state.edu, extened by Kevin A. McGrail kmcgrail@digital1.peregrinehw.com. This converter can handle MEMO fields.
    • Msql-Mysql-modules-1.2209.tar.gz Perl DBD module to access mSQL and MySQL databases..
    • Data-ShowTable-3.3.tar.gz Perl Data-ShowTable module. Useful with DBI/DBD support.
  • JDBC
    • mm.mysql.jdbc-1.2b.tar.gz The mm JDBC driver for MySQL. This is a production release and is actively developed. By Mark Matthews (mmatthew@ecn.purdue.edu). This driver has a LGPL license. Please check http://www.worldserver.com/mm.mysql/ for the latest drivers (and other JDBC information) since this driver is not updated as frequently.
    • twz1jdbcForMysql-1.0.4-GA.tar.gz The twz driver: A type 4 JDBC driver by Terrence W. Zellers private and educational use.
  • mysql-c++-0.02.tar.gz MySQL C++ wrapper library. By Roland Haenel,
  • mysql++ MySQL C++ API (More than just a wrapper library). Originally by
  • mysql-ruby-2.1.6.tar.gz MySQL Ruby module. By TOMITA Masahiro tommy@tmtm.org Ruby is Object-Oriented Interpreter Language.
  • delphi-interface.gz Delphi interface to libmysql.dll, by Blestan Tabakov,
  • DelphiMySQL2.zip Delphi interface to libmysql.dll, by bsilva@umesd.k12.or.us
  • JdmMysqlDriver-0.1.0.tar.gz A VisualWorks 3.0 Smalltalk driver for MySQL. By
  • Db.py Python module with caching. By gandalf@rosmail.com.
  • MySQLmodule-1.4.tar.gz Python interface for the MySQL. By Joseph Skinner joe@earthlight.co.nz; Modified by Joerg Senekowitsch senekow@ibm.net
  • mysql_mex.tar.gz An interface program for the Matlab program by MathWorks.
  • mysqltcl-1.53.tar.gz Tcl interface for MySQL. Based on `msqltcl-1.50.tar.gz'. Updated by Tobias Ritzau, tobri@ida.liu.se.
  • MyC-0.1.tar.gz A Visual Basic-like API, by Ed Carp.
  • sqlscreens-1.0.1.tar.gz TCL/TK code to generate database screens. By Jean-Francois Dockes.
  • Vdb-dflts-2.1.tar.gz This is a new version of a set of library utilities intended to provide a generic interface to SQL database engines such that your application becomes a 3-tiered application. The advantage is that you can easily switch between and move to other database engines by implementing one file for the new backend without needing to make any changes to your applications. By damian@cablenet.net.
  • DbFramework-1.10.tar.gz DbFramework is a collection of classes for manipulating MySQL databases. The classes are loosely based on the CDIF Data Model Subject Area. By Paul Sharpe paul@miraclefish.com.
  • pike-mysql-1.4.tar.gz MySQL module for pike. For use with the Roxen web server.
  • squile.tar.gz Module for guile that allows guile to interact with SQL databases. By Hal Roberts.
  • stk-mysql.tar.gz Interface for Stk. Stk is the Tk widgets with Scheme underneath instead of Tcl. By Terry Jones
  • eiffel-wrapper-1.0.tar.gz. Eiffel wrapper by Michael Ravits.

B.2 Clients

  • Graphical clients
    • mysqlgui homepage The MySQL GUI client homepage. By Sinisa at TCX.
    • kmysqladmin-0.4.1.tar.gz
    • kmysqladmin-0.4.1-1.src.rpm
    • kmysqladmin-0.4.1-1.i386.rpm An administration tool for the MySQL server using QT / KDE. Tested only on Linux.
    • Java client using Swing By Fredy Fischer, se-afs@dial.eunet.ch. You can always find the latest version here.
    • mysqlwinadmn.zip Win32 GUI (binary only) to administrate a database, by David B. Mansel,
    • xmysqladmin-1.0.tar.gz A front end to the MySQL database engine. It allows reloads, status check, process control, myisamchk, grant/revoke privileges, creating databases, dropping databases, create, alter, browse and drop tables. Originally by Gilbert Therrien, gilbert@ican.net but now in public domain and supported by TcX.
    • xmysql-1.9.tar.gz
    • xmysql home page A front end to the MySQL database engine. It allows for simple queries and table maintenance, as well as batch queries. By Rick Mehalick, dblhack@wt.net. Requires xforms 0.88 to work.
    • dbMetrix An open source client for exploring databases and executing SQL. Supports MySQL, Oracle, PostgreSQL and mSQL.
    • GtkSQL A query tool for MySQL and PostgreSQL.
    • dbMan A query tool written in Perl. Uses DBI and Tk.
    • Atronic's MySQL client for Win32
  • Web clients
    • mysqladmin-atif-1.0.tar.gz WWW MySQL administrator for the user, db and host tables. By Tim Sailer, modified by Atif Ghaffar
    • mysql-webadmin-1.0a8-rz.tar.gz A tool written in PHP-FI to administrate MySQL databases remotely over the web within a Web-Browser. By Peter Kuppelwieser, Not maintained anymore!
    • mysqladm.tar.gz MySQL Web Database Administration written in Perl. By Tim Sailer.
    • mysqladm-2.tar.gz Updated version of `mysqladm.tar.gz', by High Tide.
    • billowmysql.zip Updated version of `mysqladm.tar.gz', by Ying Gao. You can get the newest version from the home site.
    • myadmin-0.4.tar.gz
    • MyAdmin home page A web based mysql administrator by Mike Machado.
    • phpMyAdmin_2.0.1.tar.gz A set of PHP3-scripts to adminstrate MySQL over the WWW.
    • phpMyAdmin home page A PHP3 tool in the spirit of mysql-webadmin, by Tobias Ratschiller, tobias@dnet.it
    • useradm.tar.gz MySQL administrator in PHP. By Ofni Thomas

B.3 Web tools

  • http://www.odbsoft.com/cook/sources.htm This package has various functions for generating html code from an SQL table structure and for generating SQL statements (Select, Insert, Update, Delete) from an html form. You can build a complete forms interface to an SQL database (query, add, update, delete) without any programming! By Marc Beneteau, marc@odbsoft.com.
  • sqlhtml.tar.gz SQL/HTML is an HTML database manager for MySQL using DBI 1.06.
  • udmsearch-2.2.1.tar.gz A MySQL- and PHP- based search engine over HTTP. By Alexander I. Barkov bar@izhcom.ru.
  • wmtcl.doc
  • wmtcl.lex With this you can write HTML files with inclusions of TCL code. By
  • www-sql-0.5.7.lsm
  • www-sql-0.5.7.tar.gz A CGI program that parses an HTML file containing special tags, parses them and inserts data from a MySQL database.
  • genquery.zip Perl SQL database interface package for html.
  • cgi++-0.2.tar.gz A CGI wrapper by Sasha Pachev.
  • WebBoard 1.0 EU-Industries Internet-Message-Board.
  • DBIx-TextIndex-0.02.tar.gz Full-text searching with Perl on BLOB/TEXT columns by Daniel Koch.

B.4 Authentication tools

  • ascend-radius-mysql-0.6.1.patch.gz This is authentication and logging patch using MySQL for Ascend-Radius. By takeshi@SoftAgency.co.jp.
  • icradius 0.10 icradius readme file
  • checkpassword-0.81-mysql-0.5.1.patch.gz MySQL authentication patch for QMAIL and checkpassword. These are useful for management user(mail,pop account) by MySQL. By takeshi@SoftAgency.co.jp
  • jradius-diff.gz MySQL support for Livingston's Radius 2.01. Authentication and Accounting. By Jose de Leon, jdl@thevision.net
  • mod_auth_mysql-2.20.tar.gz Apache authentication module for MySQL. By Zeev Suraski, Please register this module at: http://bourbon.netvision.net.il/mysql/mod_auth_mysql/register.html. The registering information is only used for statistical purposes and will encourage further development of this module!
  • mod_log_mysql-1.05.tar.gz MySQL logging module for Apache. By Zeev Suraski,
  • mypasswd-2.0.tar.gz Extra for mod_auth_mysql. This is a little tool that allows you to add/change user records storing group and/or password entries in MySQL tables. By Harry Brueckner, brueckner@respublica.de.
  • mysql-passwd.README
  • mysql-passwd-1.2.tar.gz Extra for mod_auth_mysql. This is a two-part system for use with mod_auth_mysql.
  • pam_mysql.tar.gz This module authenticates users via pam, using MySQL.
  • nsapi_auth_mysql.tar Netscape Web Server API (NSAPI) functions to authenticate (BASIC) users against MySQL tables. By Yuan John Jiang.
  • qmail-1.03-mysql-0.4.1.patch.gz Patch for qmail to authenticate users from a MySQL table.
  • pwcheck_mysql-0.1.tar.gz An authentication module for the Cyrus IMAP server. By Aaron Newsome.

B.5 Converters

  • dbf2mysql-1.13.tgz Convert between `.dbf' files and MySQL tables. By Maarten Boekhold, boekhold@cindy.et.tudelft.nl, and Michael Widenius. This converter can't handle MEMO fields.
  • dbf2mysql.zip Convert between FoxPro `.dbf' files and MySQL tables on Win32. By Alexander Eltsyn, ae@nica.ru or ae@usa.net.
  • dump2h-1.20.gz Convert from mysqldump output to a C header file. By Harry Brueckner,
  • exportsql.txt A script that is similar to access_to_mysql.txt, except that this one is fully configurable, has better type conversion (including detection of TIMESTAMP fields), provides warnings and suggestions while converting, quotes all special characters in text and binary data, and so on. It will also convert to mSQL v1 and v2, and is free of charge for anyone. See http://www.cynergi.net/prod/exportsql/ for latest version. By Pedro Freire, support@cynergi.net. Note: Doesn't work with Access2!
  • access_to_mysql.txt Paste this function into an Access module of a database which has the tables you want to export. See also exportsql. By Brian Andrews. Note: Doesn't work with Access2!
  • importsql.txt A script that does the exact reverse of exportsql.txt. That is, it imports data from MySQL into an Access database via ODBC. This is very handy when combined with exportSQL, since it lets you use Access for all DB design and administration, and synchronize with your actual MySQL server either way. Free of charge. See http://www.netdive.com/freebies/importsql/ for any updates. Created by Laurent Bossavit of NetDIVE. Note: Doesn't work with Access2!
  • /msql2mysqlWrapper 1.0 A C wrapper from mSQL to MySQL. By alfred@sb.net
  • sqlconv.pl A simple script that can be used to copy fields from one MySQL table to another in bulk. Basically, you can run mysqldump and pipe it to the sqlconv.pl script and the script will parse through the mysqldump output and will rearrange the fields so they can be inserted into a new table. An example is when you want to create a new table for a different site you are working on, but the table is just a bit different (ie - fields in different order, etc.). By Steve Shreeve.

B.6 Using MySQL with other products

  • emacs-sql-mode.tar.gz Raw port of a SQL mode for XEmacs. Supports completion. Original by Peter D. Pezaris pez@atlantic2.sbi.com and partial MySQL port by David Axmark.
  • MyAccess.mda MyAccess is an AddIn for Access 97 and handles a lot of maintanance work for MySQL databases. MyAccess-readme. By Hubertus Hiden.
  • radius-0.3.tar.gz Patches for radiusd to make it support MySQL. By Wim Bonis,

B.7 Useful tools

  • mysql_watchdog.pl Monitor the MySQL daemon for possible lockups. By Yermo Lamers,
  • mysqltop.tar.gz Sends a query in a fixed time interval to the server and shows the resulting table. By Thomas Wana.
  • mysql_structure_dumper.tar.gz Prints out the structure of the all tables in a database. By Thomas Wana.
  • structure_dumper.tgz Prints the structure of every table in a database. By Thomas Wana.
  • mysqlsync-1.0-alpha.tar.gz. A perl script to keep remote copies of a MySQL database in sync with a central master copy. By Mark Jeftovic. markjr@easydns.com
  • MySQLTutor. MySQLTutor. A tutor of MySQL for beginners
  • MySQLDB.zip A COM library for MySQL by Alok Singh.
  • MySQLDB-readme.html
  • mysql_replicate.pl Perl program that handles replication. By mjs@atnet.net.au
  • DBIx-TextIndex-0.02.tar.gz Perl program that uses reverse indexing to handle text searching. By Daniel Koch.

B.8 Uncategorized

  • findres.pl Find reserved words in tables. By Nem W Schlecht.
  • handicap.tar.gz Performance handicapping system for yachts. Uses PHP. By
  • hylalog-1.0.tar.gz Store hylafax outgoing faxes in a MySQL database. By Sinisa Milivojevic, sinisa@coresinc.com.
  • mrtg-mysql-1.0.tar.gz MySQL status plotting with MRTG, by Luuk de Boer, luuk@wxs.nl.
  • wuftpd-2.4.2.18-mysql_support.2.tar.gz Patches to add logging to MySQL for WU-ftpd. By Zeev Suraski,
  • Old-Versions Previous versions of things found here that you probably won't be interested in.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - C Contributors to MySQL

Go to the first, previous, next, last section, table of contents.

C Contributors to MySQL

Contributors to the MySQL distribution are listed below, in somewhat random order:

Michael (Monty) Widenius
Has written the following parts of MySQL:
  • All the main code in mysqld.
  • New functions for the string library.
  • Most of the mysys library.
  • The ISAM and MyISAM libraries (B-tree index file handlers with index compression and different record formats).
  • The heap library. A memory table system with our superior full dynamic hashing. In use since 1981 and published around 1984.
  • The replace program (look into it, it's COOL!).
  • MyODBC, the ODBC driver for Windows95.
  • Fixing bugs in MIT-pthreads to get it to work for MySQL. And also Unireg, a curses-based application tool with many utilities.
  • Porting of mSQL tools like msqlperl, DBD/DBI and DB2mysql.
  • Most parts of crash-me and the MySQL benchmarks.
David Axmark
  • Coordinator and main writer for the Reference Manual, including enhancements to texi2html. Also automatic website updating from this manual.
  • Autoconf, Automake and libtool support.
  • The licensing stuff.
  • Parts of all the text files. (Nowadays only the `README' is left. The rest ended up in the manual.)
  • Our Mail master.
  • Lots of testing of new features.
  • Our in-house ``free'' software lawyer.
  • Mailing list maintainer (who never has the time to do it right...)
  • Our original portability code (more than 10 years old now). Nowadays only some parts of mysys are left.
  • Someone for Monty to call in the middle of the night when he just got that new feature to work. :-)
Paul DuBois
Help with making the Reference Manual correct and understandable.
Gianmassimo Vigazzola qwerg@mbox.vol.it or qwerg@tin.it
The initial port to Win32/NT.
Kim Aldale
Rewriting Monty's and David's attempts at English into English.
Allan Larsson (The BOSS at TcX)
For all the time he has allowed Monty to spend on this ``maybe useful'' tool (MySQL). Dedicated user (and bug finder) of Unireg & MySQL.
Per Eric Olsson
For more or less constructive criticism and real testing of the dynamic record format.
Irena Pancirov irena@mail.yacc.it
Win32 port with Borland compiler.
David J. Hughes
For the effort to make a shareware SQL database. We at TcX started with mSQL, but found that it couldn't satisfy our purposes so instead we wrote a SQL interface to our application builder Unireg. mysqladmin and mysql are programs that were largely influenced by their mSQL counterparts. We have put a lot of effort into making the MySQL syntax a superset of mSQL. Many of the APIs ideas are borrowed from mSQL to make it easy to port free mSQL programs to MySQL. MySQL doesn't contain any code from mSQL. Two files in the distribution (`client/insert_test.c' and `client/select_test.c') are based on the corresponding (non-copyrighted) files in the mSQL distribution, but are modified as examples showing the changes necessary to convert code from mSQL to MySQL. (mSQL is copyrighted David J. Hughes.)
Fred Fish
For his excellent C debugging and trace library. Monty has made a number of smaller improvements to the library (speed and additional options).
Richard A. O'Keefe
For his public domain string library.
Henry Spencer
For his regex library, used in WHERE column REGEXP regexp.
Free Software Foundation
From whom we got an excellent compiler (gcc), the libc library (from which we have borrowed `strto.c' to get some code working in Linux) and the readline library (for the mysql client).
Free Software Foundation & The XEmacs development team
For a really great editor/environment used by almost everybody at TcX/detron.
Igor Romanenko igor@frog.kiev.ua
mysqldump (previously msqldump, but ported and enhanced by Monty).
Tim Bunce, Alligator Descartes
For the DBD (Perl) interface.
Andreas Koenig a.koenig@mind.de
For the Perl interface to MySQL.
Eugene Chan eugene@acenet.com.sg
For porting PHP to MySQL.
Michael J. Miller Jr. mke@terrapin.turbolift.com
For the first MySQL manual. And a lot of spelling/language fixes for the FAQ (that turned into the MySQL manual a long time ago).
Giovanni Maruzzelli maruzz@matrice.it
For porting iODBC (Unix ODBC).
Chris Provenzano
Portable user level pthreads. From the copyright: This product includes software developed by Chris Provenzano, the University of California, Berkeley, and contributors. We are currently using version 1_60_beta6 patched by Monty (see `mit-pthreads/Changes-mysql').
Xavier Leroy Xavier.Leroy@inria.fr
The author of LinuxThreads (used by MySQL on Linux).
Zarko Mocnik zarko.mocnik@dem.si
Sorting for Slovenian language and the `cset.tar.gz' module that makes it easier to add other character sets.
"TAMITO" tommy@valley.ne.jp
The _MB character set macros and the ujis and sjis character sets.
Yves Carlier Yves.Carlier@rug.ac.be
mysqlaccess, a program to show the access rights for a user.
Rhys Jones rhys@wales.com (And GWE Technologies Limited)
For the JDBC, a module to extract data from MySQL with a Java client.
Dr Xiaokun Kelvin ZHU X.Zhu@brad.ac.uk
Further development of the JDBC driver and other MySQL-related Java tools.
James Cooper pixel@organic.com
For setting up a searchable mailing list archive at his site.
Rick Mehalick Rick_Mehalick@i-o.com
For xmysql, a graphical X client for MySQL.
Doug Sisk sisk@wix.com
For providing RPM packages of MySQL for RedHat Linux.
Diemand Alexander V. axeld@vial.ethz.ch
For providing RPM packages of MySQL for RedHat Linux/Alpha.
Antoni Pamies Olive toni@readysoft.es
For providing RPM versions of a lot of MySQL clients for Intel and SPARC.
Jay Bloodworth jay@pathways.sde.state.sc.us
For providing RPM versions for MySQL 3.21 versions.
Jochen Wiedmann wiedmann@neckar-alb.de
For maintaining the Perl DBD::mysql module.
Therrien Gilbert gilbert@ican.net, Jean-Marc Pouyot jmp@scalaire.fr
French error messages.
Petr snajdr, snajdr@pvt.net
Czech error messages.
Jaroslaw Lewandowski jotel@itnet.com.pl
Polish error messages.
Miguel Angel Fernandez Roiz
Spanish error messages.
Roy-Magne Mo rmo@www.hivolda.no
Norwegian error messages and testing of 3.21.#.
Timur I. Bakeyev root@timur.tatarstan.ru
Russian error messages.
brenno@dewinter.com && Filippo Grassilli phil@hyppo.com
Italian error messages.
Dirk Munzinger dirk@trinity.saar.de
German error messages.
Billik Stefan billik@sun.uniag.sk
Slovak error messages.
David Sacerdote davids@secnet.com
Ideas for secure checking of DNS hostnames.
Wei-Jou Chen jou@nematic.ieo.nctu.edu.tw
Some support for Chinese(BIG5) characters.
Wei He hewei@mail.ied.ac.cn
A lot of functionality for the Chinese(GBK) character set.
Zeev Suraski bourbon@netvision.net.il
FROM_UNIXTIME() time formatting, ENCRYPT() functions, and bison adviser. Active mailing list member.
Luuk de Boer luuk@wxs.nl
Ported (and extended) the benchmark suite to DBI/DBD. Have been of great help with crash-me and running benchmarks. Some new date functions. The mysql_setpermissions script.
Jay Flaherty fty@utk.edu
Big parts of the Perl DBI/DBD section in the manual.
Paul Southworth pauls@etext.org, Ray Loyzaga yar@cs.su.oz.au
Proof-reading of the Reference Manual.
Alexis Mikhailov root@medinf.chuvashia.su
User definable functions (UDFs); CREATE FUNCTION and DROP FUNCTION.
Andreas F. Bobak bobak@relog.ch
The AGGREGATE extension to UDF functions.
Ross Wakelin R.Wakelin@march.co.uk
Help to set up InstallShield for MySQL-Win32.
Jethro Wright III jetman@li.net
The `libmysql.dll' library.
James Pereria jpereira@iafrica.com
Mysqlmanager, a Win32 GUI tool for administrating MySQL.
Curt Sampson cjs@portal.ca
Porting of MIT-pthreads to NetBSD/Alpha and NetBSD 1.3/i386.
Sinisa Milivojevic sinisa@coresinc.com
Compression (with zlib) to the client/server protocol. Perfect hashing for the lexical analyzer phase.
Antony T. Curtis antony.curtis@olcs.net
Porting of MySQL to OS/2.
Martin Ramsch m.ramsch@computer.org
Examples in the MySQL Tutorial.

Other contributors, bugfinders and testers: James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke, jehamby@lightside, psmith@BayNetworks.COM, Mike Simons, Jaakko Hyv@"atti.

And lots of bug report/patches from the folks on the mailing list.

And a big tribute to those that help us answer questions on the mysql@lists.mysql.com mailing list:

Daniel Koch dkoch@amcity.com
Irix setup.
Luuk de Boer luuk@wxs.nl
Benchmark questions.
Tim Sailer tps@users.buoy.com
DBD-mysql questions.
Boyd Lynn Gerber gerberb@zenez.com
SCO related questions.
Richard Mehalick RM186061@shellus.com
xmysql-releated questions and basic installation questions.
Zeev Suraski bourbon@netvision.net.il
Apache module configuration questions (log & auth), PHP-related questions, SQL syntax related questions and other general questions.
Francesc Guasch frankie@citel.upc.es
General questions.
Jonathan J Smith jsmith@wtp.net
Questions pertaining to OS-specifics with Linux, SQL syntax, and other things that might be needing some work.
David Sklar sklar@student.net
Using MySQL from PHP and Perl.
Alistair MacDonald A.MacDonald@uel.ac.uk
Not yet specified, but is flexible and can handle Linux and maybe HP-UX. Will try to get user to use mysqlbug.
John Lyon jlyon@imag.net
Questions about installing MySQL on Linux systems, using either `.rpm' files, or compiling from source.
Lorvid Ltd. lorvid@WOLFENET.com
Simple billing/license/support/copyright issues.
Patrick Sherrill patrick@coconet.com
ODBC and VisualC++ interface questions.
Randy Harmon rjharmon@uptimecomputers.com
DBD, Linux, some SQL syntax questions.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - SQL command, type and function index

Go to the first, previous, next, last section, table of contents.

SQL command, type and function index

  • ! (logical NOT)
  • != (not equal)
  • "
  • % (modulo)
  • % (wildcard character)
  • & (bitwise AND)
  • && (logical AND)
  • () (parentheses)
  • * (multiplication)
  • + (addition)
  • - (subtraction)
  • - (unary minus)
  • .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file, .my.cnf file
  • .mysql_history file
  • .pid (process ID) file
  • / (division)
  • /etc/passwd, /etc/passwd
  • < (less than)
  • << (left shift)
  • <= (less than or equal)
  • <=> (Equal to)
  • <> (not equal)
  • = (equal)
  • > (greater than)
  • >= (greater than or equal)
  • >> (right shift)
  • \" (double quote)
  • \' (single quote)
  • \0 (ASCII 0)
  • \\ (escape)
  • \b (backspace)
  • \n (newline)
  • \r (carriage return)
  • \t (tab)
  • _ (wildcard character)
  • `

    • A

  • ABS()
  • ACOS()
  • ADDDATE()
  • addition (+)
  • alias
  • ALTER TABLE
  • AND, bitwise
  • AND, logical
  • Arithmetic functions
  • ASCII()
  • ASIN()
  • ATAN()
  • ATAN2()
  • AUTO_INCREMENT, using with DBI
  • AVG()

    • B

  • backspace (\b)
  • BENCHMARK()
  • BETWEEN ... AND
  • BIGINT
  • BIN()
  • BINARY
  • Bit functions
  • BIT_AND()
  • BIT_COUNT()
  • BIT_OR()
  • BLOB, BLOB

    • C

  • carriage return (\r)
  • CASE
  • Casts
  • CC environment variable, CC environment variable
  • CEILING()
  • CFLAGS environment variable
  • CHAR, CHAR
  • CHAR VARYING
  • CHAR()
  • CHAR_LENGTH()
  • CHARACTER
  • CHARACTER VARYING
  • CHARACTER_LENGTH()
  • ChopBlanks DBI method
  • COALESCE()
  • Comment syntax
  • Comparison operators
  • CONCAT()
  • connect() DBI method
  • Control flow functions
  • CONV()
  • COS()
  • COT()
  • COUNT()
  • COUNT(DISTINCT)
  • CREATE DATABASE
  • CREATE FUNCTION
  • CREATE INDEX
  • CREATE TABLE
  • CROSS JOIN
  • CURDATE()
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • CURTIME()
  • CXX environment variable, CXX environment variable, CXX environment variable, CXX environment variable
  • CXXFLAGS environment variable, CXXFLAGS environment variable

    • D

  • data_sources() DBI method
  • DATABASE()
  • DATE, DATE
  • Date and time functions
  • DATE_ADD()
  • DATE_FORMAT()
  • DATE_SUB()
  • DATETIME, DATETIME
  • DAYNAME()
  • DAYOFMONTH()
  • DAYOFWEEK()
  • DAYOFYEAR()
  • DBI->connect()
  • DBI->data_sources()
  • DBI->disconnect
  • DBI->do()
  • DBI->execute
  • DBI->fetchall_arrayref
  • DBI->fetchrow_array
  • DBI->fetchrow_arrayref
  • DBI->fetchrow_hashref
  • DBI->finish
  • DBI->prepare()
  • DBI->quote
  • DBI->quote()
  • DBI->rows
  • DBI->trace, DBI->trace
  • DBI->{ChopBlanks}
  • DBI->{insertid}
  • DBI->{is_blob}
  • DBI->{is_key}
  • DBI->{is_not_null}
  • DBI->{is_num}
  • DBI->{is_pri_key}
  • DBI->{length}
  • DBI->{max_length}
  • DBI->{NAME}
  • DBI->{NULLABLE}
  • DBI->{NUM_OF_FIELDS}
  • DBI->{table}
  • DBI->{type}
  • DBI_TRACE environment variable, DBI_TRACE environment variable
  • DECIMAL
  • DECODE()
  • DEGREES()
  • DELAYED
  • DELETE
  • DESC
  • DESCRIBE
  • disconnect DBI method
  • DISTINCT, DISTINCT
  • division (/)
  • do() DBI method
  • DOUBLE
  • DOUBLE PRECISION
  • double quote (\")
  • DROP DATABASE
  • DROP FUNCTION
  • DROP INDEX
  • DROP TABLE
  • DUMPFILE

    • E

  • ELT()
  • ENCODE()
  • ENCRYPT()
  • ENUM, ENUM
  • Environment variable, CC, Environment variable, CC
  • Environment variable, CFLAGS
  • Environment variable, CXX, Environment variable, CXX, Environment variable, CXX
  • Environment variable, CXXFLAGS, Environment variable, CXXFLAGS
  • Environment variable, DBI_TRACE, Environment variable, DBI_TRACE
  • Environment variable, HOME
  • Environment variable, LD_RUN_PATH, Environment variable, LD_RUN_PATH, Environment variable, LD_RUN_PATH
  • Environment variable, MYSQL_DEBUG, Environment variable, MYSQL_DEBUG
  • Environment variable, MYSQL_HISTFILE
  • Environment variable, MYSQL_HOST
  • Environment variable, MYSQL_PWD, Environment variable, MYSQL_PWD
  • Environment variable, MYSQL_TCP_PORT, Environment variable, MYSQL_TCP_PORT, Environment variable, MYSQL_TCP_PORT
  • Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT, Environment variable, MYSQL_UNIX_PORT
  • Environment variable, PATH
  • Environment variable, TMPDIR
  • Environment variable, TZ, Environment variable, TZ, Environment variable, TZ
  • Environment variable, UMASK
  • Environment variable, USER
  • Environment variables, CXX
  • equal (=)
  • escape (\\)
  • execute DBI method
  • EXP()
  • EXPLAIN
  • EXPORT_SET()
  • EXTRACT(type FROM date)

    • F

  • fetchall_arrayref DBI method
  • fetchrow_array DBI method
  • fetchrow_arrayref DBI method
  • fetchrow_hashref DBI method
  • FIELD()
  • FILE
  • FIND_IN_SET()
  • finish DBI method
  • FLOAT, FLOAT
  • FLOAT(M,D)
  • FLOAT(precision), FLOAT(precision)
  • FLOAT(precision) [ZEROFILL]
  • FLOOR()
  • FLUSH
  • FORMAT()
  • FROM_DAYS()
  • FROM_UNIXTIME(), FROM_UNIXTIME()
  • Functions, arithmetic
  • Functions, bit
  • Functions, control flow
  • Functions, date and time
  • Functions, GROUP BY
  • Functions, logical
  • Functions, mathematical
  • Functions, miscellaneous
  • Functions, string
  • Functions, string comparison
  • Functions, user-defined

    • G

  • GET_LOCK()
  • GRANT
  • greater than (>)
  • greater than or equal (>=)
  • GREATEST()
  • GROUP BY functions

    • H

  • HEX()
  • Hexadecimal values
  • HOME environment variable
  • host.frm, problems finding
  • HOUR()

    • I

  • IF()
  • IFNULL()
  • IN
  • INNER JOIN
  • INSERT
  • INSERT DELAYED
  • INSERT()
  • insertid DBI method
  • INSTR()
  • INT
  • INTEGER
  • INTERVAL()
  • IS NOT NULL
  • IS NULL
  • IS NULL, and indexes
  • is_blob DBI method
  • is_key DBI method
  • is_not_null DBI method
  • is_num DBI method
  • is_pri_key DBI method
  • ISNULL()

    • J

  • JOIN

    • K

  • KILL

    • L

  • LAST_INSERT_ID()
  • LAST_INSERT_ID([expr])
  • LCASE()
  • LD_RUN_PATH environment variable, LD_RUN_PATH environment variable, LD_RUN_PATH environment variable
  • LEAST()
  • LEFT JOIN
  • LEFT OUTER JOIN
  • LEFT()
  • length DBI method
  • LENGTH()
  • less than (<)
  • less than or equal (<=)
  • LIKE
  • LIKE, and indexes
  • LIKE, and wildcards
  • LOAD DATA INFILE, LOAD DATA INFILE
  • LOCATE(), LOCATE()
  • LOCK TABLES
  • LOG()
  • LOG10()
  • Logical functions
  • LONGBLOB
  • LONGTEXT
  • LOWER()
  • LPAD()
  • LTRIM()

    • M

  • MAKE_SET()
  • Mathematical functions
  • MAX()
  • max_length DBI method
  • MD5()
  • MEDIUMBLOB
  • MEDIUMINT
  • MEDIUMTEXT
  • MID()
  • MIN()
  • minus, unary (-)
  • MINUTE()
  • Miscellaneous functions
  • MOD()
  • modulo (%)
  • MONTH()
  • MONTHNAME()
  • multiplication (*)
  • my_ulonglong C type
  • my_ulonglong values, printing
  • MYSQL C type
  • mysql_affected_rows()
  • mysql_change_user()
  • mysql_close()
  • mysql_connect()
  • mysql_create_db()
  • mysql_data_seek()
  • MYSQL_DEBUG environment variable, MYSQL_DEBUG environment variable
  • mysql_debug()
  • mysql_drop_db()
  • mysql_dump_debug_info()
  • mysql_eof()
  • mysql_errno()
  • mysql_error()
  • mysql_escape_string()
  • mysql_escape_string()
  • mysql_fetch_field()
  • mysql_fetch_field_direct()
  • mysql_fetch_fields()
  • mysql_fetch_lengths()
  • mysql_fetch_row()
  • MYSQL_FIELD C type
  • mysql_field_count(), mysql_field_count()
  • MYSQL_FIELD_OFFSET C type
  • mysql_field_seek()
  • mysql_field_tell()
  • mysql_free_result()
  • mysql_get_client_info()
  • mysql_get_host_info()
  • mysql_get_proto_info()
  • mysql_get_server_info()
  • MYSQL_HISTFILE environment variable
  • MYSQL_HOST environment variable
  • mysql_info(), mysql_info(), mysql_info(), mysql_info()
  • mysql_info()
  • mysql_init()
  • mysql_insert_id()
  • mysql_insert_id()
  • mysql_kill()
  • mysql_list_dbs()
  • mysql_list_fields()
  • mysql_list_processes()
  • mysql_list_tables()
  • mysql_num_fields()
  • mysql_num_rows()
  • mysql_options()
  • mysql_ping()
  • MYSQL_PWD environment variable, MYSQL_PWD environment variable
  • mysql_query()
  • mysql_real_connect()
  • mysql_real_query()
  • mysql_reload()
  • MYSQL_RES C type
  • MYSQL_ROW C type
  • mysql_row_seek()
  • mysql_row_tell()
  • mysql_select_db()
  • mysql_shutdown()
  • mysql_stat()
  • mysql_store_result()
  • MYSQL_TCP_PORT environment variable, MYSQL_TCP_PORT environment variable, MYSQL_TCP_PORT environment variable
  • mysql_thread_id()
  • MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable, MYSQL_UNIX_PORT environment variable
  • mysql_use_result()

    • N

  • NAME DBI method
  • NATIONAL CHAR
  • NATURAL LEFT JOIN
  • NATURAL LEFT OUTER JOIN
  • NCHAR
  • newline (\n)
  • not equal (!=)
  • not equal (<>)
  • NOT IN
  • NOT LIKE
  • NOT REGEXP
  • NOT, logical
  • NOW()
  • NUL
  • NULL
  • NULL value
  • NULLABLE DBI method
  • NUM_OF_FIELDS DBI method
  • NUMERIC

    • O

  • OCT()
  • OCTET_LENGTH()
  • OPTIMIZE TABLE
  • OR, bitwise
  • OR, logical
  • ORD()

    • P

  • parentheses ( and )
  • PASSWORD(), PASSWORD(), PASSWORD(), PASSWORD()
  • PATH environment variable
  • PERIOD_ADD()
  • PERIOD_DIFF()
  • PI()
  • POSITION()
  • POW()
  • POWER()
  • prepare() DBI method
  • PROCESSLIST

    • Q

  • QUARTER()
  • quote() DBI method
  • Quoting of identifiers

    • R

  • RADIANS()
  • RAND()
  • REAL
  • REGEXP
  • RELEASE_LOCK()
  • REPEAT()
  • REPLACE
  • REPLACE()
  • return (\r)
  • REVERSE()
  • REVOKE
  • RIGHT()
  • RLIKE
  • ROUND(), ROUND()
  • rows DBI method
  • RPAD()
  • RTRIM()

    • S

  • SEC_TO_TIME()
  • SECOND()
  • SELECT
  • SELECT, optimizing
  • SESSION_USER()
  • SET, SET
  • SET OPTION
  • SHOW COLUMNS
  • SHOW DATABASES
  • SHOW FIELDS
  • SHOW GRANTS
  • SHOW INDEX
  • SHOW KEYS
  • SHOW PROCESSLIST
  • SHOW STATUS
  • SHOW TABLE STATUS
  • SHOW TABLES
  • SHOW VARIABLES
  • SIGN()
  • SIN()
  • single quote (\')
  • SMALLINT
  • SOUNDEX()
  • SPACE()
  • SQRT()
  • STD()
  • STDDEV()
  • STRAIGHT_JOIN
  • STRCMP()
  • String comparison functions
  • String functions
  • SUBDATE()
  • SUBSTRING(), SUBSTRING()
  • SUBSTRING_INDEX()
  • subtraction (-)
  • SUM()
  • SYSDATE()
  • SYSTEM_USER()

    • T

  • tab (\t)
  • table DBI method
  • table_cache
  • TAN()
  • TEXT, TEXT
  • Threads
  • TIME, TIME
  • TIME_FORMAT()
  • TIME_TO_SEC()
  • TIMESTAMP, TIMESTAMP
  • TINYBLOB
  • TINYINT
  • TINYTEXT
  • TMPDIR environment variable
  • TO_DAYS()
  • trace DBI method, trace DBI method
  • TRIM()
  • TRUNCATE()
  • type DBI method
  • Types
  • TZ environment variable, TZ environment variable, TZ environment variable

    • U

  • UCASE()
  • UDF functions
  • ulimit
  • UMASK environment variable
  • unary minus (-)
  • UNIX_TIMESTAMP()
  • UNLOCK TABLES
  • UPDATE
  • UPPER()
  • USE
  • USER environment variable
  • USER()
  • User-defined functions

    • V

  • VARCHAR, VARCHAR
  • VERSION()

    • W

  • WEEK()
  • WEEKDAY()
  • Wildcard character (%)
  • Wildcard character (_)

    • Y

  • YEAR, YEAR
  • YEAR()
  • | (bitwise OR)
  • || (logical OR)
  • ~

    • Go to the first, previous, next, last section, table of contents.


MySQL中文參考手冊-13 維護 MySQL 安裝

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

13 維護MySQL安裝

13.1 使用myisamchk進行表的維護和崩潰恢復

為了檢查/修復MyISAM表(.MYI和.MYD)，你應該使用myisamchk實用程式。為了檢查/修復ISAM表(.ISM和.ISD)，你應該使用isamchk實用程式。見9.4 MySQL 桌子類型。

在下文中，我們將討論myisamchk，但是也適用於老的isamchk。

你可以使用myisamchk實用程式來獲得有關你的資料庫桌表的資訊、檢查和修復他們或最佳化他們。下列小節描述如何調用myisamchk（包括它的選項的描述)，如何建立一個表維護的時間表，並且如何使用myisamchk執行其各種功能。

如果你用--skip-locking運行mysqld（它在一些系統上是預設的，如Linux)，當mysqld正在使用同一個表時，你不能可靠地使用myisamchk檢查一張表。如果你能肯定在你運行myisamchk時沒有人通過mysqld正在存取表，在你開始檢查表之前，你僅需做mysqladmin flush-tables。如果你不能保証， 那麼當你檢查表時，你必須停掉mysqld。如果你在mysqld正在更新表時運行myisamchk，你可能得到一個表已破壞的警告，即使它沒有。

如果你沒使用--skip-locking，你能在任何時間使用myisamchk檢查表。當你這樣時，所有試圖更新表的客戶在繼續前將等到myisamchk就緒。

如果你使用myisamchk修復或最佳化表，你必須總是保証mysqld伺服器不在使用表(如果你正在使用--skip-locking，這也適用)。如果你不停掉mysqld，在你運行myisamchk前，你至少應該做一個mysqladmin flush-tables。

在大多數情況下，你也可使用命令OPTIMIZE TABLES最佳化並修復表，但是這不如myisamchk快或可靠(在真正的致命錯誤的情況下)。在另一方面，OPTIMIZE TABLE較易使用並且你不必須關心清空表。見7.9OPTIMIZE TABLE句法。

13.1.1 myisamchk調用語法

myisamchk這樣調用：

shell> myisamchk [options] tbl_name

options指定你想要myisamchk做什麼。他們在下面描述。（你也可以通過調用myisamchk --help得到一張選項表。) 沒有選項，myisamchk簡單地檢查你的表。為了得到更多的資訊或告訴myisamchk執行校正操作，指定在下面和下小節描述的選項擇。

tbl_name是你想要檢查的資料庫表。如果你不在資料庫目錄的某處運行myisamchk，你必須指定到文件的路徑，因為myisamchk不知道你的資料庫位於哪兒。實際上，myisamchk別在乎你正在操作的文件是否位於一個資料庫目錄﹔你可以拷貝對應於一張資料庫表的文件到別處並且在那裡執行恢復操作。

如果你願意，你可以myisamchk命令行命名幾個表。你也能指定一個名字作為一個索引文件(用“ .MYI”後綴)，它允許你通過使用模式“*.MYI”指定在一個目錄所有的表。例如，如果你在一個資料庫目錄，你可以這樣在目錄下檢查所有的表：

shell> myisamchk *.MYI

如果你不在資料庫目錄下，你可通過指定到目錄的路徑檢查所有在那裡的表：

shell> myisamchk /path/to/database_dir/*.MYI

你甚至可以通過為MySQL數據目錄的路徑指定一個通配符來檢查所有的資料庫中的所有表：

shell> myisamchk /path/to/datadir/*/*.MYI

myisamchk支援下列選項：

-a, --analyze
分析鍵值的分布。這通過讓聯結最佳化器更好地選擇表應該以什麼次序聯結和應該使用哪個鍵來改進聯結性能。
-#, --debug=debug_options
輸出調試記錄文件。debug_options字符串經常是'd:t:o,filename'。
-d, --description
列印出關於表的一些資訊。
-e, --extend-check
非常徹底地檢查表。這僅在歲N搊〞p下是必要的。通常，myisamchk應該找出所有錯誤，即使沒有改選項。
-f, --force
覆蓋老的臨時文件。如果你在檢查表時使用-f (運行myisamchk沒有-r)，myisamchk在檢查期間將自動為出現一個錯誤的表用-r重啟。
--help
顯示一條幫助消息並且退出。
-i, --information
列印有關被檢查的表的資訊統計。
-k #, --keys-used=#
與-r一起使用。告訴ISAM表處理器僅更新頭#個索引。較高編號的索引被撤銷。這能用來使插入變得更快！撤銷的索引能通過使用myisamchk -r被重新激活。
-l, --no-symlinks
在修復時，不跟隨符號連接。通常myisamchk修復一個符號連接所指的表。
-q, --quick
與-r一起使用使得一個修復更快。通常，原來的數據文件沒被接觸﹔你能指定第二個-q強制使用原來的數據文件。
-r, --recover
恢復模式。可以修復幾乎所有一切，除非唯一的鍵不是唯一。
-o, --safe-recover
恢復模式。使用一個老的恢復方法﹔這比-r慢些，但是能處理一-r不能處理的情況。
-O var=option, --set-variable var=option
設置一個變數的值。可能的變數列在下面。
-s, --silent
沉默模式。當錯誤發生時，僅寫輸出。你能使用-s兩次(-ss)非常沉默地做myisamchk。
-S, --sort-index
以從高到低的順序排序索引樹塊。這將最佳化搜尋並且將使按鍵值的表掃描更快。
-R index_num, --sort-records=index_num
根據一個索引排序記錄。這使你的數據更局部化並且可以加快在該鍵上的SELECT和ORDER BY的範圍搜索。（第一次做排序可能很慢！) 為了找出一張表的索引編號，使用SHOW INDEX，它以myisamchk看見他們的相同順序顯示一張表的索引。索引從1開始編號。
-u, --unpack
解開一個用myisampack壓縮的表。
-v, --verbose
冗長模式。列印更多的資訊。這能與-d和-e一起使用。為了更冗長，使用-v多次(-vv, -vvv)！
-V, --version
列印myisamchk版本並退出。
-w, --wait
如果表被鎖定，等待。

對--set-variable(-O)選項，可能的變數是：

key_buffer_size       當前值: 16776192
read_buffer_size      當前值: 262136
write_buffer_size     當前值: 262136
sort_buffer_size      當前值: 2097144
sort_key_blocks       當前值: 16
decode_bits           當前值: 9

13.1.2 myisamchk內存使用

當你運行myisamchk時，內存分配很重要。myisamchk使用不超過你用-O選項指定的內存量。如果你想在很大的文件上使用myisamchk，你首先應該確定你想要它使用多少內存。預設僅使用大約 3M 來修復。通過使用更大的值，你能使myisamchk更快地操作。例如，如果你有多於32M內存，你能使用例如這些選項(除了任何你可能指定的選項)：

shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...

使用-O sort=16M應該可能對大多數情形就足夠了。

必須明白，myisamchk使用在TMPDIR裡面的臨時文件。如果TMPDIR指向一個內存文件系統，你可能很容易得到內存溢出的錯誤。如果它發生，設定TMPDIR指向有更多空間的某個目錄並且重啟myisamchk。

13.2 建立一個資料庫表維護規範

在一個定期基礎而非等到問題出現才實施資料庫表的檢查是一個好主意。為維護目的，你能使用myisamchk -s檢查桌子。-s選項使myisamchk以沉默模式運行，當錯誤出現時，僅僅列印消息。

在伺服器啟動時檢查表是一個好主意。例如，無論何時機器在更新當中重新啟動了，你通常需要檢查所有可能被影響了的表。（這是一個“期望破壞了的表”) 如果重啟後有一個舊的“.pid”（進程ID)，你能為safe_mysqld加入一個測試，運行myisamchk檢查所有在過去24小時修改過的表)。（“.pid”文件在mysqld啟動時由它創建，並它正常終止時刪除。在系統啟動時存在一個“.pid”文件表明mysqld異常地終止了。）

一個更好的測試將是檢查任何表，它的最後修改時間是比“.pid”文件更新。

你也應該定期在正常系統操作期間檢查表。在TcX，我們運行一個cron任務，每周一次檢查我們所有重要的表，在一個“crontab”文件中使用這樣的行：

35 0 * * 0 /path/to/myisamchk -s /path/to/datadir/*/*.MYI

這列印出損壞的表的資訊，因此我們能檢驗並且在需要時修復他們。

當我們現在幾年(這確實是真的)都沒有任何意外損壞的表時(由於除硬件故障外的其他原因造成損壞的表)，每周一次對我們是足夠了。

我們建議現在開始，你對所有最後24小時內被更新了表每晚都執行myisamchk -s，直到你變得像我們那樣信任MySQL。

13.3 獲得關於一個表的資訊

為了獲得關於一個表的描述或統計，使用顯示在下面的命令。我們以後更詳細地解釋某些資訊。

myisamchk -d tbl_name
以“描述模式”運行myisamchk，產生你的表的描述。如果你用--skip-locking選項啟動MySQL伺服器，myisamchk可以當它運行時報告被一個更新的表的錯誤。然而，既然在描述模式中myisamchk不改變表，沒有破壞數據的任何風險。
myisamchk -d -v tbl_name
為了產生更多關於myisamchk正在做什麼的資訊，加上-v告訴它以冗長模式運行。
myisamchk -eis tbl_name
僅顯示一個表最重要的資訊。因為必須讀取整個表，它很慢。
myisamchk -eiv tbl_name
這類似-eis，只是告訴你正在做什麼。

myisamchk -d輸出的例子：

MyISAM file:     company.MYI
Record format:       Fixed length
Data records:           1403698  Deleted blocks:         0
Recordlength:               226

table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text

myisamchk -d -v輸出的例子：

MyISAM file:         company
Record format:       Fixed length
File-version:        1
Creation time:       1999-10-30 12:12:51
Recover time:        1999-10-31 19:13:01
Status:              checked
Data records:           1403698  Deleted blocks:              0
Datafile parts:         1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226

table description:
Key Start Len Index   Type                  Rec/key     Root Blocksize
1   2     8   unique  double                      1 15845376      1024
2   15    10  multip. text packed stripped        2 25062400      1024
3   219   8   multip. double                     73 40907776      1024
4   63    10  multip. text packed stripped        5 48097280      1024
5   167   2   multip. unsigned short           4840 55200768      1024
6   177   4   multip. unsigned long            1346 65145856      1024
7   155   4   multip. text                     4995 75090944      1024
8   138   4   multip. unsigned long              87 85036032      1024
9   177   4   multip. unsigned long             178 96481280      1024
    193   1           text

myisamchk -eis輸出的例子：

Checking MyISAM file: company
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966

myisamchk -eiv輸出的例子：

Checking MyISAM file: company
Data records: 1403698   Deleted blocks:       0
- check file-size
- check delete-chain
block_size 1024:
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
- check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
- check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%

- check records and index references
[LOTS OF ROW NUMBERS DELETED]

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798

這是對於用在上述例子中的表的數據大小和索引文件的大小：

-rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 company.MYD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.MYM

對myisamchk產生資訊的類型在下面解釋。“keyfile”是索引文件。“記錄”和“行”是同義詞。

ISAM file
ISAM(索引)文件名。
Isam-version
ISAM格式的版本。當前總是2。
Creation time
數據文件被創建的時間。
Recover time
索引/數據文件上次被重建的時間。
Data records
在表中有多少記錄。
Deleted blocks
有多少刪除的塊仍然保留著空間。你可以最佳化表以使這個空間減到最小。見13.4.3 表最佳化。
Datafile: Parts
對動態記錄格式，這指出有多少數據塊。對於一個沒有碎片的最佳化過的表，這與Data records相同。
Deleted data
不能回收的刪除數據有多少字節。你可以最佳化表以使這個空間減到最小。見13.4.3 表最佳化。
Datafile pointer
數據文件指針的大小，以字節計。它通常是2、3、4或5個字節。大多數表用2個字節管理，但是目前這還不能從MySQL控制。對固定表，這是一個記錄地址。對動態表，這是一個字節地址。
Keyfile pointer
索引文件指針的大小，以字節計。它通常是1、2或3個字節。大多數表用 2 個字節管理，但是它自動由MySQL計算。它總是一個塊地址。
Max datafile length
表的數據文件(.MYD文件)能夠有多長，以字節計。
Max keyfile length
表的關鍵字文件(.MYI文件)能夠有多長，以字節計。
Recordlength
每個記錄占多少空間，以字節計。
Record format
用於儲存表行的格式。上面的例子使用Fixed length。其他可能的值是Compressed和Packed.
table description
在表中所有鍵值的一張表。對每個鍵，給出一些底層的資訊：
Key
該鍵的編號。
Start
該索引部分從記錄的哪裡開始。
Len
該索引部分是多長。對於緊湊的數字，這應該總是列的全長。對字符串，它可以比索引的列的全長短些，因為你能索引字符串列的前綴。
Index
unique或multip（multiple)。表明一個值是否能在該索引中存在多次。
Type
這索引部分有什麼數據類型。這是一個packed、stripped或empty選項的 ISAM 數據類型。
Root
根索引塊的地址。
Blocksize
每個索引塊的大小。預設是1024，但是值可以在編譯時改變。
Rec/key
這是由最佳化器使用的統計值。它告訴對該鍵的每個值有多少條記錄。唯一鍵總是有一個1值。在一個表被裝載後(或改變很大)，這可以用myisamchk -a更新。如果這根本沒被更新，給定一個30的預設值。
在上面第一個例子中，第個9鍵是有2個部分的多部鍵。
Keyblocks used
鍵塊使用的百分比是什麼。因為在例子中使用的表只能用myisamchk被重新組織，值非常高(很接近理論上的最大值)。
Packed
MySQL試圖用一個公共後綴壓縮鍵。這只能被用於CHAR/VARCHAR/DECIMAL鍵。對長字符串如姓名，這能顯著地減少使用空間。在上面的第3個例子中，第4個鍵是10個字符長並且在空間上達到60%的縮減。
Max levels
對於該鍵的B樹有多深。有長鍵的大表有較高的值。
Records
表中有多少行。
M.recordlength
平均記錄長度。對於有定長記錄的表，這是準確的記錄長度。
Packed
MySQL從字符串的結尾去掉空格。Packed值表明這樣做達到的節約的百分比。
Recordspace used
數據文件被使用的百分比。
Empty space
數據文件未被使用的百分比。
Blocks/Record
每個記錄的平均塊數 (即，一個碎片記錄由多少個連接組成)。對固定格式表，這總是1。該值應該盡可能保持接近1.0。如果它變得太大，你可用myisamchk重新組織表。見13.4.3 表最佳化。
Recordblocks
多少塊(連接)被使用。對固定格式，它與記錄的個數相同。
Deleteblocks
多少塊(連接)被刪除。
Recorddata
在數據文件中使用了多少字節。
Deleted data
在數據文件中多少字節被刪除(未使用)。
Lost space
如果一個記錄被改為更短的長度，就損失了一些空間。這是所有這樣的損失之和，以字節計。
Linkdata
當使用動態表格式，記錄碎片用指針連接(每個4 ∼ 7字節)。 Linkdata被這樣的指針使用的內存量之和。

如果一張表已經用myisampack壓縮了，myisamchk -d列印每個表列的附加資訊。對於它的一個例子及其含義的描述，見12.5 MySQL壓縮只讀表產生器。

13.4 使用myisamchk進行崩潰恢復

由MySQL用來儲存數據的文件格式以已經被廣泛地測試過，但是總是有外部情況可以導致資料庫表被破壞：

  • mysqld進程在一個寫入當中被殺死。
  • 計算機的意外關閉(例如，如果計算機掉電）。
  • 一個硬件錯誤

這章描述如何檢查和處理在MySQL資料庫中的數據損壞。如果你的表損壞很多，你應該嘗試找出其原因！見G.1 調試一個MySQL伺服器。

在執行崩潰恢復時，理解在一個資料庫中的每一個表tbl_name對應的在資料庫目錄中的3個文件是很重要的：

文件 | 用途
“tbl_name.frm” | 表定義(表格)文件
“tbl_name.MYD” | 數據文件
“tbl_name.MYI” | 索引文件

這3個文件的每一個文件類型可能遭受不同形式的損壞，但是問題最常發生在數據文件和索引文件。

myisamchk通過一行一行地創建一個“.MYD”（數據 )文件的副本來工作，它通過由刪除老的“.MYD 文件並且重命名新文件到原來的文件名結束修復階段。如果你使用--quick，myisamchk不創建一個臨時“.MYD”文件，只是假定“.MYD”文件是正確的並且僅創建一個新的索引文件，不接觸“.MYD”文件，這是安全的，因為myisamchk自動檢測“.MYD”文件是否損壞並且在這種情況下，放棄修復。你也可以給myisamchk兩個--quick選項。在這種情況下，myisamchk不會在一些錯誤上(像重複鍵)放棄，相反試圖通過修改“.MYD”文件解決它們。通常，只有在你在太少的空閑磁碟空間上實施一個正常修復，使用兩個--quick選項才有用。在這種情況下，你應該至少在運行myisamchk前做一個備份。

13.4.1 怎樣檢查表的錯誤

為了檢查一張表，使用下列命令：

myisamchk tbl_name
這能找出所有錯誤的99.99%。它不能找出的是僅僅涉及數據文件的損壞(這很不常見)。如果你想要檢查一張表，你通常應該沒有選項地運行myisamchk或用-s或--silent選項的任何一個。
myisamchk -e tbl_name
它做一個完全徹底的數據檢查(-e意思是“擴展檢查”)。它對每一行做每個鍵的讀檢查以証實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在它發現第一個錯誤以後停止。如果你想要獲得更多的資訊，你能增加--verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中，一個簡單的myisamchk（沒有除表名以外的參數)就足夠了。
myisamchk -e -i tbl_name
像前面的命令一樣，但是-i選項告訴myisamchk還列印出一些統計資訊。

13.4.2 怎樣修復表

一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤：

  • “tbl_name.frm”被鎖定不能改變。
  • 不能找到文件“tbl_name.MYI”（Errcode ：### ）。
  • 從表處理器的得到錯誤###(此時，錯誤135是一個例外）。
  • 意外的文件結束。
  • 記錄文件被毀壞。

在這些情況下，你必須修復表。myisamchk通常能檢測並且修復出錯的大部分東西。

修復程序包含最多4個階段，在下面描述。在你開始前，你應該cd到資料庫目錄和檢查表文件的權限，確保他們可被運行mysqld的Unix用戶讀取(和你，因為你需要存取你正在檢查的文件)。如果它拒絕你修改文件，他們也必須是可被你寫入的。

階段1：檢查你的表

運行myisamchk *.MYI或(myisamchk -e *.MYI，如果你有更多的時間)。使用-s（沉默)選項禁止不必要的資訊。

你必須只修復那些myisamchk報告有一個錯誤的表。對這樣的表，繼續到階段2。

如果在檢查時，你得到奇怪的錯誤(例如out of memory錯誤)，或如果myisamchk崩潰，到階段3。

舞台 2 ：簡單安全的修復

首先，試試myisamchk -r -q tbl_name(-r -q意味著“快速恢復模式”)。這將試圖不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切和在數據文件指向正確地點的刪除連接，這應該管用並且表可被修復。開始修理下一張表。否則，使用下列程序：

  1. 在繼續前做數據文件的一個備份。
  2. 使用myisamchk -r tbl_name(-r意味著“恢復模式”)。這將從數據文件中刪除不正確的記錄和已被刪除的記錄並重建索引文件。
  3. 如果前面的步驟失敗，使用myisamchk --safe-recover tbl_name。安全恢復模式使用一個老的恢復方法，處理常規恢復模式不行的少數情況(但是更慢)。

如果在修復時，你得到奇怪的錯誤(例如out of memory錯誤)，或如果myisamchk崩潰，到階段3。

舞台 3 ：困難的修理

如果在索引文件的第一個16K塊被破壞，或包含不正確的資訊，或如果索引文件丟失，你只應該到這個階段 。在這種情況下，創建一個新的索引文件是必要的。按如下這樣做：

  1. 把數據文件移更安全的地方。
  2. 使用表描述文件創建新的(空)數據和索引文件：
    shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit
  3. 將老的數據文件拷貝到新創建的數據文件之中。（不要只是將老文件移回新文件之中﹔你要保留一個副本以防某些東西出錯。）

回到階段2。現在myisamchk -r -q應該工作了。（這不應該是一個無限循環)。

階段4：非常困難的修復

只有描述文件也破壞了，你才應該到達這個階段。這應該從未發生過，因為在表被創建以後，描述文件就不再改變了。

  1. 從一個備份恢復描述文件並且回到階段3。你也可以恢復索引文件並且回到階段2。對後者，你應該用myisamchk -r啟動。
  2. 如果你沒有一個備份但是確切地知道表是怎樣被創建的，在另一個資料庫中創建表的一個拷貝。刪除新的數據文件，然後從其他資料庫將描述和索引文件移到破壞的資料庫中。這給了你新的描述和索引文件，但是讓數據文件獨自留下來了。回到階段2並且嘗試重建索引文件。

13.4.3 表最佳化

為了組合成碎片的記錄並且消除由於刪除或更新記錄而浪費的空間， 以恢復模式運行myisamchk：

shell> myisamchk -r tbl_name

你可以用SQL的OPTIMIZE TABLE語句使用的相同方式來最佳化一張表，OPTIMIZE TABLE比較容易，但是myisamchk更快。也沒有在一個實用程式和伺服器之間不必要的交互可能性，因為當你使用OPTIMIZE TABLE時，伺服器做所有的工作。

myisamchk也有你可用來改進一個表的性能的很多其他選項：

-S, --sort-index

-R index_num, --sort-records=index_num

-a, --analyze

對於選項完整的描述見13.1.1 myisamchk調用語法。

13.5 日誌文件維護

當MySQL與日誌文件一起使用時，你有時想要刪除/備份舊的日誌文件並且告訴MySQL在新文件中開始記錄。見9.2 更新日誌。

在一個 Linux (Redhat)的安裝上，你可為此使用mysql-log-rotate腳本。如果你從RPM分發安裝MySQL，腳本應該自動被安裝了。

在其他系統上，你必須自己安裝一個短腳本，你可從cron啟動來處理日誌文件。

你可以通過使用mysqladmin flush-logs或SQL命令FLUSH LOGS來強制MySQL開始使用新的日誌文件。如果你正在使用MySQL 3.21，你必須使用mysqladmin refresh。

上面的命令做下列事情：

  • 如果使用標準日誌(--log)，關閉並重新打開日誌文件。(“ mysql.log”為預設)。
  • 如果使用更新日誌(--log-update)，關閉更新日誌並且重新打開有一個更高的順序閉編號的新日誌文件。

如果你只使用一個更新日誌，你只須清空日誌文件，然後移走舊的更新日誌文件到一個備份中。如果你使用一般的日誌，你可以這樣做：

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mysqladmin flush-tables

然後做一個備份並刪除“mysql.old”。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊- 11 MySQL效能套件

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

11 MySQL 效能套件

本章應該包含MySQL效能套件的技術描述(和crash-me)，但是該描述還沒被寫成。目前，你應該研究在分發中的“sql-bench”目錄下代碼和結果(當然在網頁http://www.mysql.com/crash-me-choose.htmy並且(通常發現了在MySQL分發的“sql-bench”目錄下找到))。

效能將告訴任何用戶一個給定的SQL實現在哪方面表現得很好或很糟糕。

注意，這個效能是單執行緒的，因此它測量操作的最小時間。

例如(在同一台NT 4.0機器上運行)：

通過索引讀取 2000000行（2百萬） | 秒數 | 秒數
mysql | 367 | 249
mysql_odbc | 464
db2_odbc | 1206
informix_odbc | 121126
ms-sql_odbc | 1634
oracle_odbc | 20800
solid_odbc | 877
sybase_odbc | 17614
插入(350768)行 | 秒數 | 秒數
mysql | 381 | 206
mysql_odbc | 619
db2_odbc | 3460
informix_odbc | 2692
ms-sql_odbc | 4012
oracle_odbc | 11291
solid_odbc | 1801
sybase_odbc | 4802

在上面的測試中MySQL用一個8M索引緩存運行。

注意，沒有包含Oracle，因為他們要求刪去。所有的 Oracle效能測試不得不被Oracle拿走！我們相信使Oracle效能測試很有偏見，因為上面的效能測試被假定來顯示可以能為一個單個客戶做一個標準安裝。

crash-me試圖確定一個資料庫支援什麼特徵並且實際運行的查詢有什麼能力和限制。例如，它確定：

  • 支援的什麼列類型
  • 支援多少索引
  • 支援什麼功能
  • 一個查詢能有多大
  • 一個VARCHAR列能有多大

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL Reference Manual for version 3.23.7-alpha. - D MySQL change history

Go to the first, previous, next, last section, table of contents.

D MySQL change history

Note that we tend to update the manual at the same time we implement new things to MySQL. If you find a version listed below that you can't find on the MySQL download page, this means that the version has not yet been released!

D.1 Changes in release 3.23.x (Released as alpha)

The major difference between release 3.23 and releases 3.22 and 3.21 is that 3.23 contains a new ISAM library (MyISAM), which is more tuned for SQL than the old ISAM was.

The 3.23 release is under development, and things will be added at a fast pace to it. For the moment we recommend this version only for users that desperately need a new feature that is found only in this release (like big file support and machine-independent tables). (Note that all new functionality in MySQL 3.23 is extensively tested, but as this release involves much new code, it's difficult to test everything). This version should start to stabilize as soon as we get subselects included in it.

D.1.1 Changes in release 3.23.7

  • Fixed workaround under Linux to avoid problems with pthread_mutex_timedwait, which is used with INSERT DELAYED. See section 4.11.5 Linux notes (all Linux versions)
  • Fixed tha one will get at 'disk full' error message if one gets disk full when doing sorting (instead of waiting until we got more disk space).
  • Fixed a bug in MyISAM with keys > 250 characters.
  • In MyISAM one can now do an INSERT at the same time as other threads are reading from the table.
  • Added variable max_write_lock_count to mysqld to force a READ lock after a certain number of WRITE locks.
  • Inverted flag delayed_key_write on show variables.
  • Renamed variable concurrency to thread_concurrency.
  • The following functions are now multi-byte-safe: LOCATE(substr,str), POSITION(substr
    IN str), LOCATE(substr,str,pos), INSTR(str,substr), LEFT(str,len),
    RIGHT(str,len), SUBSTRING(str,pos,len), SUBSTRING(str FROM
    pos FOR len), MID(str,pos,len), SUBSTRING(str,pos), SUBSTRING(str
    FROM pos), SUBSTRING_INDEX(str,delim,count), RTRIM(str), TRIM([[BOTH
    | TRAILING] [remstr] FROM] str), REPLACE(str,from_str,to_str), REVERSE(str),
    INSERT(str,pos,len,newstr), LCASE(str), LOWER(str),
    UCASE(str) and UPPER(str); Patch by Wei He.
  • Fix core dump when releasing a lock from a non existing table
  • Remove locks on tables before starting to remove duplicates.
  • Added option FULL to SHOW PROCESSLIST.
  • Added option --verbose to mysqladmin.
  • Fixed problem when automaticly converting HEAP to MyISAM.
  • Fixed bug in HEAP tables when doing insert + delete + insert + scan the table.
  • Fixed bugs on Alpha with REPLACE() and LOAD DATA INFILE.
  • Added mysqld variable interactive_timeout.
  • Changed the argument to mysql_data_seek() from ulong to ulonglong.

D.1.2 Changes in release 3.23.6

  • Added mysqld option -O lower_case_table_names={0|1} to allow users to force table names to lower case.
  • Added SELECT ... INTO DUMPFILE.
  • Added mysqld option --ansi to make some functions ANSI SQL compatible.
  • Temporary tables now starts with #sql.
  • Added quoting of identifiers with ` (" in --ansi mode).
  • Changed to use snprintf() when printing floats to avoid some buffer overflows on FREEBSD.
  • Made [floor() overflow safe on FREEBSD.
  • Added option --quote-names to mysqldump
  • Fixed bug that one could make a part of a PRIMARY KEY NOT NULL.
  • Fixed encrypt() to be thread safe and not reuse buffer.
  • Added mysql_odbc_escape_string() function to support big5 characters in MyOBC.
  • Rewrote the table handler to use classes. This introduces a lot of new code, but will make table handling faster and better...
  • Added patch by Sasha for user defined variables.
  • Changed that FLOAT and DOUBLE (without any length modifiers) are not anymore fixed decimal point numbers.
  • Changed the meaning of FLOAT(X): Now this is the same as FLOAT if X <= 24 and a DOUBLE if 24 < X <= 53.
  • DECIMAL(X) is now an alias for DECIMAL(X,0) and DECIMAL is now an alias for DECIMAL(10,0). The same goes for NUMERIC.
  • Added option ROW_FORMAT={default | dynamic | static | compressed} to CREATE_TABLE.
  • DELETE FROM table_name didn't work on temporary tables.
  • Changed function CHAR_LENGTH() to be multi-byte character safe.
  • Added function ORD(string).

D.1.3 Changes in release 3.23.5

  • Fixed some Y2K problems in the new date handling in 3.23.
  • Fixed problem with SELECT DISTINCT ... ORDER BY RAND().
  • Added patches by Sergei A. Golubchik for text searching on the MyISAM level.
  • Fixed cache overflow problem when using full joins without keys.
  • Fixed some configure issues.
  • Some small changes to make parsing faster.
  • ALTER TABLE + adding a column after the last field didn't work.
  • Fixed problem when using an auto_increment column in two keys
  • One can now with MyISAM have the auto_increment part as a sub part: CREATE TABLE foo (a int not null auto_increment, b char(5), primary key (b,a))
  • Fixed bug in MyISAM with packed char keys that could be NULL.
  • AS on fieldname with CREATE TABLE table_name SELECT ... didn't work.
  • Allow use of NATIONAL and NCHAR when defining character columns. This is the same as not using BINARY.
  • Don't allow NULL columns in a PRIMARY KEY (only in UNIQUE keys).
  • Clear LAST_INSERT_ID if in uses this in ODBC: WHERE auto_increment_column IS NULL. This seams to fix some problems with Access.
  • SET SQL_AUTO_IS_NULL=0|1 now turns off/on the handling of searching after the last inserted row with WHERE auto_increment_column IS NULL.
  • Added new mysqld variable concurrency for Solaris.
  • Added option --relative to mysqladmin to make extended-status more useful to monitor changes.
  • Fixed bug when using COUNT(DISTINCT..) on an empty table.
  • Added support for the Chinese character set GBK.
  • Fixed problem with LOAD DATA INFILE and BLOB columns.
  • Added bit operator ~ (negation).
  • Fixed problem with UDF functions.

D.1.4 Changes in release 3.23.4

  • Inserting a DATETIME into a TIME column will not anymore try to store 'days' in it.
  • Fixed problem with storage of float/double on low endian machines. (This affected SUM().)
  • Added connect timeout on TCP/IP connections.
  • Fixed problem with LIKE "%" on a index that may have NULL values.
  • REVOKE ALL PRIVILEGES didn't revoke all privileges.
  • Allow creation of temporary tables with same name as the original table.
  • When granting a user a grant option for a database, he couldn't grant privileges to other users.
  • New command: SHOW GRANTS FOR user (by Sinisa).
  • New date_add syntax: date/datetime + INTERVAL # interval_type. By Joshua Chamas.
  • Fixed privilege check for LOAD DATA REPLACE.
  • Automatic fixing of broken include files on Solaris 2.7
  • Some configure issues to fix problems with big file system detection.
  • REGEXP is now case insensitive if you use not binary strings.

D.1.5 Changes in release 3.23.3

    Added patches for MIT-pthreads on NetBSD.

  • Fixed range bug in MyISAM.
  • ASC is now the default again for ORDER BY.
  • Added LIMIT to UPDATE.
  • New client function: mysql_change_user().
  • Added character set to SHOW VARIABLES.
  • Added support of --[whitespace] comments.
  • Allow INSERT into tbl_name VALUES (), that is, you may now specify an empty value list to insert a row in which each column is set to its default value.
  • Changed SUBSTRING(text FROM pos) to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
  • SUM(..) with GROUP BY returned 0 on some systems.
  • Changed output for SHOW TABLE STATUS.
  • Added DELAY_KEY_WRITE option to CREATE TABLE.
  • Allow AUTO_INCREMENT on any key part.
  • Fixed problem with YEAR(NOW()) and YEAR(CURDATE()).
  • Added CASE construct.
  • New function COALESCE().

D.1.6 Changes in release 3.23.2

  • Fixed range optimizer bug: SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const). The bug was that some rows could be duplicated in the result.
  • Running myisamchk without -a updated the index distribution wrong.
  • SET SQL_LOW_PRIORITY_UPDATES=1 gave parse error before.
  • You can now update indexes columns that are used in the WHERE clause. UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100
  • Date handling should now be a bit faster.
  • Added handling of fuzzy dates (dates where day or month is 0): (Like: 1999-01-00)
  • Fixed optimization of SELECT ... WHERE key_part1=const1 AND key_part_2=const2 AND key_part1=const4 AND key_part2=const4 ; Indextype should be range instead of ref.
  • Fixed egcs 1.1.2 optimizer bug (when using BLOBs) on Linux Alpha.
  • Fixed problem with LOCK TABLES combined with DELETE FROM table.
  • MyISAM tables now allow keys on NULL and BLOB/TEXT columns.
  • The following join is now much faster: SELECT ... FROM t1 LEFT JOIN t2 ON ... WHERE t2.not_null_column IS NULL.
  • ORDER BY and GROUP BY can be done on functions.
  • Changed handling of 'const_item' to allow handling of ORDER BY RAND().
  • Indexes are now used for WHERE key_column = function.
  • Indexes are now used for WHERE key_column = column_name even if the columns are not identically packed.
  • Indexes are now used for WHERE column_name IS NULL.
  • Changed heap tables to be stored in low_byte_first order (to make it easy to convert to MyISAM tables)
  • Automatic change of HEAP temporary tables to MyISAM tables in case of 'table is full' errors.
  • Added option --init-file=file_name to mysqld.
  • COUNT(DISTINCT value,[value,...])
  • CREATE TEMPORARY TABLE now creates a temporary table, in its own namespace, that is automatically deleted if connection is dropped.
  • New keywords (required for CASE): CASE, THEN, WHEN, ELSE and END.
  • New functions EXPORT_SET() and MD5().
  • Support for the GB2312 Chinese character set.

D.1.7 Changes in release 3.23.1

  • Fixed some compilation problems.

D.1.8 Changes in release 3.23.0

    A new table handler library (MyISAM) with a lot of new features. See section 9.4 MySQL table types.

  • You can create in-memory HEAP tables which are extremely fast for lookups.
  • Support for big files (63 bit) on OSes that support big files.
  • New function LOAD_FILE(filename) to get the contents of a file as a string value.
  • New operator <=> which will act as = but will return TRUE if both arguments are NULL. This is useful for comparing changes between tables.
  • Added the ODBC 3.0 EXTRACT(interval FROM datetime) function.
  • Columns defined as FLOAT(X) is not rounded on storage and may be in scientific notation (1.0 E+10) when retrieved.
  • REPLACE is now faster than before.
  • Changed LIKE character comparison to behave as =; This means that 'e' LIKE ''e' is now true.
  • SHOW TABLE STATUS returns a lot of information about the tables.
  • Added LIKE to the SHOW STATUS command.
  • Added privilege column to SHOW COLUMNS.
  • Added columns packed and comment to SHOW INDEX.
  • Added comments to tables (with CREATE TABLE ... COMMENT "xxx").
  • Added UNIQUE, as in CREATE TABLE table_name (col int not null UNIQUE)
  • New create syntax: CREATE TABLE table_name SELECT ....
  • New create syntax: CREATE TABLE IF NOT EXISTS ...
  • Allow creation of CHAR(0) columns.
  • DATE_FORMAT() now requires `%' before any format character.
  • DELAYED is now a reserved word (sorry about that :( ).
  • An example procedure is added: analyse, file: `sql_analyse.c'. This will describe the data in your query. Try the following:
    SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])

    This procedure is extremely useful when you want to check the data in your table!

  • BINARY cast to force a string to be compared case sensitively.
  • Added option --skip-show-database to mysqld.
  • Check if a row has changed in an UPDATE now also works with BLOB/TEXT columns.
  • Added the INNER join syntax. NOTE: This made INNER an reserved word!
  • Added support for netmasks to the hostname in the MySQL tables. You can specify a netmask using the IP/NETMASK syntax.
  • If you compare a NOT NULL DATE/DATETIME column with IS NULL, this is changed to a compare against 0 to satisfy some ODBC applications. (By shreeve@uci.edu).
  • NULL IN (...) now returns NULL instead of 0. This will ensure that null_column NOT IN (...) doesn't match NULL values.
  • Fix storage of floating point values in TIME columns.
  • Changed parsing of TIME strings to be more strict. Now the fractional second part is detected (and currently skipped). The following formats are supported:
    [[DAYS] [H]H:]MM:]SS[.fraction]

    [[[[[H]H]H]H]MM]SS[.fraction]

  • Detect (and ignore) second fraction part from DATETIME.
  • Added the LOW_PRIORITY attribute to LOAD DATA INFILE.
  • The default index name now uses the same case as the used column name.
  • Changed default number of connections to 100.
  • Use bigger buffers when using LOAD DATA INFILE.
  • DECIMAL(x,y) now works according to ANSI SQL.
  • Added aggregate UDF functions. Thanks to Andreas F. Bobak
  • LAST_INSERT_ID() is now updated for INSERT INTO ... SELECT.
  • Some small changes to the join table optimizer to make some joins faster.
  • SELECT DISTINCT is much faster; It uses the new UNIQUE functionality in MyISAM. One difference compared to MySQL 3.22 is that the output of DISTINCT is not sorted anymore.
  • All C client API macros are now functions to make shared libraries more reliable. Because of this, you can no longer call mysql_num_fields() on a MYSQL object, you must use mysql_field_count() instead.
  • Added use of LIBEWRAP; Patch by Henning P . Schmiedehausen.
  • Don't allow AUTO_INCREMENT for other than numerical columns.
  • Using AUTO_INCREMENT will now automatically make the column NOT NULL.
  • Show NULL as the default value for AUTO_INCREMENT columns.
  • Added SQL_BIG_RESULT; SQL_SMALL_RESULT is now default.
  • Added a shared library RPM. This enchancement was contributed by David Fox (dsfox@cogsci.ucsd.edu).
  • Added a --enable-large-files/--disable-large-files switch to configure. See `configure.in' for some systems where this is automatically turned off because of broken implementations.
  • Upgraded readline to 4.0.
  • New CREATE TABLE options: PACK_KEYS and CHECKSUM.
  • Added mysqld option --default-table-type.

D.2 Changes in release 3.22.x

The 3.22 version has faster and safer connect code and a lot of new nice enhancements. The reason for not including these changes in the 3.21 version is mainly that we are trying to avoid big changes to 3.21 to keep it as stable as possible. As there aren't really any MAJOR changes, upgrading to 3.22 should be very easy and painless. See section 4.16.2 Upgrading from a 3.21 version to 3.22.

3.22 should also be used with the new DBD-mysql (1.20xx) driver that can use the new connect protocol!

D.2.1 Changes in release 3.22.28

  • Fixed problem with LEFT JOIN and COUNT() on a column which was declared NULL + and it had a DEFAULT value.
  • Fixed core dump problem when using CONCAT() in a WHERE clause.
  • Fixed problem with AVG() and STD() with NULL values.

D.2.2 Changes in release 3.22.27

  • Fixed prototype in `my_ctype.h' when using other character sets.
  • Some configure issues to fix problems with big file system detection.
  • Fixed problem when sorting on big blob columns.
  • ROUND() will now work on Win32.

D.2.3 Changes in release 3.22.26

  • Fixed core dump with empty BLOB/TEXT column to REVERSE().
  • Extended /*! */ with version numbers.
  • Changed SUBSTRING(text FROM pos) to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
  • Fixed problem with LOCK TABLES combined with DELETE FROM table
  • Fixed problem that INSERT ... SELECT didn't use SQL_BIG_TABLES.
  • SET SQL_LOW_PRIORITY_UPDATES=# didn't work.
  • Password wasn't updated correctly if privileges didn't change on: GRANT ... IDENTIFIED BY
  • Fixed range optimizer bug in SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const)
  • Fixed bug in compression key handling in ISAM.

D.2.4 Changes in release 3.22.25

  • Fixed some small problems with the installation.

D.2.5 Changes in release 3.22.24

  • DATA is not a reserved word anymore.
  • Fixed optimizer bug with tables with only one row.
  • Fixed bug when using LOCK TABLES table_name READ; FLUSH TABLES;
  • Applied some patches for HP-UX.
  • isamchk should now work on Win32.
  • Changed `configure' to not use big file handling on Linux as this crashes some RedHat 6.0 systems

D.2.6 Changes in release 3.22.23

  • Upgraded to use Autoconf 2.13, Automake 1.4 and libtool 1.3.2.
  • Better support for SCO in configure.
  • Added option --defaults-file=### to option file handling to force use of only one specific option file.
  • Extended CREATE syntax to ignore MySQL 3.23 keywords.
  • Fixed deadlock problem when using INSERT DELAYED on a table locked with LOCK TABLES.
  • Fixed deadlock problem when using DROP TABLE on a table that was locked by another thread.
  • Add logging of GRANT/REVOKE commands in the update log.
  • Fixed isamchk to detect a new error condition.
  • Fixed bug in NATURAL LEFT JOIN.

D.2.7 Changes in release 3.22.22

  • Fixed problem in the C API when you called mysql_close() directly after mysql_init().
  • Better client error message when you can't open socket.
  • Fixed delayed_insert_thread counting when you couldn't create a new delayed_insert thread.
  • Fixed bug in CONCAT() with many arguments.
  • Added patches for DEC 3.2 and SCO.
  • Fixed path-bug when installing MySQL as a service on NT.
  • The MySQL-Win32 version is now compiled with VC++ 6.0 instead of with VC++ 5.0.
  • New installation setup for MySQL-Win32.

D.2.8 Changes in release 3.22.21

  • Fixed problem with DELETE FROM TABLE when table was locked by another thread.
  • Fixed bug in LEFT JOIN involving empty tables.
  • Changed the mysql.db column from char(32) to char(60).
  • MODIFY and DELAYED are not reserved words anymore.
  • Fixed a bug when storing days in a TIME column.
  • Fixed a problem with Host '..' is not allowed to connect to this MySQL server after one had inserted a new MySQL user with a GRANT command.
  • Changed to use TCP_NODELAY also on Linux (Should give faster TCP/IP connections).

D.2.9 Changes in release 3.22.20

  • Fixed STD() for big tables when result should be 0.
  • The update log didn't have newlines on some operating systems.
  • INSERT DELAYED had some garbage at end in the update log.

D.2.10 Changes in release 3.22.19

  • Fixed bug in mysql_install_db (from 3.22.17).
  • Changed default key cache size to 8M.
  • Fixed problem with queries that needed temporary tables with BLOB columns.

D.2.11 Changes in release 3.22.18

  • Fixes a fatal problem in 3.22.17 on Linux; After shutdown all threads didn't die properly.
  • Added option -O flush-time=# to mysqld. This is mostly useful on Win32 and tells how often MySQL should close all unused tables and flush all updated tables to disk.
  • Fixed problem that a VARCHAR column compared with CHAR column didn't use keys efficiently.

D.2.12 Changes in release 3.22.17

  • Fixed a core dump problem when using --log-update and connecting without a default database.
  • Fixed some configure and portability problems.
  • Using LEFT JOIN on tables that had circular dependencies caused mysqld to hang forever.

D.2.13 Changes in release 3.22.16

  • mysqladmin processlist could kill the server if a new user logged in.
  • DELETE FROM tbl_name WHERE key_column=col_name didn't find any matching rows. Fixed.
  • DATE_ADD(column,...) didn't work.
  • INSERT DELAYED could deadlock with status 'upgrading lock'
  • Extended ENCRYPT() to take longer salt strings than 2 characters.
  • longlong2str is now much faster than before. For Intel x86 platforms, this function is written in optimized assembler.
  • Added the MODIFY keyword to ALTER TABLE.

D.2.14 Changes in release 3.22.15

  • GRANT used with IDENTIFIED BY didn't take effect until privileges were flushed.
  • Name change of some variables in SHOW STATUS.
  • Fixed problem with ORDER BY with 'only index' optimzation when there were multiple key definitions for a used column.
  • DATE and DATETIME columns are now up to 5 times faster than before.
  • INSERT DELAYED can be used to let the client do other things while the server inserts rows into a table.
  • LEFT JOIN USING (col1,col2) didn't work if one used it with tables from 2 different databases.
  • LOAD DATA LOCAL INFILE didn't work in the Unix version because of a missing file.
  • Fixed problems with VARCHAR/BLOB on very short rows (< 4 bytes); error 127 could occur when deleting rows.
  • Updating BLOB/TEXT through formulas didn't work for short (< 256 char) strings.
  • When you did a GRANT on a new host, mysqld could die on the first connect from this host.
  • Fixed bug when one used ORDER BY on column name that was the same name as an alias.
  • Added BENCHMARK(loop_count,expression) function to time expressions.

D.2.15 Changes in release 3.22.14

  • Allow empty arguments to mysqld to make it easier to start from shell scripts.
  • Setting a TIMESTAMP column to NULL didn't record the timestamp value in the update log.
  • Fixed lock handler bug when one did INSERT INTO TABLE ... SELECT ... GROUP BY.
  • Added a patch for localtime_r() on Win32 so that it will not crash anymore if your date is > 2039, but instead will return a time of all zero.
  • Names for user-defined functions are no longer case sensitive.
  • Added escape of ^Z (ASCII 26) to \Z as ^Z doesn't work with pipes on Win32.
  • mysql_fix_privileges adds a new column to the mysql.func to support aggregate UDF functions in future MySQL releases.

D.2.16 Changes in release 3.22.13

  • Saving NOW(), CURDATE() or CURTIME() directly in a column didn't work.
  • SELECT COUNT(*) ... LEFT JOIN ... didn't work with no WHERE part.
  • Updated `config.guess' to allow MySQL to configure on UnixWare 7.0.x.
  • Changed the implementation of pthread_cond() on the Win32 version. get_lock() now correctly times out on Win32!

D.2.17 Changes in release 3.22.12

  • Fixed problem when using DATE_ADD() and DATE_SUB() in a WHERE clause.
  • You can now set the password for a user with the GRANT ... TO user IDENTIFIED BY 'password' syntax.
  • Fixed bug in GRANT checking with SELECT on many tables.
  • Added missing file mysql_fix_privilege_tables to the RPM distribution. This is not run by default since it relies on the client package.
  • Added option SQL_SMALL_RESULT to SELECT to force use of fast temporary tables when you know that the result set will be small.
  • Allow use of negative real numbers without a decimal point.
  • Day number is now adjusted to maximum days in month if the resulting month after DATE_ADD/DATE_SUB() doesn't have enough days.
  • Fix that GRANT compares columns in case-insensitive fashion.
  • Fixed a bug in `sql_list.h' that made ALTER TABLE dump core in some contexts.
  • The hostname in user@hostname can now include `.' and `-' without quotes in the context of the GRANT, REVOKE and SET PASSWORD FOR ... statements.
  • Fix for isamchk for tables which need big temporary files.

D.2.18 Changes in release 3.22.11

  • IMPORTANT: You must run the mysql_fix_privilege_tables script when you upgrade to this version! This is needed because of the new GRANT system. If you don't do this, you will get Access denied when you try to use ALTER TABLE, CREATE INDEX or DROP INDEX.
  • GRANT to allow/deny users table and column access.
  • Changed USER() to return user@host
  • Changed the syntax for how to set PASSWORD for another user.
  • New command FLUSH STATUS that sets most status variables to zero.
  • New status variables: aborted_threads, aborted_connects.
  • New option variable: connection_timeout.
  • Added support for Thai sorting (by Pruet Boonma
  • Slovak and japanese error messages.
  • Configuration and portability fixes.
  • Added option SET SQL_WARNINGS=1 to get a warning count also for simple inserts.
  • MySQL now uses SIGTERM instead of SIGQUIT with shutdown to work better on FreeBSD.
  • Added option \G (print vertically) to mysql.
  • SELECT HIGH_PRIORITY ... killed mysqld.
  • IS NULL on a AUTO_INCREMENT column in a LEFT JOIN didn't work as expected.
  • New function MAKE_SET().

D.2.19 Changes in release 3.22.10

  • mysql_install_db no longer starts the MySQL server! You should start mysqld with safe_mysqld after installing it! The MySQL RPM will however start the server as before.
  • Added --bootstrap option to mysqld and recoded mysql_install_db to use it. This will make it easier to install MySQL with RPMs.
  • Changed +, - (sign and minus), *, /, %, ABS() and MOD() to be BIGINT aware (64-bit safe).
  • Fixed a bug in ALTER TABLE that caused mysqld to crash.
  • MySQL now always reports the conflicting key values when a duplicate key entry occurs. (Before this was only reported for INSERT).
  • New syntax: INSERT INTO tbl_name SET col_name=value,col_name=value,...
  • Most errors in the `.err' log are now prefixed with a time stamp.
  • Added option MYSQL_INIT_COMMAND to mysql_options() to make a query on connect or reconnect.
  • Added option MYSQL_READ_DEFAULT_FILE and MYSQL_READ_DEFAULT_GROUP to mysql_options() to read the following parameters from the MySQL option files: port, socket, compress, password, pipe, timeout, user, init-command, host and database.
  • Added maybe_null to the UDF structure.
  • Added option IGNORE to INSERT statemants with many rows.
  • Fixed some problems with sorting of the koi8 character sets; Users of koi8 MUST run isamchk -rq on each table that has an index on a CHAR or VARCHAR column.
  • New script mysql_setpermission, by Luuk de Boer, allows one to easily create new users with permissions for specific databases.
  • Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column separators with LOAD DATA INFILE).
  • Ported to OS/2 (thanks to Antony T. Curtis antony.curtis@olcs.net).
  • Added more variables to SHOW STATUS and changed format of output to be like SHOW VARIABLES.
  • Added extended-status command to mysqladmin which will show the new status variables.

D.2.20 Changes in release 3.22.9

  • SET SQL_LOG_UPDATE=0 caused a lockup of the server.
  • New SQL command: FLUSH [ TABLES | HOSTS | LOGS | PRIVILEGES ] [, ...]
  • New SQL command: KILL thread_id.
  • Added casts and changed include files to make MySQL easier to compile on AIX and DEC OSF1 4.x
  • Fixed conversion problem when using ALTER TABLE from a INT to a short CHAR() column.
  • Added SELECT HIGH_PRIORITY; This will get a lock for the SELECT even if there is a thread waiting for another SELECT to get a WRITE LOCK.
  • Moved wild_compare to string class to be able to use LIKE on BLOB/TEXT columns with \0.
  • Added ESCAPE option to LIKE.
  • Added a lot more output to mysqladmin debug.
  • You can now start mysqld on Win32 with the --flush option. This will flush all tables to disk after each update. This makes things much safer on NT/Win98 but also MUCH slower.

D.2.21 Changes in release 3.22.8

  • Czech character sets should now work much better. You must also install ftp://www.mysql.com/pub/mysql/Downloads/Patches/czech-3.22.8-patch. This patch should also be installed if you are using a character set with uses my_strcoll()! The patch should always be safe to install (for any system), but as this patch changes ISAM internals it's not yet in the default distribution.
  • DATE_ADD() and DATE_SUB() didn't work with group functions.
  • mysql will now also try to reconnect on USE DATABASE commands.
  • Fix problem with ORDER BY and LEFT JOIN and const tables.
  • Fixed problem with ORDER BY if the first ORDER BY column was a key and the rest of the ORDER BY columns wasn't part of the key.
  • Fixed a big problem with OPTIMIZE TABLE.
  • MySQL clients on NT will now by default first try to connect with named pipes and after this with TCP/IP.
  • Fixed a problem with DROP TABLE and mysqladmin shutdown on Win32 (a fatal bug from 3.22.6).
  • Fixed problems with TIME columns and negative strings.
  • Added an extra thread signal loop on shutdown to avoid some error messages from the client.
  • MySQL now uses the next available number as extension for the update log file.
  • Added patches for UNIXWARE 7.

D.2.22 Changes in release 3.22.7

  • Added LIMIT clause for the DELETE statement.
  • You can now use the /*! ... */ syntax to hide MySQL-specific keywords when you write portable code. MySQL will parse the code inside the comments as if the surrounding /*! and */ comment characters didn't exist.
  • OPTIMIZE TABLE tbl_name can now be used to reclaim disk space after many deletes. Currently, this uses ALTER TABLE to re-generate the table, but in the future it will use an integrated isamchk for more speed.
  • Upgraded libtool to get the configure more portable.
  • Fixed slow UPDATE and DELETE operations when using DATETIME or DATE keys.
  • Changed optimizer to make it better at deciding when to do a full join and when using keys.
  • You can now use mysqladmin proc to display information about your own threads. Only users with the Process_priv privilege can get information about all threads.
  • Added handling of formats YYMMDD, YYYYMMDD, YYMMDDHHMMSS for numbers when using DATETIME and TIMESTAMP types. (Formerly these formats only worked with strings.)
  • Added connect option CLIENT_IGNORE_SPACE to allow use of spaces after function names and before `(' (Powerbuilder requires this). This will make all function names reserved words.
  • Added the --log-long-format option to mysqld to enable timestamps and INSERT_ID's in the update log.
  • Added --where option to mysqldump (patch by Jim Faucette).
  • The lexical analyzer now uses ``perfect hashing'' for faster parsing of SQL statements.

D.2.23 Changes in release 3.22.6

  • Faster mysqldump.
  • For the LOAD DATA INFILE statement, you can now use the new LOCAL keyword to read the file from the client. mysqlimport will automatically use LOCAL when importing with the TCP/IP protocol.
  • Fixed small optimize problem when updating keys.
  • Changed makefiles to support shared libraries.
  • MySQL-NT can now use named pipes, which means that you can now use MySQL-NT without having to install TCP/IP.

D.2.24 Changes in release 3.22.5

  • All table lock handing is changed to avoid some very subtle deadlocks when using DROP TABLE, ALTER TABLE, DELETE FROM TABLE and mysqladmin flush-tables under heavy usage. Changed locking code to get better handling of locks of different types.
  • Updated DBI to 1.00 and DBD to 1.2.0.
  • Added a check that the error message file contains error messages suitable for the current version of mysqld. (To avoid errors if you accidentally try to use an old error message file.)
  • All count structures in the client (affected_rows(), insert_id(),...) are now of type BIGINT to allow 64-bit values to be used. This required a minor change in the MySQL protocol which should affect only old clients when using tables with AUTO_INCREMENT values > 24M.
  • The return type of mysql_fetch_lengths() has changed from uint * to ulong *. This may give a warning for old clients but should work on most machines.
  • Change mysys and dbug libraries to allocate all thread variables in one struct. This makes it easier to make a threaded `libmysql.dll' library.
  • Use the result from gethostname() (instead of uname()) when constructing `.pid' file names.
  • New better compressed server/client protocol.
  • COUNT(), STD() and AVG() are extended to handle more than 4G rows.
  • You can now store values in the range -838:59:59 <= x <= 838:59:59 in a TIME column.
  • WARNING: INCOMPATIBLE CHANGE!! If you set a TIME column to too short a value, MySQL now assumes the value is given as: [[[D ]HH:]MM:]SS instead of HH[:MM[:SS]].
  • TIME_TO_SEC() and SEC_TO_TIME() can now handle negative times and hours up to 32767.
  • Added new option SET OPTION SQL_LOG_UPDATE={0|1} to allow users with the process privilege to bypass the update log. (Modified patch from Sergey A Mukhin violet@rosnet.net.)
  • Fixed fatal bug in LPAD().
  • Initialize line buffer in `mysql.cc' to make BLOB reading from pipes safer.
  • Added -O max_connect_errors=# option to mysqld. Connect errors are now reset for each correct connection.
  • Increased the default value of max_allowed_packet to 1M in mysqld.
  • Added --low-priority-updates option to mysqld, to give table-modifying operations (INSERT, REPLACE, UPDATE, DELETE) lower priority than retrievals. You can now use {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... You can also use SET OPTION SQL_LOW_PRIORITY_UPDATES={0|1} to change the priority for one thread. One side effect is that LOW_PRIORITY is now a reserved word. :(
  • Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement.
  • INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously only INSERT ... SELECT and LOAD DATA INFILE were cached.)
  • Allow GROUP BY functions with HAVING:
    mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0;
  • mysqld will now ignore trailing `;' characters in queries. This is to make it easier to migrate from some other SQL servers that require the trailing `;'.
  • Fix for corrupted fixed-format output generated by SELECT INTO OUTFILE.
  • WARNING: INCOMPATIBLE CHANGE!! Added Oracle GREATEST() and LEAST() functions. You must now use these instead of the MAX() and MIN() functions to get the largest/smallest value from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) values.
  • WARNING: INCOMPATIBLE CHANGE!! DAYOFWEEK() had offset 0 for Sunday. Changed the offset to 1.
  • Give an error for queries that mix GROUP BY columns and fields when there is no GROUP BY specification.
  • Added --vertical option to mysql, for printing results in vertical mode.
  • Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0, this works only for numeric columns. See section 10.4 MySQL index use.
  • Lots of new benchmarks.
  • A new C API chapter and lots of other improvements in the manual.

D.2.25 Changes in release 3.22.4

  • Added --tmpdir option to mysqld, for specifying the location of the temporary file directory.
  • MySQL now automatically changes a query from an ODBC client:
    SELECT ... FROM table WHERE auto_increment_column IS NULL

    to:

    SELECT ... FROM table WHERE auto_increment_column == LAST_INSERT_ID()

    This allows some ODBC programs (Delphi, Access) to retrieve the newly inserted row to fetch the AUTO_INCREMENT id.

  • DROP TABLE now waits for all users to free a table before deleting it.
  • Fixed small memory leak in the new connect protocol.
  • New functions BIN(), OCT(), HEX() and CONV() for converting between different number bases.
  • Added function SUBSTRING() with 2 arguments.
  • If you created a table with a record length smaller than 5, you couldn't delete rows from the table.
  • Added optimization to remove const reference tables from ORDER BY and GROUP BY.
  • mysqld now automatically disables system locking on Linux and Win32, and for systems that use MIT-pthreads. You can force the use of locking with the --enable-locking option.
  • Added --console option to mysqld, to force a console window (for error messages) when using Win32.
  • Fixed table locks for Win32.
  • Allow `$' in identifiers.
  • Changed name of user-specific configuration file from `my.cnf' to `.my.cnf' (Unix only).
  • Added DATE_ADD() and DATE_SUB() functions.

D.2.26 Changes in release 3.22.3

  • Fixed a lock problem (bug in MySQL 3.22.1) when closing temporary tables.
  • Added missing mysql_ping() to the client library.
  • Added --compress option to all MySQL clients.
  • Changed byte to char in `mysql.h' and `mysql_com.h'.

D.2.27 Changes in release 3.22.2

  • Searching on multiple constant keys that matched more than 30% of the rows didn't always use the best possible key.
  • New functions <<, >>, RPAD() and LPAD().
  • You can now save default options (like passwords) in a configuration file (`my.cnf').
  • Lots of small changes to get ORDER BY to work when no records are found when using fields that are not in GROUP BY (MySQL extension).
  • Added --chroot option to mysqld, to start mysqld in a chroot environment (by Nikki Chumakov nikkic@cityline.ru).
  • Trailing spaces are now ignored when comparing case-sensitive strings; this should fix some problems with ODBC and flag 512!
  • Fixed a core-dump bug in the range optimizer.
  • Added --one-thread option to mysqld, for debugging with LinuxThreads (or glibc). (This replaces the -T32 flag)
  • Added DROP TABLE IF EXISTS to prevent an error from occurring if the table doesn't exist.
  • IF and EXISTS are now reserved words (they would have to be sooner or later).
  • Added lots of new options to mysqldump.
  • Server error messages are now in `mysqld_error.h'.
  • The server/client protocol now supports compression.
  • All bug fixes from MySQL 3.21.32.

D.2.28 Changes in release 3.22.1

  • Added new C API function mysql_ping().
  • Added new API functions mysql_init() and mysql_options(). You now MUST call mysql_init() before you call mysql_real_connect(). You don't have to call mysql_init() if you only use mysql_connect().
  • Added mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...) so you can set a timeout for connecting to a server.
  • Added --timeout option to mysqladmin, as a test of mysql_options().
  • Added AFTER column and FIRST options to ALTER TABLE ... ADD columns. This makes it possible to add a new column at some specific location within a row in an existing table.
  • WEEK() now takes an optional argument to allow handling of weeks when the week starts on Monday (some European countries). By default, WEEK() assumes the week starts on Sunday.
  • TIME columns weren't stored properly (bug in MySQL 3.22.0).
  • UPDATE now returns information about how many rows were matched and updated, and how many ``warnings'' occurred when doing the update.
  • Fixed incorrect result from FORMAT(-100,2).
  • ENUM and SET columns were compared in binary (case-sensitive) fashion; changed to be case insensitive.

D.2.29 Changes in release 3.22.0

  • New (backward compatible) connect protocol that allows you to specify the database to use when connecting, to get much faster connections to a specific database. The mysql_real_connect() call is changed to:
    mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
                   const char *passwd, const char *db, uint port,
                   const char *unix_socket, uint client_flag)
  • Each connection is handled by its own thread, rather than by the master accept() thread. This fixes permanently the telnet bug that was a topic on the mail list some time ago.
  • All TCP/IP connections are now checked with backward resolution of the hostname to get better security. mysqld now has a local hostname resolver cache so connections should actually be faster than before, even with this feature.
  • A site automatically will be blocked from future connections if someone repeatedly connects with an ``improper header'' (like when one uses telnet).
  • You can now refer to tables in different databases with references of the form tbl_name@db_name or db_name.tbl_name. This makes it possible to give a user read access to some tables and write access to others simply by keeping them in different databases!
  • Added --user option to mysqld, to allow it to run as another Unix user (if it is started as the Unix root user).
  • Added caching of users and access rights (for faster access rights checking)
  • Normal users (not anonymous ones) can change their password with mysqladmin password 'new_password'. This uses encrypted passwords that are not logged in the normal MySQL log!
  • All important string functions are now coded in assembler for x86 Linux machines. This gives a speedup of 10% in many cases.
  • For tables that have many columns, the column names are now hashed for much faster column name lookup (this will speed up some benchmark tests a lot!)
  • Some benchmarks are changed to get better individual timing. (Some loops were so short that a specific test took < 2 seconds. The loops have been changed to take about 20 seconds to make it easier to compare different databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better)
  • Re-arranged SELECT code to handle some very specific queries involving group functions (like COUNT(*)) without a GROUP BY but with HAVING. The following now works:
    mysql> SELECT count(*) as C FROM table HAVING C > 1;
  • Changed the protocol for field functions to be faster and avoid some calls to malloc().
  • Added -T32 option to mysqld, for running all queries under the main thread. This makes it possible to debug mysqld under Linux with gdb!
  • Added optimization of not_null_column IS NULL (needed for some Access queries).
  • Allow STRAIGHT_JOIN to be used between two tables to force the optimizer to join them in a specific order.
  • String functions now return VARCHAR rather than CHAR and the column type is now VARCHAR for fields saved as VARCHAR. This should make the MyODBC driver better, but may break some old MySQL clients that don't handle FIELD_TYPE_VARCHAR the same way as FIELD_TYPE_CHAR.
  • CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE TABLE is still the recommended (fast) way to create indexes.
  • Added --set-variable option wait_timeout to mysqld.
  • Added time column to mysqladmin processlist to show how long a query has taken or how long a thread has slept.
  • Added lots of new variables to show variables and some new to show status.
  • Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155.
  • Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created with the new date type if you don't use the --old-protocol option to mysqld.
  • Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.
  • Added --enable-assembler option to configure, for x86 machines (tested on Linux + gcc). This will enable assembler functions for the most important string functions for more speed!

D.3 Changes in release 3.21.x

D.3.1 Changes in release 3.21.33

  • Fixed problem when sending SIGHUP to mysqld; mysqld core dumped when starting from boot on some systems.
  • Fixed problem with losing a little memory for some connections.
  • DELETE FROM tbl_name without a WHERE condition is now done the long way when you use LOCK TABLES or if the table is in use, to avoid race conditions.
  • INSERT INTO TABLE (timestamp_column) VALUES (NULL); didn't set timestamp.

D.3.2 Changes in release 3.21.32

  • Fixed some possible race conditions when doing many reopen/close on the same tables under heavy load! This can happen if you execute mysqladmin refresh often. This could in some very rare cases corrupt the header of the index file and cause error 126 or 138.
  • Fixed fatal bug in refresh() when running with the --skip-locking option. There was a ``very small'' time gap after a mysqladmin refresh when a table could be corrupted if one thread updated a table while another thread did mysqladmin refresh and another thread started a new update ont the same table before the first thread had finished. A refresh (or --flush-tables) will now not return until all used tables are closed!
  • SELECT DISTINCT with a WHERE clause that didn't match any rows returned a row in some contexts (bug only in 3.21.31).
  • GROUP BY + ORDER BY returned one empty row when no rows where found.
  • Fixed a bug in the range optimizer that wrote Use_count: Wrong count for ... in the error log file.

D.3.3 Changes in release 3.21.31

  • Fixed a sign extension problem for the TINYINT type on Irix.
  • Fixed problem with LEFT("constant_string",function).
  • Fixed problem with FIND_IN_SET().
  • LEFT JOIN core dumped if the second table is used with a constant WHERE/ON expression that uniquely identifies one record.
  • Fixed problems with DATE_FORMAT() and incorrect dates. DATE_FORMAT() now ignores '%' to make it possible to extend it more easily in the future.

D.3.4 Changes in release 3.21.30

  • mysql now returns an exit code > 0 if the query returned an error.
  • Saving of command line history to file in mysql client. By Tommy Larsen tommy@mix.hive.no.
  • Fixed problem with empty lines that were ignored in `mysql.cc'.
  • Save the pid of the signal handler thread in the pid file instead of the pid of the main thread.
  • Added patch by tommy@valley.ne.jp to support Japanese characters SJIS and UJIS.
  • Changed safe_mysqld to redirect startup messages to 'hostname'.err instead of 'hostname'.log to reclaim file space on mysqladmin refresh.
  • ENUM always had the first entry as default value.
  • ALTER TABLE wrote two entries to the update log.
  • sql_acc() now closes the mysql grant tables after a reload to save table space and memory.
  • Changed LOAD DATA to use less memory with tables and BLOB columns.
  • Sorting on a function which made a division / 0 produced a wrong set in some cases.
  • Fixed SELECT problem with LEFT() when using the czech character set.
  • Fixed problem in isamchk; it couldn't repair a packed table in a very unusual case.
  • SELECT statements with & or | (bit functions) failed on columns with NULL values.
  • When comparing a field = field, where one of the fields was a part key, only the length of the part key was compared.

D.3.5 Changes in release 3.21.29

  • LOCK TABLES + DELETE from tbl_name never removed locks properly.
  • Fixed problem when grouping on an OR function.
  • Fixed permission problem with umask() and creating new databases.
  • Fixed permission problem on result file with SELECT ... INTO OUTFILE ...
  • Fixed problem in range optimizer (core dump) for a very complex query.
  • Fixed problem when using MIN(integer) or MAX(integer) in GROUP BY.
  • Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha).
  • Fixed bug in WEEK("XXXX-xx-01").

D.3.6 Changes in release 3.21.28

  • Fixed socket permission (clients couldn't connect to Unix socket on Linux).
  • Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.

D.3.7 Changes in release 3.21.27

  • Added user level lock functions GET_LOCK(string,timeout), RELEASE_LOCK(string).
  • Added opened_tables to show status.
  • Changed connect timeout to 3 seconds to make it somewhat harder for crackers to kill mysqld through telnet + TCP/IP.
  • Fixed bug in range optimizer when using WHERE key_part_1 >= something AND key_part_2 <= something_else.
  • Changed configure for detection of FreeBSD 3.0 9803xx and above
  • WHERE with string_column_key = constant_string didn't always find all rows if the column had many values differing only with characters of the same sort value (like e and 'e).
  • Strings keys looked up with 'ref' were not compared in case-sensitive fashion.
  • Added umask() to make log files non-readable for normal users.
  • Ignore users with old (8-byte) password on startup if not using --old-protocol option to mysqld.
  • SELECT which matched all key fields returned the values in the case of the matched values, not of the found values. (Minor problem.)

D.3.8 Changes in release 3.21.26

  • FROM_DAYS(0) now returns "0000-00-00".
  • In DATE_FORMAT(), PM and AM were swapped for hours 00 and 12.
  • Extended the default maximum key size to 256.
  • Fixed bug when using BLOB/TEXT in GROUP BY with many tables.
  • An ENUM field that is not declared NOT NULL has NULL as the default value. (Previously, the default value was the first enumeration value.)
  • Fixed bug in the join optimizer code when using many part keys on the same key: INDEX (Organization,Surname(35),Initials(35)).
  • Added some tests to the table order optimizer to get some cases with SELECT ... FROM many_tables much faster.
  • Added a retry loop around accept() to possibly fix some problems on some Linux machines.

D.3.9 Changes in release 3.21.25

  • Changed typedef 'string' to typedef 'my_string' for better portability.
  • You can now kill threads that are waiting on a disk full condition.
  • Fixed some problems with UDF functions.
  • Added long options to isamchk. Try isamchk --help.
  • Fixed a bug when using 8 bytes long (alpha); filesort() didn't work. Affects DISTINCT, ORDER BY and GROUP BY on 64-bit processors.

D.3.10 Changes in release 3.21.24

  • Dynamic loadable functions. Based on source from Alexis Mikhailov.
  • You couldn't delete from a table if no one had done a SELECT on the table.
  • Fixed problem with range optimizer with many OR operators on key parts inside each other.
  • Recoded MIN() and MAX() to work properly with strings and HAVING.
  • Changed default umask value for new files from 0664 to 0660.
  • Fixed problem with LEFT JOIN and constant expressions in the ON part.
  • Added Italian error messages from brenno@dewinter.com.
  • configure now works better on OSF1 (tested on 4.0D).
  • Added hooks to allow LIKE optimization with international character support.
  • Upgraded DBI to 0.93.

D.3.11 Changes in release 3.21.23

  • The following symbols are now reserved words: TIME, DATE, TIMESTAMP, TEXT, BIT, ENUM, NO, ACTION, CHECK, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, STATUS, VARIABLES.
  • Setting a TIMESTAMP to NULL in LOAD DATA INFILE ... didn't set the current time for the TIMESTAMP.
  • Fix BETWEEN to recognize binary strings. Now BETWEEN is case sensitive.
  • Added --skip-thread-priority option to mysqld, for systems where mysqld's thread scheduling doesn't work properly (BSDI 3.1).
  • Added ODBC functions DAYNAME() and MONTHNAME().
  • Added function TIME_FORMAT(). This works like DATE_FORMAT(), but takes a time string ('HH:MM:DD') as argument.
  • Fixed unlikely(?) key optimizer bug when using ORs of key parts inside ANDs.
  • Added command variables to mysqladmin.
  • A lot of small changes to the binary releases.
  • Fixed a bug in the new protocol from MySQL 3.21.20.
  • Changed ALTER TABLE to work with Win32 (Win32 can't rename open files). Also fixed a couple of small bugs in the Win32 version.
  • All standard MySQL clients are now ported to MySQL-Win32.
  • MySQL can now be started as a service on NT.

D.3.12 Changes in release 3.21.22

  • Starting with this version, all MySQL distributions will be configured, compiled and tested with crash-me and the benchmarks on the following platforms: SunOS 5.6 sun4u, SunOS 5.5.1 sun4u, SunOS 4.14 sun4c, SunOS 5.6 i86pc, Irix 6.3 mips5k, HP-UX 10.20 hppa, AIX 4.2.1 ppc, OSF1 V4.0 alpha, FreeBSD 2.2.2 i86pc and BSDI 3.1 i386.
  • Fix COUNT(*) problems when the WHERE clause didn't match any records. (Bug from 3.21.17.)
  • Removed that NULL = NULL is true. Now you must use IS NULL or IS NOT NULL to test whether or not a value is NULL. (This is according to ANSI SQL but may break old applications that are ported from mSQL.) You can get the old behavior by compiling with -DmSQL_COMPLIANT.
  • Fixed bug that core dumped when using many LEFT OUTER JOIN clauses.
  • Fixed bug in ORDER BY on string formula with possible NULL values.
  • Fixed problem in range optimizer when using <= on sub index.
  • Added functions DAYOFYEAR(), DAYOFMONTH(), MONTH(),
    YEAR(), WEEK(), QUARTER(), HOUR(), MINUTE(),
    SECOND() and FIND_IN_SET().
  • Added command SHOW VARIABLES.
  • Added support of ``long constant strings'' from ANSI SQL:
    mysql> SELECT 'first ' 'second';       -> 'first second'
  • Upgraded mSQL-Mysql-modules to 1.1825.
  • Upgraded mysqlaccess to 2.02.
  • Fixed problem with Russian character set and LIKE.
  • Ported to OpenBSD 2.1.
  • New Dutch error messages.

D.3.13 Changes in release 3.21.21a

  • Configure changes for some operating systems.

D.3.14 Changes in release 3.21.21

  • Fixed optimizer bug when using WHERE data_field = date_field2 AND date_field2 = constant.
  • Added command SHOW STATUS.
  • Removed `manual.ps' from the source distribution to make it smaller.

D.3.15 Changes in release 3.21.20

  • Changed the maximum table name and column name lengths from 32 to 64.
  • Aliases can now be of ``any'' length.
  • Fixed mysqladmin stat to return the right number of queries.
  • Changed protocol (downward compatible) to mark if a column has the AUTO_INCREMENT attribute or is a TIMESTAMP. This is needed for the new Java driver.
  • Added Hebrew sorting order by Zeev Suraski.
  • Solaris 2.6: Fixed configure bugs and increased maximum table size from 2G to 4G.

D.3.16 Changes in release 3.21.19

  • Upgraded DBD to 1823. This version implements mysql_use_result in DBD-Mysql.
  • Benchmarks updated for empress (by Luuk).
  • Fixed a case of slow range searching.
  • Configure fixes (`Docs' directory).
  • Added function REVERSE() (by Zeev Suraski).

D.3.17 Changes in release 3.21.18

  • Issue error message if client C functions are called in wrong order.
  • Added automatic reconnect to the `libmysql.c' library. If a write command fails, an automatic reconnect is done.
  • Small sort sets no longer use temporary files.
  • Upgraded DBI to 0.91.
  • Fixed a couple of problems with LEFT OUTER JOIN.
  • Added CROSS JOIN syntax. CROSS is now a reserved word.
  • Recoded yacc/bison stack allocation to be even safer and to allow MySQL to handle even bigger expressions.
  • Fixed a couple of problems with the update log.
  • ORDER BY was slow when used with key ranges.

D.3.18 Changes in release 3.21.17

  • Changed documentation string of --with-unix-socket-path to avoid confusion.
  • Added ODBC and ANSI SQL style LEFT OUTER JOIN.
  • The following are new reserved words: LEFT, NATURAL, USING.
  • The client library now uses the value of the environment variable MYSQL_HOST as the default host if it's defined.
  • SELECT col_name, SUM(expr) now returns NULL for col_name when there are matching rows.
  • Fixed problem with comparing binary strings and BLOBs with ASCII characters over 127.
  • Fixed lock problem: when freeing a read lock on a table with multiple read locks, a thread waiting for a write lock would have been given the lock. This shouldn't affect data integrity, but could possibly make mysqld restart if one thread was reading data that another thread modified.
  • LIMIT offset,count didn't work in INSERT ... SELECT.
  • Optimized key block caching. This will be quicker than the old algorithm when using bigger key caches.

D.3.19 Changes in release 3.21.16

  • Added ODBC 2.0 & 3.0 functions POWER(), SPACE(), COT(), DEGREES(), RADIANS(), ROUND(2 arg) and TRUNCATE().
  • WARNING: INCOMPATIBLE CHANGE!! LOCATE() parameters were swapped according to ODBC standard. Fixed.
  • Added function TIME_TO_SEC().
  • In some cases, default values were not used for NOT NULL fields.
  • Timestamp wasn't always updated properly in UPDATE SET ... statements.
  • Allow empty strings as default values for BLOB and TEXT, to be compatible with mysqldump.

D.3.20 Changes in release 3.21.15

  • WARNING: INCOMPATIBLE CHANGE!! mysqlperl is now from Msql-Mysql-modules. This means that connect() now takes host, database, user, password arguments! The old version took host, database, password, user.
  • Allow DATE '1997-01-01', TIME '12:10:10' and TIMESTAMP '1997-01-01 12:10:10' formats required by ANSI SQL. WARNING: INCOMPATIBLE CHANGE!! This has the unfortunate side-effect that you no longer can have columns named DATE, TIME or TIMESTAMP. :( Old columns can still be accessed through tablename.columnname!)
  • Changed Makefiles to hopefully work better with BSD systems. Also, `manual.dvi' is now included in the distribution to avoid having stupid make programs trying to rebuild it.
  • readline library upgraded to version 2.1.
  • A new sortorder german-1. That is a normal ISO-Latin1 with a german sort order.
  • Perl DBI/DBD is now included in the distribution. DBI is now the recommended way to connect to MySQL from Perl.
  • New portable benchmark suite with DBD, with test results from mSQL 2.0.3, MySQL, PostgreSQL 6.2.1 and Solid server 2.2.
  • crash-me is now included with the benchmarks; This is a Perl program designed to find as many limits as possible in a SQL server. Tested with mSQL, PostgreSQL, Solid and MySQL.
  • Fixed bug in range-optimizer that crashed MySQL on some queries.
  • Table and column name completion for mysql command line tool, by Zeev Suraski and Andi Gutmans.
  • Added new command REPLACE that works like INSERT but replaces conflicting records with the new record. REPLACE INTO TABLE ... SELECT ... works also.
  • Added new commands CREATE DATABASE db_name and DROP DATABASE db_name.
  • Added RENAME option to ALTER TABLE: ALTER TABLE name RENAME AS new_name.
  • make_binary_distribution now includes `libgcc.a' in `libmysqlclient.a'. This should make linking work for people who don't have gcc.
  • Changed net_write() to my_net_write() because of a name conflict with Sybase.
  • New function DAYOFWEEK() compatible with ODBC.
  • Stack checking and bison memory overrun checking to make MySQL safer with weird queries.

D.3.21 Changes in release 3.21.14b

  • Fixed a couple of small configure problems on some platforms.

D.3.22 Changes in release 3.21.14a

  • Ported to SCO Openserver 5.0.4 with FSU Pthreads.
  • HP-UX 10.20 should work.
  • Added new function DATE_FORMAT().
  • Added NOT IN.
  • Added automatic removal of 'ODBC function conversions': {fn now() }
  • Handle ODBC 2.50.3 option flags.
  • Fixed comparison of DATE and TIME values with NULL.
  • Changed language name from germany to german to be consistent with the other language names.
  • Fixed sorting problem on functions returning a FLOAT. Previously, the values were converted to INTs before sorting.
  • Fixed slow sorting when sorting on key field when using key_column=constant.
  • Sorting on calculated DOUBLE values sorted on integer results instead.
  • mysql no longer needs a database argument.
  • Changed the place where HAVING should be. According to ANSI, it should be after GROUP BY but before ORDER BY. MySQL 3.20 incorrectly had it last.
  • Added Sybase command USE DATABASE to start using another database.
  • Added automatic adjusting of number of connections and table cache size if the maximum number of files that can be opened is less than needed. This should fix that mysqld doesn't crash even if you haven't done a ulimit -n 256 before starting mysqld.
  • Added lots of limit checks to make it safer when running with too little memory or when doing weird queries.

D.3.23 Changes in release 3.21.13

  • Added retry of interrupted reads and clearing of errno. This makes Linux systems much safer!
  • Fixed locking bug when using many aliases on the same table in the same SELECT.
  • Fixed bug with LIKE on number key.
  • New error message so you can check whether the connection was lost while the command was running or whether the connection was down from the start.
  • Added --table option to mysql to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections.
  • Added != as a synonym for <>.
  • Added function VERSION() to make easier logs.
  • New multi-user test `tests/fork_test.pl' to put some strain on the thread library.

D.3.24 Changes in release 3.21.12

  • Fixed ftruncate() call in MIT-pthreads. This made isamchk destroy the `.ISM' files on (Free)BSD 2.x systems.
  • Fixed broken __P_ patch in MIT-pthreads.
  • Many memory overrun checks. All string functions now return NULL if the returned string should be longer than max_allowed_packet bytes.
  • Changed the name of the INTERVAL type to ENUM, because INTERVAL is used in ANSI SQL.
  • In some cases, doing a JOIN + GROUP + INTO OUTFILE, the result wasn't grouped.
  • LIKE with '_' as last character didn't work. Fixed.
  • Added extended ANSI SQL TRIM() function.
  • Added CURTIME().
  • Added ENCRYPT() function by Zeev Suraski.
  • Fixed better FOREIGN KEY syntax skipping. New reserved words: MATCH, FULL, PARTIAL.
  • mysqld now allows IP number and hostname to the --bind-address option.
  • Added SET OPTION CHARACTER SET cp1251_koi8 to enable conversions of data to/from cp1251_koi8.
  • Lots of changes for Win95 port. In theory, this version should now be easily portable to Win95.
  • Changed the CREATE COLUMN syntax of NOT NULL columns to be after the DEFAULT value, as specified in the ANSI SQL standard. This will make mysqldump with NOT NULL and default values incompatible with MySQL 3.20.
  • Added many function name aliases so the functions can be used with ODBC or ANSI SQL92 syntax.
  • Fixed syntax of ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT NULL.
  • Added CHAR and BIT as synonyms for CHAR(1).
  • Fixed core dump when updating as a user who has only select privilege.
  • INSERT ... SELECT ... GROUP BY didn't work in some cases. An Invalid use of group function error occurred.
  • When using LIMIT, SELECT now always uses keys instead of record scan. This will give better performance on SELECT and a WHERE that matches many rows.
  • Added Russian error messages.

D.3.25 Changes in release 3.21.11

  • Configure changes.
  • MySQL now works with the new thread library on BSD/OS 3.0.
  • Added new group functions BIT_OR() and BIT_AND().
  • Added compatibility functions CHECK and REFERENCES. CHECK is now a reserved word.
  • Added ALL option to GRANT for better compatibility. (GRANT is still a dummy function.)
  • Added partly-translated dutch messages.
  • Fixed bug in ORDER BY and GROUP BY with NULL columns.
  • Added function last_insert_id() to retrieve last AUTO_INCREMENT value. This is intended for clients to ODBC that can't use the mysql_insert_id() API function, but can be used by any client.
  • Added --flush-logs option to mysqladmin.
  • Added command STATUS to mysql.
  • Fixed problem with ORDER BY/GROUP BY because of bug in gcc.
  • Fixed problem with INSERT ... SELECT ... GROUP BY.

D.3.26 Changes in release 3.21.10

  • New mysqlaccess.
  • CREATE now supports all ODBC types and the mSQL TEXT type. All ODBC 2.5 functions are also supported (added REPEAT). This provides better portability.
  • Added text types TINYTEXT, TEXT, MEDIUMTEXT and LONGTEXT. These are actually BLOBtypes, but all searching is done in case-insensitive fashion.
  • All old BLOB fields are now TEXT fields. This only changes that all searching on strings is done in case-sensitive fashion. You must do an ALTER TABLE and change the field type to BLOB if you want to have tests done in case-sensitive fashion.
  • Fixed some configure issues.
  • Made the locking code a bit safer. Fixed very unlikely deadlock situation.
  • Fixed a couple of bugs in the range optimizer. Now the new range benchmark test-select works.

D.3.27 Changes in release 3.21.9

  • Added --enable-unix-socket=pathname option to configure.
  • Fixed a couple of portability problems with include files.
  • Fixed bug in range calculation that could return empty set when searching on multiple key with only one entry (very rare).
  • Most things ported to FSU Pthreads, which should allow MySQL to run on SCO. See section 4.11.13 SCO notes.

D.3.28 Changes in release 3.21.8

  • Works now in Solaris 2.6.
  • Added handling of calculation of SUM() functions. For example, you can now use SUM(column)/COUNT(column).
  • Added handling of trigometric functions: PI(), ACOS(), ASIN(), ATAN(), COS(), SIN() and TAN().
  • New languages: norwegian, norwegian-ny and portuguese.
  • Fixed parameter bug in net_print() in `procedure.cc'.
  • Fixed a couple of memory leaks.
  • Now allow also the old SELECT ... INTO OUTFILE syntax.
  • Fixed bug with GROUP BY and SELECT on key with many values.
  • mysql_fetch_lengths() sometimes returned incorrect lengths when you used mysql_use_result(). This affected at least some cases of mysqldump --quick.
  • Fixed bug in optimization of WHERE const op field.
  • Fixed problem when sorting on NULL fields.
  • Fixed a couple of 64-bit (Alpha) problems.
  • Added --pid-file=# option to mysqld.
  • Added date formatting to FROM_UNIXTIME(), originally by Zeev Suraski.
  • Fixed bug in BETWEEN in range optimizer (Did only test = of the first argument).
  • Added machine-dependent files for MIT-pthreads i386-SCO. There is probably more to do to get this to work on SCO 3.5.

D.3.29 Changes in release 3.21.7

  • Changed `Makefile.am' to take advantage of Automake 1.2.
  • Added the beginnings of a benchmark suite.
  • Added more secure password handling.
  • Added new client function mysql_errno(), to get the error number of the error message. This makes error checking in the client much easier. This makes the new server incompatible with the 3.20.x server when running without --old-protocol. The client code is backward compatible. More information can be found in the `README' file!
  • Fixed some problems when using very long, illegal names.

D.3.30 Changes in release 3.21.6

  • Fixed more portability issues (incorrect sigwait and sigset defines).
  • configure should now be able to detect the last argument to accept().

D.3.31 Changes in release 3.21.5

  • Should now work with FreeBSD 3.0 if used with `FreeBSD-3.0-libc_r-1.0.diff', which can be found at http://www.mysql.com/Download/Patches.
  • Added new option -O tmp_table_size=# to mysqld.
  • New function FROM_UNIXTIME(timestamp) which returns a date string in 'YYYY-MM-DD HH:MM:DD' format.
  • New function SEC_TO_TIME(seconds) which returns a string in 'HH:MM:SS' format.
  • New function SUBSTRING_INDEX(), originally by Zeev Suraski.

D.3.32 Changes in release 3.21.4

  • Should now configure and compile on OSF1 4.0 with the DEC compiler.
  • Configuration and compilation on BSD/OS 3.0 works, but due to some bugs in BSD/OS 3.0, mysqld doesn't work on it yet.
  • Configuration and compilation on FreeBSD 3.0 works, but I couldn't get pthread_create to work.

D.3.33 Changes in release 3.21.3

  • Added reverse check lookup of hostnames to get better security.
  • Fixed some possible buffer overflows if filenames that are too long are used.
  • mysqld doesn't accept hostnames that start with digits followed by a '.', because the hostname may look like an IP number.
  • Added --skip-networking option to mysqld, to only allow socket connections. (This will not work with MIT-pthreads!)
  • Added check of too long table names for alias.
  • Added check if database name is okay.
  • Added check if too long table names.
  • Removed incorrect free() that killed the server on CREATE DATABASE or DROP DATABASE.
  • Changed some mysqld -O options to better names.
  • Added -O join_cache_size=# option to mysqld.
  • Added -O max_join_size=# option to mysqld, to be able to set a limit how big queries (in this case big = slow) one should be able to handle without specifying SET OPTION SQL_BIG_SELECTS=1. A # = is about 10 examined records. The default is ``unlimited''.
  • When comparing a TIME, DATE, DATETIME or TIMESTAMP column to a constant, the constant is converted to a time value before performing the comparison. This will make it easier to get ODBC (particularly Access97) to work with the above types. It should also make dates easier to use and the comparisons should be quicker than before.
  • Applied patch from Jochen Wiedmann that allows query() in mysqlperl to take a query with \0 in it.
  • Storing a timestamp with a 2-digit year (YYMMDD) didn't work.
  • Fix that timestamp wasn't automatically updated if set in an UPDATE clause.
  • Now the automatic timestamp field is the FIRST timestamp field.
  • SELECT * INTO OUTFILE, which didn't correctly if the outfile already existed.
  • mysql now shows the thread ID when starting or doing a reconnect.
  • Changed the default sort buffer size from 2M to 1M.

D.3.34 Changes in release 3.21.2

  • The range optimizer is coded, but only 85% tested. It can be enabled with --new, but it crashes core a lot yet...
  • More portable. Should compile on AIX and alpha-digital. At least the isam library should be relatively 64-bit clean.
  • New isamchk which can detect and fix more problems.
  • New options for isamlog.
  • Using new version of Automake.
  • Many small portability changes (from the AIX and alpha-digital port) Better checking of pthread(s) library.
  • czech error messages by snajdr@pvt.net.
  • Decreased size of some buffers to get fewer problems on systems with little memory. Also added more checks to handle ``out of memory'' problems.
  • mysqladmin: you can now do mysqladmin kill 5,6,7,8 to kill multiple threads.
  • When the maximum connection limit is reached, one extra connection by a user with the PROCESS_ACL privilege is granted.
  • Added -O backlog=# option to mysqld.
  • Increased maximum packet size from 512K to 1024K for client.
  • Almost all of the function code is now tested in the internal test suite.
  • ALTER TABLE now returns warnings from field conversions.
  • Port changed to 3306 (got it reserved from ISI).
  • Added a fix for Visual FoxBase so that any schema name from a table specification is automatically removed.
  • New function ASCII().
  • Removed function BETWEEN(a,b,c). Use the standard ANSI synax instead: expr BETWEEN expr AND expr.
  • MySQL no longer has to use an extra temporary table when sorting on functions or SUM() functions.
  • Fixed bug that you couldn't use tbl_name.field_name in UPDATE.
  • Fixed SELECT DISTINCT when using 'hidden group'. For example:
    mysql> SELECT DISTINCT MOD(some_field,10) FROM test
           GROUP BY some_field;

    Note: some_field is normally in the SELECT part. ANSI SQL should require it.

D.3.35 Changes in release 3.21.0

  • New keywords used: INTERVAL, EXPLAIN, READ, WRITE, BINARY.
  • Added ODBC function CHAR(num,...).
  • New operator IN. This uses a binary search to find a match.
  • New command LOCK TABLES tbl_name [AS alias] {READ|WRITE} ...
  • Added --log-update option to mysqld, to get a log suitable for incremental updates.
  • New command EXPLAIN SELECT ... to get information about how the optimizer will do the join.
  • For easier client code, the client should no longer use FIELD_TYPE_TINY_BLOB, FIELD_TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB or FIELD_TYPE_VAR_STRING (as previously returned by mysql_list_fields). You should instead only use FIELD_TYPE_BLOB or FIELD_TYPE_STRING. If you want exact types, you should use the command SHOW FIELDS.
  • Added varbinary syntax: 0x###### which can be used as a string (default) or a number.
  • FIELD_TYPE_CHAR is renamed to FIELD_TYPE_TINY.
  • Changed all fields to C++ classes.
  • Removed FORM struct.
  • Fields with DEFAULT values no longer need to be NOT NULL.
  • New field types:
    ENUM
    A string which can take only a couple of defined values. The value is stored as a 1-3 byte number that is mapped automatically to a string. This is sorted according to string positions!
    SET
    A string which may have one or many string values separated with ','. The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specific set member. This is sorted according to the unsigned value of the stored packed number.
  • Now all function calculation is done with double or long long. This will provide the full 64-bit range with bit functions and fix some conversions that previously could result in precision losses. One should avoid using unsigned long long columns with full 64-bit range (numbers bigger than 9223372036854775807) because calculations are done with signed long long.
  • ORDER BY will now put NULL field values first. GROUP BY will also work with NULL values.
  • Full WHERE with expressions.
  • New range optimizer that can resolve ranges when some keypart prefix is constant. Example:
    mysql> SELECT * FROM tbl_name
           WHERE key_part_1="customer"
           AND key_part_2>=10 AND key_part_2<=10;

21.3 Changes in release 3.20.x

Changes from 3.20.18 to 3.20.32b are not documented here since the 3.21 release branched here. And the relevant changes are also documented as changes to the 3.21 version.

D.3.36 Changes in release 3.20.18

  • Added -p# (remove # directories from path) to isamlog. All files are written with a relative path from the database directory Now mysqld shouldn't crash on shutdown when using the --log-isam option.
  • New mysqlperl version. It is now compatible with msqlperl-0.63.
  • New DBD module available at http://www.mysql.com/Contrib site.
  • Added group function STD() (standard deviation).
  • The mysqld server is now compiled by default without debugging information. This will make the daemon smaller and faster.
  • Now one usually only has to specify the --basedir option to mysqld. All other paths are relative in a normal installation.
  • BLOB columns sometimes contained garbage when used with a SELECT on more than one table and ORDER BY.
  • Fixed that calculations that are not in GROUP BY work as expected (ANSI SQL extension). Example:
    mysql> SELECT id,id+1 FROM table GROUP BY id;
  • The test of using MYSQL_PWD was reversed. Now MYSQL_PWD is enabled as default in the default release.
  • Fixed conversion bug which caused mysqld to core dump with Arithmetic error on Sparc-386.
  • Added --unbuffered option to mysql, for new mysqlaccess.
  • When using overlapping (unnecessary) keys and join over many tables, the optimizer could get confused and return 0 records.

D.3.37 Changes in release 3.20.17

  • You can now use BLOB columns and the functions IS NULL and IS NOT NULL in the WHERE clause.
  • All communication packets and row buffers are now allocated dynamically on demand. The default value of max_allowed_packet is now 64K for the server and 512K for the client. This is mainly used to catch incorrect packets that could trash all memory. The server limit may be changed when it is started.
  • Changed stack usage to use less memory.
  • Changed safe_mysqld to check for running daemon.
  • The ELT() function is renamed to FIELD(). The new ELT() function returns a value based on an index: FIELD() is the inverse of ELT() Example: ELT(2,"A","B","C") returns "B". FIELD("B","A","B","C") returns 2.
  • COUNT(field), where field could have a NULL value, now works.
  • A couple of bugs fixed in SELECT ... GROUP BY.
  • Fixed memory overrun bug in WHERE with many unoptimizable brace levels.
  • Fixed some small bugs in the grant code.
  • If hostname isn't found by get_hostname, only the IP is checked. Previously, you got Access denied.
  • Inserts of timestamps with values didn't always work.
  • INSERT INTO ... SELECT ... WHERE could give the error Duplicated field.
  • Added some tests to safe_mysqld to make it ``safer''.
  • LIKE was case sensitive in some places and case insensitive in others. Now LIKE is always case insensitive.
  • `mysql.cc': Allow '#' anywhere on the line.
  • New command SET OPTION SQL_SELECT_LIMIT=#. See the FAQ for more details.
  • New version of the mysqlaccess script.
  • Change FROM_DAYS() and WEEKDAY() to also take a full TIMESTAMP or DATETIME as argument. Before they only took a number of type YYYYMMDD or YYMMDD.
  • Added new function UNIX_TIMESTAMP(timestamp_column).

D.3.38 Changes in release 3.20.16

  • More changes in MIT-pthreads to get them safer. Fixed also some link bugs at least in SunOS.
  • Changed mysqld to work around a bug in MIT-pthreads. This makes multiple small SELECT operations 20 times faster. Now lock_test.pl should work.
  • Added mysql_FetchHash(handle) to mysqlperl.
  • The mysqlbug script is now distributed built to allow for reporting bugs that appear during the build with it.
  • Changed `libmysql.c' to prefer getpwuid() instead of cuserid().
  • Fixed bug in SELECT optimizer when using many tables with the same column used as key to different tables.
  • Added new latin2 and Russian KOI8 character tables.
  • Added support for a dummy GRANT command to satisfy Powerbuilder.

D.3.39 Changes in release 3.20.15

  • Fixed fatal bug packets out of order when using MIT-pthreads.
  • Removed possible loop when a thread waits for command from client and fcntl() fails. Thanks to Mike Bretz for finding this bug.
  • Changed alarm loop in `mysqld.cc' because shutdown didn't always succeed in Linux.
  • Removed use of termbits from `mysql.cc'. This conflicted with glibc 2.0.
  • Fixed some syntax errors for at least BSD and Linux.
  • Fixed bug when doing a SELECT as superuser without a database.
  • Fixed bug when doing SELECT with group calculation to outfile.

D.3.40 Changes in release 3.20.14

  • If one gives -p or --password option to mysql without an argument, the user is solicited for the password from the tty.
  • Added default password from MYSQL_PWD (by Elmar Haneke).
  • Added command kill to mysqladmin to kill a specific MySQL thread.
  • Sometimes when doing a reconnect on a down connection this succeeded first on second try.
  • Fixed adding an AUTO_INCREMENT key with ALTER_TABLE.
  • AVG() gave too small value on some SELECTs with GROUP BY and ORDER BY.
  • Added new DATETIME type (by Giovanni Maruzzelli
  • Fixed that define DONT_USE_DEFAULT_FIELDS works.
  • Changed to use a thread to handle alarms instead of signals on Solaris to avoid race conditions.
  • Fixed default length of signed numbers. (George Harvey
  • Allow anything for CREATE INDEX.
  • Add prezeros when packing numbers to DATE, TIME and TIMESTAMP.
  • Fixed a bug in OR of multiple tables (gave empty set).
  • Added many patches to MIT-pthreads. This fixes at least one lookup bug.

D.3.41 Changes in release 3.20.13

  • Added ANSI SQL94 DATE and TIME types.
  • Fixed bug in SELECT with AND-OR levels.
  • Added support for Slovenian characters. The `Contrib' directory contains source and instructions for adding other character sets.
  • Fixed bug with LIMIT and ORDER BY.
  • Allow ORDER BY and GROUP BY on items that aren't in the SELECT list. (Thanks to Wim Bonis bonis@kiss.de, for pointing this out.)
  • Allow setting of timestamp values in INSERT.
  • Fixed bug with SELECT ... WHERE ... = NULL.
  • Added changes for glibc 2.0. To get glibc to work, you should add the `gibc-2.0-sigwait-patch' before compiling glibc.
  • Fixed bug in ALTER TABLE when changing a NOT NULL field to allow NULL values.
  • Added some ANSI92 synonyms as field types to CREATE TABLE. CREATE TABLE now allows FLOAT(4) and FLOAT(8) to mean FLOAT and DOUBLE.
  • New utility program mysqlaccess by Yves.Carlier@rug.ac.be. This program shows the access rights for a specific user and the grant rows that determine this grant.
  • Added WHERE const op field (by bonis@kiss.de).

D.3.42 Changes in release 3.20.11

  • When using SELECT ... INTO OUTFILE, all temporary tables are ISAM instead of HEAP to allow big dumps.
  • Changed date functions to be string functions. This fixed some ``funny'' side effects when sorting on dates.
  • Extended ALTER TABLE according to SQL92.
  • Some minor compability changes.
  • Added --port and --socket options to all utility programs and mysqld.
  • Fixed MIT-pthreads readdir_r(). Now mysqladmin create database and mysqladmin drop database should work.
  • Changed MIT-pthreads to use our tempnam(). This should fix the ``sort aborted'' bug.
  • Added sync of records count in sql_update. This fixed slow updates on first connection. (Thanks to Vaclav Bittner for the test.)

D.3.43 Changes in release 3.20.10

  • New insert type: INSERT INTO ... SELECT ...
  • MEDIUMBLOB fixed.
  • Fixed bug in ALTER TABLE and BLOBs.
  • SELECT ... INTO OUTFILE now creates the file in the current database directory.
  • DROP TABLE now can take a list of tables.
  • Oracle synonym DESCRIBE (DESC).
  • Changes to make_binary_distribution.
  • Added some comments to installation instructions about configure's C++ link test.
  • Added --without-perl option to configure.
  • Lots of small portability changes.

D.3.44 Changes in release 3.20.9

  • ALTER TABLE didn't copy null bit. As a result, fields that were allowed to have NULL values were always NULL.
  • CREATE didn't take numbers as DEFAULT.
  • Some compatibility changes for SunOS.
  • Removed `config.cache' from old distribution.

D.3.45 Changes in release 3.20.8

  • Fixed bug with ALTER TABLE and multi-part keys.

D.3.46 Changes in release 3.20.7

  • New commands: ALTER TABLE, SELECT ... INTO OUTFILE and LOAD DATA INFILE.
  • New function: NOW().
  • Added new field file_priv to mysql/user table.
  • New script add_file_priv which adds the new field file_priv to the user table. This script must be executed if you want to use the new SELECT ... INTO and LOAD DATA INFILE ... commands with a version of MySQL earlier than 3.20.7.
  • Fixed bug in locking code, which made lock_test.pl test fail.
  • New files `NEW' and `BUGS'.
  • Changed `select_test.c' and `insert_test.c' to include `config.h'.
  • Added command status to mysqladmin for short logging.
  • Increased maximum number of keys to 16 and maximum number of key parts to 15.
  • Use of sub keys. A key may now be a prefix of a string field.
  • Added -k option to mysqlshow, to get key information for a table.
  • Added long options to mysqldump.

D.3.47 Changes in release 3.20.6

  • Portable to more systems because of MIT-pthreads, which will be used automatically if configure cannot find a -lpthreads library.
  • Added GNU-style long options to almost all programs. Test with program --help.
  • Some shared library support for Linux.
  • The FAQ is now in `.texi' format and is available in `.html', `.txt' and `.ps' formats.
  • Added new SQL function RAND([init]).
  • Changed sql_lex to handle \0 unquoted, but the client can't send the query through the C API, because it takes a str pointer. You must use mysql_real_query() to send the query.
  • Added API function mysql_get_client_info().
  • mysqld now uses the N_MAX_KEY_LENGTH from `nisam.h' as the maximum allowed key length.
  • The following now works:
    mysql> SELECT filter_nr,filter_nr FROM filter ORDER BY filter_nr;

    Previously, this resulted in the error: Column: 'filter_nr' in order clause is ambiguous.

  • mysql now outputs '\0', '\t', '\n' and '\\' when encountering ASCII 0, tab, newline or '\' while writing tab-separated output. This is to allow printing of binary data in a portable format. To get the old behavior, use -r (or --raw).
  • Added german error messages (60 of 80 error messages translated).
  • Added new API function mysql_fetch_lengths(MYSQL_RES *), which returns an array of of column lengths (of type uint).
  • Fixed bug with IS NULL in WHERE clause.
  • Changed the optimizer a little to get better results when searching on a key part.
  • Added SELECT option STRAIGHT_JOIN to tell the optimizer that it should join tables in the given order.
  • Added support for comments starting with '--' in `mysql.cc' (Postgres syntax).
  • You can have SELECT expressions and table columns in a SELECT which are not used in the group part. This makes it efficient to implement lookups. The column that is used should be a constant for each group because the value is calculated only once for the first row that is found for a group.
    mysql> SELECT id,lookup.text,sum(*) FROM test,lookup
         WHERE test.id=lookup.id GROUP BY id;
  • Fixed bug in SUM(function) (could cause a core dump).
  • Changed AUTO_INCREMENT placement in the SQL query:
    INSERT into table (auto_field) values (0);

    inserted 0, but it should insert an AUTO_INCREMENT value.

  • `mysqlshow.c': Added number of records in table. Had to change the client code a little to fix this.
  • mysql now allows doubled '' or "" within strings for embedded ' or ".
  • New math functions: EXP(), LOG(), SQRT(), ROUND(), CEILING().

D.3.48 Changes in release 3.20.3

  • The configure source now compiles a thread-free client library -lmysqlclient. This is the only library that needs to be linked with client applications. When using the binary releases, you must link with -lmysql -lmysys -ldbug -lstrings as before.
  • New readline library from bash-2.0.
  • LOTS of small changes to configure and makefiles (and related source).
  • It should now be possible to compile in another directory using VPATH. Tested with GNU Make 3.75.
  • safe_mysqld and mysql.server changed to be more compatible between the source and the binary releases.
  • LIMIT now takes one or two numeric arguments. If one argument is given, it indicates the maximum number of rows in a result. If two arguments are given, the first argument indicates the offset of the first row to return, the second is the maximum number of rows. With this it's easy to do a poor man's next page/previous page WWW application.
  • Changed name of SQL function FIELDS() to ELT(). Changed SQL function INTERVALL() to INTERVAL().
  • Made SHOW COLUMNS a synonym for SHOW FIELDS. Added compatibility syntax FRIEND KEY to CREATE TABLE. In MySQL, this creates a non-unique key on the given columns.
  • Added CREATE INDEX and DROP INDEX as compatibility functions. In MySQL, CREATE INDEX only checks if the index exists and issues an error if it doesn't exist. DROP INDEX always succeeds.
  • `mysqladmin.c': added client version to version information.
  • Fixed core dump bug in sql_acl (core on new connection).
  • Removed host, user and db tables from database test in the distribution.
  • FIELD_TYPE_CHAR can now be signed (-128 - 127) or unsigned (0 - 255) Previously, it was always unsigned.
  • Bug fixes in CONCAT() and WEEKDAY().
  • Changed a lot of source to get mysqld to be compiled with SunPro compiler.
  • SQL functions must now have a '(' immediately after the function name (no intervening space). For example, 'user(' is regarded as beginning a function call, and 'user (' is regarded as an identifier user followed by a '(', not as a function call.

D.3.49 Changes in release 3.20.0

  • The source distribution is done with configure and Automake. It will make porting much easier. The readline library is included in the distribution.
  • Separate client compilation: the client code should be very easy to compile on systems which don't have threads.
  • The old Perl interface code is automatically compiled and installed. Automatic compiling of DBD will follow when the new DBD code is ported.
  • Dynamic language support: mysqld can now be started with Swedish or English (default) error messages.
  • New functions: INSERT(), RTRIM(), LTRIM() and FORMAT().
  • mysqldump now works correctly for all field types (even AUTO_INCREMENT). The format for SHOW FIELDS FROM tbl_name is changed so the Type column contains information suitable for CREATE TABLE. In previous releases, some CREATE TABLE information had to be patched when recreating tables.
  • Some parser bugs from 3.19.5 (BLOB and TIMESTAMP) are corrected. TIMESTAMP now returns different date information depending on its create length.
  • Changed parser to allow a database, table or field name to start with a number or '_'.
  • All old C code from Unireg changed to C++ and cleaned up. This makes the daemon a little smaller and easier to understand.
  • A lot of small bug fixes done.
  • New `INSTALL' files (not final version) and some info regarding porting.

D.4 Changes in release 3.19.x

D.4.1 Changes in release 3.19.5

  • Some new functions, some more optimization on joins.
  • Should now compile clean on Linux (2.0.x).
  • Added functions DATABASE(), USER(), POW(), LOG10() (needed for ODBC).
  • In a WHERE with an ORDER BY on fields from only one table, the table is now preferred as first table in a multi-join.
  • HAVING and IS NULL or IS NOT NULL now works.
  • A group on one column and a sort on a group function (SUM(), AVG()...) didn't work together. Fixed.
  • mysqldump: Didn't send password to server.

D.4.2 Changes in release 3.19.4

  • Fixed horrible locking bug when inserting in one thread and reading in another thread.
  • Fixed one-off decimal bug. 1.00 was output as 1.0.
  • Added attribute 'Locked' to process list as info if a query is locked by another query.
  • Fixed full magic timestamp. Timestamp length may now be 14, 12, 10, 8, 6, 4 or 2 bytes.
  • Sort on some numeric functions could sort incorrectly on last number.
  • IF(arg,syntax_error,syntax_error) crashed.
  • Added functions CEILING(), ROUND(), EXP(), LOG() and SQRT().
  • Enhanced BETWEEN to handle strings.

D.4.3 Changes in release 3.19.3

  • Fixed SELECT with grouping on BLOB columns not to return incorrect BLOB info. Grouping, sorting and distinct on BLOB columns will not yet work as expected (probably it will group/sort by the first 7 characters in the BLOB). Grouping on formulas with a fixed string size (use MID() on a BLOB) should work.
  • When doing a full join (no direct keys) on multiple tables with BLOB fields, the BLOB was garbage on output.
  • Fixed DISTINCT with calculated columns.

Go to the first, previous, next, last section, table of contents.


MySQL中文參考手冊-16 MySQL的ODBC支援

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

16 MySQL對ODBC的支援

MySQL利用MyODBC程式為ODBC提供支援。

16.1 MyODBC支援的作業系統

MyODBC是在Windows95和Windows NT上的一個32位ODBC(2.50) level 0驅動程式。我們希望誰能將它移植到Windows 3.x。

16.2 怎樣報告MyODBC的問題

MyODBC已經用Acess、Admndemo.exe、C++ Builder、Centura Team Developer(早先是Gupta SQL/Windows)、ColdFusion(在Solaris和用Server Pack 5的NT上)、Crystal Reports、DataJunction、Notes 4.5/4.6、SBSS、Perl DBD-ODBC、Paradox、Powerbuilder、Powerdesigner 32位、VC++和Visual Basic。

如果你聽說有任何其他的應用程式用MyODBC一起工作，請把它寄到myodbc@lists.mysql.com！

16.3 已知可用MyODBC工作的程式

大多數程式應該可用MyODBC工作，但對下面列出的每一個，我們自己測試了它或從它運行的一些用戶得到了証實：

程式
說明
Access
為使Access工作：
  • 你應該在桌中有主鍵。
  • 你應該在所有你想要能被修改的表中有一個時間戳記。
  • 僅使用雙精度浮點數的字段。當用單精度浮點數進行比較時，Access失敗。
  • 當與MySQL連接時，設置“Return matching rows”（返回匹配的行）選項域。
  • 在NT上的Access將報告BLOB列為OLE OBJECTS。如果你想要有MEMO列，你應該用ALTER TABLE把列改成TEXT。
  • Access不能總是正確地處理DATE列。如果你對此有一個問題，把列改為DATETIME。
  • 在一些情況下，Access可以產生不合法的SQL查詢，而MySQL不能理解。你可以通過從Access菜單"Query|SQLSpecific|Pass-Through"來修正它。
DataJunction
你必須改變它來輸出VARCHAR而非ENUM，因為它以能引起MySQL困惑的方式導出後者。
Execl
工作。一些建議：
  • 如果你對日期有問題，試著使用CONCAT()函數作為字符串選擇他們。例如：
    select CONCAT(rise_time), CONCAT(set_time)
    from sunrise_sunset;

    這種方式作為字符串檢索出的值應該被Excel97識別為時間值，例子中CONCAT()的目的是欺騙ODBC認為列是“字符串類型”。沒有CONCAT()，ODBC知道列是時間類型，而Excel不理解它。注意這是Excel的一個錯誤，因為它自動將一個字符串轉換為一個時間。如果數據源是一個文本文件，這問題將很大，但是當數據源是對每列報告準確類型的一個ODBC連接時，只是有點傻。

odbcadmin
為ODBC的測試程式。
Delphi
你必須使用DBE 3.2或更新。當與MySQL連接時，設置“Don't optimize column width”（不最佳化列寬度）選項域。另外，有一些潛在有用的delphi代碼安裝一個ODBC入口和針對MyODBC的一個BDE的入口(BDE入口需要一個BDE Alias Editor，可以到Delphi Super Page上免費擁有)：（感謝Bryan Brunton bryan@flesherfab.com）
fReg:= TRegistry.Create;
  fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
  fReg.WriteString('Database', 'Documents');
  fReg.WriteString('Description', ' ');
  fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
  fReg.WriteString('Flag', '1');
  fReg.WriteString('Password', '');
  fReg.WriteString('Port', ' ');
  fReg.WriteString('Server', 'xmark');
  fReg.WriteString('User', 'winuser');
  fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
  fReg.WriteString('DocumentsFab', 'MySQL');
  fReg.CloseKey;
  fReg.Free;

  Memo1.Lines.Add('DATABASE NAME=');
  Memo1.Lines.Add('USER NAME=');
  Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  Memo1.Lines.Add('BATCH COUNT=200');
  Memo1.Lines.Add('LANGDRIVER=');
  Memo1.Lines.Add('MAX ROWS=-1');
  Memo1.Lines.Add('SCHEMA CACHE DIR=');
  Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  Memo1.Lines.Add('SQLQRYMODE=');
  Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  Memo1.Lines.Add('ENABLE BCD=FALSE');
  Memo1.Lines.Add('ROWSET SIZE=20');
  Memo1.Lines.Add('BLOBS TO CACHE=64');
  Memo1.Lines.Add('BLOB SIZE=32');

  AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
C++Builder
用BDE 3.0測試過。唯一知道的問題是，當表框架改變時，差詢字段不被更新。然而BDE似乎認不出主鍵，只是索引PRIMARY，盡管這已經不是個問題。
Visual Basic
為了能更新一張表，你必須為表定義一個主鍵。

16.4 怎樣填寫ODBC管理程式的各種域

在Windows95上，有3種可能性來指定伺服器名：

  • 使用伺服器的IP地址。
  • 增加一個文件“lmhosts”，具有下列資訊：
    ip hostname

    例如：

    194.216.84.21 my
  • 設置PC以使用DNS。

怎麼填寫“ODBC設置”的例子：

Windows DSN name:   test
Description:        This is my test database
MySql Database:     test
Server:             194.216.84.21
User:               monty
Password:           my_password
Port:

對Windows DSN name域的值是在你的Windows ODBC設置中唯一的任何名字。

你不必為在ODBC設置屏的Server, User, Password或Port域指定值。然而如果你這樣做，當你試圖做一個連接時，這些值將在以後作為預設值使用，那時你有改變值的選擇。

如果沒給出端口號，使用預設端口(3306)。

如果你指定選項Read options from C:\my.cnf，組client和odbc將從“C:\my.cnf”文件中讀出。你可以使用可用於mysql_options()的所有選項。見20.4.37 mysql_options()。

16.5 怎樣在ODBC中獲得一個AUTO_INCREMENT列的值

一個常見的問題是怎樣得到一個自動從一個INSERT產生的ID值，用ODBC，你可以這樣做(假定auto是一個AUTO_INCREMENT字段)：

INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();

或，如果你是只是想把ID插入到另外一個表中，你可以這樣做：

INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');

得益於一些ODBC應用程式(至少Delphi和Access)，下列查詢可被用來找出最新插入的行：

SELECT * FROM tbl_name WHERE auto IS NULL;

16.6 報告MyODBC的問題

如果你碰到MyODBC困難，你應該通過ODBC管理器制作一個日誌文件(當從ODBCADMIN要求日誌時，你獲得的日誌文件)和一個MyODBC日誌文件來開始。為了獲得一個MyODBC日誌文件，在MyODBC連接/配置屏幕上標注“Trace MyODBC”選項標誌。日誌文件將被寫入文件“C:\myodbc.log”。注意為了此選項起作用，你必須使用MYSQL.DLL而不是MYSQL2.DLL！

檢查MyODBC發給MySQL伺服器的查詢﹔你應該可以通過在“myodbc.log”文件中尋找字符串>mysql_real_query找到它。

你也應該試著在mysql監視器或admndemo中重複查詢以找出是MyODBC出錯還是MySQL出錯。

如果你發現某些東西是錯的，請值將相關的行(最大40排)發到myodbc@lists.mysql.com。請決不要發送整個MyODBC或ODBC日誌文件！

如果你不能找出是什麼錯誤，最後的選擇制作一個檔案(tar或zip)，包含一個MyODBC日誌文件，ODBC日誌文件和一個解釋這個問題的 README文件。你可以把這發到ftp://www.mysql.com/pub/mysql/secret。至於在TCX的我們能訪問你上載的文件並且我們將分離數據！

如果你能創造一個也顯示出這個問題的程式，請也上載它！

如果程式與一些其他SQL伺服器一起工作，你應該制作一個 ODBC 日誌文件，在哪兒你在其他SQL伺服器做完全一樣的事情。

記住，你能提供我們越多的資訊，我們越可能解決這個問題！

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊- 10 從MySQL得到最大的性能

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

10 從MySQL得到最大的性能

最佳化是一項複雜的任務，因為它最終需要對整個系統的理解。當用你的系統/應用的小知識做一些局部最佳化是可能的時候，你越想讓你的系統更最佳化，你必須知道它也越多。

因此，本章將試圖解釋並給出最佳化MySQL的不同方法的一些例子。但是記住總是有某些(逐漸變難)是系統更快的方法留著去做。

10.1 最佳化概述

為了使一個系統更快的最重要部分當然是基本設計。你也需要知道你的系統將做這樣的事情，那就是你的瓶頸。

最常見的瓶頸是：

  • 磁碟尋道。磁碟花時間找到一個數據，用在1999年的現代磁碟其平均時間通常小於10ms，因此理論上我們能大約一秒尋道 1000 次。這個時間用新磁碟提高很慢並且很難對一個表最佳化。最佳化它的方法是將數據散布在多個磁碟上。
  • 當磁碟在我們需要讀數據的正確位置時，磁碟讀/寫。用1999年的現代，一個磁碟傳輸類似10-20Mb/s。這必尋道更容易最佳化，因為你能從多個磁碟並行地讀。
  • CPU周期。當我們讀數據進內存時，(或如果它已經在那裡)我們需要處理它以達到我們的結果。當我們有相對內存較小的表時，這是最常見的限制因素，但是用小表速度通常不是問題。
  • 內存帶寬。當CPU需要超出適合cpu緩存的數據時，緩存帶寬就成為內存的一個瓶頸。這是對大多數系統的一個不常見的瓶頸但是你應該知道它。

10.2 系統/編譯時和啟動參數的調節

我們以系統級的東西開始，因為這些決策的某一些很早就做好了。在其他情況下，快速瀏覽這部分可能就夠了，因為它對大收獲並不重要，但是有一個關於在這個層次上收獲有多大的感覺總是好的。

使用的預設OS確實重要！為了最大程度地使用多CPU，應該使用Solaris(因為執行緒工作得確實不錯)或Linux(因為2.2本的核心又確實不錯的SMP支援)。而且在32位的機器上，Linux預設有2G的文件大小限制。當新的文件系統被釋出時( XFS )，希望這不久被修正。

因為我們沒在很多平台上運行生產MySQL，我們忠告你在可能選擇它前，測試你打算運行的平台。

其他建議：

  • 如果你有足夠的RAM，你能刪除所有交換設備。一些作業系統在某些情況下將使用一個SWAP設備，即使你有空閑的內存。
  • 使用--skip-locking的MySQL選項避免外部鎖定。注意這將不影響MySQL功能，只要它僅運行在一個伺服器上。只要在你運行myisamchk以前，記得要停掉伺服器(或鎖定相關部分)。在一些系統上這個開關是強制的，因為外部鎖定不是在任何情況下都工作。當用MIT-pthreads編譯時，--skip-locking選項預設為打開(on)，因為flock()沒在所有的平台上被MIT-pthreads充分支援。唯一的情況是如果你對同一數據運行MySQL伺服器(不是客戶)，你不能使用--skip-locking之時，否則對沒有先清掉(flushing)或先鎖定mysqld伺服器的表上運行myisamchk。你仍然能使用LOCK TABLES/ UNLOCK TABLES，即使你正在使用--skip-locking。

10.2.1 編譯和鏈接怎樣影響MySQL的速度

大多數下列測試在Linux上並用MySQL效能進行的，但是它們應該對其他作業系統和工作負載給出一些指示。

當你用-static鏈接時，你得到最快的可執行文件。使用Unix套接字而非TCP/IP連接一個資料庫也可給出好一些的性能。

在Linux上，當用pgcc和-O6編譯時，你將得到最快的代碼。為了用這些選項編譯“sql_yacc.cc”，你需要大約200M內存，因為gcc/pgcc需要很多內存使所有函數嵌入（inline）。在配置MySQL時，你也應該設定CXX=gcc以避免包括libstdc++庫(它不需要)。

只通過使用一個較好的編譯器或較好的編譯器選項，在應用中你能得到一個10-30%的加速。如果你自己編譯SQL伺服器，這特別重要！

在Intel上，你應該例如使用pgcc或Cygnus CodeFusion編譯器得到最大速度。我們已經測試了新的 Fujitsu編譯器，但是它是還沒足夠不出錯來最佳化編譯MySQL。

這裡是我們做過的一些測量表：

  • 如果你以-O6使用pgcc並且編譯任何東西，mysqld伺服器是比用gcc快11%（用字符串99的版本)。
  • 如果你動態地鏈接(沒有-static)，結果慢了13%。注意你仍能使用一個動態連接的MySQL庫。只有伺服器對性能是關鍵的。
  • 如果你使用TCP/IP而非Unix套接字，結果慢7.5%。
  • 在一個Sun SPARCstation 10上，gcc2.7.3是比Sun Pro C++ 4.2快13%。
  • 在Solaris 2.5.1上，在單個處理器上MIT-pthreads比帶原生執行緒的Solaris慢8-12%。以更多的負載/cpus，差別應該變得更大。

由TcX提供的MySQL-Linux的分發用pgcc編譯並靜態鏈接。

10.2.2 磁碟問題

  • 正如前面所述，磁碟尋道是一個性能的大瓶頸。當數據開始增長以致緩存變得不可能時，這個問題變得越來越明顯。對大資料庫，在那你或多或少地要隨機存取數據，你可以依靠你將至少需要一次磁碟尋道來讀取並且幾次磁碟尋道寫入。為了使這個問題最小化，使用有低尋道時間的磁碟。
  • 為了增加可用磁碟軸的數量(並且從而減少尋道開銷)，符號聯接文件到不同磁碟或分割磁碟是可能的。
    使用符號連接
    這意味著你將索引/數據文件符號從正常的數據目錄鏈接到其他磁碟(那也可以被分割的)。這使得尋道和讀取時間更好(如果磁碟不用於其他事情)。見10.2.2.1 使用資料庫和表的符號鏈接。
    分割
    分割意味著你有許多磁碟並把第一塊放在第一個磁碟上，在第二塊放在第二個磁碟上，並且第 n塊在第(n mod number_of_disks)磁碟上，等等。這意味著，如果你的正常數據大小於分割大小(或完美地排列過)，你將得到較好一些的性能。注意，分割是否很依賴於OS和分割大小。因此用不同的分割大小測試你的應用程式。見10.8 使用你自己的效能。注意對分割的速度差異很依賴於參數，取決於你如何分割參數和磁碟數量，你可以得出以數量級的不同。注意你必須選擇為隨機或順序存取最佳化。
  • 為了可靠，你可能想要使用襲擊RAID 0+1(分割+鏡像)，但是在這種情況下，你將需要2*N個驅動器來保存N個驅動器的數據。如果你有錢，這可能是最好的選擇！然而你也可能必須投資一些卷管理軟件投資以高效地處理它。
  • 一個好選擇是讓稍重要的數據(它能再生)上存在RAID 0磁碟上，而將確實重要的數據(像主機資訊和日誌文件)存在一個RAID 0+1或RAID N磁碟上。如果因為更新奇偶位你有許多寫入，RAID N可能是一個問題。
  • 你也可以對資料庫使用的文件系統設置參數。一個容易的改變是以noatime選項挂裝文件系統。這是它跳過更新在inode中的最後訪問時間，而且這將避免一些磁碟尋道。

10.2.2.1 為資料庫和表使用符號鏈接

你可以從資料庫目錄移動表和資料庫到別處，並且用鏈接到新地點的符號代替它們。你可能想要這樣做，例如，轉移一個資料庫到有更多空閑空間的一個文件系統。

如果MySQL注意到一個表是一個符號鏈接，它將解析符號鏈接並且使用其實際指向的表，它可工作在支援realpath()調用的所有系統上(至少Linux和Solaris支援realpath())！在不支援realpath()的系統上，你應該不同時通過真實路徑和符號鏈接訪問表！如果你這樣做，表在任何更新後將不一致。

MySQL預設不支援資料庫鏈接。只要你不在資料庫之間做一個符號鏈接，一切將工作正常。假定你在MySQL數據目錄下有一個資料庫db1，並且做了一個符號鏈接db2指向db1：

shell> cd /path/to/datadir
shell> ln -s db1 db2

現在，對在db1中的任一表tbl_a，在db2種也好像有一個表tbl_a。如果一個執行緒更新db1.tbl_a並且另一個執行緒更新db2.tbl_a，將有問題。

如果你確實需要這樣，你必須改變下列在“mysys/mf_format.c”中的代碼：

if (!lstat(to,&stat_buff))  /* Check if it's a symbolic link */
    if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff))

把代碼改變為這樣：

if (realpath(to,buff))

10.2.3 調節伺服器參數

你能用這個命令得到mysqld伺服器預設緩衝區大小：

shell> mysqld --help

這個命令產生一張所有mysqld選項和可配置變數的表。輸出包括預設值並且看上去像這樣一些東西：

Possible variables for option --set-variable (-O) are:
back_log              current value: 5
connect_timeout       current value: 5
delayed_insert_timeout  current value: 300
delayed_insert_limit  current value: 100
delayed_queue_size    current value: 1000
flush_time            current value: 0
interactive_timeout   current value: 28800
join_buffer_size      current value: 131072
key_buffer_size       current value: 1048540
lower_case_table_names  current value: 0
long_query_time       current value: 10
max_allowed_packet    current value: 1048576
max_connections       current value: 100
max_connect_errors    current value: 10
max_delayed_threads   current value: 20
max_heap_table_size   current value: 16777216
max_join_size         current value: 4294967295
max_sort_length       current value: 1024
max_tmp_tables        current value: 32
max_write_lock_count  current value: 4294967295
net_buffer_length     current value: 16384
query_buffer_size     current value: 0
record_buffer         current value: 131072
sort_buffer           current value: 2097116
table_cache           current value: 64
thread_concurrency    current value: 10
tmp_table_size        current value: 1048576
thread_stack          current value: 131072
wait_timeout          current value: 28800

如果有一個mysqld伺服器正在運行，通過執行這個命令，你可以看到它實際上使用的變數的值：

shell> mysqladmin variables

每個選項在下面描述。對於緩衝區大小、長度和棧大小的值以字節給出，你能用於個後綴“K”或“M” 指出以K字節或兆字節顯示值。例如，16M指出16兆字節。後綴字母的大小寫沒有關系﹔16M和16m是相同的。

你也可以用命令SHOW STATUS自一個運行的伺服器看見一些統計。見7.21 SHOW語法(得到表、列的資訊)。

back_log
要求MySQL能有的連接數量。當主要MySQL執行緒在一個很短時間內得到非常多的連接請求，這就起作用，然後主執行緒花些時間(盡管很短)檢查連接並且啟動一個新執行緒。back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆疊中。只有如果期望在一個短時間內有很多連接，你需要增加它，換句話說，這值對到來的TCP/IP連接的偵聽隊列的大小。你的作業系統在這個隊列大小上有它自己的限制。 Unix listen(2)系統調用的手冊頁應該有更多的細節。檢查你的OS文檔找出這個變數的最大值。試圖設定back_log高於你的作業系統的限制將是無效的。
connect_timeout
mysqld伺服器在用Bad handshake（糟糕的交握）應答前正在等待一個連接報文的秒數。
delayed_insert_timeout
一個INSERT DELAYED執行緒應該在終止之前等待INSERT語句的時間。
delayed_insert_limit
在插入delayed_insert_limit行後，INSERT DELAYED處理器將檢查是否有任何SELECT語句未執行。如果這樣，在繼續前執行允許這些語句。
delayed_queue_size
應該為處理INSERT DELAYED分配多大一個隊列(以行數)。如果排隊滿了，任何進行INSERT DELAYED的客戶將等待直到隊列又有空間了。
flush_time
如果這被設置為非零值，那麼每flush_time秒所有表將被關閉(以釋放資源和sync到磁碟)。
interactive_timeout
伺服器在關上它前在一個交互連接上等待行動的秒數。一個交互的客戶被定義為對mysql_real_connect()使用CLIENT_INTERACTIVE選項的客戶。也可見wait_timeout。
join_buffer_size
用於全部聯結(join)的緩衝區大小(不是用索引的聯結)。緩衝區對2個表間的每個全部聯結分配一次緩衝區，當增加索引不可能時，增加該值可得到一個更快的全部聯結。（通常得到快速聯結的最佳方法是增加索引。）
key_buffer_size
索引塊是緩沖的並且被所有的執行緒共享。key_buffer_size是用於索引塊的緩衝區大小，增加它可得到更好處理的索引(對所有讀和多重寫)，到你能負擔得起那樣多。如果你使它太大，系統將開始換頁並且真的變慢了。記住既然MySQL不緩存讀取的數據，你將必須為OS文件系統緩存留下一些空間。為了在寫入多個行時得到更多的速度，使用LOCK TABLES。見7.24LOCK TABLES/UNLOCK TABLES語法。
long_query_time
如果一個查詢所用時間超過它(以秒計)，Slow_queries記數器將被增加。
max_allowed_packet
一個包的最大尺寸。消息緩衝區被初始化為net_buffer_length字節，但是可在需要時增加到max_allowed_packet個字節。預設地，該值太小必能捕捉大的(可能錯誤)包。如果你正在使用大的BLOB列，你必須增加該值。它應該像你想要使用的最大BLOB的那麼大。
max_connections
允許的同時客戶的數量。增加該值增加mysqld要求的文件描述符的數量。見下面對文件描述符限制的注釋。見18.2.4 Too many connections錯誤。
max_connect_errors
如果有多於該數量的從一台主機中斷的連接，這台主機阻止進一步的連接。你可用FLUSH HOSTS命令疏通一台主機。
max_delayed_threads
不要啟動多於的這個數字的執行緒來處理INSERT DELAYED語句。如果你試圖在所有INSERT DELAYED執行緒在用後向一張新表插入數據，行將被插入，就像DELAYED屬性沒被指定那樣。
max_join_size
可能將要讀入多於max_join_size個記錄的聯結將返回一個錯誤。如果你的用戶想要執行沒有一個WHERE子句、花很長時間並且返回百萬行的聯結，設置它。
max_sort_length
在排序BLOB或TEXT值時使用的字節數(每個值僅頭max_sort_length個字節被使用﹔其餘的被忽略)。
max_tmp_tables
（該選擇目前還不做任何事情)。一個客戶能同時保持打開的臨時表的最大數量。
net_buffer_length
通信緩衝區在查詢之間被重置到該大小。通常這不應該被改變，但是如果你有很少的內存，你能將它設置為查詢期望的大小。（即，客戶發出的SQL語句期望的長度。如果語句超過這個長度，緩衝區自動地被擴大，直到max_allowed_packet個字節。）
record_buffer
每個進行一個順序掃描的執行緒為其掃描的每張表分配這個大小的一個緩衝區。如果你做很多順序掃描，你可能想要增加該值。
sort_buffer
每個需要進行排序的執行緒分配該大小的一個緩衝區。增加這值加速ORDER BY或GROUP BY操作。見18.5 MySQL在哪兒儲存臨時文件。
table_cache
為所有執行緒打開表的數量。增加該值能增加mysqld要求的文件描述符的數量。MySQL對每個唯一打開的表需要2個文件描述符，見下面對文件描述符限制的注釋。對於表緩存如何工作的資訊，見10.2.4 MySQL怎樣打開和關閉表。
tmp_table_size
如果一張臨時表超出該大小，MySQL產生一個The table tbl_name is full形式的錯誤，如果你做很多高級GROUP BY查詢，增加tmp_table_size值。
thread_stack
每個執行緒的棧大小。由crash-me測試檢測到的許多限制依賴於該值。預設隊一般的操作是足夠大了。見10.8 使用你自己的效能。
wait_timeout
伺服器在關閉它之前在一個連接上等待行動的秒數。也可見interactive_timeout。

MySQL使用是很具伸縮性的算法，因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。

如果你有很多內存和很多表並且有一個中等數量的客戶，想要最大的性能，你應該一些像這樣的東西：

shell> safe_mysqld -O key_buffer=16M -O table_cache=128 \
           -O sort_buffer=4M -O record_buffer=1M &

如果你有較少的內存和大量的連接，使用這樣一些東西：
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \
           -O record_buffer=100k &

或甚至：
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \
           -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &

如果有很多連接，“交換問題”可能發生，除非mysqld已經被配置每個連接使用很少的內存。當然如果你對所有連接有足夠的內存，mysqld執行得更好。

注意，如果你改變mysqld的一個選項，它實際上只對伺服器的那個例子保持。

為了明白一個參數變化的效果，這樣做：

shell> mysqld -O key_buffer=32m --help

保証--help選項是最後一個﹔否則，命令行上在它之後列出的任何選項的效果將不在反映在輸出中。

10.2.4 MySQL怎樣打開和關閉資料庫表

table_cache, max_connections和max_tmp_tables影響伺服器保持打開的文件的最大數量。如果你增加這些值的一個或兩個，你可以遇到你的作業系統每個進程打開文件描述符的數量上強加的限制。然而，你可以能在許多系統上增加該限制。請教你的OS文檔找出如何做這些，因為改變限制的方法各系統有很大的不同。

table_cache與max_connections有關。例如，對於200個打開的連接，你應該讓一張表的緩沖至少有200 * n，這裡n是一個聯結(join)中表的最大數量。

打開表的緩存可以增加到一個table_cache的最大值（預設為64﹔這可以用mysqld的-O table_cache=#選項來改變）。一個表絕對不被關閉，除非當緩存滿了並且另外一個執行緒試圖打開一個表時或如果你使用mysqladmin refresh或mysqladmin flush-tables。

當表緩存滿時，伺服器使用下列程序找到一個緩存入口來使用：

  • 不是當前使用的表被釋放，以最近最少使用（LRU）順序。
  • 如果緩存滿了並且沒有表可以釋放，但是一個新表需要打開，緩存必須臨時被擴大。
  • 如果緩存處於一個臨時擴大狀態並且一個表從在用變為不在用狀態，它被關閉並從緩存中釋放。

對每個並發存取打開一個表。這意味著，如果你讓2個執行緒存取同一個表或在同一個查詢中存取表兩次(用AS)，表需要被打開兩次。任何表的第一次打開占2個文件描述符﹔表的每一次額外使用僅占一個文件描述符。對於第一次打開的額外描述符用於索引文件﹔這個描述符在所有執行緒之間共享。

10.2.5 在同一個資料庫中創建大量資料庫表的缺點

如果你在一個目錄中有許多文件，打開、關閉和創建操作將會很慢。如果你執行在許多不同表上的SELECT語句，當表緩存滿時，將有一點開銷，因為對每個必須打開的表，另外一個必須被關閉。你可以通過使表緩沖更大些來減少這個開銷。

10.2.6 為什麼有這麼多打開的表？

當你運行mysqladmin status時，你將看見像這樣的一些東西：

Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12

如果你僅有6個表，這可能有點令人困惑。

MySQL是多執行緒的，因此它可以同時在同一個表上有許多詢問。為了是2個執行緒在同一個文件上有不同狀態的問題減到最小，表由每個並發進程獨立地打開。這為數據文件消耗一些內存和一個額外的文件描述符。索引文件描述符在所有執行緒之間共享。

10.2.7 MySQL怎樣使用內存

下表指出mysqld伺服器使用儲存器的一些方式。在應用的地方，給出與儲存器使用相關的伺服器變數的名字。

  • 關鍵字緩衝區(變數key_buffer_size)由所有執行緒分享﹔當需要時，分配伺服器使用的其他緩衝區。見10.2.3 調節伺服器參數。
  • 每個連接使用一些執行緒特定的空間﹔一個棧(預設64K，變數thread_stack)、一個連接緩衝區(變數net_buffer_length)和一個結果緩衝區(變數net_buffer_length)。當需要時，連接緩衝區和結果緩衝區動態地被擴大到max_allowed_packet。當一個查詢正在運行當前查詢的一個拷貝時，也分配字符串。
  • 所有執行緒共享同一基儲存器。
  • 目前還沒有什麼是內存映射的(除了壓縮表，但是那是另外一個的故事)。這是因為4GB的32位儲存器空間對最大的資料庫來所不是足夠大的。當一個64位尋址空間的系統變得更普遍時，我們可以為內存映射增加全面的支援。
  • 每個做順序掃描的請求分配一個讀緩衝區(變數record_buffer)。
  • 所有聯結均用一遍完成並且大多數聯結可以甚至不用一張臨時表來完成。最臨時的表是基於內存的(HEAP)表。有較大記錄長度(以所有列的長度之和計算)的臨時表或包含BLOB列的表在磁碟上儲存。在MySQL版本3.23.2前一個問題是如果一張HEAP表超過tmp_table_size的大小，你得到錯誤The table tbl_name is full。在更新的版本中，這通過必要時自動將在內存的(HEAP)表轉變為一個基於磁碟(MyISAM)的表來處理。為了解決這個問題，你可以通過設置mysqld的tmp_table_size選項，或通過在客戶程式中設置SQL的SQL_BIG_TABLES選項增加臨時表的大小。見7.25 SET OPTION句法。在MySQL 3.20中，臨時表的最大尺寸是record_buffer*16，因此如果你正在使用這個版本，你必須增加record_buffer值。你也可以使用--big-tables選項啟動mysqld以總將臨時表儲存在磁碟上，然而，這將影響許多複雜查詢的速度。
  • 大多數做排序的請求分配一個排序緩衝區和一個或二個臨時文件。見18.5 MySQL在哪兒儲存臨時文件。
  • 幾乎所有的語法分析和計算都在一家本地儲存器中完成。對小項目沒有內存開銷並且一般的較慢儲存器分配和釋放被避免。內存僅為出乎意料的大字符串分配(這用malloc()和free()完成)。
  • 每個索引文件只被打開一次，並且數據文件為每個並發運行的執行緒打開一次。對每個並發執行緒，分配一個表結構、對每列的列結構和大小為3 * n的一個緩衝區(這裡n是最大的行長度，不算BLOB列)。一個BLOB使用5 ∼ 8個字節加上BLOB數據。
  • 對每個有BLOB列的表，一個緩衝區動態地被擴大以便讀入更大的BLOB值。如果你掃描一個表，分配與最大BLOB值一樣大的一個緩衝區。
  • 對所有在用的表的表處理器被保存在一個緩存中並且作為一個FIFO管理。通常緩存有64個入口。如果一個表同時被2個運行的執行緒使用，緩存為此包含2個入口。見10.2.4 MySQL如何打開和關閉資料庫表。
  • 一個mysqladmin flush-tables命令關閉所有不在用的表並在當前執行的執行緒結束時，標記所有在用的表準備被關閉。這將有效地釋放大多數在用的內存。

ps和其他系統狀態程式可以報導mysqld使用很多內存。這可以是在不同的內存地址上的執行緒棧造成的。例如，Solaris版本的ps將棧間未用的內存算作已用的內存。你可以通過用swap -s檢查可用交換區來驗証它。我們用商業內存漏洞探查器測試了mysqld，因此應該有沒有內存漏洞。

10.2.8 MySQL怎樣鎖定資料庫表

MySQL中所有鎖定不會是死鎖的。這通過總是在一個查詢前立即請求所有必要的鎖定並且總是以同樣的順序鎖定表來管理。

對WRITE，MySQL使用的鎖定方法原理如下：

  • 如果在表上沒有鎖，放一個鎖在它上面。
  • 否則，把鎖定請求放在寫鎖定隊列中。

對READ，MySQL使用的鎖定方法原理如下：

  • 如果在表上沒有寫鎖定，把一個讀鎖定放在它上面。
  • 否則，把鎖請求放在讀鎖定隊列中。

當一個鎖定被釋放時，鎖定可被寫鎖定隊列中的執行緒得到，然後是讀鎖定隊列中的執行緒。

這意味著，如果你在一個表上有許多更改，SELECT語句將等待直到有沒有更多的更改。

為了解決在一個表中進行很多INSERT和SELECT操作的情況，你可在一張臨時表中插入行並且偶爾用來自臨時表的記錄更新真正的表。

這可用下列代碼做到：

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;

如果你在一些特定的情況字下區分檢索的優先次序，你可以使用LOW_PRIORITY選項的INSERT。見7.14 INSERT句法。

你也能改變在“mysys/thr_lock.c”中的鎖代碼以使用一個單個隊列。在這種情況下，寫鎖定和讀鎖定將有同樣優先級，它可能幫助一些應用程式。

10.2.9 資料庫表級鎖定的問題

MySQL的表鎖定代碼是不會死鎖的。

MySQL使用表級鎖定(而不是行級鎖定或列級鎖定)以達到很高的鎖定速度。對於大表，表級鎖定對大多數應用程式來說比行級鎖定好一些，但是當然有一些缺陷。

在MySQL3.23.7和更高版本中，一個人能把行插入到MyISAM表同時其他執行緒正在讀該表。注意，目前只有在表中內有刪除的行時才工作。

表級鎖定使很多執行緒能夠同時讀一個表，但是如果一個執行緒想要寫一個表，它必須首先得到獨占存取權。在更改期間，所有其他想要存取該特定表的執行緒將等到更改就緒。

因為資料庫的更改通常被視為比SELECT更重要，更新一個表的所有語句比從一個表中檢索資訊的語句有更高的優先級。這應該保証更改不被“餓死”，因為一個人針對一個特定表會發出很多繁重的查詢。

從MySQL 3.23.7開始，一個人可以能使用max_write_lock_count變數強制MySQL在一個表上一個特定數量的插入後發出一個SELECT。

對此一個主要的問題如下：

  • 一個客戶發出一個花很長時間運行的SELECT。
  • 然後其他客戶在一個使用的表上發出一個UPDATE﹔這個客戶將等待直到SELECT完成。
  • 另一個客戶在同一個表上發出另一個SELECT語句﹔因為UPDATE比SELECT有更高的優先級，該SELECT將等待UPDATE的完成。它也將等待第一個SELECT完成！

對這個問題的一些可能的解決方案是：

  • 試著使SELECT語句運行得更快﹔你可能必須創建一些摘要(summary)表做到這點。
  • 用--low-priority-updates啟動mysqld。這將給所有更新(修改)一個表的語句以比SELECT語句低的優先級。在這種情況下，在先前情形的最後的SELECT語句將在INSERT語句前執行。
  • 你可以用LOW_PRIORITY屬性給與一個特定的INSERT、UPDATE或DELETE語句較低優先級。
  • 為max_write_lock_count指定一個低值來啟動mysqld使得在一定數量的WRITE鎖定後給出READ鎖定。
  • 通過使用SQL命令：SET SQL_LOW_PRIORITY_UPDATES=1，你可從一個特定執行緒指定所有的更改應該由用低優先級完成。見7.25 SET OPTION句法。
  • 你可以用HIGH_PRIORITY屬性指明一個特定SELECT是很重要的。見7.12 SELECT句法。
  • 如果你有關於INSERT結合SELECT的問題，切換到使用新的MyISAM表，因為它們支援並發的SELECT和INSERT。
  • 如果你主要混合INSERT和SELECT語句，DELAYED屬性的INSERT將可能解決你的問題。見7.14 INSERT句法。
  • 如果你有關於SELECT和DELETE的問題，LIMIT選項的DELETE可以幫助你。見7.11 DELETE句法。

10.3 使你的數據盡可能小

最基本的最佳化之一是使你的數據(和索引)在磁碟上(並且在內存中)占據的空間盡可能小。這能給出巨大的改進，因為磁碟讀入較快並且通常也用較少的主儲存器。如果在更小的列上做索引，索引也占據較少的資源。

你能用下面的技術使表的性能更好並且使儲存空間最小：

  • 盡可能地使用最有效(最小)的類型。MySQL有很多節省磁碟空間和內存的專業化類型。
  • 如果可能使表更小，使用較小的整數類型。例如，MEDIUMINT經常比INT好一些。
  • 如果可能，聲明列為NOT NULL。它使任何事情更快而且你為每列節省一位。注意如果在你的應用程式中你確實需要NULL，你應該毫無疑問使用它，只是避免預設地在所有列上有它。
  • 如果你沒有任何變長列(VARCHAR、TEXT或BLOB列)，使用固定尺寸的記錄格式。這比較快但是不幸地可能會浪費一些空間。見10.6 選擇一種表類型。
  • 每張桌子應該有盡可能短的主索引。這使一行的辨認容易而有效。
  • 對每個表，你必須決定使用哪種儲存/索引方法。見9.4 MySQL表類型。也可參見10.6 選擇一種表類型。
  • 只創建你確實需要的索引。索引對檢索有好處但是當你需要快速儲存東西時就變得糟糕。如果你主要通過搜索列的組合來存取一個表，以它們做一個索引。第一個索引部分應該是最常用的列。如果你總是使用許多列，你應該首先以更多的副本使用列以獲得更好的列索引壓縮。
  • 如果很可能一個索引在頭幾個字符上有唯一的前綴，僅僅索引該前綴比較好。MySQL支援在一個字符列的一部分上的索引。更短的索引更快，不僅因為他們占較少的磁碟空間而且因為他們將在索引緩存中給你更多的命中率並且因此有更少磁碟尋道。見10.2.3 調節伺服器參數。
  • 在一些情形下，分割一個經常被掃描進2個表的表是有益的。特別是如果它是一個動態格式的表並且它可能使一個能用來掃描後找出相關行的較小靜態格式的表。

10.4 MySQL索引的使用

索引被用來快速找出在一個列上用一特定值的行。沒有索引，MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。表越大，花費時間越多。如果表對於查詢的列有一個索引，MySQL能快速到達一個位置去搜尋到數據文件的中間，沒有必要考慮所有數據。如果一個表有1000行，這比順序讀取至少快100倍。注意你需要存取幾乎所有1000行，它較快的順序讀取，因為此時我們避免磁碟尋道。

所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中儲存。字符串是自動地壓縮前綴和結尾空間。見7.27 CREATE INDEX句法。

索引用於：

  • 快速找出匹配一個WHERE子句的行。
  • 當執行聯結時，從其他表檢索行。
  • 對特定的索引列找出MAX()或MIN()值。
  • 如果排序或分組在一個可用鍵的最左面前綴上進行(例如，ORDER BY key_part_1,key_part_2)，排序或分組一個表。如果所有鍵值部分跟隨DESC，鍵以倒序被讀取。
  • 在一些情況中，一個查詢能被最佳化來檢索值，不用咨詢數據文件。如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面前綴，為了更快，值可以從索引樹被檢索出來。

假定你發出下列SELECT語句：

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果一個多列索引存在於col1和col2上，適當的行可以直接被取出。如果分開的單行列索引存在於col1和col2上，最佳化器試圖通過決定哪個索引將找到更少的行並來找出更具限制性的索引並且使用該索引取行。

如果表有一個多列索引，任何最左面的索引前綴能被最佳化器使用以找出行。例如，如果你有一個3行列索引(col1,col2,col3)，你已經索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。

如果列不構成索引的最左面前綴，MySQL不能使用一個部分的索引。假定你下面顯示的SELECT語句：

mysql> SELECT * FROM tbl_name WHERE col1=val1;
mysql> SELECT * FROM tbl_name WHERE col2=val2;
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

如果一個索引存在於(col1、col2、col3)上，只有上面顯示的第一個查詢使用索引。第二個和第三個查詢確實包含索引的列，但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前綴。

如果LIKE參數是一個不以一個通配符字符起始的一個常數字符串，MySQL也為LIKE比較使用索引。例如，下列SELECT語句使用索引：

mysql> select * from tbl_name where key_col LIKE "Patrick%";
mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

在第一條語句中，只考慮有"Patrick" <= key_col < "Patricl"的行。在第二條語句中，只考慮有"Pat" <= key_col < "Pau"的行。

下列SELECT語句將不使用索引：

mysql> select * from tbl_name where key_col LIKE "%Patrick%";
mysql> select * from tbl_name where key_col LIKE other_col;

在第一條語句中，LIKE值以一個通配符字符開始。在第二條語句中，LIKE值不是一個常數。

如果 column_name 是一個索引，使用column_name IS NULL的搜索將使用索引。

MySQL通常使用找出最少數量的行的索引。一個索引被用於你與下列操作符作比較的列：=、>、>=、<、<=、BETWEEN和一個有一個非通配符前綴像'something%'的LIKE的列。

任何不跨越的在WHERE子句的所有AND層次的索引不用來最佳化詢問。

下列WHERE子句使用索引：

... WHERE index_part1=1 AND index_part2=2
... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
... WHERE index_part1='hello' AND index_part_3=5
          /* optimized like "index_part1='hello'" */

這些WHERE子句不使用索引：

... WHERE index_part2=1 AND index_part3=2  /* index_part_1 is not used */
... WHERE index=1 OR A=10                  /* No index */
... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows */

10.5 存取或更新數據的查詢速度

首先，一件事情影響所有的詢問。你有的許可系統設置越複雜，你得到更多的開銷。

如果你不讓任何GRANT語句執行，MySQL將稍微最佳化許可檢查。因此如果你有很大量，值得花時間來避免授權，否則更多的許可檢查有更大的開銷。

如果你的問題是與一些明顯的MySQL函數有關，你總能在MySQL客戶中計算其時間：

mysql> select benchmark(1000000,1+1);
+------------------------+
| benchmark(1000000,1+1) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.32 sec)

上面顯示MySQL能在PentiumII 400MHz上以0.32秒執行1,000,000個+表達式。

所有MySQL函數應該被高度最佳化，但是以可能有一些例外並且benchmark(loop_count,expression)是找出是否你的查詢有問題的一個極好工具。

10.5.1 估計查詢性能

在大多數情況下，你能通過計算磁碟尋道估計性能。對小的表，你通常能在1次磁碟尋道中找到行(因為這個索引可能被緩沖)。對更大的表，你能估計它(使用 B++ 樹索引)，你將需要：log(row_count)/log(index_block_length/3*2/(index_length + data_pointer_length))+1次尋道找到行。

在MySQL中，索引塊通常是1024個字節且數據指針通常是4個字節，這對一個有一個索引長度為3(中等整數)的 500,000 行的表給你：log(500,000)/log(1024/3*2/(3+4)) + 1= 4 次尋道。

像上面的索引將要求大約 500,000 * 7 * 3/2 = 5.2M，(假設索引緩衝區被充滿到2/3(它是典型的))，你將可能在內存中有索引的大部分並且你將可能僅需要1-2調用從OS讀數據來找出行。

然而對於寫，你將需要 4 次尋道請求(如上)來找到在哪兒存放新索引並且通常需2次尋道更新這個索引並且寫入行。

注意，上述不意味著你的應用程式將緩慢地以 N log N 退化！當表格變得更大時，只要一切被OS或SQL伺服器緩沖，事情將僅僅或多或少地更慢。在數據變得太大不能被緩沖後，事情將開始變得更慢直到你的應用程式僅僅受磁碟尋道限制(它以N log N增加)。為了避免這個增加，索引緩沖隨數據增加而增加。見10.2.3 調節伺服器參數。

10.5.2 SELECT查詢的速度

總的來說，當你想要使一個較慢的SELECT ... WHERE更快，檢查的第一件事情是你是否能增加一個索引。見10.4 MySQL 索引的使用。在不同表之間的所有引用通常應該用索引完成。你可以使用EXPLAIN來確定哪個索引用於一條SELECT語句。見7.22 EXPLAIN句法(得到關於一條SELECT的資訊)。

一些一般的建議：

  • 為了幫助MySQL更好地最佳化查詢，在它已經裝載了相關數據後，在一個表上運行myisamchk --analyze。這為每一個更新一個值，指出有相同值地平均行數（當然，對唯一索引，這總是1。）
  • 為了根據一個索引排序一個索引和數據，使用myisamchk --sort-index --sort-records=1（如果你想要在索引1上排序)。如果你有一個唯一索引，你想要根據該索引地次序讀取所有的記錄，這是使它更快的一個好方法。然而注意，這個排序沒有被最佳地編寫，並且對一個大表將花很長時間！

10.5.3 MySQL怎樣最佳化WHERE子句

where最佳化被放在SELECT中，因為他們最主要在那裡使用裡，但是同樣的最佳化被用於DELETE和UPDATE語句。

也要注意，本節是不完全的。MySQL確實作了許多最佳化而我們沒有時間全部記錄他們。

由MySQL實施的一些最佳化列在下面：

  • 刪除不必要的括號：
       ((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
  • 常數調入：
       (a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
  • 刪除常數條件(因常數調入所需)：
       (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
  • 索引使用的常數表達式僅計算一次。
  • 在一個單個表上的沒有一個WHERE的COUNT(*)直接從表中檢索資訊。當僅使用一個表時，對任何NOT NULL表達式也這樣做。
  • 無效常數表達式的早期檢測。MySQL快速檢測某些SELECT語句是不可能的並且不返回行。
  • 如果你不使用GROUP BY或分組函數(COUNT()、MIN()……)，HAVING與WHERE合並。
  • 為每個子聯結(sub join)，構造一個更簡單的WHERE以得到一個更快的WHERE計算並且也盡快跳過記錄。
  • 所有常數的表在查詢中的任何其他表前被首先讀出。一個常數的表是：
    • 一個空表或一個有1行的表。
    • 與在一個UNIQUE索引、或一個PRIMARY KEY的WHERE子句一起使用的表，這裡所有的索引部分使用一個常數表達式並且索引部分被定義為NOT NULL。

    所有下列的表用作常數表：

    mysql> SELECT * FROM t WHERE primary_key=1;
mysql> SELECT * FROM t1,t2
           WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
  • 對聯結表的最好聯結組合是通過嘗試所有可能性來找到:(。如果所有在ORDER BY和GROUP BY的列來自同一個表，那麼當廉潔時，該表首先被選中。
  • 如果有一個ORDER BY子句和一個不同的GROUP BY子句，或如果ORDER BY或GROUP BY包含不是來自聯結隊列中的第一個表的其他表的列，創建一個臨時表。
  • 如果你使用SQL_SMALL_RESULT，MySQL將使用一個在內存中的表。
  • 因為DISTINCT被變換到在所有的列上的一個GROUP BY，DISTINCT與ORDER BY結合也將在許多情況下需要一張臨時表。
  • 每個表的索引被查詢並且使用跨越少於30% 的行的索引。如果這樣的索引沒能找到，使用一個快速的表掃描。
  • 在一些情況下，MySQL能從索引中讀出行，甚至不咨詢數據文件。如果索引使用的所有列是數字的，那麼只有索引樹被用來解答查詢。
  • 在每個記錄被輸出前，那些不匹配HAVING子句的行被跳過。

下面是一些很快的查詢例子：

mysql> SELECT COUNT(*) FROM tbl_name;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
mysql> SELECT MAX(key_part2) FROM tbl_name
           WHERE key_part_1=constant;
mysql> SELECT ... FROM tbl_name
           ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM tbl_name
           ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;

下列查詢僅使用索引樹就可解決(假設索引列是數字的)：

mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM tbl_name
           WHERE key_part1=val1 AND key_part2=val2;
mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;

下列查詢使用索引以排序順序檢索，不用一次另外的排序：

mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...

10.5.4 MySQL怎樣最佳化LEFT JOIN

在MySQL 中，A LEFT JOIN B實現如下：

  • 表B被設置為依賴於表A。
  • 表A被設置為依賴於所有用在LEFT JOIN條件的表(除B外)。
  • 所有LEFT JOIN條件被移到WHERE子句中。
  • 進行所有標準的聯結最佳化，除了一個表總是在所有它依賴的表之後被讀取。如果有一個循環依賴，MySQL將發出一個錯誤。
  • 進行所有標準的WHERE最佳化。
  • 如果在A中有一行匹配WHERE子句，但是在B中沒有任何行匹配LEFT JOIN條件，那麼在B刈谹成所有列設置為NULL的一行。
  • 如果你使用LEFT JOIN來找出在某些表中不存在的行並且在WHERE部分你有下列測試：column_name IS NULL，這裡column_name 被聲明為NOT NULL的列，那麼MySQL在它已經找到了匹配LEFT JOIN條件的一行後，將停止在更多的行後尋找(對一特定的鍵組合)。

10.5.5 MySQL怎樣最佳化LIMIT

在一些情況中，當你使用LIMIT #而不使用HAVING時，MySQL將以不同方式處理查詢。

  • 如果你用LIMIT只選擇一些行，當MySQL一般比較喜歡做完整的表掃描時，它將在一些情況下使用索引。
  • 如果你使用LIMIT #與ORDER BY，MySQL一旦找到了第一個 # 行，將結束排序而不是排序整個表。
  • 當結合LIMIT #和DISTINCT時，MySQL一旦找到#個唯一的行，它將停止。
  • 在一些情況下，一個GROUP BY能通過順序讀取鍵(或在鍵上做排序)來解決，並然後計算摘要直到鍵值改變。在這種情況下，LIMIT #將不計算任何不必要的GROUP。
  • 只要MySQL已經發送了第一個#行到客戶，它將放棄查詢。
  • LIMIT 0將總是快速返回一個空集合。這對檢查查詢並且得到結果列的列類型是有用的。
  • 臨時表的大小使用LIMIT #計算需要多少空間來解決查詢。

10.5.6 INSERT查詢的速度

插入一個記錄的時間由下列組成：

  • 連接：(3)
  • 發送查詢給伺服器：(2)
  • 分析查詢：(2)
  • 插入記錄：（1 x 記錄大小）
  • 插入索引：（1 x 索引）
  • 關閉：(1)

這裡的數字有點與總體時間成正比。這不考慮打開表的初始開銷(它為每個並發運行的查詢做一次)。

表的大小以N log N (B 樹)的速度減慢索引的插入。

加快插入的一些方法：

  • 如果你同時從同一客戶插入很多行，使用多個值表的INSERT語句。這比使用分開INSERT語句快(在一些情況中幾倍)。
  • 如果你從不同客戶插入很多行，你能通過使用INSERT DELAYED語句得到更高的速度。見7.14 INSERT句法。
  • 注意，用MyISAM，如果在表中沒有刪除的行，能在SELECT:s正在運行的同時插入行。
  • 當從一個文本文件裝載一個表時，使用LOAD DATA INFILE。這通常比使用很多INSERT語句快20倍。見7.16 LOAD DATA INFILE句法。
  • 當表有很多索引時，有可能多做些工作使得LOAD DATA INFILE更快些。使用下列程序：
    1. 有選擇地用CREATE TABLE創建表。例如使用mysql或Perl-DBI。
    2. 執行FLUSH TABLES，或外殼命令mysqladmin flush-tables。
    3. 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。這將從表中刪除所有索引的使用。
    4. 用LOAD DATA INFILE把數據插入到表中，這將不更新任何索引，因此很快。
    5. 如果你有myisampack並且想要壓縮表，在它上面運行myisampack。見10.6.3 壓縮表的特徵。
    6. 用myisamchk -r -q /path/to/db/tbl_name再創建索引。這將在將它寫入磁碟前在內存中創建索引樹，並且它更快，因為避免大量磁碟尋道。結果索引樹也被完美地平衡。
    7. 執行FLUSH TABLES，或外殼命令mysqladmin flush-tables。

    這個程序將被構造進在MySQL的某個未來版本的LOAD DATA INFILE。

  • 你可以鎖定你的表以加速插入。
    mysql> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;

    主要的速度差別是索引緩衝區僅被清洗到磁碟上一次，在所有INSERT語句完成後。一般有與有不同的INSERT語句那樣奪的索引緩衝區清洗。如果你能用一個單個語句插入所有的行，鎖定就不需要。鎖定也將降低多連接測試的整體時間，但是對某些執行緒最大等待時間將上升(因為他們等待鎖)。例如：

    thread 1 does 1000 inserts
thread 2, 3, and 4 does 1 insert
thread 5 does 1000 inserts

    如果你不使用鎖定，2、3和4將在1和5前完成。如果你使用鎖定，2、3和4將可能不在1或5前完成，但是整體時間應該快大約40%。因為INSERT, UPDATE和DELETE操作在MySQL中是很快的，通過為多於大約5次連續不斷地插入或更新一行的東西加鎖，你將獲得更好的整體性能。如果你做很多一行的插入，你可以做一個LOCK TABLES，偶爾隨後做一個UNLOCK TABLES(大約每1000行)以允許另外的執行緒存取表。這仍然將導致獲得好的性能。當然，LOAD DATA INFILE對裝載數據仍然是更快的。

為了對LOAD DATA INFILE和INSERT得到一些更快的速度，擴大關鍵字緩衝區。見10.2.3 調節伺服器參數。

10.5.7 UPDATE查詢的速度

更改查詢被最佳化為有一個寫開銷的一個SELECT查詢。寫速度依賴於被更新數據大小和被更新索引的數量。

使更改更快的另一個方法是推遲更改並且然後一行一行地做很多更改。如果你鎖定表，做一行一行地很多更改比一次做一個快。

注意，動態記錄格式的更改一個較長總長的記錄，可能切開記錄。因此如果你經常這樣做，時不時地OPTIMIZE TABLE是非常重要的。見7.9 OPTIMIZE TABLE句法。

10.5.8 DELETE查詢的速度

刪除一個記錄的時間精確地與索引數量成正比。為了更快速地刪除記錄，你可以增加索引緩存的大小。見10.2.3 調節伺服器參數。

從一個表刪除所有行比刪除行的一大部分也要得多。

10.6 選擇一種表類型

用MySQL，當前(版本 3.23.5)你能從一個速度觀點在4可用表的格式之間選擇。

靜態MyISAM
這種格式是最簡單且最安全的格式，它也是在磁碟格式最快的。速度來自於數據能在磁碟上被找到的難易方式。當所定有一個索引和靜態格式的東西時，它很簡單，只是行長度乘以行數量。而且在掃描一張表時，用每次磁碟讀取來讀入常數個記錄是很容易的。安全性來自於如果當寫入一個靜態MyISAM文件時，你的計算機崩潰，myisamchk能很容易指出每行在哪兒開始和結束，因此它通常能回收所有記錄，除了部分被寫入的那個。注意，在MySQL中，所有索引總能被重建。
動態MyISAM
這種格式有點複雜，因為每一行必須有一個頭說明它有多長。當一個記錄在更改時變長時，它也可以在多於一個位置上結束。你能使用OPTIMIZE table或myisamchk整理一張表。如果你在同一個表中有像某些VARCHAR或BLOB列那樣存取/改變的靜態數據，將動態列移入另外一個表以避免碎片可能是一個好主意。
壓縮MyISAM
這是一個只讀類型，用可選的myisampack工具產生。
內存(HEAP 堆）
這種表格式對小型/中型查找表十分有用。對拷貝/創建一個常用的查找表(用聯結)到一個(也許臨時)HEAP表有可能加快多個表聯結。假定我們想要做下列聯結，用同樣數據可能要幾倍時間。
SELECT tab1.a, tab3.a FROM tab1, tab2, tab3
        WHERE tab1.a = tab2.a and tab2.a = tab3.a and tab2.c != 0;

為了加速它，我們可用tab2和tab3的聯結創建一張臨時表，因為用相同列( tab1.a )查找。這裡是創建該表和結果選擇的命令。

CREATE TEMPORARY TABLE test TYPE=HEAP
        SELECT
                tab2.a as a2, tab3.a as a3
        FROM
                tab2, tab3
        WHERE
                tab2.a = tab3.a and c = 0;
SELECT tab1.a, test.a3 from tab1, test where tab1.a = test.a1;
SELECT tab1.b, test.a3 from tab1, test where tab1.a = test.a1 and something;

10.6.1 靜態(定長)表的特點

  • 這是預設格式。它用在表不包含VARCHAR、BLOB或TEXT列時候。
  • 所有的CHAR、NUMERIC和DECIMAL列充填到列寬度。
  • 非常快。
  • 容易緩沖。
  • 容易在崩潰後重建，因為記錄位於固定的位置。
  • 不必被重新組織(用myisamchk)，除非一個巨量的記錄被刪除並且你想要歸還空閑磁碟空間給作業系統。
  • 通常比動態表需要更多的磁碟空間。

10.6.2 動態表的特點

  • 如果表包含任何VARCHAR、BLOB或TEXT列，使用該格式。
  • 所有字符串列是動態的(除了那些長度不到4的列)。
  • 每個記錄前置一個位圖，對字符串列指出哪個列是空的('')，或對數字列哪個是零(這不同於包含NULL值的列)。如果字符串列在刪除尾部空白後有零長度，或數字列有零值，它在位圖中標記並且不保存到磁碟上。非空字符串儲存為一個長度字節加字符串內容。
  • 通常比定長表占更多的磁碟空間。
  • 每個記錄僅使用所需的空間。如果一個記錄變得更大，它按需要被切開多段，這導致記錄碎片。
  • 如果你與超過行長度的資訊更新行，行將被分段。在這種情況中，你可能必須時時運行myisamchk -r以使性能更好。使用myisamchk -ei tbl_name做一些統計。
  • 在崩潰後不容易重建，因為一個記錄可以是分很多段並且一個連接(碎片)可以丟失。
  • 對動態尺寸記錄的期望行長度是：
    3
+ (number of columns + 7) / 8
+ (number of char columns)
+ packed size of numeric columns
+ length of strings
+ (number of NULL columns + 7) / 8

    對每個連接有6個字節的懲罰。無論何時更改引起記錄的增大，一個動態記錄被鏈接。每個新鏈接將至少是20個字節，因此下一增大將可能在同一鏈連中。如果不是，將有另外一個鏈接。你可以用myisamchk -ed檢查有多少鏈接。所有的鏈接可以用 myisamchk -r 刪除。

10.6.3 壓縮表的特點

  • 一張用myisampack實用程式制作的只讀表。所有具有MySQL擴展電子郵件支援的客戶可以為其內部使用保留一個myisampack拷貝。
  • 解壓縮代碼存在於所有MySQL分發，以便甚至沒有myisampack的客戶能讀取用myisampack壓縮的表。
  • 占據很小的磁碟空間，使磁碟使用量減到最小。
  • 每個記錄被單獨壓縮(很小的存取開銷)。對一個記錄的頭是定長的(1-3 字節)，取決於表中最大的記錄。每列以不同方式被壓縮。一些壓縮類型是：
    • 通常對每列有一張不同的哈夫曼表。
    • 後綴空白壓縮。
    • 前綴空白壓縮。
    • 用值0的數字使用1位儲存。
    • 如果整數列的值有一個小範圍，列使用最小的可能類型來儲存。例如，如果所有的值在0到255的範圍，一個BIGINT列(8個字節)可以作為一個TINYINT列(1字節)儲存。
    • 如果列僅有可能值的一個小集合，列類型被變換到ENUM。
    • 列可以使用上面的壓縮方法的組合。
  • 能處理定長或動態長度的記錄，然而不能處理BLOB或TEXT列。
  • 能用myisamchk解壓縮。

MySQL能支援不同的索引類型，但是一般的類型是ISAM。這是一個B樹索引並且你能粗略地為索引文件計算大小為(key_length+4)*0.67，在所有的鍵上的總和。（這是對最壞情況，當所有鍵以排序順序被插入時。）

字符串索引是空白壓縮的。如果第一個索引部分是一個字符串，它也將壓縮前綴。如果字符串列有很多尾部空白或是一個總不能用到全長的VARCHAR列，空白壓縮使索引文件更小。如果很多字符串有相同的前綴，前綴壓縮是有幫助的。

10.6.4 內存表的特點

堆桌子僅存在於內存中，因此如果mysqld被關掉或崩潰，它們將丟失，但是因為它們是很快，不管怎樣它們是有用的。

MySQL內部的HEAP表使用沒有溢出區的100%動態哈希並且沒有與刪除有關的問題。

你只能通過使用在堆表中的一個索引的用等式存取東西(通常用=操作符)。

堆表的缺點是：

  1. 你要為你想要同時使用的所有堆表需要足夠的額外內存。
  2. 你不能在索引的一個部分上搜索。
  3. 你不能順序搜索下一個條目(即使用這個索引做一個ORDER BY)。
  4. MySQL也不能算出在2個值之間大概有多少行。這被最佳化器使用來決定使用哪個索引，但是在另一方面甚至不需要磁碟尋道。

10.7 其他最佳化技巧

對加快系統的未分類的建議是：

  • 使用持久的連接資料庫以避免連接開銷。
  • 總是檢查你的所有詢問確實使用你已在表中創建了的索引。在MySQL中，你可以用EXPLAIN命令做到。見7.22 EXPLAIN句法(得到關於SELECT的資訊)。
  • 嘗試避免在被更改了很多的表上的複雜的SELECT查詢。這避免與鎖定表有關的問題。
  • 在一些情況下，使得基於來自其他表的列的資訊引入一個“ 哈希”的列有意義。如果該列較短並且有合理的唯一值，它可以比在許多列上的一個大索引快些。在MySQL中，很容易使用這個額外列：SELECT * from table where hash='calculated hash on col1 and col2' and col_1='constant' and col_2='constant' and .. 。
  • 對於有很多更改的表，你應該試著避免所有VARCHAR或BLOB列。只要你使用單個VARCHAR或BLOB列，你將得到動態行長度。見9.4 MySQL表類型。
  • 只是因為行太大，分割一張表為不同的表一般沒有什麼用處。為了存取行，最大的性能命沖擊是磁碟尋道以找到行的第一個字節。在找到數據後，大多數新型磁碟對大多數應用程式來說足夠快，能讀入整個行。它確實有必要分割的唯一情形是如果其動態行尺寸的表(見上述)能變為固定的行大小，或如果你很頻繁地需要掃描表格而不需要大多數列。見9.4 MySQL表類型。
  • 如果你很經常地需要基於來自很多行的資訊計算(如計數)，引入一個新表並實時更新計數器可能更好一些。類型的更改UPDATE table set count=count+1 where index_column=constant是很快的！當你使用像MySQL那樣的只有表級鎖定(多重讀/單個寫)的資料庫時，這確實重要。這也將給出大多數資料庫較好的性能，因為鎖定管理器在這種情況下有較少的事情要做。 11111111111111111111111
  • 如果你需要從大的記錄文件表中收集統計資訊，使用總結性的表而不是掃描整個表。維護總結應該比嘗試做“實時”統計要快些。當有變化而不是必須改變運行的應用時，從記錄文件重新產生新的總結表(取決於業務決策)要快多了！
  • 如果可能，應該將報告分類為“實時”或“統計”，這裡統計報告所需的數據僅僅基於從實際數據產生的總結表中產生。
  • 充分利用列有預設值的事實。當被插入值不同於預設值時，只是明確地插入值。這減少MySQL需要做的語法分析並且改進插入速度。
  • 在一些情況下，包裝並儲存數據到一個BLOB中是很方便的。在這種情況下，你必須在你的應用中增加額外的代碼來打包/解包BLOB中的東西，但是這種方法可以在某些階段節省很多存取。當你有不符合靜態的表結構的數據時，這很實用。
  • 在一般情況下，你應該嘗試以第三范式保存數據，但是如果你需要這些以獲得更快的速度，你應該不用擔心重複或創建總結表。
  • 儲存程序或UDF(用戶定義函數)可能是獲得更好性能的一個好方法，然而如果你使用某些不支援它的資料庫，在這種情況中，你應該總是有零一個方法(較慢的)做這些。
  • 你總是能通過在你的應用程式中緩沖查詢/答案並嘗試同時做很多插入/更新來獲得一些好處。如果你的資料庫支援鎖定表(像MySQL和Oracle)，這應該有助於確保索引緩沖在所有更新後只清空一次。
  • 但你不知道何時寫入你的數據時，使用INSERT /*! DELAYED */。這加快處理，因為很多記錄可以用一次磁碟寫入被寫入。
  • 當你想要讓你的選擇顯得更重要時，使用INSERT /*! LOW_PRIORITY */。
  • 使用SELECT /*! HIGH_PRIORITY */來取得塞入隊列的選擇，它是即使有人等待做一個寫入也要完成的選擇。
  • 使用多行INSERT語句來儲存很多有一條SQL命令的行(許多SQL伺服器支援它）。
  • 使用LOAD DATA INFILE裝載較大數量的數據。這比一般的插入快並且當myisamchk集成在mysqld中時，甚至將更快。
  • 使用AUTO_INCREMENT列構成唯一值。
  • 當使用動態表格式時，偶爾使用OPTIMIZE TABLE以避免碎片。見7.9O PTIMIZE TABLE句法。
  • 可能時使用HEAP表以得到更快的速度。見9.4 MySQL表類型。
  • 當使用一個正常Web伺服器設置時，圖像應該作為文件儲存。這僅在資料庫中儲存的一本文件的引用。這樣做的主要原因是是一個正常的Web伺服器在緩沖文件比資料庫內容要好得多，因此如果你正在使用文件，較容易得到一個較快的系統。
  • 對經常存取的不重要數據(像有關對沒有cookie用戶最後顯示標語的資訊）使用內存表。
  • 在不同表中具有相同資訊的列應該被聲明為相同的並有相同的名字。在版本 3.23 前，你只能靠較慢的聯結。嘗試使名字簡單化(在客戶表中使用name而不是customer_name)。為了使你的名字能移植到其他SQL伺服器，你應該使他們短於18 個字符。
  • 如果你需要確實很高的速度，你應該研究一下不同SQL伺服器支援的數據儲存的底層介面！例如直接存取MySQL MyISAM，比起使用SQL 介面，你能得到2-5倍的速度提升。然而為了能做到它，數據必須是在與應用程式性在同一台機器的伺服器上，並且通常它只應該被一個進程存取(因為外部文件鎖定確實很慢)。通過在MySQL伺服器中引進底層MyISAM命令能消除以上問題(如果需要，這可能是獲得更好性能的一個容易的方法)。借助精心設計的資料庫介面，應該相當容易支援這類最佳化。
  • 在許多情況下，從一個資料庫存取數據(使用一個實時連接)比存取一個文本文件快些，只是因為資料庫比文本文件更緊湊(如果你使用數字數據)並且這將涉及更少的磁碟存取。你也節省代碼，因為你不須分析你的文本文件來找出行和列的邊界。
  • 你也能使用複製加速。見19.1 資料庫複製。

10.8 使用你自己的效能測試

你決定應該測試你的應用程式和資料庫，以發現瓶頸在哪兒。通過修正它(或通過用一個“啞模組”代替瓶頸)，你能容易確定下一個瓶頸(等等)。即使對你的應用程式來說，整體性能“足夠好”，你至少應該對每個瓶頸做一個“計劃”，如果某人“確實需要修正它”，如何解決它。

對於一些可移植的效能程式的例子，參見MySQL效能套件。見11 MySQL 效能套件。你能利用這個套件的任何程式並且為你的需要修改它。通過這樣做，你能嘗試不同的你的問題的解決方案並測試哪一個對你是最快的解決方案。

在系統負載繁重時發生一些問題是很普遍的，並且我們有很多與我們聯繫的客戶，他們在生產系統中有一個(測試)系統並且有負載問題。到目前為止，被一種這些的情況是與基本設計有關的問題(表掃描在高負載時表現不好)或OS/庫問題。如果系統已經不在生產系統中，它們大多數將很容易修正。

為了避免這樣的問題，你應該把一些力氣放在在可能最壞的負載下測試你的整個應用！

10.9 設計選擇

MySQL在分開的文件中儲存行數據和索引數據。許多(幾乎全部)其他資料庫在同一個文件中混合行和索引數據。我們相信，MySQL的選擇對非常廣泛的現代系統的來說是較好的。

儲存行數據的另一個方法是在一個分開的區域保存每列資訊(例子是SDBM和Focus)。這將對每個存取多於一列的查詢獲得一個性能突破。因為在多於一列被存取時，這快速退化，我們相信這個模型對通用功能的資料庫不是最好。

更常見的情形是索引和數據一起被儲存(就像Oracle/Sybase)。在這種情況中，你將在索引的葉子頁面上找到行資訊。有這布局的好處是它在許多情況下(取決於這個索引被緩沖得怎樣)節省一次磁碟讀。有這布局的壞處是：

  • 表掃描更慢，因為你必須讀完索引以獲得數據。
  • 你損失很多空間，因為你必須重複來自節點的索引(因為你不能在節點上儲存行）
  • 刪除將隨時間變化惡化資料庫表(因為節點中的索引在刪除後通常不被更新)。
  • 你不能僅使用索引表為一個查詢檢索數據。
  • 索引數據很難緩沖。

10.10 MySQL設計局限/折衷

因為MySQL使用極快的表鎖定(多次讀/一次寫)，留下的最大問題是在同一個表中的一個插入的穩定數據流與慢速選擇的一個混合。

我們相信，在其他情況下，對大多數系統，異常快速的性能使它成為一個贏家。這種情形通常也可能通過表的多個副本來解決，但是它要花更多的力氣和硬件。

對一些常見的應用環境，我們也在開發一些擴展功能以解決此問題。

10.11 可移植性

因為所有SQL伺服器實現了SQL的不同部分，要花功夫編寫可移植的SQL應用程式。對很簡單的選擇/插入，它是很容易的，但是你需要越多，它越困難，而且如果你想要應用程式對很多資料庫都快，它變得更難！

為了使一個複雜應用程式可移植，你需要選擇它應該與之工作的很多SQL伺服器。

當你能使用MySQL的crash-me 程式（http://www.mysql.com/crash-me-choose.htmy）來找出你能與之使用的資料庫伺服器的選擇的函數、類型和限制。crash-me現在對任何可能的事情測試了很長時間，但是它仍然理解測試過的大約450件事情。

例如，如果你想要能使用Informix 或 DB2，你不應該有比18個字符更長的列名。

MySQL效能程式和crash-me是獨立於資料庫的。通過觀察我們怎麼處理它，你能得到一個感覺，你必須為編寫你的獨立於資料庫的應用程式做什麼。效能本身可在MySQL原始碼版本的“sql-bench”目錄下找到。他們用DBI資料庫介面以Perl寫成(它解決問題的存取部分)。

到http://www.mysql.com/benchmark.html看這個效能的結果。

正如你可在這些結果看見的那樣，所有資料庫都有一些弱點。這就是他們不同的設計折衷導致的不同行為。

如果你為資料庫的獨立性而努力，你需要獲得每個SQL伺服器瓶頸的良好感受。MySQL在檢索和更新方面很快，但是在同一個表上混合讀者/寫者方面將有一個問題。在另一方面，當你試圖存取你最近更新了的行時，Oracle有一個很大問題(直到他們被清空到磁碟上)。事務資料庫總的來說在從記錄文件表刈谹成總結表不是很好，因為在這種情況下，行級鎖定幾乎沒用處。

為了使你的應用程式“確實獨立於資料庫”，你需要定義一個容易的可擴展的介面，用它你可操縱你的數據。因為C++在大多數系統上可以得到的，使用資料庫的一個C++ 類介面是有意義的。

如果你使用一些某個資料庫特定的功能(在MySQL中，像REPLACE命令)，你應該為SQL伺服器編碼一個方法以實現同樣的功能 (但是慢些)。用MySQL，你能使用/*! */語法把MySQL特定的關鍵詞加到查詢中。在/**/中的代碼將被大多數其他SQL伺服器視為一篇注釋(被忽略)。

如果高性能真的比準確性更重要，就像在一些web應用程式那樣。一種可能性是創建一個應用層，緩沖所有的結果以給你更高的性能。通過只是讓老的結果在短時間後‘過期’，你能保持緩存合理地刷新。這在極高負載的情況下是相當不錯的，在此情況下，你能動態地增加緩存到更大並且設定較高的過期時限直到一切回到正常。

在這種情況下，創建資訊的表應該包含緩存初始大小和表一般應該被刷新幾次的資訊。

10.12 我們已將MySQL用在何處？

在MySQL起初開發期間，MySQL的功能適合我們的最大客戶。他們為在瑞典的一些最大的零售商處理數據倉庫。

我們從所有商店得到所有紅利卡交易的每周總結並且我們被期望為所有店主提供有用的資訊以幫助他們得出他們的廣告戰如何影響他們的顧客。

數據是相當巨量的(大約每月7百萬宗交易總結)並且我們保存4-10年來的數據需要呈現給用戶。我們每周顧客那裡得到請求，他們想要“立刻”訪問來自該數據的新報告。

我們通過每月將所有資訊儲存在壓縮的“交易”表中來解決它。我們有一套簡單的宏/腳本用來產生來自交易表的不同條件( 產品組，顧客id，商店...)的總結表。報告是由一個進行語法分析網頁的小perl腳本動態產生的網頁，在腳本中執行SQL語句並且插入結果。現在我們很想使用PHP或mod_perl，但是那時他們沒有。

對圖形數據，我們用C語言編寫了一個簡單的工具，它能基於SQL查詢的結果(對結果的一些處理)產生贈品，這也從分析HTML文件的perl腳本中動態地執行。

在大多數情況下，一個新的報告通過簡單地複製一個現有腳本並且修改其中的SQL查詢來完成。在一些情況下，我們將需要把更多的字段加到一個現有的總結表中或產生一個新的，但是這也相當簡單，因為我們在磁碟上保存所有交易表。（目前我們有至少50G的交易表和200G的其他顧客數據)。

我們也讓我們的顧客直接用ODBC存取總結表以便高級用戶能自己試驗數據。

我們用非常中檔的Sun Ultra sparcstation ( 2x200 Mz )來處理，沒有任何問題。最近我們升級了伺服器之一到一台2個CPU 400 Mz的Ultra sparc，並且我們現在計劃處理產品級的交易，這將意味著數據增加10番。我們認為我們能通過只是為我們的系統增加更多的磁碟就能趕上它。

我們也在試驗Intel-Linux以便能更便宜地得到更多的cpu動力。既然我們有二進制可移植的資料庫格式(在3.32中引入)，我們將開始在應用程式的某些部分使用它。

我們最初的感覺是Linux在低到中等負載時執行的較好，但是你開始得到導致的高負載時，Solaris將表現更好，因為磁碟IO的極限，但是我們還沒有關於這方面的任何結論。在與一些Linux核心開發者的討論以後，這可能是 Linux 的副作用，它給批處理以太多的資源使得交互的性能變得很低。當大的批處理正在進行時，這使機器感覺很慢且無反應。希望這將在未來的Linux內核中解決。

第一章, 前一章, 下一章, 最後一章，目錄.


MySQL Reference Manual for version 3.23.7-alpha. - G Comments on porting to other systems

Go to the first, previous, next, last section, table of contents.

G Comments on porting to other systems

A working Posix thread library is needed for the server. On Solaris 2.5 we use SUN PThreads (the native thread support in 2.4 and earlier versions are not good enough) and on Linux we use LinuxThreads by Xavier Leroy, Xavier.Leroy@inria.fr.

The hard part of porting to a new Unix variant without good native thread support is probably to port MIT-pthreads. See `mit-pthreads/README' and Programming POSIX Threads.

The MySQL distribution includes a patched version of Provenzano's Pthreads from MIT (see MIT Pthreads web page). This can be used for some operating systems that do not have POSIX threads.

It is also possible to use another user level thread package named FSU Pthreads (see FSU Pthreads home page). This implementation is being used for the SCO port.

See the `thr_lock.c' and `thr_alarm.c' programs in the `mysys' directory for some tests/examples of these problems.

Both the server and the client need a working C++ compiler (we use gcc and have tried SparcWorks). Another compiler that is known to work is the Irix cc.

To compile only the client use ./configure --without-server.

There is currently no support for only compiling the server. Nor is it likly to be added unless someone has a good reason for it.

If you want/need to change any `Makefile' or the configure script you must get Automake and Autoconf. We have used the automake-1.2 and autoconf-2.12 distributions.

All steps needed to remake everything from the most basic files.

/bin/rm */.deps/*.P
/bin/rm -f config.cache
aclocal
autoheader
aclocal
automake
autoconf
./configure --with-debug --prefix='your installation directory'

# The makefiles generated above need GNU make 3.75 or newer.
# (called gmake below)
gmake clean all install init-db

If you run into problems with a new port, you may have to do some debugging of MySQL! See section G.1 Debugging a MySQL server.

Note: Before you start debugging mysqld, first get the test programs mysys/thr_alarm and mysys/thr_lock to work. This will ensure that your thread installation has even a remote chance to work!

G.1 Debugging a MySQL server

If you are using some functionality that is very new in MySQL, you can try to run mysqld with the --skip-new (which will disable all new, potentially unsafe functionality) or with --safe-mode which disables a lot of optimization that may cause problems. See section 18.1 What to do if MySQL keeps crashing.

If mysqld doesn't want to start, you should check that you don't have any my.cnf file that interferes with your setup! You can check your my.cnf arguments with mysqld --print-defaults and avoid using them by starting with mysqld --no-defaults ....

If you have some very specific problem, you can always try to debug MySQL. To do this you must configure MySQL with the option --with-debug. You can check whether or not MySQL was compiled with debugging by doing: mysqld --help. If the --debug flag is listed with the options then you have debugging enabled. mysqladmin ver also lists the mysqld version as mysql ... -debug in this case.

If you are using gcc or egcs, the recommended configure line is:

CC=gcc CFLAGS="-O6" CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-debug

This will avoid problems with the libstdc++ library and with C++ exceptions.

If you can cause the mysqld server to crash quickly, you can try to create a trace file of this:

Start the mysqld server with a trace log in `/tmp/mysql.trace'. The log file will get very BIG.

mysqld --debug --log

or you can start it with

mysqld --debug=d,info,error,query,general,where:O,/tmp/mysql.trace

which only prints information with the most interesting tags.

When you configure MySQL for debugging you automatically enable a lot of extra safety check functions that monitor the health of mysqld. If they find something ``unexpected,'' an entry will be written to stderr, which safe_mysqld directs to the error log! This also means that if you are having some unexpected problems with MySQL and are using a source distribution, the first thing you should do is to configure MySQL for debugging! (The second thing, of course, is to send mail to mysql@lists.mysql.com and ask for help. Please use the mysqlbug script for all bug reports or questions regarding the MySQL version you are using!

On most system you can also start mysqld from gdb to get more information if mysqld crashes.

With some gdb versions on Linux you must use run --one-thread if you want to be able to debug mysqld threads. In this case you can only have one thread active at a time.

If you are using gdb 4.17.x on Linux, you should install a `.gdb' file, with the following information, in your current directory:

set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint

Here follows an example how to debug mysqld:

shell> gdb /usr/local/libexec/mysqld
gdb> run
...
back   # Do this when mysqld crashes
info locals
up
info locals
up
...
(until you get some information about local variables)

quit

Include the above output in a mail generated with mysqlbug and mail this to mysql@lists.mysql.com.

If mysqld hangs you can try to use some system tools like strace or /usr/proc/bin/pstack to examine where mysqld has hanged.

If mysqld starts to eat up CPU or memory or if it ``hangs'', you can use mysqladmin processlist status to find out if someone is executing some query that takes a long time. It may be a good idea to run mysqladmin -i10 processlist status in some window if you are experiencing performance problems or problems when new clients can't connect.

If mysqld dies or hangs, you should start mysqld with --log. When mysqld dies again, you can check in the log file for the query that killed mysqld. Note that before starting mysqld with --log you should check all your tables with myisamchk. See section 13 Maintaining a MySQL installation.

If you are using a log file, mysqld --log, you should check the 'hostname' log files, that you can find in the database directory, for any queries that could cause a problem. Try the command EXPLAIN on all SELECT statements that takes a long time to ensure that mysqld are using indexes properly. See section 7.22 EXPLAIN syntax (Get information about a SELECT). You should also test complicated queries that didn't complete within the mysql command line tool.

If you find the text mysqld restarted in the error log file (normally named `hostname.err') you have probably found a query that causes mysqld to fail. If this happens you should check all your tables with myisamchk (see section 13 Maintaining a MySQL installation), and test the queries in the MySQL log files if someone doesn't work. If you find such a query, try first upgrading to the newest MySQL version. If this doesn't help and you can't find anything in the mysql mail archive, you should report the bug to mysql@lists.mysql.com. Links to mail archives are available at the online MySQL documentation page.

If you get corrupted tables or if mysqld always fails after some update commands, you can test if this bug is reproducible by doing the following:

  • Stop the mysqld daemon (with mysqladmin shutdown)
  • Check all tables with myisamchk -s database/*.MYI. Repair any wrong tables with myisamchk -r database/table.MYI.
  • Start mysqld with --log-update
  • When you have got a crashed table, stop the mysqld server.
  • Restore the backup.
  • Restart the mysqld server without --log-update
  • Re-execute the commands with mysql < update-log. The update log is saved in the MySQL database directory with the name your-hostname.#.
  • If the tables are now again corrupted, you have found reproducible bug in the ISAM code! FTP the tables and the update log to ftp://www.mysql.com/pub/mysql/secret and we will fix this as soon as possible!

The command mysqladmin debug will dump some information about locks in use, used memory and query usage to the mysql log file. This may help solve some problems. This command also provides some useful information even if you haven't compiled MySQL for debugging!

If the problem is that some tables are getting slower and slower you should try to optimize the table with OPTIMIZE TABLE or myisamchk. See section 13 Maintaining a MySQL installation. You should also check the slow queries with EXPLAIN.

You should also read the OS-specific section in this manual for problems that may be unique to your environment. See section 4.11 System-specific issues.

If you are using the Perl DBI interface, you can turn on debugging information by using the trace method or by setting the DBI_TRACE environment variable. See section 20.5.2 The DBI interface.

G.2 Debugging a MySQL client

To be able to debug a MySQL client with the integrated debug package, you should configure MySQL with --with-debug. See section 4.7.3 Typical configure options.

Before running a client, you should set the MYSQL_DEBUG environment variable:

shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace
shell> export MYSQL_DEBUG

This causes clients to generate a trace file in `/tmp/client.trace'.

If you have problems with your own client code, you should attempt to connect to the server and run your query using a client that is known to work. Do this by running mysql in debugging mode (assuming you have compiled MySQL with debugging on):

shell> mysql --debug=d:t:O,/tmp/client.trace

This will provide useful information in case you mail a bug report. See section 2.3 How to report bugs or problems.

If your client crashes at some 'legal' looking code, you should check that your `mysql.h' include file matches your mysql library file. A very common mistake is to use an old `mysql.h' file from an old MySQL installation with new MySQL library.

G.3 Comments about RTS threads

I have tried to use the RTS thread packages with MySQL but stumbled on the following problems:

They use old version of a lot of POSIX calls and it is very tedious to make wrappers for all functions. I am inclined to think that it would be easier to change the thread libraries to the newest POSIX specification.

Some wrappers are already written. See `mysys/my_pthread.c' for more info.

At least the following should be changed:

pthread_get_specific should use one argument. sigwait should take two arguments. A lot of functions (at least pthread_cond_wait, pthread_cond_timedwait) should return the error code on error. Now they return -1 and set errno.

Another problem is that user-level threads use the ALRM signal and this aborts a lot of functions (read, write, open...). MySQL should do a retry on interrupt on all of these but it is not that easy to verify it.

The biggest unsolved problem is the following:

To get thread-level alarms I changed `mysys/thr_alarm.c' to wait between alarms with pthread_cond_timedwait(), but this aborts with error EINTR. I tried to debug the thread library as to why this happens, but couldn't find any easy solution.

If someone wants to try MySQL with RTS threads I suggest the following:

  • Change functions MySQL uses from the thread library to POSIX. This shouldn't take that long.
  • Compile all libraries with the -DHAVE_rts_threads.
  • Compile thr_alarm.
  • If there are some small differences in the implementation, they may be fixed by changing `my_pthread.h' and `my_pthread.c'.
  • Run thr_alarm. If it runs without any ``warning'', ``error'' or aborted messages, you are on the right track. Here follows a successful run on Solaris:
    Main thread: 1
Tread 0 (5) started
Thread: 5  Waiting
process_alarm
Tread 1 (6) started
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 1 (1) sec
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 2 (2) sec
Thread: 6  Simulation of no alarm needed
Thread: 6  Slept for 0 (3) sec
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 4 (4) sec
Thread: 6  Waiting
process_alarm
thread_alarm
Thread: 5  Slept for 10 (10) sec
Thread: 5  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 5 (5) sec
Thread: 6  Waiting
process_alarm
process_alarm

...
thread_alarm
Thread: 5  Slept for 0 (1) sec
end

G.4 Differences between different thread packages

MySQL is very dependent on the thread package used. So when choosing a good platform for MySQL, the thread package is very important.

There are at least three types of thread packages:

  • User threads in a single process. Thread switching is managed with alarms and the threads library manages all non-thread-safe functions with locks. Read, write and select operations are usually managed with a thread-specific select that switches to another thread if the running threads have to wait for data. If the user thread packages are integrated in the standard libs (FreeBSD and BSDI threads) the thread package requires less overhead than thread packages that have to map all unsafe calls (MIT-pthreads, FSU Pthreads and RTS threads). In some environments (for example, SCO), all system calls are thread-safe so the mapping can be done very easily (FSU Pthreads on SCO). Downside: All mapped calls take a little time and it's quite tricky to be able to handle all situations. There are usually also some system calls that are not handled by the thread package (like MIT-pthreads and sockets). Thread scheduling isn't always optimal.
  • User threads in separate processes. Thread switching is done by the kernel and all data are shared between threads. The thread package manages the standard thread calls to allow sharing data between threads. LinuxThreads is using this method. Downside: Lots of processes. Thread creating is slow. If one thread dies the rest are usually left hanging and you must kill them all before restarting. Thread switching is somewhat expensive.
  • Kernel threads. Thread switching is handled by the thread library or the kernel and is very fast. Everything is done in one process, but on some systems, ps may show the different threads. If one thread aborts the whole process aborts. Most system calls are thread-safe and should require very little overhead. Solaris, HP-UX, AIX and OSF1 have kernel threads.

In some systems kernel threads are managed by integrating user level threads in the system libraries. In such cases, the thread switching can only be done by the thread library and the kernel isn't really ``thread aware''.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - J The MySQL server license for non Microsoft operating systems

Go to the first, previous, next, last section, table of contents.

J The MySQL server license for non Microsoft operating systems

MySQL FREE PUBLIC LICENSE (Version 4, March 5, 1995)

Copyright (C) 1995, 1996 TcX AB & Monty Program KB & Detron HB Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN All rights reserved.

NOTE: This license is not the same as any of the GNU Licenses published by the Free Software Foundation. Its terms are substantially different from those of the GNU Licenses. If you are familiar with the GNU Licenses, please read this license with extra care.

This License applies to the computer program known as "MySQL". The "Program", below, refers to such program, and a "work based on the Program" means either the Program or any derivative work of the Program, as defined in the United States Copyright Act of 1976, such as a translation or a modification. The Program is a copyrighted work whose copyright is held by TcX Datakonsult AB and Monty Program KB and Detron HB.

This License does not apply when running "MySQL" on any Microsoft operating system. Microsoft operating systems include all versions of Microsoft Windows NT and Microsoft Windows.

BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM.

  1. Licenses. Licensor hereby grants you the following rights, provided that you comply with all of the restrictions set forth in this License and provided, further, that you distribute an unmodified copy of this License with the Program:
    1. You may copy and distribute literal (i.e., verbatim) copies of the Program's source code as you receive it throughout the world, in any medium.
    2. You may modify the Program, create works based on the Program and distribute copies of such throughout the world, in any medium.
  2. Restrictions. This license is subject to the following restrictions:
    1. Distribution of the Program or any work based on the Program by a commercial organization to any third party is prohibited if any payment is made in connection with such distribution, whether directly (as in payment for a copy of the Program) or indirectly (as in payment for some service related to the Program, or payment for some product or service that includes a copy of the Program "without charge"; these are only examples, and not an exhaustive enumeration of prohibited activities). However, the following methods of distribution involving payment shall not in and of themselves be a violation of this restriction:
      1. Posting the Program on a public access information storage and retrieval service for which a fee is received for retrieving information (such as an on-line service), provided that the fee is not content-dependent (i.e., the fee would be the same for retrieving the same volume of information consisting of random data).
      2. Distributing the Program on a CD-ROM, provided that the files containing the Program are reproduced entirely and verbatim on such CD-ROM, and provided further that all information on such CD-ROM be redistributable for non-commercial purposes without charge.
    2. Activities other than copying, distribution and modification of the Program are not subject to this License and they are outside its scope. Functional use (running) of the Program is not restricted, and any output produced through the use of the Program is subject to this license only if its contents constitute a work based on the Program (independent of having been made by running the Program).
    3. You must meet all of the following conditions with respect to the distribution of any work based on the Program:
      1. If you have modified the Program, you must cause your work to carry prominent notices stating that you have modified the Program's files and the date of any change;
      2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole and at no charge to all third parties under the terms of this License;
      3. If the modified program normally reads commands interactively when run, you must cause it, at each time the modified program commences operation, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty). Such notice must also state that users may redistribute the Program only under the conditions of this License and tell the user how to view the copy of this License included with the Program. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.);
      4. You must accompany any such work based on the Program with the complete corresponding machine-readable source code, delivered on a medium customarily used for software interchange. The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable code. However, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable code;
      5. If you distribute any written or printed material at all with the Program or any work based on the Program, such material must include either a written copy of this License, or a prominent written indication that the Program or the work based on the Program is covered by this License and written instructions for printing and/or displaying the copy of the License on the distribution medium;
      6. You may not impose any further restrictions on the recipient's exercise of the rights granted herein. If distribution of executable or object code is made by offering the equivalent ability to copy from a designated place, then offering equivalent ability to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source code along with the object code.
  3. Reservation of Rights. No rights are granted to the Program except as expressly set forth herein. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  4. Other Restrictions. If the distribution and/or use of the Program is restricted in certain countries for any reason, Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  5. Limitations. THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - H Description of MySQL regular expression syntax

Go to the first, previous, next, last section, table of contents.

H Description of MySQL regular expression syntax

A regular expression (regex) is a powerful way of specifying a complex search.

MySQL uses regular Henry Spencer's inplementation of regular expressions. And that is aimed to conform to POSIX 1003.2. MySQL uses the extended version.

This is a simplistic reference that skips the details. To get more exact information, see Henry Spencer's regex(7) manual page that is included in the source distribution. See section C Contributors to MySQL.

A regular expression describes a set of strings. The simplest regexp is one that has no special characters in it. For example, the regexp hello matches hello and nothing else.

Nontrivial regular expressions use certain special constructs so that they can match more than one string. For example, the regexp hello|word matches either the string hello or the string word.

As a more complex example, the regexp B[an]*s matches any of the strings Bananas, Baaaaas, Bs and any other string starting with a B, ending with an s, and containing any number of a or n characters in between.

A regular expression may use any of the following special characters/constructs:

^
Match the beginning of a string.
mysql> select "fo\nfo" REGEXP "^fo$";           -> 0
mysql> select "fofo" REGEXP "^fo";              -> 1
$
Match the end of a string.
mysql> select "fo\no" REGEXP "^fo\no$";         -> 1
mysql> select "fo\no" REGEXP "^fo$";            -> 0
.
Match any character (including newline).
mysql> select "fofo" REGEXP "^f.*";             -> 1
mysql> select "fo\nfo" REGEXP "^f.*";           -> 1
a*
Match any sequence of zero or more a characters.
mysql> select "Ban" REGEXP "^Ba*n";             -> 1
mysql> select "Baaan" REGEXP "^Ba*n";           -> 1
mysql> select "Bn" REGEXP "^Ba*n";              -> 1
a+
Match any sequence of one or more a characters.
mysql> select "Ban" REGEXP "^Ba+n";             -> 1
mysql> select "Bn" REGEXP "^Ba+n";              -> 0
a?
Match either zero or one a character.
mysql> select "Bn" REGEXP "^Ba?n";              -> 1
mysql> select "Ban" REGEXP "^Ba?n";             -> 1
mysql> select "Baan" REGEXP "^Ba?n";            -> 0
de|abc
Match either of the sequences de or abc.
mysql> select "pi" REGEXP "pi|apa";             -> 1
mysql> select "axe" REGEXP "pi|apa";            -> 0
mysql> select "apa" REGEXP "pi|apa";            -> 1
mysql> select "apa" REGEXP "^(pi|apa)$";        -> 1
mysql> select "pi" REGEXP "^(pi|apa)$";         -> 1
mysql> select "pix" REGEXP "^(pi|apa)$";        -> 0
(abc)*
Match zero or more instances of the sequence abc.
mysql> select "pi" REGEXP "^(pi)*$";            -> 1
mysql> select "pip" REGEXP "^(pi)*$";           -> 0
mysql> select "pipi" REGEXP "^(pi)*$";          -> 1
{1}

{2,3}
The is a more general way of writing regexps that match many occurrences of the previous atom.
a*
Can be written as a{0,}.
a+
Can be written as a{1,}.
a?
Can be written as a{0,1}.

To be more precise, an atom followed by a bound containing one integer i and no comma matches a sequence of exactly i matches of the atom. An atom followed by a bound containing one integer i and a comma matches a sequence of i or more matches of the atom. An atom followed by a bound containing two integers i and j matches a sequence of i through j (inclusive) matches of the atom. Both arguments must 0 >= value <= RE_DUP_MAX (default 255). If there are two arguments, the second must be greater than or equal to the first.

[a-dX]

[^a-dX]
Matches any character which is (or is not, if ^ is used) either a, b, c, d or X. To include a literal ] character, it must immediately follow the opening bracket [. To include a literal - character, it must be written first or last. So [0-9] matches any decimal digit. Any character that does not have a defined meaning inside a [] pair has no special meaning and matches only itself.
mysql> select "aXbc" REGEXP "[a-dXYZ]";         -> 1
mysql> select "aXbc" REGEXP "^[a-dXYZ]$";       -> 0
mysql> select "aXbc" REGEXP "^[a-dXYZ]+$";      -> 1
mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$";     -> 0
mysql> select "gheis" REGEXP "^[^a-dXYZ]+$";    -> 1
mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$";   -> 0
[[.characters.]]
The sequence of characters of that collating element. The sequence is a single element of the bracket expression's list. A bracket expression containing a multi-character collating element can thus match more than one character, e.g., if the collating sequence includes a ch collating element, then the regular expression [[.ch.]]*c matches the first five characters of chchcc.
[=character_class=]
An equivalence class, standing for the sequences of characters of all collating elements equivalent to that one, including itself. For example, if o and (+) are the members of an equivalence class, then [[=o=]], [[=(+)=]], and [o(+)] are all synonymous. An equivalence class may not be an endpoint of a range.
[:character_class:]
Within a bracket expression, the name of a character class enclosed in [: and :] stands for the list of all characters belonging to that class. Standard character class names are:
alnum | digit | punct
alpha | graph | space
blank | lower | upper
cntrl | print | xdigit

These stand for the character classes defined in the ctype(3) manual page. A locale may provide others. A character class may not be used as an endpoint of a range.

mysql> select "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> select "!!" REGEXP "[[:alnum:]]+";               -> 0
[[:<:]]

[[:>:]]
These match the null string at the beginning and end of a word respectively. A word is defined as a sequence of word characters which is neither preceded nor followed by word characters. A word character is an alnum character (as defined by ctype(3)) or an underscore (_).
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]";      -> 1
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]";     -> 0

mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1

Go to the first, previous, next, last section, table of contents.


MySQL中文參考手冊- 9 MySQL伺服器功能

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

第一章, 前一章, 下一章, 最後一章，目錄.

9 MySQL伺服器功能

9.1 MySQL支援哪些語言？

mysqld可以用下列語言發出錯誤消息：捷克語、荷蘭語、英語(預設)、愛沙尼亞語、法語、德語、匈牙利、意大利語、挪威語。

啟動mysqld使用一種特定的語言，使用一個--language=lang或-L lang選項。例如：

shell> mysqld --language=swedish

或：

shell> mysqld --language=/usr/local/share/swedish

注意，所有語言的名稱用小寫字母指定。

語言文件位於(預設的)'mysql_base_dir/share/LANGUAGE/'。

為了更新錯誤消息文件，你應該編輯“errmsg.txt”文件並且執行下列命令產生“errmsg.sys”文件：

shell> comp_err errmsg.txt errmsg.sys

如果你升級到一個更新的MySQL版本，記得要再次用新的“errmsg.txt”文件進行更新。

9.1.1 用於數據和排序的字符集

預設地，MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。這是在美國和西歐使用的字符集。

字符集決定了在名字中允許什麼字符和如何由SELECT語句的ORDER BY和GROUP BY子句排序。

通過給configure以--with-charset=charset選項，你可以在編譯時改變字符集。見4.7.1 快速安裝概述。

為了把其他字符集加入MySQL，使用下列程序：

9.1.2 增加一個新的字符集

  1. 為字符集選擇一個名字，下面用MYSET表示。
  2. 在MySQL原始碼版本中創造文件“strings/ctype-MYSET.c”。
  3. 研究一個現有的“ctype-*.c'文件，看需要定義什麼。注意，你文件中的數組必須有類似於ctype_MYSET、to_lower_MYSET等等的名字。to_lower[]和to_upper[]是簡單的數組，保存字符集每個成員相應的小寫和大寫字符。例如：
    to_lower['A'] should contain 'a'
to_upper['a'] should contain 'A'

    sort_order[]是一個映射，指出字符為了比較和排序目的應該如何定序。對於許多字符集，這與to_upper[]一樣（意味著排序將忽略大小寫)。MySQL將基於sort_order[character]值排序字符。ctype[]是一個位值的數組，一個元素對應一個字符。（注意，to_lower[]、to_upper[]和sort_order[]按字符定下標，但是ctype[]按字符值+1定下標。這是一個舊遺產以便能處理EOF) 你能在“m_ctype.h”找到下列bitmask定義：

    #define _U      01      /* Upper case */
#define _L      02      /* Lower case */
#define _N      04      /* Numeral (digit) */
#define _S      010     /* Spacing character */
#define _P      020     /* Punctuation */
#define _C      040     /* Control character */
#define _B      0100    /* Blank */
#define _X      0200    /* heXadecimal digit */

    每個字符的ctype[]的入口應該是描述字符的適用的位模(bitmask)值的聯合（union）。例如，'A'是一個大寫字符(_U) ，同時是十六進制位(_X)，這樣ctype['A'+1]應該包含值：

    _U + _X = 01 + 0200 = 0201
  4. 為你的字符集增加一個唯一的編號到“include/m_ctype.h.in”。
  5. 把字符集名字加到在configure.in中的CHARSETS_AVAILABLE表。
  6. 重新配置，重新編譯並且測試。

9.1.3 多字節字符支援

如果你正在創建一個多字節字符集，你可以使用_MB宏。在“include/m_ctype.h.in”，增加：

#define MY_CHARSET_MYSET  X
#if MY_CHARSET_CURRENT == MY_CHARSET_MYSET
#define USE_MB
#define USE_MB_IDENT
#define ismbchar(p, end)  (...)
#define ismbhead(c)       (...)
#define mbcharlen(c)      (...)
#define MBMAXLEN          N
#endif

這裡：

MY_CHARSET_MYSET | 一個唯一的字符集值。
USE_MB | 這個字符集有多字節字符，由ismbhead()和mbcharlen()來處理。
USE_MB_IDENT | （可選 ) 如果定義，你能使用多字節字符的表和列名。
ismbchar(p, e) | 如果p不是一個多字節字符字符串，返回0，否則如果它是，返回字符的大小(字節數)。p和e指向字符串的開始和結束。檢查是從(char*)p到(char*)e-1。
ismbhead(c) | 如果c是一個多字節字符字符串的第一個字符，返回真。
mbcharlen(c) | 如果c是一個多字節字符串的第一個字符，返回該字符串的大小。
MBMAXLEN | 在字符集中最大字符的字節大小。

9.2 更新日誌

當以--log-update=file_name選項啟動時，mysqld將所有更新數據的SQL命令寫入記錄文件中。文件被寫入數據目錄並且有一個名字file_name.#，這裡#是一個數字，它在每次執行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS語句、或重啟伺服器時加1。

如果你使用--log或-l選項，mysqld用一個文件名“hostname.log”寫一個通用的記錄文件，並且重啟和更新不會引起一個新的記錄文件產生(盡管它被關閉並且再打開)。預設地，mysql.server腳本用-l選項啟動MySQL伺服器，如果當你在生產環境中開始使用MySQL時，你需要好一些的性能，你可以從mysql.server中刪除-l選項。

更新記錄很聰明，因為它僅僅記載真正更新數據的語句。因此一個用WHERE的UPDATE或DELETE找不到行，它就不被寫入記錄文件。它甚至跳過將設置一個列為它已經有的值的UPDATE語句。

如果你想要從更新記錄文件更新一個資料庫，你可以如下做到(假設你的更新記錄有“file_name.#”形式的名字)：

shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql

ls被用來以正確的次序得到所有的記錄文件。

如果你必須在一個崩潰後恢復到備份文件並且你想要再做發生在備份和崩潰之間的更新，這可以很有用。

當你在其他主機上有一個鏡像資料庫並且你想要複製必須對主資料庫進行的改變時，你也可以使用更新記錄。

9.3 MySQL資料庫表可以有多大?

MySQL 3.22 在表大小上有一個4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可達8百萬 TB(2^63個字節)。

然而注意，作業系統有其自身文件大小的限制。在Linux上，當前的限制是2G﹔在Solaris 2.5.1上，限制是4G﹔在Solaris 2.6上，限制是1000G。這意味著MySQL表的大小通常由作業系統限制。

預設地，MySQL表最大尺寸大約4G。你可用SHOW TABLE STATUS命令或myisamchk -dv table_name檢查一個表的最大表大小。見7.21 SHOW句法(得到表、列等的資訊）。

如果你需要大於 4G 的表(並且你的作業系統支援它)，你應該在你創建表時設定AVG_ROW_LENGTH和MAX_ROWS參數。見7.7 CREATE TABLE語法。你也能用ALTER TABLE在以後設置這些。見7.8 ALTER TABLE語法。

如果你的大表要變成只讀，你可以使用myisampack合並並且把許多表壓縮成一個。myisampack通常壓縮一個表到至少50%，因此你可以有，實際上，更大的表。見12.5 MySQL壓縮的只讀的表產生器。

另一個的解決方案可以是內含包括MERGE庫，它允許你將一個許多相同的表的集合作為一個來處理。（在這種情況下相同意味著所有的表由相同的列資訊創建)目前MERGE只能用於掃描一個表集合，因為它不支援索引。我們在不久的將來將把索引加進去。

9.4 MySQL資料庫表類型

用MySQL，目前(版本 3.23.6)你可以在三種基本資料庫表格式間選擇。當你創建一張表時，你可以告訴MySQL它應該對於表使用哪個表類型。MySQL將總是創建一個.frm文件保存表和列定義。視表類型而定，索引和數據將在其他文件中儲存。

你能用ALTER TABLE語句在不同類型的表之間變換。見7.8 ALTER TABLE語法。

MyISAM
在MySQL 3.23中，MyISAM是預設表格類型，它是基於ISAM代碼並且有很多有用的擴展。索引儲存在一個有.MYI（MYindex)擴展名的文件並且數據儲存在有.MYD（MYData)擴展名的文件中。你能用myisamchk實用程式檢查/修復MyISAM表。見13.4 對崩潰恢復使用myisamchk。下列幾點在MyISAM中是全新的：
  • 不用刪除行，可以在表中INSERT一個新行，在其他執行緒從表刈袗在讀取的同時。
  • 在支援大文件的文件系統/作業系統上支援大文件(63位)。
  • 所有的數據首先儲存低字節，這使數據獨立於機器和OS，唯一的要求是機器使用補2有符號整數(就像最近20年時間內的每台機器)和IEEE浮點格式(也在主流機器上完全主導地位)。不能支援二進制兼容性的機器的唯一領域是嵌入式系統(因為他們有時有古怪的處理器)。
  • 所有的數字鍵先儲存高字節以獲得更高的索引壓縮。
  • AUTO_INCREMENT列的內部處理。MyISAM將自動地在INSERT/UPDATE時更新它。 AUTO_INCREMENT值可以用myisamchk重新設置，這將使得AUTO_INCREMENT列更快速並且原來的數將不像老的ISAM那樣被重新使用。注意，當一個AUTO_INCREMENT定義在一個多部鍵值(multi-part-key)的結尾時，老式的行為仍然是存在。
  • BLOB和TEXT列可以被索引。
  • 被索引的列允許NULL值。每個鍵占0-1個字節。
  • 現在最大的鍵長度預設是500個字節。在鍵大於250個字節的情況下，一個大於預設的1024個字節的關鍵字塊大小被用於此鍵。
  • 每個表的鍵的最大數目放大到32作為預設。這不必重新編譯myisamchk就可以放大到64。
  • 在有一個標誌MyISAM顯示桌子是否正確被關上的文件。這將不久被用於自動的修理在MySQL伺服器。
  • 現在myisamchk將標記表為“檢查的”。myisamchk --fast將僅僅檢查那些沒有這個標記的表。
  • myisamchk -a儲存鍵值組成部分的統計(不只是像ISAM對整個鍵)。
  • 現在在刪除與更新和插入混用時，動態尺寸的行將有更少碎片，這通過自動合並相鄰的刪除塊並且如果下一塊被刪除，通過擴大塊來做到。
  • myisampack能緊縮BLOB和VARCHAR列。

MyISAM也支援下列東西，MySQL在不久的將來將能使用。

  • 支援一個真正的VARCHAR類型﹔一個VARCHAR列以2各字節儲存的長度開始。
  • 用VARCHAR的表可以式固定或動態的記錄長度。
  • VARCHAR和CHAR可以最大64K字節。所有的關鍵字片斷有其自身的語言定義，這將使得MySQL每列有不同的語言定義。
  • 一個雜湊計算的索引可用於UNIQUE﹔這將允許你在一個表中的任何列組合上有UNIQUE屬性。（然而，你不能搜索一個UNIQUE計算的索引。）

你也可以使用放棄的ISAM桌子類型。這將在不久消失，因為MyISAM是同一個東西的更好實現。ISAM使用一個B-tree索引，這個索引儲存在一個有.ISM擴展名的文件中並且數據儲存在有.ISD擴展名的文件中，你可用isamchk實用程式檢查/修復ISAM表。見13.4 使用myisamchk恢復崩潰。ISAM表不是跨OS/平台二進制可移植的。ISAM有下列特徵/屬性：

  • 壓縮的且定長鍵
  • 固定和動態記錄長度
  • 有16個鍵，每個鍵有16鍵組成部分
  • 最大鍵長度256(預設）
  • 數據以機器格式儲存﹔快速但是依賴於機器/OS 。
HEAP
HEAP表格使用一個雜湊（hashed）索引並且儲存在內存中。這使他們更快，但是如果MySQL崩潰，你將失去所有儲存的數據。HEAP作為臨時表很可用！
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
        FROM log_table GROUP BY ip;
SELECT COUNT(ip),AVG(down) FROM test;
DROP TABLE test;

當你使用HEAP表時，這裡是你應該考慮的一些事情：

  • 你應該總是在CREATE語句中指定MAX_ROWS以保証你有意不使用所有的內存。
  • 索引將只能與與=和<=>一起使用（但是很快)。
  • HEAP表使用一個固定的記錄長度格式。
  • HEAP不支援BLOB/TEXT列。
  • HEAP不支援AUTO_INCREMENT列。
  • HEAP不支援在一個NULL列上的索引。
  • 你可以在一個HEAP表中有非唯一鍵(雜湊表一般不這樣)。
  • HEAP表格在所有的客戶之間被共享(就像任何其他的表)。
  • HEAP表的數據以小塊分配。表是100%動態的(在插入時)，無需溢出區和額外的鍵空間。刪除的行放入一個鏈接表並且當你把新數據插入到表時，它將被再次使用。
  • 為了釋放內存，你應該執行DELETE FROM heap_table或DROP TABLE heap_table。
  • 為了保証你不會偶然做些愚蠢的事情，你不能創建比max_heap_table_size大的HEAP表。

到第一章, 前一章, 下一章, 最後一章，目錄.


MySQL中文參考手冊-目錄

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

  • 0 譯者序
  • 1 MySQL的一般的資訊
    • 1.1 什麼是MySQL？
    • 1.2 關於本手冊
      • 1.2.1 本手冊中使用的約定
    • 1.3 MySQL的歷史
    • 1.4 MySQL的主要特徵
    • 1.5 MySQL穩定性？
    • 1.6 順應2000年
    • 1.7 SQL一般資訊和教學課程
    • 1.8 有用的MySQL相關鏈接
  • 2 MySQL 郵件列表及如何提問或報告錯誤
    • 2.1 MySQL郵件列表
    • 2.2 提問或報告錯誤
    • 2.3 怎樣報告錯誤或問題
    • 2.4 在郵件列表上回答問題的指南
  • 3 MySQL的使用授權和技術支援
    • 3.1 MySQL的使用授權政策
    • 3.2 MySQL 使用的版權
      • 3.2.1 可能的未來版權改變
    • 3.3 MySQL商業性分發
    • 3.4 使用授權實例
      • 3.4.1 銷售使用 MySQL的產品
      • 3.4.2 銷售MySQL相關的服務
      • 3.4.3 ISP MySQL服務
      • 3.4.4 運營一個使用MySQL的Web伺服器
    • 3.5 MySQL的使用授權和技術支援費用
      • 3.5.1 付款資訊
      • 3.5.2 聯繫資訊
    • 3.6 商業性支援的類型
      • 3.6.1 基本的電子郵件支援
      • 3.6.2 擴展的電子郵件支援
      • 3.6.3 登錄支援
      • 3.6.4 擴展的登錄支援
  • 4 安裝 MySQL
    • 4.1 怎樣獲得MySQL
    • 4.2 MySQL支援的作業系統
    • 4.3 使用MySQL哪個版本
    • 4.4 怎樣和何時發布更新版本
    • 4.5 安裝布局
    • 4.6 安裝MySQL可執行檔版本
      • 4.6.1 Linux RPM注意事項
      • 4.6.2 構造客戶程式
      • 4.6.3 系統特定的問題
        • 4.6.3.1 Linux 注意事項
        • 4.6.3.2 HP-UX 注意事項
    • 4.7 安裝 MySQL原始碼版本
      • 4.7.1 快速安裝概述
      • 4.7.2 運用修補
      • 4.7.3 典型的configure選項
    • 4.8 編譯問題？
    • 4.9 MIT-pthreads 注意事項
    • 4.10 Perl 安裝說明
      • 4.10.1 在Unix作業系統上安裝 Perl
      • 4.10.2 在 Win32上安裝 ActiveState Perl
      • 4.10.3 在 Win32 上安裝 MySQL Perl 分發
      • 4.10.4 使用 Perl DBI/DBD介面遇到的問題
    • 4.11 系統特定的問題
      • 4.11.1 Solaris注意事項
      • 4.11.2 Solaris 2.7 注意事項
      • 4.11.3 Solaris x86 注意事項
      • 4.11.4 SunOS 4 注意事項
      • 4.11.5 Linux (所有的Linux版本)注意事項
        • 4.11.5.1 Linux-x86 注意事項
        • 4.11.5.2 RedHat 5.0 注意事項
        • 4.11.5.3 RedHat 5.1 注意事項
        • 4.11.5.4 Linux-SPARC 注意事項
        • 4.11.5.5 Linux-Alpha 注意事項
        • 4.11.5.6 MkLinux 注意事項
        • 4.11.5.7 Qube2 Linux 注意事項
      • 4.11.6 Alpha-DEC-Unix 注意事項
      • 4.11.7 Alpha-DEC-OSF1 注意事項
      • 4.11.8 SGI-Irix 注意事項
      • 4.11.9 FreeBSD 注意事項
      • 4.11.10 NetBSD 注意事項
      • 4.11.11 BSD/OS 注意事項
        • 4.11.11.1 BSD/OS 2.x 注意事項
        • 4.11.11.2 BSD/OS 3.x 注意事項
        • 4.11.11.3 BSD/OS 4.x 注意事項
      • 4.11.12 SCO 注意事項
      • 4.11.13 SCO Unixware 7.0 注意事項
      • 4.11.14 IBM-AIX 注意事項
      • 4.11.15 HP-UX 注意事項
    • 4.12 Win32 注意事項
      • 4.12.1 在 Win32 上安裝 MySQL
      • 4.12.2 在 Win95 /Win98上啟動 MySQL
      • 4.12.3 在 NT 上啟動 MySQL
      • 4.12.4 在 Win32 上運行 MySQL
      • 4.12.5 用 SSH 從 Win32 連接一個遠程MySQL
      • 4.12.6 MySQL-Win32與Unix MySQL 比較
    • 4.13 OS/2 注意事項
    • 4.14 TcX 二進制代碼
    • 4.15 安裝後期(post-installation)的設置與測試
      • 4.15.1 運行mysql_install_db 的問題
      • 4.15.2 啟動 MySQL 伺服器的問題
      • 4.15.3 自動啟動和停止 MySQL
      • 4.15.4 選項文件
    • 4.16 升級和降級(downgrading)時有什麼特別要做的事情嗎？
      • 4.16.1 從一個 3.22 版本升級到 3.23
      • 4.16.2 從一個 3.21 版本升級到 3.22
      • 4.16.3 從一個 3.20 版本升級到 3.21
      • 4.16.4 升級到其他的體系結構
  • 5 MySQL 與標準的兼容性？
    • 5.1 MySQL對ANSI SQL92 的擴充
    • 5.2 以ANSI模式運行 MySQL
    • 5.3 MySQL相比ANSI SQL92的差別
    • 5.4 MySQL 缺乏的功能
      • 5.4.1 子選擇(Sub-selects)
      • 5.4.2 SELECT INTO TABLE
      • 5.4.3 事務(Transactions)
      • 5.4.4 儲存程序和觸發器
      • 5.4.5 外鍵(Foreign Keys)
        • 5.4.5.1 不使用外鍵的理由
      • 5.4.6 視圖(Views)
      • 5.4.7 '--'作為一個 注解的開始
    • 5.5 MySQL 遵循什麼標準？
    • 5.6 怎樣處理沒有提交/回卷(COMMIT / ROLLBACK)
  • 6 MySQL 存取權限系統
    • 6.1 權限系統做什麼
    • 6.2 MySQL用戶名和密碼
    • 6.3 與MySQL伺服器連接
    • 6.4 使你的密碼安全
    • 6.5 MySQL 提供的權限
    • 6.6 權限系統工作原理
    • 6.7 存取控制,階段1:連接証實
    • 6.8 存取控制,階段2:請求証實
    • 6.9 權限更改何時生效
    • 6.10 建立初始的 MySQL權限
    • 6.11 向MySQL增加新用戶權限
    • 6.12 怎樣設置密碼
    • 6.13 存取拒絕(Access Denied)錯誤的原因
    • 6.14 怎樣使MySQL安全以對抗解密高手(cracker)
  • 7 MySQL 語言參考
    • 7.1 文字:怎樣寫字符串和數字
      • 7.1.1 字符串
      • 7.1.2 數字
      • 7.1.3 十六進制值
      • 7.1.4 NULL值
      • 7.1.5 資料庫，表，索引，列和別名的命名
        • 7.1.5.1 名字的大小寫敏感性
    • 7.2 用戶變數
    • 7.3 列類型
      • 7.3.1 列類型的儲存要求
      • 7.3.5 數字類型
      • 7.3.6 日期和時間類型
        • 7.3.6.1 問題和日期類型
        • 7.3.6.2 DATETIME,DATE和TIMESTAMP類型
        • 7.3.6.3 TIME類型
        • 7.3.6.4 YEAR類型
      • 7.3.7 字符串類型
        • 7.3.7.1 CHAR和VARCHAR類型
        • 7.3.7.2 BLOB和TEXT類型
        • 7.3.7.3 ENUM類型
        • 7.3.7.4 SET類型
      • 7.3.8 為列選擇正確的類型
      • 7.3.9 列索引
      • 7.3.10 多列索引
      • 7.3.11 使用來自其他資料庫引擎的列類型
    • 7.4 用在SELECT和WHERE子句的函數
      • 7.4.1 分組函數
      • 7.4.2 常用的算術運算
      • 7.4.3 位函數
      • 7.4.4 邏輯運算
      • 7.4.5 比較運算符
      • 7.4.6 字符串比較函數
      • 7.4.7 類型轉換運算符
      • 7.4.8 控制流函數
      • 7.4.9 數學函數
      • 7.4.10 字符串函數
      • 7.4.11 日期和時間函數
      • 7.4.12 其他函數
      • 7.4.13 與GROUP BY子句一起使用的函數
    • 7.5 CREATE DATABASE (創建資料庫)句法
    • 7.6 DROP DATABASE (拋棄資料庫)句法
    • 7.7 CREATE TABLE (創建表)句法
      • 7.7.1 隱含(silent)的列指定變化
    • 7.8 ALTER TABLE (改變表)句法
    • 7.9 OPTIMIZE TABLE (最佳化表) 句法
    • 7.10 DROP TABLE (拋棄表)句法
    • 7.11 DELETE (刪除)句法
    • 7.12 SELECT (選取)句法
    • 7.13 JOIN (聯接)句法
    • 7.14 INSERT (插入)句法
    • 7.15 REPLACE (替換)句法
    • 7.16 LOAD DATA INFILE (裝載數據到文件)句法
    • 7.17 UPDATE (更新)句法
    • 7.18 USE (使用)句法
    • 7.19 FLUSH (清除緩存）句法
    • 7.20 KILL (殺滅)句法
    • 7.21 SHOW (顯示)句法(得到關於表,列等的資訊）
    • 7.22 EXPLAIN (解釋)句法(得到關於SELECT的資訊)
    • 7.23 DESCRIBE (描述)句法(得到列的資訊）
    • 7.24 LOCK TABLES/UNLOCK TABLES (鎖定表/解鎖表)句法
    • 7.25 SET OPTION (設置選項)句法
    • 7.26 GRANT (授權)和REVOKE (撤回)句法
    • 7.27 CREATE INDEX (創建索引)句法
    • 7.28 DROP INDEX (拋棄索引)句法
    • 7.29 注釋句法
    • 7.30 CREATE FUNCTION/DROP FUNCTION (創建函數/拋棄函數)句法
    • 7.31 MySQL對保留字很挑剔嗎？
  • 8 MySQL 教學課程
    • 8.1 聯接和斷開伺服器
    • 8.2 輸入查詢
    • 8.3 常用查詢的例子
      • 8.3.1 列的最大值
      • 8.3.2 擁有某個列的最大值的行
      • 8.3.3 列的最大值:按組:只有值
      • 8.3.4 擁有某個字段的組間最大值的行
      • 8.3.5 使用外鍵
    • 8.4 創建並使用一個資料庫
      • 8.4.1 創建並選用一個資料庫
      • 8.4.2 創建一個資料庫表
      • 8.4.3 將數據裝入資料庫表
      • 8.4.4 從一個資料庫表檢索資訊
        • 8.4.4.1 選擇所有數據
        • 8.4.4.2 選擇特定行
        • 8.4.4.3 選擇特定列
        • 8.4.4.4 排序行
        • 8.4.4.5 日期計算
        • 8.4.4.6 NULL值操作
        • 8.4.4.7 模式匹配
        • 8.4.4.8 行計數
      • 8.4.5 使用多個資料庫表
    • 8.5 獲得資料庫和表的資訊
    • 8.6 以批處理模式使用mysql
    • 8.7 從"雙胞項目"中查詢
      • 8.7.1 找出所有非獨處的雙胞胎
      • 8.7.2 顯示關於雙胞胎近況的表
  • 9 MySQL 伺服器功能
    • 9.1 MySQL 支援哪些語言？
      • 9.1.1 用於數據和排序的字符集
      • 9.1.2 增加一個新的字符集
      • 9.1.3 多字節字符支援
    • 9.2 更新日誌
    • 9.3 MySQL資料庫表可以有多大？
    • 9.4 MySQL資料庫表類型
  • 10 從 MySQL 得到最大的性能
    • 10.1 最佳化概述
    • 10.2 系統/編譯時和啟動參數的調節
      • 10.2.1 編譯和鏈接如何影響 MySQL 的速度
      • 10.2.2 磁碟問題
        • 10.2.2.1 為資料庫和表格使用符號鏈接
      • 10.2.3 調節伺服器參數
      • 10.2.4 MySQL 怎樣打開和關閉資料庫表
      • 10.2.5 在同一個資料庫中創建大量資料庫表的缺點
      • 10.2.6 為什麼有這麼多打開的表？
      • 10.2.7 MySQL 怎樣使用內存
      • 10.2.8 MySQL 怎樣鎖定資料庫表
      • 10.2.9 資料庫表級鎖定的問題
    • 10.3 使你的數據盡可能小
    • 10.4 MySQL 索引的使用
    • 10.5 存取或更新數據的查詢速度
      • 10.5.1 估計查詢性能
      • 10.5.2 SELECT 查詢的速度
      • 10.5.3 MySQL 怎樣最佳化WHERE子句
      • 10.5.4 MySQL 怎樣最佳化LEFT JOIN
      • 10.5.5 MySQL 怎樣最佳化LIMIT
      • 10.5.6 INSERT查詢的速度
      • 10.5.7 UPDATE查詢的速度
      • 10.5.8 DELETE查詢的速度
    • 10.6 選擇一種表類型
      • 10.6.1 靜態(定長)表的特點
      • 10.6.2 動態表的特點
      • 10.6.3 壓縮表的特點
      • 10.6.4 內存(In-memory table)表的特點
    • 10.7 其他最佳化技巧
    • 10.8 使用你自己的效能測試
    • 10.9 設計選擇
    • 10.10 MySQL 設計局限/折衷
    • 10.11 可移植性
    • 10.12 我們已將MySQL用在何處？
  • 11 MySQL 效能套件
  • 12 MySQL 實用程式
    • 12.1 各種 MySQL 程式概述
    • 12.2 管理一個 MySQL 伺服器
    • 12.3 從 MySQL 資料庫和表中倒出(dump)結構和數據
    • 12.4 從文本文件導入數據
    • 12.5 MySQL 壓縮只讀表產生器
  • 13 維護 MySQL 安裝
    • 13.1 使用myisamchk進行表維護和崩潰恢復
      • 13.1.1 myisamchk的調用語法
      • 13.1.2 myisamchk的內存使用
    • 13.2 13.2 建立一個資料庫表維護規範
    • 13.3 獲得關於一個表的資訊
    • 13.4 使用myisamchk進行崩潰恢復
      • 13.4.1 怎樣檢查表的出錯
      • 13.4.2 怎樣修復表
      • 13.4.3 表最佳化
    • 13.5 日誌文件維護
  • 14 為MySQL增加新函數
    • 14.1 增加一個新的用戶定義函數
      • 14.1.1 UDF調用順序
      • 14.1.2 參數處理
      • 14.1.3 返回值和出錯處理
      • 14.1.4 編譯並安裝用戶定義函數
    • 14.2 增加一個新的原生(native)函數
  • 15 為MySQL增加新程序
    • 15.1 analyse程序
    • 15.2 編寫一個程序
  • 16 MySQL對 ODBC 支援
    • 16.1 MyODBC 支援的作業系統
    • 16.2 怎樣報告 MyODBC的問題
    • 16.3 已知可用 MyODBC一起工作的程式
    • 16.4 怎樣填寫 ODBC 管理程式的各種域
    • 16.5 怎樣在ODBC中獲得一個AUTO_INCREMENT列的值
    • 16.6 報告 MyODBC 的問題
  • 17 與一些常用程式一起使用MySQL
    • 17.1 與 Apache一起使用 MySQL
  • 18 問題和常見的錯誤
    • 18.1 如果 MySQL總是崩潰怎麼辦
    • 18.2 使用 MySQL 時一些常見錯誤
      • 18.2.1 MySQL server has gone away錯誤
      • 18.2.2 Can't connect to [local] MySQL server錯誤
      • 18.2.3 Host '...' is blocked錯誤
      • 18.2.4 Out of memory錯誤
      • 18.2.5 Packet too large錯誤
      • 18.2.6 The table is full錯誤
      • 18.2.7 Commands out of sync in client錯誤
      • 18.2.8 Ignoring user錯誤
      • 18.2.9 Table 'xxx' doesn't exist錯誤
    • 18.3 MySQL 怎樣處理一個溢出的磁碟
    • 18.4 怎樣從一個文本文件運行SQL命令
    • 18.5 MySQL 在哪兒儲存臨時文件
    • 18.6 怎樣保護"/tmp/mysql.sock"不被刪除
    • 18.7 Access denied 出錯
    • 18.8 怎樣作為一個一般用戶運行 MySQL
    • 18.9 怎樣重新設置一個忘記的密碼
    • 18.10 文件許可權限問題
    • 18.11 文件沒找到
    • 18.12 使用DATE列的問題
    • 18.13 時區問題
    • 18.14 在搜索中的大小寫敏感性
    • 18.15 NULL值問題
    • 18.16 alias問題
    • 18.17 從相關的表中刪除行
    • 18.18 解決沒有匹配行的問題
    • 18.19 ALTER TABLE問題
    • 18.20 怎樣改變一個表中列的次序
  • 19 解決MySQL 一些常見的問題
    • 19.1 資料庫複製
    • 19.2 資料庫備份
    • 19.3 在同一台機器上運行多個 MySQL 伺服器
  • 20 MySQL 客戶工具和 API
    • 20.1 MySQL C API
    • 20.2 C API數據類型
    • 20.3 C API函數概述
    • 20.4 C API函數描述
      • 20.4.1 mysql_affected_rows (）
      • 20.4.2 mysql_close (）
      • 20.4.3 mysql_connect (）
      • 20.4.4 mysql_change_user (）
      • 20.4.5 mysql_create_db (）
      • 20.4.6 mysql_data_seek (）
      • 20.4.7 mysql_debug (）
      • 20.4.8 mysql_drop_db (）
      • 20.4.9 mysql_dump_debug_info (）
      • 20.4.10 mysql_eof (）
      • 20.4.11 mysql_errno (）
      • 20.4.12 mysql_error (）
      • 20.4.13 mysql_escape_string (）
      • 20.4.14 mysql_fetch_field (）
      • 20.4.15 mysql_fetch_fields (）
      • 20.4.16 mysql_fetch_field_direct (）
      • 20.4.17 mysql_fetch_lengths (）
      • 20.4.18 mysql_fetch_row (）
      • 20.4.19 mysql_field_count (）
      • 20.4.20 mysql_field_seek (）
      • 20.4.21 mysql_field_tell (）
      • 20.4.22 mysql_free_result (）
      • 20.4.23 mysql_get_client_info (）
      • 20.4.24 mysql_get_host_info (）
      • 20.4.25 mysql_get_proto_info (）
      • 20.4.26 mysql_get_server_info (）
      • 20.4.27 mysql_info (）
      • 20.4.28 mysql_init (）
      • 20.4.29 mysql_insert_id (）
      • 20.4.30 mysql_kill (）
      • 20.4.31 mysql_list_dbs (）
      • 20.4.32 mysql_list_fields (）
      • 20.4.33 mysql_list_processes (）
      • 20.4.34 mysql_list_tables (）
      • 20.4.35 mysql_num_fields (）
      • 20.4.36 mysql_num_rows (）
      • 20.4.37 mysql_options (）
      • 20.4.38 mysql_ping (）
      • 20.4.39 mysql_query (）
      • 20.4.40 mysql_real_connect (）
      • 20.4.41 mysql_real_query (）
      • 20.4.42 mysql_reload (）
      • 20.4.43 mysql_row_seek (）
      • 20.4.44 mysql_row_tell (）
      • 20.4.45 mysql_select_db (）
      • 20.4.46 mysql_shutdown (）
      • 20.4.47 mysql_stat (）
      • 20.4.48 mysql_store_result (）
      • 20.4.49 mysql_thread_id (）
      • 20.4.50 mysql_use_result (）
      • 20.4.51 為什麼在mysql_query()返回成功後mysql_store_result()有時返回NULL?
      • 20.4.52 我能從查詢得到什麼結果？
      • 20.4.53 我怎樣才能獲得最後插入的行的唯一ID？
      • 20.4.54 鏈接 C API的問題
      • 20.4.55 怎樣制作一個執行緒安全(thread-safe)的客戶
    • 20.5 MySQL Perl API
      • 20.5.1 DBI與DBD::mysql
      • 20.5.2 DBI介面
      • 20.5.3 更多的DBI/DBD資訊
    • 20.6 MySQL Eiffel 包裝
    • 20.7 MySQL Java 連接(JDBC)
    • 20.8 MySQL PHP API
    • 20.9 MySQL C++ API
    • 20.10 MySQL Python API
    • 20.11 MySQL TCL API
  • 21 怎樣對比MySQL與其他資料庫
    • 21.1 怎樣對比MySQL和mSQL
      • 21.1.1 怎樣將mSQL工具轉換到MySQL
      • 21.1.2 mSQL和MySQL的 客戶機/伺服器通訊協議有何不同
      • 21.1.3 mSQL 2.0 SQL句法與MySQL有何不同
    • 21.2 怎樣對比MySQL與PostgreSQL
  • A 一些 MySQL 用戶
  • B 貢獻的程式
  • C MySQL貢獻者
  • D MySQL 變遷的歷史記錄
  • E MySQL中已知的錯誤和設計缺限
  • F 我們想要在未來加入到MySQL 的計劃表( TODO ）
  • G 對移植到其他系統的說明
  • H MySQL 正則表達式句法的描述
  • I 什麼是 Unireg？
  • J 針對非微軟作業系統的 MySQL 伺服器使用授權
  • K 針對微軟作業系統的 MySQL 使用授權
  • SQL命令，類型和函數索引
  • 概念索引


MySQL Reference Manual for version 3.23.7-alpha. - F List of things we want to add to MySQL in the future (The TODO)

Go to the first, previous, next, last section, table of contents.

F List of things we want to add to MySQL in the future (The TODO)

Everything in this list is in the order it will be done. If you want to affect the priority order, please register a license or support us and tell us what you want to have done more quickly. See section 3 MySQL licensing and support.

F.1 Things that must done in the real near future

  • One way replication
  • Transactions
  • Subqueries. select id from t where grp in (select grp from g where u > 100)
  • Allow mysqld to support many character sets at the same time.
  • If you perform an ALTER TABLE on a table that is symlinked to another disk, create temporary tables on this disk.
  • RENAME table as table, table as table [,...]
  • FreeBSD and MIT-pthreads; Do sleeping threads take CPU?
  • Allow join on key parts (optimization issue).
  • Entry for DECRYPT().
  • Remember FOREIGN key definitions in the `.frm' file.
  • Server side cursors.
  • Allow users to change startup options.
  • Add --ansi option to MySQL (to change || -> CONCAT())
  • Don't add automatic DEFAULT values to columns. Give an error when using an INSERT that doesn't contain a column that doesn't have a DEFAULT.
  • Caching of queries and results. This should be done as a separated module that examines each query and if this is query is in the cache the cached result should be returned. When one updates a table one should remove as few queries as possible from the cache. This should give a big speed bost on machines with much RAM where queries are often repeated (like WWW applications). One idea would be to only cache queries of type: SELECT CACHED ....
  • Fix `libmysql.c' to allow two mysql_query() commands in a row without reading results or give a nice error message when one does this.
  • Optimize BIT type to take 1 bit (now BIT takes 1 char).
  • Check why MIT-pthreads ctime() doesn't work on some FreeBSD systems.
  • Check if locked threads take any CPU.
  • Add ORDER BY to update. This would be handy with functions like: generate_id(start,step).
  • Add an IMAGE option to LOAD DATA INFILE to not update TIMESTAMP and AUTO_INCREMENT fields.
  • Make LOAD DATA INFILE understand a syntax like:
    LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name
TEXT_FIELDS (text_field1, text_field2, text_field3)
SET table_field1=concatenate(text_field1, text_field2), table_field3=23
IGNORE text_field3
  • Add true VARCHAR support (There is already support for this in MyISAM).
  • Automatic output from mysql to netscape.
  • LOCK DATABASES. (with various options)
  • NATURAL JOIN.
  • Change sort to allocate memory in ``hunks'' to get better memory utilization.
  • DECIMAL and NUMERIC types can't read exponential numbers; Field_decimal::store(const char *from,uint len) must be recoded to fix this.
  • Fix mysql.cc to do fewer malloc() calls when hashing field names.
  • Functions: ADD_TO_SET(value,set) and REMOVE_FROM_SET(value,set)
  • Add use of t1 JOIN t2 ON ... and t1 JOIN t2 USING ... Currently, you can only use this syntax with LEFT JOIN.
  • Add full support for unsigned long long type.
  • Function CASE.
  • Many more variables for show status. Counts for: INSERT/DELETE/UPDATE statements. Records reads and updated. Selects on 1 table and selects with joins. Mean number of tables in select. Key buffer read/write hits (logical and real). ORDER BY, GROUP BY, temporary tables created.
  • If you abort mysql in the middle of a query, you should open another connection and kill the old running query. Alternatively, an attempt should be made to detect this in the server.
  • Add a handler interface for table information so you can use it as a system table. This would be a bit slow if you requested information about all tables, but very flexible. SHOW INFO FROM tbl_name for basic table information should be implemented.
  • Add support for UNICODE.
  • NATURAL JOIN.
  • Oracle like CONNECT BY PRIOR ... to search hierarchy structures.
  • RENAME DATABASE
  • mysqladmin copy database new-database.
  • Processlist should show number of queries/thread.
  • IGNORE option to the UPDATE statement (this will delete all rows that gets a dupplicate key error while updating).
  • Change the format of DATETIME to store fractions of seconds.
  • Add all missing ANSI92 and ODBC 3.0 types.
  • Change table names from empty strings to NULL for calculated columns.

F.2 Things that have to be done sometime

  • Implement function: get_changed_tables(timeout,table1,table2,...)
  • Implement function: LAST_UPDATED(tbl_name)
  • Atomic updates; This includes a language that one can even use for a set of stored procedures.
  • update items,month set items.price=month.price where items.id=month.id;
  • Change reading through tables to use memmap when possible. Now only compressed tables use memmap.
  • Add a new privilege 'Show_priv' for SHOW commands.
  • Make the automatic timestamp code nicer. Add timestamps to the update log with SET TIMESTAMP=#;
  • Use read/write mutex in some places to get more speed.
  • Full foreign key support. One probably wants to implement a procedural language first.
  • Simple views (first on one table, later on any expression).
  • Automatically close some tables if a table, temporary table or temporary files gets error 23 (not enough open files).
  • When one finds a field=#, change all occurrences of field to #. Now this is only done for some simple cases.
  • Change all const expressions with calculated expressions if possible.
  • Optimize key = expression. At the moment only key = field or key = constant are optimized.
  • Join some of the copy functions for nicer code.
  • Change `sql_yacc.yy' to an inline parser to reduce its size and get better error messages (5 days).
  • Change the parser to use only one rule per different number of arguments in function.
  • Use of full calculation names in the order part. (For ACCESS97)
  • UNION, MINUS, INTERSECT and FULL OUTER JOIN. (Currently only LEFT OUTER JOIN is supported)
  • Allow UNIQUE on fields that can be NULL.
  • SQL_OPTION MAX_SELECT_TIME=# to put a time limit on a query.
  • Make the update log to a database.
  • Negative LIMIT to retrieve data from the end.
  • Alarm around client connect/read/write functions.
  • Make a mysqld version which isn't multithreaded (3-5 days).
  • Please note the changes to safe_mysqld: according to FSSTND (which Debian tries to follow) PID files should go into `/var/run/<progname>.pid' and log files into `/var/log'. It would be nice if you could put the "DATADIR" in the first declaration of "pidfile" and "log", so the placement of these files can be changed with a single statement.
  • Better dynamic record layout to avoid fragmentation.
  • UPDATE SET blob=read_blob_from_file('my_gif') where id=1;
  • Allow a client to request logging.
  • Add use of zlib() for gzip-ed files to LOAD DATA INFILE.
  • Fix sorting and grouping of BLOB columns (partly solved now).
  • Stored procedures. This is currently not regarded to be very important as stored procedures are not very standardized yet. Another problem is that true stored procedures make it much harder for the optimizer and in many cases the result is slower than before We will, on the other hand, add a simple (atomic) update language that can be used to write loops and such in the MySQL server.
  • Change to use semaphores when counting threads. One should first implement a semaphore library to MIT-pthreads.
  • Don't assign a new AUTO_INCREMENT value when one sets a column to 0. Use NULL instead.
  • Add full support for JOIN with parentheses.
  • Reuse threads for system with a lot of connections.

Time is given according to amount of work, not real time. TcX's main business is the use of MySQL not the development of it. But since TcX is a very flexible company, we have put a lot of resources into the development of MySQL.

F.3 Some things we don't have any plans to do

  • Transactions with rollback (we mainly do SELECTs, and because we don't do transactions, we can be much quicker on everything else). We will support some kind of atomic operations on multiple tables, though. Currently atomic operations can be done with LOCK TABLES/UNLOCK TABLES but we will make this more automatic in the future.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - I What is Unireg?

Go to the first, previous, next, last section, table of contents.

I What is Unireg?

Unireg is our tty interface builder, but it uses a low level connection to our ISAM (which is used by MySQL) and because of this it is very quick. It has existed since 1979 (on Unix in C since ~1986).

Unireg has the following components:

  • One table viewer with updates/browsing.
  • Multi table viewer (with one scrolling region).
  • Table creator. (With lots of column tags you can't create with MySQL) This is WYSIWYG (for a tty). You design a screen and Unireg prompts for the column specification.
  • Report generator.
  • A lot of utilities (quick export/import of tables to/from text files, analysis of table contents...).
  • Powerful multi-table updates (which we use a lot) with a BASIC-like language with LOTS of functions.
  • Dynamic languages (at present in Swedish and Finnish). If somebody wants an English version there are a few files that would have to be translated.
  • The ability to run updates interactively or in a batch.
  • Emacs-like key definitions with keyboard macros.
  • All this in a binary of 800K.
  • The convform utility. Converts `.frm' and text files between different character sets.
  • The myisampack utility. Packs a ISAM table (makes it 50-80% smaller). The table can be read by MySQL like an ordinary table. Only one record has to be decompressed per access. Cannot handle BLOB or TEXT columns or updates (yet).

We update most of our production databases with the Unireg interface and serve web pages through MySQL (and in some extreme cases the Unireg report generator).

Unireg takes about 3M of disk space and works on at least the following platforms: SunOS 4.x, Solaris, Linux, HP-UX, ICL Unix, DNIX, SCO and MS-DOS.

Unireg is currently only available in Swedish and Finnish.

The price tag for Unireg is 10,000 Swedish kr (about $1500 US), but this includes support. Unireg is distributed as a binary. (But all the ISAM sources can be found in MySQL). Usually we compile the binary for the customer at their site.

All new development is concentrated to MySQL.

Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - A Some MySQL users

Go to the first, previous, next, last section, table of contents.

A Some MySQL users

A.1 General news sites

  • A pro-Linux/tech news and comment/discussion site
  • All about Linux
  • 32Bits Online: because there's more than one way to compute
  • New about new versions of computer related stuff
  • @end itemize

    A.2 Some Web search engines

    • AAA Matilda Web Search
    • What's New
    • Aladin
    • Columbus Finder
    • Spider
    • Blitzsuche
    • Indoseek Indonesia
    • Yaboo - Yet Another BOOkmarker
    • Yahoosuck
    • OzSearch Internet Guide
    • Splat! Search

    A.3 Some Information search engines concentrated on some area

    • Jobvertise: Post and search for jobs
    • The Music Database
    • Fotball (Soccer) search page
    • TAKEDOWN - wrestling
    • The International Lyrics Network
    • Musicians looking for other musicians (Free Service)
    • AddALL books searching and price comparison
    • Harvard's Gray Herbarium Index of Plant Names
    • The Game Development Search Engine
    • My-Recipe.com; Cookbook at i-run.com
    • The Innkeeper Vacation Guides
    • The Mac Game Database uses PHP and MySQL
    • Research Publications at Monash University in Australia
    • Occupational Health & Safety website databse (a project for the ECC)
    • Bioinformatics databases at the Montreal Children's Hospital using MySQL

    A.4 Web sites the use MySQL as a backed

    • Qt Widget and Object Repository
    • Brazilian samba site (in Portuguese)
    • Polish General Social Survey
    • Expo2000 World-wide distribution of tickets for this event is implemented using MySQL and tcl/tk. More than 5000 travel-agencies all over the world have access to it.
    • FreeVote.com is a free voting service with millions of users.
    • Forza Motorsport

    A.5 Some Domain/Internet/Web and related services

    • Registry of Web providers that support MySQL
    • Dynamic DNS Services
    • Dynamic domain name service
    • Open DNS Project; free dynamic DNS service
    • Free 3rd level domains
    • Online Database
    • BigBiz Internet Services
    • The Virt Gazette
    • Global InfoNet Inc
    • WebHosters - A Guide to WWW Providers
    • Internet information server
    • A technology news site
    • WorldNet Communications - An Internet Services Provider
    • Netizen: Australian-based web consultancy
    • Search site for training courses in the UK
    • Gannon Chat (GPL). Written in Perl and Javascript
    • A general links directory
    • A web-based bookmark management service
    • Walnut Creek CDROM
    • WWWThreads; Interactive discussion Forums
    • In Italian; Storage data from meteo station
    • Online "Person To Person" Auction
    • Tips on web development
    • Mailfriends.com is a FREE service for everybody who wants to find friends over the internet.
    • Web Page Telnet BBS List
    • UniNova Digital Postcards
    • DSL providers search with reviews Made with MySQL and Modperl, all pages are generated dynamically out of the MySQL database

    A.6 Web sites that use PHP and MySQL

    • Jgaa's Internet - Official Support Site
    • Ionline - online publication: MySQL, PHP, Java, Web programming, DB development
    • BaBoo(Browse and bookmark). Free web-based bookmark manager and Calendar
    • Course Schedule System at Pensacola Junior College
    • Florida Community College at Jacksonville
    • 32bit.com; An extensive shareware / freeware archive
    • Jokes 2000
    • Burken.NU Burken is a webhotel that provides scripts, among other things, for remote users, like counters, guestbooks etc.
    • tips.pair.com Contains tips on html, javascript, 2d/3d graphics and PHP3/MySQL. All pages are generated from a database.

    A.7 Some MySQL consultants

    • Ayni AG
    • Online Database
    • DataGuard (Uses MySQL and PHP)
    • WWITS (Uses MySQL and PHP)
    • WCN - The World Community Network
    • Chip Castle Dot Com Inc
    • Cybersource Pty. Ltd
    • Spring infotainment gmbh & co. kg
    • Develops websites using MySQL

    A.8 Programming

    • The Perl CPAN Testers results page

    A.9 Uncategorized pages

    • AZC.COM's Feature Showcase
    • Course Search
    • Northerbys Online Auctions
    • Amsterdam Airport Schiphol
    • CD database
    • Used Audio Gear Database
    • Musical note-sheets
    • Bagism - A John Lennon fan page
    • US Folk art broker
    • Mail reading on the web
    • Free home pages on www.somecoolname.mypage.org
    • Der Server f@"ur Schulen im Web (In German)
    • Auldhaefen Online Services
    • CaryNET Information Center
    • Dataden Computer Systems
    • Andr'emuseet (In Swedish)
    • HOMESITE Internet Marketing
    • Jade-V Network Services
    • Weather World 2010 Technical Credits
    • About The Gimp plugin registry
    • Java tool Archiver technical detail (Slightly optimistic about MySQL ANSI-92 compliance)
    • Games Domain Cheats Database
    • The "Powered By" Page (Kcilink)
    • Netcasting
    • NBL (Australian National Basketball League) tipping
    • CGI shop
    • Whirlycott: Website Design
    • Museum Tusculanum Press
    • Centro Siciliano di Documentazione
    • Quake statistics database
    • Astroforum: Astrologie and related things (in German)
    • OpenDebate - Interactive Polls & Open Discussion
    • Online chemical dissertation server
    • FreSch! The Free Scholarship Search Service
    • Stockholm Pinball Locator
    • HEK A construction company
    • Elsevier Bussines Information
    • Medical Links (Using Coldfusion and MySQL)
    • Search for jobs & people at JobLink-USA
    • Daily news about Linux in German language
    • Competition Formation Skydiving
    • E-commerce and internal accounting
    • Denmark's leading business daily newspaper B@o{rsen}
    • The Internet NES Database
    • Travel agency in Prague in 3 languages
    • Linkstation
    • Searchable online database at Peoplestaff
    • A searchable database system for horse classified ads
    • The Poot site
    • "Playin' in the LAN"; a network monitoring suite
    • U.S. Army Publishing Agency
    • Realestate handling in Yugoslavia
    • PIMS; a Patient Information Management System
    • Pilkington Software Inc
    • Betazine - The Ultimate Online Beta Tester's Magazine
    • A Vietnam Veteran's Memorial (The Wall) database.
    • Gamer's Union specializes inauctions of used & out of print gaming material
    • A daily bulletin at Monterey High school
    • Computer Currents Magazine
    • Community-owned site serving Lake Washington's Eastside residents and businesses
    • French bowling site.

    Send any additions to this list to webmaster@mysql.com.

    Go to the first, previous, next, last section, table of contents.


MySQL Reference Manual for version 3.23.7-alpha. - K The MySQL license for Microsoft operating systems

Go to the first, previous, next, last section, table of contents.

K The MySQL license for Microsoft operating systems

MySQL shareware license for Microsoft operating systems (Version 1, September 4, 1998)

Copyright (C) 1998 TcX AB & Monty Program KB & Detron HB Stockholm SWEDEN, Helsingfors FINLAND and Uppsala SWEDEN All rights reserved.

This License applies to the computer program known as "MySQL".

This License applies when running MySQL on any Microsoft operating system. Microsoft operating systems include all versions of Microsoft Windows NT and Microsoft Windows.

YOU SHOULD CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS BEFORE USING, COPYING OR DISTRIBUTING MySQL. BY USING, COPYING AND DISTRIBUTING MySQL, YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR USING, COPYING AND DISTRIBUTING MySQL OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO USE, COPY OR DISTRIBUTE MySQL OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT USE, COPY OR DISTRIBUTE MySQL.

  1. Evaluation and License Registration. This is an evaluation version of MySQL for Win32. Subject to the terms below, you are hereby licensed to use MySQL for evaluation purposes without charge for a period of 30 days. If you use MySQL after the 30 day evaluation period the registration and purchase of a MySQL license is required. The price for a MySQL license is currently 200 US dollars and email support starts from 200 US dollars/year. Quantity discounts are available. If you pay by credit card, the currency is EURO (The European Unions common currency) so the prices will differ slightly. The easiest way to register or find options about how to pay for MySQL is to use the license form at TcX's secure server at https://www.mysql.com/license.htmy. This can be used also when paying with credit card over the Internet. Other applicable methods for paying are SWIFT payments, cheques and credit cards. Payment should be made to:
    Postgirot Bank AB
105 06 STOCKHOLM, SWEDEN

TCX DataKonsult AB
BOX 6434
11382 STOCKHOLM, SWEDEN

SWIFT address: PGSI SESS
Account number: 96 77 06 - 3

    Specify: license and/or support and your name and email address. In Europe and Japan, EuroGiro (that should be cheaper) can be used to the same account. If you want to pay by cheque make it payable to "Monty Program KB" and mail it to the address below.

    TCX DataKonsult AB
BOX 6434
11382 STOCKHOLM, SWEDEN

    For more information about commercial licensing, please contact:

    David Axmark
Kungsgatan 65 B
753 21 UPPSALA
SWEDEN
Voice Phone +46-18-10 22 80     GMT 9-21. Swedish and English spoken
Fax +46-8-729 69 05             Email *much* preferred.
E-Mail: mysql-licensing@mysql.com

    For more about the license prices and commercial support, like email support, please refer to the MySQL manual. See section 3.5 MySQL licensing and support costs. See section 3.6 Types of commercial support. The use of MySQL or any work based on MySQL after the 30-day evaluation period is in violation of international copyright laws.

  2. Registered version of MySQL. After you have purchased a MySQL license we will send you a receipt by paper mail. You are allowed to use MySQL or any work based on MySQL after the 30-days evaluation period. The use of MySQL is, however, restricted to one physical computer, but there are no restrictions on concurrent uses of MySQL or the number of MySQL servers run on the computer. We will also email you an address and password for a password-protected WWW page that always has the newest MySQL-Win32 version. Our current policy is that a user with the MySQL license can get free upgrades. The best way to ensure that you get the best possible support is to purchase commercial support!
  3. Registration for use in education and university or government-sponsored research. You may obtain a MySQL license for the use in education and university or government-sponsored research for free. In that case, send a detailed application for licensing MySQL for such use to the email address The following information is required in the application:
    • The name of the school or institute.
    • A short description of the school or institute and of the type of education, resarch or other functions it provides.
    • A detailed report of the use of MySQL in the institution.

    In this case you will be provided with a license that entitles you to use MySQL in a specified manner.

  4. Distribution. Provided that you verify that you are distributing an evaluation or educational/research version of MySQL you are hereby licensed to make as many literal (i.e., verbatim) copies of the evaluation version of MySQL and documentation as you wish.
  5. Restrictions. The client code of MySQL is in the Public Domain or under the GPL (for example the code for readline) license. You are not allowed to modify, recompile, translate or create derivative works based upon any part of the server code of MySQL.
  6. Reservation of Rights. No rights are granted to MySQL except as expressly set forth herein. You may not copy or distribute MySQL except as expressly provided under this License. Any attempt otherwise to copy or distribute MySQL is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  7. Other Restrictions. If the distribution and/or use of MySQL is restricted in certain countries for any reason, the Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  8. Limitations. MySQL IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR MySQL, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF MySQL IS WITH YOU. SHOULD MySQL PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL THE LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE MySQL AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE MySQL (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF MySQL TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

Go to the first, previous, next, last section, table of contents.


New Page

mysql-logo.gif (3082 bytes) MySQL中文參考手冊

譯者：晏子 (clyan@sohu.com）
GB 碼主頁：http://linuxdb.yeah.net

Big5 轉碼者：statue (statue@bbs.yzu.edu.tw）
詞彙轉換：彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁： http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站： http://php.wilson.gs/mysqldoc/big5/manual_toc.html

目錄

0 譯者序

MySQL是一個精巧的SQL資料庫管理系統，雖然它不是開放原始程式的產品，但在某些情況下你可以自由使用。由於它的強大功能、靈活性、豐富的應用編程介面（API）以及精巧的系統結構，受到了廣大自由軟件愛好者甚至是商業軟件用戶的青睞，特別是與Apache和PHP/PERL結合，為建立基於資料庫的動態網站提供了強大動力。

MySQL有瑞典的T.c.X公司負責開發和維護，MySQL的用戶手冊很單純，只有一個集中的<MySQL Reference Manual>，但其內容覆蓋了MySQL的所有資訊，因此該手冊是了解和掌握MySQL的絕佳文獻。

雖然對MySQL的開發不能出一份力，但可為它的推廣使用盡一份心，面對500多頁的參考手冊，知道要精確譯出它決非易事，但願幾個月的心血能為大家提供一絲微薄的幫助。

由於本人水平有限，文中肯定有不準確的地方，敬請在閱讀程序中不吝指出。文中不明之處，請參閱手冊原文。

本文的內容針對MySQL 3.23.7alpla，實際上很多內容是通用的。另外，參考手冊的幾個附錄也是很有價值的，但由於時間有限，未能譯出，可參見原文。

MySQL官方站點：http://www.mysql.com.

最新參考手冊：http://www.mysql.com/doc.html

版權說明：本手冊參考之原文的版權屬T.c.X。而本手冊可自由使用、修改、散發、轉載和商業用途，但必須保留譯者署名。

目錄


關於本手冊

PHP 手冊
上一頁 下一頁

附錄 K. 關於本手冊

目錄
手冊的格式
關於用戶註釋
如何閱讀函式的定義（函式原型）
本手冊中所涉及的 PHP 版本
如何得到關於 PHP 更多的訊息
如何幫助改進本文檔
如何產生手冊的各種格式
手冊譯文

手冊的格式

《PHP 參考手冊》提供了多種不同格式的版本，它們可以分為兩組：在線閱讀版本和可下載包。

註: 有些出版商可能已經出版了本手冊的一些印刷版本，但我們不推薦您使用它們，因為 PHP 參考手冊更新得非常快，這些印刷版本將很快失去時效性。

您可以連接 http://www.php.net/ 及其眾多的鏡像站點來在線閱讀《PHP 參考手冊》。為了保証最佳的連接速度，您應該選擇離您的地理位置最接近的鏡像站點。您可以選擇閱讀可直接顯示的 HTML 版本，也可以閱讀集成在 PHP 官方站點中的 HTML 版本，該版本讓您感覺《PHP 參考手冊》就是該網站的一部分。

和絕大多數離線格式的手冊相比，在線閱讀版本有一個很大的優點，即它集成了用戶註釋；同時，它的明顯的缺點是您必須保持一直在線來閱讀。

目前，《PHP 參考手冊》提供多種離線閱讀格式，最適合於您的格式取決於您使用的操作系統和您個人的閱讀習慣。關於《PHP 參考手冊》如何被製作成如此多的版本，請查閱本附錄中“如何產生手冊的各種格式”一節。

跨平台性最好的格式是 HTML 格式和純文字格式。HTML 格式提供了兩種方式：一種只有一個很大的 HTML 文件；另一種方式是每一節分成一個獨立文件，它們形成一個包含有幾千個文件的文件包。HTML 和純文字格式的《PHP 參考手冊》都是以 bzip2 方式壓縮的 tar 文件提供。文件的副檔名為 tar.bz2。

另一種流行的跨平台格式，也是最適合顯示的格式，是 PDF（也就是 Adobe Acrobat）格式。不過，當您急匆匆地下載該版本，並點擊“顯示”按鈕的時候，我們需要提醒您本手冊有 2000 多頁，並且還在不斷地被修訂。

註: 如果您還沒有可以直接閱讀 PDF 格式文檔的軟件，您可能需要下載 Adobe Acrobat Reader。

對於手掌機及其相容設備的用戶來說，該平台最理想的格式是 Palm 文檔或者 iSilo 格式。您可以在日常工作中帶著您的手掌機，利用 DOC 或 iSilo 閱讀器來溫習 PHP 知識，當然，也可以作為快速的參考。

對於 Windows 平台，我們利用了 Windows 的超文本幫助應用程序結合本手冊的 HTML 格式，形成了本手冊的 Windows 超文本幫助版本。該版本提供手冊的全文搜索、完整的索引以及書簽功能。很多 Windows 平台下流行的 PHP 集成開發環境也集成了該版本的手冊，以給開發者提供最方便快捷的參考。

上一頁 | 首頁 | 下一頁
解析器代號列表 | 上一層 | 關於用戶註釋


如何產生手冊的各種格式

本手冊使用 XML 語言編寫，同時運用了 DocBook XML DTD。我們使用了 DSSSL （Document Style and Semantics Specification Language，文檔樣式和語義規格語言）來控制格式。同時，在實驗上我們運用 XSLT （Extensible Stylesheet Language Transformations，可擴展樣式表語言轉換）來維護格式。

將 XML 語言作為源文件格式，使得我們只需維護該源文件文檔，就可以可以利用它產生許多其它的輸出格式。輸出 HTML 和 TeX 版本的工具是由 James Clark 開發的 Jade，以及由 Norman Walsh 開發的 The Modular DocBook Stylesheets。我們使用 Microsoft HTML Help Workshop 來產生本手冊的 Windows 超文本幫助格式。當然，PHP 本身也完成了其它一些轉換和格式化工作。

您可以從 http://www.php.net/docs.php 下載本手冊各種不同語言和格式的版本，包括純文字、普通 HTML、PDF、PalmPilot DOC、PalmPilot iSilo 和 Windows 超文本幫助格式。當手冊內容更新時，其它格式的版本將自動更新。

在 http://cvs.php.net/ 您可以找到更多關於下載本文檔 XML 原始碼的訊息。它們被存放在 phpdoc 模塊下。

上一頁 | 首頁 | 下一頁
如何幫助改進本文檔 | 上一層 | 手冊譯文


如何幫助改進本文檔

您可以通過以下三種途徑來幫助改善本文檔。

如果您發現本手冊任何一個格式的版本中有錯誤， 請通過設在 http://bugs.php.net/ 的糾錯系統向我們報告，並將您送出的錯誤分類為“文檔問題 (Documentation Problem)”。您在這裡也可以送出和某一格式的手冊相關的問題。

註: 請勿濫用糾錯系統來尋求幫助。如需幫助請使用前面提到的郵件列表和虛擬社區網站。

通過送出註釋，您可以向其它讀者提供更多的範例、解釋和闡述。送出註釋請使用註釋系統，而非糾錯系統。請閱讀本附錄中“關於用戶註釋”一節以獲得更多關於註釋的訊息。

如果您懂英語和其它語種的語言，您也可以參與我們的翻譯工作。如果您希望開始一個新語言版本的翻譯，或者希望參與某一個語言版本的翻譯工作，請下載並閱讀 PHP Documentation HOWTO。

該文檔的簡體中文版可在 http://cvs.php.net/co.php/phpdoc-zh/howto/howto_zh_cn.html.tar.gz 下載。

上一頁 | 首頁 | 下一頁
如何得到關於 PHP 更多的訊息 | 上一層 | 如何產生手冊的各種格式


如何得到關於 PHP 更多的訊息

本手冊並不打算提供基本的編程開發指導。如果您是一個初級的程序員，甚至是第一次編程，您可能會發現利用本手冊來學習如何用 PHP 編程是一件很困難的事情。為了尋找一本更適合初學者的書，請連接 http://www.php.net/books.php 查看 PHP 相關書籍的列表。

目前，PHP 官方提供了許多郵件列表來討論 PHP 編程相關的各個方面的問題。當您在 PHP 的開發過程中碰到了難題，而且自己無法找到合適的解決方法時，您可以到該郵件列表尋求幫助。請連接 http://www.php.net/support.php 查看郵件列表清單，我們同時提供了郵件列表的存檔和其它在線支援的資料。此外，在 http://www.php.net/links.php 有一個關於 PHP 相關網站的列表，在這些網站中您可以找到和 PHP 相關的文章、論壇和代碼。

上一頁 | 首頁 | 下一頁
本手冊中所涉及的 PHP 版本 | 上一層 | 如何幫助改進本文檔


關於用戶註釋

用戶註釋在本手冊的開發過程中搬演了相當重要的角色。通過允許手冊的讀者利用它們的瀏覽器提供範例、解釋和進一步的闡述，我們便能夠把這些反饋訊息包含到手冊的正文中。而且，當這些註釋被包含後，讀者就可以在線通過它們被送出的格式來閱讀它們，也可以通過某些離線格式來閱讀。

註: 用戶註釋在網上出現之前並不成熟，因此這些文字和代碼的質量，甚至它們的真實性無從得到保証。（這並不是說本手冊本身的質量和准確性沒有任何的保証。）

上一頁 | 首頁 | 下一頁
關於本手冊 | 上一層 | 如何閱讀函式的定義（函式原型）


本手冊中所涉及的 PHP 版本

本文檔包含有 PHP 4 有關的內容，以及一些關於 PHP 3 移植和相容的注意事項。PHP 不同版本之間的行為、參數、傳回值和其它改變都以“注意”的形式加入了本手冊的正文。

您或許會找到一些關於 CVS 版本 PHP（由 CVS 版本控制系統直接得到的最新的開發版本）的文檔。如果您本身並不是 PHP 的開發者，並且您並不十分渴望使用 PHP 最新的開發版本，那麼標識了“僅 CVS 適用”的章節所描述的特性並不適用於您，或許這些特性會出現在 PHP 下一個穩定版本中。如果您希望下載 CVS 版本，請查閱 CVS 的匿名連接。

您還有可能遇到一些文檔僅適用於尚未發布的 PHP 版本（例如 PHP 4.3.0，而當前最新的穩定版本是 4.2.3）。多數情況下，這並不是文檔中的錯誤，我們經常在文檔中加入一些目前版本尚未支援的特性描述，但這些特性將在未來某一個確定的 PHP 版本中實現。

上一頁 | 首頁 | 下一頁
如何閱讀函式的定義（函式原型） | 上一層 | 如何得到關於 PHP 更多的訊息


手冊譯文

《PHP 參考手冊》不但有各種不同的格式，而且還有各種語言的版本。手冊的正文最初是用英語撰寫的，後來有來自全世界各地的工作組致力於本手冊各種語言版本的翻譯工作。如果某個函式或者章節的內容尚未被翻譯，則該語言版本手冊的發布將落後於英語版本。

翻譯工作者首先從本手冊的 XML 原始碼（可於 http://cvs.php.net/ 下載）入手，將這些原始碼翻譯成他們的母語，而並非翻譯 HTML 版本，純文字，或者PDF 版本。我們的編譯系統負責將 XML 原始碼轉換成人類可以閱讀的版本。

註: 如果您願意幫助將本手冊翻譯成您的母語，請發一封空的電子郵件到 phpdoc-subscribe@lists.php.net 加入 phpdoc 郵件列表以便與文檔翻譯小組取得聯系。郵件列表的位址為 phpdoc@lists.php.net。請在電子郵件中聲明您對文檔翻譯成您的母語的翻譯工作感興趣，有人會給您回應，並幫助您加入到已經存在的翻譯小組，或者開始新語種的翻譯工作。

目前，本手冊已經（或部分）有下列語種的譯文：巴西葡萄牙語、漢語、捷克語、荷蘭語、法語、德語、匈牙利語、意大利語、日語、韓語、波蘭語和西班牙語。

您可以連接 http://www.php.net/docs.php 來下載各種版本。

上一頁 | 首頁 | 下一頁
如何產生手冊的各種格式 | 上一層 | 補充說明


函式別名列表

PHP 手冊
上一頁 下一頁

附錄 F. 函式別名列表

這裡是函式別名列表。所有的別名列表如下。通常使用別名並不是一個好主意，這是因為它可能會廢棄不用或者重新定義。這會導致不可移植腳本的出現。本列表是為了幫助想要升級他們舊有腳本到新版本語法的開發人員。

但是，一些函式只是簡單的有兩個名稱，並沒有真正意義上的區別。（例如，is_int() 和 is_integer() 是完全等價的。）

該列表基於 PHP 4.0.6。

表格 F-1. 別名列表

別名 | 主函式 | 使用的擴展模塊
_ | gettext() | Gettext
add | swfmovie_add() | Ming (flash)
add | swfsprite_add() | Ming (flash)
add_root | domxml_add_root() | DOM XML
addaction | swfbutton_addAction() | Ming (flash)
addcolor | swfdisplayitem_addColor() | Ming (flash)
addentry | swfgradient_addEntry() | Ming (flash)
addfill | swfshape_addfill() | Ming (flash)
addshape | swfbutton_addShape() | Ming (flash)
addstring | swftext_addString() | Ming (flash)
addstring | swftextfield_addString() | Ming (flash)
align | swftextfield_align() | Ming (flash)
attributes | domxml_attributes() | DOM XML
children | domxml_children() | DOM XML
chop | rtrim() | Base syntax
close | closedir() | Base syntax
com_get | com_propget() | COM
com_propset | com_propput() | COM
com_set | com_propput() | COM
cv_add | ccvs_add() | CCVS
cv_auth | ccvs_auth() | CCVS
cv_command | ccvs_command() | CCVS
cv_count | ccvs_count() | CCVS
cv_delete | ccvs_delete() | CCVS
cv_done | ccvs_done() | CCVS
cv_init | ccvs_init() | CCVS
cv_lookup | ccvs_lookup() | CCVS
cv_new | ccvs_new() | CCVS
cv_report | ccvs_report() | CCVS
cv_return | ccvs_return() | CCVS
cv_reverse | ccvs_reverse() | CCVS
cv_sale | ccvs_sale() | CCVS
cv_status | ccvs_status() | CCVS
cv_textvalue | ccvs_textvalue() | CCVS
cv_void | ccvs_void() | CCVS
die | exit() | Miscellaneous functions
dir | getdir() | Base syntax
diskfreespace | disk_free_space() | Filesystem
domxml_getattr | domxml_get_attribute() | DOM XML
domxml_setattr | domxml_set_attribute() | DOM XML
doubleval | floatval() | Base syntax
drawarc | swfshape_drawarc() | Ming (flash)
drawcircle | swfshape_drawcircle() | Ming (flash)
drawcubic | swfshape_drawcubic() | Ming (flash)
drawcubicto | swfshape_drawcubicto() | Ming (flash)
drawcurve | swfshape_drawcurve() | Ming (flash)
drawcurveto | swfshape_drawcurveto() | Ming (flash)
drawglyph | swfshape_drawglyph() | Ming (flash)
drawline | swfshape_drawline() | Ming (flash)
drawlineto | swfshape_drawlineto() | Ming (flash)
dtd | domxml_intdtd() | DOM XML
dumpmem | domxml_dumpmem() | DOM XML
fbsql | fbsql_db_query() | FrontBase
fputs | fwrite() | Base syntax
get_attribute | domxml_get_attribute() | DOM XML
getascent | swffont_getAscent() | Ming (flash)
getascent | swftext_getAscent() | Ming (flash)
getattr | domxml_get_attribute() | DOM XML
getdescent | swffont_getDescent() | Ming (flash)
getdescent | swftext_getDescent() | Ming (flash)
getheight | swfbitmap_getHeight() | Ming (flash)
getleading | swffont_getLeading() | Ming (flash)
getleading | swftext_getLeading() | Ming (flash)
getshape1 | swfmorph_getShape1() | Ming (flash)
getshape2 | swfmorph_getShape2() | Ming (flash)
getwidth | swfbitmap_getWidth() | Ming (flash)
getwidth | swffont_getWidth() | Ming (flash)
getwidth | swftext_getWidth() | Ming (flash)
gzputs | gzwrite() | Zlib
i18n_convert | mb_convert_encoding() | Multi-bytes Strings
i18n_discover_encoding | mb_detect_encoding() | Multi-bytes Strings
i18n_http_input | mb_http_input() | Multi-bytes Strings
i18n_http_output | mb_http_output() | Multi-bytes Strings
i18n_internal_encoding | mb_internal_encoding() | Multi-bytes Strings
i18n_ja_jp_hantozen | mb_convert_kana() | Multi-bytes Strings
i18n_mime_header_decode | mb_decode_mimeheader() | Multi-bytes Strings
i18n_mime_header_encode | mb_encode_mimeheader() | Multi-bytes Strings
imap_create | imap_createmailbox() | IMAP
imap_fetchtext | imap_body() | IMAP
imap_getmailboxes | imap_list_full() | IMAP
imap_getsubscribed | imap_lsub_full() | IMAP
imap_header | imap_headerinfo() | IMAP
imap_listmailbox | imap_list() | IMAP
imap_listsubscribed | imap_lsub() | IMAP
imap_rename | imap_renamemailbox() | IMAP
imap_scan | imap_listscan() | IMAP
imap_scanmailbox | imap_listscan() | IMAP
ini_alter | ini_set() | Base syntax
is_double | is_float() | Base syntax
is_integer | is_int() | Base syntax
is_long | is_int() | Base syntax
is_real | is_float() | Base syntax
is_writeable | is_writable() | Base syntax
join | implode() | Base syntax
labelframe | swfmovie_labelFrame() | Ming (flash)
labelframe | swfsprite_labelFrame() | Ming (flash)
last_child | domxml_last_child() | DOM XML
lastchild | domxml_last_child() | DOM XML
ldap_close | ldap_unbind() | LDAP
magic_quotes_runtime | set_magic_quotes_runtime() | Base syntax
mbstrcut | mb_strcut() | Multi-bytes Strings
mbstrlen | mb_strlen() | Multi-bytes Strings
mbstrpos | mb_strpos() | Multi-bytes Strings
mbstrrpos | mb_strrpos() | Multi-bytes Strings
mbsubstr | mb_substr() | Multi-bytes Strings
ming_setcubicthreshold | ming_setCubicThreshold() | Ming (flash)
ming_setscale | ming_setScale() | Ming (flash)
move | swfdisplayitem_move() | Ming (flash)
movepen | swfshape_movepen() | Ming (flash)
movepento | swfshape_movepento() | Ming (flash)
moveto | swfdisplayitem_moveTo() | Ming (flash)
moveto | swffill_moveTo() | Ming (flash)
moveto | swftext_moveTo() | Ming (flash)
msql | msql_db_query() | mSQL
msql_createdb | msql_create_db() | mSQL
msql_dbname | msql_result() | mSQL
msql_dropdb | msql_drop_db() | mSQL
msql_fieldflags | msql_field_flags() | mSQL
msql_fieldlen | msql_field_len() | mSQL
msql_fieldname | msql_field_name() | mSQL
msql_fieldtable | msql_field_table() | mSQL
msql_fieldtype | msql_field_type() | mSQL
msql_freeresult | msql_free_result() | mSQL
msql_listdbs | msql_list_dbs() | mSQL
msql_listfields | msql_list_fields() | mSQL
msql_listtables | msql_list_tables() | mSQL
msql_numfields | msql_num_fields() | mSQL
msql_numrows | msql_num_rows() | mSQL
msql_regcase | sql_regcase() | mSQL
msql_selectdb | msql_select_db() | mSQL
msql_tablename | msql_result() | mSQL
mssql_affected_rows | sybase_affected_rows() | Sybase
mssql_affected_rows | sybase_affected_rows() | Sybase
mssql_close | sybase_close() | Sybase
mssql_close | sybase_close() | Sybase
mssql_connect | sybase_connect() | Sybase
mssql_connect | sybase_connect() | Sybase
mssql_data_seek | sybase_data_seek() | Sybase
mssql_data_seek | sybase_data_seek() | Sybase
mssql_fetch_array | sybase_fetch_array() | Sybase
mssql_fetch_array | sybase_fetch_array() | Sybase
mssql_fetch_field | sybase_fetch_field() | Sybase
mssql_fetch_field | sybase_fetch_field() | Sybase
mssql_fetch_object | sybase_fetch_object() | Sybase
mssql_fetch_object | sybase_fetch_object() | Sybase
mssql_fetch_row | sybase_fetch_row() | Sybase
mssql_fetch_row | sybase_fetch_row() | Sybase
mssql_field_seek | sybase_field_seek() | Sybase
mssql_field_seek | sybase_field_seek() | Sybase
mssql_free_result | sybase_free_result() | Sybase
mssql_free_result | sybase_free_result() | Sybase
mssql_get_last_message | sybase_get_last_message() | Sybase
mssql_get_last_message | sybase_get_last_message() | Sybase
mssql_min_client_severity | sybase_min_client_severity() | Sybase
mssql_min_error_severity | sybase_min_error_severity() | Sybase
mssql_min_message_severity | sybase_min_message_severity() | Sybase
mssql_min_server_severity | sybase_min_server_severity() | Sybase
mssql_num_fields | sybase_num_fields() | Sybase
mssql_num_fields | sybase_num_fields() | Sybase
mssql_num_rows | sybase_num_rows() | Sybase
mssql_num_rows | sybase_num_rows() | Sybase
mssql_pconnect | sybase_pconnect() | Sybase
mssql_pconnect | sybase_pconnect() | Sybase
mssql_query | sybase_query() | Sybase
mssql_query | sybase_query() | Sybase
mssql_result | sybase_result() | Sybase
mssql_result | sybase_result() | Sybase
mssql_select_db | sybase_select_db() | Sybase
mssql_select_db | sybase_select_db() | Sybase
multcolor | swfdisplayitem_multColor() | Ming (flash)
mysql | mysql_db_query() | MySQL
mysql_createdb | mysql_create_db() | MySQL
mysql_db_name | mysql_result() | MySQL
mysql_dbname | mysql_result() | MySQL
mysql_dropdb | mysql_drop_db() | MySQL
mysql_fieldflags | mysql_field_flags() | MySQL
mysql_fieldlen | mysql_field_len() | MySQL
mysql_fieldname | mysql_field_name() | MySQL
mysql_fieldtable | mysql_field_table() | MySQL
mysql_fieldtype | mysql_field_type() | MySQL
mysql_freeresult | mysql_free_result() | MySQL
mysql_listdbs | mysql_list_dbs() | MySQL
mysql_listfields | mysql_list_fields() | MySQL
mysql_listtables | mysql_list_tables() | MySQL
mysql_numfields | mysql_num_fields() | MySQL
mysql_numrows | mysql_num_rows() | MySQL
mysql_selectdb | mysql_select_db() | MySQL
mysql_tablename | mysql_result() | MySQL
name | domxml_attrname() | DOM XML
new_child | domxml_new_child() | DOM XML
new_xmldoc | domxml_new_xmldoc() | DOM XML
nextframe | swfmovie_nextFrame() | Ming (flash)
nextframe | swfsprite_nextFrame() | Ming (flash)
node | domxml_node() | DOM XML
oci8append | ocicollappend() | OCI8
oci8assign | ocicollassign() | OCI8
oci8assignelem | ocicollassignelem() | OCI8
oci8close | ocicloselob() | OCI8
oci8free | ocifreecoll() | OCI8
oci8free | ocifreedesc() | OCI8
oci8getelem | ocicollgetelem() | OCI8
oci8load | ociloadlob() | OCI8
oci8max | ocicollmax() | OCI8
oci8ocifreecursor | ocifreestatement() | OCI8
oci8save | ocisavelob() | OCI8
oci8savefile | ocisavelobfile() | OCI8
oci8size | ocicollsize() | OCI8
oci8trim | ocicolltrim() | OCI8
oci8writetemporary | ociwritetemporarylob() | OCI8
oci8writetofile | ociwritelobtofile() | OCI8
odbc_do | odbc_exec() | OCI8
odbc_field_precision | odbc_field_len() | OCI8
output | swfmovie_output() | Ming (flash)
parent | domxml_parent() | DOM XML
pdf_add_outline | pdf_add_bookmark() | PDF
pg_clientencoding | pg_client_encoding() | PostgreSQL
pg_setclientencoding | pg_set_client_encoding() | PostgreSQL
pos | current() | Base syntax
recode | recode_string() | Recode
remove | swfmovie_remove() | Ming (flash)
remove | swfsprite_remove() | Ming (flash)
rewind | rewinddir() | Base syntax
root | domxml_root() | DOM XML
rotate | swfdisplayitem_rotate() | Ming (flash)
rotateto | swfdisplayitem_rotateTo() | Ming (flash)
rotateto | swffill_rotateTo() | Ming (flash)
save | swfmovie_save() | Ming (flash)
savetofile | swfmovie_saveToFile() | Ming (flash)
scale | swfdisplayitem_scale() | Ming (flash)
scaleto | swfdisplayitem_scaleTo() | Ming (flash)
scaleto | swffill_scaleTo() | Ming (flash)
set_attribute | domxml_set_attribute() | DOM XML
set_content | domxml_set_content() | DOM XML
setaction | swfbutton_setAction() | Ming (flash)
setattr | domxml_set_attribute() | DOM XML
setbackground | swfmovie_setBackground() | Ming (flash)
setbounds | swftextfield_setBounds() | Ming (flash)
setcolor | swftext_setColor() | Ming (flash)
setcolor | swftextfield_setColor() | Ming (flash)
setdepth | swfdisplayitem_setDepth() | Ming (flash)
setdimension | swfmovie_setDimension() | Ming (flash)
setdown | swfbutton_setDown() | Ming (flash)
setfont | swftext_setFont() | Ming (flash)
setfont | swftextfield_setFont() | Ming (flash)
setframes | swfmovie_setFrames() | Ming (flash)
setframes | swfsprite_setFrames() | Ming (flash)
setheight | swftext_setHeight() | Ming (flash)
setheight | swftextfield_setHeight() | Ming (flash)
sethit | swfbutton_setHit() | Ming (flash)
setindentation | swftextfield_setIndentation() | Ming (flash)
setleftfill | swfshape_setleftfill() | Ming (flash)
setleftmargin | swftextfield_setLeftMargin() | Ming (flash)
setline | swfshape_setline() | Ming (flash)
setlinespacing | swftextfield_setLineSpacing() | Ming (flash)
setmargins | swftextfield_setMargins() | Ming (flash)
setmatrix | swfdisplayitem_setMatrix() | Ming (flash)
setname | swfdisplayitem_setName() | Ming (flash)
setname | swftextfield_setName() | Ming (flash)
setover | swfbutton_setOver() | Ming (flash)
setrate | swfmovie_setRate() | Ming (flash)
setratio | swfdisplayitem_setRatio() | Ming (flash)
setrightfill | swfshape_setrightfill() | Ming (flash)
setrightmargin | swftextfield_setRightMargin() | Ming (flash)
setspacing | swftext_setSpacing() | Ming (flash)
setup | swfbutton_setUp() | Ming (flash)
show_source | highlight_file () | Base syntax
sizeof | count() | Base syntax
skewx | swfdisplayitem_skewX() | Ming (flash)
skewxto | swfdisplayitem_skewXTo() | Ming (flash)
skewxto | swffill_skewXTo() | Ming (flash)
skewy | swfdisplayitem_skewY() | Ming (flash)
skewyto | swfdisplayitem_skewYTo() | Ming (flash)
skewyto | swffill_skewYTo() | Ming (flash)
snmpwalkoid | snmprealwalk() | SNMP
strchr | strstr() | Base syntax
streammp3 | swfmovie_streamMp3() | Ming (flash)
swfaction | swfaction_init() | Ming (flash)
swfbitmap | swfbitmap_init() | Ming (flash)
swfbutton | swfbutton_init() | Ming (flash)
swffill | swffill_init() | Ming (flash)
swffont | swffont_init() | Ming (flash)
swfgradient | swfgradient_init() | Ming (flash)
swfmorph | swfmorph_init() | Ming (flash)
swfmovie | swfmovie_init() | Ming (flash)
swfshape | swfshape_init() | Ming (flash)
swfsprite | swfsprite_init() | Ming (flash)
swftext | swftext_init() | Ming (flash)
swftextfield | swftextfield_init() | Ming (flash)
unlink | domxml_unlink_node() | DOM XML
xptr_new_context | xpath_new_context() | DOM XML

上一頁 | 首頁 | 下一頁
Reporting Errors | 上一層 | 保留字列表


附錄

PHP 手冊
上一頁 下一頁

VII. 附錄

目錄
A. PHP 及其相關工程的歷史
B. 從 PHP 3 移植到 PHP 4
C. 從 PHP/FI 2 移植到 PHP 3
D. 排除 PHP 程序的錯誤
E. 擴展 PHP
F. 函式別名列表
G. 保留字列表
H. 資源型別列表
I. 支援的協議／封裝協議列表
J. 解析器代號列表
K. 關於本手冊
L. 補充說明
上一頁 | 首頁 | 下一頁
雜類問題 |  | PHP 及其相關工程的歷史


Calling User Functions

To call user functions from an internal function, you should use the call_user_function() function.

call_user_function() returns SUCCESS on success, and FAILURE in case the function cannot be found. You should check that return value! If it returns SUCCESS, you are responsible for destroying the retval pval yourself (or return it as the return value of your function). If it returns FAILURE, the value of retval is undefined, and you mustn't touch it.

All internal functions that call user functions must be reentrant. Among other things, this means they must not use globals or static variables.

call_user_function() takes six arguments:

HashTable *function_table

This is the hash table in which the function is to be looked up.

pval *object

This is a pointer to an object on which the function is invoked. This should be NULL if a global function is called. If it's not NULL (i.e. it points to an object), the function_table argument is ignored, and instead taken from the object's hash. The object *may* be modified by the function that is invoked on it (that function will have access to it via $this). If for some reason you don't want that to happen, send a copy of the object instead.

pval *function_name

The name of the function to call. Must be a pval of type IS_STRING with function_name.str.val and function_name.str.len set to the appropriate values. The function_name is modified by call_user_function() - it's converted to lowercase. If you need to preserve the case, send a copy of the function name instead.

pval *retval

A pointer to a pval structure, into which the return value of the invoked function is saved. The structure must be previously allocated - call_user_function() does NOT allocate it by itself.

int param_count

The number of parameters being passed to the function.

pval *params[]

An array of pointers to values that will be passed as arguments to the function, the first argument being in offset 0, the second in offset 1, etc. The array is an array of pointers to pval's; The pointers are sent as-is to the function, which means if the function modifies its arguments, the original values are changed (passing by reference). If you don't want that behavior, pass a copy instead.

上一頁 | 首頁 | 下一頁
擴展 PHP | 上一層 | Reporting Errors


COM

(no version information, might be only in CVS)

COM -- COM class

大綱

$obj = new COM("server.object")

Description

The COM class provides a framework to integrate (D)COM components into your php scripts.

Methods

string COM::COM ( string module_name [, string server_name [, int codepage]])

COM class constructor. Parameters:

module_name

name or class-id of the requested component.

server_name

name of the DCOM server from which the component should be fetched. If NULL, localhost is assumed. To allow DCOM com.allow_dcom has to be set to TRUE in php.ini.

codepage

specifies the codepage that is used to convert php-strings to unicode-strings and vice versa. Possible values are CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 and CP_UTF8.

例子 1. COM example (1)

// starting word
$word = new COM("word.application") or die("Unable to instanciate Word");
print "Loaded Word, version {$word->Version}\n";

//bring it to front
$word->Visible = 1;

//open an empty document
$word->Documents->Add();

//do some weird stuff
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//closing word
$word->Quit();

//free the object
$word->Release();
$word = null;

例子 2. COM example (2)

$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password");

$rs = $conn->Execute("SELECT * FROM sometable");    // Recordset

$num_columns = $rs->Fields->Count();
echo $num_columns . "\n";

for ($i=0; $i < $num_columns; $i++)
{
    $fld[$i] = $rs->Fields($i);
}

$rowcount = 0;
while (!$rs->EOF)
{
    for ($i=0; $i < $num_columns; $i++)
    {
        echo $fld[$i]->value . "\t";
    }
    echo "\n";
    $rowcount++;            // increments rowcount
    $rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs->Release();
$conn->Release();

$rs = null;
$conn = null;

上一頁 | 首頁 | 下一頁
COM support functions for Windows | 上一層 | VARIANT


dir

dir -- directory 類

說明

 class dir {

  dir(string directory);
  string path;
  resource handle;

  string read();
  void rewind();
  void close();
}

這是個仿冒面向對象的機制來讀取一個目錄。給定的 directory 被打開。一旦目錄被打開，有兩個屬性可用。handle 屬性可以用在其它目錄函式例如 readdir()，rewinddir() 和 closedir() 中。path 屬性被設為被打開的目錄路徑。有三個方法可用：read，rewind 和 close。

請留意下面例子中檢查 dir() 傳回值的風格。我們明確地測試傳回值是否全等於（值和型別都相同 － 更多訊息參見比較運算符）FALSE，否則任何目錄項的名稱求值為 FALSE 的都會導致循環停止。

例子 1. dir() 例子

$d = dir("/etc");
echo "Handle: ".$d->handle."<br>\n";
echo "Path: ".$d->path."<br>\n";
while (false !== ($entry = $d->read())) {
    echo $entry."<br>\n";
}
$d->close();

註: read 方法傳回的目錄項的順序依賴於系統。

註: 本函式定義了內部類 Directory，意味著不能再用同樣的名字定義用戶自己的類。PHP 預定義類的完整列表見預定義類一節。

上一頁 | 首頁 | 下一頁
chroot | 上一層 | closedir


VARIANT

(no version information, might be only in CVS)

VARIANT -- VARIANT class

大綱

$vVar = new VARIANT($var)

Description

A simple container to wrap variables into VARIANT structures.

Methods

string VARIANT::VARIANT ( [mixed value [, int type [, int codepage]]])

VARIANT class constructor. Parameters:

value

initial value. if omitted an VT_EMPTY object is created.

type

specifies the content type of the VARIANT object. Possible values are VT_UI1, VT_UI2, VT_UI4, VT_I1, VT_I2, VT_I4, VT_R4, VT_R8, VT_INT, VT_UINT, VT_BOOL, VT_ERROR, VT_CY, VT_DATE, VT_BSTR, VT_DECIMAL, VT_UNKNOWN, VT_DISPATCH and VT_VARIANT. These values are mutual exclusive, but they can be combined with VT_BYREF to specify being a value. If omitted, the type of value is used. Consult the msdn library for additional information.

codepage

specifies the codepage that is used to convert php-strings to unicode-strings and vice versa. Possible values are CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 and CP_UTF8.

上一頁 | 首頁 | 下一頁
COM | 上一層 | com_addref


How to change configuration settings

Running PHP as Apache module

When using PHP as an Apache module, you can also change the configuration settings using directives in Apache configuration files (e.g. httpd.conf) and .htaccess files (You will need "AllowOverride Options" or "AllowOverride All" privileges)

With PHP 3.0, there are Apache directives that correspond to each configuration setting in the php3.ini name, except the name is prefixed by "php3_".

With PHP 4.0, there are several Apache directives that allow you to change the PHP configuration from within the Apache configuration file itself.

php_value name value

This sets the value of the specified variable.

php_flag name on|off

This is used to set a Boolean configuration option.

php_admin_value name value

This sets the value of the specified variable. "Admin" configuration settings can only be set from within the main Apache configuration files, and not from .htaccess files.

php_admin_flag name on|off

This is used to set a Boolean configuration option.

例子 4-2. Apache configuration example

<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php3.c>
  php3_include_path ".:/usr/local/lib/php"
  php3_safe_mode on
</IfModule>

註: PHP constants do not exist outside of PHP. For example, in httpd.conf do not use PHP constants such as E_ALL or E_NOTICE to set the error_reporting directive as they will have no meaning and will evaluate to 0. Use the associated bitmask values instead. These constants can be used in php.ini

Other interfaces to PHP

Regardless of the interface to PHP you can change certain values at runtime of your scripts through ini_set(). The following table provides an overview at which level a directive can be set/changed.

表格 4-1. Definition of PHP_INI_* constants

Constant | Value | Meaning
PHP_INI_USER | 1 | Entry can be set in user scripts
PHP_INI_PERDIR | 2 | Entry can be set in .htaccess and VHost directives in httpd.conf.
PHP_INI_SYSTEM | 4 | Entry can be set in php.ini or httpd.conf (but not in VHost blocks in httpd.conf).
PHP_INI_ALL | 7 | Entry can be set anywhere

You can view the settings of the configuration values in the output of phpinfo(). You can also access the values of individual configuration settings using ini_get() or get_cfg_var().

上一頁 | 首頁 | 下一頁
Configuration | 上一層 | Configuration directives


Configuration directives

Httpd Options

表格 4-2. Httpd Options

Name | Default | Changeable
async_send | "0" | PHP_INI_ALL

Language Options

表格 4-3. Language and Misc Configuration Options

Name | Default | Changeable
short_open_tag | On | PHP_INI_SYSTEM|PHP_INI_PERDIR
asp_tags | Off | PHP_INI_SYSTEM|PHP_INI_PERDIR
precision | "14" | PHP_INI_ALL
y2k_compliance | Off | PHP_INI_ALL
allow_call_time_pass_reference | On | PHP_INI_SYSTEM|PHP_INI_PERDIR
expose_php | On | PHP_INI_SYSTEM

Here is a short explanation of the configuration directives.

short_open_tag boolean

Tells whether the short form (<? ?>) of PHP's open tag should be allowed. If you want to use PHP in combination with XML, you can disable this option in order to use <?xml ?> inline. Otherwise, you can print it with PHP, for example: <?php echo '<?xml version="1.0"'; ?>. Also if disabled, you must use the long form of the PHP open tag (<?php ?>).

註: This directive also affects the shorthand <?=, which is identical to <? echo. Use of this shortcut requires short_open_tag to be on.

asp_tags boolean

Enables the use of ASP-like <% %> tags in addition to the usual <?php ?> tags. This includes the variable-value printing shorthand of <%= $value %>. For more information, see Escaping from HTML.

註: Support for ASP-style tags was added in 3.0.4.

precision integer

The number of significant digits displayed in floating point numbers.

y2k_compliance boolean

Enforce year 2000 compliance (will cause problems with non-compliant browsers)

allow_call_time_pass_reference boolean

Whether to enable the ability to force arguments to be passed by reference at function call time. This method is deprecated and is likely to be unsupported in future versions of PHP/Zend. The encouraged method of specifying which arguments should be passed by reference is in the function declaration. You're encouraged to try and turn this option Off and make sure your scripts work properly with it in order to ensure they will work with future versions of the language (you will receive a warning each time you use this feature, and the argument will be passed by value instead of by reference).

See also References Explained.

expose_php boolean

Decides whether PHP may expose the fact that it is installed on the server (e.g. by adding its signature to the Web server header). It is no security threat in any way, but it makes it possible to determine whether you use PHP on your server or not.

Resource Limits

表格 4-4. Resource Limits

Name | Default | Changeable
memory_limit | "8M" | PHP_INI_ALL

Here is a short explanation of the configuration directives.

memory_limit integer

This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server.

See also: max_execution_time.

Data Handling

表格 4-5. Data Handling Configuration Options

Name | Default | Changeable
track-vars | "On" | PHP_INI_??
arg_separator.output | "&" | PHP_INI_ALL
arg_separator.input | "&" | PHP_INI_SYSTEM|PHP_INI_PERDIR
variables_order | "EGPCS" | PHP_INI_ALL
register_globals | "Off" | PHP_INI_PERDIR|PHP_INI_SYSTEM
register_argc_argv | "On" | PHP_INI_PERDIR|PHP_INI_SYSTEM
post_max_size | "8M" | PHP_INI_SYSTEM|PHP_INI_PERDIR
gpc_order | "GPC" | PHP_INI_ALL
auto_prepend_file | "" | PHP_INI_SYSTEM|PHP_INI_PERDIR
auto_append_file | "" | PHP_INI_SYSTEM|PHP_INI_PERDIR
default_mimetype | "text/html" | PHP_INI_ALL
default_charset | "iso-8859-1" | PHP_INI_ALL
always_populate_raw_post_data | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR
allow_webdav_methods | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR

Here is a short explanation of the configuration directives.

track_vars boolean

If enabled, then Environment, GET, POST, Cookie, and Server variables can be found in the global associative arrays $_ENV, $_GET, $_POST, $_COOKIE, and $_SERVER.

Note that as of PHP 4.0.3, track_vars is always turned on.

arg_separator.output string

The separator used in PHP generated URLs to separate arguments.

arg_separator.input string

List of separator(s) used by PHP to parse input URLs into variables.

註: Every character in this directive is considered as separator!

variables_order string

Set the order of the EGPCS (Environment, GET, POST, Cookie, Server) variable parsing. The default setting of this directive is "EGPCS". Setting this to "GP", for example, will cause PHP to completely ignore environment variables, cookies and server variables, and to overwrite any GET method variables with POST-method variables of the same name.

See also register_globals.

register_globals boolean

Tells whether or not to register the EGPCS (Environment, GET, POST, Cookie, Server) variables as global variables. For example; if register_globals = on, the url http://www.example.com/test.php?id=3 will produce $id. Or, $DOCUMENT_ROOT from $_SERVER['DOCUMENT_ROOT']. You may want to turn this off if you don't want to clutter your scripts' global scope with user data. As of PHP 4.2.0, this directive defaults to off. It's preferred to go through PHP Predefined Variables instead, such as the superglobals: $_ENV, $_GET, $_POST, $_COOKIE, and $_SERVER. Please read the security chapter on Using register_globals for related information.

Please note that register_globals cannot be set at runtime (ini_set()). Although, you can use .htaccess if your host allows it as described above. An example .htaccess entry: php_flag register_globals on.

註: register_globals is affected by the variables_order directive.

register_argc_argv boolean

Tells PHP whether to declare the argv & argc variables (that would contain the GET information).

See also command line. Also, this directive became available in PHP 4.0.0 and was always "on" before that.

post_max_size integer

Sets max size of post data allowed. This setting also affects file upload. To upload large files, this value must be larger than upload_max_filesize.

If memory limit is enabled by your configure script, memory_limit also affects file uploading. Generally speaking, memory_limit should be larger than post_max_size.

gpc_order string

Set the order of GET/POST/COOKIE variable parsing. The default setting of this directive is "GPC". Setting this to "GP", for example, will cause PHP to completely ignore cookies and to overwrite any GET method variables with POST-method variables of the same name.

註: This option is not available in PHP 4. Use variables_order instead.

auto_prepend_file string

Specifies the name of a file that is automatically parsed before the main file. The file is included as if it was called with the include() function, so include_path is used.

The special value none disables auto-prepending.

auto_append_file string

Specifies the name of a file that is automatically parsed after the main file. The file is included as if it was called with the include() function, so include_path is used.

The special value none disables auto-appending.

註: If the script is terminated with exit(), auto-append will not occur.

default_mimetype string

default_charset string

As of 4.0b4, PHP always outputs a character encoding by default in the Content-type: header. To disable sending of the charset, simply set it to be empty.

always_populate_raw_post_data boolean

Always populate the $HTTP_RAW_POST_DATA variable.

allow_webdav_methods boolean

Allow handling of WebDAV http requests within PHP scripts (eg. PROPFIND, PROPPATCH, MOVE, COPY, etc..) If you want to get the post data of those requests, you have to set always_populate_raw_post_data as well.

See also: magic_quotes_gpc, magic-quotes-runtime, and magic_quotes_sybase.

Paths and Directories

表格 4-6. Paths and Directories Configuration Options

Name | Default | Changeable
include_path | PHP_INCLUDE_PATH | PHP_INI_ALL
doc_root | PHP_INCLUDE_PATH | PHP_INI_SYSTEM
user_dir | NULL | PHP_INI_SYSTEM
extension_dir | PHP_EXTENSION_DIR | PHP_INI_SYSTEM
cgi.force_redirect | "1" | PHP_INI_SYSTEM
cgi.redirect_status_env | "" | PHP_INI_SYSTEM
fastcgi.impersonate | "0" | PHP_INI_SYSTEM

Here is a short explanation of the configuration directives.

include_path string

Specifies a list of directories where the require(), include() and fopen_with_path() functions look for files. The format is like the system's PATH environment variable: a list of directories separated with a colon in UNIX or semicolon in Windows.

例子 4-3. UNIX include_path

include_path=.:/home/httpd/php-lib

例子 4-4. Windows include_path

include_path=".;c:\www\phplib"
The default value for this directive is . (only the current directory).

doc_root string

PHP's "root directory" on the server. Only used if non-empty. If PHP is configured with safe mode, no files outside this directory are served. If PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root if you are running php as a CGI under any web server (other than IIS) The alternative is to use the cgi.force_redirect configuration below.

user_dir string

The base name of the directory used on a user's home directory for PHP files, for example public_html.

extension_dir string

In what directory PHP should look for dynamically loadable extensions. See also: enable_dl, and dl().

extension string

Which dynamically loadable extensions to load when PHP starts up.

cgi.force_redirect boolean

cgi.force_redirect is necessary to provide security running PHP as a CGI under most web servers. Left undefined, PHP turns this on by default. You can turn it off AT YOUR OWN RISK.

註: Windows Users: You CAN safely turn this off for IIS, in fact, you MUST. To get OmniHTTPD or Xitami to work you MUST turn it off.

cgi.cgi.redirect_status_env string

If cgi.force_redirect is turned on, and you are not running under Apache or Netscape (iPlanet) web servers, you MAY need to set an environment variable name that PHP will look for to know it is OK to continue execution.

註: Setting this variable MAY cause security issues, KNOW WHAT YOU ARE DOING FIRST.

fastcgi.impersonate string

FastCGI under IIS (on WINNT based OS) supports the ability to impersonate security tokens of the calling client. This allows IIS to define the security context that the request runs under. mod_fastcgi under Apache does not currently support this feature (03/17/2002) Set to 1 if running under IIS. Default is zero.

File Uploads

表格 4-7. File Uploads Configuration Options

Name | Default | Changeable
file_uploads | "1" | PHP_INI_SYSTEM
upload_tmp_dir | NULL | PHP_INI_SYSTEM
upload_max_filesize | "2M" | PHP_INI_SYSTEM|PHP_INI_PERDIR

Here is a short explanation of the configuration directives.

file_uploads boolean

Whether or not to allow HTTP file uploads. See also the upload_max_filesize, upload_tmp_dir, and post_max_size directives.

upload_tmp_dir string

The temporary directory used for storing files when doing file upload. Must be writable by whatever user PHP is running as. If not specified PHP will use the system's default.

upload_max_filesize integer

The maximum size of an uploaded file.

General SQL

表格 4-8. General SQL Configuration Options

Name | Default | Changeable
sql.safe_mode | "0" | PHP_INI_SYSTEM

Here is a short explanation of the configuration directives.

sql.safe_mode boolean

Debugger Configuration Directives

debugger.host string

DNS name or IP address of host used by the debugger.

debugger.port string

Port number used by the debugger.

debugger.enabled boolean

Whether the debugger is enabled.

上一頁 | 首頁 | 下一頁
How to change configuration settings | 上一層 | Security


流程控制的替代語法

PHP 提供了一些流程控制的替代語法，包括 if，while，for，foreach 和 switch。替代語法的基本形式是把左大括號（{）換成冒號（:），把右大括號（}）分別換成 endif;，endwhile;，endfor;，endforeach; 以及 endswitch;。

<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

在上面的例子中，HTML 內容“A is equal to 5”用替代語法嵌套在 if 語句中。該 HTML 的內容僅在 $a 等與 5 時顯示。

替代語法同樣可以用在 else 和 elseif 中。下面是一個包括 elseif 和 else 的 if 結構用替代語法格式寫的例子：

if ($a == 5):
    print "a equals 5";
    print "...";
elseif ($a == 6):
    print "a equals 6";
    print "!!!";
else:
    print "a is neither 5 nor 6";
endif;

更多例子參見 while，for 和 if。

上一頁 | 首頁 | 下一頁
elseif | 上一層 | while


break

break 結束當前 for，foreach，while，do..while 或者 switch 結構的執行。

break 可以接受一個可選的數字參數來決定跳出幾重循環。

$arr = array ('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each ($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br>\n";
}

/* Using the optional argument. */

$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br>\n";
        break 1;  /* Exit only the switch. */
    case 10:
        echo "At 10; quitting<br>\n";
        break 2;  /* Exit the switch and the while. */
    default:
        break;
    }
}

上一頁 | 首頁 | 下一頁
foreach | 上一層 | continue


continue

continue 在循環結構用用來跳過本次循環中剩餘的代碼並開始執行下一次循環。

continue 接受一個可選的數字參數來決定跳過幾重循環到循環結尾。

while (list ($key, $value) = each ($arr)) {
    if (!($key % 2)) { // skip odd members
        continue;
    }
    do_something_odd ($value);
}

$i = 0;
while ($i++ < 5) {
    echo "Outer<br>\n";
    while (1) {
        echo "&nbsp;&nbsp;Middle<br>\n";
        while (1) {
            echo "&nbsp;&nbsp;Inner<br>\n";
            continue 3;
        }
        echo "This never gets output.<br>\n";
    }
    echo "Neither does this.<br>\n";
}

上一頁 | 首頁 | 下一頁
break | 上一層 | switch


declare

The declare 結構用來設定一段代碼的執行指令。declare 的語法和其它流程控制結構相似：

declare (directive) statement

directive 部分允許設定 declare 代碼段的行為。目前只認識一個指令：ticks（更多訊息見下面 ticks 指令）。

declare 代碼段中的 statement 部分將被執行 － 怎樣執行以及執行中有什麼副作用出現取決於 directive 中設定的指令。

Ticks

Tick 是一個在 declare 代碼段中解釋器每執行 N 條低級語句就會發生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來指定的。

在每個 tick 中出現的事件是由 register_tick_function() 來指定的。更多細節見下面的例子。注意每個 tick 中可以出現多個事件。

例子 12-1. 評估一段 PHP 代碼的執行時間

<?php
// A function that records the time when it is called
function profile ($dump = FALSE)
{
    static $profile;

    // Return the times stored in profile, then erase it
    if ($dump) {
        $temp = $profile;
        unset ($profile);
        return ($temp);
    }

    $profile[] = microtime ();
}

// Set up a tick handler
register_tick_function("profile");

// Initialize the function before the declare block
profile ();

// Run a block of code, throw a tick every 2nd statement
declare (ticks=2) {
    for ($x = 1; $x < 50; ++$x) {
        echo similar_text (md5($x), md5($x*$x)), "<br />;";
    }
}

// Display the data stored in the profiler
print_r (profile (TRUE));
?>
這個例子評估“declare”中的 PHP 代碼，每執行兩條低級語句就記錄下時間。此訊息可以用來找到一段特定代碼中速度慢的部分。這個過程也可以用其它方法完成，但用 tick 更方便也更容易實現。

Ticks 很適合用來做調試，以及實現簡單的多任務，後台 I/O 和很多其它任務。

參見 register_tick_function() 和 unregister_tick_function()。

上一頁 | 首頁 | 下一頁
switch | 上一層 | return


do..while

do..while 和 while 循環非常相似，區別在於表達式的值是在每次循環結束時檢查而不是開始時。和正規的 while 循環主要的區別是 do..while 的循環語句保証會執行一次（表達式的真值在每次循環結束後檢查），然而在正規的 while 循環中就不一定了（表達式真值在循環開始時檢查，如果一開始就為 FALSE 則整個循環立即終止）。

do..while 循環只有一種語法：

$i = 0;
do {
   print $i;
} while ($i>0);

以上循環將正好執行一次，因為經過第一次循環後，當檢查表達式的真值時，其值為 FALSE（$i 不大於 0）而導致循環終止。

資深的 C 語言用戶可能熟悉另一種不同的 do..while 循環用法，把語句放在 do..while(0) 之中，在循環內部用 break 語句來結束執行循環。以下代碼片段示範了此方法：

do {
    if ($i < 5) {
        print "i is not big enough";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
    print "i is ok";

     ...process i...

} while(0);

如果你還不能立刻理解也不用擔心。即使不用此“特性”你也照樣可以寫出強大的代碼來。

上一頁 | 首頁 | 下一頁
while | 上一層 | for


else

經常需要在滿足某個條件時執行一條語句，而在不滿足該條件時執行其它語句，這正是 else 的功能。else 延伸了 if 語句，可以在 if 語句中的表達式的值為 FALSE 時執行語句。例如以下代碼在 $a 大於 $b 時顯示 a is bigger than b，反之則顯示 a is NOT bigger than b：

if ($a > $b) {
    print "a is bigger than b";
} else {
    print "a is NOT bigger than b";
}

else 語句僅在 if 以及 elseif（如果有的話）語句中的表達式的值為 FALSE 時執行（參見 elseif）。

上一頁 | 首頁 | 下一頁
流程控制 | 上一層 | elseif


elseif

elseif，和此名稱暗示的一樣，是 if 和 else 的組合。和 else 一樣，它延伸了 if 語句，可以在原來的 if 表達式值為 FALSE 時執行不同語句。但是和 else 不一樣的是，它僅在 elseif 的條件表達式值為 TRUE 時執行語句。例如以下代碼將根據條件分別顯示 a is bigger than b，a equal to b 或者 a is smaller than b：

if ($a > $b) {
    print "a is bigger than b";
} elseif ($a == $b) {
    print "a is equal to b";
} else {
    print "a is smaller than b";
}

在同一個 if 結構中可以有多個 elseif 語句。第一個表達式值為 TRUE 的 elseif 語句（如果有的話）將會執行。在 PHP 中，也可以寫成“else if”（兩個單詞），它和“elseif”（一個單詞）的行為完全一樣。句法分析的含義有少許區別（如果你熟悉 C 語言的話，這是同樣的行為），但是底線是兩者會產生完全一樣的行為。

elseif 的語句僅在之前的 if 或 elseif 的表達式值為 FALSE，而當前的 elseif 表達式值為 TRUE 時執行。

上一頁 | 首頁 | 下一頁
else | 上一層 | 流程控制的替代語法


for

for 循環是 PHP 中最複雜的循環結構。它的行為和 C 語言的相似。 for 循環的語法是：

for (expr1; expr2; expr3) statement

第一個表達式（expr1）在循環開始前無條件求值一次。

expr2 在每次循環開始前求值。如果值為 TRUE，則繼續循環，執行嵌套的循環語句。如果值為 FALSE，則終止循環。

expr3 在每次循環之後被求值（執行）。

每個表達式都可以為空。expr2 為空意味著將無限循環下去（和 C 一樣，PHP 認為其值為 TRUE）。這可能不想你想象中那樣沒有用，因為你經常會希望用 break 語句來結束循環而不是用 for 的表達式真值判斷。

考慮以下的例子。它們都顯示數字 1 到 10：

/* example 1 */

for ($i = 1; $i <= 10; $i++) {
    print $i;
}

/* example 2 */

for ($i = 1;;$i++) {
    if ($i > 10) {
        break;
    }
    print $i;
}

/* example 3 */

$i = 1;
for (;;) {
    if ($i > 10) {
        break;
    }
    print $i;
    $i++;
}

/* example 4 */

for ($i = 1; $i <= 10; print $i, $i++);

當然，第一個例子看上去最正常（或者第四個），但你可能會發現在 for 循環中用空的表達式在很多場合下會很方便。

PHP 也支援用冒號的 for 循環的替代語法。

for (expr1; expr2; expr3): statement; ...; endfor;

其它語言具有 foreach 語句來遍歷陣列或散列表，PHP 也行（見 foreach）。在 PHP 3 中，可以結合 list() 和 each() 函式用 while 循環來達到同樣效果。例子見這些函式的文檔。

上一頁 | 首頁 | 下一頁
do..while | 上一層 | foreach


foreach

PHP 4（不是 PHP 3）包括了 foreach 結構，和 Perl 以及其他語言很像。這只是一種遍歷陣列簡便方法。foreach 僅能用於陣列，當試圖將其用於其它資料型別或者一個未初始化的變數時會產生錯誤。有兩種語法，第二種比較次要但卻是第一種的有用的擴展。

foreach(array_expression as $value) statement
foreach(array_expression as $key => $value) statement

第一種格式遍歷給定的 array_expression 陣列。每次循環中，當前單元的值被賦給 $value 並且陣列內部的指針向前移一步（因此下一次循環中將會得到下一個單元）。

第二種格式做同樣的事，只除了當前單元的鍵值也會在每次循環中被賦給變數 $key。

註: 當 foreach 開始執行時，陣列內部的指針會自動指向第一個單元。這意味著不需要在 foreach 循環之前呼叫 reset()。

註: 此外注意 foreach 所操作的是指定陣列的一個拷貝，而不是該陣列本身。因此即使有 each() 的建構，原陣列指針也沒有變，陣列單元的值也不受影響。

註: foreach 不支援用“@”來禁止錯誤訊息的能力。

你可能注意到了以下的代碼功能完全相同：

reset ($arr);
while (list(, $value) = each ($arr)) {
    echo "Value: $value<br>\n";
}

foreach ($arr as $value) {
    echo "Value: $value<br>\n";
}

以下代碼功能也完全相同：

reset ($arr);
while (list($key, $value) = each ($arr)) {
    echo "Key: $key; Value: $value<br>\n";
}

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br>\n";
}

示範用法的更多例子：

/* foreach example 1: value only */

$a = array (1, 2, 3, 17);

foreach ($a as $v) {
   print "Current value of \$a: $v.\n";
}

/* foreach example 2: value (with key printed for illustration) */

$a = array (1, 2, 3, 17);

$i = 0; /* for illustrative purposes only */

foreach($a as $v) {
    print "\$a[$i] => $v.\n";
    $i++;
}

/* foreach example 3: key and value */

$a = array (
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "seventeen" => 17
);

foreach($a as $k => $v) {
    print "\$a[$k] => $v.\n";
}

/* foreach example 4: multi-dimensional arrays */

$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach($a as $v1) {
    foreach ($v1 as $v2) {
        print "$v2\n";
    }
}

/* foreach example 5: dynamic arrays */

foreach(array(1, 2, 3, 4, 5) as $v) {
    print "$v\n";
}

上一頁 | 首頁 | 下一頁
for | 上一層 | break


switch

switch 語句和具有同樣表達式的一系列的 IF 語句相似。很多場合下需要把同一個變數（或表達式）與很多不同的值比較，並根據它等於哪個值來執行不同的代碼。這正是 switch 語句的用途。

下面兩個例子使用兩種不同方法實現同樣的事，一個用一系列 if 語句，另一個用 switch 語句：

if ($i == 0) {
    print "i equals 0";
}
if ($i == 1) {
    print "i equals 1";
}
if ($i == 2) {
    print "i equals 2";
}

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
}

為避免錯誤，理解 switch 是怎樣執行的非常重要。switch 語句一行接一行地執行（實際上是語句接語句）。開始時沒有代碼被執行。僅當一個 case 語句中的值和 switch 表達式的值匹配時 PHP 才開始執行語句，直到 switch 的程序段結束或者遇到第一個 break 語句為止。如果不在 case 的語句段最後寫上 break 的話，PHP 將繼續執行下一個 case 中的語句段。例如：

switch ($i) {
    case 0:
        print "i equals 0";
    case 1:
        print "i equals 1";
    case 2:
        print "i equals 2";
}

這裡如果 $i 等於 0，PHP 將執行所有的 print 語句！如果 $i 等於 1，PHP 將執行後面兩條 print 語句。只有當 $i 等於 2 時，你才得到“預期”的結果 － 只顯示“i equals 2”。所以，別忘了 break 語句就很重要（即使在某些情況下你故意想避免提供它們時）。

在 switch 語句中條件只求值一次並用來和每個 case 語句比較。在 elseif 語句中條件會再次求值。如果條件比一個簡單的比較要複雜得多或者在一個很多次的循環中，那麼用 switch 語句可能會快一些。

在一個 case 中的語句也可以為空，這樣只不過將控制轉移到了下一個 case 中的語句。

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i is less than 3 but not negative";
        break;
    case 3:
        print "i is 3";
}

一個 case 的特例是 default。它匹配了任何和其它 case 都不匹配的情況，並且應該是最後一條 case 語句。例如：

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
}

case 表達式可以是任何求值為簡單型別的表達式，即整型或浮點數以及字串。不能用陣列或對象，除非它們被解除了到簡單型別的引用。

switch 支援替代語法的流程控制。更多訊息見流程控制的替代語法一節。

switch ($i):
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
endswitch;

上一頁 | 首頁 | 下一頁
continue | 上一層 | declare


while

while 循環是 PHP 中最簡單的循環型別。它和 C 語言中的 while 表現得一樣。while 語句的基本格式是：

while (expr) statement

while 語句的含意很簡單，它告訴 PHP 只要while 表達式的值為 TRUE 就重複執行嵌套中的循環語句。表達式的值在每次開始循環時檢查，所以即使這個值在循環語句中改變了，語句也不會停止執行，直到本次循環結束。有時候如果 while 表達式的值一開始就是 FALSE，則循環語句一次都不會執行。

和 if 語句一樣，可以在 while 循環中用大括號括起一個語句組，或者用替代語法：

while (expr): statement ... endwhile;

下面兩個例子完全一樣，都顯示數字 1 到 10：

/* example 1 */

$i = 1;
while ($i <= 10) {
    print $i++;  /* the printed value would be
                    $i before the increment
                    (post-increment) */
}

/* example 2 */

$i = 1;
while ($i <= 10):
    print $i;
    $i++;
endwhile;

上一頁 | 首頁 | 下一頁
流程控制的替代語法 | 上一層 | do..while


PHP 手冊

版權訊息

© Copyright 1997, 1998, 1999, 2000, 2001, 2002 本手冊版權歸 PHP Documentation Group 所有。本手冊首頁上列出了 PHP 文檔小組的成員列表。

該手冊如同由自由軟件基金會發布一樣，在 GNU 的常規公共許可協議之下同樣可以重新發布。包括許可協議的第二版，以及任何的後續版本。

本手冊▽lxtending PHP 4.0”有關章節的版權歸 © 2000 Zend Technologies, Ltd 所有。發布本資料須遵守開放出版物許可協議 1.0 或者更新的版本中所宣布的條款（在 http://www.opencontent.org/openpub/ 可獲得最新的版本）。

首頁


排除 PHP 程序的錯誤

PHP 手冊
上一頁 下一頁

附錄 D. 排除 PHP 程序的錯誤

目錄
關於除錯器(debugger)
使用除錯器
除錯器協議

關於除錯器(debugger)

PHP 3 內建網路除錯器支援

PHP 4 並沒有內部除錯工具。但是您可以使用外部除錯工具。Zend IDE 就是其中之一，它包含一個除錯器。也有一些免費的除錯器，比如在 http://dd.cron.ru/dbg/ 上的 DBG，還有 Advanced PHP Debugger (APD)。

上一頁 | 首頁 | 下一頁
其它不相容 | 上一層 | 使用除錯器


除錯器協議

PHP 3 除錯器協議以行為單位。每一行有一個型別(type)，某幾行組成一個消息(message)。每一個消息起始於包含型別 start 的一行，並終止於包含型別 end 的一行。PHP 3 可以同時發送不同的消息行。

行的格式如下：

date time
host(pid)
type:
message-data

date

date 使用 ISO 8601 格式： (yyyy-mm-dd)

time

Time 精確到毫秒： hh:mm:uuuuuu

host

產生錯誤的 PHP 腳本所在主機的 DNS 名或 IP 位址。

pid

產生錯誤的 PHP 腳本在 host 中的PID （進程 id）。

type

行的型別。它告訴接收訊息的程序如何處理下面的資料：

表格 D-1. 除錯器行型別

名稱 | 含義
start | 告訴接收的程序，除錯訊息由此開始。data 的內容將會是錯誤消息的型別，在本頁面下方列出。
message | PHP 3 錯誤消息。
location | 發生錯誤的文件名和行號。location 的第一行總是包含頂級(top-level)位址。data 包含 file:line。在 message 和每一個 function 之後總有一行 location 行。
frames | Number of frames in the following stack dump. If there are four frames, expect information about four levels of called functions. If no "frames" line is given, the depth should be assumed to be 0 (the error occurred at top-level).(TODO)
function | 發生錯誤的函式。在呼叫函式堆棧的每級只重複一次。
end | 告訴接收的程序，除錯訊息到此結束。

data

每行的資料。

表格 D-2. 除錯器錯誤型別

除錯器 | PHP 3 內部
warning | E_WARNING
error | E_ERROR
parse | E_PARSE
notice | E_NOTICE
core-error | E_CORE_ERROR
core-warning | E_CORE_WARNING
unknown | （其它任何錯誤）

例子 D-1. 除錯器錯誤消息示例

1998-04-05 23:27:400966 lucifer.guardian.no(20481) start: notice
1998-04-05 23:27:400966 lucifer.guardian.no(20481) message: Uninitialized variable
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: (NULL):7
1998-04-05 23:27:400966 lucifer.guardian.no(20481) frames: 1
1998-04-05 23:27:400966 lucifer.guardian.no(20481) function: display
1998-04-05 23:27:400966 lucifer.guardian.no(20481) location: /home/ssb/public_html/test.php3:10
1998-04-05 23:27:400966 lucifer.guardian.no(20481) end: notice

上一頁 | 首頁 | 下一頁
使用除錯器 | 上一層 | 擴展 PHP


使用除錯器

PHP 3 中的內建除錯器對跟蹤一些邏輯 Bug (evasive bugs) 是非常有用的。除錯器在 PHP 3 每次啟動時連接到一個 TCP 端口。從 Web 請求中產生的所有錯誤訊息都將發送到該 TCP 連接。這些訊息可以被可執行在 IDE 或者可編程編輯器（例如 Emacs）中的除錯伺服器處理。

如何設置除錯器：

  1. 在配置文件中為除錯器設置一個 TCP 端口（設定 debugger.port 參數）並且啟用它（設定 debugger.enabled 參數）。

  2. 在某處設置該 TCP 端口的監聽器(listener)（例如：在 UNIX 上使用 socket -l -s 1400 命令）。

  3. 在你的代碼中，執行“debugger_on(host)”，host 指執行 TCP 監聽器的主機名或 IP 位址。

現在，所有的錯誤、警告、注意等的 debug 訊息都會顯示在那個監聽器中。即使你使用 error_reporting() 關閉它們，它們也會在監聽器中顯示。

上一頁 | 首頁 | 下一頁
排除 PHP 程序的錯誤 | 上一層 | 除錯器協議


FAQ: 常見問題

PHP 手冊
上一頁 下一頁

VI. FAQ: 常見問題

目錄
44. 一般訊息
45. 郵件列表
46. 獲取 PHP
47. 資料庫問題
48. 安裝
49. 編譯問題
50. 使用 PHP
51. PHP 和 HTML
52. PHP 和 COM
53. PHP 和其它語言
54. 從 PHP/FI 2 移植到 PHP 3
55. 從 PHP 3 移植到 PHP 4
56. 雜類問題
上一頁 | 首頁 | 下一頁
Stream open options |  | 一般訊息


編譯問題

PHP 手冊
上一頁 下一頁

章 49. 編譯問題

本節匯集了大多數編譯時出現的常見錯誤。

1. 我用匿名 CVS 得到了最新版的 PHP，但是裡面沒有 configure 腳本！
2. 我在配置 PHP 和 Apache 一起工作時遇到了問題。說沒找到 httpd.h，但這個文件明明就在那裡！
3. 當我試圖啟動 Apache 時，我得到如下錯誤訊息：
4. 當我執行 configure 時，報告說找不到頭文件或 GD 庫或 gdbm，或其它的什麼包！
5. 當編譯 language-parser.tab.c 文件時，報錯說 yytname undeclared。
6. 當我執行 make 時，看上去一切正常，可當連接最後的程序時報告說找不到某些文件而失敗了。
7. 當連接 PHP 時，報告說有一些未定義的引用。
8. 我不知道怎樣把 PHP 和 Apache 1.3 一起編譯。
9. 我按照所有的步驟在 UNIX 下安裝了PHP 的 Apache 模塊版本，但我的 PHP 腳本被顯示在瀏覽器中或者提示保存此文件。
10. 說要用：--activate-module=src/modules/php4/libphp4.a，但是此文件根本不存在，於是我改成了 --activate-module=src/modules/php4/libmodphp4.a，結果不行。怎麼回事？
11. 當我用 --activate-module=src/modules/php4/libphp4.a 試著把 PHP 編譯成 Apache 的靜態模塊時，報告說我的編譯器不服從 ANSI 標準。
12. 當我用 --with-apxs 編譯 PHP 時得到奇怪的錯誤訊息。
13. 在 make 的過程中，在 microtime 中出錯，還有很多 RUSAGE_ 之類的東西。
14. 我想升級我的 PHP。上哪裡找到我用來配置目前的 PHP 的 ./configure 的參數呢？
15. 和 GD 庫一起編譯 PHP 時，要麼給出一個奇怪的編譯錯誤，要麼在執行時出現 segfaults。

1. 我用匿名 CVS 得到了最新版的 PHP，但是裡面沒有 configure 腳本！

你必須安裝有 GNU 的 autoconf 包，這樣才可以從 configure.in 產生 configure 腳本。從 CVS 得到源程序後只要在最高層的目錄中執行 ./buildconf 即可。（同樣，除非你用了 --enable-maintainer-mode 選項來執行 configure，否則即使 configure.in 文件更新了，configure 腳本也不會自動重新產生。所以當你發現 configure.in 文件更新了時要確保手工重新產生 configure 腳本。有一個症狀是在 configure 之後或者執行 config.status 時在 Makefile 中尋找類似 @VARIABLE@ 的東西。）

2. 我在配置 PHP 和 Apache 一起工作時遇到了問題。說沒找到 httpd.h，但這個文件明明就在那裡！

你需要告訴 configure/setup 腳本你的 Apache 源程序最上層的目錄位置。這意味著你需要這樣指定 --with-apache=/path/to/apache 而不是這樣 --with-apache=/path/to/apache/src。

3. 當我試圖啟動 Apache 時，我得到如下錯誤訊息：

fatal: relocation error: file /path/to/libphp4.so:
       symbol ap_block_alarms: referenced symbol not found

該錯誤通常在 Apache 的核心程序被編譯為共享用途的 DSO 庫時發生。請嘗試重新配置 Apache，確保至少使用了如下參數：

--enable-shared=max --enable-rule=SHARED_CORE

如果您需要更多訊息，請閱讀 Apache 的頂級 INSTALL 文件或者 Apache 的 DSO 手冊。

4. 當我執行 configure 時，報告說找不到頭文件或 GD 庫或 gdbm，或其它的什麼包！

你可以通過指定附加的選項讓 configure 腳本在非標準的路徑中尋找頭文件和庫並傳遞給 C 預處理器和連接器，例如：
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
如果你用 csh 的變種作為你的登陸 shell（為什麼？），那就是：
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

5. 當編譯 language-parser.tab.c 文件時，報錯說 yytname undeclared。

你需要更新 Bison 的版本。最新版本在 ftp://ftp.gnu.org/pub/gnu/bison/。

6. 當我執行 make 時，看上去一切正常，可當連接最後的程序時報告說找不到某些文件而失敗了。

一些舊版本的 make 沒有正確將 functions 目錄下編譯後的文件放到同一個目錄下。試試執行 cp *.o functions 然後再執行 make 看看有沒有什麼幫助。如果成功了，那你確實需要更新到最新版的 GNU make。

7. 當連接 PHP 時，報告說有一些未定義的引用。

看看連接的這一行命令，確認所有適當的庫都包括在最後了。你通常可能漏掉了“ldl”和你包括的任何資料庫支援所需要的庫。

如果你和 Apache 1.2.x 一起連接，記得把適當的訊息增加到配置文件的 EXTRA_LIBS 這一行並重新執行 Apache 的配置腳本了嗎？更多訊息參見發行包中的 INSTALL 文件。

一些人也報告說在和 Apache 連接時他們不得不在 libphp4.a 之後立即加上“ldl”。

8. 我不知道怎樣把 PHP 和 Apache 1.3 一起編譯。

這其實很簡單。小心地照著以下步驟來：

  • 從 http://www.apache.org/dist/ 下載最新版的 Apache 1.3。

  • 解壓縮到某處，例如 /usr/local/src/apache-1.3。

  • 編譯 PHP，先執行 ./configure --with-apache=/<path>/apache-1.3（用你 apache-1.3 所在的真實路徑替換掉 <path>。）

  • 輸入 make 接著是 make install 來編譯 PHP 並把必要的文件拷貝到 Apache 的源程序目錄樹中。

  • 改變當前目錄到 /<path>/apache-1.3/src 目錄並編輯 Configuration 文件。增加這一行：AddModule modules/php4/libphp4.a。

  • 輸入 ./Configure 接著是 make。

  • 你現在應該有一個包括 PHP 支援的 httpd 可執行程序了！

注意：你也可以用新的 Apache ./configure 腳本。參見 Apache 發行包中 README.configure 文件中的說明。也看看 PHP 發行包中的 INSTALL 文件。

9. 我按照所有的步驟在 UNIX 下安裝了PHP 的 Apache 模塊版本，但我的 PHP 腳本被顯示在瀏覽器中或者提示保存此文件。

這說明 PHP 模塊出於某些原因沒有被呼叫。在尋求更多幫助前先檢查三件事：

  • 確認你執行的 httpd 程序就是你剛剛編譯的新 httpd 程序。執行： /path/to/binary/httpd -l

    如果你沒看到 mod_php4.c 被列出來那你就沒有執行對程序。找到並正確安裝程序。

  • 確認你在 Apache .conf 文件中加入了正確的 Mime 型別。應該是： AddType application/x-httpd-php3 .php3（PHP 3）

    或者 AddType application/x-httpd-php .php（PHP 4）

    也確認 AddType 這一行沒有隱藏在 <Virtualhost> 或者 <Directory> 塊中，這可能會造成你的測試腳本所在位置沒有被應用到此設置。

  • 最後，Apache 1.2 和 Apache 1.3 之間預定配置文件的位置改變了。你要確認你增加 AddType 行的文件就是實際上用的。你可以在你的 httpd.conf 中增加一個明顯的語法錯誤或者其它明顯修改，這可以告訴你是否讀取了正確的文件。

10. 說要用：--activate-module=src/modules/php4/libphp4.a，但是此文件根本不存在，於是我改成了 --activate-module=src/modules/php4/libmodphp4.a，結果不行。怎麼回事？

注意 libphp4.a 文件本來就不該存在，apache 進程將創建它！

11. 當我用 --activate-module=src/modules/php4/libphp4.a 試著把 PHP 編譯成 Apache 的靜態模塊時，報告說我的編譯器不服從 ANSI 標準。

這是一個 Apache 誤報的錯誤訊息，在更新的版本中已經修正了。

12. 當我用 --with-apxs 編譯 PHP 時得到奇怪的錯誤訊息。

這裡要檢查三件事。首先，出於某些原因當 Apache 產生 apxs Perl 腳本時，有時沒有正確的編譯和標記變數就結束了。找到你的 apxs 腳本（用命令 which apxs），有時會在 /usr/local/apache/bin/apxs 或者 /usr/sbin/apxs。打開並檢查類似如下的行：
my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
如果你看到這幾行，那問題就在這裡。它們可能包含了僅僅空格或者其它不正確的值，例如“q()”。改成這樣：
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl
第二個可能的問題僅可能在在 Red Hat 6.1 和 6.2 中發生。Red Hat 發行的 apxs 腳本壞了。查找這一行：
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
如果你看到上面這一行，改成這樣：
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
最後，如果你重新配置或者重裝了 Apache，在 ./configure 之後和 make 之前增加一個 make clean 命令。

13. 在 make 的過程中，在 microtime 中出錯，還有很多 RUSAGE_ 之類的東西。

如果 make 時遇到類似這樣的問題：
microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1

你的系統壞了。你需要安裝一個符合你的 glibc 的 glibc-devel 包來修複 /usr/include 中的文件。這和 PHP 絕對沒有任何關係。要証實這一點，試試這個簡單的測試：
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
如果出現錯誤，那你就知道頭文件壞了。

14. 我想升級我的 PHP。上哪裡找到我用來配置目前的 PHP 的 ./configure 的參數呢？

要麼在你當前的 PHP 的安裝目錄查看 config.nice 文件，如果沒有，只要執行此腳本：
<?php phpinfo(); ?>
在輸出的頂端顯示了用來配置此 PHP 的 ./configure 參數。

15. 和 GD 庫一起編譯 PHP 時，要麼給出一個奇怪的編譯錯誤，要麼在執行時出現 segfaults。

確保你的 GD 庫和 PHP 在連接時使用了用同樣的支援庫（例如 libpng）。

上一頁 | 首頁 | 下一頁
安裝 | 上一層 | 使用 PHP


PHP 和 COM

PHP 手冊
上一頁 下一頁

章 52. PHP 和 COM

PHP 可以在 Win32 平台中連接 COM 和 DCOM 對象。

1. 我建立了一個 DLL 來做某種計算。有辦法在 PHP 中執行這個 DLL 嗎？
2. “Unsupported variant type: xxxx (0xxxxx)”是什麼意思？
3. 在 PHP 中有可能操縱可視對象嗎？
4. 可以將一個 COM 對象保存在 session 中嗎？
5. 怎樣可以捕獲 COM 的錯誤？
6. 我能像在 Perl 中一樣從 PHP 腳本產生 DLL 文件嗎？
7. “Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”是什麼意思？
8. 怎樣從遠端伺服器執行 COM 對象？
9. 我得到一個“DCOM is disabled in C:\path...\scriptname.php on line 6”訊息，應該怎麼辦？
10. 有可能在 PHP 頁面中加載／操縱 ActiveX 對象嗎？
11. 有可能得到一個組件在執行中的實例嗎？
12. 有辦法處理 COM 對象中發送的事件嗎？
13. 我在嘗試呼叫一個打開了多於一個接口的 COM 對象中的方法時碰到問題，應該怎麼辦？
14. 這麼說 PHP 可以和 COM 一起工作，那麼 COM+ 呢？
15. 如果 PHP 可以操縱 COM 對象，那麼可以設想結合 PHP 用 MTS 來管理組件資源嗎？

1. 我建立了一個 DLL 來做某種計算。有辦法在 PHP 中執行這個 DLL 嗎？

如果這是個簡單的 DLL 那麼還沒有辦法在 PHP 中執行它。如果這個 DLL 中包含有一個 COM 伺服器並且它實現了 IDispatch 接口，那有可能連接它。

2. “Unsupported variant type: xxxx (0xxxxx)”是什麼意思？

有幾十種 VARIANT 型別以及它們的組合。大多數已經被支援了但還有幾種尚未實現。陣列沒有完全被支援。只有一維的僅用作索引的陣列可以在 PHP 和 COM 之間傳遞。如果你發現其它未支援的型別，請當作一個 bug 報告（如果尚未被報告的話）並提供盡可能多的訊息。

3. 在 PHP 中有可能操縱可視對象嗎？

一般來說是可以的，但是 PHP 大都用來作為 web 腳本語言並執行在 web 伺服器的上下文環境中，因此可視對象決不會在伺服器的桌面上顯示。如果你把 PHP 用作應用程序腳本例如結合 PHP-GTK 來使用，那麼連接和通過 COM 來操縱可視對象方面沒有限制。

4. 可以將一個 COM 對象保存在 session 中嗎？

不行。COM 的實例被看作是資源，因此只在一個腳本的上下文中有效。

5. 怎樣可以捕獲 COM 的錯誤？

當前除了 PHP 自己提供的辦法之外（@，track_errors，..）不可能捕獲 COM 的錯誤，但我們正在考慮實現它的方法。

6. 我能像在 Perl 中一樣從 PHP 腳本產生 DLL 文件嗎？

不行，PHP 沒有這樣的工具。

7. “Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”是什麼意思？

此錯誤可以有多種原因：

  • 錯誤的 CLSID

  • 找不到所請求的 DLL

  • 所請求的組件沒有實現 IDispatch 接口

8. 怎樣從遠端伺服器執行 COM 對象？

完全和執行本地對象一樣。只須將遠端伺服器的 IP 作為第二個變數傳遞給 COM 的建構函式即可。

確認在 php.ini 中設定了 com.allow_dcom=true。

9. 我得到一個“DCOM is disabled in C:\path...\scriptname.php on line 6”訊息，應該怎麼辦？

編輯 php.ini 並設定 com.allow_dcom=true。

10. 有可能在 PHP 頁面中加載／操縱 ActiveX 對象嗎？

這不關 PHP 的事。如果在 HTML 文檔中請求的話，ActiveX 對象被加載在客戶端。這和 PHP 腳本沒有關係，因此也不可能和伺服器端發生直接的交互作用。

11. 有可能得到一個組件在執行中的實例嗎？

在綽號的幫助下這有可能。如果你想得到同一個 word 實例的多個引用你可以這樣建立此實例：

$word = new COM("C:\docs\word.doc");

如果沒有執行中的實例這將建立一個新的實例，否則將會傳回正在執行中的實例的句柄，如果可用的話。

12. 有辦法處理 COM 對象中發送的事件嗎？

還不能。

13. 我在嘗試呼叫一個打開了多於一個接口的 COM 對象中的方法時碰到問題，應該怎麼辦？

我也不知道怎麼辦，我想這沒辦法。如果什麼人有對此問題的明確訊息請告訴我。:)

14. 這麼說 PHP 可以和 COM 一起工作，那麼 COM+ 呢？

COM+ 通過使用 MTS 和 MSMQ 來管理組件的框架擴展了 COM，但並沒有什麼特殊之處使 PHP 非要支援這樣的組件。

15. 如果 PHP 可以操縱 COM 對象，那麼可以設想結合 PHP 用 MTS 來管理組件資源嗎？

PHP 本身還並不處理事務。因而如果出錯也不會發動撤回機制。如果你使用了支援事務處理的組件那你不得不自己實現事務管理。

上一頁 | 首頁 | 下一頁
PHP 和 HTML | 上一層 | PHP 和其它語言


資料庫問題

PHP 手冊
上一頁 下一頁

章 47. 資料庫問題

本節包括 PHP 和資料庫之間關係的常見問題。是的，PHP 事實上可以連接如今現有的任何資料庫。

1. 聽說 PHP 有可能連接 Microsoft SQL Server，怎樣連接？
2. 能連接 Microsoft Access 資料庫嗎？
3. 我升級到了 PHP 4，結果 MySQL 不斷報告“Warning: MySQL: Unable to save result set in ..”，這是怎麼回事？
4. 在安裝共享 MySQL 支援之後，只要一加載 libphp4.so，Apache就會 core dump。這個問題能解決嗎？
5. 為什麼我得到類似如下的錯誤：“Warning: 0 is not a MySQL result index in <file> on line <x>”或者“Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>”？

1. 聽說 PHP 有可能連接 Microsoft SQL Server，怎樣連接？

在 Windows 機器中，你可以簡單地使用內置的 ODBC 支援和正確的 ODBC 驅動程序。

在 Unix 機器中，你可以用 Sybase-CT 驅動程序來連接 Microsoft SQL Server，因為它們的協議是（至少大部分）相容的。Sybase 做了一個 Linux 系統下所需庫的免費版本。對於其它 Unix 操作系統，你需要和 Sybase 聯系來得到正確的庫。同樣也看看下一個問題的回答。

2. 能連接 Microsoft Access 資料庫嗎？

可以。如果你完全在 Windows 9x/Me/NT/2000 下執行，那你已經有了所有所需的工具，你可以用 ODBC 和 Microsoft's ODBC drivers for Microsoft Access database。

如果你在 Unix 下執行 PHP 而想連接 Windows 中的 MS Access，那你需要 Unix ODBC 驅動程序。OpenLink Software 有一個基於 Unix 的 ODBC 驅動程序可以做這件事。你可以下載和試用一個不會過期的免費程序，商業支援版本的價格從 $675 起。

另外一個替代方案是用帶 Windows ODBC 驅動的 SQL Server 並用它來儲存資料，你可以通過 Microsoft Access（用 ODBC）和 PHP（用內置驅動）來連接，或者用一個 Access 和 PHP 都識別的中間文件格式，例如 flat 文件或者 dBase 資料庫。關於這一點 OpenLink Software 的 Tim Hayes 寫道：
當你可以通過 ODBC 直接從 PHP 連接資料庫時－ 例如用 OpenLink 的驅動程序，
使用其它資料庫做中間媒介不是一個好主意。如果你確實需要一個中間文件格式，
OpenLink 已經發布了 Virtuoso（一個虛擬資料庫引擎） for NT，Linux 和其它
Unix 平台。請連接我們的網站來免費下載。

還有一個已被証實有效的選擇是在 Windows 下用 MySQL 和它的 MyODBC 驅動來同步資料庫。Steve Lawrence 寫道：

  • 根據 MySQL 的說明在你的平台上安裝 MySQL。可以從 www.mysql.com 得到最新版（從你最近的鏡像站點下載！）。除了設定資料庫和配置用戶帳號以外不需要特殊的配置，你應該在 host 字段中放一個 % 或者你要用來連接 MySQL 的 Windows 機器名。記下你的伺服器名，用戶名和密碼。

  • 從 MySQL 網站下載 MyODBC for Windows 驅動程序。最新版是 myodbc-2_50_19-win95.zip（也可以用於 NT，以及原始碼）。在你的 Windows 機器中安裝它。你可以用此程序中包括的工具來測試其操作。

  • 用控制面板中的 ODBC 管理器新建一個用戶或系統 dsn，設定 dsn 名稱，輸入你在第一步中配置的 MySQL 資料庫的主機名，用戶名，密碼，端口等。

  • 完整安裝 Access，這樣可以確保得到適當的插件 ... 至少你需要 ODBC 支援和連接表管理器。

  • 新建一個 Access 資料庫。在 Table 視窗點擊右鍵並選擇 Link Tables，或者在 File 選單下選擇 Get External Data -> Link Tables。當文件瀏覽視窗打開後，選擇文件型別為：ODBC。接著選擇 System dsn 以及你在第三步建立的 dsn 的名字。再選擇要連接的表，點擊 OK。現在你可以在你的 MySQL 伺服器中打開表並新建／刪除／編輯資料了！你也可以建構查詢，導入／導出表到 MySQL，建構表單和報告等。

提示與技巧：

  • 你可以在 Access 中建構表並導出到 MySQL 中，再把它們連接回來。這樣可以使表的建立更快。

  • 在 Access 中建立表時，你必需定義一個基本鍵名來取得表的寫權限。確認你在把表連接到 Access 之前在 MySQL 中建立了基本鍵名。

  • 如果你在 MySQL 中修改了表，必需重新連接到 Access。打開 Tools>Add-ins>Linked table manager，找到你的 ODBC DSN，然後在這裡選擇要重新連接的表。你也可以在這裡移動 dsn 源，在點擊 OK 之前選中 always prompt for new location。

3. 我升級到了 PHP 4，結果 MySQL 不斷報告“Warning: MySQL: Unable to save result set in ..”，這是怎麼回事？

看上去最有可能的是，PHP 4 在編譯時使用了“--with-mysql”選項但沒有指定 MySQL 的路徑。這意味著 PHP 使用了它自己內置的 MySQL 客戶端庫。如果你的系統執行了使用其它版本的 MySQL 客戶端庫的應用程序，例如作為 Apache 模塊的 PHP 3，那麼在兩個不同版本的客戶端之間有衝突。

重新編譯 PHP 4，並在標記中加上 MySQL 的路徑，“--with-mysql=/your/path/to/mysql”通常會解決此問題。

4. 在安裝共享 MySQL 支援之後，只要一加載 libphp4.so，Apache就會 core dump。這個問題能解決嗎？

如果你的 MySQL 庫依靠 pthreads 連接就會這樣。檢查使用 ldd。如果有的話，下載 MySQL 源程序編譯，或者從源 rpm 的 spec 文件中去掉打開 threaded client 的選項然後重新編譯。以上任一建議會解決此問題。然後再加上新的 MySQL 庫重新編譯 PHP。

5. 為什麼我得到類似如下的錯誤：“Warning: 0 is not a MySQL result index in <file> on line <x>”或者“Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>”？

你試圖用一個值為 0 的結果資源號。0 表示你的查詢由於某原因失敗了。你需要在送出查詢之後和在使用傳回結果資源號之前檢查錯誤。正確的方法是用類似如下的代碼：
$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
    echo mysql_error();
    exit;
}
or
$result = mysql_query("SELECT * FROM tables_priv")
    or die("Bad query: ".mysql_error());

上一頁 | 首頁 | 下一頁
獲取 PHP | 上一層 | 安裝


一般訊息

PHP 手冊
上一頁 下一頁

章 44. 一般訊息

本章包括了有關 PHP 的大多數一般問題：它是什麼和它做什麼。

1. PHP 是什麼？
2. PHP 這個縮寫指的是什麼？
3. PHP 版本之間有什麼聯系？
4. 可以同時執行幾個不同版本的 PHP 嗎？
5. PHP 3 和 PHP 4 的區別有哪些？
6. 我發現了一個 bug！應該告訴誰？

1. PHP 是什麼？

根據本手冊的前言：

PHP 是一種 HTML 嵌入式的腳本語言。它的很多語法來自 C，Java 和 Perl，並具有幾個 PHP 獨有的特點。該語言的主要目標是讓 Web 開發人員快速的書寫動態產生的網頁。

這裡有一個位於 Zend 網站中由 Stig Sæther Bakken 所寫很好的介紹。同樣，大量的PHP 研討會素材也可以免費得到。

2. PHP 這個縮寫指的是什麼？

PHP 是 PHP: Hypertext Preprocessor 的縮寫。很多人有些糊塗了，因為縮寫中第一個字母也是個縮寫。這種方法叫做遞歸縮寫，對此好奇的人可以連接 Free On-Line Dictionary of Computing 來得到更多遞歸縮寫的訊息。

3. PHP 版本之間有什麼聯系？

PHP/FI 2.0 是最早的 PHP 版本，已經不再支援。PHP 3 是 PHP/FI 2.0 的後繼者，要好很多。PHP 4 是最新一代的 PHP，內部使用了 Zend 引擎。

4. 可以同時執行幾個不同版本的 PHP 嗎？

可以，見 PHP 4 源程序發行包中的 INSTALL 文件。同樣也可以閱讀相關附錄。

5. PHP 3 和 PHP 4 的區別有哪些？

對此問題有 PHP 4 的作者寫的一些說明。這裡列出一些比較重要的新特點：

  • 擴展了 API 模塊

  • UNIX 下的通用編譯步驟

  • 支援多線程 web 伺服器的通用 web 伺服器接口

  • 增強了語法高亮顯示

  • 支援本地 HTTP session

  • 支援輸出緩衝

  • 更強大的配置系統

  • 引用計數

請連接PHP 4 新特點概覽查看以上及更多特點的詳細解釋。如果你從 PHP 3 移植到 PHP 4，也請閱讀相關的附錄。

6. 我發現了一個 bug！應該告訴誰？

你應該連接 PHP Bug 資料庫並確認你發現的不是一個已知的 bug。如果你在資料庫中沒有看到同樣的，用報告表單來報告此 bug。使用 bug 資料庫而不是給某個郵件列表發郵件非常重要，因為該 bug 會被分配一個跟蹤號碼，這樣你就有可能在以後回來查看該 bug 的狀態。Bug 資料庫在 http://bugs.php.net/。

上一頁 | 首頁 | 下一頁
FAQ: 常見問題 | 上一層 | 郵件列表


PHP 和 HTML

PHP 手冊
上一頁 下一頁

章 51. PHP 和 HTML

PHP 和 HTML 有很多相互作用：PHP 能產生 HTML，HTML 可以向 PHP 傳遞訊息。

1. 當我通過表單／URL 傳值時需要用什麼編碼／解碼方法？
2. 我在試用 <input type="image"> 標記，但是沒有 $foo.x 和 $foo.y 變數，它們哪去了？
3. 怎樣在 HTML 的 <form> 中建立陣列？
4. 怎樣從可多選的 HTML 的 select multiple 標記中得到所有結果？

1. 當我通過表單／URL 傳值時需要用什麼編碼／解碼方法？

在幾個環節上編碼方式很重要。假定你有 string $data，其中包含了你想通過非編碼方式傳遞的字串，那這是相關步驟：

  • HTML 解析。要指定一個任意的字串，你必須將其放在雙引號中，並用 htmlspecialchars 處理整個值。

  • URL：URL 由幾部分組成。如果你希望自己的資料被當作其中一項來解釋，你必須用 urlencode() 對其編碼。

例子 51-1. 隱藏的 HTML 表單單元

<?php
    echo "<input type=hidden value=\"" . htmlspecialchars($data) . "\">\n";
?>

註: 用 urlencode() 來處理 $data 是錯誤的，因為是瀏覽器的責任來 urlencode() 資料。所有流行的瀏覽器都能正確處理。注意不論何種方法（例如 GET 或 POST）都會這樣。不過你只會在用 GET 請求時注意到這一點，因為 POST 請求通常是隱藏的。

例子 51-2. 等待用戶編輯的資料

<?php
    echo "<textarea name=mydata>\n";
    echo htmlspecialchars($data)."\n";
    echo "</textarea>";
?>

註: 資料會按照預期的顯示在瀏覽器中，因為瀏覽器會解釋 HTML 轉義符號。

當送出時，不論是 GET 或者 POST 方法，資料都會被瀏覽器進行 urlencode 來傳輸，並直接被 PHP urldecode。所以最終你不需要自己處理任何 urlencoding/urldecoding，全都是自動處理的。

例子 51-3. URL 中的例子

<?php
    echo "<a href=\"" . htmlspecialchars("/nextpage.php?stage=23&data=" .
        urlencode($data)) . "\">\n";
?>

註: 事實上你在捏造一個 HTML 的 GET 請求，因此需要手工對資料進行 urlencode()。

註: 你需要對整個 URL 進行 htmlspecialchars()，因為 URL 是作為 HTML 屬性的一個值出現的。在本例中，瀏覽器會首先對值進行 un-htmlspecialchars()，然後再傳遞此 URL。PHP 將能正確理解 URL，因為你對資料進行了 urlencoded()。

你會注意到 URL 中的 & 被替換成了 &amp;。如果你忘了這一步，儘管大多數瀏覽器都能恢複，但也不總是這樣。因此即使 URL 不是動態的，你也需要對 URL 進行 htmlspecialchars()。

2. 我在試用 <input type="image"> 標記，但是沒有 $foo.x 和 $foo.y 變數，它們哪去了？

當送出表單時，可以用圖片代替標準的送出按鈕，用類似這樣的標記：
<input type="image" src="image.gif" name="foo">
當用戶點擊了圖片的任何部分，該表單會被發送到伺服器並加上兩個額外的變數：foo.x 和 foo.y。

因為 $foo.x 和 $foo.y 在 PHP 中是非法的變數名，它們被自動轉換成了 $foo_x 和 $foo_y。也就是用下劃線代替了點。

3. 怎樣在 HTML 的 <form> 中建立陣列？

要使你的 <form> 結果被當成 array 發送到 PHP 腳本，你要對 <input>，<select> 或者 <textarea> 單元這樣命名：
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
注意變數名後的方括號，這使其成為一個陣列。你可以通過給不同的單元分配相同的名字來把單元分組到不同的陣列裡：
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyOtherArray[]">
<input name="MyOtherArray[]">
這將產生兩個陣列，MyArray 和 MyOtherArray，並發送給 PHP 腳本。還可以給陣列分配指定的鍵名：
<input name="AnotherArray[]">
<input name="AnotherArray[]">
<input name="AnotherArray[email]">
<input name="AnotherArray[phone]">
AnotherArray 陣列將包含鍵名 0，1，email 和 phone。

註: 指定陣列的鍵名是 HTML 的可選項。如果你不指定鍵名，則陣列被按照單元在表單中出現的順序填充。第一個例子將包含鍵名 0，1，2 和 3。

參見陣列函式庫和PHP 的外部變數。

4. 怎樣從可多選的 HTML 的 select multiple 標記中得到所有結果？

可多選的 select multiple 標記是 HTML 的一個建構，允許用戶從一個列表中選擇多個項目。這些項目接著被傳遞給該表單 action 中指定的處理程序。問題是它們都會被用同樣的名字傳遞。例如：
<select name="var" multiple>
每個被選項將這樣被傳遞到表單處理程序：
var=option1
var=option2
var=option3
每個選項將覆蓋前面一個 $var 變數的內容。解決方案是用 PHP 的“表單單元陣列”特性。使用方法如下：
<select name="var[]" multiple>
這將告訴 PHP 將 $var 當成陣列對待，每個對 var[] 的設值都會給陣列增加一項。第一項將成為 $var[0]，下一個是 $var[1]，等等。可以用 count() 函式來測定選擇了多少個項目，必要時可以用 sort() 函式來對選項的陣列進行排序。

注意如果你在 JavaScript 中通過名字來引用單元，單元名字中的 [] 可能會造成問題。用表單單元中的數字序號來替代，或者將變數名用單引號括起來並用其作為單元陣列的索引，例如：
variable = documents.forms[0].elements['var[]'];

上一頁 | 首頁 | 下一頁
使用 PHP | 上一層 | PHP 和 COM


安裝

PHP 手冊
上一頁 下一頁

章 48. 安裝

本章包括了安裝 PHP 的常見問題。PHP 可以用於幾乎任何操作系統（可能除了 OSX 之前的 MacOS 之外），以及幾乎任何 web 伺服器。

要安裝 PHP，請按照發行包中 INSTALL 文件的說明進行。Windows 用戶同樣還要閱讀 install.txt 文件。對於 Windows 用戶還有一些有用的提示在 Windows 系統下安裝一節。

1. Unix/Windows：應該上哪兒去找我的 php.ini 文件？
2. Unix：我安裝了 PHP，但每次我打開一個頁面時，只得到一條“Document Contains No Data”消息！這是怎麼回事？
3. Unix：我從 RPMS 安裝了 PHP，但是 Apache 不處理 PHP 頁面！這是怎麼回事？
4. Unix：我從 RPMS 安裝了 PHP 3，但它沒有把我需要的資料庫支援編譯進去！這是怎麼回事？
5. Unix：我給 Apache 加上了 FrontPage extensions 補丁，結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎？
6. Unix/Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到了一個空白頁面。
7. Unix/Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到了一個伺服器的 500 錯誤。
8. 某些操作系統：我已經在不出錯的情況下安裝了 PHP，但當我試著啟動 Apache 時得到了一個未定義符號錯誤：
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress
9. Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到如下錯誤：
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:
10. Windows：我已經照著所有的說明做了，但還是不能讓 PHP 和 IIS 一起工作！

1. Unix/Windows：應該上哪兒去找我的 php.ini 文件？

UNIX 中預定在 /usr/local/lib 目錄中，也就是 <install-path>/lib。很多人會在編譯時通過 --with-config-file-path 標記來改變路徑。例如你可以將路徑設為：
--with-config-file-path=/etc
然後從發行包中將 php.ini-dist 拷貝為 /etc/php.ini 並編輯它來作出你想要的修改。

Windows 中 php.ini 文件的預定路徑在 Windows 目錄下。如果你使用的是 Apache 伺服器，則會首先在 Apache 的安裝目錄中尋找 php.ini，例如 C:\Program Files\Apache Group\Apache。這樣同一台機器上不同版本的 Apache 就可以有不同的 php.ini 文件。

參見配置文件。

2. Unix：我安裝了 PHP，但每次我打開一個頁面時，只得到一條“Document Contains No Data”消息！這是怎麼回事？

這可能意味著 PHP 發生了某類錯誤而導致了 core dump。查看伺服器的錯誤日志看看是不是這樣，再用一個小的測試例子試著重現此問題。如果你會用“gdb”的話，那麼在 bug 報告中提供回溯跟蹤很有助於幫開發人員查明問題。如果你用 Apache 的模塊方式使用 PHP，試著這麼做：

  • 停止 httpd 進程

  • gdb httpd

  • 停止 httpd 進程

  • > run -X -f /path/to/httpd.conf

  • 然後在你的瀏覽器中連接導致錯誤的 URL

  • > run -X -f /path/to/httpd.conf

  • 如果你遇到 core dump，gdb 此時就會通知你

  • 輸入：bt

  • 你應該在 bug 報告中包括回溯追蹤記錄。應該送出到 http://bugs.php.net/

如果你的腳本使用了正則表達式函式（ereg() 等），應該確認在編譯 PHP 和 Apache 時使用了同一個正則表達式包。在 PHP 和 Apache 1.3.x 中應該自動就是這樣。

3. Unix：我從 RPMS 安裝了 PHP，但是 Apache 不處理 PHP 頁面！這是怎麼回事？

假定你的 Apache 和 PHP 都是從 RPM 包中安裝的，你需要在 http.conf 文件中取消以下部分或所有行的註釋，或者把它們增加到該文件中：
# Extra Modules
AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php3_module        modules/libphp3.so     /* for PHP 3 */
LoadModule php4_module        modules/libphp4.so     /* for PHP 4 */
LoadModule perl_module        modules/libperl.so
並且把：
AddType application/x-httpd-php3 .php3    /* for PHP 3 */
AddType application/x-httpd-php .php      /* for PHP 4 */
增加到全域屬性中，或者增加到你希望加入 PHP 支援的虛擬域中。

4. Unix：我從 RPMS 安裝了 PHP 3，但它沒有把我需要的資料庫支援編譯進去！這是怎麼回事？

由於 PHP 3 建構的原因，不容易編譯出一個完全靈活的 PHP RPM 包來。這個問題在 PHP 4 中解決了。對於 PHP 3 來說，我們目前建議你用 PHP 發行包中 INSTALL.REDHAT 文件中所描述的機制。如果你堅持要用 PHP 3 的 RPM 版本，請接著往下看。

為了簡化安裝以及由於 RPMS 使用了 /usr/ 而不是標準的 /usr/local/ 目錄來存放文件，製作 RPM 包的人設定 RPMS 不安裝任何資料庫支援。你需要告訴 RPM 說明文件，你想要支援哪個資料庫以及你的資料庫伺服器最高層路徑。

下面的例子解說了如何在用模塊安裝下的 Apache 中加入流行的 MySQL 資料庫伺服器支援的過程。

當然這些訊息可以調整用於任何 PHP 支援的資料庫伺服器。本例中我們也假定你從 RPMS 中完整安裝了 MySQL 和 Apache。

  • 先去掉 mod_php3：
    rpm -e mod_php3

  • 然後取得源文件的 rpm 包並安裝它，而不是編譯它。
    rpm -Uvh mod_php3-3.0.5-2.src.rpm

  • 接著編輯 /usr/src/redhat/SPECS/mod_php3.spec 文件

    在 %build 一節加入你想要的資料庫支援，以及路徑。

    對應於 MySQL 你應該加入
    --with-mysql=/usr \
    %build 一節看上去將類似這樣：
    ./configure --prefix=/usr \
    --with-apxs=/usr/sbin/apxs \
    --with-config-file-path=/usr/lib \
    --enable-debug=no \
    --enable-safe-mode \
    --with-exec-dir=/usr/bin \
    --with-mysql=/usr \
    --with-system-regex

  • 一旦完成了這個修改，就這樣建立二進制程序的 rpm 包：
    rpm -bb /usr/src/redhat/SPECS/mod_php3.spec

  • 然後安裝 rpm
    rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm

確認重新啟動了 Apache，這下你就有了用 RPM 安裝的並且帶 MySQL 支援的 PHP 3 了。注意按照 PHP 3 發行包中 INSTALL.REDHAT 文件的說明來編譯其實也許更容易一些。

5. Unix：我給 Apache 加上了 FrontPage extensions 補丁，結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎？

相容的。PHP 可以和 FrontPage extensions 一起工作，問題是 FrontPage 補丁修改了幾個 PHP 依賴的 Apache 建構。在 FrontPage 補丁安裝之後之後重新編譯 PHP（用“make clean ; make”）可以解決此問題。

6. Unix/Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到了一個空白頁面。

用瀏覽器中的“查看源文件”，你可能會發現你能看到 PHP 腳本的源程序。這意味著 web 伺服器沒有把腳本發送給 PHP 解釋。伺服器配置在某處有問題，請對照 PHP 安裝說明仔細檢查伺服器配置。

7. Unix/Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到了一個伺服器的 500 錯誤。

當伺服器嘗試執行 PHP 時出了錯。要想看到有意義的錯誤訊息，在命令行中轉到 PHP 可執行程序（Windows 中是 php.exe）所在目錄下並執行 php -i。如果 PHP 執行有任何問題，那麼會顯示相應的錯誤訊息，這將給你下一步要做什麼的線索。如果你得到滿屏幕 html 代碼（phpinfo() 函式的輸出）的話說明 PHP 本身工作正常，你的問題可能和你的伺服器配置有關，要仔細檢查。

8. 某些操作系統：我已經在不出錯的情況下安裝了 PHP，但當我試著啟動 Apache 時得到了一個未定義符號錯誤：
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

這實際上和 PHP 沒有關係，而和 MySQL 的客戶端庫有關。有的需要 --with-zlib，有的不需要。這個問題也包括在 MySQL 的 FAQ 中。

9. Windows：我已經安裝了 PHP，但當我試著通過瀏覽器連接 PHP 腳本時，得到如下錯誤：
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

這個錯誤訊息意味著 PHP 根本就不能產生任何輸出。要想看到有意義的錯誤訊息，在命令行中轉到 PHP 可執行程序（Windows 中是 php.exe）所在目錄下並執行 php -i。如果 PHP 執行有任何問題，那麼會顯示相應的錯誤訊息，這將給你下一步要做什麼的線索。如果你得到滿屏幕 html 代碼（phpinfo() 函式的輸出）的話說明 PHP 本身工作正常。

一旦 PHP 在命令行中工作正常，試著通過瀏覽器再次連接腳本。如果還失敗的話那可能是如下原因之一：

  • 文件權限問題，你的 PHP 腳本，php.exe，php4ts.dll，php.ini 或任何你要加載的 PHP 擴展庫是匿名 internet 用戶 ISUR_<machinename> 無權連接的。

  • 腳本文件不存在（或者有可能不在你以為的地方，注意 web 文檔的目錄）。注意在 IIS 中通過 Internet 服務管理器設定腳本映射時選中“檢查文件是否存在”可以捕捉到此錯誤。這樣一來如果腳本文件不存在的話伺服器就會傳回一個 404 錯誤訊息。還有一個額外的好處就是 IIS 會基於 NTLanMan 權限來替你對腳本文件做任何所需要的認証。

10. Windows：我已經照著所有的說明做了，但還是不能讓 PHP 和 IIS 一起工作！

確認需要執行 PHP 腳本的任何用戶有權限執行 php.exe！IIS 使用了一個在安裝 IIS 時增加的匿名用戶，這個用戶需要有連接 php.exe 的權限。同樣任何認証用戶也需要執行 php.exe 的權限。在 IIS4 中你還需要告訴它 PHP 是一個腳本引擎。

上一頁 | 首頁 | 下一頁
資料庫問題 | 上一層 | 編譯問題


PHP 和其它語言

PHP 手冊
上一頁 下一頁

章 53. PHP 和其它語言

PHP 是 web 編程最好的語言，但其它語言怎樣呢？

1. PHP 對 ASP？
2. 有 ASP 到 PHP 的轉換器嗎？
3. PHP 對 Cold Fusion？
4. PHP 對 Perl？

1. PHP 對 ASP？

ASP 本身並不真的是一種語言，它是 Active Server Pages 的縮寫，實際上用來進行 ASP 編程的語言是 Visual Basic Script 或者 JScript。ASP 最大的缺點是它是一個專有系統而只能在 Microsoft Internet Information Server（IIS）上使用。這限制了它只能在基於 Win32 的伺服器上使用。有幾項進行中的計劃使 ASP 可以在其它環境和 web 伺服器中使用：Halcyon（商業的）的 InstantASP，Chili!Soft 的 Chili!Soft ASP 和 ActiveScripting.org 的 OpenASP（免費）。ASP 被認為比 PHP 慢和麻煩，也不穩定。一些 ASP 的正面觀點是既然它基本上用 VBScript，那如果你已經懂得用 Visual Basic 編程就會相對容易拾起這種語言。在 IIS 伺服器中預定啟動了 ASP 支援，這使它容易啟動和執行。ASP 中內置的組件實在是很有限，因此如果你需要一些“高級的”特點例如與 FTP 伺服器交互，你需要購買額外的組件。

2. 有 ASP 到 PHP 的轉換器嗎？

有，asp2php 是最經常被提及的。

3. PHP 對 Cold Fusion？

PHP 普遍被認為對複雜的編程任務更快和更有效以及勇於嘗試新主意。PHP 也通常被提及更穩定以及占用更少資源。Cold Fusion 具有更好的錯誤處理，資料庫抽象和資料解析，儘管資料庫抽象已經在 PHP 4 中解決了。另外一個被作為 Cold Fusion 的強項列出來的是它卓越的搜索引擎，但也被指出搜索引擎不是 web 腳本語言中應該包括的東西。PHP 可以在幾乎每一個現有的平台下執行；Cold Fusion 只能在 Win32，Solaris，Linux 和 HP/UX 下執行。Cold Fusion 有很好的集成開發環境以及通常更容易上手，反之 PHP 則一開頭就需要更多的編程知識。Cold Fusion 是為非程序員的頭腦所設計，而 PHP 則聚焦於程序員。

有關此話題 Michael J Sheldon 在 PHP 郵件列表中發表了一個很棒的摘要。有一個拷貝在這裡。

4. PHP 對 Perl？

PHP 對 Perl 最大的優勢就是 PHP 是為 web 腳本設計的而 Perl 則被設計用來做更多的事也因此而非常複雜。Perl 的靈活性／複雜性使得用它能很容易寫出代碼但卻讓另一個作者／編程者非常難讀懂。PHP 則不容易把人搞糊塗以及具有更嚴謹的格式同時也不失靈活性。PHP 比 Perl 更容易集成進現有的 HTML 中去。PHP 具有差不多所有 Perl 的“好”功能：結構，語法等等，但卻沒有使它達到 Perl 的費解程度。Perl 是一種久經考驗真正的語言，從上個世紀八十年代末起就到處都有，但是 PHP 成熟得非常快。

上一頁 | 首頁 | 下一頁
PHP 和 COM | 上一層 | 從 PHP/FI 2 移植到 PHP 3


郵件列表

PHP 手冊
上一頁 下一頁

章 45. 郵件列表

本節包括有關如何與 PHP 團體接觸的問題。最好的方法是郵件列表。

1. 有沒有 PHP 的郵件列表？
2. 還有其它的團體嗎？
3. 救命！我看來不能訂閱／取消任何一個郵件列表！
4. 在哪裡有個郵件列表的歸檔嗎？
5. 我可以在郵件列表中問什麼？
6. 向郵件列表發帖子時我需要包括些什麼訊息？

1. 有沒有 PHP 的郵件列表？

當然有！有很多關於幾個主題的郵件列表。所有郵件列表的完整列表在技術支援頁面。

最通用的郵件列表是 php-general。要訂閱，發送一封郵件到 php-general-subscribe@lists.php.net。不需要在郵件主題或內容中包括任何特殊單詞。要取消訂閱，發送一封郵件到 php-general-unsubscribe@lists.php.net。

也可以在我們的技術支援頁面通過 web 界面來訂閱和取消。

2. 還有其它的團體嗎？

世界上有無數 PHP 團體。我們的技術支援頁面上有例如一些 IRC 伺服器和其它語種的郵件列表。

3. 救命！我看來不能訂閱／取消任何一個郵件列表！

如果你在訂閱或取消 php-general 郵件列表上有問題，可能是因為郵件列表軟件沒法決定正確的郵件位址去使用。如果你的 email 位址是 joeblow@example.com，可以將訂閱請求發送到 php-general-subscribe-joeblow=example.com@lists.php.net，或者將取消請求發送到 php-general-unsubscribe-joeblow=example.com@lists.php.net。對其它郵件列表用類似的位址。

4. 在哪裡有個郵件列表的歸檔嗎？

是的，你可以在技術支援頁面找到歸檔站點的列表。郵件列表的文章也被作為新聞組消息歸檔。你可以用新聞組客戶端來連接位於 news://news.php.net/ 的新聞組伺服器。也有一個試驗性質的新聞組伺服器的 web 界面位於 http://news.php.net/。

5. 我可以在郵件列表中問什麼？

由於 PHP 一天比一天更流行，php-general 郵件列表的流量增加到現在的每天 150 到 200 個帖子。由於此原因，為了每個人的利益使用此列表是你在尋找過所有其它地方後的最後手段。

在你向列表發帖之前請先看看本 FAQ 以及手冊是不是能找到幫助。如果找不到的話試試郵件列表歸檔（見上面）。如果你有安裝或者配置 PHP 的問題請從頭到尾讀一遍所有包含的文檔和 README's。如果還是不能找到任何可以幫助你的訊息，那麼很歡迎你使用此郵件列表。

6. 向郵件列表發帖子時我需要包括些什麼訊息？

像“我不能啟動執行 PHP！幫幫我！哪裡出錯了？”之類的貼子對任何人都完全沒有用。如果你在啟動和執行 PHP 上有問題你必須包括你執行的操作系統，你試圖配置的 PHP 版本，你怎樣得到的（預編譯的，CVS，RPM 等等），目前為止你都做了些什麼，卡在了何處以及確切的錯誤訊息。

這也同樣適用於其它問題。你必須包括你做了什麼，卡在了哪裡，你試圖做什麼以及，如果有的話，確切的錯誤訊息。如果你有原始碼的問題那你需要包括不起作用部分的代碼。可是不要包括超出所必需的代碼！這將使貼子很難讀並使很多人為此而跳過它。如果你不確定應該在郵件中包括多少訊息，那包括多一些比一點點更好。

另一件重要的事是記住在主題一行中概述你的問題。類似“救命！”或者“這是什麼問題？”的主題會被一大半讀者忽略。

上一頁 | 首頁 | 下一頁
一般訊息 | 上一層 | 獲取 PHP


從 PHP/FI 2 移植到 PHP 3

PHP 手冊
上一頁 下一頁

章 54. 從 PHP/FI 2 移植到 PHP 3

PHP 已經有一段傳奇似的歷史: PHP/FI 1.0, PHP/FI 2.0, PHP 3.0 和 PHP 4.0。

1. 從 PHP/FI 2 移植到 PHP 3?

1. 從 PHP/FI 2 移植到 PHP 3?

PHP/FI 2.0 不再被支援. 從 PHP/FI 2.0 移植的訊息請看手冊相應章節

如果你仍然使用 PHP 2, 我們強烈建議你直接升級到 PHP 4.

上一頁 | 首頁 | 下一頁
PHP 和其它語言 | 上一層 | 從 PHP 3 移植到 PHP 4


從 PHP 3 移植到 PHP 4

PHP 手冊
上一頁 下一頁

章 55. 從 PHP 3 移植到 PHP 4

PHP 已經有一段傳奇似的歷史:PHP 1.0, PHP/FI, PHP 3.0 和 PHP 4.0.

1. 從 PHP 3 移植到 PHP 4
2. 不相容的函式問題?

1. 從 PHP 3 移植到 PHP 4

PHP 4 被盡可能的設計為與早期的 PHP 版本相容.在 PHP 4 的設計開發過程中,只有非常少的早期 PHP 版本具有的功能被 PHP 4 刪除. 如果你不敢確定你的 PHP 文件 的相容性,你可以安裝一個 PHP 4 測試環境來測試你的 PHP 文件.

相關訊息請查看該手冊附錄

2. 不相容的函式問題?

PHP 4 主要重寫了整個 PHP 引擎,所以只有非常少的早期的 PHP 版本中的函式被改變到 PHP 4 中,PHP 4 中的函式大部分是新增加的.

上一頁 | 首頁 | 下一頁
從 PHP/FI 2 移植到 PHP 3 | 上一層 | 雜類問題


雜類問題

PHP 手冊
上一頁 下一頁

章 56. 雜類問題

有些問題沒法歸到其它類中，你可以在這裡發現它們。

1. 網站上的浮動視窗哪裡去了？我能獲得它的代碼嗎？
2. 在 Windows 中怎樣處理 bz2 壓縮的文檔？

1. 網站上的浮動視窗哪裡去了？我能獲得它的代碼嗎？

舊網站上黃顏色的浮動視窗很酷，但是很難維護（因為有些公司很喜歡改變每個新版本瀏覽器工作的方式）。

網站舊版本的所有代碼仍然能夠從 CVS 中得到。尤其是最新版的 shared.inc（包括浮動視窗所有的 Javascript 和 DHTML）在這裡。

2. 在 Windows 中怎樣處理 bz2 壓縮的文檔？

如果你沒有能處理 bz2 文件的壓縮工具，從 Redhat 下載一個命令行工具（進一步訊息見下面）。

如果你不喜歡用命令行工具，你可以試試免費工具例如 Stuffit Expander，UltimateZip，7-Zip 或者 Quick Zip。如果你有像 WinRAR 或者 Power Archiver 之類的工具，可以很容易用它解壓縮 bz2 文件。如果你用 Windows Commander，可以從 Windows Commander 網站免費得到一個 bz2 插件。

Redhat 的 bzip2 命令行工具：

Win2K Sp2 用戶下載最新版本 1.0.2，所有其它 Windows 用戶應該用版本 1.00。下載後重命名可執行文件為 bzip2.exe。為方便起見將其放到一個在你路徑中的目錄，例如 C:\Windows，C 表示你安裝 Windows 的盤符。

注意：lang 指的是你的語種， x 是想要的格式，例如：pdf。要解壓縮 php_manual_lang.x.bz2，按照下面的簡單說明進行：

  • 打開一個命令行視窗

  • 進入存放已下載的 php_manual_lang.x.bz2 的目錄

  • 呼叫 bzip2 -d php_manual_lang.x.bz2，將 php_manual_lang.x 釋放到同一個目錄

在你下載了包含很多 html 文件的 php_manual_lang.tar.bz2 的情況下，過程是一樣的。唯一區別是得到了一個 php_manual_lang.tar 文件。tar 格式可以被大多數 Windows 下流行的壓縮工具所處理，例如 WinZip。

上一頁 | 首頁 | 下一頁
從 PHP 3 移植到 PHP 4 | 上一層 | 附錄


獲取 PHP

PHP 手冊
上一頁 下一頁

章 46. 獲取 PHP

本節包括 PHP 下載位址以及操作系統相關問題的詳細資料。

1. PHP 可以從哪裡得到？
2. 有預先編譯好的可執行版本嗎？
3. 編譯一些可選的 PHP 擴展庫所需的庫文件可以從哪裡得到？
4. 怎樣使這些庫起作用？
5. 我在 Windows 機器中從 CVS 裡得到了最新版的 PHP 原始碼，需要什麼去編譯它？
6. 哪裡可以找到 browscap.ini 文件？

1. PHP 可以從哪裡得到？

可以從任何一個 PHP 網路成員的站點下載 PHP。這些訊息在 http://www.php.net/。還可以通過匿名 CVS 得到絕對是最新版的源程序。更多訊息請連接 http://cvs.php.net/。

2. 有預先編譯好的可執行版本嗎？

我們只為 Windows 系統提供了預編譯的可執行文件，因為我們沒法為每個主流的 Linux/Unix 平台編譯每一種擴展庫組和的 PHP。同樣注意，如今很多 Linux 的發行版本已經內置了 PHP。Windows 可執行文件可以從我們的下載頁面下載，至於 Linux 可執行文件，請連接你的 Linux 發布商的站點。

3. 編譯一些可選的 PHP 擴展庫所需的庫文件可以從哪裡得到？

註: 有 * 號標記的不是多線程的庫，不應該用作多線程 Windows web 伺服器（IIS，Netscape）的伺服器模塊。不過這在 Unix 環境下沒有關係。

  • LDAP (Unix).

  • LDAP* (Unix).

  • LDAP (Unix/Win) : Netscape Directory (LDAP) SDK 1.1.

  • free LDAP server.

  • Berkeley DB2 (Unix/Win) : http://www.sleepycat.com/.

  • SNMP* (Unix): .

  • GD* (Unix/Win).

  • mSQL* (Win).

  • mSQL* (Unix).

  • PostgreSQL (Unix).

  • IMAP* (Win/Unix).

  • Sybase-CT* (Linux, libc5) : Available locally.

  • FreeType (libttf):.

  • ZLib (Unix/Win32).

  • expat XML parser (Unix/Win32).

  • PDFLib.

  • mcrypt.

  • mhash.

  • t1lib.

  • dmalloc.

  • aspell.

  • readline.

4. 怎樣使這些庫起作用？

你需要按照這些庫提供的說明進行。一些庫可以在你執行 PHP 的“configure”時自動檢測到（例如 GD 庫），其它的你必需用“--with-EXTENSION”選項來啟動。執行“configure --help”來得到完整的列表。

5. 我在 Windows 機器中從 CVS 裡得到了最新版的 PHP 原始碼，需要什麼去編譯它？

首先，你需要 Microsoft Visual C++ v6（v5 也許也行，不過我們是用 v6 編譯的），此外你還需要一些支援文件。參見手冊中的在 Windows 下編譯 PHP 原始碼一節。

6. 哪裡可以找到 browscap.ini 文件？

你可以從 http://www.garykeith.com/browsers/downloads.asp 得到一個 browscap.ini 文件。

上一頁 | 首頁 | 下一頁
郵件列表 | 上一層 | 資料庫問題


使用 PHP

PHP 手冊
上一頁 下一頁

章 50. 使用 PHP

本節匯集了你在寫 PHP 腳本時碰到的大多數普通錯誤。

1. 我想寫一個可以處理任何表單來的資料的通用 PHP 腳本。我怎麼知道哪個 POST 方法變數可用呢？
2. 我需要把所有的單引號（'）轉換為反斜線後面跟著單引號。怎樣用正則表達式做到呢？
3. 當我這樣做時，輸出顯示的次序是錯的：
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
這是怎麼回事？
4. 下面代碼怎麼沒有分成兩行顯示？
<pre>
<?php echo "This should be the first line."; ?>
<?php echo "This should show up after the new line above."; ?>
</pre>
5. 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。
6. 我需要直接連接請求報頭中的訊息，怎麼能辦到?
7. 當我用 IIS 進行 HTTP 認証時得到“No Input file specified”消息。
8. 我的 PHP 腳本在 IE 和 Lynx 下能工作，但是在 Netscape 中有的輸出丟失了。當我用“查看源文件”時可以在 IE 中看到內容，但是 Netscape 中不能。
9. 我怎樣混合使用 XML 和 PHP？它不認我的 <?xml> 標記！
10. 怎樣用 FrontPage 或者其它非要把我的代碼移來移去的 HTML 編輯器來編輯 PHP？
11. 哪裡可以找到所有可用的預定義變數的完整列表？為什麼在 PHP 文檔中沒有？
12. 我試著在用戶自定義函式中連接一個標準的 CGI 變數（例如 $DOCUMENT_ROOT 或 $HTTP_REFERER），但是找不到，哪裡出了錯？

1. 我想寫一個可以處理任何表單來的資料的通用 PHP 腳本。我怎麼知道哪個 POST 方法變數可用呢？

確保在 php.ini 文件中啟動了 track_vars 特性。自從 PHP 4.0.3 開始，此特性總是打開的。當 track_vars 打開時，會建立一些相關的陣列，這裡最重要的是：$_POST（在 PHP 4.1.0 之前叫做 $HTTP_POST_VARS）。因此要寫出處理 POST 方法變數的通用腳本你需要一些類似如下的方法：
foreach ($_POST as $var => $value) {
    echo "$var = $value<br>\n";
}

2. 我需要把所有的單引號（'）轉換為反斜線後面跟著單引號。怎樣用正則表達式做到呢？

首先看看 addslashes() 函式。它正是做這件事的。同樣也看看你的 php.ini 文件中的 magic_quotes_gpc 選項。

3. 當我這樣做時，輸出顯示的次序是錯的：
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
這是怎麼回事？

要在一個表達式中（例如在上面的例子中和其它字串連接）使用函式的結果，你需要用 return 傳回這個值，而不是 echo() 它。

4. 下面代碼怎麼沒有分成兩行顯示？
<pre>
<?php echo "This should be the first line."; ?>
<?php echo "This should show up after the new line above."; ?>
</pre>

在 PHP 中，一段代碼的結束標記要麼是“?>”要麼是“?>\n”（\n 表示換行）。因此在上面的例子中，輸出的句子將顯示在同一行中，因為 PHP 忽略了代碼結束標記後面的換行。這意味著如果要輸出一個換行符，你需要在每段 PHP 代碼的結束標記後面多加一個換行。

PHP 為什麼這麼做呢？因為在格式化正常的 HTML 時，這樣通常會更容易。假如輸出了換行而你不需要這個換行時，你就不得不用一個非常長的行來達到這樣的效果，或者讓產生的 HTML 頁面的源文件的格式很難讀。

5. 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。

函式 header()，setcookie() 和 session 函式需要在輸出流中增加報頭。但是報頭只能在其它任何輸出內容之前發送，檢查你的代碼是否在任何已經發送的內容後面發送報頭。

6. 我需要直接連接請求報頭中的訊息，怎麼能辦到?

如果你以 Apache 的模塊方式執行 PHP，那麼函式 getallheaders() 可以做這件事。因此下面的代碼可以顯示所有的請求報頭：
$headers = getallheaders();
foreach ($headers as $name => $content) {
    echo "headers[$name] = $content<br>\n";
}

7. 當我用 IIS 進行 HTTP 認証時得到“No Input file specified”消息。

IIS 的安全模型這裡有毛病。這是所有 IIS 下執行的 CGI 程序所共有的問題。一個解決辦法是建立一個純 HTML 文件（不經過 PHP 解析）作為要進入認証目錄的登錄頁面，然後用 META 標記來重定向到 PHP 頁面，或者用一個連接到 PHP 頁面。然後 PHP 就可以正確識別認証訊息了。如果是用 ISAPI 模塊，那沒有這個問題。其它 NT 下的 web 伺服器不受此影響。更多訊息見：http://support.microsoft.com/support/kb/articles/q160/4/22.asp。

8. 我的 PHP 腳本在 IE 和 Lynx 下能工作，但是在 Netscape 中有的輸出丟失了。當我用“查看源文件”時可以在 IE 中看到內容，但是 Netscape 中不能。

Netscape 在關於 html 標記（例如 table）上比 IE 更嚴格。用一個 html 驗証器，例如 validator.w3.org 來驗証你的 html 輸出可能會有幫助。例如漏了 </table> 可能會導致這樣的結果。

同樣，IE 和 Lynx 都忽略了 HTML 流中的任何 NULs（\0），Netscape 就不。最好的檢查方法是編譯 PHP 的命令行模式版本（也稱為 CGI 版本）並從命令行執行你的腳本。在 *nix 中，用管道傳遞到 od -c 並查看任何 \0 字元。如果在 Windows 下你需要能夠查看二進制文件格式的編輯器或程序。當 Netscape 碰到 NUL 時就不會輸出之後該行的任何內容而 IE 和 Lynx 都會。

9. 我怎樣混合使用 XML 和 PHP？它不認我的 <?xml> 標記！

你需要在 php.ini 文件中通過設定 short_tags 為 0 來關閉 PHP 的簡短標記格式，或者通過相應的 Apache 選項。你甚至應該用 <File> 段落來選擇性地這樣做。

10. 怎樣用 FrontPage 或者其它非要把我的代碼移來移去的 HTML 編輯器來編輯 PHP？

最簡單的方法是讓 PHP 代碼也能使用 ASP 標記。這可以讓你用 ASP 風格的 <% 和 %> 代碼定界符。一些流行的 HTML 編輯器在處理此格式上更加智能化一些（目前如此）。要使用 ASP 風格的標記，你需要在 php.ini 中打開 asp_tags，或者用相應的 Apache 配置選項。

11. 哪裡可以找到所有可用的預定義變數的完整列表？為什麼在 PHP 文檔中沒有？

最好的方法是把 <?php phpinfo(); ?> 粘貼到某一頁並打開來看看。它將顯示你的 PHP 的所有分類的設置，包括環境變數和 web 伺服器設定的特殊變數的列表。這個列表不能放在 PHP 文檔中，因為它在不同的伺服器中會改變的。

12. 我試著在用戶自定義函式中連接一個標準的 CGI 變數（例如 $DOCUMENT_ROOT 或 $HTTP_REFERER），但是找不到，哪裡出了錯？

環境變數通常都是全域變數，因此你必須在你的函式中聲明它們為全域變數（例如用 global $DOCUMENT_ROOT;），或者用全域變數陣列（例如 $GLOBALS["DOCUMENT_ROOT"]）。

上一頁 | 首頁 | 下一頁
編譯問題 | 上一層 | PHP 和 HTML


特點

PHP 手冊
上一頁 下一頁

III. 特點

目錄
16. 用 PHP 進行 HTTP 認証
17. Cookies
18. 文件上傳處理
19. 使用遠程文件
20. 連接處理
21. 資料庫永久連接
22. 安全模式
23. PHP 的命令行模式
上一頁 | 首頁 | 下一頁
引用定位 |  | 用 PHP 進行 HTTP 認証


一些注意事項

對 MAX_FILE_SIZE 設置的值，不能大於 ini 設置中 upload_max_filesize 選項設置的值。其預設值為 2M 字節。

如果內存限制設置被啟動，您可能需要將 memory_limit 設置的更大些，請確認 memory_limit 的設置足夠的大。

如果 max_execution_time 設置的值太小，腳本執行的時間可能會超過該設置。因此，也請保証 max_execution_time 足夠的大。

如果 post_max_size 設置的值太小，則較大的文件會無法被上傳。因此，請保証 post_max_size 的值足夠的大。

不使您操作的文件有效化，可能意味著用戶能夠連接其它目錄下的敏感訊息。

請注意 CERN httpd 似乎會丟棄它從客戶端獲得的 content-type mime 表頭訊息中第一個空格後所有的內容，基於這一點，CERN httpd 不支援文件上傳特性。

鑒於文件路徑的表示方法有很多種，我們無法確保用使用各種外語的文件名（尤其是包含空格的）能夠被正確的處理。

上一頁 | 首頁 | 下一頁
關於錯誤訊息的解釋 | 上一層 | 上傳多個文件


關於錯誤訊息的解釋

從 PHP 4.2.0 開始，PHP 將隨文件訊息陣列一起傳回一個對應的錯誤代碼。該代碼可以在文件上傳時產生的文件陣列中的 ['error'] 字段中被找到，也就是 $_FILES['userfile']['error']。

UPLOAD_ERR_OK

值：0; 沒有錯誤發生，文件上傳成功。

UPLOAD_ERR_INI_SIZE

值：1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。

UPLOAD_ERR_FORM_SIZE

值：2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。

UPLOAD_ERR_PARTIAL

值：3; 文件只有部分被上傳。

UPLOAD_ERR_NO_FILE

值：4; 沒有文件被上傳。

註: 這些在 PHP 4.3.0 之後變成了 PHP 常數。

上一頁 | 首頁 | 下一頁
文件上傳處理 | 上一層 | 一些注意事項


上傳多個文件

您可以對 input 域使用不同的 name 來上傳多個文件。

PHP 支援同時上傳多個文件並將它們的訊息自動以陣列的形式組織。要完成這項功能，您需要在 HTML 表單中對文件上傳域使用類似於多下拉選單和複選框的陣列名稱來送出。

註: 對多文件上傳的支援是在 3.0.10 版本增加的。

例子 18-3. 上傳多個文件

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br>
  <input name="userfile[]" type="file"><br>
  <input name="userfile[]" type="file"><br>
  <input type="submit" value="Send files">
</form>

當以上表單被送出後，陣列 $_FILES['userfile']、$_FILES['userfile']['name'] 和 $_FILES['userfile']['size'] 將被初始化（在 PHP 4.1.0 以前版本是 $HTTP_POST_FILES。如果 register_globals 的設置為 on，則和文件上傳相關的全域變數也將被初始化。）所有這些送出的訊息都將被儲存到以數字為索引的陣列中。

例如，假設名為 /home/test/review.html 和 /home/test/xwp.out 的文件被送出，則 $_FILES['userfile']['name'][0] 將包含文件 review.html 的名稱，而 $_FILES['userfile']['name'][1] 則將包含文件 xwp.out 的名稱。類似的，$_FILES['userfile']['size'][0] 將包含文件 review.html 的大小，依此類推。

$_FILES['userfile']['name'][0]、$_FILES['userfile']['tmp_name'][0]、$_FILES['userfile']['size'][0] 以及 $_FILES['userfile']['type'][0] 都將被同時設置並有效。

上一頁 | 首頁 | 下一頁
一些注意事項 | 上一層 | 對 PUT 方法的支援


對 PUT 方法的支援

PHP 提供對諸如 Netscape Composer 和 W3C Amaya 等客戶端使用的 HTTP PUT 方法的支援。PUT 請求比文件上傳要簡單的多，它們一般的形式為：

PUT /path/filename.html HTTP/1.1

這通常意味著遠程客戶端會將其中的 /path/filename.html 存儲到您的 WEB 目錄樹。讓 Apache 或者 PHP 自動允許所有人覆蓋您 WEB 目錄數下的任何文件顯然是很不明智的。因此，要處理類似的請求，您必須先告訴您的 WEB 伺服器您需要用特定的 PHP 腳本來處理該請求。在 Apache 下，您可以用 Script 選項來設置。它可以被放置到 Apache 配置文件中幾乎所有的位置。通常我們把它放置在 <Directory> 區域或者 <Virtualhost> 區域。您可以用如下一行來完成該設置：

Script PUT /put.php

這將告訴 Apache 將所有對 URIs 的 PUT 請求全部發送到 put.php 腳本，這些 URIs 必須和 PUT 命令中的內容相匹配。當然，這是建立在您的 PHP 支援 .php 擴展名，並且 PHP 已經在執行的假設之上。

在您的 put.php 文件中，您可以作如下操作：

<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>

這將會把文件拷貝到遠程客戶端請求的位置。您可能希望在文件拷貝之前進行一些檢查或者對用戶認証之類的操作。這裡唯一的問題是，當 PHP 接受到 PUT 方法的請求時，它將會把上傳的文件儲存到和其它用 POST 方法處理過的文件相同的臨時目錄。在請求結束時，臨時文件將被刪除。因此，您用來處理 PUT 的 PHP 腳本必須將該文件拷貝到其它的地方。該臨時文件的文件名被儲存在變數 $PHP_PUT_FILENAME 中，您也可以通過 $REQUEST_URI 變數獲得建議的目標文件名（在非 Apache WEB 伺服器上可能會有較大的變化）。該目標文件名是由遠程客戶端指定的。您也可以不聽從改客戶端的訊息，而把所有上傳的文件存儲到一個特殊的上傳目錄下。

上一頁 | 首頁 | 下一頁
上傳多個文件 | 上一層 | 使用遠程文件


被安全模式限制或屏蔽的函式

以下安全模式列表可能不完整或不正確。

表格 22-2. 安全模式限制函式

函式名 | 限制
dbmopen() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
dbase_open() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
filepro() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
filepro_rowcount() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
filepro_retrieve() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
ifx_*() | sql_safe_mode 限制, (!= safe mode)
ingres_*() | sql_safe_mode 限制, (!= safe mode)
mysql_*() | sql_safe_mode 限制, (!= safe mode)
pg_loimport() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
posix_mkfifo() | 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
putenv() | 遵循 ini 設置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 選項。請參考 putenv() 函式的有關文檔。
move_uploaded_file() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
chdir() | 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
dl() | 該函式在安全模式中已被屏蔽。
backtick operator | 該函式在安全模式中已被屏蔽。
shell_exec()（在功能上和 backticks 函式相同） | 該函式在安全模式中已被屏蔽。
exec() | 您只能在 safe_mode_exec_dir 設置的目錄下進行執行操作。基於某些原因，目前不能在可執行對象的路徑中使用 ..。
system() | 您只能在 safe_mode_exec_dir 設置的目錄下進行執行操作。基於某些原因，目前不能在可執行對象的路徑中使用 ..。
passthru() | 您只能在 safe_mode_exec_dir 設置的目錄下進行執行操作。基於某些原因，目前不能在可執行對象的路徑中使用 ..。
popen() | 您只能在 safe_mode_exec_dir 設置的目錄下進行執行操作。基於某些原因，目前不能在可執行對象的路徑中使用 ..。
mkdir() | 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
rmdir() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
rename() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
unlink() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
copy() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。 (on source and target)
chgrp() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
chown() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。
chmod() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 另外，您不能設置 SUID、SGID 和 sticky bits
touch() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。
symlink() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。 （注意：僅測試 target）
link() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。 （注意：僅測試 target）
getallheaders() | 在安全模式下，以“authorization”（區分大小寫）開頭的表頭訊息將不會被傳回。警告：getallheaders() 無法在 aol-server 下實現！
header() | 在安全模式下，如果您設置了 WWW-Authenticate，當前腳本的 uid 將被增加到該表頭訊息的 realm 部分。
highlight_file(), show_source() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。 （注意，僅在 4.2.1 版本後有效）
parse_ini_file() | 將檢查您將要操作的文件/目錄與正在執行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執行的腳本是否有相同的 UID。 （注意，僅在 4.2.1 版本後有效）
任何使用 php4/main/fopen_wrappers.c 的函式 | ??

上一頁 | 首頁 | 下一頁
安全模式 | 上一層 | PHP 的命令行模式


函式參考

PHP 手冊
上一頁 下一頁

IV. 函式參考

目錄
I. Apache 專用函式
II. 陣列函式庫
III. Aspell functions [deprecated]
IV. BCMath Arbitrary Precision Mathematics Functions
V. Bzip2 Compression Functions
VI. Calendar functions
VII. CCVS API Functions
VIII. COM support functions for Windows
IX. Class/Object Functions
X. ClibPDF functions
XI. Crack functions
XII. CURL, Client URL Library Functions
XIII. Cybercash payment functions
XIV. Crｅdit Mutuel CyberMUT functions
XV. Cyrus IMAP administration functions
XVI. Character type functions
XVII. Database (dbm-style) abstraction layer functions
XVIII. 時間日期函式庫
XIX. dBase functions
XX. DBM Functions
XXI. dbx functions
XXII. DB++ Functions
XXIII. Direct IO functions
XXIV. 目錄函式庫
XXV. DOM XML functions
XXVI. .NET functions
XXVII. Error Handling and Logging Functions
XXVIII. FrontBase Functions
XXIX. filePro functions
XXX. 文件系統函式庫
XXXI. Forms Data Format functions
XXXII. FriBiDi functions
XXXIII. FTP functions
XXXIV. Function Handling functions
XXXV. Gettext
XXXVI. GMP functions
XXXVII. HTTP functions
XXXVIII. Hyperwave functions
XXXIX. Hyperwave API functions
XL. iconv functions
XLI. Image functions
XLII. IMAP, POP3 and NNTP functions
XLIII. Informix functions
XLIV. InterBase functions
XLV. Ingres II functions
XLVI. IRC Gateway Functions
XLVII. PHP / Java Integration
XLVIII. LDAP functions
XLIX. Mail functions
L. mailparse functions
LI. 數學函式
LII. Multi-Byte String Functions
LIII. MCAL functions
LIV. Mcrypt Encryption Functions
LV. MCVE Payment Functions
LVI. Mhash Functions
LVII. Mimetype Functions
LVIII. Microsoft SQL Server functions
LIX. Ming functions for Flash
LX. Miscellaneous functions
LXI. mnoGoSearch Functions
LXII. mSQL functions
LXIII. MySQL 函式庫
LXIV. Mohawk Software session handler functions
LXV. muscat functions
LXVI. Network Functions
LXVII. Ncurses terminal screen control functions
LXVIII. Lotus Notes functions
LXIX. Unified ODBC functions
LXX. Object Aggregation/Composition Functions
LXXI. Oracle 8 函式
LXXII. OpenSSL functions
LXXIII. Oracle 函式
LXXIV. Ovrimos SQL functions
LXXV. Output Control Functions
LXXVI. Object property and method call overloading
LXXVII. PDF functions
LXXVIII. Verisign Payflow Pro functions
LXXIX. PHP Options&Information
LXXX. POSIX functions
LXXXI. PostgreSQL 資料庫函式庫
LXXXII. Process Control Functions
LXXXIII. Program Execution functions
LXXXIV. Printer functions
LXXXV. Pspell Functions
LXXXVI. GNU Readline
LXXXVII. GNU Recode functions
LXXXVIII. Regular Expression Functions (Perl-Compatible)
LXXXIX. qtdom functions
XC. Regular Expression Functions (POSIX Extended)
XCI. Semaphore, Shared Memory and IPC Functions
XCII. SESAM database functions
XCIII. Session handling functions
XCIV. Shared Memory Functions
XCV. Shockwave Flash functions
XCVI. SNMP functions
XCVII. Socket functions
XCVIII. String functions
XCIX. Sybase functions
C. Tokenizer functions
CI. URL Functions
CII. Variable Functions
CIII. vpopmail functions
CIV. W32api functions
CV. WDDX Functions
CVI. XML 語法解析函式
CVII. XML-RPC functions
CVIII. XSLT functions
CIX. YAZ functions
CX. YP/NIS Functions
CXI. Zip File Functions (Read Only Access)
CXII. Zlib Compression Functions
上一頁 | 首頁 | 下一頁
PHP 的命令行模式 |  | Apache 專用函式


addslashes

(PHP 3, PHP 4 )

addslashes -- Quote string with slashes

Description

string addslashes ( string str)

Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).

註: magic_quotes_gpc is ON by default.

See also stripslashes(),
htmlspecialchars(), and
quotemeta().

上一頁 | 首頁 | 下一頁
addcslashes | 上一層 | bin2hex


apache_child_terminate

(PHP 4 >= 4.0.5)

apache_child_terminate -- Terminate apache process after this request

Description

bool apache_child_terminate ( void)

apache_child_terminate() will register the Apache process executing the current PHP request for termination once execution of PHP code it is completed. It may be used to terminate a process after a script with high memory consumption has been run as memory will usually only be freed internally but not given back to the operating system.

註: The availability of this feature is controlled by the php.ini directive apache.child_terminate, which is set to off by default.

This feature is also not available on multithreaded versions of apache like the win32 version.

See also exit().

上一頁 | 首頁 | 下一頁
Apache 專用函式 | 上一層 | apache_lookup_uri


apache_lookup_uri

(PHP 3>= 3.0.4, PHP 4 )

apache_lookup_uri -- 為指定的URI執行部分請求並且傳回訊息有關URI的

描述

object apache_lookup_uri ( string filename)

這是URI傳回的部分請求. 這裡能獲得足夠的重要的訊息關於資源的類別並且傳回訊息。傳回的屬性class是:

狀態（status）
請求（the_request）
狀態行（status_line）
方式（method）
字元型別（content_type）
handler
uri
文件名（filename）
路徑訊息（path_info）
args
boundary
no_cache
no_local_copy
allowed
send_bodyct
bytes_sent
byterange
clength
unparsed_uri
mtime
request_time

註: apache_lookup_uri() 只工作在PHP的apache的模塊下

上一頁 | 首頁 | 下一頁
apache_child_terminate | 上一層 | apache_note


apache_note

(PHP 3>= 3.0.2, PHP 4 )

apache_note -- Get and set apache request notes

Description

string apache_note ( string note_name [, string note_value])

apache_note() is an Apache-specific function which gets and sets values in a request's notes table. If called with one argument, it returns the current value of note note_name. If called with two arguments, it sets the value of note note_name to note_value and returns the previous value of note note_name.

上一頁 | 首頁 | 下一頁
apache_lookup_uri | 上一層 | apache_request_headers


apache_request_headers

(PHP 4 CVS only)

apache_request_headers -- Fetch all HTTP request headers

Description

array apache_request_headers ( void)

apache_request_headers() returns an associative array of all the HTTP headers in the current request. This is only supported when PHP runs as an Apache module.

註:
      Prior to PHP 4.3.0, apache_request_headers() was
      called getallheaders().  After PHP 4.3.0,
      getallheaders() is an alias for
      apache_request_headers().

例子 1. apache_request_headers() Example

<?php
$headers = apache_request_headers();

foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}
?>

註: You can also get at the value of the common CGI variables by reading them from the environment, which works whether or not you are using PHP as an Apache module. Use phpinfo() to see a list of all of the available environment variables.

上一頁 | 首頁 | 下一頁
apache_note | 上一層 | apache_response_headers


apache_response_headers

(PHP 4 CVS only)

apache_response_headers -- Fetch all HTTP response headers

Description

array apache_response_headers ( void)

Returns an array of all Apache response headers. This functionality is only available in PHP version 4.3.0 and greater.

See also getallheaders() and headers_sent().

上一頁 | 首頁 | 下一頁
apache_request_headers | 上一層 | apache_setenv


apache_setenv

(PHP 4 >= 4.2.0)

apache_setenv -- Set an Apache subprocess_env variable

Description

int apache_setenv ( string variable, string value [, bool walk_to_top])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
apache_response_headers | 上一層 | ascii2ebcdic


array

(PHP 3, PHP 4 )

array -- 新建一個陣列

說明

array array ( [mixed ...])

傳回根據參數建立的陣列。參數可以用 => 運算符給出索引。

註: array() 是一個語言結構，用於字面上表示陣列，不是常規的函式。

語法“index => values”，用逗號分開，定義了索引和值。索引可以是字串或數字。如果省略了索引，會自動產生從 0 開始的整數索引。如果索引是整數，則下一個產生的索引將是目前最大的整數索引 + 1。注意如果定義了兩個完全一樣的索引，則後面一個會覆蓋前一個。

下面的例子演示了怎樣建立一個二維陣列，怎樣給相應的陣列指定鍵名，以及怎樣在普通陣列中略過和繼續數字索引。

例子 1. array() 例子

$fruits = array (
    "fruits"  => array ("a"=>"orange", "b"=>"banana", "c"=>"apple"),
    "numbers" => array (1, 2, 3, 4, 5, 6),
    "holes"   => array ("first", 5 => "second", "third")
);

例子 2. array() 的自動索引

$array = array( 1, 1, 1, 1,  1, 8=>1,  4=>1, 19, 3=>13);
print_r($array);

將顯示：
Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 13
    [4] => 1
    [8] => 1
    [9] => 19
)

注意索引 3 被定義了兩次，保留了最後的值 13。索引 4 在 索引 8 之後定義，下一個自動產生的索引（值為 19 那個）為 9，因為最大的索引是 8。

本例建立了從 1 開始的陣列。

例子 3. 從 1 開始索引的 array()

$firstquarter  = array(1 => 'January', 'February', 'March');
print_r($firstquarter);

將顯示：
Array
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)

參見 array_pad()，list() 和 range()。

上一頁 | 首頁 | 下一頁
array_walk | 上一層 | arsort


array_change_key_case

(PHP 4 >= 4.2.0)

array_change_key_case -- 傳回字串鍵名全為小寫或大寫的陣列

說明

array array_change_key_case ( array input [, int case])

array_change_key_case() 將 input 陣列中的所有鍵名改為全小寫或大寫。改變是根據後一個選項 case 參數來進行的。可以在這裡用兩個常數，CASE_UPPER 和 CASE_LOWER。預設值是 CASE_LOWER。本函式不改變數字索引。

例子 1. array_change_key_case() 例子

$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));

以上程序顯示結果為：
Array
(
    [FIRST] => 1
    [SECOND] => 2
)

上一頁 | 首頁 | 下一頁
陣列函式庫 | 上一層 | array_chunk


array_chunk

(PHP 4 >= 4.2.0)

array_chunk -- 將一個陣列分割成多個

說明

array array_chunk ( array input, int size [, bool preserve_keys])

array_chunk() 將一個陣列分割成多個陣列，其中每個陣列的單元數目由 size 決定。最後一個陣列的單元數目可能會少幾個。得到的陣列是一個多維陣列中的單元，其索引從零開始。

將可選參數 preserve_keys 設為 TRUE，可以使 PHP 保留輸入陣列中原來的鍵名。如果你指定了 FALSE，那每個結果陣列將用從零開始的新數字索引。預設值是 FALSE。

例子 1. array_chunk() 例子

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, TRUE));

以上程序輸出為：
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)

上一頁 | 首頁 | 下一頁
array_change_key_case | 上一層 | array_count_values


array_count_values

(PHP 4 )

array_count_values -- 統計陣列中所有的值出現的次數

說明

array array_count_values ( array input)

array_count_values() 傳回一個陣列，該陣列用 input 陣列中的值作為鍵名，該值在 input 陣列中出現的次數作為值。

例子 1. array_count_values() 例子

$array = array (1, "hello", 1, "world", "hello");
print_r(array_count_values ($array));

以上程序輸出為：
Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

上一頁 | 首頁 | 下一頁
array_chunk | 上一層 | array_diff


array_diff

(PHP 4 >= 4.0.1)

array_diff -- 計算陣列的差集

說明

array array_diff ( array array1, array array2 [, array ...])

array_diff() 傳回一個陣列，該陣列包括了所有在 array1 中但是不在任何其它參數陣列中的值。注意鍵名保留不變。

例子 1. array_diff() 例子

$array1 = array ("a" => "green", "red", "blue", "red");
$array2 = array ("b" => "green", "yellow", "red");
$result = array_diff ($array1, $array2);

這使得 $result 成為 array (1 => "blue");。在 $array1 中多次出現的值同樣對待。

註: 兩個單元僅在 (string) $elem1 === (string) $elem2 時被認為是相同的。也就是說，當字串的表達是一樣的時候。

註: 注意此函式僅檢查多維陣列中的一維。當然你可以用 array_diff($array1[0], $array2[0]); 檢查更深的維度。

警告

本函式在 PHP 4.0.4 中是壞的！

參見 array_intersect()。

上一頁 | 首頁 | 下一頁
array_count_values | 上一層 | array_fill


array_fill

(PHP 4 >= 4.2.0)

array_fill -- 用給定的值填充陣列

說明

array array_fill ( int start_index, int num, mixed value)

array_fill() 用 value 參數的值將一個陣列填充 num 個條目，鍵名由 start_index 參數指定的開始。

例子 1. array_fill() 例子

$a = array_fill(5, 6, 'banana');

用 print_r() 查看 $a 顯示如下：
Array
(
    [5]  => banana
    [6]  => banana
    [7]  => banana
    [8]  => banana
    [9]  => banana
    [10] => banana
)

上一頁 | 首頁 | 下一頁
array_diff | 上一層 | array_filter


array_filter

(PHP 4 >= 4.0.6)

array_filter -- 用回調函式過濾陣列中的單元

說明

array array_filter ( array input [, mixed callback])

array_filter() 傳回一個陣列，該陣列包含了 input 陣列經過回調函式過濾後的所有單元。如果 input 是一個結合陣列，則鍵名保留。

例子 1. array_filter() 例子

function odd($var) {
    return ($var % 2 == 1);
}

function even($var) {
    return ($var % 2 == 0);
}

$array1 = array ("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array (6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));

以上程序的輸出為：
Odd :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Even:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

註: 第二個參數函式名可以替換為一個陣列，該陣列由一個對象名和該對象名的一個方法名兩個元素組成。

用戶不應在回調函式中修改陣列本身。例如增加／刪除單元或者對 array_filter() 正在作用的陣列進行 unset。如果陣列改變了，此函式的行為沒有定義。

參見 array_map() 和 array_reduce()。

上一頁 | 首頁 | 下一頁
array_fill | 上一層 | array_flip


array_flip

(PHP 4 )

array_flip -- 反轉陣列中的鍵和值

說明

array array_flip ( array trans)

array_flip() 傳回一個反轉後的 array，例如 trans 中的鍵名變成了值，而 trans 中的值成了鍵名。

注意 trans 中的值需要能夠作為合法的鍵名，例如需要是 integer 或者 string。如果值的型別不對將發出一個警告，並且有問題的鍵／值對將不會反轉。

如果同一個值出現了多次，則最後一個鍵名將作為它的值，所有其它的都丟失了。

array_flip() 如果失敗傳回 FALSE。

例子 1. array_flip() 例子

$trans = array_flip ($trans);
$original = strtr ($str, $trans);

例子 2. array_flip() 例子：衝突

$trans = array ("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip ($trans);
print_r($trans);

現在 $trans 變成了：
Array
(
    [1] => b
    [2] => c
)

上一頁 | 首頁 | 下一頁
array_filter | 上一層 | array_intersect


array_intersect

(PHP 4 >= 4.0.1)

array_intersect -- 計算陣列的交集

說明

array array_intersect ( array array1, array array2 [, array ...])

array_intersect() 傳回一個陣列，該陣列包含了所有在 array1 中也同時出現在所有其它參數陣列中的值。注意鍵名保留不變。

例子 1. array_intersect() 例子

$array1 = array ("a" => "green", "red", "blue");
$array2 = array ("b" => "green", "yellow", "red");
$result = array_intersect ($array1, $array2);

這使得 $result 成為：
Array
(
    [a] => green
    [0] => red
)

註: 兩個單元僅在 (string) $elem1 === (string) $elem2 時被認為是相同的。也就是說，當字串的表達是一樣的時候。

警告

本函式在 PHP 4.0.4 中是壞的！

參見 array_diff()。

上一頁 | 首頁 | 下一頁
array_flip | 上一層 | array_key_exists


array_key_exists

(PHP 4 >= 4.1.0)

array_key_exists -- 檢查給定的鍵名或索引是否存在於陣列中

說明

bool array_key_exists ( mixed key, array search)

array_key_exists() 在給定的 key 存在於陣列中時傳回 TRUE。key 可以是任何能作為陣列索引的值。

例子 1. array_key_exists() 例子

$search_array = array("first" => 1, "second" => 4);
if (array_key_exists("first", $search_array)) {
    echo "The 'first' element is in the array";
}

註: 在 PHP 4.0.6 中本函式名為 key_exists()。

參見 isset()。

上一頁 | 首頁 | 下一頁
array_intersect | 上一層 | array_keys


array_keys

(PHP 4 )

array_keys -- 傳回陣列中所有的鍵名

說明

array array_keys ( array input [, mixed search_value])

array_keys() 傳回 input 陣列中的數字或者字串的鍵名。

如果指定了可選參數 search_value，則只傳回該值的鍵名。否則 input 陣列中的所有鍵名都會被傳回。

例子 1. array_keys() 例子

$array = array (0 => 100, "color" => "red");
print_r(array_keys ($array));

$array = array ("blue", "red", "green", "blue", "blue");
print_r(array_keys ($array, "blue"));

$array = array ("color" => array("blue", "red", "green"),
                "size" => array("small", "medium", "large"));
print_r(array_keys ($array));

以上程序輸出為：
Array
(
    [0] => 0
    [1] => color
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
Array
(
    [0] => color
    [1] => size
)

註: 本函式是 PHP 4 新增的，下面是仍在使用 PHP 3 的用戶的實現方法：

例子 2. array_keys() 在 PHP 3 中的實現

function array_keys ($arr, $term="") {
    $t = array();
    while (list($k,$v) = each($arr)) {
        if ($term && $v != $term) {
            continue;
        }
        $t[] = $k;
    }
    return $t;
}

參見 array_values()。

上一頁 | 首頁 | 下一頁
array_key_exists | 上一層 | array_map


array_map

(PHP 4 >= 4.0.6)

array_map -- 將回調函式作用到給定陣列的單元上

說明

array array_map ( mixed callback, array arr1 [, array arr2...])

array_map() 傳回一個陣列，該陣列包含了 arr1 中的所有單元經過回調函式作用過之後的單元。回調函式接受的參數數目應該和傳遞給 array_map() 函式的陣列數目一致。

例子 1. array_map() 例子

function cube($n) {
    return $n*$n*$n;
}

$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);

這使得 $b 成為：
Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

例子 2. array_map() - 使用更多的陣列

function show_Spanish($n, $m) {
    return "The number $n is called $m in Spanish";
}

function map_Spanish($n, $m) {
    return array ($n => $m);
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");

$c = array_map("show_Spanish", $a, $b);
print_r($c);

$d = array_map("map_Spanish", $a , $b);
print_r($d);

結果為：
// printout of $c
Array
(
    [0] => The number 1 is called uno in Spanish
    [1] => The number 2 is called dos in Spanish
    [2] => The number 3 is called tres in Spanish
    [3] => The number 4 is called cuatro in Spanish
    [4] => The number 5 is called cinco in Spanish
)

// printout of $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

    [1] => Array
        (
            [2] => dos
        )

    [2] => Array
        (
            [3] => tres
        )

    [3] => Array
        (
            [4] => cuatro
        )

    [4] => Array
        (
            [5] => cinco
        )

)

通常使用了兩個或更多陣列時，它們的長度應該相同，因為回調函式是平行作用於相應的單元上的。如果陣列的長度不同，則最短的一個將被用空的單元擴充。

本函式一個有趣的用法是建構一個陣列的陣列，這可以很容易的通過用 NULL 作為回調函式名來實現。

例子 3. 建立一個陣列的陣列

$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");

$d = array_map(null, $a, $b, $c);
print_r($d);

以上程序輸出為：
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

參見 array_filter() 和 array_reduce()。

上一頁 | 首頁 | 下一頁
array_keys | 上一層 | array_merge_recursive


array_merge

(PHP 4 )

array_merge -- 合並兩個或多個陣列

說明

array array_merge ( array array1, array array2 [, array ...])

array_merge() 將兩個或多個陣列的單元合並起來，一個陣列中的值附加在前一個陣列的後面。傳回作為結果的陣列。

如果輸入的陣列中有相同的字串鍵名，則該鍵名後面的值將覆蓋前一個值。然而，如果陣列包含數字鍵名，後面的值將不會覆蓋原來的值，而是附加到後面。

例子 1. array_merge() 例子

$array1 = array ("color" => "red", 2, 4);
$array2 = array ("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge ($array1, $array2);

$result 成為：
Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)

例子 2. 簡單的 array_merge() 例子

$array1 = array();
$array2 = array(1 => "data");
$result = array_merge($array1, $array2);

別忘了數字鍵名將會被重新編號！
Array
(
    [0] => data
)

如果你想完全保留原有陣列並只想新的陣列附加到後面，用 + 運算符：
$array1 = array();
$array2 = array(1 => "data");
$result = $array1 + $array2;
數字鍵名將被保留從而原來的關聯保持不變。
Array
(
    [1] => data
)

註: 共有的鍵名將根據先來先服務的原則被覆蓋掉。

參見 array_merge_recursive()。

上一頁 | 首頁 | 下一頁
array_merge_recursive | 上一層 | array_multisort


array_merge_recursive

(PHP 4 >= 4.0.1)

array_merge_recursive -- 遞歸地合並兩個或多個陣列

說明

array array_merge_recursive ( array array1, array array2 [, array ...])

array_merge_recursive() 將兩個或多個陣列的單元合並起來，一個陣列中的值附加在前一個陣列的後面。傳回作為結果的陣列。

如果輸入的陣列中有相同的字串鍵名，則這些值會被合並到一個陣列中去，這將遞歸下去，因此如果一個值本身是一個陣列，本函式將按照相應的條目把它合並為另一個陣列。然而，如果陣列具有相同的陣列鍵名，後一個值將不會覆蓋原來的值，而是附加到後面。

例子 1. array_merge_recursive() 例子

$ar1 = array ("color" => array ("favorite" => "red"), 5);
$ar2 = array (10, "color" => array ("favorite" => "green", "blue"));
$result = array_merge_recursive ($ar1, $ar2);

$result 成為：
Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red
                    [1] => green
                )

            [0] => blue
        )

    [0] => 5
    [1] => 10
)

參見 array_merge()。

上一頁 | 首頁 | 下一頁
array_map | 上一層 | array_merge


array_multisort

(PHP 4 )

array_multisort -- 對多個陣列或多維陣列進行排序

說明

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]])

array_multisort() 可以用來一次對多個陣列進行排序或者根據某一維對多維陣列進行排序。排序時保留原有的鍵名關聯。

輸入陣列被當成一個表的列並以行來排序 － 這類似於 SQL 的 ORDER BY 子句的功能。第一個陣列是要排序的主要陣列。陣列中的行（值）比較為相同的話就按照下一個輸入陣列中相應值的大小來排序，依此類推。

本函式的參數結構有些不同尋常，但是非常靈活。第一個參數必須是一個陣列。接下來的每個參數可以是陣列或者是下面列出的排序標志。

排序順序標志：

  • SORT_ASC - 按照上升順序排序

  • SORT_DESC - 按照下降順序排序

排序型別標志：

  • SORT_REGULAR - 將項目按照通常方法比較

  • SORT_NUMERIC - 將項目按照數值比較

  • SORT_STRING - 將項目按照字串比較

每個陣列之後不能指定兩個同類的排序標志。每個陣列後指定的排序標志僅對該陣列有效，預設值為 SORT_ASC 和 SORT_REGULAR。

如果成功則傳回 TRUE，失敗則傳回 FALSE。

例子 1. 對多個陣列排序

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);

本例中經過排序後，第一個陣列將包含 10，"a"，100，100。第二個陣列將包含 1，1，"2"，3。第二個陣列中的項目順序完全和第一個陣列中相應的項目（100 和 100）順序一致。

例子 2. 對多維陣列排序

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
                 $ar[1], SORT_NUMERIC, SORT_DESC);

本例中經過排序後，第一個陣列將包含 10，100，100，"a"（作為字串上升排序），第二個陣列將包含 1，3，"2"，1（作為數值下降排序）。

【譯者注】本函式相當有用，為有助於理解，請看下面這個例子：

例子 3. 名次排列

$grade = array("score" => array(70, 95, 70.0, 60, "70"),
               "name" => array("Zhang San", "Li Si", "Wang Wu",
                               "Zhao Liu", "Liu Qi"));
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,
                // 將分數作為數值，由高到低排序
                $grade["name"], SORT_STRING, SORT_ASC);
                // 將名字作為字串，由小到大排序
var_dump($grade);

上例輸出結果如下：
array(2) {
  ["score"]=>
  array(5) {
    [0]=>
    int(95)
    [1]=>
    string(2) "70"
    [2]=>
    float(70)
    [3]=>
    int(70)
    [4]=>
    int(60)
  }
  ["name"]=>
  array(5) {
    [0]=>
    string(5) "Li Si"
    [1]=>
    string(6) "Liu Qi"
    [2]=>
    string(7) "Wang Wu"
    [3]=>
    string(9) "Zhang San"
    [4]=>
    string(8) "Zhao Liu"
  }
}
本例中對包含成績的陣列 $grade 按照分數（score）由高到低進行排序，分數相同的人則按照名字（name）由小到大排序。排序後李四 95 分為第一名，趙六 60 分為第五名沒有異議。張三、王五和劉七都是 70 分，他們的名次則由其姓名的字母順序排列，Liu 在前，Wang 在後而 Zhang 在最後。為了區別，三個 70 分分別用了整數，浮點數和字串來表示，可以在程序輸出中清楚地看到它們排序的結果。

上一頁 | 首頁 | 下一頁
array_merge | 上一層 | array_pad


array_pad

(PHP 4 )

array_pad -- 用值將陣列填補到指定長度

說明

array array_pad ( array input, int pad_size, mixed pad_value)

array_pad() 傳回 input 的一個拷貝，並用 pad_value 將其填補到 pad_size 指定的長度。如果 pad_size 為正，則陣列被填補到右側，如果為負則從左側開始填補。如果 pad_size 的絕對值小於或等於 input 陣列的長度則沒有任何填補。

例子 1. array_pad() 例子

$input = array (12, 10, 9);

$result = array_pad ($input, 5, 0);
// result is array (12, 10, 9, 0, 0)

$result = array_pad ($input, -7, -1);
// result is array (-1, -1, -1, -1, 12, 10, 9)

$result = array_pad ($input, 2, "noop");
// not padded

上一頁 | 首頁 | 下一頁
array_multisort | 上一層 | array_pop


array_pop

(PHP 4 )

array_pop -- 將陣列最後一個單元彈出（出棧）

說明

mixed array_pop ( array array)

array_pop() 彈出並傳回 array 陣列的最後一個單元，並將陣列 array 的長度減一。如果 array 為空（或者不是陣列）將傳回 NULL。

例子 1. array_pop() 例子

$stack = array ("orange", "banana", "apple", "raspberry");
$fruit = array_pop ($stack);

經過此操作後，$stack 將只有 3 個單元：
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
並且 rasberry 將被賦給 $fruit。

警告

這個函式可能傳回 Boolean FALSE，也可能傳回一個與 FALSE 相等地非 Boolean 值，比如 0 或者 "" 。請參閱 Booleans 的有關章節以獲取更多訊息。請使用 === 操作符 來測試該函式的傳回值。

參見 array_push()，array_shift() 和 array_unshift()。

上一頁 | 首頁 | 下一頁
array_pad | 上一層 | array_push


array_push

(PHP 4 )

array_push -- 將一個或多個單元壓入陣列的末尾（入棧）

說明

int array_push ( array array, mixed var [, mixed ...])

array_push() 將 array 當成一個棧，並將傳入的變數壓入 array 的末尾。 array 的長度將增加入棧變數的數目。和如下效果相同：
$array[] = $var;
並對每個 var 重複以上動作。

傳回陣列新的單元總數。

例子 1. array_push() 例子

$stack = array ("orange", "banana");
array_push ($stack, "apple", "raspberry");

本例將使 $stack 具有如下單元：
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)

參見 array_pop()，array_shift() 和 array_unshift()。

上一頁 | 首頁 | 下一頁
array_pop | 上一層 | array_rand


array_rand

(PHP 4 )

array_rand -- 從陣列中隨機取出一個或多個單元

說明

mixed array_rand ( array input [, int num_req])

array_rand() 在你想從陣列中取出一個或多個隨機的單元時相當有用。它接受 input 作為輸入陣列和一個可選的參數 num_req，指明了你想取出多少個單元 － 如果沒有指定，預定為 1。

如果你只取出一個，array_rand() 傳回一個隨機單元的鍵名，否則就傳回一個包含隨機鍵名的陣列。這樣你就可以隨機從陣列中取出鍵名和值。

不要忘記呼叫 srand() 來撒下隨機數發生器的種子。

例子 1. array_rand() 例子

srand ((float) microtime() * 10000000);
$input = array ("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand ($input, 2);
print $input[$rand_keys[0]]."\n";
print $input[$rand_keys[1]]."\n";

上一頁 | 首頁 | 下一頁
array_push | 上一層 | array_reduce


array_reduce

(PHP 4 >= 4.0.5)

array_reduce -- 用回調函式迭代地將陣列簡化為單一的值

說明

mixed array_reduce ( array input, mixed callback [, int initial])

array_reduce() 將回調函式 callback 迭代地作用到 input 陣列中的每一個單元中，從而將陣列簡化為單一的值。如果指定了可選參數 initial，該參數將被當成是陣列中的第一個值來處理，或者如果陣列為空的話就作為最終傳回值。

例子 1. array_reduce() 例子

function rsum($v, $w) {
    $v += $w;
    return $v;
}

function rmul($v, $w) {
    $v *= $w;
    return $v;
}

$a = array(1, 2, 3, 4, 5);
$x = array();
$b = array_reduce($a, "rsum");
$c = array_reduce($a, "rmul", 10);
$d = array_reduce($x, "rsum", 1);

這將使 $b 的值為 15，$c 的值為 1200（= 1*2*3*4*5*10），以及 $d 的值為 1。

參見 array_filter() 和 array_map()。

上一頁 | 首頁 | 下一頁
array_rand | 上一層 | array_reverse


array_reverse

(PHP 4 )

array_reverse -- 傳回一個單元順序相反的陣列

說明

array array_reverse ( array array [, bool preserve_keys])

array_reverse() 接受陣列 array 作為輸入並傳回一個單元為相反順序的新陣列，如果 preserve_keys 為 TRUE 則保留原來的鍵名。

例子 1. array_reverse() 例子

$input  = array ("php", 4.0, array ("green", "red"));
$result = array_reverse ($input);
$result_keyed = array_reverse ($input, TRUE);

這將使 $result 和 $result_keyed 具有相同的單元，但是注意鍵名的區別。$result 和 $result_keyed 的顯示輸出顯示分別為：
Array
(
    [0] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [2] => php
)
Array
(
    [2] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [0] => php
)

註: 第二個參數是 PHP 4.0.3 中新加的。

上一頁 | 首頁 | 下一頁
array_reduce | 上一層 | array_search


array_search

(PHP 4 >= 4.0.5)

array_search -- 在陣列中搜索給定的值，如果成功則傳回相應的鍵名

說明

mixed array_search ( mixed needle, array haystack [, bool strict])

在 haystack 中搜索 needle 參數並在找到的情況下傳回鍵名，否則傳回 FALSE。

註: 在 PHP 4.2.0 之前，array_search() 在失敗時傳回 NULL 而不是 FALSE。

如果可選的第三個參數 strict 為 TRUE，則 array_search() 還將在 haystack 中檢查 needle 的型別。

警告

這個函式可能傳回 Boolean FALSE，也可能傳回一個與 FALSE 相等地非 Boolean 值，比如 0 或者 "" 。請參閱 Booleans 的有關章節以獲取更多訊息。請使用 === 操作符 來測試該函式的傳回值。

參見 array_keys() 和 in_array()。

上一頁 | 首頁 | 下一頁
array_reverse | 上一層 | array_shift


array_shift

(PHP 4 )

array_shift -- 將陣列開頭的單元移出陣列

說明

mixed array_shift ( array array)

array_shift() 將 array 的第一個單元移出並作為結果傳回，將 array 的長度減一並將所有其它單元向前移動一位。所有的數字鍵名將改為從零開始計數，文字鍵名將不變。如果 array 為空（或者不是陣列），則傳回 NULL。

例子 1. array_shift() 例子

$stack = array ("orange", "banana", "apple", "raspberry");
$fruit = array_shift ($stack);

這將使 $stack 剩下 3 個單元：
Array
(
    [0] => banana
    [1] => apple
    [2] => raspberry
)
並且 orange 被賦給了 $fruit。

參見 array_unshift()，array_push() 和 array_pop()。

上一頁 | 首頁 | 下一頁
array_search | 上一層 | array_slice


array_slice

(PHP 4 )

array_slice -- 從陣列中取出一段

說明

array array_slice ( array array, int offset [, int length])

array_slice() 傳回根據 offset 和 length 參數所指定的 array 陣列中的一段序列。

如果 offset 為正，則序列將從 array 中的此偏移量開始。如果 offset 為負，則序列將從 array 中距離末端這麼遠的地方開始。

如果給出了 length 並且為正，則序列中將具有這麼多的單元。如果給出了 length 並且為負，則序列將終止在距離陣列末端這麼遠的地方。如果省略，則序列將從 offset 開始一直到 array 的末端。

注意 array_slice() 將忽略鍵名，並且是根據單元在陣列中的實際位置來計算偏移量和長度的。

例子 1. array_slice() 例子

$input = array ("a", "b", "c", "d", "e");

$output = array_slice ($input, 2);      // returns "c", "d", and "e"
$output = array_slice ($input, 2, -1);  // returns "c", "d"
$output = array_slice ($input, -2, 1);  // returns "d"
$output = array_slice ($input, 0, 3);   // returns "a", "b", and "c"

參見 array_splice()。

上一頁 | 首頁 | 下一頁
array_shift | 上一層 | array_splice


array_splice

(PHP 4 )

array_splice -- 把陣列中的一部分去掉並用其它值取代

說明

array array_splice ( array input, int offset [, int length [, array replacement]])

array_splice() 把 input 陣列中由 offset 和 length 指定的單元去掉，如果提供了 replacement 參數，則用 replacement 陣列中的單元取代。傳回一個包含有被移除單元的陣列。

如果 offset 為正，則從 input 陣列中該值指定的偏移量開始移除。如果 offset 為負，則從 input 末尾倒數該值指定的偏移量開始移除。

如果省略 length，則移除陣列中從 offset 到結尾的所有部分。如果指定了 length 並且為正值，則移除這麼多單元。如果指定了 length 並且為負值，則移除從 offset 到陣列末尾倒數 length 為止中間所有的單元。小竅門：當給出了 replacement 時要移除從 offset 到陣列末尾所有單元時，用 count($input) 作為 length。

如果給出了 replacement 陣列，則被移除的單元被此陣列中的單元替代。如果 offset 和 length 的組合結果是不會移除任何值，則 replacement 陣列中的單元將被插入到 offset 指定的位置。小竅門：如果用來替換的值只是一個單元，那麼不需要給它加上 array()，除非該單元本身就是一個陣列。

以下的表達式具有同樣效果：
array_push ($input, $x, $y)     array_splice ($input, count ($input), 0, array ($x, $y))
array_pop ($input)              array_splice ($input, -1)
array_shift ($input)            array_splice ($input, 0, 1)
array_unshift ($input, $x, $y)  array_splice ($input, 0, 0, array ($x, $y))
$input[$x] = $y                 array_splice ($input, $x, 1, $y)

傳回一個包含被移除單元的陣列。

例子 1. array_splice() 例子

$input = array ("red", "green", "blue", "yellow");
array_splice ($input, 2);
// $input is now array ("red", "green")

$input = array ("red", "green", "blue", "yellow");
array_splice ($input, 1, -1);
// $input is now array ("red", "yellow")

$input = array ("red", "green", "blue", "yellow");
array_splice ($input, 1, count($input), "orange");
// $input is now array ("red", "orange")

$input = array ("red", "green", "blue", "yellow");
array_splice ($input, -1, 1, array("black", "maroon"));
// $input is now array ("red", "green",
//          "blue", "black", "maroon")

參見 array_slice()。

上一頁 | 首頁 | 下一頁
array_slice | 上一層 | array_sum


array_sum

(PHP 4 >= 4.0.4)

array_sum -- 計算陣列中所有值的和

說明

mixed array_sum ( array array)

array_sum() 將陣列中的所有值的和以整數或浮點數的結果傳回。

例子 1. array_sum() 例子

$a = array(2, 4, 6, 8);
echo "sum(a) = ".array_sum($a)."\n";

$b = array("a"=>1.2,"b"=>2.3,"c"=>3.4);
echo "sum(b) = ".array_sum($b)."\n";

以上程序輸出為：
sum(a) = 20
sum(b) = 6.9

註: PHP 4.0.6 之前的版本修改了傳入的陣列本身，將其中的字串值轉換成數值（大多數情況下都轉換成了零，根據具體值而定）。

上一頁 | 首頁 | 下一頁
array_splice | 上一層 | array_unique


array_unique

(PHP 4 >= 4.0.1)

array_unique -- 移除陣列中重複的值

說明

array array_unique ( array array)

array_unique() 接受 array 作為輸入並傳回沒有重複值的新陣列。

注意鍵名保留不變。array_unique() 先將值作為字串排序，然後對每個值只保留第一個遇到的鍵名，接著忽略所有後面的鍵名。這並不意味著在未排序的 array 中同一個值的第一個出現的鍵名會被保留。

註: 當且僅當 (string) $elem1 === (string) $elem2 時兩個單元被認為相同。就是說，當字串的表達一樣時。

第一個單元將被保留。

警告

本函式在 PHP 4.0.4 中是壞的！

例子 1. array_unique() 例子

$input = array ("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique ($input);
print_r($result);

上例將輸出：
Array
(
    [b] => green
    [1] => blue
    [2] => red
)

例子 2. array_unique() 和型別

$input = array (4,"4","3",4,3,"3");
$result = array_unique ($input);
var_dump($result);

以上程序輸出結果為（PHP 4.0.6）：
array(2) {
  [0]=>
  int(4)
  [2]=>
  string(1) "3"
}

上一頁 | 首頁 | 下一頁
array_sum | 上一層 | array_unshift


array_unshift

(PHP 4 )

array_unshift -- 在陣列開頭插入一個或多個單元

說明

int array_unshift ( array array, mixed var [, mixed ...])

array_unshift() 將傳入的單元插入到 array 陣列的開頭。注意單元是作為整體被插入的，因此傳入單元將保持同樣的順序。所有的數值鍵名將修改為從零開始重新計數，所有的文字鍵名保持不變。

傳回 array 陣列新的單元數目。

例子 1. array_unshift() 例子

$queue = array ("orange", "banana");
array_unshift ($queue, "apple", "raspberry");

這將使 $queue 包含如下單元：
Array
(
    [0] => apple
    [1] => raspberry
    [2] => orange
    [3] => banana
)

參見 array_shift()，array_push() 和 array_pop()。

上一頁 | 首頁 | 下一頁
array_unique | 上一層 | array_values


array_values

(PHP 4 )

array_values -- 傳回陣列中所有的值

說明

array array_values ( array input)

array_values() 傳回 input 陣列中所有的值。

例子 1. array_values() 例子

$array = array ("size" => "XL", "color" => "gold");
print_r(array_values ($array));

上例將輸出：
Array
(
    [0] => XL
    [1] => gold
)

註: 本函式是 PHP 4 新加的，以下是 PHP 3 的實現：

例子 2. array_values() 對PHP 3 用戶的實現

function array_values ($arr) {
    $t = array();
    while (list($k, $v) = each ($arr)) {
        $t[] = $v;
    }
    return $t;
}

參見 array_keys()。

上一頁 | 首頁 | 下一頁
array_unshift | 上一層 | array_walk


array_walk

(PHP 3>= 3.0.3, PHP 4 )

array_walk -- 對陣列中的每個成員應用用戶函式

說明

int array_walk ( array array, string func [, mixed userdata])

對 array 陣列的每個單元應用用戶自定義函式 func。陣列中的值作為第一個參數，鍵名作為第二個參數傳入 func 函式。如果提供了 userdata，將會被作為第三個參數傳入用戶函式。func 必須是一個用戶自定義函式，而不能是 PHP 本來有的函式。因此不能在 array_walk() 中直接使用 str2lower()，必須先建立一個用戶自定義函式，再把這個函式名當作參數傳遞進去。

註: 第二個參數函式名可以替換為一個陣列，該陣列由一個對象名和該對象名的一個方法名兩個元素組成。

如果 func 需要超過兩個或三個參數（根據 userdata），每次 array_walk() 呼叫 func 都會產生一個警告。這些警告可以通過在 array_walk() 呼叫的前面加上“@”符號來抑制住，或者通過 error_reporting()。

註: 如果 func 需要直接作用於陣列中的值，則 func 定義中的第一個參數應該用引用傳遞。這樣任何對這些單元的改變也將會改變陣列本身。

在 func 中修改陣列可能會產生不可預知的行為。

註: 將鍵名和 userdata 傳遞到 func 中是 PHP 4.0 新增加的。

在 PHP 4 中需要呼叫 reset()，因為 array_walk() 預定不會重置陣列。

用戶最好不要在回調函式中修改陣列本身。例如增加／刪除單元，unset array_walk() 正在作用的陣列。如果陣列改變了，本函式的行為沒有定義。

例子 1. array_walk() 例子

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");

function test_alter (&$item1, $key, $prefix) {
    $item1 = "$prefix: $item1";
}

function test_print ($item2, $key) {
    echo "$key. $item2<br>\n";
}
echo "Before ...:\n";
array_walk ($fruits, 'test_print');
reset ($fruits);
array_walk ($fruits, 'test_alter', 'fruit');
echo "... and after:\n";
reset ($fruits);
array_walk ($fruits, 'test_print');

以上程序輸出為：
Before ...:
d. lemon
a. orange
b. banana
c. apple
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple

參見 each() 和 list()。

上一頁 | 首頁 | 下一頁
array_values | 上一層 | array


arsort

(PHP 3, PHP 4 )

arsort -- 對陣列進行逆向排序並保持索引關係

說明

void arsort ( array array [, int sort_flags])

本函式對陣列進行排序，陣列的索引保持和單元的關聯。主要用於對那些單元順序很重要的結合陣列進行排序。

例子 1. arsort() 例子

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

本例輸出如下：
a = orange
d = lemon
b = banana
c = apple

fruits 被按照字母順序逆向排序，並且單元的索引關係不變。

可以用可選的參數 sort_flags 改變排序的行為，詳情見 sort()。

參見 asort()，rsort()，ksort() 和 sort()。

上一頁 | 首頁 | 下一頁
array | 上一層 | asort


ascii2ebcdic

(PHP 3>= 3.0.17)

ascii2ebcdic -- Translate string from ASCII to EBCDIC

Description

int ascii2ebcdic ( string ascii_str)

ascii2ebcdic() is an Apache-specific function which is available only on EBCDIC based operating systems (OS/390, BS2000). It translates the ASCII encoded string ascii_str to its equivalent EBCDIC representation (binary safe), and returns the result.

See also the reverse function ebcdic2ascii()

上一頁 | 首頁 | 下一頁
apache_setenv | 上一層 | ebcdic2ascii


asort

(PHP 3, PHP 4 )

asort -- 對陣列進行排序並保持索引關係

說明

void asort ( array array [, int sort_flags])

本函式對陣列進行排序，陣列的索引保持和單元的關聯。主要用於對那些單元順序很重要的結合陣列進行排序。

例子 1. asort() 例子

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
asort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

本例顯示為：
c = apple
b = banana
d = lemon
a = orange

fruits 被按照字母順序排序，並且單元的索引關係不變。

可以用可選的參數 sort_flags 改變排序的行為，詳情見 sort()。

參見 arsort()，rsort()，ksort() 和 sort()。

上一頁 | 首頁 | 下一頁
arsort | 上一層 | compact


aspell_check

(PHP 3>= 3.0.7, PHP 4 )

aspell_check -- Check a word [deprecated]

Description

bool aspell_check ( int dictionary_link, string word)

aspell_check() checks the spelling of a word and returns TRUE if the spelling is correct, FALSE if not.

例子 1. aspell_check()

$aspell_link = aspell_new("english");

if (aspell_check($aspell_link, "testt")) {
    echo "This is a valid spelling";
} else {
    echo "Sorry, wrong spelling";
}

上一頁 | 首頁 | 下一頁
aspell_check_raw | 上一層 | aspell_new


aspell_check_raw

(PHP 3>= 3.0.7, PHP 4 )

aspell_check_raw -- Check a word without changing its case or trying to trim it [deprecated]

Description

bool aspell_check_raw ( int dictionary_link, string word)

aspell_check_raw() checks the spelling of a word, without changing its case or trying to trim it in any way and returns TRUE if the spelling is correct, FALSE if not.

例子 1. aspell_check_raw()

$aspell_link = aspell_new("english");

if (aspell_check_raw($aspell_link, "test")) {
    echo "This is a valid spelling";
} else {
    echo "Sorry, wrong spelling";
}

上一頁 | 首頁 | 下一頁
Aspell functions [deprecated] | 上一層 | aspell_check


aspell_new

(PHP 3>= 3.0.7, PHP 4 )

aspell_new -- Load a new dictionary [deprecated]

Description

int aspell_new ( string master [, string personal])

aspell_new() opens up a new dictionary and returns the dictionary link identifier for use in other aspell functions. Returns FALSE on error.

例子 1. aspell_new()

$aspell_link = aspell_new("english");

上一頁 | 首頁 | 下一頁
aspell_check | 上一層 | aspell_suggest


aspell_suggest

(PHP 3>= 3.0.7, PHP 4 )

aspell_suggest -- Suggest spellings of a word [deprecated]

Description

array aspell_suggest ( int dictionary_link, string word)

aspell_suggest() returns an array of possible spellings for the given word.

例子 1. aspell_suggest()

$aspell_link = aspell_new("english");

if (!aspell_check($aspell_link, "test")) {
    $suggestions = aspell_suggest($aspell_link, "test");

    foreach ($suggestions as $suggestion) {
        echo "Possible spelling: $suggestion<br>\n";
    }
}

上一頁 | 首頁 | 下一頁
aspell_new | 上一層 | BCMath Arbitrary Precision Mathematics Functions


basename

(PHP 3, PHP 4 )

basename -- 傳回路徑中的文件名部分

說明

string basename ( string path [, string suffix])

給出一個包含有指向一個文件的全路徑的字串，本函式傳回基本的文件名。如果文件名是以 suffix 結束的，那這一部分也會被去掉。

在 Windows 中，斜線（/）和反斜線（\）都可以用作路徑分隔符。在其它環境下是斜線（/）。

例子 1. basename() 例子

$path = "/home/httpd/html/index.php";
$file = basename ($path);        // $file is set to "index.php"
$file = basename ($path,".php"); // $file is set to "index"

註: suffix 參數是 PHP 4.1.0 新加的。

參見 dirname()。

上一頁 | 首頁 | 下一頁
文件系統函式庫 | 上一層 | chgrp


bcadd

(PHP 3, PHP 4 )

bcadd -- Add two arbitrary precision numbers

Description

string bcadd ( string left_operand, string right_operand [, int scale])

Adds the left_operand to the right_operand and returns the sum in a string. The optional scale parameter is used to set the number of digits after the decimal place in the result.

See also bcsub().

上一頁 | 首頁 | 下一頁
BCMath Arbitrary Precision Mathematics Functions | 上一層 | bccomp


bccomp

(PHP 3, PHP 4 )

bccomp -- Compare two arbitrary precision numbers

Description

int bccomp ( string left_operand, string right_operand [, int scale])

Compares the left_operand to the right_operand and returns the result as an integer. The optional scale parameter is used to set the number of digits after the decimal place which will be used in the comparison. The return value is 0 if the two operands are equal. If the left_operand is larger than the right_operand the return value is +1 and if the left_operand is less than the right_operand the return value is -1.

上一頁 | 首頁 | 下一頁
bcadd | 上一層 | bcdiv


bcdiv

(PHP 3, PHP 4 )

bcdiv -- Divide two arbitrary precision numbers

Description

string bcdiv ( string left_operand, string right_operand [, int scale])

Divides the left_operand by the right_operand and returns the result. The optional scale sets the number of digits after the decimal place in the result.

See also bcmul().

上一頁 | 首頁 | 下一頁
bccomp | 上一層 | bcmod


bcmod

(PHP 3, PHP 4 )

bcmod -- Get modulus of an arbitrary precision number

Description

string bcmod ( string left_operand, string modulus)

Get the modulus of the left_operand using modulus.

See also bcdiv().

上一頁 | 首頁 | 下一頁
bcdiv | 上一層 | bcmul


bcmul

(PHP 3, PHP 4 )

bcmul -- Multiply two arbitrary precision number

Description

string bcmul ( string left_operand, string right_operand [, int scale])

Multiply the left_operand by the right_operand and returns the result. The optional scale sets the number of digits after the decimal place in the result.

See also bcdiv().

上一頁 | 首頁 | 下一頁
bcmod | 上一層 | bcpow


bcpow

(PHP 3, PHP 4 )

bcpow -- Raise an arbitrary precision number to another

Description

string bcpow ( string x, string y [, int scale])

Raise x to the power y. The optional scale can be used to set the number of digits after the decimal place in the result.

See also bcsqrt().

上一頁 | 首頁 | 下一頁
bcmul | 上一層 | bcscale


bcscale

(PHP 3, PHP 4 )

bcscale -- Set default scale parameter for all bc math functions

Description

string bcscale ( int scale)

This function sets the default scale parameter for all subsequent bc math functions that do not explicitly specify a scale parameter.

上一頁 | 首頁 | 下一頁
bcpow | 上一層 | bcsqrt


bcsqrt

(PHP 3, PHP 4 )

bcsqrt -- Get the square root of an arbitrary precision number

Description

string bcsqrt ( string operand [, int scale])

Return the square root of the operand. The optional scale parameter sets the number of digits after the decimal place in the result.

See also bcpow().

上一頁 | 首頁 | 下一頁
bcscale | 上一層 | bcsub


bcsub

(PHP 3, PHP 4 )

bcsub -- Subtract one arbitrary precision number from another

Description

string bcsub ( string left_operand, string right_operand [, int scale])

Subtracts the right_operand from the left_operand and returns the result in a string. The optional scale parameter is used to set the number of digits after the decimal place in the result.

See also bcadd().

上一頁 | 首頁 | 下一頁
bcsqrt | 上一層 | Bzip2 Compression Functions


bzclose

(PHP 4 >= 4.0.4)

bzclose -- Close a bzip2 file pointer

Description

int bzclose ( resource bz)

Closes the bzip2 file referenced by the pointer bz.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

The file pointer must be valid, and must point to a file successfully opened by bzopen().

See also bzopen().

上一頁 | 首頁 | 下一頁
Bzip2 Compression Functions | 上一層 | bzcompress


bzcompress

(PHP 4 >= 4.0.4)

bzcompress -- Compress a string into bzip2 encoded data

Description

string bzcompress ( string source [, int blocksize [, int workfactor]])

bzcompress() compresses the source string and returns it as bzip2 encoded data.

The optional parameter blocksize specifies the blocksize used during compression and should be a number from 1 to 9 with 9 giving the best compression, but using more resources to do so. blocksize defaults to 4.

The optional parameter workfactor controls how the compression phase behaves when presented with worst case, highly repetitive, input data. The value can be between 0 and 250 with 0 being a special case and 30 being the default value. Regardless of the workfactor, the generated output is the same.

例子 1. bzcompress() Example

<?php
$str = "sample data";
$bzstr = bzcompress($str, 9);
print( $bzstr );
?>

See also bzdecompress().

上一頁 | 首頁 | 下一頁
bzclose | 上一層 | bzdecompress


bzdecompress

(PHP 4 >= 4.0.4)

bzdecompress -- Decompresses bzip2 encoded data

Description

string bzdecompress ( string source [, int small])

bzdecompress() decompresses the source string containing bzip2 encoded data and returns it. If the optional parameter small is TRUE, an alternative decompression algorithm will be used which uses less memory (the maximum memory requirement drops to around 2300K) but works at roughly half the speed. See the bzip2 documentation for more information about this feature.

例子 1. bzdecompress()

<?php
$start_str = "This is not an honest face?";
$bzstr = bzcompress($start_str);

print( "Compressed String: " );
print( $bzstr );
print( "\n<br>\n" );

$str = bzdecompress($bzstr);
print( "Decompressed String: " );
print( $str );
print( "\n<br>\n" );
?>

See also bzcompress().

上一頁 | 首頁 | 下一頁
bzcompress | 上一層 | bzerrno


bzerrno

(PHP 4 >= 4.0.4)

bzerrno -- Returns a bzip2 error number

Description

int bzerrno ( resource bz)

Returns the error number of any bzip2 error returned by the file pointer bz.

See also bzerror() and bzerrstr().

上一頁 | 首頁 | 下一頁
bzdecompress | 上一層 | bzerror


bzerror

(PHP 4 >= 4.0.4)

bzerror -- Returns the bzip2 error number and error string in an array

Description

array bzerror ( resource bz)

Returns the error number and error string, in an associative array, of any bzip2 error returned by the file pointer bz.

例子 1. bzerror() Example

<?php
$error = bzerror($bz);

echo $error["errno"];
echo $error["errstr"];
?>

See also bzerrno() and bzerrstr().

上一頁 | 首頁 | 下一頁
bzerrno | 上一層 | bzerrstr


bzerrstr

(PHP 4 >= 4.0.4)

bzerrstr -- Returns a bzip2 error string

Description

string bzerrstr ( resource bz)

Returns the error string of any bzip2 error returned by the file pointer bz.

See also bzerrno() and bzerror().

上一頁 | 首頁 | 下一頁
bzerror | 上一層 | bzflush


bzflush

(PHP 4 >= 4.0.4)

bzflush -- Force a write of all buffered data

Description

int bzflush ( resource bz)

Forces a write of all buffered bzip2 data for the file pointer bz.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

See also bzread() and bzwrite().

上一頁 | 首頁 | 下一頁
bzerrstr | 上一層 | bzopen


bzopen

(PHP 4 >= 4.0.4)

bzopen -- Open a bzip2 compressed file

Description

resource bzopen ( string filename, string mode)

Opens a bzip2 (.bz2) file for reading or writing. filename is the name of the file to open. mode is similar to the fopen() function (`r' for read, `w' for write, etc.).

If the open fails, the function returns FALSE, otherwise it returns a pointer to the newly opened file.

例子 1. bzopen() Example

<?php
$bz = bzopen("/tmp/foo.bz2", "r");
$decompressed_file = bzread($bz, filesize("/tmp/foo.bz2"));
bzclose($bz);

print( "The contents of /tmp/foo.bz2 are: " );
print( "\n<br>\n" );
print( $decompressed_file );
?>

See also bzclose().

上一頁 | 首頁 | 下一頁
bzflush | 上一層 | bzread


bzread

(PHP 4 >= 4.0.4)

bzread -- Binary safe bzip2 file read

Description

string bzread ( resource bz [, int length])

bzread() reads up to length bytes from the bzip2 file pointer referenced by bz. Reading stops when length (uncompressed) bytes have been read or EOF is reached, whichever comes first. If the optional parameter length is not specified, bzread() will read 1024 (uncompressed) bytes at a time.

例子 1. bzread() Example

<?php
$bz = bzopen("/tmp/foo.bz2", "r");
$str = bzread($bz, 2048);
print( $str );
?>

See also bzwrite() and bzopen().

上一頁 | 首頁 | 下一頁
bzopen | 上一層 | bzwrite


bzwrite

(PHP 4 >= 4.0.4)

bzwrite -- Binary safe bzip2 file write

Description

int bzwrite ( resource bz, string data [, int length])

bzwrite() writes the contents of the string data to the bzip2 file stream pointed to by bz. If the optional length argument is given, writing will stop after length (uncompressed) bytes have been written or the end of string is reached, whichever comes first.

例子 1. bzwrite() Example

<?php
$str = "uncompressed data";
$bz = bzopen("/tmp/foo.bz2", "w");
bzwrite($bz, $str, strlen($str));
bzclose($bz);
?>

See also bzread() and bzopen().

上一頁 | 首頁 | 下一頁
bzread | 上一層 | Calendar functions


cal_days_in_month

(PHP 4 >= 4.1.0)

cal_days_in_month -- Return the number of days in a month for a given year and calendar

Description

int cal_days_in_month ( int calendar, int month, int year)

This function will return the number of days in the month of year for the specified calendar.

See also jdtounix().

上一頁 | 首頁 | 下一頁
Calendar functions | 上一層 | cal_from_jd


cal_from_jd

(PHP 4 >= 4.1.0)

cal_from_jd -- Converts from Julian Day Count to a supported calendar and return extended information

Description

array cal_from_jd ( int jd, int calendar)

上一頁 | 首頁 | 下一頁
cal_days_in_month | 上一層 | cal_info


cal_info

(PHP 4 >= 4.1.0)

cal_info -- Returns information about a particular calendar

Description

array cal_info ( int calendar)

上一頁 | 首頁 | 下一頁
cal_from_jd | 上一層 | cal_to_jd


cal_to_jd

(PHP 4 >= 4.1.0)

cal_to_jd -- Converts from a supported calendar to Julian Day Count

Description

int cal_to_jd ( int calendar, int month, int day, int year)

上一頁 | 首頁 | 下一頁
cal_info | 上一層 | easter_date


call_user_method

(PHP 3>= 3.0.3, PHP 4 )

call_user_method -- Call a user method on an specific object [deprecated]

Description

mixed call_user_method ( string method_name, object obj [, mixed parameter [, mixed ...]])

警告

The call_user_method() function is deprecated as of PHP 4.1.0, use the call_user_func() variety with the array(&$obj, "method_name") syntax instead.

Calls the method referred by method_name from the user defined obj object. An example of usage is below, where we define a class, instantiate an object and use call_user_method() to call indirectly its print_info method.

<?php
class Country {
    var $NAME;
    var $TLD;

    function Country($name, $tld) {
        $this->NAME = $name;
        $this->TLD = $tld;
    }

    function print_info($prestr="") {
        echo $prestr."Country: ".$this->NAME."\n";
        echo $prestr."Top Level Domain: ".$this->TLD."\n";
    }
}

$cntry = new Country("Peru","pe");

echo "* Calling the object method directly\n";
$cntry->print_info();

echo "\n* Calling the same method indirectly\n";
call_user_method ("print_info", $cntry, "\t");
?>

See also call_user_func_array(),
call_user_func(), and
call_user_method_array().

上一頁 | 首頁 | 下一頁
call_user_method_array | 上一層 | class_exists


call_user_method_array

(PHP 4 >= 4.0.5)

call_user_method_array -- Call a user method given with an array of parameters [deprecated]

Description

mixed call_user_method_array ( string method_name, object obj [, array paramarr])

警告

The call_user_method_array() function is deprecated as of PHP 4.1.0, use the call_user_func_array() variety with the array(&$obj, "method_name") syntax instead.

Calls the method referred by method_name from the user defined obj object, using the parameters in paramarr.

See also:
call_user_func_array(),
call_user_func(),
call_user_method().

註: This function was added to the CVS code after release of PHP 4.0.4pl1

上一頁 | 首頁 | 下一頁
Class/Object Functions | 上一層 | call_user_method


ccvs_add

(PHP 4 >= 4.0.2)

ccvs_add -- Add data to a transaction

Description

string ccvs_add ( string session, string invoice, string argtype, string argval)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
CCVS API Functions | 上一層 | ccvs_auth


ccvs_auth

(PHP 4 >= 4.0.2)

ccvs_auth -- Perform credit authorization test on a transaction

Description

string ccvs_auth ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_add | 上一層 | ccvs_command


ccvs_command

(PHP 4 >= 4.0.2)

ccvs_command -- Performs a command which is peculiar to a single protocol, and thus is not available in the general CCVS API

Description

string ccvs_command ( string session, string type, string argval)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_auth | 上一層 | ccvs_count


ccvs_count

(PHP 4 >= 4.0.2)

ccvs_count -- Find out how many transactions of a given type are stored in the system

Description

int ccvs_count ( string session, string type)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_command | 上一層 | ccvs_delete


ccvs_done

(PHP 4 >= 4.0.2)

ccvs_done -- Terminate CCVS engine and do cleanup work

Description

string ccvs_done ( string sess)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_delete | 上一層 | ccvs_init


ccvs_init

(PHP 4 >= 4.0.2)

ccvs_init -- Initialize CCVS for use

Description

string ccvs_init ( string name)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_done | 上一層 | ccvs_lookup


ccvs_lookup

(PHP 4 >= 4.0.2)

ccvs_lookup -- Look up an item of a particular type in the database #

Description

string ccvs_lookup ( string session, string invoice, int inum)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_init | 上一層 | ccvs_new


ccvs_new

(PHP 4 >= 4.0.2)

ccvs_new -- Create a new, blank transaction

Description

string ccvs_new ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_lookup | 上一層 | ccvs_report


ccvs_report

(PHP 4 >= 4.0.2)

ccvs_report -- Return the status of the background communication process

Description

string ccvs_report ( string session, string type)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_new | 上一層 | ccvs_return


ccvs_return

(PHP 4 >= 4.0.2)

ccvs_return -- Transfer funds from the merchant to the credit card holder

Description

string ccvs_return ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_report | 上一層 | ccvs_reverse


ccvs_reverse

(PHP 4 >= 4.0.2)

ccvs_reverse -- Perform a full reversal on an already-processed authorization

Description

string ccvs_reverse ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_return | 上一層 | ccvs_sale


ccvs_sale

(PHP 4 >= 4.0.2)

ccvs_sale -- Transfer funds from the credit card holder to the merchant

Description

string ccvs_sale ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_reverse | 上一層 | ccvs_status


ccvs_status

(PHP 4 >= 4.0.2)

ccvs_status -- Check the status of an invoice

Description

string ccvs_status ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_sale | 上一層 | ccvs_textvalue


ccvs_textvalue

(PHP 4 >= 4.0.2)

ccvs_textvalue -- Get text return value for previous function call

Description

string ccvs_textvalue ( string session)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_status | 上一層 | ccvs_void


ccvs_void

(PHP 4 >= 4.0.2)

ccvs_void -- Perform a full reversal on a completed transaction

Description

string ccvs_void ( string session, string invoice)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ccvs_textvalue | 上一層 | COM support functions for Windows


chdir

(PHP 3, PHP 4 )

chdir -- 改變目錄

說明

bool chdir ( string directory)

將 PHP 的當前目錄改為 directory。如果不能改變目錄則傳回 FALSE，否則傳回 TRUE。

參見 getcwd()。

上一頁 | 首頁 | 下一頁
目錄函式庫 | 上一層 | chroot


checkdate

(PHP 3, PHP 4 )

checkdate -- 驗証一個格裡高裡日期

說明

bool checkdate ( int month, int day, int year)

如果給出的日期有效則傳回 TRUE，否則傳回 FALSE。檢查由參數構成的日期的合法性。日期在以下情況下被認為有效：

  • year 的值是從 1 到 32767

  • month 的值是從 1 到 12

  • Day 的值在給定的 month 所應該具有的天數範圍之內，閏年已經考慮進去了。

參見 mktime() 和 strtotime()。

上一頁 | 首頁 | 下一頁
時間日期函式庫 | 上一層 | date


chgrp

(PHP 3, PHP 4 )

chgrp -- 改變文件所屬的組

說明

int chgrp ( string filename, mixed group)

嘗試將文件 filename 所屬的組改成 group（通過組名或組 ID 指定）。只有超級用戶可以任意修改文件的組，其它用戶可能只能將文件的組改成該用戶自己所在的組。

如果成功則傳回 TRUE，失敗則傳回 FALSE。

參見 chown() 和 chmod()。

上一頁 | 首頁 | 下一頁
basename | 上一層 | chmod


chown

(PHP 3, PHP 4 )

chown -- 改變文件的所有者

說明

int chown ( string filename, mixed user)

嘗試將文件 filename 的所有者改成用戶 user（由用戶名或用戶 ID 指定）。只有超級用戶可以改變文件的所有者。

如果成功則傳回 TRUE，失敗則傳回 FALSE。

參見 chmod()。

上一頁 | 首頁 | 下一頁
chmod | 上一層 | clearstatcache


chroot

(PHP 4 >= 4.0.5)

chroot -- 改變根目錄

說明

bool chroot ( string directory)

將當前進程的根目錄改變為 directory。如果不能改變根目錄則傳回 FALSE，否則傳回 TRUE。

註: 當執行於 web 伺服器環境下使用此函式可不明智，因為在請求結束時不可能將根目錄重設為 /。本函式僅在作為 CGI 執行時才能正確工作。

註: 該函式不適用於 Windows 平台！

上一頁 | 首頁 | 下一頁
chdir | 上一層 | dir


class_exists

(PHP 4 )

class_exists -- Checks if the class has been defined

Description

bool class_exists ( string class_name)

This function returns TRUE if the class given by class_name has been defined, FALSE otherwise.

See also get_declared_classes().

上一頁 | 首頁 | 下一頁
call_user_method | 上一層 | get_class_methods


clearstatcache

(PHP 3, PHP 4 )

clearstatcache -- 清除文件狀態緩存

說明

void clearstatcache ( void)

當使用 stat()，lstat() 或者任何列在受影響函式表（見下面）中的函式時，PHP 將緩存這些函式的傳回訊息以提供更快的性能。然而在某些情況下，你可能想清除被緩存的訊息。例如如果在一個腳本中多次檢查同一個文件，而該文件在此腳本執行期間有被刪除或修改的危險時，你需要清除文件狀態緩存。這種情況下，可以用 clearstatcache() 函式來清除被 PHP 緩存的該文件訊息。

註: 本函式緩存特定文件名的訊息，因此只在對同一個文件名進行多次操作並且需要該文件訊息不被緩存時才需要呼叫 clearstatcache()。

受影響的函式包括 stat()，lstat()，file_exists()，is_writable()，is_readable()，is_executable()，is_file()，is_dir()，is_link()，filectime()，fileatime()，filemtime()，fileinode()，filegroup()，fileowner()，filesize()，filetype() 和 fileperms()。

上一頁 | 首頁 | 下一頁
chown | 上一層 | copy


closedir

(PHP 3, PHP 4 )

closedir -- 關閉目錄句柄

說明

void closedir ( resource dir_handle)

關閉由 dir_handle 指定的目錄流。流必須之前被 opendir() 所打開。

上一頁 | 首頁 | 下一頁
dir | 上一層 | getcwd


com_addref

(PHP 4 >= 4.1.0)

com_addref -- Increases the components reference counter.

Description

void com_addref ( void)

Increases the components reference counter.

上一頁 | 首頁 | 下一頁
VARIANT | 上一層 | com_get


com_get

(PHP 3>= 3.0.3, PHP 4 >= 4.0.5)

com_get -- Gets the value of a COM Component's property

Description

mixed com_get ( resource com_object, string property)

Returns the value of the property of the COM component referenced by com_object. Returns FALSE on error.

上一頁 | 首頁 | 下一頁
com_addref | 上一層 | com_invoke


com_invoke

(PHP 3>= 3.0.3)

com_invoke -- Calls a COM component's method.

Description

mixed com_invoke ( resource com_object, string function_name [, mixed function parameters, ...])

com_invoke() invokes a method of the COM component referenced by com_object. Returns FALSE on error, returns the function_name's return value on success.

上一頁 | 首頁 | 下一頁
com_get | 上一層 | com_isenum


com_isenum

(PHP 4 >= 4.1.0)

com_isenum -- Grabs an IEnumVariant

Description

void com_isenum ( object com_module)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
com_invoke | 上一層 | com_load_typelib


com_load

(PHP 3>= 3.0.3)

com_load -- Creates a new reference to a COM component

Description

string com_load ( string module name [, string server name [, int codepage]])

com_load() creates a new COM component and returns a reference to it. Returns FALSE on failure. Possible values for codepage are CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 and CP_UTF8.

上一頁 | 首頁 | 下一頁
com_load_typelib | 上一層 | com_propget


com_load_typelib

(PHP 4 >= 4.1.0)

com_load_typelib -- Loads a Typelib

Description

void com_load_typelib ( string typelib_name [, int case_insensitive])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
com_isenum | 上一層 | com_load


com_propget

(PHP 3>= 3.0.3, PHP 4 >= 4.0.5)

com_propget -- Gets the value of a COM Component's property

Description

mixed com_propget ( resource com_object, string property)

This function is an alias for com_get().

上一頁 | 首頁 | 下一頁
com_load | 上一層 | com_propput


com_propput

(PHP 3>= 3.0.3, PHP 4 >= 4.0.5)

com_propput -- Assigns a value to a COM component's property

Description

void com_propput ( resource com_object, string property, mixed value)

This function is an alias for com_set().

上一頁 | 首頁 | 下一頁
com_propget | 上一層 | com_propset


com_propset

(PHP 3>= 3.0.3, PHP 4 >= 4.0.5)

com_propset -- Assigns a value to a COM component's property

Description

void com_propset ( resource com_object, string property, mixed value)

This function is an alias for com_set().

上一頁 | 首頁 | 下一頁
com_propput | 上一層 | com_release


com_release

(PHP 4 >= 4.1.0)

com_release -- Decreases the components reference counter.

Description

void com_release ( void)

Decreases the components reference counter.

上一頁 | 首頁 | 下一頁
com_propset | 上一層 | com_set


com_set

(PHP 3>= 3.0.3, PHP 4 >= 4.0.5)

com_set -- Assigns a value to a COM component's property

Description

void com_set ( resource com_object, string property, mixed value)

Sets the value of the property of the COM component referenced by com_object. Returns the newly set value if succeeded, FALSE on error.

上一頁 | 首頁 | 下一頁
com_release | 上一層 | Class/Object Functions


compact

(PHP 4 )

compact -- 建立一個陣列，包括變數名和它們的值

說明

array compact ( mixed varname [, mixed ...])

compact() 接受可變的參數數目。每個參數可以是一個包括變數名的字串或者是一個包含變數名的陣列，該陣列中還可以包含其它單元內容為變數名的陣列， compact() 可以遞歸處理。

對每個參數，compact() 在當前的符號表中查找該變數名並將它增加到輸出的陣列中，變數名成為鍵名而變數的內容成為該鍵的值。簡單說，它做的事和 extract() 正好相反。傳回將所有變數增加進去後的陣列。

任何沒有設定為變數名的字串都被跳過。

例子 1. compact() 例子

$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array ("city", "state");

$result = compact ("event", "nothing_here", $location_vars);

經過處理後，$result 為：
Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

參見 extract()。

上一頁 | 首頁 | 下一頁
asort | 上一層 | count


connection_aborted

(PHP 3>= 3.0.7, PHP 4 )

connection_aborted -- Returns TRUE if client disconnected

Description

int connection_aborted ( void)

Returns TRUE if client disconnected. See the Connection Handling description in the Features chapter for a complete explanation.

上一頁 | 首頁 | 下一頁
Miscellaneous functions | 上一層 | connection_status


connection_status

(PHP 3>= 3.0.7, PHP 4 )

connection_status -- Returns connection status bitfield

Description

int connection_status ( void)

Returns the connection status bitfield. See the Connection Handling description in the Features chapter for a complete explanation.

上一頁 | 首頁 | 下一頁
connection_aborted | 上一層 | connection_timeout


connection_timeout

(PHP 3>= 3.0.7, PHP 4 <= 4.0.4)

connection_timeout -- Return TRUE if script timed out

Description

bool connection_timeout ( void)

Returns TRUE if script timed out.

Deprecated

This function is deprecated, and doesn't even exist anymore as of 4.0.5.

See the Connection Handling description in the Features chapter for a complete explanation.

上一頁 | 首頁 | 下一頁
connection_status | 上一層 | constant


constant

(PHP 4 >= 4.0.4)

constant -- Returns the value of a constant

Description

mixed constant ( string name)

constant() will return the value of the constant indicated by name.

constant() is useful if you need to retrieve the value of a constant, but do not know it's name. i.e. It is stored in a variable or returned by a function.

例子 1. constant() example

<?php

define ("MAXSIZE", 100);

echo MAXSIZE;
echo constant("MAXSIZE"); // same thing as the previous line

?>

See also define(), defined() and the section on Constants.

上一頁 | 首頁 | 下一頁
connection_timeout | 上一層 | define


copy

(PHP 3, PHP 4 )

copy -- 拷貝文件

說明

int copy ( string source, string dest)

拷貝一個文件。如果拷貝成功則傳回 TRUE，否則傳回 FALSE。

例子 1. copy() 例子

if (!copy($file, $file.'.bak')) {
    print ("failed to copy $file...<br>\n");
}

註: 從 PHP 4.3.0 開始，如果啟用了“fopen wrappers”的話，source 和 dest 都可以是 URL。更多細節見 fopen()。如果 dest 是一個 URL，則如果封裝協議不支援覆蓋已有的文件時拷貝操作會失敗。

警告

如果目標文件已存在，將會被覆蓋。

參見 move_uploaded_file()，rename() 和手冊中關於文件上傳處理一節。

上一頁 | 首頁 | 下一頁
clearstatcache | 上一層 | delete


count

(PHP 3, PHP 4 )

count -- 統計變數中的單元數目

說明

int count ( mixed var)

傳回 var 中的單元數目，通常是一個 array（任何其它型別都只有一個單元）。

如果 var 不是陣列型別，將傳回 1（例外：count(NULL) 的結果是 0）。

警告

count() 對沒有初始化的變數傳回 0，但對於空的陣列也會傳回 0。用 isset() 來測試變數是否已經初始化。

請參考手冊中陣列一節中關於怎樣在 PHP 中實現和使用陣列的詳細解釋。

例子 1. count() 例子

$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count ($a);
// $result == 3

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
$result = count ($b);
// $result == 3;

註: sizeof() 函式是 count() 的別名。

參見 is_array()，isset() 和 strlen()。

上一頁 | 首頁 | 下一頁
compact | 上一層 | current


cpdf_add_annotation

(PHP 3>= 3.0.12, PHP 4 )

cpdf_add_annotation -- Adds annotation

Description

void cpdf_add_annotation ( int pdf document, float llx, float lly, float urx, float ury, string title, string content [, int mode])

The cpdf_add_annotation() adds a note with the lower left corner at (llx, lly) and the upper right corner at (urx, ury).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

上一頁 | 首頁 | 下一頁
ClibPDF functions | 上一層 | cpdf_add_outline


cpdf_add_outline

(PHP 3>= 3.0.9, PHP 4 )

cpdf_add_outline -- Adds bookmark for current page

Description

void cpdf_add_outline ( int pdf document, string text)

The cpdf_add_outline() function adds a bookmark with text text that points to the current page.

例子 1. Adding a page outline

<?php
$cpdf = cpdf_open(0);
cpdf_page_init($cpdf, 1, 0, 595, 842);
cpdf_add_outline($cpdf, 0, 0, 0, 1, "Page 1");
// ...
// some drawing
// ...
cpdf_finalize($cpdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($cpdf);
cpdf_close($cpdf);
?>

上一頁 | 首頁 | 下一頁
cpdf_add_annotation | 上一層 | cpdf_arc


cpdf_arc

(PHP 3>= 3.0.8, PHP 4 )

cpdf_arc -- Draws an arc

Description

void cpdf_arc ( int pdf document, float x-coor, float y-coor, float radius, float start, float end [, int mode])

The cpdf_arc() function draws an arc with center at point (x-coor, y-coor) and radius radius, starting at angle start and ending at angle end.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_circle().

上一頁 | 首頁 | 下一頁
cpdf_add_outline | 上一層 | cpdf_begin_text


cpdf_begin_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_begin_text -- Starts text section

Description

void cpdf_begin_text ( int pdf document)

The cpdf_begin_text() function starts a text section. It must be ended with cpdf_end_text().

例子 1. Text output

<?php
cpdf_begin_text($pdf);
cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding");
cpdf_text($pdf, 100, 100, "Some text");
cpdf_end_text($pdf)
?>

See also cpdf_end_text().

上一頁 | 首頁 | 下一頁
cpdf_arc | 上一層 | cpdf_circle


cpdf_circle

(PHP 3>= 3.0.8, PHP 4 )

cpdf_circle -- Draw a circle

Description

void cpdf_circle ( int pdf document, float x-coor, float y-coor, float radius [, int mode])

The cpdf_circle() function draws a circle with center at point (x-coor, y-coor) and radius radius.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_arc().

上一頁 | 首頁 | 下一頁
cpdf_begin_text | 上一層 | cpdf_clip


cpdf_clip

(PHP 3>= 3.0.8, PHP 4 )

cpdf_clip -- Clips to current path

Description

void cpdf_clip ( int pdf document)

The cpdf_clip() function clips all drawing to the current path.

上一頁 | 首頁 | 下一頁
cpdf_circle | 上一層 | cpdf_close


cpdf_close

(PHP 3>= 3.0.8, PHP 4 )

cpdf_close -- Closes the pdf document

Description

void cpdf_close ( int pdf document)

The cpdf_close() function closes the pdf document. This should be the last function even after cpdf_finalize(), cpdf_output_buffer() and cpdf_save_to_file().

See also cpdf_open().

上一頁 | 首頁 | 下一頁
cpdf_clip | 上一層 | cpdf_closepath_fill_stroke


cpdf_closepath

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath -- Close path

Description

void cpdf_closepath ( int pdf document)

The cpdf_closepath() function closes the current path.

上一頁 | 首頁 | 下一頁
cpdf_closepath_stroke | 上一層 | cpdf_continue_text


cpdf_closepath_fill_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath_fill_stroke -- Close, fill and stroke current path

Description

void cpdf_closepath_fill_stroke ( int pdf document)

The cpdf_closepath_fill_stroke() function closes, fills the interior of the current path with the current fill color and draws current path.

See also cpdf_closepath(),
         cpdf_stroke(),
         cpdf_fill(),
         cpdf_setgray_fill(),
         cpdf_setgray(),
         cpdf_setrgbcolor_fill(),
         cpdf_setrgbcolor().

上一頁 | 首頁 | 下一頁
cpdf_close | 上一層 | cpdf_closepath_stroke


cpdf_closepath_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath_stroke -- Close path and draw line along path

Description

void cpdf_closepath_stroke ( int pdf document)

The cpdf_closepath_stroke() function is a
combination of cpdf_closepath() and
cpdf_stroke(). Then clears the path.

See also cpdf_closepath(), cpdf_stroke().

上一頁 | 首頁 | 下一頁
cpdf_closepath_fill_stroke | 上一層 | cpdf_closepath


cpdf_continue_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_continue_text -- Output text in next line

Description

void cpdf_continue_text ( int pdf document, string text)

The cpdf_continue_text() function outputs the string in text in the next line.

See also cpdf_show_xy(),
         cpdf_text(),
         cpdf_set_leading(),
         cpdf_set_text_pos().

上一頁 | 首頁 | 下一頁
cpdf_closepath | 上一層 | cpdf_curveto


cpdf_curveto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_curveto -- Draws a curve

Description

void cpdf_curveto ( int pdf document, float x1, float y1, float x2, float y2, float x3, float y3 [, int mode])

The cpdf_curveto() function draws a Bezier curve from the current point to the point (x3, y3) using (x1, y1) and (x2, y2) as control points.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_moveto(),
         cpdf_rmoveto(),
         cpdf_rlineto(),
         cpdf_lineto().

上一頁 | 首頁 | 下一頁
cpdf_continue_text | 上一層 | cpdf_end_text


cpdf_end_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_end_text -- Ends text section

Description

void cpdf_end_text ( int pdf document)

The cpdf_end_text() function ends a text section which was started with cpdf_begin_text().

例子 1. Text output

<?php
cpdf_begin_text($pdf);
cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding");
cpdf_text($pdf, 100, 100, "Some text");
cpdf_end_text($pdf)
?>

See also cpdf_begin_text().

上一頁 | 首頁 | 下一頁
cpdf_curveto | 上一層 | cpdf_fill_stroke


cpdf_fill

(PHP 3>= 3.0.8, PHP 4 )

cpdf_fill -- Fill current path

Description

void cpdf_fill ( int pdf document)

The cpdf_fill() function fills the interior of the current path with the current fill color.

See also cpdf_closepath(),
         cpdf_stroke(),
         cpdf_setgray_fill(),
         cpdf_setgray(),
         cpdf_setrgbcolor_fill(),
         cpdf_setrgbcolor().

上一頁 | 首頁 | 下一頁
cpdf_fill_stroke | 上一層 | cpdf_finalize_page


cpdf_fill_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_fill_stroke -- Fill and stroke current path

Description

void cpdf_fill_stroke ( int pdf document)

The cpdf_fill_stroke() function fills the interior of the current path with the current fill color and draws current path.

See also cpdf_closepath(),
         cpdf_stroke(),
         cpdf_fill(),
         cpdf_setgray_fill(),
         cpdf_setgray(),
         cpdf_setrgbcolor_fill(),
         cpdf_setrgbcolor().

上一頁 | 首頁 | 下一頁
cpdf_end_text | 上一層 | cpdf_fill


cpdf_finalize

(PHP 3>= 3.0.8, PHP 4 )

cpdf_finalize -- Ends document

Description

void cpdf_finalize ( int pdf document)

The cpdf_finalize() function ends the document. You still have to call cpdf_close()

See also cpdf_close().

上一頁 | 首頁 | 下一頁
cpdf_finalize_page | 上一層 | cpdf_global_set_document_limits


cpdf_finalize_page

(PHP 3>= 3.0.10, PHP 4 )

cpdf_finalize_page -- Ends page

Description

void cpdf_finalize_page ( int pdf document, int page number)

The cpdf_finalize_page() function ends the page with page number page number.

This function is only for saving memory. A finalized page takes less memory but cannot be modified anymore.

See also cpdf_page_init().

上一頁 | 首頁 | 下一頁
cpdf_fill | 上一層 | cpdf_finalize


cpdf_global_set_document_limits

(PHP 4 )

cpdf_global_set_document_limits -- Sets document limits for any pdf document

Description

void cpdf_global_set_document_limits ( int maxpages, int maxfonts, int maximages, int maxannotations, int maxobjects)

The cpdf_global_set_document_limits() function sets several document limits. This function has to be called before cpdf_open() to take effect. It sets the limits for any document open afterwards.

See also cpdf_open().

上一頁 | 首頁 | 下一頁
cpdf_finalize | 上一層 | cpdf_import_jpeg


cpdf_import_jpeg

(PHP 3>= 3.0.9, PHP 4 )

cpdf_import_jpeg -- Opens a JPEG image

Description

int cpdf_import_jpeg ( int pdf document, string file name, float x-coor, float y-coor, float angle, float width, float height, float x-scale, float y-scale [, int mode])

The cpdf_import_jpeg() function opens an image stored in the file with the name file name. The format of the image has to be jpeg. The image is placed on the current page at position (x-coor, y-coor). The image is rotated by angle degrees.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_place_inline_image().

上一頁 | 首頁 | 下一頁
cpdf_global_set_document_limits | 上一層 | cpdf_lineto


cpdf_lineto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_lineto -- Draws a line

Description

void cpdf_lineto ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_lineto() function draws a line from the current point to the point with coordinates (x-coor, y-coor).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_moveto(),
         cpdf_rmoveto(),
         cpdf_curveto().

上一頁 | 首頁 | 下一頁
cpdf_import_jpeg | 上一層 | cpdf_moveto


cpdf_moveto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_moveto -- Sets current point

Description

void cpdf_moveto ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_moveto() function set the current point to the coordinates x-coor and y-coor.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

上一頁 | 首頁 | 下一頁
cpdf_lineto | 上一層 | cpdf_newpath


cpdf_newpath

(PHP 3>= 3.0.9, PHP 4 )

cpdf_newpath -- Starts a new path

Description

void cpdf_newpath ( int pdf document)

The cpdf_newpath() starts a new path on the document given by the pdf document parameter.

上一頁 | 首頁 | 下一頁
cpdf_moveto | 上一層 | cpdf_open


cpdf_open

(PHP 3>= 3.0.8, PHP 4 )

cpdf_open -- Opens a new pdf document

Description

int cpdf_open ( int compression [, string filename])

The cpdf_open() function opens a new pdf document. The first parameter turns document compression on if it is unequal to 0. The second optional parameter sets the file in which the document is written. If it is omitted the document is created in memory and can either be written into a file with the cpdf_save_to_file() or written to standard output with cpdf_output_buffer().

註: The return value will be needed in further versions of ClibPDF as the first parameter in all other functions which are writing to the pdf document.

The ClibPDF library takes the filename "-" as a synonym for stdout. If PHP is compiled as an apache module this will not work because the way ClibPDF outputs to stdout does not work with apache. You can solve this problem by skipping the filename and using cpdf_output_buffer() to output the pdf document.

See also cpdf_close(), cpdf_output_buffer().

上一頁 | 首頁 | 下一頁
cpdf_newpath | 上一層 | cpdf_output_buffer


cpdf_output_buffer

(PHP 3>= 3.0.9, PHP 4 )

cpdf_output_buffer -- Outputs the pdf document in memory buffer

Description

void cpdf_output_buffer ( int pdf document)

The cpdf_output_buffer() function outputs the pdf document to stdout. The document has to be created in memory which is the case if cpdf_open() has been called with no filename parameter.

See also cpdf_open().

上一頁 | 首頁 | 下一頁
cpdf_open | 上一層 | cpdf_page_init


cpdf_page_init

(PHP 3>= 3.0.8, PHP 4 )

cpdf_page_init -- Starts new page

Description

void cpdf_page_init ( int pdf document, int page number, int orientation, float height, float width [, float unit])

The cpdf_page_init() function starts a new page with height height and width width. The page has number page number and orientation orientation. orientation can be 0 for portrait and 1 for landscape. The last optional parameter unit sets the unit for the coordinate system. The value should be the number of postscript points per unit. Since one inch is equal to 72 points, a value of 72 would set the unit to one inch. The default is also 72.

See also cpdf_set_current_page().

上一頁 | 首頁 | 下一頁
cpdf_output_buffer | 上一層 | cpdf_place_inline_image


cpdf_place_inline_image

(PHP 3>= 3.0.9, PHP 4 )

cpdf_place_inline_image -- Places an image on the page

Description

void cpdf_place_inline_image ( int pdf document, int image, float x-coor, float y-coor, float angle, float width, float height [, int mode])

The cpdf_place_inline_image() function places an image created with the php image functions on the page at position (x-coor, y-coor). The image can be scaled at the same time.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_import_jpeg().

上一頁 | 首頁 | 下一頁
cpdf_page_init | 上一層 | cpdf_rect


cpdf_rect

(PHP 3>= 3.0.8, PHP 4 )

cpdf_rect -- Draw a rectangle

Description

void cpdf_rect ( int pdf document, float x-coor, float y-coor, float width, float height [, int mode])

The cpdf_rect() function draws a rectangle with its lower left corner at point (x-coor, y-coor). This width is set to width. This height is set to height.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

上一頁 | 首頁 | 下一頁
cpdf_place_inline_image | 上一層 | cpdf_restore


cpdf_restore

(PHP 3>= 3.0.8, PHP 4 )

cpdf_restore -- Restores formerly saved environment

Description

void cpdf_restore ( int pdf document)

The cpdf_restore() function restores the environment saved with cpdf_save(). It works like the postscript command grestore. Very useful if you want to translate or rotate an object without effecting other objects.

例子 1. Save/Restore

<?php
cpdf_save($pdf);
// do all kinds of rotations, transformations, ...
cpdf_restore($pdf)
?>

See also cpdf_save().

上一頁 | 首頁 | 下一頁
cpdf_rect | 上一層 | cpdf_rlineto


cpdf_rlineto

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rlineto -- Draws a line

Description

void cpdf_rlineto ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_rlineto() function draws a line from the current point to the relative point with coordinates (x-coor, y-coor).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_moveto(),
         cpdf_rmoveto(),
         cpdf_curveto().

上一頁 | 首頁 | 下一頁
cpdf_restore | 上一層 | cpdf_rmoveto


cpdf_rmoveto

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rmoveto -- Sets current point

Description

void cpdf_rmoveto ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_rmoveto() function set the current point relative to the coordinates x-coor and y-coor.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_moveto().

上一頁 | 首頁 | 下一頁
cpdf_rlineto | 上一層 | cpdf_rotate_text


cpdf_rotate

(PHP 3>= 3.0.8, PHP 4 )

cpdf_rotate -- Sets rotation

Description

void cpdf_rotate ( int pdf document, float angle)

The cpdf_rotate() function set the rotation in degrees to angle.

上一頁 | 首頁 | 下一頁
cpdf_rotate_text | 上一層 | cpdf_save_to_file


cpdf_rotate_text

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rotate_text -- Sets text rotation angle

Description

void cpdf_rotate_text ( int pdfdoc, float angle)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cpdf_rmoveto | 上一層 | cpdf_rotate


cpdf_save

(PHP 3>= 3.0.8, PHP 4 )

cpdf_save -- Saves current environment

Description

void cpdf_save ( int pdf document)

The cpdf_save() function saves the current environment. It works like the postscript command gsave. Very useful if you want to translate or rotate an object without effecting other objects.

See also cpdf_restore().

上一頁 | 首頁 | 下一頁
cpdf_save_to_file | 上一層 | cpdf_scale


cpdf_save_to_file

(PHP 3>= 3.0.8, PHP 4 )

cpdf_save_to_file -- Writes the pdf document into a file

Description

void cpdf_save_to_file ( int pdf document, string filename)

The cpdf_save_to_file() function outputs the pdf document into a file if it has been created in memory.

This function is not needed if the pdf document has been open by specifying a filename as a parameter of cpdf_open().

See also cpdf_output_buffer(), cpdf_open().

上一頁 | 首頁 | 下一頁
cpdf_rotate | 上一層 | cpdf_save


cpdf_scale

(PHP 3>= 3.0.8, PHP 4 )

cpdf_scale -- Sets scaling

Description

void cpdf_scale ( int pdf document, float x-scale, float y-scale)

The cpdf_scale() function set the scaling factor in both directions.

上一頁 | 首頁 | 下一頁
cpdf_save | 上一層 | cpdf_set_action_url


cpdf_set_action_url

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_action_url -- Sets hyperlink

Description

void cpdf_set_action_url ( int pdfdoc, float xll, float yll, float xur, float xur, string url [, int mode])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cpdf_scale | 上一層 | cpdf_set_char_spacing


cpdf_set_char_spacing

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_char_spacing -- Sets character spacing

Description

void cpdf_set_char_spacing ( int pdf document, float space)

The cpdf_set_char_spacing() function sets the spacing between characters.

See also cpdf_set_word_spacing(), cpdf_set_leading().

上一頁 | 首頁 | 下一頁
cpdf_set_action_url | 上一層 | cpdf_set_creator


cpdf_set_creator

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_creator -- Sets the creator field in the pdf document

Description

void cpdf_set_creator ( string creator)

The cpdf_set_creator() function sets the creator of a pdf document.

See also cpdf_set_subject(),
         cpdf_set_title(),
         cpdf_set_keywords().

上一頁 | 首頁 | 下一頁
cpdf_set_char_spacing | 上一層 | cpdf_set_current_page


cpdf_set_current_page

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_current_page -- Sets current page

Description

void cpdf_set_current_page ( int pdf document, int page number)

The cpdf_set_current_page() function set the page on which all operations are performed. One can switch between pages until a page is finished with cpdf_finalize_page().

See also cpdf_finalize_page().

上一頁 | 首頁 | 下一頁
cpdf_set_creator | 上一層 | cpdf_set_font_directories


cpdf_set_font

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_font -- Select the current font face and size

Description

void cpdf_set_font ( int pdf document, string font name, float size, string encoding)

The cpdf_set_font() function sets the current font face, font size and encoding. Currently only the standard postscript fonts are supported.

The last parameter encoding can take the following values: "MacRomanEncoding", "MacExpertEncoding", "WinAnsiEncoding", and "NULL". "NULL" stands for the font's built-in encoding.

See the ClibPDF Manual for more information, especially how to support asian fonts.

上一頁 | 首頁 | 下一頁
cpdf_set_font_map_file | 上一層 | cpdf_set_horiz_scaling


cpdf_set_font_directories

(PHP 4 >= 4.0.6)

cpdf_set_font_directories -- Sets directories to search when using external fonts

Description

void cpdf_set_font_directories ( int pdfdoc, string pfmdir, string pfbdir)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cpdf_set_current_page | 上一層 | cpdf_set_font_map_file


cpdf_set_font_map_file

(PHP 4 >= 4.0.6)

cpdf_set_font_map_file -- Sets fontname to filename translation map when using external fonts

Description

void cpdf_set_font_map_file ( int pdfdoc, string filename)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cpdf_set_font_directories | 上一層 | cpdf_set_font


cpdf_set_horiz_scaling

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_horiz_scaling -- Sets horizontal scaling of text

Description

void cpdf_set_horiz_scaling ( int pdf document, float scale)

The cpdf_set_horiz_scaling() function sets the horizontal scaling to scale percent.

上一頁 | 首頁 | 下一頁
cpdf_set_font | 上一層 | cpdf_set_keywords


cpdf_set_keywords

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_keywords -- Sets the keywords field of the pdf document

Description

void cpdf_set_keywords ( string keywords)

The cpdf_set_keywords() function sets the keywords of a pdf document.

See also cpdf_set_title(),
         cpdf_set_creator(),
         cpdf_set_subject().

上一頁 | 首頁 | 下一頁
cpdf_set_horiz_scaling | 上一層 | cpdf_set_leading


cpdf_set_leading

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_leading -- Sets distance between text lines

Description

void cpdf_set_leading ( int pdf document, float distance)

The cpdf_set_leading() function sets the distance between text lines. This will be used if text is output by cpdf_continue_text().

See also cpdf_continue_text().

上一頁 | 首頁 | 下一頁
cpdf_set_keywords | 上一層 | cpdf_set_page_animation


cpdf_set_page_animation

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_page_animation -- Sets duration between pages

Description

void cpdf_set_page_animation ( int pdf document, int transition, float duration)

The cpdf_set_page_animation() function set the transition between following pages.

The value of transition can be

0 for none,
1 for two lines sweeping across the screen reveal the page,
2 for multiple lines sweeping across the screen reveal the page,
3 for a box reveals the page,
4 for a single line sweeping across the screen reveals the page,
5 for the old page dissolves to reveal the page,
6 for the dissolve effect moves from one screen edge to another,
7 for the old page is simply replaced by the new page (default)

The value of duration is the number of seconds between page flipping.

上一頁 | 首頁 | 下一頁
cpdf_set_leading | 上一層 | cpdf_set_subject


cpdf_set_subject

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_subject -- Sets the subject field of the pdf document

Description

void cpdf_set_subject ( string subject)

The cpdf_set_subject() function sets the subject of a pdf document.

See also cpdf_set_title(),
         cpdf_set_creator(),
         cpdf_set_keywords().

上一頁 | 首頁 | 下一頁
cpdf_set_page_animation | 上一層 | cpdf_set_text_matrix


cpdf_set_text_matrix

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_matrix -- Sets the text matrix

Description

void cpdf_set_text_matrix ( int pdf document, array matrix)

The cpdf_set_text_matrix() function sets a matrix which describes a transformation applied on the current text font.

上一頁 | 首頁 | 下一頁
cpdf_set_subject | 上一層 | cpdf_set_text_pos


cpdf_set_text_pos

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_pos -- Sets text position

Description

void cpdf_set_text_pos ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_set_text_pos() function sets the position of text for the next cpdf_show() function call.

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

See also cpdf_show(), cpdf_text().

上一頁 | 首頁 | 下一頁
cpdf_set_text_matrix | 上一層 | cpdf_set_text_rendering


cpdf_set_text_rendering

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_rendering -- Determines how text is rendered

Description

void cpdf_set_text_rendering ( int pdf document, int mode)

The cpdf_set_text_rendering() function determines how text is rendered.

The possible values for mode are 0=fill text, 1=stroke text, 2=fill and stroke text, 3=invisible, 4=fill text and add it to clipping path, 5=stroke text and add it to clipping path, 6=fill and stroke text and add it to clipping path, 7=add it to clipping path.

上一頁 | 首頁 | 下一頁
cpdf_set_text_pos | 上一層 | cpdf_set_text_rise


cpdf_set_text_rise

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_rise -- Sets the text rise

Description

void cpdf_set_text_rise ( int pdf document, float value)

The cpdf_set_text_rise() function sets the text rising to value units.

上一頁 | 首頁 | 下一頁
cpdf_set_text_rendering | 上一層 | cpdf_set_title


cpdf_set_title

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_title -- Sets the title field of the pdf document

Description

void cpdf_set_title ( string title)

The cpdf_set_title() function sets the title of a pdf document.

See also cpdf_set_subject(),
         cpdf_set_creator(),
         cpdf_set_keywords().

上一頁 | 首頁 | 下一頁
cpdf_set_text_rise | 上一層 | cpdf_set_viewer_preferences


cpdf_set_viewer_preferences

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_viewer_preferences -- How to show the document in the viewer

Description

void cpdf_set_viewer_preferences ( int pdfdoc, array preferences)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cpdf_set_title | 上一層 | cpdf_set_word_spacing


cpdf_set_word_spacing

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_word_spacing -- Sets spacing between words

Description

void cpdf_set_word_spacing ( int pdf document, float space)

The cpdf_set_word_spacing() function sets the spacing between words.

See also cpdf_set_char_spacing(), cpdf_set_leading().

上一頁 | 首頁 | 下一頁
cpdf_set_viewer_preferences | 上一層 | cpdf_setdash


cpdf_setdash

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setdash -- Sets dash pattern

Description

void cpdf_setdash ( int pdf document, float white, float black)

The cpdf_setdash() function set the dash pattern white white units and black black units. If both are 0 a solid line is set.

上一頁 | 首頁 | 下一頁
cpdf_set_word_spacing | 上一層 | cpdf_setflat


cpdf_setflat

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setflat -- Sets flatness

Description

void cpdf_setflat ( int pdf document, float value)

The cpdf_setflat() function set the flatness to a value between 0 and 100.

上一頁 | 首頁 | 下一頁
cpdf_setdash | 上一層 | cpdf_setgray_fill


cpdf_setgray

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setgray -- Sets drawing and filling color to gray value

Description

void cpdf_setgray ( int pdf document, float gray value)

The cpdf_setgray() function sets the current drawing and filling color to the given gray value.

See also cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor_fill().

上一頁 | 首頁 | 下一頁
cpdf_setgray_stroke | 上一層 | cpdf_setlinecap


cpdf_setgray_fill

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setgray_fill -- Sets filling color to gray value

Description

void cpdf_setgray_fill ( int pdf document, float value)

The cpdf_setgray_fill() function sets the current gray value to fill a path.

See also cpdf_setrgbcolor_fill().

上一頁 | 首頁 | 下一頁
cpdf_setflat | 上一層 | cpdf_setgray_stroke


cpdf_setgray_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setgray_stroke -- Sets drawing color to gray value

Description

void cpdf_setgray_stroke ( int pdf document, float gray value)

The cpdf_setgray_stroke() function sets the current drawing color to the given gray value.

See also cpdf_setrgbcolor_stroke().

上一頁 | 首頁 | 下一頁
cpdf_setgray_fill | 上一層 | cpdf_setgray


cpdf_setlinecap

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setlinecap -- Sets linecap parameter

Description

void cpdf_setlinecap ( int pdf document, int value)

The cpdf_setlinecap() function set the linecap parameter between a value of 0 and 2. 0 = butt end, 1 = round, 2 = projecting square.

上一頁 | 首頁 | 下一頁
cpdf_setgray | 上一層 | cpdf_setlinejoin


cpdf_setlinejoin

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setlinejoin -- Sets linejoin parameter

Description

void cpdf_setlinejoin ( int pdf document, long value)

The cpdf_setlinejoin() function set the linejoin parameter between a value of 0 and 2. 0 = miter, 1 = round, 2 = bevel.

上一頁 | 首頁 | 下一頁
cpdf_setlinecap | 上一層 | cpdf_setlinewidth


cpdf_setlinewidth

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setlinewidth -- Sets line width

Description

void cpdf_setlinewidth ( int pdf document, float width)

The cpdf_setlinewidth() function set the line width to width.

上一頁 | 首頁 | 下一頁
cpdf_setlinejoin | 上一層 | cpdf_setmiterlimit


cpdf_setmiterlimit

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setmiterlimit -- Sets miter limit

Description

void cpdf_setmiterlimit ( int pdf document, float value)

The cpdf_setmiterlimit() function set the miter limit to a value greater or equal than 1.

上一頁 | 首頁 | 下一頁
cpdf_setlinewidth | 上一層 | cpdf_setrgbcolor_fill


cpdf_setrgbcolor

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setrgbcolor -- Sets drawing and filling color to rgb color value

Description

void cpdf_setrgbcolor ( int pdf document, float red value, float green value, float blue value)

The cpdf_setrgbcolor() function sets the current drawing and filling color to the given rgb color value.

See also cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor_fill().

上一頁 | 首頁 | 下一頁
cpdf_setrgbcolor_stroke | 上一層 | cpdf_show_xy


cpdf_setrgbcolor_fill

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setrgbcolor_fill -- Sets filling color to rgb color value

Description

void cpdf_setrgbcolor_fill ( int pdf document, float red value, float green value, float blue value)

The cpdf_setrgbcolor_fill() function sets the current rgb color value to fill a path.

See also cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor().

上一頁 | 首頁 | 下一頁
cpdf_setmiterlimit | 上一層 | cpdf_setrgbcolor_stroke


cpdf_setrgbcolor_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setrgbcolor_stroke -- Sets drawing color to rgb color value

Description

void cpdf_setrgbcolor_stroke ( int pdf document, float red value, float green value, float blue value)

The cpdf_setrgbcolor_stroke() function sets the current drawing color to the given rgb color value.

See also cpdf_setrgbcolor_fill(), cpdf_setrgbcolor().

上一頁 | 首頁 | 下一頁
cpdf_setrgbcolor_fill | 上一層 | cpdf_setrgbcolor


cpdf_show

(PHP 3>= 3.0.8, PHP 4 )

cpdf_show -- Output text at current position

Description

void cpdf_show ( int pdf document, string text)

The cpdf_show() function outputs the string in text at the current position.

See also cpdf_text(),
         cpdf_begin_text(),
         cpdf_end_text().

上一頁 | 首頁 | 下一頁
cpdf_show_xy | 上一層 | cpdf_stringwidth


cpdf_show_xy

(PHP 3>= 3.0.8, PHP 4 )

cpdf_show_xy -- Output text at position

Description

void cpdf_show_xy ( int pdf document, string text, float x-coor, float y-coor [, int mode])

The cpdf_show_xy() function outputs the string text at position with coordinates (x-coor, y-coor).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

註: The function cpdf_show_xy() is identical to cpdf_text() without the optional parameters.

See also cpdf_text().

上一頁 | 首頁 | 下一頁
cpdf_setrgbcolor | 上一層 | cpdf_show


cpdf_stringwidth

(PHP 3>= 3.0.8, PHP 4 )

cpdf_stringwidth -- Returns width of text in current font

Description

float cpdf_stringwidth ( int pdf document, string text)

The cpdf_stringwidth() function returns the width of the string in text. It requires a font to be set before.

See also cpdf_set_font().

上一頁 | 首頁 | 下一頁
cpdf_show | 上一層 | cpdf_stroke


cpdf_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_stroke -- Draw line along path

Description

void cpdf_stroke ( int pdf document)

The cpdf_stroke() function draws a line along current path.

See also cpdf_closepath(), cpdf_closepath_stroke().

上一頁 | 首頁 | 下一頁
cpdf_stringwidth | 上一層 | cpdf_text


cpdf_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_text -- Output text with parameters

Description

void cpdf_text ( int pdf document, string text, float x-coor, float y-coor [, int mode [, float orientation [, int alignmode]]])

The cpdf_text() function outputs the string text at position with coordinates (x-coor, y-coor).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit. The optional parameter orientation is the rotation of the text in degree. The optional parameter alignmode determines how the text is aligned.

See the ClibPDF documentation for possible values.

See also cpdf_show_xy().

上一頁 | 首頁 | 下一頁
cpdf_stroke | 上一層 | cpdf_translate


cpdf_translate

(PHP 3>= 3.0.8, PHP 4 )

cpdf_translate -- Sets origin of coordinate system

Description

void cpdf_translate ( int pdf document, float x-coor, float y-coor [, int mode])

The cpdf_translate() function set the origin of coordinate system to the point (x-coor, y-coor).

The optional parameter mode determines the unit length. If it's 0 or omitted the default unit as specified for the page is used. Otherwise the coordinates are measured in postscript points disregarding the current unit.

上一頁 | 首頁 | 下一頁
cpdf_text | 上一層 | Crack functions


crack_check

(PHP 4 >= 4.0.5)

crack_check -- Performs an obscure check with the given password

Description

bool crack_check ( [resource dictionary, string password])

Returns TRUE if password is strong, or FALSE otherwise.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

crack_check() performs an obscure check with the given password on the specified dictionary . If dictionary is not specified, the last opened dictionary is used.

上一頁 | 首頁 | 下一頁
Crack functions | 上一層 | crack_closedict


crack_closedict

(PHP 4 >= 4.0.5)

crack_closedict -- Closes an open CrackLib dictionary

Description

bool crack_closedict ( [resource dictionary])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

crack_closedict() closes the specified dictionary identifier. If dictionary is not specified, the current dictionary is closed.

上一頁 | 首頁 | 下一頁
crack_check | 上一層 | crack_getlastmessage


crack_getlastmessage

(PHP 4 >= 4.0.5)

crack_getlastmessage -- Returns the message from the last obscure check

Description

string crack_getlastmessage ( void)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

crack_getlastmessage() returns the message from the last obscure check.

上一頁 | 首頁 | 下一頁
crack_closedict | 上一層 | crack_opendict


crack_opendict

(PHP 4 >= 4.0.5)

crack_opendict -- Opens a new CrackLib dictionary

Description

resource crack_opendict ( string dictionary)

Returns a dictionary resource identifier on success, or FALSE on failure.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

crack_opendict() opens the specified CrackLib dictionary for use with crack_check().

註: Only one dictionary may be open at a time.

See also: crack_check(), and crack_closedict().

上一頁 | 首頁 | 下一頁
crack_getlastmessage | 上一層 | CURL, Client URL Library Functions


ctype_alnum

(PHP 4 >= 4.0.4)

ctype_alnum -- Check for alphanumeric character(s)

Description

bool ctype_alnum ( string text)

Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. In the standard C locale letters are just [A-Za-z]. The function is equivalent to (ctype_alpha($text) || ctype_digit($text)).

See also ctype_alpha(), ctype_digit(), and setlocale().

上一頁 | 首頁 | 下一頁
Character type functions | 上一層 | ctype_alpha


ctype_alpha

(PHP 4 >= 4.0.4)

ctype_alpha -- Check for alphabetic character(s)

Description

bool ctype_alpha ( string text)

Returns TRUE if every character in text is a letter from the current locale, FALSE otherwise. In the standard C locale letters are just [A-Za-z] and ctype_alpha() is equivalent to (ctype_upper($text) || ctype_lower($text)), but other languages have letters that are considered neither upper nor lower case.

See also ctype_upper(),
ctype_lower(), and
setlocale().

上一頁 | 首頁 | 下一頁
ctype_alnum | 上一層 | ctype_cntrl


ctype_cntrl

(PHP 4 >= 4.0.4)

ctype_cntrl -- Check for control character(s)

Description

bool ctype_cntrl ( string text)

Returns TRUE if every character in text has a special control function, FALSE otherwise. Control characters are e.g. line feed, tab, esc.

上一頁 | 首頁 | 下一頁
ctype_alpha | 上一層 | ctype_digit


ctype_digit

(PHP 4 >= 4.0.4)

ctype_digit -- Check for numeric character(s)

Description

bool ctype_digit ( string text)

Returns TRUE if every character in text is a decimal digit, FALSE otherwise.

See also ctype_alnum() and ctype_xdigit().

上一頁 | 首頁 | 下一頁
ctype_cntrl | 上一層 | ctype_graph


ctype_graph

(PHP 4 >= 4.0.4)

ctype_graph -- Check for any printable character(s) except space

Description

bool ctype_graph ( string text)

Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.

See also ctype_alnum(), ctype_print(), and ctype_punct().

上一頁 | 首頁 | 下一頁
ctype_digit | 上一層 | ctype_lower


ctype_lower

(PHP 4 >= 4.0.4)

ctype_lower -- Check for lowercase character(s)

Description

bool ctype_lower ( string text)

Returns TRUE if every character in text is a lowercase letter in the current locale.

See also ctype_alpha() and ctype_upper().

上一頁 | 首頁 | 下一頁
ctype_graph | 上一層 | ctype_print


ctype_print

(PHP 4 >= 4.0.4)

ctype_print -- Check for printable character(s)

Description

bool ctype_print ( string text)

Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.

See also ctype_cntrl(), ctype_graph(), and ctype_punct().

上一頁 | 首頁 | 下一頁
ctype_lower | 上一層 | ctype_punct


ctype_punct

(PHP 4 >= 4.0.4)

ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character

Description

bool ctype_punct ( string text)

Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.

See also ctype_cntrl(), ctype_graph(), and ctype_punct().

上一頁 | 首頁 | 下一頁
ctype_print | 上一層 | ctype_space


ctype_space

(PHP 4 >= 4.0.4)

ctype_space -- Check for whitespace character(s)

Description

bool ctype_space ( string text)

Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.

上一頁 | 首頁 | 下一頁
ctype_punct | 上一層 | ctype_upper


ctype_upper

(PHP 4 >= 4.0.4)

ctype_upper -- Check for uppercase character(s)

Description

bool ctype_upper ( string text)

Returns TRUE if every character in text is a uppercase letter in the current locale.

See also ctype_alpha() and ctype_lower().

上一頁 | 首頁 | 下一頁
ctype_space | 上一層 | ctype_xdigit


ctype_xdigit

(PHP 4 >= 4.0.4)

ctype_xdigit -- Check for character(s) representing a hexadecimal digit

Description

bool ctype_xdigit ( string text)

Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.

See also ctype_digit().

上一頁 | 首頁 | 下一頁
ctype_upper | 上一層 | Database (dbm-style) abstraction layer functions


curl_close

(PHP 4 >= 4.0.2)

curl_close -- Close a CURL session

Description

void curl_close ( resource ch)

This function closes a CURL session and frees all resources. The CURL handle, ch, is also deleted.

上一頁 | 首頁 | 下一頁
CURL, Client URL Library Functions | 上一層 | curl_errno


curl_errno

(PHP 4 >= 4.0.3)

curl_errno -- Return an integer containing the last error number

Description

int curl_errno ( resource ch)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
curl_close | 上一層 | curl_error


curl_error

(PHP 4 >= 4.0.3)

curl_error -- Return a string containing the last error for the current session

Description

string curl_error ( resource ch)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
curl_errno | 上一層 | curl_exec


curl_exec

(PHP 4 >= 4.0.2)

curl_exec -- Perform a CURL session

Description

bool curl_exec ( resource ch)

This function should be called after you initialize a CURL session and all the options for the session are set. Its purpose is simply to execute the predefined CURL session (given by the ch).

提示: 為了防止程序直接將結果輸出到瀏覽器，您可以使用輸出控制函式（output-control functions）來捕獲函式的輸出，並把它們保存到一個 string 型的變數中。

上一頁 | 首頁 | 下一頁
curl_error | 上一層 | curl_getinfo


curl_getinfo

(PHP 4 >= 4.0.4)

curl_getinfo -- Get information regarding a specific transfer

Description

string curl_getinfo ( resource ch, int opt)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
curl_exec | 上一層 | curl_init


curl_init

(PHP 4 >= 4.0.2)

curl_init -- Initialize a CURL session

Description

resource curl_init ( [string url])

The curl_init() will initialize a new session and return a CURL handle for use with the curl_setopt(), curl_exec(), and curl_close() functions. If the optional url parameter is supplied then the CURLOPT_URL option will be set to the value of the parameter. You can manually set this using the curl_setopt() function.

例子 1. Initializing a new CURL session and fetching a webpage

<?php
$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt ($ch, CURLOPT_HEADER, 0);

curl_exec ($ch);

curl_close ($ch);
?>

See also: curl_close(), curl_setopt()

上一頁 | 首頁 | 下一頁
curl_getinfo | 上一層 | curl_setopt


curl_setopt

(PHP 4 >= 4.0.2)

curl_setopt -- Set an option for a CURL transfer

Description

bool curl_setopt ( resource ch, string option, mixed value)

The curl_setopt() function will set options for a CURL session identified by the ch parameter. The option parameter is the option you want to set, and the value is the value of the option given by the option.

The value should be a long for the following options (specified in the option parameter):

  • CURLOPT_INFILESIZE: When you are uploading a file to a remote site, this option should be used to tell PHP what the expected size of the infile will be.

  • CURLOPT_VERBOSE: Set this option to a non-zero value if you want CURL to report everything that is happening.

  • CURLOPT_HEADER: Set this option to a non-zero value if you want the header to be included in the output.

  • CURLOPT_NOPROGRESS: Set this option to a non-zero value if you don't want PHP to display a progress meter for CURL transfers.

    註: PHP automatically sets this option to a non-zero parameter, this should only be changed for debugging purposes.

  • CURLOPT_NOBODY: Set this option to a non-zero value if you don't want the body included with the output.

  • CURLOPT_FAILONERROR: Set this option to a non-zero value if you want PHP to fail silently if the HTTP code returned is greater than 300. The default behavior is to return the page normally, ignoring the code.

  • CURLOPT_UPLOAD: Set this option to a non-zero value if you want PHP to prepare for an upload.

  • CURLOPT_POST: Set this option to a non-zero value if you want PHP to do a regular HTTP POST. This POST is a normal application/x-www-form-urlencoded kind, most commonly used by HTML forms.

  • CURLOPT_FTPLISTONLY: Set this option to a non-zero value and PHP will just list the names of an FTP directory.

  • CURLOPT_FTPAPPEND: Set this option to a non-zero value and PHP will append to the remote file instead of overwriting it.

  • CURLOPT_NETRC: Set this option to a non-zero value and PHP will scan your ~./netrc file to find your username and password for the remote site that you're establishing a connection with.

  • CURLOPT_FOLLOWLOCATION: Set this option to a non-zero value to follow any "Location: " header that the server sends as a part of the HTTP header (note this is recursive, PHP will follow as many "Location: " headers that it is sent.)

  • CURLOPT_PUT: Set this option to a non-zero value to HTTP PUT a file. The file to PUT must be set with the CURLOPT_INFILE and CURLOPT_INFILESIZE.

  • CURLOPT_MUTE: Set this option to a non-zero value and PHP will be completely silent with regards to the CURL functions.

  • CURLOPT_TIMEOUT: Pass a long as a parameter that contains the maximum time, in seconds, that you'll allow the CURL functions to take.

  • CURLOPT_LOW_SPEED_LIMIT: Pass a long as a parameter that contains the transfer speed in bytes per second that the transfer should be below during CURLOPT_LOW_SPEED_TIME seconds for PHP to consider it too slow and abort.

  • CURLOPT_LOW_SPEED_TIME: Pass a long as a parameter that contains the time in seconds that the transfer should be below the CURLOPT_LOW_SPEED_LIMIT for PHP to consider it too slow and abort.

  • CURLOPT_RESUME_FROM: Pass a long as a parameter that contains the offset, in bytes, that you want the transfer to start from.

  • CURLOPT_SSLVERSION: Pass a long as a parameter that contains the SSL version (2 or 3) to use. By default PHP will try and determine this by itself, although, in some cases you must set this manually.

  • CURLOPT_SSL_VERIFYHOST: Pass a long if CURL should verify the Common name of the peer certificate in the SSL handshake. A value of 1 denotes that we should check for the existence of the common name, a value of 2 denotes that we should make sure it matches the provided hostname.

  • CURLOPT_TIMECONDITION: Pass a long as a parameter that defines how the CURLOPT_TIMEVALUE is treated. You can set this parameter to TIMECOND_IFMODSINCE or TIMECOND_ISUNMODSINCE. This is a HTTP-only feature.

  • CURLOPT_TIMEVALUE: Pass a long as a parameter that is the time in seconds since January 1st, 1970. The time will be used as specified by the CURLOPT_TIMEVALUE option, or by default the TIMECOND_IFMODSINCE will be used.

  • CURLOPT_RETURNTRANSFER: Pass a non-zero value if you want CURL to directly return the transfer instead of printing it out directly.

The value parameter should be a string for the following values of the option parameter:

  • CURLOPT_URL: This is the URL that you want PHP to fetch. You can also set this option when initializing a session with the curl_init() function.

  • CURLOPT_USERPWD: Pass a string formatted in the [username]:[password] manner, for PHP to use for the connection.

  • CURLOPT_PROXYUSERPWD: Pass a string formatted in the [username]:[password] format for connection to the HTTP proxy.

  • CURLOPT_RANGE: Pass the specified range you want. It should be in the "X-Y" format, where X or Y may be left out. The HTTP transfers also support several intervals, separated with commas as in X-Y,N-M.

  • CURLOPT_POSTFIELDS: Pass a string containing the full data to post in an HTTP "POST" operation.

  • CURLOPT_REFERER: Pass a string containing the "referer" header to be used in an HTTP request.

  • CURLOPT_USERAGENT: Pass a string containing the "user-agent" header to be used in an HTTP request.

  • CURLOPT_FTPPORT: Pass a string containing the value which will be used to get the IP address to use for the ftp "POST" instruction. The POST instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a hostname, a network interface name (under UNIX), or just a plain '-' to use the systems default IP address.

  • CURLOPT_COOKIE: Pass a string containing the content of the cookie to be set in the HTTP header.

  • CURLOPT_SSLCERT: Pass a string containing the filename of PEM formatted certificate.

  • CURLOPT_SSLCERTPASSWD: Pass a string containing the password required to use the CURLOPT_SSLCERT certificate.

  • CURLOPT_COOKIEFILE: Pass a string containing the name of the file containing the cookie data. The cookie file can be in Netscape format, or just plain HTTP-style headers dumped into a file.

  • CURLOPT_CUSTOMREQUEST: Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing DELETE or other, more obscure, HTTP requests. Valid values are things like GET, POST, and so on; i.e. do not enter a whole HTTP request line here. For instance, entering 'GET /index.html HTTP/1.0\r\n\r\n' would be incorrect.

    註: Don't do this without making sure your server supports the command first.

  • CURLOPT_PROXY: Give the name of the HTTP proxy to tunnel requests through.

  • CURLOPT_INTERFACE: Pass the name of the outgoing network interface to use. This can be an interface name, an IP address or a host name.

  • CURLOPT_KRB4LEVEL: Pass the KRB4 (Kerberos 4) security level. Anyone of the following strings (in order from least powerful, to most powerful): 'clear', 'safe', 'confidential', 'private'. If the string does not match one of these, then 'private' is used. If you set this to NULL, this disables KRB4 security. KRB4 security only works with FTP transactions currently.

  • CURLOPT_HTTPHEADER: Pass an array of HTTP header fields to set.

  • CURLOPT_QUOTE: Pass an array of FTP commands to perform on the server prior to the FTP request.

  • CURLOPT_POSTQUOTE: Pass an array of FTP commands to execute on the server, after the FTP request has been performed.

The following options expect a file descriptor that is obtained by using the fopen() function:

  • CURLOPT_FILE: The file where the output of your transfer should be placed, the default is STDOUT.

  • CURLOPT_INFILE: The file where the input of your transfer comes from.

  • CURLOPT_WRITEHEADER: The file to write the header part of the output into.

  • CURLOPT_STDERR: The file to write errors to instead of stderr.

上一頁 | 首頁 | 下一頁
curl_init | 上一層 | curl_version


curl_version

(PHP 4 >= 4.0.2)

curl_version -- Return the current CURL version

Description

string curl_version ( void)

The curl_version() function returns a string containing the current CURL version.

上一頁 | 首頁 | 下一頁
curl_setopt | 上一層 | Cybercash payment functions


current

(PHP 3, PHP 4 )

current -- 傳回陣列中的當前單元

說明

mixed current ( array array)

每個陣列中都有一個內部的指針指向它“當前的”單元，初始指向插入到陣列中的第一個單元。

current() 函式傳回當前被內部指針指向的陣列單元的值，並不移動指針。如果內部指針指向超出了單元列表的末端，current() 傳回 FALSE。

警告

如果陣列包含有空的單元（0 或者 ""，空字串）則本函式在碰到這個單元時也傳回 FALSE。這使得用 current() 不可能判斷是否到了此陣列列表的末端。要正確遍歷可能含有空單元的陣列，用 each() 函式。

參見 end()，next()，prev() 和 reset()。

上一頁 | 首頁 | 下一頁
count | 上一層 | each


cybercash_base64_decode

(PHP 4 )

cybercash_base64_decode -- base64 decode data for Cybercash

Description

string cybercash_base64_decode ( string inbuff)

上一頁 | 首頁 | 下一頁
Cybercash payment functions | 上一層 | cybercash_base64_encode


cybercash_base64_encode

(PHP 4 )

cybercash_base64_encode -- base64 encode data for Cybercash

Description

string cybercash_base64_encode ( string inbuff)

上一頁 | 首頁 | 下一頁
cybercash_base64_decode | 上一層 | cybercash_decr


cybercash_decr

(PHP 4 )

cybercash_decr -- Cybercash decrypt

Description

array cybercash_decr ( string wmk, string sk, string inbuff)

The function returns an associative array with the elements "errcode" and, if "errcode" is FALSE, "outbuff" (string), "outLth" (long) and "macbuff" (string).

上一頁 | 首頁 | 下一頁
cybercash_base64_encode | 上一層 | cybercash_encr


cybercash_encr

(PHP 4 )

cybercash_encr -- Cybercash encrypt

Description

array cybercash_encr ( string wmk, string sk, string inbuff)

The function returns an associative array with the elements "errcode" and, if "errcode" is FALSE, "outbuff" (string), "outLth" (long) and "macbuff" (string).

上一頁 | 首頁 | 下一頁
cybercash_decr | 上一層 | Crｅdit Mutuel CyberMUT functions


cybermut_creerformulairecm

(PHP 4 >= 4.0.5)

cybermut_creerformulairecm -- Generate HTML form of request for payment

Description

string cybermut_creerformulairecm ( string url_CM, string version, string TPE, string montant, string ref_commande, string texte_libre, string url_retour, string url_retour_ok, string url_retour_err, string langue, string code_societe, string texte_bouton)

cybermut_creerformulairecm() is used to generate the HTML form of request for payment.

例子 1. First step of payment (equiv cgi1.c)

<?php
// Directory where the keys are located
putenv("CMKEYDIR=/var/creditmut/cles");

// Version number
$VERSION="1.2";

  $retour =  cybermut_creerformulairecm(
  "https://www.creditmutuel.fr/test/telepaiement/paiement.cgi",
  $VERSION,
  "1234567890",
  "300FRF",
  $REFERENCE,
  $TEXTE_LIBRE,
  $URL_RETOUR,
  $URL_RETOUR_OK,
  $URL_RETOUR_ERR,
  "francais",
  "company",
  "Paiement par carte bancaire");

  echo $retour;
?>

See also cybermut_testmac() and cybermut_creerreponsecm().

上一頁 | 首頁 | 下一頁
Crｅdit Mutuel CyberMUT functions | 上一層 | cybermut_creerreponsecm


cybermut_creerreponsecm

(PHP 4 >= 4.0.5)

cybermut_creerreponsecm -- Generate the acknowledgement of delivery of the confirmation of payment

Description

string cybermut_creerreponsecm ( string phrase)

cybermut_creerreponsecm() returns a string containing delivery acknowledgement message.

The parameter is "OK" if the message of confirmation of the payment was correctly identified by cybermut_testmac(). Any other chain is regarded as an error message.

See also cybermut_creerformulairecm() and cybermut_testmac().

上一頁 | 首頁 | 下一頁
cybermut_creerformulairecm | 上一層 | cybermut_testmac


cybermut_testmac

(PHP 4 >= 4.0.5)

cybermut_testmac -- Make sure that there no was data diddling contained in the received message of confirmation

Description

bool cybermut_testmac ( string code_MAC, string version, string TPE, string cdate, string montant, string ref_commande, string texte_libre, string code-retour)

cybermut_testmac() is used to make sure that there was not data diddling contained in the received message of confirmation. Pay attention to parameters code-retour and texte-libre, which cannot be evaluated as is, because of the dash. You must retrieve them by using:
<?php
  $code_retour = $_GET["code-retour"];
  $texte_libre = $_GET["texte-libre"];
?>

例子 1. Last step of payment (equiv cgi2.c)

<?php
// Make sure that Enable Track Vars is ON.
// Directory where are located the keys
putenv("CMKEYDIR=/var/creditmut/cles");

// Version number
$VERSION="1.2";

$texte_libre = $_GET["texte-libre"];
$code_retour = $_GET["code-retour"];

$mac_ok = cybermut_testmac($MAC,$VERSION,$TPE,$date,$montant,$reference,$texte_libre,$code_retour);

if ($mac_ok) {

  //
  // insert data processing here
  //
  //

  $result=cybermut_creerreponsecm("OK");
} else {
  $result=cybermut_creerreponsecm("Document Falsifie");
}

?>

See also cybermut_creerformulairecm() and cybermut_creerreponsecm().

上一頁 | 首頁 | 下一頁
cybermut_creerreponsecm | 上一層 | Cyrus IMAP administration functions


cyrus_authenticate

(PHP 4 >= 4.1.0)

cyrus_authenticate -- Authenticate against a Cyrus IMAP server

Description

bool cyrus_authenticate ( resource connection [, string mechlist [, string service [, string user [, int minssf [, int maxssf]]]]])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
Cyrus IMAP administration functions | 上一層 | cyrus_bind


cyrus_bind

(PHP 4 >= 4.1.0)

cyrus_bind -- Bind callbacks to a Cyrus IMAP connection

Description

bool cyrus_bind ( resource connection, array callbacks)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cyrus_authenticate | 上一層 | cyrus_close


cyrus_close

(PHP 4 >= 4.1.0)

cyrus_close -- Close connection to a Cyrus IMAP server

Description

bool cyrus_close ( resource connection)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cyrus_bind | 上一層 | cyrus_connect


cyrus_connect

(PHP 4 >= 4.1.0)

cyrus_connect -- Connect to a Cyrus IMAP server

Description

resource cyrus_connect ( [string host [, string port [, int flags]]])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cyrus_close | 上一層 | cyrus_query


cyrus_query

(PHP 4 >= 4.1.0)

cyrus_query -- Send a query to a Cyrus IMAP server

Description

bool cyrus_query ( resource connection, string query)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cyrus_connect | 上一層 | cyrus_unbind


cyrus_unbind

(PHP 4 >= 4.1.0)

cyrus_unbind -- Unbind ...

Description

bool cyrus_unbind ( resource connection, string trigger_name)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
cyrus_query | 上一層 | Character type functions


date

(PHP 3, PHP 4 )

date -- 格式化一個本地時間／日期

說明

string date ( string format [, int timestamp])

傳回將整數 timestamp 按照給定的格式字串而產生的字串。如果沒有給出時間戳則使用本地當前時間。

註: 有效的時間戳典型範圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07。（此範圍符合 32 位有符號整數的最小值和最大值）。在 Windows 系統中此範圍限制為從 1970 年 1 月 1 日到 2038 年 1 月 19 日。

要將字串表達的時間轉換成時間戳，應該使用 strtotime()。此外一些資料庫有一些函式將其時間格式轉換成時間戳（例如 MySQL 的 UNIX_TIMESTAMP 函式）。

格式字串可以識別以下字元：

  • a - "am" 或 "pm"

  • A - "AM" 或 "PM"

  • B - Swatch Internet Time（【譯者注】參見 http://swatch.com/alu_beat/fs_itime.html）

  • d - 月份中的第幾天，有前導零的 2 位數字，例如 "01" to "31"

  • D - 星期中的第幾天，文本表示，3 個字母，例如 "Fri"

  • F - 月份，完整的文本格式，例如 "January"

  • g - 小時，12 小時格式，沒有前導零，例如 "1" 到 "12"

  • G - 小時，24 小時格式，沒有前導零，例如 "0" 到 "23"

  • h - 小時，12 小時格式，例如 "01" 到 "12"

  • H - 小時，24 小時格式，例如 "00" 到 "23"

  • i - 分鐘，例如 "00" 到 "59"

  • I（“i”的大寫的字母）- 如果是夏令時則為 "1"，否則為 "0"

  • j - 月份中的第幾天，沒有前導零，例如 "1" 到 "31"

  • l（“L”的小寫字母）- 星期中的第幾天，完整的文本格式，例如 "Friday"

  • L - 布爾值表示是否為閏年，例如 "0" 或者 "1"

  • m - 月份，例如 "01" to "12"

  • M - 月份，文本表示，3 個字母，例如 "Jan"

  • n - 月份，沒有前導零，例如 "1" 到 "12"

  • O - 與格林威治時間相差的小時數，例如 "+0200"

  • r - RFC 822 格式的日期，例如 "Thu, 21 Dec 2000 16:01:07 +0200"（PHP 4.0.4新增）

  • s - 秒數，例如 "00" 到 "59"

  • S - 每月天數後面的英文後綴，2 個字元，例如 "st"，"nd"，"rd" 或者 "th"

  • t - 給定月份所應有的天數，例如 "28" 到 "31"

  • T - 本機所在的時區，例如 "EST" 或 "MDT"（【譯者注】在 Windows 下為完整文本格式，例如▽lastern Standard Time”，中文版會顯示“中國標準時間”。）

  • U - 從 Unix 紀元（January 1 1970 00:00:00 GMT）開始至今的秒數

  • w - 星期中的第幾天，數字表示，例如 "0"（星期天）到 "6" (Saturday)

  • W - ISO-8601 格式年份中的第幾周，每周從星期一開始（PHP 4.1.0 新加的）

  • Y - 年份，4 位數字，例如 "1999"

  • y - 年費，2 位數字，例如 "99"

  • z - 年份中的第幾天，例如 "0" 到 "365"

  • Z - 時差偏移量的秒數（例如 "-43200" 到 "43200"）。UTC 西邊的時區偏移量總是負的，UTC 東邊的時區偏移量總是正的。

格式字串中不能被識別的字元將原樣顯示。“Z”格式在使用 gmdate() 時總是傳回“0”。

例子 1. date() 例子

echo date ("l dS of F Y h:i:s A");
echo "July 1, 2000 is on a " . date ("l", mktime(0,0,0,7,1,2000));

在格式字串中的字元前加上反斜線來轉義可以避免它被按照上表解釋。如果加上反斜線後的字元本身就是一個特殊序列，那還要轉義反斜線。

例子 2. 在 date() 中轉義字元

echo date("l \\t\h\e jS"); // 顯示類似於：Saturday the 8th

可以把 date() 和 mktime() 結合使用來得到未來或過去的日期。

例子 3. date() 和 mktime() 例子

$tomorrow  = mktime (0,0,0,date("m")  ,date("d")+1,date("Y"));
$lastmonth = mktime (0,0,0,date("m")-1,date("d"),  date("Y"));
$nextyear  = mktime (0,0,0,date("m"),  date("d"),  date("Y")+1);

註: 由於夏令時的緣故，這種方法比簡單地在時間戳上加減一天或者一個月的秒數更可靠。

一些使用 date() 格式化日期的例子。注意要轉義所有其它的字元，因為目前有特殊含義的字元會產生不需要的結果，而其餘字元在 PHP 將來的版本中可能會被用上。當轉義時，注意用單引號以避免類似 \n 的字元變成了換行符。

例子 4. date() Formatting

/* Today is March 10th, 2001, 5:16:18 pm */
$today = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$today = date("m.d.y");                         // 03.10.01
$today = date("j, n, Y");                       // 10, 3, 2001
$today = date("Ymd");                           // 20010310
$today = date('h-i-s, j-m-y, it is w Day z ');  // 05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.');   // It is the 10th day.
$today = date("D M j G:i:s T Y");               // Sat Mar 10 15:16:08 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:17 m is month
$today = date("H:i:s");                         // 17:16:17

要格式化其它語種的日期，應該用 setlocale() 和 strftime() 函式。

參見 getlastmod()，gmdate()，mktime()，strftime() 和 time()。

上一頁 | 首頁 | 下一頁
checkdate | 上一層 | getdate


dba_close

(PHP 3>= 3.0.8, PHP 4 )

dba_close -- Close database

Description

void dba_close ( resource handle)

dba_close() closes the established database and frees all resources specified by handle.

handle is a database handle returned by dba_open().

dba_close() does not return any value.

See also: dba_open() and dba_popen()

上一頁 | 首頁 | 下一頁
Database (dbm-style) abstraction layer functions | 上一層 | dba_delete


dba_exists

(PHP 3>= 3.0.8, PHP 4 )

dba_exists -- Check whether key exists

Description

bool dba_exists ( string key, resource handle)

dba_exists() checks whether the specified key exists in the database specified by handle.

Key is the key the check is performed for.

Handle is a database handle returned by dba_open().

dba_exists() returns TRUE or FALSE, if the key is found or not found, respectively.

See also: dba_fetch(),
dba_delete(), dba_insert(),
and dba_replace().

上一頁 | 首頁 | 下一頁
dba_delete | 上一層 | dba_fetch


dba_fetch

(PHP 3>= 3.0.8, PHP 4 )

dba_fetch -- Fetch data specified by key

Description

string dba_fetch ( string key, resource handle)

dba_fetch() fetches the data specified by key from the database specified with handle.

Key is the key the data is specified by.

Handle is a database handle returned by dba_open().

dba_fetch() returns the associated string or FALSE, if the key/data pair is found or not found, respectively.

See also: dba_exists(),
dba_delete(), dba_insert(),
and dba_replace().

上一頁 | 首頁 | 下一頁
dba_exists | 上一層 | dba_firstkey


dba_firstkey

(PHP 3>= 3.0.8, PHP 4 )

dba_firstkey -- Fetch first key

Description

string dba_firstkey ( resource handle)

dba_firstkey() returns the first key of the database specified by handle and resets the internal key pointer. This permits a linear search through the whole database.

Handle is a database handle returned by dba_open().

dba_firstkey() returns the key or FALSE depending on whether it succeeds or fails, respectively.

See also: dba_nextkey() and example 2 in the DBA examples

上一頁 | 首頁 | 下一頁
dba_fetch | 上一層 | dba_insert


dba_insert

(PHP 3>= 3.0.8, PHP 4 )

dba_insert -- Insert entry

Description

bool dba_insert ( string key, string value, resource handle)

dba_insert() inserts the entry described with key and value into the database specified by handle. It fails, if an entry with the same key already exists.

key is the key of the entry to be inserted.

value is the value to be inserted.

handle is a database handle returned by dba_open().

dba_insert() returns TRUE or FALSE, depending on whether it succeeds of fails, respectively.

See also:
dba_exists()
dba_delete()
dba_fetch()
dba_replace()

上一頁 | 首頁 | 下一頁
dba_firstkey | 上一層 | dba_nextkey


dba_nextkey

(PHP 3>= 3.0.8, PHP 4 )

dba_nextkey -- Fetch next key

Description

string dba_nextkey ( resource handle)

dba_nextkey() returns the next key of the database specified by handle and advances the internal key pointer.

handle is a database handle returned by dba_open().

dba_nextkey() returns the key or FALSE depending on whether it succeeds or fails, respectively.

See also: dba_firstkey() and example 2 in the DBA examples

上一頁 | 首頁 | 下一頁
dba_insert | 上一層 | dba_open


dba_open

(PHP 3>= 3.0.8, PHP 4 )

dba_open -- Open database

Description

resource dba_open ( string path, string mode, string handler [, ...])

dba_open() establishes a database instance for path with mode using handler.

path is commonly a regular path in your filesystem.

mode is "r" for read access, "w" for read/write access to an already existing database, "c" for read/write access and database creation if it doesn't currently exist, and "n" for create, truncate and read/write access.

handler is the name of the handler which shall be used for accessing path. It is passed all optional parameters given to dba_open() and can act on behalf of them.

dba_open() returns a positive handle or FALSE, in the case the open is successful or fails, respectively.

See also: dba_popen() dba_close()

上一頁 | 首頁 | 下一頁
dba_nextkey | 上一層 | dba_optimize


dba_optimize

(PHP 3>= 3.0.8, PHP 4 )

dba_optimize -- Optimize database

Description

bool dba_optimize ( resource handle)

dba_optimize() optimizes the underlying database specified by handle.

handle is a database handle returned by dba_open().

dba_optimize() returns TRUE or FALSE, if the optimization succeeds or fails, respectively.

See also: dba_sync()

上一頁 | 首頁 | 下一頁
dba_open | 上一層 | dba_popen


dba_popen

(PHP 3>= 3.0.8, PHP 4 )

dba_popen -- Open database persistently

Description

resource dba_popen ( string path, string mode, string handler [, ...])

dba_popen() establishes a persistent database instance for path with mode using handler.

path is commonly a regular path in your filesystem.

mode is "r" for read access, "w" for read/write access to an already existing database, "c" for read/write access and database creation if it doesn't currently exist, and "n" for create, truncate and read/write access.

handler is the name of the handler which shall be used for accessing path. It is passed all optional parameters given to dba_popen() and can act on behalf of them.

dba_popen() returns a positive handle or FALSE, in the case the open is successful or fails, respectively.

See also: dba_open() dba_close()

上一頁 | 首頁 | 下一頁
dba_optimize | 上一層 | dba_replace


dba_replace

(PHP 3>= 3.0.8, PHP 4 )

dba_replace -- Replace or insert entry

Description

bool dba_replace ( string key, string value, resource handle)

dba_replace() replaces or inserts the entry described with key and value into the database specified by handle.

key is the key of the entry to be inserted.

value is the value to be inserted.

handle is a database handle returned by dba_open().

dba_replace() returns TRUE or FALSE, depending on whether it succeeds of fails, respectively.

See also: dba_exists(),
dba_delete(), dba_fetch(),
and dba_insert().

上一頁 | 首頁 | 下一頁
dba_popen | 上一層 | dba_sync


dba_sync

(PHP 3>= 3.0.8, PHP 4 )

dba_sync -- Synchronize database

Description

bool dba_sync ( resource handle)

dba_sync() synchronizes the database specified by handle. This will probably trigger a physical write to disk, if supported.

handle is a database handle returned by dba_open().

dba_sync() returns TRUE or FALSE, if the synchronization succeeds or fails, respectively.

See also: dba_optimize()

上一頁 | 首頁 | 下一頁
dba_replace | 上一層 | 時間日期函式庫


dbase_add_record

(PHP 3, PHP 4 )

dbase_add_record -- Add a record to a dBase database

Description

bool dbase_add_record ( int dbase_identifier, array record)

Adds the data in the record to the database. If the number of items in the supplied record isn't equal to the number of fields in the database, the operation will fail and FALSE will be returned.

上一頁 | 首頁 | 下一頁
dBase functions | 上一層 | dbase_close


dbase_close

(PHP 3, PHP 4 )

dbase_close -- Close a dBase database

Description

bool dbase_close ( int dbase_identifier)

Closes the database associated with dbase_identifier.

上一頁 | 首頁 | 下一頁
dbase_add_record | 上一層 | dbase_create


dbase_create

(PHP 3, PHP 4 )

dbase_create -- Creates a dBase database

Description

int dbase_create ( string filename, array fields)

The fields parameter is an array of arrays, each array describing the format of one field in the database. Each field consists of a name, a character indicating the field type, a length, and a precision.

The types of fields available are:

L

Boolean. These do not have a length or precision.

M

Memo. (Note that these aren't supported by PHP.) These do not have a length or precision.

D

Date (stored as YYYYMMDD). These do not have a length or precision.

N

Number. These have both a length and a precision (the number of digits after the decimal point).

C

String.

If the database is successfully created, a dbase_identifier is returned, otherwise FALSE is returned.

例子 1. Creating a dBase database file

// "database" name
$dbname = "/tmp/test.dbf";

// database "definition"
$def =
    array(
        array("date",     "D"),
        array("name",     "C",  50),
        array("age",      "N",   3, 0),
        array("email",    "C", 128),
        array("ismember", "L")
    );

// creation
if (!dbase_create($dbname, $def))
    print "<strong>Error!</strong>";

上一頁 | 首頁 | 下一頁
dbase_close | 上一層 | dbase_delete_record


dbase_get_record

(PHP 3, PHP 4 )

dbase_get_record -- Gets a record from a dBase database

Description

array dbase_get_record ( int dbase_identifier, int record)

Returns the data from record in an array. The array is indexed starting at 0, and includes an associative member named 'deleted' which is set to 1 if the record has been marked for deletion (see dbase_delete_record().

Each field is converted to the appropriate PHP type, except:

  • Dates are left as strings

  • Integers that would have caused an overflow (> 32 bits) are returned as strings

上一頁 | 首頁 | 下一頁
dbase_get_record_with_names | 上一層 | dbase_numfields


dbase_get_record_with_names

(PHP 3>= 3.0.4, PHP 4 )

dbase_get_record_with_names -- Gets a record from a dBase database as an associative array

Description

array dbase_get_record_with_names ( int dbase_identifier, int record)

Returns the data from record in an associative array. The array also includes an associative member named 'deleted' which is set to 1 if the record has been marked for deletion (see dbase_delete_record()).

Each field is converted to the appropriate PHP type, except:

  • Dates are left as strings

  • Integers that would have caused an overflow (> 32 bits) are returned as strings

上一頁 | 首頁 | 下一頁
dbase_delete_record | 上一層 | dbase_get_record


dbase_numfields

(PHP 3, PHP 4 )

dbase_numfields -- Find out how many fields are in a dBase database

Description

int dbase_numfields ( int dbase_identifier)

Returns the number of fields (columns) in the specified database. Field numbers are between 0 and dbase_numfields($db)-1, while record numbers are between 1 and dbase_numrecords($db).

例子 1. Using dbase_numfields()

$rec = dbase_get_record($db, $recno);
$nf  = dbase_numfields($db);
for ($i=0; $i < $nf; $i++) {
    print $rec[$i]."<br>\n";
}

上一頁 | 首頁 | 下一頁
dbase_get_record | 上一層 | dbase_numrecords


dbase_numrecords

(PHP 3, PHP 4 )

dbase_numrecords -- Find out how many records are in a dBase database

Description

int dbase_numrecords ( int dbase_identifier)

Returns the number of records (rows) in the specified database. Record numbers are between 1 and dbase_numrecords($db), while field numbers are between 0 and dbase_numfields($db)-1.

上一頁 | 首頁 | 下一頁
dbase_numfields | 上一層 | dbase_open


dbase_open

(PHP 3, PHP 4 )

dbase_open -- Opens a dBase database

Description

int dbase_open ( string filename, int flags)

The flags correspond to those for the open() system call. (Typically 0 means read-only, 1 means write-only, and 2 means read and write.)

Returns a dbase_identifier for the opened database, or FALSE if the database couldn't be opened.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

上一頁 | 首頁 | 下一頁
dbase_numrecords | 上一層 | dbase_pack


dbase_pack

(PHP 3, PHP 4 )

dbase_pack -- Packs a dBase database

Description

bool dbase_pack ( int dbase_identifier)

Packs the specified database (permanently deleting all records marked for deletion using dbase_delete_record()).

上一頁 | 首頁 | 下一頁
dbase_open | 上一層 | dbase_replace_record


dbase_replace_record

(PHP 3>= 3.0.11, PHP 4 )

dbase_replace_record -- Replace a record in a dBase database

Description

bool dbase_replace_record ( int dbase_identifier, array record, int dbase_record_number)

Replaces the data associated with the record record_number with the data in the record in the database. If the number of items in the supplied record is not equal to the number of fields in the database, the operation will fail and FALSE will be returned.

dbase_record_number is an integer which spans from 1 to the number of records in the database (as returned by dbase_numrecords()).

上一頁 | 首頁 | 下一頁
dbase_pack | 上一層 | DBM Functions


dblist

(PHP 3, PHP 4 )

dblist -- Describes the DBM-compatible library being used

Description

string dblist ( void)

上一頁 | 首頁 | 下一頁
DBM Functions | 上一層 | dbmclose


dbmclose

(PHP 3, PHP 4 )

dbmclose -- Closes a dbm database

Description

bool dbmclose ( resource dbm_identifier)

Unlocks and closes the specified database.

上一頁 | 首頁 | 下一頁
dblist | 上一層 | dbmdelete


dbmexists

(PHP 3, PHP 4 )

dbmexists -- Tells if a value exists for a key in a DBM database

Description

bool dbmexists ( resource dbm_identifier, string key)

Returns TRUE if there is a value associated with the key.

上一頁 | 首頁 | 下一頁
dbmdelete | 上一層 | dbmfetch


dbmfetch

(PHP 3, PHP 4 )

dbmfetch -- Fetches a value for a key from a DBM database

Description

string dbmfetch ( resource dbm_identifier, string key)

Returns the value associated with key.

上一頁 | 首頁 | 下一頁
dbmexists | 上一層 | dbmfirstkey


dbmfirstkey

(PHP 3, PHP 4 )

dbmfirstkey -- Retrieves the first key from a DBM database

Description

string dbmfirstkey ( resource dbm_identifier)

Returns the first key in the database. Note that no particular order is guaranteed since the database may be built using a hash-table, which doesn't guarantee any ordering.

上一頁 | 首頁 | 下一頁
dbmfetch | 上一層 | dbminsert


dbminsert

(PHP 3, PHP 4 )

dbminsert -- Inserts a value for a key in a DBM database

Description

int dbminsert ( resource dbm_identifier, string key, string value)

Adds the value to the database with the specified key.

Returns -1 if the database was opened read-only, 0 if the insert was successful, and 1 if the specified key already exists. (To replace the value, use dbmreplace().)

上一頁 | 首頁 | 下一頁
dbmfirstkey | 上一層 | dbmnextkey


dbmnextkey

(PHP 3, PHP 4 )

dbmnextkey -- Retrieves the next key from a DBM database

Description

string dbmnextkey ( resource dbm_identifier, string key)

Returns the next key after key. By calling dbmfirstkey() followed by successive calls to dbmnextkey() it is possible to visit every key/value pair in the dbm database. For example:

例子 1. Visiting every key/value pair in a DBM database

$key = dbmfirstkey ($dbm_id);
while ($key) {
    echo "$key = " . dbmfetch ($dbm_id, $key) . "\n";
    $key = dbmnextkey ($dbm_id, $key);
}

上一頁 | 首頁 | 下一頁
dbminsert | 上一層 | dbmopen


dbmopen

(PHP 3, PHP 4 )

dbmopen -- Opens a DBM database

Description

resource dbmopen ( string filename, string flags)

The first argument is the full-path filename of the DBM file to be opened and the second is the file open mode which is one of "r", "n", "c" or "w" for read-only, new (implies read-write, and most likely will truncate an already-existing database of the same name), create (implies read-write, and will not truncate an already-existing database of the same name) and read-write respectively.

Returns an identifier to be passed to the other DBM functions on success, or FALSE on failure.

If NDBM support is used, NDBM will actually create filename.dir and filename.pag files. GDBM only uses one file, as does the internal flat-file support, and Berkeley DB creates a filename.db file. Note that PHP does its own file locking in addition to any file locking that may be done by the DBM library itself. PHP does not delete the .lck files it creates. It uses these files simply as fixed inodes on which to do the file locking. For more information on DBM files, see your Unix man pages, or obtain GNU's GDBM.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

上一頁 | 首頁 | 下一頁
dbmnextkey | 上一層 | dbmreplace


dbmreplace

(PHP 3, PHP 4 )

dbmreplace -- Replaces the value for a key in a DBM database

Description

int dbmreplace ( resource dbm_identifier, string key, string value)

Replaces the value for the specified key in the database.

This will also add the key to the database if it didn't already exist.

上一頁 | 首頁 | 下一頁
dbmopen | 上一層 | dbx functions


dbplus_add

(4.1.0 - 4.2.3 only)

dbplus_add -- Add a tuple to a relation

Description

int dbplus_add ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

This function will add a tuple to a relation. The tuple data is an array of attribute/value pairs to be inserted into the given relation. After successful execution the tuple array will contain the complete data of the newly created tuple, including all implicitly set domain fields like sequences.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

上一頁 | 首頁 | 下一頁
DB++ Functions | 上一層 | dbplus_aql


dbplus_aql

(4.1.0 - 4.2.3 only)

dbplus_aql -- Perform AQL query

Description

resource dbplus_aql ( string query [, string server [, string dbpath]])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_aql() will execute an AQL query on the given server and dbpath.

On success it will return a relation handle. The result data may be fetched from this relation by calling dbplus_next() and dbplus_current(). Other relation access functions will not work on a result relation.

Further information on the AQL A... Query Language is provided in the original db++ manual.

上一頁 | 首頁 | 下一頁
dbplus_add | 上一層 | dbplus_chdir


dbplus_chdir

(4.1.0 - 4.2.3 only)

dbplus_chdir -- Get/Set database virtual current directory

Description

string dbplus_chdir ( [string newdir])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_chdir() will change the virtual current directory where relation files will be looked for by dbplus_open(). dbplus_chdir() will return the absolute path of the current directory. Calling dbplus_chdir() without giving any newdir may be used to query the current working directory.

上一頁 | 首頁 | 下一頁
dbplus_aql | 上一層 | dbplus_close


dbplus_close

(4.1.0 - 4.2.3 only)

dbplus_close -- Close a relation

Description

int dbplus_close ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Calling dbplus_close() will close a relation previously opened by dbplus_open().

上一頁 | 首頁 | 下一頁
dbplus_chdir | 上一層 | dbplus_curr


dbplus_curr

(4.1.0 - 4.2.3 only)

dbplus_curr -- Get current tuple from relation

Description

int dbplus_curr ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_curr() will read the data for the current tuple for the given relation and will pass it back as an associative array in tuple.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

See also dbplus_first(),
dbplus_prev(),
dbplus_next(), and
dbplus_last().

上一頁 | 首頁 | 下一頁
dbplus_close | 上一層 | dbplus_errcode


dbplus_errcode

(4.1.0 - 4.2.3 only)

dbplus_errcode -- Get error string for given errorcode or last error

Description

string dbplus_errcode ( int errno)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_errcode() returns a cleartext error string for the error code passed as errno of for the result code of the last db++ operation if no parameter is given.

上一頁 | 首頁 | 下一頁
dbplus_curr | 上一層 | dbplus_errno


dbplus_errno

(4.1.0 - 4.2.3 only)

dbplus_errno -- Get error code for last operation

Description

int dbplus_errno ( void)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_errno() will return the error code returned by the last db++ operation.

See also dbplus_errcode().

上一頁 | 首頁 | 下一頁
dbplus_errcode | 上一層 | dbplus_find


dbplus_find

(4.1.0 - 4.2.3 only)

dbplus_find -- Set a constraint on a relation

Description

int dbplus_find ( resource relation, array constraints, mixed tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_find() will place a constraint on the given relation. Further calls to functions like dbplus_curr() or dbplus_next() will only return tuples matching the given constraints.

Constraints are triplets of strings containing of a domain name, a comparison operator and a comparison value. The constraints parameter array may consist of a collection of string arrays, each of which contains a domain, an operator and a value, or of a single string array containing a multiple of three elements.

The comparison operator may be one of the following strings: '==', '>', '>=', '<', '<=', '!=', '~' for a regular expression match and 'BAND' or 'BOR' for bitwise operations.

See also dbplus_unselect().

上一頁 | 首頁 | 下一頁
dbplus_errno | 上一層 | dbplus_first


dbplus_first

(4.1.0 - 4.2.3 only)

dbplus_first -- Get first tuple from relation

Description

int dbplus_first ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_curr() will read the data for the first tuple for the given relation, make it the current tuple and pass it back as an associative array in tuple.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

See also dbplus_curr(),
dbplus_prev(),
dbplus_next(), and
dbplus_last().

上一頁 | 首頁 | 下一頁
dbplus_find | 上一層 | dbplus_flush


dbplus_flush

(4.1.0 - 4.2.3 only)

dbplus_flush -- Flush all changes made on a relation

Description

int dbplus_flush ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_flush() will write all changes applied to relation since the last flush to disk.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

上一頁 | 首頁 | 下一頁
dbplus_first | 上一層 | dbplus_freealllocks


dbplus_freealllocks

(4.1.0 - 4.2.3 only)

dbplus_freealllocks -- Free all locks held by this client

Description

int dbplus_freealllocks ( void)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_freeaalllocks() will free all tuple locks held by this client.

See also dbplus_getlock(),
dbplus_freelock(), and
dbplus_freerlocks().

上一頁 | 首頁 | 下一頁
dbplus_flush | 上一層 | dbplus_freelock


dbplus_freelock

(4.1.0 - 4.2.3 only)

dbplus_freelock -- Release write lock on tuple

Description

int dbplus_freelock ( resource relation, string tname)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_freelock() will release a write lock on the given tuple previously obtained by dbplus_getlock().

See also dbplus_getlock(),
dbplus_freerlocks(), and
dbplus_freealllocks().

上一頁 | 首頁 | 下一頁
dbplus_freealllocks | 上一層 | dbplus_freerlocks


dbplus_freerlocks

(4.1.0 - 4.2.3 only)

dbplus_freerlocks -- Free all tuple locks on given relation

Description

int dbplus_freerlocks ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_freerlocks() will free all tuple locks held on the given relation.

See also dbplus_getlock(),
dbplus_freelock(), and
dbplus_freealllocks().

上一頁 | 首頁 | 下一頁
dbplus_freelock | 上一層 | dbplus_getlock


dbplus_getlock

(4.1.0 - 4.2.3 only)

dbplus_getlock -- Get a write lock on a tuple

Description

int dbplus_getlock ( resource relation, string tname)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_getlock() will request a write lock on the specified tuple. It will return zero on success or a non-zero error code, especially DBPLUS_ERR_WLOCKED, on failure.

See also dbplus_freelock(),
dbplus_freerlocks(), and
dbplus_freealllocks().

上一頁 | 首頁 | 下一頁
dbplus_freerlocks | 上一層 | dbplus_getunique


dbplus_getunique

(4.1.0 - 4.2.3 only)

dbplus_getunique -- Get a id number unique to a relation

Description

int dbplus_getunique ( resource relation, int uniqueid)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_getunique() will obtain a number guaranteed to be unique for the given relation and will pass it back in the variable given as uniqueid.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

上一頁 | 首頁 | 下一頁
dbplus_getlock | 上一層 | dbplus_info


dbplus_info

(4.1.0 - 4.2.3 only)

dbplus_info -- ???

Description

int dbplus_info ( resource relation, string key, array )

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_getunique | 上一層 | dbplus_last


dbplus_last

(4.1.0 - 4.2.3 only)

dbplus_last -- Get last tuple from relation

Description

int dbplus_last ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_curr() will read the data for the last tuple for the given relation, make it the current tuple and pass it back as an associative array in tuple.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

See also dbplus_first(),
dbplus_curr(),
dbplus_prev(), and
dbplus_next().

上一頁 | 首頁 | 下一頁
dbplus_info | 上一層 | dbplus_lockrel


dbplus_lockrel

(no version information, might be only in CVS)

dbplus_lockrel -- Request write lock on relation

Description

int dbplus_lockrel ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_lockrel() will request a write lock on the given relation. Other clients may still query the relation, but can't alter it while it is locked.

上一頁 | 首頁 | 下一頁
dbplus_last | 上一層 | dbplus_next


dbplus_next

(4.1.0 - 4.2.3 only)

dbplus_next -- Get next tuple from relation

Description

int dbplus_next ( resource relation, array )

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_curr() will read the data for the next tuple for the given relation, will make it the current tuple and will pass it back as an associative array in tuple.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

See also dbplus_first(),
dbplus_curr(),
dbplus_prev(), and
dbplus_last().

上一頁 | 首頁 | 下一頁
dbplus_lockrel | 上一層 | dbplus_open


dbplus_open

(4.1.0 - 4.2.3 only)

dbplus_open -- Open relation file

Description

resource dbplus_open ( string name)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

The relation file name will be opened. name can be either a file name or a relative or absolute path name. This will be mapped in any case to an absolute relation file path on a specific host machine and server.

On success a relation file resource (cursor) is returned which must be used in any subsequent commands referencing the relation. Failure leads to a zero return value, the actual error code may be asked for by calling dbplus_errno().

上一頁 | 首頁 | 下一頁
dbplus_next | 上一層 | dbplus_prev


dbplus_prev

(4.1.0 - 4.2.3 only)

dbplus_prev -- Get previous tuple from relation

Description

int dbplus_prev ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_curr() will read the data for the next tuple for the given relation, will make it the current tuple and will pass it back as an associative array in tuple.

The function will return zero (aka. DBPLUS_ERR_NOERR) on success or a db++ error code on failure. See dbplus_errcode() or the introduction to this chapter for more information on db++ error codes.

See also dbplus_first(),
dbplus_curr(),
dbplus_next(), and
dbplus_last().

上一頁 | 首頁 | 下一頁
dbplus_open | 上一層 | dbplus_rchperm


dbplus_rchperm

(4.1.0 - 4.2.3 only)

dbplus_rchperm -- Change relation permissions

Description

int dbplus_rchperm ( resource relation, int mask, string user, string group)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rchperm() will change access permissions as specified by mask, user and group. The values for these are operating system specific.

上一頁 | 首頁 | 下一頁
dbplus_prev | 上一層 | dbplus_rcreate


dbplus_rcreate

(4.1.0 - 4.2.3 only)

dbplus_rcreate -- Creates a new DB++ relation

Description

resource dbplus_rcreate ( string name, mixed domlist [, boolean overwrite])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rcreate() will create a new relation named name. An existing relation by the same name will only be overwritten if the relation is currently not in use and overwrite is set to TRUE.

domlist should contain the domain specification for the new relation within an array of domain description strings. ( dbplus_rcreate() will also accept a string with space delimited domain description strings, but it is recommended to use an array). A domain description string consists of a domain name unique to this relation, a slash and a type specification character. See the db++ documentation, especially the dbcreate(1) manpage, for a description of available type specifiers and their meanings.

上一頁 | 首頁 | 下一頁
dbplus_rchperm | 上一層 | dbplus_rcrtexact


dbplus_rcrtexact

(4.1.0 - 4.2.3 only)

dbplus_rcrtexact -- Creates an exact but empty copy of a relation including indices

Description

resource dbplus_rcrtexact ( string name, resource relation, boolean overwrite)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rcrtexact() will create an exact but empty copy of the given relation under a new name. An existing relation by the same name will only be overwritten if overwrite is TRUE and no other process is currently using the relation.

上一頁 | 首頁 | 下一頁
dbplus_rcreate | 上一層 | dbplus_rcrtlike


dbplus_rcrtlike

(4.1.0 - 4.2.3 only)

dbplus_rcrtlike -- Creates an empty copy of a relation with default indices

Description

resource dbplus_rcrtlike ( string name, resource relation, int flag)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rcrtexact() will create an empty copy of the given relation under a new name, but with default indices. An existing relation by the same name will only be overwritten if overwrite is TRUE and no other process is currently using the relation.

上一頁 | 首頁 | 下一頁
dbplus_rcrtexact | 上一層 | dbplus_resolve


dbplus_resolve

(4.1.0 - 4.2.3 only)

dbplus_resolve -- Resolve host information for relation

Description

int dbplus_resolve ( string relation_name)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_resolve() will try to resolve the given relation_name and find out internal server id, real hostname and the database path on this host. The function will return an array containing these values under the keys 'sid', 'host' and 'host_path' or FALSE on error.

See also dbplus_tcl().

上一頁 | 首頁 | 下一頁
dbplus_rcrtlike | 上一層 | dbplus_restorepos


dbplus_restorepos

(4.1.0 - 4.2.3 only)

dbplus_restorepos -- ???

Description

int dbplus_restorepos ( resource relation, array tuple)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_resolve | 上一層 | dbplus_rkeys


dbplus_rkeys

(4.1.0 - 4.2.3 only)

dbplus_rkeys -- Specify new primary key for a relation

Description

resource dbplus_rkeys ( resource relation, mixed domlist)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rkeys() will replace the current primary key for relation with the combination of domains specified by domlist.

domlist may be passed as a single domain name string or as an array of domain names.

上一頁 | 首頁 | 下一頁
dbplus_restorepos | 上一層 | dbplus_ropen


dbplus_ropen

(4.1.0 - 4.2.3 only)

dbplus_ropen -- Open relation file local

Description

resource dbplus_ropen ( string name)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_ropen() will open the relation file locally for quick access without any client/server overhead. Access is read only and only dbplus_current() and dbplus_next() may be applied to the returned relation.

上一頁 | 首頁 | 下一頁
dbplus_rkeys | 上一層 | dbplus_rquery


dbplus_rquery

(4.1.0 - 4.2.3 only)

dbplus_rquery -- Perform local (raw) AQL query

Description

int dbplus_rquery ( string query, string dbpath)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rquery() performs a local (raw) AQL query using an AQL interpreter embedded into the db++ client library. dbplus_rquery() is faster than dbplus_aql() but will work on local data only.

上一頁 | 首頁 | 下一頁
dbplus_ropen | 上一層 | dbplus_rrename


dbplus_rrename

(4.1.0 - 4.2.3 only)

dbplus_rrename -- Rename a relation

Description

int dbplus_rrename ( resource relation, string name)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rrename() will change the name of relation to name.

上一頁 | 首頁 | 下一頁
dbplus_rquery | 上一層 | dbplus_rsecindex


dbplus_rsecindex

(4.1.0 - 4.2.3 only)

dbplus_rsecindex -- Create a new secondary index for a relation

Description

resource dbplus_rsecindex ( resource relation, mixed domlist, int type)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rsecindex() will create a new secondary index for relation with consists of the domains specified by domlist and is of type type

domlist may be passed as a single domain name string or as an array of domain names.

上一頁 | 首頁 | 下一頁
dbplus_rrename | 上一層 | dbplus_runlink


dbplus_runlink

(4.1.0 - 4.2.3 only)

dbplus_runlink -- Remove relation from filesystem

Description

int dbplus_runlink ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_unlink() will close and remove the relation.

上一頁 | 首頁 | 下一頁
dbplus_rsecindex | 上一層 | dbplus_rzap


dbplus_rzap

(4.1.0 - 4.2.3 only)

dbplus_rzap -- Remove all tuples from relation

Description

int dbplus_rzap ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_rzap() will remove all tuples from relation.

上一頁 | 首頁 | 下一頁
dbplus_runlink | 上一層 | dbplus_savepos


dbplus_savepos

(4.1.0 - 4.2.3 only)

dbplus_savepos -- ???

Description

int dbplus_savepos ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_rzap | 上一層 | dbplus_setindex


dbplus_setindex

(4.1.0 - 4.2.3 only)

dbplus_setindex -- ???

Description

int dbplus_setindex ( resource relation, string idx_name)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_savepos | 上一層 | dbplus_setindexbynumber


dbplus_setindexbynumber

(4.1.0 - 4.2.3 only)

dbplus_setindexbynumber -- ???

Description

int dbplus_setindexbynumber ( resource relation, int idx_number)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_setindex | 上一層 | dbplus_sql


dbplus_sql

(4.1.0 - 4.2.3 only)

dbplus_sql -- Perform SQL query

Description

resource dbplus_sql ( string query, string server, string dbpath)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_setindexbynumber | 上一層 | dbplus_tcl


dbplus_tcl

(4.1.0 - 4.2.3 only)

dbplus_tcl -- Execute TCL code on server side

Description

int dbplus_tcl ( int sid, string script)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

A db++ server will prepare a TCL interpreter for each client connection. This interpreter will enable the server to execute TCL code provided by the client as a sort of stored procedures to improve the performance of database operations by avoiding client/server data transfers and context switches.

dbplus_tcl() needs to pass the client connection id the TCL script code should be executed by. dbplus_resolve() will provide this connection id. The function will return whatever the TCL code returns or a TCL error message if the TCL code fails.

See also dbplus_resolve().

上一頁 | 首頁 | 下一頁
dbplus_sql | 上一層 | dbplus_tremove


dbplus_tremove

(4.1.0 - 4.2.3 only)

dbplus_tremove -- Remove tuple and return new current tuple

Description

int dbplus_tremove ( resource relation, array tuple [, array current])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_tremove() removes tuple from relation if it perfectly matches a tuple within the relation. current, if given, will contain the data of the new current tuple after calling dbplus_tremove().

上一頁 | 首頁 | 下一頁
dbplus_tcl | 上一層 | dbplus_undo


dbplus_undo

(4.1.0 - 4.2.3 only)

dbplus_undo -- ???

Description

int dbplus_undo ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_tremove | 上一層 | dbplus_undoprepare


dbplus_undoprepare

(4.1.0 - 4.2.3 only)

dbplus_undoprepare -- ???

Description

int dbplus_undoprepare ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Not implemented yet.

上一頁 | 首頁 | 下一頁
dbplus_undo | 上一層 | dbplus_unlockrel


dbplus_unlockrel

(4.1.0 - 4.2.3 only)

dbplus_unlockrel -- Give up write lock on relation

Description

int dbplus_unlockrel ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_unlockrel() will release a write lock previously obtained by dbplus_lockrel().

上一頁 | 首頁 | 下一頁
dbplus_undoprepare | 上一層 | dbplus_unselect


dbplus_unselect

(4.1.0 - 4.2.3 only)

dbplus_unselect -- Remove a constraint from relation

Description

int dbplus_unselect ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Calling dbplus_unselect() will remove a constraint previously set by dbplus_find() on relation.

上一頁 | 首頁 | 下一頁
dbplus_unlockrel | 上一層 | dbplus_update


dbplus_update

(4.1.0 - 4.2.3 only)

dbplus_update -- Update specified tuple in relation

Description

int dbplus_update ( resource relation, array old, array new)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_update() replaces the tuple given by old with the data from new if and only if old completely matches a tuple within relation.

上一頁 | 首頁 | 下一頁
dbplus_unselect | 上一層 | dbplus_xlockrel


dbplus_xlockrel

(4.1.0 - 4.2.3 only)

dbplus_xlockrel -- Request exclusive lock on relation

Description

int dbplus_xlockrel ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_xlockrel() will request an exclusive lock on relation preventing even read access from other clients.

See also dbplus_xunlockrel().

上一頁 | 首頁 | 下一頁
dbplus_update | 上一層 | dbplus_xunlockrel


dbplus_xunlockrel

(4.1.0 - 4.2.3 only)

dbplus_xunlockrel -- Free exclusive lock on relation

Description

int dbplus_xunlockrel ( resource relation)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

dbplus_xunlockrel() will release an exclusive lock on relation previously obtained by dbplus_xlockrel().

上一頁 | 首頁 | 下一頁
dbplus_xlockrel | 上一層 | Direct IO functions


dbx_close

(PHP 4 >= 4.0.6)

dbx_close -- Close an open connection/database

Description

bool dbx_close ( object link_identifier)

如果成功則傳回 TRUE，失敗則傳回 FALSE。

例子 1. dbx_close() example

<?php
$link = dbx_connect(DBX_MYSQL, "localhost", "db", "username", "password")
    or die ("Could not connect");

print("Connected successfully");
dbx_close($link);
?>

註: Always refer to the module-specific documentation as well.

See also: dbx_connect().

上一頁 | 首頁 | 下一頁
dbx functions | 上一層 | dbx_compare


dbx_compare

(PHP 4 >= 4.1.0)

dbx_compare -- Compare two rows for sorting purposes

Description

int dbx_compare ( array row_a, array row_b, string column_key [, int flags])

dbx_compare() returns 0 if the row_a[$column_key] is equal to row_b[$column_key], and 1 or -1 if the former is greater or is smaller than the latter one, respectively, or vice versa if the flag is set to DBX_CMP_DESC. dbx_compare() is a helper function for dbx_sort() to ease the make and use of the custom sorting function.

The flags can be set to specify comparison direction:

  • DBX_CMP_ASC - ascending order

  • DBX_CMP_DESC - descending order

and the preferred comparison type:

  • DBX_CMP_NATIVE - no type conversion

  • DBX_CMP_TEXT - compare items as strings

  • DBX_CMP_NUMBER - compare items numerically

One of the direction and one of the type constant can be combined with bitwise OR operator (|). The default value for the flags parameter is DBX_CMP_ASC | DBX_CMP_NATIVE.

例子 1. dbx_compare() example

<?php
function user_re_order ($a, $b) {
    $rv = dbx_compare ($a, $b, "parentid", DBX_CMP_DESC);
    if ( !$rv ) {
        $rv = dbx_compare ($a, $b, "id", DBX_CMP_NUMBER);
    }
    return $rv;
}

$link   = dbx_connect (DBX_ODBC, "", "db", "username", "password")
    or die ("Could not connect");

$result = dbx_query ($link, "SELECT id, parentid, description FROM table ORDER BY id");
    // data in $result is now ordered by id

dbx_sort ($result, "user_re_order");
    // date in $result is now ordered by parentid (descending), then by id

dbx_close ($link);
?>

See also dbx_sort().

上一頁 | 首頁 | 下一頁
dbx_close | 上一層 | dbx_connect


dbx_connect

(PHP 4 >= 4.0.6)

dbx_connect -- Open a connection/database

Description

object dbx_connect ( mixed module, string host, string database, string username, string password [, int persistent])

dbx_connect() returns an object on success, FALSE on error. If a connection has been made but the database could not be selected, the connection is closed and FALSE is returned. The persistent parameter can be set to DBX_PERSISTENT, if so, a persistent connection will be created.

The module parameter can be either a string or a constant, though the latter form is preferred. The possible values are given below, but keep in mind that they only work if the module is actually loaded.

  • DBX_MYSQL or "mysql"

  • DBX_ODBC or "odbc"

  • DBX_PGSQL or "pgsql"

  • DBX_MSSQL or "mssql"

  • DBX_FBSQL or "fbsql" (available from PHP 4.1.0)

  • DBX_SYBASECT or "sybase_ct" (available from PHP 4.2.0)

  • DBX_OCI8 or "oci8" (CVS only)

The host, database, username and password parameters are expected, but not always used depending on the connect functions for the abstracted module.

The returned object has three properties:

database

It is the name of the currently selected database.

handle

It is a valid handle for the connected database, and as such it can be used in module-specific functions (if required).

$link = dbx_connect (DBX_MYSQL, "localhost", "db", "username", "password");
mysql_close ($link->handle); // dbx_close($link) would be better here

module

It is used internally by dbx only, and is actually the module number mentioned above.

例子 1. dbx_connect() example

<?php
$link = dbx_connect (DBX_ODBC, "", "db", "username", "password", DBX_PERSISTENT)
    or die ("Could not connect");

print ("Connected successfully");
dbx_close ($link);
?>

註: Always refer to the module-specific documentation as well.

See also: dbx_close().

上一頁 | 首頁 | 下一頁
dbx_compare | 上一層 | dbx_error


dbx_error

(PHP 4 >= 4.0.6)

dbx_error -- Report the error message of the latest function call in the module (not just in the connection)

Description

string dbx_error ( object link_identifier)

dbx_error() returns a string containing the error message from the last function call of the abstracted module (e.g. mysql module). If there are multiple connections in the same module, just the last error is given. If there are connections on different modules, the latest error is returned for the module specified by the link_identifier parameter.

例子 1. dbx_error() example

<?php
$link   = dbx_connect(DBX_MYSQL, "localhost", "db", "username", "password")
    or die ("Could not connect");

$result = dbx_query($link, "select id from non_existing_table");
if ( $result == 0 ) {
    echo dbx_error ($link);
}
dbx_close ($link);
?>

註: Always refer to the module-specific documentation as well.

The error message for Microsoft SQL Server is actually the result of the mssql_get_last_message() function.

The error message for Oracle (oci8) is not implemented (yet).

上一頁 | 首頁 | 下一頁
dbx_connect | 上一層 | dbx_escape_string


dbx_escape_string

(no version information, might be only in CVS)

dbx_escape_string -- Escape a string so it can safely be used in an sql-statement.

Description

string dbx_escape_string ( object link_identifier, string text)

dbx_escape_string() returns the text, escaped where necessary (such as quotes, backslashes etc). It returns NULL on error.

例子 1. dbx_escape_string() example

<?php
$link   = dbx_connect(DBX_MYSQL, "localhost", "db", "username", "password")
    or die ("Could not connect");

$text = dbx_escape_string($link, "It\'s quoted and backslashed (\\).");
$result = dbx_query($link, "insert into tbl (txt) values ('".$text."')");
if ( $result == 0 ) {
    echo dbx_error ($link);
}
dbx_close ($link);
?>

See also: dbx_query().

上一頁 | 首頁 | 下一頁
dbx_error | 上一層 | dbx_query


dbx_query

(PHP 4 >= 4.0.6)

dbx_query -- Send a query and fetch all results (if any)

Description

object dbx_query ( object link_identifier, string sql_statement [, long flags])

dbx_query() returns an object or 1 on success, and 0 on failure. The result object is returned only if the query given in sql_statement produces a result set.

例子 1. How to handle the returned value

<?php
$link   = dbx_connect(DBX_ODBC, "", "db", "username", "password")
    or die("Could not connect");

$result = dbx_query($link, 'SELECT id, parentid, description FROM table');

if ( is_object($result) ) {
    // ... do some stuff here, see detailed examples below ...
    // first, print out field names and types
    // then, draw a table filled with the returned field values
}
else if ( $result == 1 ) {
    echo("Query executed successfully, but no result set returned");
}
else {
    exit("Query failed");
}

dbx_close($link);
?>

The flags parameter is used to control the amount of information that is returned. It may be any combination of the following constants with the bitwise OR operator (|). The DBX_COLNAMES_* flags override the dbx.colnames_case setting from php.ini.

DBX_RESULT_INDEX

It is always set, that is, the returned object has a data property which is a 2 dimensional array indexed numerically. For example, in the expression data[2][3] 2 stands for the row (or record) number and 3 stands for the column (or field) number. The first row and column are indexed at 0.

If DBX_RESULT_ASSOC is also specified, the returning object contains the information related to DBX_RESULT_INFO too, even if it was not specified.

DBX_RESULT_INFO

It provides info about columns, such as field names and field types.

DBX_RESULT_ASSOC

It effects that the field values can be accessed with the respective column names used as keys to the returned object's data property.

Associated results are actually references to the numerically indexed data, so modifying data[0][0] causes that data[0]['field_name_for_first_column'] is modified as well.

DBX_COLNAMES_UNCHANGED (CVS only)

The case of the returned column names will not be changed.

DBX_COLNAMES_UPPERCASE (CVS only)

The case of the returned column names will be changed to uppercase.

DBX_COLNAMES_LOWERCASE (CVS only)

The case of the returned column names will be changed to lowercase.

Note that DBX_RESULT_INDEX is always used, regardless of the actual value of flags parameter. This means that the following combinations is effective only:

  • DBX_RESULT_INDEX

  • DBX_RESULT_INDEX | DBX_RESULT_INFO

  • DBX_RESULT_INDEX | DBX_RESULT_INFO | DBX_RESULT_ASSOC - this is the default, if flags is not specified.

The returing object has four or five properties depending on flags:

handle

It is a valid handle for the connected database, and as such it can be used in module specific functions (if required).

$result = dbx_query ($link, "SELECT id FROM table");
mysql_field_len ($result->handle, 0);

cols and rows

These contain the number of columns (or fields) and rows (or records) respectively.

$result = dbx_query ($link, 'SELECT id FROM table');
echo $result->rows; // number of records
echo $result->cols; // number of fields

info (optional)

It is returned only if either DBX_RESULT_INFO or DBX_RESULT_ASSOC is specified in the flags parameter. It is a 2 dimensional array, that has two named rows (name and type) to retrieve column information.

例子 2. lists each field's name and type

$result = dbx_query ($link, 'SELECT id FROM table',
                     DBX_RESULT_INDEX | DBX_RESULT_INFO);

for ($i = 0; $i < $result->cols; $i++ ) {
    echo $result->info['name'][$i] . "\n";
    echo $result->info['type'][$i] . "\n";
}
data

This property contains the actual resulting data, possibly associated with column names as well depending on flags. If DBX_RESULT_ASSOC is set, it is possible to use $result->data[2]["field_name"].

例子 3. outputs the content of data property into HTML table

$result = dbx_query ($link, 'SELECT id, parentid, description FROM table');

echo "<table>\n";
foreach ( $result->data as $row ) {
    echo "<tr>\n";
    foreach ( $row as $field ) {
        echo "<td>$field</td>";
    }
    echo "</tr>\n";
}
echo "</table>\n";

註: Always refer to the module-specific documentation as well.

Column names for queries on an Oracle database are returned in lowercase.

See also: dbx_escape_string() and dbx_connect().

上一頁 | 首頁 | 下一頁
dbx_escape_string | 上一層 | dbx_sort


dbx_sort

(PHP 4 >= 4.0.6)

dbx_sort -- Sort a result from a dbx_query by a custom sort function

Description

bool dbx_sort ( object result, string user_compare_function)

如果成功則傳回 TRUE，失敗則傳回 FALSE。

註: It is always better to use ORDER BY SQL clause instead of dbx_sort(), if possible.

例子 1. dbx_sort() example

<?php
function user_re_order ($a, $b) {
    $rv = dbx_compare ($a, $b, "parentid", DBX_CMP_DESC);
    if ( !$rv ) {
        $rv = dbx_compare ($a, $b, "id", DBX_CMP_NUMBER);
    }
    return $rv;
}

$link   = dbx_connect (DBX_ODBC, "", "db", "username", "password")
    or die ("Could not connect");

$result = dbx_query ($link, "SELECT id, parentid, description FROM tbl ORDER BY id");
    // data in $result is now ordered by id

dbx_sort ($result, "user_re_order");
    // data in $result is now ordered by parentid (descending), then by id

dbx_close ($link);
?>

See also dbx_compare().

上一頁 | 首頁 | 下一頁
dbx_query | 上一層 | DB++ Functions


define

(PHP 3, PHP 4 )

define -- Defines a named constant.

Description

bool define ( string name, mixed value [, bool case_insensitive])

Defines a named constant. See the section on constants for more details.

The name of the constant is given by name; the value is given by value.

The optional third parameter case_insensitive is also available. If the value TRUE is given, then the constant will be defined case-insensitive. The default behaviour is case-sensitive; i.e. CONSTANT and Constant represent different values.

例子 1. Defining Constants

<?php
define ("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.

define ("GREETING", "Hello you.",TRUE);
echo GREETING; // outputs "Hello you."
echo Greeting; // outputs "Hello you."

?>

define() returns TRUE on success and FALSE if an error occurs.

See also defined(), constant() and the section on Constants.

上一頁 | 首頁 | 下一頁
constant | 上一層 | defined


defined

(PHP 3, PHP 4 )

defined -- Checks whether a given named constant exists

Description

bool defined ( string name)

Returns TRUE if the named constant given by name has been defined, FALSE otherwise.

例子 1. Checking Constants

<?php
if (defined("CONSTANT")){ // Note that it should be quoted
    echo CONSTANT; //
    }
?>

See also define(),
constant(),
get_defined_constants() and the section on
Constants.

上一頁 | 首頁 | 下一頁
define | 上一層 | die


dio_close

(PHP 4 >= 4.2.0)

dio_close -- Closes the file descriptor given by fd

Description

void dio_close ( resource fd)

The function dio_close() closes the file descriptor resource.

上一頁 | 首頁 | 下一頁
Direct IO functions | 上一層 | dio_fcntl


dio_fcntl

(PHP 4 >= 4.2.0)

dio_fcntl -- Performs a c library fcntl on fd

Description

mixed dio_fcntl ( resource fd, int cmd [, mixed arg])

The dio_fcntl() function performs the operation specified by cmd on the file descriptor fd. Some commands require additional arguments args to be supplied.

arg is an associative array, when cmd is F_SETLK or F_SETLLW, with the following keys:

  • "start" - offset where lock begins

  • "length" - size of locked area. zero means to end of file

  • "wenth" - Where l_start is relative to: can be SEEK_SET, SEEK_END and SEEK_CUR

  • "type" - type of lock: can be F_RDLCK (read lock), F_WRLCK (write lock) or F_UNLCK (unlock)

cmd can be one of the following operations:

  • F_SETLK - Lock is set or cleared. If the lock is held by someone else dio_fcntl() returns -1.

  • F_SETLKW - like F_SETLK, but in case the lock is held by someone else, dio_fcntl() waits until the lock is released.

  • F_GETLK - dio_fcntl() returns an associative array (as described above) if someone else prevents lock. If there is no obstruction key "type" will set to F_UNLCK.

  • F_DUPFD - finds the lowest numbered available file descriptor greater or equal than arg and returns them.

  • F_SETFL - Sets the file descriptors flags to the value specified by arg, Which can be O_APPEND,O_NONBLOCK or O_ASYNC . To use O_ASYNC you will need to use the pcntl extension.

上一頁 | 首頁 | 下一頁
dio_close | 上一層 | dio_open


dio_open

(PHP 4 >= 4.2.0)

dio_open -- Opens a new filename with specified permissions of flags and creation permissions of mode

Description

resource dio_open ( string filename, int flags [, int mode])

dio_open() opens a file and returns a new file descriptor for it, or -1 if any error occurred. If flags is O_CREAT, optional third parameter mode will set the mode of the file (creation permissions). The flags parameter can be one of the following options:

  • O_RDONLY - opens the file for read access

  • O_WRONLY - opens the file for write access

  • O_RDWR - opens the file for both reading and writing

The flags parameter can also include any combination of the following flags:

  • O_CREAT - creates the file, if it doesn't already exist

  • O_EXCL - if both, O_CREAT and O_EXCL are set, dio_open() fails, if file already exists

  • O_TRUNC - if file exists, and its opened for write access, file will be truncated to zero length.

  • O_APPEND - write operations write data at the end of file

  • O_NONBLOCK - sets non blocking mode

上一頁 | 首頁 | 下一頁
dio_fcntl | 上一層 | dio_read


dio_read

(PHP 4 >= 4.2.0)

dio_read -- Reads n bytes from fd and returns them, if n is not specified, reads 1k block

Description

string dio_read ( resource fd [, int n])

The function dio_read() reads and returns n bytes from file with descriptor resource. If n is not specified, dio_read() reads 1K sized block and returns them.

上一頁 | 首頁 | 下一頁
dio_open | 上一層 | dio_seek


dio_seek

(PHP 4 >= 4.2.0)

dio_seek -- Seeks to pos on fd from whence

Description

int dio_seek ( resource fd, int pos, int whence)

The function dio_seek() is used to change the file position of the file with descriptor resource. The parameter whence specifies how the position pos should be interpreted:

  • SEEK_SET - specifies that pos is specified from the beginning of the file

  • SEEK_CUR - Specifies that pos is a count of characters from the current file position. This count may be positive or negative

  • SEEK_END - Specifies that pos is a count of characters from the end of the file. A negative count specifies a position within the current extent of the file; a positive count specifies a position past the current end. If you set the position past the current end, and actually write data, you will extend the file with zeros up to that position

上一頁 | 首頁 | 下一頁
dio_read | 上一層 | dio_stat


dio_stat

(PHP 4 >= 4.2.0)

dio_stat -- Gets stat information about the file descriptor fd

Description

array dio_stat ( resource fd)

Function dio_stat() returns information about the file with file descriptor fd. dio_stat() returns an associative array with the following keys:

  • "device" - device

  • "inode" - inode

  • "mode" - mode

  • "nlink" - number of hard links

  • "uid" - user id

  • "gid" - group id

  • "device_type" - device type (if inode device)

  • "size" - total size in bytes

  • "blocksize" - blocksize

  • "blocks" - number of blocks allocated

  • "atime" - time of last access

  • "mtime" - time of last modification

  • "ctime" - time of last change

On error dio_stat() returns NULL.

上一頁 | 首頁 | 下一頁
dio_seek | 上一層 | dio_tcsetattr


dio_tcsetattr

(PHP 4 CVS only)

dio_tcsetattr -- Sets terminal attributes and baud rate for a serial port

Description

dio_tcsetattr ( resource fd, array options)

The function dio_tcsetattr() sets the terminal attributes and baud rate of the open resource. The currently available options are

  • 'baud' - baud rate of the port - can be 38400,19200,9600,4800,2400,1800,1200,600,300,200,150,134,110,75 or 50, default value is 9600

  • 'bits' - data bits - can be 8,7,6 or 5 default value is 8

  • 'stop' - stop bits - can be 1 or 2 default value is 1

  • 'parity' - can be 0,1 or 2 default value is 0

例子 1. Setting the baud rate on a serial port

<?php

$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_fcntl($fd,F_SETFL, O_SYNC );

dio_tcsetattr($fd, array(
  'baud' => 9600,
  'bits' => 8,
  'stop'  =>1,
  'parity' => 0
));

while (1) {

  $data = dio_read($fd,256);

  if ($data) {
      echo $data;
  }
}

?>

註: This function was introduced in PHP 4.3.0.

上一頁 | 首頁 | 下一頁
dio_stat | 上一層 | dio_truncate


dio_truncate

(PHP 4 >= 4.2.0)

dio_truncate -- Truncates file descriptor fd to offset bytes

Description

bool dio_truncate ( resource fd, int offset)

Function dio_truncate() causes the file referenced by fd to be truncated to at most offset bytes in size. If the file previously was larger than this size, the extra data is lost. If the file previously was shorter, it is unspecified whether the file is left unchanged or is extended. In the latter case the extended part reads as zero bytes. Returns 0 on success, otherwise -1.

上一頁 | 首頁 | 下一頁
dio_tcsetattr | 上一層 | dio_write


dio_write

(PHP 4 >= 4.2.0)

dio_write -- Writes data to fd with optional truncation at length

Description

int dio_write ( resource fd, string data [, int len])

The function dio_write() writes up to len bytes from data to file fd. If len is not specified, dio_write() writes all data to the specified file. dio_write() returns the number of bytes written to fd.

上一頁 | 首頁 | 下一頁
dio_truncate | 上一層 | 目錄函式庫


dirname

(PHP 3, PHP 4 )

dirname -- 傳回路徑中的目錄部分

說明

string dirname ( string path)

給出一個包含有指向一個文件的全路徑的字串，本函式傳回去掉文件名後的目錄名。

在 Windows 中，斜線（/）和反斜線（\）都可以用作路徑分隔符。在其它環境下是斜線（/）。

例子 1. dirname() 例子

$path = "/etc/passwd";
$file = dirname ($path); // $file is set to "/etc"

註: 在 PHP 4.0.3 中，dirname() 被修正為 POSIX 相容。本質上就意味著如果在 path 中沒有斜線，則傳回一個點（'.'），表示當前目錄。否則傳回的是把 path 中結尾的 /component（最後一個斜線以及後面部分）去掉之後的字串。注意這意味著在老的函式傳回一個空字串的情形下你通常從 dirname() 得到的是斜線或者一個點。

參見 basename()，pathinfo() 和 realpath()。

上一頁 | 首頁 | 下一頁
delete | 上一層 | disk_free_space


disk_free_space

(PHP 4 >= 4.1.0)

disk_free_space -- 傳回目錄中的可用空間

說明

float disk_free_space ( string directory)

給出一個包含有一個目錄的字串，本函式將根據相應的文件系統或磁盤分區傳回可用的字節數。

例子 1. disk_free_space() 例子

$df = disk_free_space("/"); // $df 包含根目錄下可用的字節數

上一頁 | 首頁 | 下一頁
dirname | 上一層 | disk_total_space


disk_total_space

(PHP 4 >= 4.1.0)

disk_total_space -- 傳回一個目錄的磁盤總大小

說明

float disk_total_space ( string directory)

給出一個包含有一個目錄的字串，本函式將根據相應的文件系統或磁盤分區傳回所有的字節數。

例子 1. disk_total_space() 例子

$df = disk_total_space("/"); // $df 包含 "/" 目錄的磁盤大小

【譯者注】本函式傳回的是該目錄所在的磁盤分區的總大小，因此在給出同一個磁盤分區的不同目錄作為參數所得到的結果完全相同。在 UNIX 和 Windows 2000 中都支援將一個磁盤分區加載為一個子目錄，這時正確使用本函式就很有意義。

上一頁 | 首頁 | 下一頁
disk_free_space | 上一層 | diskfreespace


diskfreespace

(PHP 3>= 3.0.7, PHP 4 )

diskfreespace -- disk_free_space() 函式的別名

說明

float diskfreespace ( string directory)

這是 disk_free_space() 函式已不被贊成使用的別名。請用 disk_free_space() 代替本函式。

上一頁 | 首頁 | 下一頁
disk_total_space | 上一層 | fclose


dotnet_load

(no version information, might be only in CVS)

dotnet_load -- Loads a DOTNET module

Description

int dotnet_load ( string assembly_name [, string datatype_name [, int codepage]])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
.NET functions | 上一層 | Error Handling and Logging Functions


each

(PHP 3, PHP 4 )

each -- 傳回陣列中當前的鍵／值對並將陣列指針向前移動一步

說明

array each ( array array)

傳回 array 陣列中當前指針位置的鍵／值對並向前移動陣列指針。鍵值對被傳回為四個單元的陣列，鍵名為 0，1，key 和 value。單元 0 和 key 包含有陣列單元的鍵名，1 和 value 包含有資料。

如果內部指針越過了陣列的末端，則 each() 傳回 FALSE。

例子 1. each() 例子

$foo = array ("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each ($foo);

$bar 現在包含有如下的鍵／值對：

  • 0 => 0
  • 1 => 'bob'
  • key => 0
  • value => 'bob'
$foo = array ("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each ($foo);

$bar 現在包含有如下的鍵／值對：

  • 0 => 'Robert'
  • 1 => 'Bob'
  • key => 'Robert'
  • value => 'Bob'

each() 經常和 list() 結合使用來遍歷陣列，例如 $_POST：

例子 2. 用 each() 遍歷 $_POST：

echo "Values submitted via POST method:<br />\n";
reset ($_POST);
while (list ($key, $val) = each ($_POST)) {
    echo "$key => $val<br />\n";
}

在執行 each() 之後，陣列指針將停留在陣列中的下一個單元或者當碰到陣列結尾時停留在最後一個單元。如果要再用 each 遍歷陣列，必須使用 reset()。

參見 key()，list()，current()，reset()，next()，prev() 和 foreach()。

上一頁 | 首頁 | 下一頁
current | 上一層 | end


easter_date

(PHP 3>= 3.0.9, PHP 4 )

easter_date -- Get UNIX timestamp for midnight on Easter of a given year

Description

int easter_date ( [int year])

Returns the UNIX timestamp corresponding to midnight on Easter of the given year.

Since PHP 4.3.0, the year parameter is optional and defaults to the current year according to the localtime if ommited.

Warning: This function will generate a warning if the year is outside of the range for UNIX timestamps (i.e. before 1970 or after 2037).

例子 1. easter_date() example

echo date ("M-d-Y", easter_date(1999));        /* "Apr-04-1999" */
echo date ("M-d-Y", easter_date(2000));        /* "Apr-23-2000" */
echo date ("M-d-Y", easter_date(2001));        /* "Apr-15-2001" */

The date of Easter Day was defined by the Council of Nicaea in AD325 as the Sunday after the first full moon which falls on or after the Spring Equinox. The Equinox is assumed to always fall on 21st March, so the calculation reduces to determining the date of the full moon and the date of the following Sunday. The algorithm used here was introduced around the year 532 by Dionysius Exiguus. Under the Julian Calendar (for years before 1753) a simple 19-year cycle is used to track the phases of the Moon. Under the Gregorian Calendar (for years after 1753 - devised by Clavius and Lilius, and introduced by Pope Gregory XIII in October 1582, and into Britain and its then colonies in September 1752) two correction factors are added to make the cycle more accurate.

(The code is based on a C program by Simon Kershaw, <webmaster@ely.anglican.org>)

See easter_days() for calculating Easter before 1970 or after 2037.

上一頁 | 首頁 | 下一頁
cal_to_jd | 上一層 | easter_days


easter_days

(PHP 3>= 3.0.9, PHP 4 )

easter_days -- Get number of days after March 21 on which Easter falls for a given year

Description

int easter_days ( [int year [, int method]])

Returns the number of days after March 21 on which Easter falls for a given year. If no year is specified, the current year is assumed.

Since PHP 4.3.0, the year parameter is optional and defaults to the current year according to the localtime if ommited.

The method parameter was also introduced in PHP 4.3.0 and allows to calculate easter dates based on the Gregorian calendar during the years 1582 - 1752 when set to CAL_EASTER_ROMAN. See the calendar constants for more valid constants.

This function can be used instead of easter_date() to calculate Easter for years which fall outside the range of UNIX timestamps (i.e. before 1970 or after 2037).

例子 1. easter_days() example

echo easter_days (1999);        /* 14, i.e. April 4   */
echo easter_days (1492);        /* 32, i.e. April 22  */
echo easter_days (1913);        /*  2, i.e. March 23  */

The date of Easter Day was defined by the Council of Nicaea in AD325 as the Sunday after the first full moon which falls on or after the Spring Equinox. The Equinox is assumed to always fall on 21st March, so the calculation reduces to determining the date of the full moon and the date of the following Sunday. The algorithm used here was introduced around the year 532 by Dionysius Exiguus. Under the Julian Calendar (for years before 1753) a simple 19-year cycle is used to track the phases of the Moon. Under the Gregorian Calendar (for years after 1753 - devised by Clavius and Lilius, and introduced by Pope Gregory XIII in October 1582, and into Britain and its then colonies in September 1752) two correction factors are added to make the cycle more accurate.

(The code is based on a C program by Simon Kershaw, <webmaster@ely.anglican.org>)

See also easter_date().

上一頁 | 首頁 | 下一頁
easter_date | 上一層 | FrenchToJD


ebcdic2ascii

(PHP 3>= 3.0.17)

ebcdic2ascii -- Translate string from EBCDIC to ASCII

Description

int ebcdic2ascii ( string ebcdic_str)

ebcdic2ascii() is an Apache-specific function which is available only on EBCDIC based operating systems (OS/390, BS2000). It translates the EBCDIC encoded string ebcdic_str to its equivalent ASCII representation (binary safe), and returns the result.

See also the reverse function ascii2ebcdic()

上一頁 | 首頁 | 下一頁
ascii2ebcdic | 上一層 | getallheaders


echo

(PHP 3, PHP 4 )

echo -- Output one or more strings

Description

echo ( string arg1 [, string argn...])

Outputs all parameters.

echo() is not actually a function (it is a language construct) so you are not required to use parentheses with it. In fact, if you want to pass more than one parameter to echo, you must not enclose the parameters within parentheses. It is not possible to use echo() in a variable function context, but you can use print() instead.

例子 1. echo() examples

<?php
echo "Hello World";

echo "This spans
multiple lines. The newlines will be
output as well";

echo "This spans\nmultiple lines. The newlines will be\noutput as well.";

echo "Escaping characters is done \"Like this\".";

//You can use variables inside of an echo statement
$foo = "foobar";
$bar = "barbaz";

echo "foo is $foo"; // foo is foobar

// Using single quotes will print the variable name, not the value
echo 'foo is $foo'; // foo is $foo

// If you are not using any other characters, you can just echo variables
echo $foo;          // foobar
echo $foo,$bar;     // foobarbarbaz

echo <<<END
This uses the "here document" syntax to output
multiple lines with $variable interpolation. Note
that the here document terminator must appear on a
line with just a semicolon no extra whitespace!
END;

// Because echo is not a function, following code is invalid.
($some_var) ? echo('true'): echo('false');

// However, the following examples will work:
($some_var) ? print('true'): print('false'); // print is a function
echo $some_var ? 'true': 'false'; // changing the statement around
?>

echo() also has a shortcut syntax, where you can immediately follow the opening tag with an equals sign.

I have <?=$foo?> foo.

註: This short syntax only works with the short_open_tag configuration setting enabled.

See also
print(),
printf(), and
flush().

上一頁 | 首頁 | 下一頁
crypt | 上一層 | explode


end

(PHP 3, PHP 4 )

end -- 將陣列的內部指針指向最後一個單元

說明

mixed end ( array array)

end() 將 array 的內部指針移動到最後一個單元，並傳回該單元。

例子 1. 簡單的 end() 例子

<?php

  $fruits = array('apple','banana','cranberry');

  print end($fruits); // cranberry

?>

參見 current()，each()，next() 和 reset()。

上一頁 | 首頁 | 下一頁
each | 上一層 | extract


ereg

(PHP 3, PHP 4 )

ereg -- Regular expression match

Description

int ereg ( string pattern, string string [, array regs])

註: preg_match(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg().

Searches a string for matches to the regular expression given in pattern.

If matches are found for parenthesized substrings of pattern and the function is called with the third argument regs, the matches will be stored in the elements of the array regs. $regs[1] will contain the substring which starts at the first left parenthesis; $regs[2] will contain the substring starting at the second, and so on. $regs[0] will contain a copy of the complete string matched.

註: Up to (and including) PHP 4.1.0 $regs will be filled with exactly ten elements, even though more or fewer than ten parenthesized substrings may actually have matched. This has no effect on ereg()'s ability to match more substrings. If no matches are found, $regs will not be altered by ereg().

Searching is case sensitive.

Returns TRUE if a match for pattern was found in string, or FALSE if no matches were found or an error occurred.

The following code snippet takes a date in ISO format (YYYY-MM-DD) and prints it in DD.MM.YYYY format:

例子 1. ereg() Example

if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
    echo "$regs[3].$regs[2].$regs[1]";
} else {
    echo "Invalid date format: $date";
}

See also eregi(),
ereg_replace(),
eregi_replace(), and
preg_match().

上一頁 | 首頁 | 下一頁
ereg_replace | 上一層 | eregi_replace


error_log

(PHP 3, PHP 4 )

error_log -- send an error message somewhere

Description

int error_log ( string message [, int message_type [, string destination [, string extra_headers]]])

Sends an error message to the web server's error log, a TCP port or to a file. The first parameter, message, is the error message that should be logged. The second parameter, message_type says where the message should go:

表格 1. error_log() log types

0 | message is sent to PHP's system logger, using the Operating System's system logging mechanism or a file, depending on what the error_log configuration directive is set to.
1 | message is sent by email to the address in the destination parameter. This is the only message type where the fourth parameter, extra_headers is used. This message type uses the same internal function as mail() does.
2 | message is sent through the PHP debugging connection. This option is only available if remote debugging has been enabled. In this case, the destination parameter specifies the host name or IP address and optionally, port number, of the socket receiving the debug information.
3 | message is appended to the file destination.

警告

Remote debugging via TCP/IP is a PHP 3 feature that is not available in PHP 4.

例子 1. error_log() examples

// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon ($username, $password)) {
    error_log ("Oracle database not available!", 0);
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo()) {
    error_log ("Big trouble, we're all out of FOOs!", 1,
               "operator@mydomain.com");
}

// other ways of calling error_log():
error_log ("You messed up!", 2, "127.0.0.1:7000");
error_log ("You messed up!", 2, "loghost");
error_log ("You messed up!", 3, "/var/tmp/my-errors.log");

上一頁 | 首頁 | 下一頁
Error Handling and Logging Functions | 上一層 | error_reporting


error_reporting

(PHP 3, PHP 4 )

error_reporting -- set which PHP errors are reported

Description

int error_reporting ( [int level])

The error_reporting() function sets the error_reporting directive at runtime. PHP has many levels of errors, using this function sets that level for the duration (runtime) of your script.

error_reporting() sets PHP's error reporting level, and returns the old level. The level parameter takes on either a bitmask, or named constants. Using named constants is strongly encouraged to ensure compatibility for future versions. As error levels are added, the range of integers increases, so older integer-based error levels will not always behave as expected.

Some example uses:

例子 1. error_reporting() examples

<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting  (E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting (E_ALL ^ E_NOTICE);

// Report all PHP errors (bitwise 63 may be used in PHP 3)
error_reporting (E_ALL);

// Same as error_reporting(E_ALL);
ini_set ('error_reporting', E_ALL);

?>

The available error level constants are listed below. The actual meanings of these error levels are described in the predefined constants.

表格 1. error_reporting() level constants and bit values

value | constant
1 | E_ERROR
2 | E_WARNING
4 | E_PARSE
8 | E_NOTICE
16 | E_CORE_ERROR
32 | E_CORE_WARNING
64 | E_COMPILE_ERROR
128 | E_COMPILE_WARNING
256 | E_USER_ERROR
512 | E_USER_WARNING
1024 | E_USER_NOTICE
2047 | E_ALL

See also the display_errors directive and ini_set().

上一頁 | 首頁 | 下一頁
error_log | 上一層 | restore_error_handler


escapeshellarg

(PHP 4 >= 4.0.3)

escapeshellarg -- escape a string to be used as a shell argument

Description

string escapeshellarg ( string arg)

escapeshellarg() adds single quotes around a string and quotes/escapes any existing single quotes allowing you to pass a string directly to a shell function and having it be treated as a single safe argument. This function should be used to escape individual arguments to shell functions coming from user input. The shell functions include exec(), system() and the backtick operator. A standard use would be:

system("ls ".escapeshellarg($dir));

See also exec(), popen(), system(), and the backtick operator.

上一頁 | 首頁 | 下一頁
Program Execution functions | 上一層 | escapeshellcmd


escapeshellcmd

(PHP 3, PHP 4 )

escapeshellcmd -- escape shell metacharacters

Description

string escapeshellcmd ( string command)

escapeshellcmd() escapes any characters in a string that might be used to trick a shell command into executing arbitrary commands. This function should be used to make sure that any data coming from user input is escaped before this data is passed to the exec() or system() functions, or to the backtick operator. A standard use would be:

$e = escapeshellcmd($userinput);
system("echo $e"); // here we don't care if $e has spaces
$f = escapeshellcmd($filename);
system("touch \"/tmp/$f\"; ls -l \"/tmp/$f\""); // and here we do, so we use quotes

See also escapeshellarg(), exec(), popen(), system(), and the backtick operator.

上一頁 | 首頁 | 下一頁
escapeshellarg | 上一層 | exec


exec

(PHP 3, PHP 4 )

exec -- Execute an external program

Description

string exec ( string command [, array output [, int return_var]])

exec() executes the given command, however it does not output anything. It simply returns the last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

If the array argument is present, then the specified array will be filled with every line of output from the command. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec().

If the return_var argument is present along with the array argument, then the return status of the executed command will be written to this variable.

警告

If you are going to allow data coming from user input to be passed to this function, then you should be using escapeshellarg() or escapeshellcmd() to make sure that users cannot trick the system into executing arbitrary commands.

註: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.

See also system(),
passthru(), popen(),
escapeshellcmd(), and the backtick operator.

上一頁 | 首頁 | 下一頁
escapeshellcmd | 上一層 | passthru


exit

(PHP 3, PHP 4 )

exit -- Output a message and terminate the current script

Description

void exit ( [string status])

void exit ( int status)

註: This is not a real function, but a language construct.

The exit() function terminates execution of the script. It prints status just before exiting.

If status is an integer, that value will also be used as the exit status. Exit statuses should be in the range 1 to 254, the exit status 255 is reserved by PHP and shall not be used.

註: The current CVS version does NOT print the status if it is an integer.

註: The die() function is an alias for exit().

例子 1. exit() example

<?php

$filename = '/path/to/data-file';
$file = fopen ($filename, 'r')
    or exit("unable to open file ($filename)");

?>

上一頁 | 首頁 | 下一頁
eval | 上一層 | get_browser


explode

(PHP 3, PHP 4 )

explode -- Split a string by string

Description

array explode ( string separator, string string [, int limit])

Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string separator. If limit is set, the returned array will contain a maximum of limit elements with the last element containing the rest of string.

If separator is an empty string (""), explode() will return FALSE. If separator contains a value that is not contained in string, then explode() will return an array containing string.

註: The limit parameter was added in PHP 4.0.1

例子 1. explode() examples

$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);

$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user,$pass,$uid,$gid,$gecos,$home,$shell) = explode(":",$data);

註: Although implode() can for historical reasons accept its parameters in either order, explode() cannot. You must ensure that the separator argument comes before the string argument.

See also
preg_split(),
spliti(),
split(), and
implode().

上一頁 | 首頁 | 下一頁
echo | 上一層 | get_html_translation_table


extract

(PHP 3>= 3.0.7, PHP 4 )

extract -- 從陣列中將變數導入到當前的符號表

說明

int extract ( array var_array [, int extract_type [, string prefix]])

本函式用來將變數從陣列中導入到當前的符號表中。接受結合陣列 var_array 作為參數並將鍵名當作變數名，值作為變數的值。對每個鍵／值對都會在當前的符號表中建立變數，並受到 extract_type 和 prefix 參數的影響。

註: 自版本 4.0.5 起本函式傳回被提取的變數數目。

註: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引進的。

extract() 檢查每個鍵名看是否可以作為一個合法的變數名，同時也檢查和符號表中已有的變數名的衝突。對待非法／數字和衝突的鍵名的方法將根據 extract_type 參數決定。可以是以下值之一：

EXTR_OVERWRITE

如果有衝突，覆蓋已有的變數。

EXTR_SKIP

如果有衝突，不覆蓋已有的變數。

EXTR_PREFIX_SAME

如果有衝突，在變數名前加上前綴 prefix。

EXTR_PREFIX_ALL

給所有變數名加上前綴 prefix。自 PHP 4.0.5 起這也包括了對數字索引的處理。

EXTR_PREFIX_INVALID

僅在非法／數字的變數名前加上前綴 prefix。本標記是 PHP 4.0.5 新加的。

EXTR_IF_EXISTS

僅在當前符號表中已有同名變數時，覆蓋它們的值。其它的都不處理。可以用在已經定義了一組合法的變數，然後要從一個陣列例如 $_REQUEST 中提取值覆蓋這些變數的場合。本標記是 PHP 4.2.0 新加的。

EXTR_PREFIX_IF_EXISTS

僅在當前符號表中已有同名變數時，建立附加了前綴的變數名，其它的都不處理。本標記是 PHP 4.2.0 新加的。

如果沒有指定 extract_type，則被假定為 EXTR_OVERWRITE。

注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME，EXTR_PREFIX_ALL，EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時需要。如果附加了前綴後的結果不是合法的變數名，將不會導入到符號表中。

extract() 傳回成功導入到符號表中的變數數目。

一種可能的用法是將 wddx_deserialize() 傳回的結合陣列中的內容導入到符號表變數中去。

例子 1. extract() 例子

<?php

/* 假定 $var_array 是 wddx_deserialize 傳回的陣列*/

$size = "large";
$var_array = array ("color" => "blue",
                    "size"  => "medium",
                    "shape" => "sphere");
extract ($var_array, EXTR_PREFIX_SAME, "wddx");

print "$color, $size, $shape, $wddx_size\n";

?>

以上例子將產生：
blue, large, sphere, medium

$size 沒有被覆蓋，因為指定了 EXTR_PREFIX_SAME，這使得 $wddx_size 被建立。如果指定了 EXTR_SKIP，則 $wddx_size 也不會被建立。EXTR_OVERWRITE 將使 $size 的值為“medium”，EXTR_PREFIX_ALL 將建立新變數 $wddx_color，$wddx_size 和 $wddx_shape。

必須使用結合陣列，數字索引的陣列將不會產生結果，除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。

參見 compact()。

上一頁 | 首頁 | 下一頁
end | 上一層 | in_array


fbsql_affected_rows

(PHP 4 >= 4.0.6)

fbsql_affected_rows -- Get number of affected rows in previous FrontBase operation

Description

int fbsql_affected_rows ( [resource link_identifier])

fbsql_affected_rows() returns the number of rows affected by the last INSERT, UPDATE or DELETE query associated with link_identifier. If the link identifier isn't specified, the last link opened by fbsql_connect() is assumed.

註: If you are using transactions, you need to call fbsql_affected_rows() after your INSERT, UPDATE, or DELETE query, not after the commit.

If the last query was a DELETE query with no WHERE clause, all of the records will have been deleted from the table but this function will return zero.

註: When using UPDATE, FrontBase will not update columns where the new value is the same as the old value. This creates the possibility that fbsql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query.

If the last query failed, this function will return -1.

See also: fbsql_num_rows().

上一頁 | 首頁 | 下一頁
FrontBase Functions | 上一層 | fbsql_autocommit


fbsql_autocommit

(PHP 4 >= 4.0.6)

fbsql_autocommit -- Enable or disable autocommit

Description

bool fbsql_autocommit ( resource link_identifier [, bool OnOff])

fbsql_autocommit() returns the current autocommit status. if the optional OnOff parameter is given the auto commit status will be changed. With OnOff set to TRUE each statement will be committed automatically, if no errors was found. With OnOff set to FALSE the user must commit or rollback the transaction using either fbsql_commit() or fbsql_rollback().

See also: fbsql_commit() and fbsql_rollback()

上一頁 | 首頁 | 下一頁
fbsql_affected_rows | 上一層 | fbsql_change_user


fbsql_change_user

(no version information, might be only in CVS)

fbsql_change_user -- Change logged in user of the active connection

Description

resource fbsql_change_user ( string user, string password [, string database [, resource link_identifier]])

fbsql_change_user() changes the logged in user of the current active connection, or the connection given by the optional parameter link_identifier. If a database is specified, this will default or current database after the user has been changed. If the new user and password authorization fails, the current connected user stays active.

上一頁 | 首頁 | 下一頁
fbsql_autocommit | 上一層 | fbsql_close


fbsql_close

(PHP 4 >= 4.0.6)

fbsql_close -- Close FrontBase connection

Description

boolean fbsql_close ( [resource link_identifier])

Returns: TRUE on success, FALSE on error.

fbsql_close() closes the connection to the FrontBase server that's associated with the specified link identifier. If link_identifier isn't specified, the last opened link is used.

Using fbsql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.

例子 1. fbsql_close() example

<?php
    $link = fbsql_connect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    print ("Connected successfully");
    fbsql_close ($link);
?>

See also: fbsql_connect() and fbsql_pconnect().

上一頁 | 首頁 | 下一頁
fbsql_change_user | 上一層 | fbsql_commit


fbsql_commit

(PHP 4 >= 4.0.6)

fbsql_commit -- Commits a transaction to the database

Description

bool fbsql_commit ( [resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_commit() ends the current transaction by writing all inserts, updates and deletes to the disk and unlocking all row and table locks held by the transaction. This command is only needed if autocommit is set to false.

See also: fbsql_autocommit() and fbsql_rollback()

上一頁 | 首頁 | 下一頁
fbsql_close | 上一層 | fbsql_connect


fbsql_connect

(PHP 4 >= 4.0.6)

fbsql_connect -- Open a connection to a FrontBase Server

Description

resource fbsql_connect ( [string hostname [, string username [, string password]]])

Returns a positive FrontBase link identifier on success, or an error message on failure.

fbsql_connect() establishes a connection to a
FrontBase server.  The following defaults are assumed for missing
optional parameters: hostname = 'NULL',
username = '_SYSTEM' and
password = empty password.

If a second call is made to fbsql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

The link to the server will be closed as soon as the execution of the script ends, unless it's closed earlier by explicitly calling fbsql_close().

例子 1. fbsql_connect() example

<?php

    $link = fbsql_connect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    print ("Connected successfully");
    fbsql_close ($link);

?>

See also fbsql_pconnect() and fbsql_close().

上一頁 | 首頁 | 下一頁
fbsql_commit | 上一層 | fbsql_create_blob


fbsql_create_blob

(PHP 4 >= 4.2.0)

fbsql_create_blob -- Create a BLOB

Description

string fbsql_create_blob ( string blob_data [, resource link_identifier])

Returns: A resource handle to the newly created blob.

fbsql_create_blob() creates a blob from blob_data. The returned resource handle can be used with insert and update commands to store the blob in the database.

例子 1. fbsql_create_blob() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    $filename = "blobfile.bin";
    $fp = fopen($filename, "rb");
    $blobdata = fread($fp, filesize($filename));
    fclose($fp);

    $blobHandle = fbsql_create_blob($blobdata, $link);

    $sql = "INSERT INTO BLOB_TABLE (BLOB_COLUMN) VALUES ($blobHandle);";
    $rs = fbsql_query($sql, $link);
?>

See also: fbsql_create_clob(),
fbsql_read_blob(),
fbsql_read_clob(), and
fbsql_set_lob_mode().

上一頁 | 首頁 | 下一頁
fbsql_connect | 上一層 | fbsql_create_clob


fbsql_create_clob

(PHP 4 >= 4.2.0)

fbsql_create_clob -- Create a CLOB

Description

string fbsql_create_clob ( string clob_data [, resource link_identifier])

Returns: A resource handle to the newly created CLOB.

fbsql_create_clob() creates a clob from clob_data. The returned resource handle can be used with insert and update commands to store the clob in the database.

例子 1. fbsql_create_clob() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    $filename = "clob_file.txt";
    $fp = fopen($filename, "rb");
    $clobdata = fread($fp, filesize($filename));
    fclose($fp);

    $clobHandle = fbsql_create_clob($clobdata, $link);

    $sql = "INSERT INTO CLOB_TABLE (CLOB_COLUMN) VALUES ($clobHandle);";
    $rs = fbsql_query($sql, $link);
?>

See also: fbsql_create_blob(),
fbsql_read_blob(),
fbsql_read_clob(), and
fbsql_set_lob_mode().

上一頁 | 首頁 | 下一頁
fbsql_create_blob | 上一層 | fbsql_create_db


fbsql_create_db

(PHP 4 >= 4.0.6)

fbsql_create_db -- Create a FrontBase database

Description

bool fbsql_create_db ( string database name [, resource link_identifier])

fbsql_create_db() attempts to create a new database on the server associated with the specified link identifier.

例子 1. fbsql_create_db() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    if (fbsql_create_db ("my_db")) {
        print("Database created successfully\n");
    } else {
        printf("Error creating database: %s\n", fbsql_error ());
    }
?>

See also: fbsql_drop_db().

上一頁 | 首頁 | 下一頁
fbsql_create_clob | 上一層 | fbsql_data_seek


fbsql_data_seek

(PHP 4 >= 4.0.6)

fbsql_data_seek -- Move internal result pointer

Description

bool fbsql_data_seek ( resource result_identifier, int row_number)

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_data_seek() moves the internal row pointer of the FrontBase result associated with the specified result identifier to point to the specified row number. The next call to fbsql_fetch_row() would return that row.

Row_number starts at 0.

例子 1. fbsql_data_seek() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");

    fbsql_select_db ("samp_db")
        or die ("Could not select database");

    $query = "SELECT last_name, first_name FROM friends;";
    $result = fbsql_query ($query)
        or die ("Query failed");

    # fetch rows in reverse order

    for ($i = fbsql_num_rows ($result) - 1; $i >=0; $i--) {
        if (!fbsql_data_seek ($result, $i)) {
            printf ("Cannot seek to row %d\n", $i);
            continue;
        }

        if(!($row = fbsql_fetch_object ($result)))
            continue;

        printf("%s %s<BR>\n", $row->last_name, $row->first_name);
    }

    fbsql_free_result ($result);
?>
上一頁 | 首頁 | 下一頁
fbsql_create_db | 上一層 | fbsql_database_password


fbsql_database

(PHP 4 >= 4.0.6)

fbsql_database -- Get or set the database name used with a connection

Description

string fbsql_database ( resource link_identifier [, string database])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_database_password | 上一層 | fbsql_db_query


fbsql_database_password

(PHP 4 >= 4.0.6)

fbsql_database_password -- Sets or retrieves the password for a FrontBase database

Description

string fbsql_database_password ( resource link_identifier [, string database_password])

Returns: The database password associated with the link identifier.

fbsql_database_password() sets and retrieves the database password used by the connection. if a database is protected by a database password, the user must call this function before calling fbsql_select_db(). if the second optional parameter is given the function sets the database password for the specified link identifier. If no link identifier is specified, the last opened link is assumed. If no link is open, the function will try to establish a link as if fbsql_connect() was called, and use it.

This function does not change the database password in the database nor can it be used to retrive the database password for a database.

例子 1. fbsql_create_clob() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    fbsql_database_password($link, "secret db password");
    fbsql_select_db($database, $link);
?>

See also: fbsql_connect(),
fbsql_pconnect() and
fbsql_select_db().

上一頁 | 首頁 | 下一頁
fbsql_data_seek | 上一層 | fbsql_database


fbsql_db_query

(PHP 4 >= 4.0.6)

fbsql_db_query -- Send a FrontBase query

Description

resource fbsql_db_query ( string database, string query [, resource link_identifier])

Returns: A positive FrontBase result identifier to the query result, or FALSE on error.

fbsql_db_query() selects a database and executes a query on it. If the optional link identifier isn't specified, the function will try to find an open link to the FrontBase server and if no such link is found it'll try to create one as if fbsql_connect() was called with no arguments

See also fbsql_connect().

上一頁 | 首頁 | 下一頁
fbsql_database | 上一層 | fbsql_db_status


fbsql_db_status

(PHP 4 >= 4.1.0)

fbsql_db_status -- Get the status for a given database

Description

int fbsql_db_status ( string database_name [, resource link_identifier])

Returns: An integer value with the current status.

fbsql_db_status() requests the current status of the database specified by database_name. If the link_identifier is omitted the default link_identifier will be used.

The return value can be one of the following constants:

  • FALSE - The exec handler for the host was invalid. This error will occur when the link_identifier connects directly to a database by using a port number. FBExec can be available on the server but no connection has been made for it.

  • FBSQL_UNKNOWN - The Status is unknown.

  • FBSQL_STOPPED - The database is not running. Use fbsql_start_db() to start the database.

  • FBSQL_STARTING - The database is starting.

  • FBSQL_RUNNING - The database is running and can be used to perform SQL operations.

  • FBSQL_STOPPING - The database is stopping.

  • FBSQL_NOEXEC - FBExec is not running on the server and it is not possible to get the status of the database.

See also: fbsql_start_db() and fbsql_stop_db().

上一頁 | 首頁 | 下一頁
fbsql_db_query | 上一層 | fbsql_drop_db


fbsql_drop_db

(PHP 4 >= 4.0.6)

fbsql_drop_db -- Drop (delete) a FrontBase database

Description

bool fbsql_drop_db ( string database_name [, resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_drop_db() attempts to drop (remove) an entire database from the server associated with the specified link identifier.

上一頁 | 首頁 | 下一頁
fbsql_db_status | 上一層 | fbsql_errno


fbsql_errno

(PHP 4 >= 4.0.6)

fbsql_errno -- Returns the numerical value of the error message from previous FrontBase operation

Description

int fbsql_errno ( [resource link_identifier])

Returns the error number from the last fbsql function, or 0 (zero) if no error occurred.

Errors coming back from the fbsql database backend don't issue warnings. Instead, use fbsql_errno() to retrieve the error code. Note that this function only returns the error code from the most recently executed fbsql function (not including fbsql_error() and fbsql_errno()), so if you want to use it, make sure you check the value before calling another fbsql function.

<?php
fbsql_connect("marliesle");
echo fbsql_errno().": ".fbsql_error()."<BR>";
fbsql_select_db("nonexistentdb");
echo fbsql_errno().": ".fbsql_error()."<BR>";
$conn = fbsql_query("SELECT * FROM nonexistenttable;");
echo fbsql_errno().": ".fbsql_error()."<BR>";
?>

See also: fbsql_error() and fbsql_warnings().

上一頁 | 首頁 | 下一頁
fbsql_drop_db | 上一層 | fbsql_error


fbsql_error

(PHP 4 >= 4.0.6)

fbsql_error -- Returns the text of the error message from previous FrontBase operation

Description

string fbsql_error ( [resource link_identifier])

Returns the error text from the last fbsql function, or '' (the empty string) if no error occurred.

Errors coming back from the fbsql database backend don't issue warnings. Instead, use fbsql_error() to retrieve the error text. Note that this function only returns the error text from the most recently executed fbsql function (not including fbsql_error() and fbsql_errno()), so if you want to use it, make sure you check the value before calling another fbsql function.

<?php
fbsql_connect("marliesle");
echo fbsql_errno().": ".fbsql_error()."<BR>";
fbsql_select_db("nonexistentdb");
echo fbsql_errno().": ".fbsql_error()."<BR>";
$conn = fbsql_query("SELECT * FROM nonexistenttable;");
echo fbsql_errno().": ".fbsql_error()."<BR>";
?>

See also: fbsql_errno() and fbsql_warnings().

上一頁 | 首頁 | 下一頁
fbsql_errno | 上一層 | fbsql_fetch_array


fbsql_fetch_array

(PHP 4 >= 4.0.6)

fbsql_fetch_array -- Fetch a result row as an associative array, a numeric array, or both

Description

array fbsql_fetch_array ( resource result [, int result_type])

Returns an array that corresponds to the fetched row, or FALSE if there are no more rows.

fbsql_fetch_array() is an extended version of fbsql_fetch_row(). In addition to storing the data in the numeric indices of the result array, it also stores the data in associative indices, using the field names as keys.

If two or more columns of the result have the same field names, the last column will take precedence. To access the other column(s) of the same name, you must the numeric index of the column or make an alias for the column.

select t1.f1 as foo t2.f1 as bar from t1, t2

An important thing to note is that using fbsql_fetch_array() is NOT significantly slower than using fbsql_fetch_row(), while it provides a significant added value.

The optional second argument result_type in fbsql_fetch_array() is a constant and can take the following values: FBSQL_ASSOC, FBSQL_NUM, and FBSQL_BOTH.

For further details, see also fbsql_fetch_row() and fbsql_fetch_assoc().

例子 1. fbsql_fetch_array() example

<?php
fbsql_connect ($host, $user, $password);
$result = fbsql_db_query ("database","select user_id, fullname from table");
while ($row = fbsql_fetch_array ($result)) {
    echo "user_id: ".$row["user_id"]."<br>\n";
    echo "user_id: ".$row[0]."<br>\n";
    echo "fullname: ".$row["fullname"]."<br>\n";
    echo "fullname: ".$row[1]."<br>\n";
}
fbsql_free_result ($result);
?>
上一頁 | 首頁 | 下一頁
fbsql_error | 上一層 | fbsql_fetch_assoc


fbsql_fetch_assoc

(PHP 4 >= 4.0.6)

fbsql_fetch_assoc -- Fetch a result row as an associative array

Description

array fbsql_fetch_assoc ( resource result)

Returns an associative array that corresponds to the fetched row, or FALSE if there are no more rows.

fbsql_fetch_assoc() is equivalent to calling fbsql_fetch_array() with FBSQL_ASSOC for the optional second parameter. It only returns an associative array. This is the way fbsql_fetch_array() originally worked. If you need the numeric indices as well as the associative, use fbsql_fetch_array().

If two or more columns of the result have the same field names, the last column will take precedence. To access the other column(s) of the same name, you must use fbsql_fetch_array() and have it return the numeric indices as well.

An important thing to note is that using fbsql_fetch_assoc() is NOT significantly slower than using fbsql_fetch_row(), while it provides a significant added value.

For further details, see also fbsql_fetch_row() and fbsql_fetch_array().

例子 1. fbsql_fetch_assoc() example

<?php
fbsql_connect ($host, $user, $password);
$result = fbsql_db_query ("database","select * from table");
while ($row = fbsql_fetch_assoc ($result)) {
    echo $row["user_id"];
    echo $row["fullname"];
}
fbsql_free_result ($result);
?>
上一頁 | 首頁 | 下一頁
fbsql_fetch_array | 上一層 | fbsql_fetch_field


fbsql_fetch_field

(PHP 4 >= 4.0.6)

fbsql_fetch_field -- Get column information from a result and return as an object

Description

object fbsql_fetch_field ( resource result [, int field_offset])

Returns an object containing field information.

fbsql_fetch_field() can be used in order to obtain information about fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by fbsql_fetch_field() is retrieved.

The properties of the object are:

  • name - column name

  • table - name of the table the column belongs to

  • max_length - maximum length of the column

  • not_null - 1 if the column cannot be NULL

  • type - the type of the column

例子 1. fbsql_fetch_field() example

<?php
fbsql_connect ($host, $user, $password)
    or die ("Could not connect");
$result = fbsql_db_query ("database", "select * from table")
    or die ("Query failed");
# get column metadata
$i = 0;
while ($i < fbsql_num_fields ($result)) {
    echo "Information for column $i:<BR>\n";
    $meta = fbsql_fetch_field ($result);
    if (!$meta) {
        echo "No information available<BR>\n";
    }
    echo "<PRE>
max_length:   $meta->max_length
name:         $meta->name
not_null:     $meta->not_null
table:        $meta->table
type:         $meta->type
</PRE>";
    $i++;
}
fbsql_free_result ($result);
?>

See also fbsql_field_seek().

上一頁 | 首頁 | 下一頁
fbsql_fetch_assoc | 上一層 | fbsql_fetch_lengths


fbsql_fetch_lengths

(PHP 4 >= 4.0.6)

fbsql_fetch_lengths -- Get the length of each output in a result

Description

array fbsql_fetch_lengths ( [resource result])

Returns: An array that corresponds to the lengths of each field in the last row fetched by fbsql_fetch_row(), or FALSE on error.

fbsql_fetch_lengths() stores the lengths of
each result column in the last row returned by
fbsql_fetch_row(),
fbsql_fetch_array() and
fbsql_fetch_object() in an array, starting at
offset 0.

See also: fbsql_fetch_row().

上一頁 | 首頁 | 下一頁
fbsql_fetch_field | 上一層 | fbsql_fetch_object


fbsql_fetch_object

(PHP 4 >= 4.0.6)

fbsql_fetch_object -- Fetch a result row as an object

Description

object fbsql_fetch_object ( resource result [, int result_type])

Returns an object with properties that correspond to the fetched row, or FALSE if there are no more rows.

fbsql_fetch_object() is similar to fbsql_fetch_array(), with one difference - an object is returned, instead of an array. Indirectly, that means that you can only access the data by the field names, and not by their offsets (numbers are illegal property names).

The optional argument result_type is a constant and can take the following values: FBSQL_ASSOC, FBSQL_NUM, and FBSQL_BOTH.

Speed-wise, the function is identical to fbsql_fetch_array(), and almost as quick as fbsql_fetch_row() (the difference is insignificant).

例子 1. fbsql_fetch_object() example

<?php
fbsql_connect ($host, $user, $password);
$result = fbsql_db_query ("database", "select * from table");
while ($row = fbsql_fetch_object ($result)) {
    echo $row->user_id;
    echo $row->fullname;
}
fbsql_free_result ($result);
?>

See also: fbsql_fetch_array() and fbsql_fetch_row().

上一頁 | 首頁 | 下一頁
fbsql_fetch_lengths | 上一層 | fbsql_fetch_row


fbsql_fetch_row

(PHP 4 >= 4.0.6)

fbsql_fetch_row -- Get a result row as an enumerated array

Description

array fbsql_fetch_row ( resource result)

Returns: An array that corresponds to the fetched row, or FALSE if there are no more rows.

fbsql_fetch_row() fetches one row of data from the result associated with the specified result identifier. The row is returned as an array. Each result column is stored in an array offset, starting at offset 0.

Subsequent call to fbsql_fetch_row() would return the next row in the result set, or FALSE if there are no more rows.

See also: fbsql_fetch_array(),
fbsql_fetch_object(),
fbsql_data_seek(),
fbsql_fetch_lengths(), and
fbsql_result().

上一頁 | 首頁 | 下一頁
fbsql_fetch_object | 上一層 | fbsql_field_flags


fbsql_field_flags

(PHP 4 >= 4.0.6)

fbsql_field_flags -- Get the flags associated with the specified field in a result

Description

string fbsql_field_flags ( resource result, int field_offset)

fbsql_field_flags() returns the field flags of the specified field. The flags are reported as a single word per flag separated by a single space, so that you can split the returned value using explode().

上一頁 | 首頁 | 下一頁
fbsql_fetch_row | 上一層 | fbsql_field_len


fbsql_field_len

(PHP 4 >= 4.0.6)

fbsql_field_len -- Returns the length of the specified field

Description

int fbsql_field_len ( resource result, int field_offset)

fbsql_field_len() returns the length of the specified field.

上一頁 | 首頁 | 下一頁
fbsql_field_flags | 上一層 | fbsql_field_name


fbsql_field_name

(PHP 4 >= 4.0.6)

fbsql_field_name -- Get the name of the specified field in a result

Description

string fbsql_field_name ( resource result, int field_index)

fbsql_field_name() returns the name of the specified field index. result must be a valid result identifier and field_index is the numerical offset of the field.

註: field_index starts at 0.

e.g. The index of the third field would actually be 2, the index of the fourth field would be 3 and so on.

例子 1. fbsql_field_name() example

// The users table consists of three fields:
//   user_id
//   username
//   password.

$res = fbsql_db_query("users", "select * from users", $link);

echo fbsql_field_name($res, 0) . "\n";
echo fbsql_field_name($res, 2);

The above example would produce the following output:

user_id
password

上一頁 | 首頁 | 下一頁
fbsql_field_len | 上一層 | fbsql_field_seek


fbsql_field_seek

(PHP 4 >= 4.0.6)

fbsql_field_seek -- Set result pointer to a specified field offset

Description

bool fbsql_field_seek ( resource result, int field_offset)

Seeks to the specified field offset. If the next call to fbsql_fetch_field() doesn't include a field offset, the field offset specified in fbsql_field_seek() will be returned.

See also: fbsql_fetch_field().

上一頁 | 首頁 | 下一頁
fbsql_field_name | 上一層 | fbsql_field_table


fbsql_field_table

(PHP 4 >= 4.0.6)

fbsql_field_table -- Get name of the table the specified field is in

Description

string fbsql_field_table ( resource result, int field_offset)

Returns the name of the table that the specified field is in.

上一頁 | 首頁 | 下一頁
fbsql_field_seek | 上一層 | fbsql_field_type


fbsql_field_type

(PHP 4 >= 4.0.6)

fbsql_field_type -- Get the type of the specified field in a result

Description

string fbsql_field_type ( resource result, int field_offset)

fbsql_field_type() is similar to the fbsql_field_name() function. The arguments are identical, but the field type is returned instead. The field type will be one of "int", "real", "string", "blob", and others as detailed in the FrontBase documentation.

例子 1. fbsql_field_type() example

<?php

fbsql_connect ("localhost", "_SYSTEM", "");
fbsql_select_db ("wisconsin");
$result = fbsql_query ("SELECT * FROM onek;");
$fields = fbsql_num_fields ($result);
$rows   = fbsql_num_rows ($result);
$i = 0;
$table = fbsql_field_table ($result, $i);
echo "Your '".$table."' table has ".$fields." fields and ".$rows." records <BR>";
echo "The table has the following fields <BR>";
while ($i < $fields) {
    $type  = fbsql_field_type  ($result, $i);
    $name  = fbsql_field_name  ($result, $i);
    $len   = fbsql_field_len   ($result, $i);
    $flags = fbsql_field_flags ($result, $i);
    echo $type." ".$name." ".$len." ".$flags."<BR>";
    $i++;
}
fbsql_close();

?>

上一頁 | 首頁 | 下一頁
fbsql_field_table | 上一層 | fbsql_free_result


fbsql_free_result

(PHP 4 >= 4.0.6)

fbsql_free_result -- Free result memory

Description

bool fbsql_free_result ( resource result)

fbsql_free_result() will free all memory associated with the result identifier result.

fbsql_free_result() only needs to be called if you are concerned about how much memory is being used for queries that return large result sets. All associated result memory is automatically freed at the end of the script's execution.

上一頁 | 首頁 | 下一頁
fbsql_field_type | 上一層 | fbsql_get_autostart_info


fbsql_get_autostart_info

(PHP 4 >= 4.1.0)

fbsql_get_autostart_info -- No description given yet

Description

array fbsql_get_autostart_info ( [resource link_identifier])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_free_result | 上一層 | fbsql_hostname


fbsql_hostname

(PHP 4 >= 4.0.6)

fbsql_hostname -- Get or set the host name used with a connection

Description

string fbsql_hostname ( resource link_identifier [, string host_name])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_get_autostart_info | 上一層 | fbsql_insert_id


fbsql_insert_id

(PHP 4 >= 4.0.6)

fbsql_insert_id -- Get the id generated from the previous INSERT operation

Description

int fbsql_insert_id ( [resource link_identifier])

fbsql_insert_id() returns the ID generated for an column defined as DEFAULT UNIQUE by the previous INSERT query using the given link_identifier. If link_identifier isn't specified, the last opened link is assumed.

fbsql_insert_id() returns 0 if the previous query does not generate an DEFAULT UNIQUE value. If you need to save the value for later, be sure to call fbsql_insert_id() immediately after the query that generates the value.

註: The value of the FrontBase SQL function LAST_INSERT_ID() always contains the most recently generated DEFAULT UNIQUE value, and is not reset between queries.

上一頁 | 首頁 | 下一頁
fbsql_hostname | 上一層 | fbsql_list_dbs


fbsql_list_dbs

(PHP 4 >= 4.0.6)

fbsql_list_dbs -- List databases available on a FrontBase server

Description

resource fbsql_list_dbs ( [resource link_identifier])

fbsql_list_dbs() will return a result pointer containing the databases available from the current fbsql daemon. Use the fbsql_tablename() function to traverse this result pointer.

例子 1. fbsql_list_dbs() example

$link = fbsql_connect('localhost', 'myname', 'secret');
$db_list = fbsql_list_dbs($link);

while ($row = fbsql_fetch_object($db_list)) {
    echo $row->Database . "\n";
}

The above example would produce the following output:

database1
database2
database3
...

註: The above code would just as easily work with fbsql_fetch_row() or other similar functions.

上一頁 | 首頁 | 下一頁
fbsql_insert_id | 上一層 | fbsql_list_fields


fbsql_list_fields

(PHP 4 >= 4.0.6)

fbsql_list_fields -- List FrontBase result fields

Description

resource fbsql_list_fields ( string database_name, string table_name [, resource link_identifier])

fbsql_list_fields() retrieves information
about the given tablename. Arguments are the database name and
the table name. A result pointer is returned which can be used
with fbsql_field_flags(),
fbsql_field_len(),
fbsql_field_name(), and
fbsql_field_type().

A result identifier is a positive integer. The function returns -1 if a error occurs. A string describing the error will be placed in $phperrmsg, and unless the function was called as @fbsql() then this error string will also be printed out.

例子 1. fbsql_list_fields() example

$link = fbsql_connect('localhost', 'myname', 'secret');

$fields = fbsql_list_fields("database1", "table1", $link);
$columns = fbsql_num_fields($fields);

for ($i = 0; $i < $columns; $i++) {
    echo fbsql_field_name($fields, $i) . "\n";;
}

The above example would produce the following output:

field1
field2
field3
...

上一頁 | 首頁 | 下一頁
fbsql_list_dbs | 上一層 | fbsql_list_tables


fbsql_list_tables

(PHP 4 >= 4.0.6)

fbsql_list_tables -- List tables in a FrontBase database

Description

resource fbsql_list_tables ( string database [, resource link_identifier])

fbsql_list_tables() takes a database name and returns a result pointer much like the fbsql_db_query() function. The fbsql_tablename() function should be used to extract the actual table names from the result pointer.

上一頁 | 首頁 | 下一頁
fbsql_list_fields | 上一層 | fbsql_next_result


fbsql_next_result

(PHP 4 >= 4.0.6)

fbsql_next_result -- Move the internal result pointer to the next result

Description

bool fbsql_next_result ( resource result_id)

When sending more than one SQL statement to the server or executing a stored procedure with multiple results will cause the server to return multiple result sets. This function will test for additional results available form the server. If an additional result set exists it will free the existing result set and prepare to fetch the words from the new result set. The function will return TRUE if an additional result set was available or FALSE otherwise.

例子 1. fbsql_next_result() example

<?php
    $link = fbsql_connect ("localhost", "_SYSTEM", "secret");
    fbsql_select_db("MyDB", $link);
    $SQL = "Select * from table1; select * from table2;";
    $rs = fbsql_query($SQL, $link);
    do {
        while ($row = fbsql_fetch_row($rs)) {
        }
    } while (fbsql_next_result($rs));
    fbsql_free_result($rs);
    fbsql_close ($link);
?>
上一頁 | 首頁 | 下一頁
fbsql_list_tables | 上一層 | fbsql_num_fields


fbsql_num_fields

(PHP 4 >= 4.0.6)

fbsql_num_fields -- Get number of fields in result

Description

int fbsql_num_fields ( resource result)

fbsql_num_fields() returns the number of fields in a result set.

See also:
fbsql_db_query(),
fbsql_query(),
fbsql_fetch_field(), and
fbsql_num_rows().

上一頁 | 首頁 | 下一頁
fbsql_next_result | 上一層 | fbsql_num_rows


fbsql_num_rows

(PHP 4 >= 4.0.6)

fbsql_num_rows -- Get number of rows in result

Description

int fbsql_num_rows ( resource result)

fbsql_num_rows() returns the number of rows in a result set. This command is only valid for SELECT statements. To retrieve the number of rows returned from a INSERT, UPDATE or DELETE query, use fbsql_affected_rows().

例子 1. fbsql_num_rows() example

<?php

$link = fbsql_connect("localhost", "username", "password");
fbsql_select_db("database", $link);

$result = fbsql_query("SELECT * FROM table1;", $link);
$num_rows = fbsql_num_rows($result);

echo "$num_rows Rows\n";

?>

See also: fbsql_affected_rows(),
fbsql_connect(),
fbsql_select_db(), and
fbsql_query().

上一頁 | 首頁 | 下一頁
fbsql_num_fields | 上一層 | fbsql_password


fbsql_password

(PHP 4 >= 4.0.6)

fbsql_password -- Get or set the user password used with a connection

Description

string fbsql_password ( resource link_identifier [, string password])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_num_rows | 上一層 | fbsql_pconnect


fbsql_pconnect

(PHP 4 >= 4.0.6)

fbsql_pconnect -- Open a persistent connection to a FrontBase Server

Description

resource fbsql_pconnect ( [string hostname [, string username [, string password]]])

Returns: A positive FrontBase persistent link identifier on success, or FALSE on error.

fbsql_pconnect() establishes a connection to a FrontBase server. The following defaults are assumed for missing optional parameters: host = 'localhost', username = "_SYSTEM" and password = empty password.

fbsql_pconnect() acts very much like fbsql_connect() with two major differences.

To set Frontbase server port number, use fbsql_select_db().

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use.

This type of links is therefore called 'persistent'.

上一頁 | 首頁 | 下一頁
fbsql_password | 上一層 | fbsql_query


fbsql_query

(PHP 4 >= 4.0.6)

fbsql_query -- Send a FrontBase query

Description

resource fbsql_query ( string query [, resource link_identifier])

fbsql_query() sends a query to the currently active database on the server that's associated with the specified link identifier. If link_identifier isn't specified, the last opened link is assumed. If no link is open, the function tries to establish a link as if fbsql_connect() was called with no arguments, and use it.

註: The query string shall always end with a semicolon.

fbsql_query() returns TRUE (non-zero) or FALSE to indicate whether or not the query succeeded. A return value of TRUE means that the query was legal and could be executed by the server. It does not indicate anything about the number of rows affected or returned. It is perfectly possible for a query to succeed but affect no rows or return no rows.

The following query is syntactically invalid, so fbsql_query() fails and returns FALSE:

例子 1. fbsql_query() example

<?php
$result = fbsql_query ("SELECT * WHERE 1=1")
    or die ("Invalid query");
?>

The following query is semantically invalid if my_col is not a column in the table my_tbl, so fbsql_query() fails and returns FALSE:

例子 2. fbsql_query() example

<?php
$result = fbsql_query ("SELECT my_col FROM my_tbl")
    or die ("Invalid query");
?>

fbsql_query() will also fail and return FALSE if you don't have permission to access the table(s) referenced by the query.

Assuming the query succeeds, you can call fbsql_num_rows() to find out how many rows were returned for a SELECT statement or fbsql_affected_rows() to find out how many rows were affected by a DELETE, INSERT, REPLACE, or UPDATE statement.

For SELECT statements, fbsql_query() returns a new result identifier that you can pass to fbsql_result(). When you are done with the result set, you can free the resources associated with it by calling fbsql_free_result(). Although, the memory will automatically be freed at the end of the script's execution.

See also: fbsql_affected_rows(),
fbsql_db_query(),
fbsql_free_result(),
fbsql_result(),
fbsql_select_db(), and
fbsql_connect().

上一頁 | 首頁 | 下一頁
fbsql_pconnect | 上一層 | fbsql_read_blob


fbsql_read_blob

(PHP 4 >= 4.2.0)

fbsql_read_blob -- Read a BLOB from the database

Description

string fbsql_read_blob ( string blob_handle [, resource link_identifier])

Returns: A string containing the BLOB specified by blob_handle.

fbsql_read_blob() reads BLOB data from the database. If a select statement contains BLOB and/or BLOB columns FrontBase will return the data directly when data is fetched. This default behavior can be changed with fbsql_set_lob_mode() so the fetch functions will return handles to BLOB and CLOB data. If a handle is fetched a user must call fbsql_read_blob() to get the actual BLOB data from the database.

例子 1. fbsql_read_blob() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    $sql = "SELECT BLOB_COLUMN FROM BLOB_TABLE;";
    $rs = fbsql_query($sql, $link);
    $row_data = fbsql_fetch_row($rs);
    // $row_data[0] will now contain the blob data for teh first row
    fbsql_free_result($rs);

    $rs = fbsql_query($sql, $link);
    fbsql_set_lob_mode($rs, FBSQL_LOB_HANDLE);
    $row_data = fbsql_fetch_row($rs);
    // $row_data[0] will now contain a handle to the BLOB data in the first row
    $blob_data = fbsql_read_blob($row_data[0]);
    fbsql_free_result($rs);

?>

See also: fbsql_create_blob(),
fbsql_read_blob(),
fbsql_read_clob(), and
fbsql_set_lob_mode().

上一頁 | 首頁 | 下一頁
fbsql_query | 上一層 | fbsql_read_clob


fbsql_read_clob

(PHP 4 >= 4.2.0)

fbsql_read_clob -- Read a CLOB from the database

Description

string fbsql_read_clob ( string clob_handle [, resource link_identifier])

Returns: A string containing the CLOB specified by clob_handle.

fbsql_read_clob() reads CLOB data from the database. If a select statement contains BLOB and/or CLOB columns FrontBase will return the data directly when data is fetched. This default behavior can be changed with fbsql_set_lob_mode() so the fetch functions will return handles to BLOB and CLOB data. If a handle is fetched a user must call fbsql_read_clob() to get the actual CLOB data from the database.

例子 1. fbsql_read_clob() example

<?php
    $link = fbsql_pconnect ("localhost", "_SYSTEM", "secret")
        or die ("Could not connect");
    $sql = "SELECT CLOB_COLUMN FROM CLOB_TABLE;";
    $rs = fbsql_query($sql, $link);
    $row_data = fbsql_fetch_row($rs);
    // $row_data[0] will now contain the clob data for teh first row
    fbsql_free_result($rs);

    $rs = fbsql_query($sql, $link);
    fbsql_set_lob_mode($rs, FBSQL_LOB_HANDLE);
    $row_data = fbsql_fetch_row($rs);
    // $row_data[0] will now contain a handle to the CLOB data in the first row
    $clob_data = fbsql_read_clob($row_data[0]);
    fbsql_free_result($rs);

?>

See also: fbsql_create_blob(),
fbsql_read_blob(),
fbsql_read_clob(), and
fbsql_set_lob_mode().

上一頁 | 首頁 | 下一頁
fbsql_read_blob | 上一層 | fbsql_result


fbsql_result

(PHP 4 >= 4.0.6)

fbsql_result -- Get result data

Description

mixed fbsql_result ( resource result, int row [, mixed field])

fbsql_result() returns the contents of one cell from a FrontBase result set. The field argument can be the field's offset, or the field's name, or the field's table dot field's name (tabledname.fieldname). If the column name has been aliased ('select foo as bar from...'), use the alias instead of the column name.

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than fbsql_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.

Calls to fbsql_result() should not be mixed with calls to other functions that deal with the result set.

Recommended high-performance alternatives:
fbsql_fetch_row(),
fbsql_fetch_array(), and
fbsql_fetch_object().

上一頁 | 首頁 | 下一頁
fbsql_read_clob | 上一層 | fbsql_rollback


fbsql_rollback

(PHP 4 >= 4.0.6)

fbsql_rollback -- Rollback a transaction to the database

Description

bool fbsql_rollback ( [resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_rollback() ends the current transaction by rolling back all statements issued since last commit. This command is only needed if autocommit is set to false.

See also: fbsql_autocommit() and fbsql_commit()

上一頁 | 首頁 | 下一頁
fbsql_result | 上一層 | fbsql_select_db


fbsql_select_db

(PHP 4 >= 4.0.6)

fbsql_select_db -- Select a FrontBase database

Description

bool fbsql_select_db ( string database_name [, resource link_identifier])

Returns: TRUE on success, FALSE on error.

fbsql_select_db() sets the current active database on the server that's associated with the specified link identifier. If no link identifier is specified, the last opened link is assumed. If no link is open, the function will try to establish a link as if fbsql_connect() was called, and use it.

The client contacts FBExec to obtain the port number to use for the connection to the database. If the database name is a number the system will use that as a port number and it will not ask FBExec for the port number. The FrontBase server can be stared as FRontBase -FBExec=No -port=<port number> <database name>.

Every subsequent call to fbsql_query() will be made on the active database.

if the database is protected with a database password, the user must call fbsql_database_password() before selecting the database.

See also:
    fbsql_connect(),
    fbsql_pconnect(),
    fbsql_database_password() and
    fbsql_query().

上一頁 | 首頁 | 下一頁
fbsql_rollback | 上一層 | fbsql_set_lob_mode


fbsql_set_lob_mode

(PHP 4 >= 4.2.0)

fbsql_set_lob_mode -- Set the LOB retrieve mode for a FrontBase result set

Description

bool fbsql_set_lob_mode ( resource result, string database_name)

Returns: TRUE on success, FALSE on error.

fbsql_set_lob_mode() sets the mode for retrieving LOB data from the database. When BLOB and CLOB data is stored in FrontBase it can be stored direct or indirect. Direct stored LOB data will always be fetched no matter the setting of the lob mode. If the LOB data is less than 512 bytes it will always be stored directly.

  • FBSQL_LOB_DIRECT - LOB data is retrieved directly. When data is fetched from the database with fbsql_fetch_row(), and other fetch functions, all CLOB and BLOB columns will be returned as ordinary columns. This is the default value on a new FrontBase result.

  • FBSQL_LOB_HANDLE - LOB data is retrieved as handles to the data. When data is fetched from the database with fbsql_fetch_row (), and other fetch functions, LOB data will be returned as a handle to the data if the data is stored indirect or the data if it is stored direct. If a handle is returned it will be a 27 byte string formatted as "@'000000000000000000000000'".

See also:
    fbsql_create_blob(),
    fbsql_create_clob(),
    fbsql_read_blob(), and
    fbsql_read_clob().

上一頁 | 首頁 | 下一頁
fbsql_select_db | 上一層 | fbsql_set_transaction


fbsql_set_transaction

(PHP 4 >= 4.2.0)

fbsql_set_transaction -- Set the transaction locking and isolation

Description

void fbsql_set_transaction ( resource link_identifier, int Locking, int Isolation)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_set_lob_mode | 上一層 | fbsql_start_db


fbsql_start_db

(PHP 4 >= 4.0.6)

fbsql_start_db -- Start a database on local or remote server

Description

bool fbsql_start_db ( string database_name [, resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_start_db()

See also: fbsql_db_status() and fbsql_stop_db().

上一頁 | 首頁 | 下一頁
fbsql_set_transaction | 上一層 | fbsql_stop_db


fbsql_stop_db

(PHP 4 >= 4.0.6)

fbsql_stop_db -- Stop a database on local or remote server

Description

bool fbsql_stop_db ( string database_name [, resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

fbsql_stop_db()

See also: fbsql_db_status() and fbsql_start_db().

上一頁 | 首頁 | 下一頁
fbsql_start_db | 上一層 | fbsql_tablename


fbsql_tablename

(PHP 4 >= 4.2.0)

fbsql_tablename -- Get table name of field

Description

string fbsql_tablename ( resource result, int i)

fbsql_tablename() takes a result pointer returned by the fbsql_list_tables() function as well as an integer index and returns the name of a table. The fbsql_num_rows() function may be used to determine the number of tables in the result pointer.

例子 1. fbsql_tablename() example

<?php
fbsql_connect ("localhost", "_SYSTEM", "");
$result = fbsql_list_tables ("wisconsin");
$i = 0;
while ($i < fbsql_num_rows ($result)) {
    $tb_names[$i] = fbsql_tablename ($result, $i);
    echo $tb_names[$i] . "<BR>";
    $i++;
}
?>

上一頁 | 首頁 | 下一頁
fbsql_stop_db | 上一層 | fbsql_username


fbsql_username

(PHP 4 >= 4.0.6)

fbsql_username -- Get or set the host user used with a connection

Description

string fbsql_username ( resource link_identifier [, string username])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fbsql_tablename | 上一層 | fbsql_warnings


fbsql_warnings

(PHP 4 >= 4.0.6)

fbsql_warnings -- Enable or disable FrontBase warnings

Description

bool fbsql_warnings ( [bool OnOff])

Returns TRUE if warnings is turned on otherwise FALSE.

fbsql_warnings() enables or disables FrontBase warnings.

上一頁 | 首頁 | 下一頁
fbsql_username | 上一層 | filePro functions


fclose

(PHP 3, PHP 4 )

fclose -- 關閉一個已打開的文件指針

說明

bool fclose ( int fp)

將 fp 指向的文件關閉。

如果成功則傳回 TRUE，失敗則傳回 FALSE。

文件指針必須有效，並且是通過 fopen() 或 fsockopen() 成功打開的。

例子 1. 一個簡單 fclose() 例子

<?php

  $fp = fopen('somefile.txt', 'r');

  fclose($fp);

?>

上一頁 | 首頁 | 下一頁
diskfreespace | 上一層 | feof


fdf_add_doc_javascript

(no version information, might be only in CVS)

fdf_add_doc_javascript -- Adds javascript code to the FDF document

Description

bool fdf_add_doc_javascript ( resource fdfdoc, string script_name, string script_code)

Adds a script to the FDF, which Acrobat then adds to the doc-level scripts of a document, once the FDF is imported into it. It is strongly suggested to use '\r' for linebreaks within script_code.

例子 1. Adding JavaScript code to a FDF

<?php
$fdf = fdf_create();
fdf_add_doc_javascript($fdf, "PlusOne", "function PlusOne(x)\r{\r  return x+1;\r}\r");
fdf_save($fdf);
?>

will create a FDF like this:

%FDF-1.2
%懺嫌
1 0 obj
<<
/FDF << /JavaScript << /Doc [ (PlusOne)(function PlusOne\(x\)\r{\r  return x+1;\r}\r)] >> >>
>>
endobj
trailer
<<
/Root 1 0 R

>>
%%EOF

上一頁 | 首頁 | 下一頁
Forms Data Format functions | 上一層 | fdf_add_template


fdf_add_template

(PHP 3>= 3.0.13, PHP 4 )

fdf_add_template -- Adds a template into the FDF document

Description

bool fdf_add_template ( int fdfdoc, int newpage, string filename, string template, int rename)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
fdf_add_doc_javascript | 上一層 | fdf_close


fdf_close

(PHP 3>= 3.0.6, PHP 4 )

fdf_close -- Close an FDF document

Description

bool fdf_close ( resource fdf_document)

The fdf_close() function closes the FDF document.

See also fdf_open().

上一頁 | 首頁 | 下一頁
fdf_add_template | 上一層 | fdf_create


fdf_create

(PHP 3>= 3.0.6, PHP 4 )

fdf_create -- Create a new FDF document

Description

resource fdf_create ( void)

The fdf_create() creates a new FDF document. This function is needed if one would like to populate input fields in a PDF document with data.

例子 1. Populating a PDF document

<?php
$outfdf = fdf_create();
fdf_set_value($outfdf, "volume", $volume, 0);

fdf_set_file($outfdf, "http:/testfdf/resultlabel.pdf");
fdf_save($outfdf, "outtest.fdf");
fdf_close($outfdf);
Header("Content-type: application/vnd.fdf");
$fp = fopen("outtest.fdf", "r");
fpassthru($fp);
unlink("outtest.fdf");
?>

See also fdf_close(),
         fdf_save(),
         fdf_open().

上一頁 | 首頁 | 下一頁
fdf_close | 上一層 | fdf_errno


fdf_errno

(no version information, might be only in CVS)

fdf_errno -- Return error code for last fdf operation

Description

int fdf_errno ( void)

fdf_errno() returns the error code set by the last fdf_...() function call. This is zero for a successfull operation or a non-zero error code on failure. A textual description may be obtained using the fdf_error() function.

See also fdf_error().

上一頁 | 首頁 | 下一頁
fdf_create | 上一層 | fdf_error


fdf_error

(no version information, might be only in CVS)

fdf_error -- Return error description for fdf error code

Description

string fdf_error ( [int error_code])

fdf_error() returns a textual description for the fdf error code given in error_code. The function uses the internal error code set by the last operation if no error_code is given, so fdf_error() is a convenient shortcut for fdf_error(fdf_errno()).

See also fdf_errno().

上一頁 | 首頁 | 下一頁
fdf_errno | 上一層 | fdf_get_ap


fdf_get_ap

(no version information, might be only in CVS)

fdf_get_ap -- Get the appearance of a field

Description

bool fdf_get_ap ( resource fdf_document, string field, int face, string filename)

The fdf_get_ap() function gets the appearance of a field (i.e. the value of the /AP key) and stores it in a file. The possible values of face are FDFNormalAP, FDFRolloverAP and FDFDownAP. The appearance is stored in filename.

上一頁 | 首頁 | 下一頁
fdf_error | 上一層 | fdf_get_attachment


fdf_get_attachment

(no version information, might be only in CVS)

fdf_get_attachment -- Extracts uploaded file embedded in the FDF

Description

array fdf_get_attachment ( resource fdf_document, string fieldname, string savepath)

Extracts a file uploaded by means of the "file selection" field fieldname and stores it under savepath. savepath may be the name of a plain file or an existing directory in which the file is to be created under its original name. Any existing file under the same name will be overwritten.

註: There seems to be no other way to find out the original filename but to store the file using a directory as savepath and check for the basename it was stored under.

The returned array contains the following fields:

  • path - path were the file got stored

    size - size of the stored file in bytes

    type - mimetype if given in the FDF

例子 1. Storing an uploaded file

<?php
  $fdf = fdf_open_string($HTTP_FDF_DATA);
  $data = fdf_get_attachment($fdf, "filename", "/tmpdir");
  echo "The uploaded file is stored in $data[path]";
?>

上一頁 | 首頁 | 下一頁
fdf_get_ap | 上一層 | fdf_get_encoding


fdf_get_encoding

(no version information, might be only in CVS)

fdf_get_encoding -- Get the value of the /Encoding key

Description

string fdf_get_encoding ( resource fdf_document)

The fdf_get_encoding() returns the value of the /Encoding key. An empty string is returned if the default PDFDocEncoding/Unicode scheme is used.

See also fdf_set_encoding().

上一頁 | 首頁 | 下一頁
fdf_get_attachment | 上一層 | fdf_get_file


fdf_get_file

(PHP 3>= 3.0.6, PHP 4 )

fdf_get_file -- Get the value of the /F key

Description

string fdf_get_file ( resource fdf_document)

The fdf_set_file() returns the value of the /F key.

See also fdf_set_file().

上一頁 | 首頁 | 下一頁
fdf_get_encoding | 上一層 | fdf_get_status


fdf_get_status

(PHP 3>= 3.0.6, PHP 4 )

fdf_get_status -- Get the value of the /STATUS key

Description

string fdf_get_status ( resource fdf_document)

The fdf_get_status() returns the value of the /STATUS key.

See also fdf_set_status().

上一頁 | 首頁 | 下一頁
fdf_get_file | 上一層 | fdf_get_value


fdf_get_value

(PHP 3>= 3.0.6, PHP 4 )

fdf_get_value -- Get the value of a field

Description

string fdf_get_value ( resource fdf_document, string fieldname [, int which])

The fdf_get_value() function returns the value for the requested fieldname.

Elements of an array field can be retrieved by passing the optional which, starting at zero. For non-array fields the optional parameter which will be ignored.

註: Array support and optional which parameter were added in PHP 4.3.

See also fdf_set_value().

上一頁 | 首頁 | 下一頁
fdf_get_status | 上一層 | fdf_get_version


fdf_get_version

(no version information, might be only in CVS)

fdf_get_version -- Gets version number for FDF api or file

Description

string fdf_get_version ( [resource fdf_document])

This function will return the fdf version for the given fdf_document, or the toolkit api version number if no parameter is given.

For the current FDF toolkit 5.0 the api version number is '5.0' and the document version number is either '1.2', '1.3' or '1.4'.

See also fdf_set_version().

上一頁 | 首頁 | 下一頁
fdf_get_value | 上一層 | fdf_header


fdf_header

(no version information, might be only in CVS)

fdf_header -- Sets FDF-specific output headers

Description

bool fdf_header ( void)

This is a convenience function to set appropriate HTTP headers for FDF output. It sets the Content-type: to application/vnd.fdf.

上一頁 | 首頁 | 下一頁
fdf_get_version | 上一層 | fdf_next_field_name


fdf_next_field_name

(PHP 3>= 3.0.6, PHP 4 )

fdf_next_field_name -- Get the next field name

Description

string fdf_next_field_name ( resource fdf_document [, string fieldname])

The fdf_next_field_name() function returns the name of the field after the field in fieldname or the field name of the first field if the second parameter is NULL.

例子 1. Detecting all fieldnames in a FDF

<?php
  $fdf = fdf_open($HTTP_FDF_DATA);
  for($field = fdf_next_field_name($fdf);
     $field != "";
     $field = fdf_next_field_name($fdf, $field)) {
    echo "field: $field\n";
  }
?>

See also fdf_enum_fields() and fdf_get_value().

上一頁 | 首頁 | 下一頁
fdf_header | 上一層 | fdf_open_string


fdf_open

(PHP 3>= 3.0.6, PHP 4 )

fdf_open -- Open a FDF document

Description

resource fdf_open ( string filename)

The fdf_open() function opens a file with form data. This file must contain the data as returned from a PDF form or created using fdf_create() and fdf_save().

You can process the results of a PDF form POST request by writing the data recieved in $HTTP_FDF_DATA to a file and open it using fdf_open(). Starting with PHP 4.3 you can also use fdf_open_string() which handles temporary file creation and cleanup for you.

例子 1. Accessing the form data

<?php
// Save the FDF data into a temp file
$fdffp = fopen("test.fdf", "w");
fwrite($fdffp, $HTTP_FDF_DATA, strlen($HTTP_FDF_DATA));
fclose($fdffp);

// Open temp file and evaluate data
$fdf = fdf_open("test.fdf");
...
fdf_close($fdf);
?>

See also
fdf_open_string(),
fdf_close(),
fdf_create() and
fdf_save().

上一頁 | 首頁 | 下一頁
fdf_open_string | 上一層 | fdf_save_string


fdf_open_string

(no version information, might be only in CVS)

fdf_open_string -- Read a FDF document from a string

Description

resource fdf_open ( string fdf_data)

The fdf_open_string() function reads form data from a string. fdf_data must contain the data as returned from a PDF form or created using fdf_create() and fdf_save_string().

You can fdf_open_string() together with $HTTP_FDF_DATA to process fdf form input from a remote client.

例子 1. Accessing the form data

<?php
$fdf = fdf_open_string($HTTP_FDF_DATA);
...
fdf_close($fdf);
?>

See also
fdf_open(),
fdf_close(),
fdf_create() and
fdf_save_string().

上一頁 | 首頁 | 下一頁
fdf_next_field_name | 上一層 | fdf_open


fdf_save

(PHP 3>= 3.0.6, PHP 4 )

fdf_save -- Save a FDF document

Description

bool fdf_save ( resource fdf_document [, string filename])

The fdf_save() function saves a FDF document. The resulting FDF will be written to filename. Without a filename fdf_save() will write the FDF to the default PHP output stream.

See also fdf_save_string(),
fdf_create() and
fdf_close().

上一頁 | 首頁 | 下一頁
fdf_save_string | 上一層 | fdf_set_ap


fdf_save_string

(no version information, might be only in CVS)

fdf_save_string -- Returns the FDF document as a string

Description

string fdf_save_string ( resource fdf_document)

The fdf_save_string() function returns the FDF document as a string.

例子 1. Retrieving FDF as a string

<?php
$fdf = fdf_create();
fdf_set_value($fdf, "foo", "bar");
$str = fdf_save_string($fdf);
fdf_close($fdf);
echo $str;
?>

will output something like

%FDF-1.2
%懺嫌
1 0 obj
<<
/FDF << /Fields 2 0 R >>
>>
endobj
2 0 obj
[
<< /T (foo)/V (bar)>>
]
endobj
trailer
<<
/Root 1 0 R

>>
%%EOF

See also fdf_save(),
fdf_open_string(),
fdf_create() and
fdf_close().

上一頁 | 首頁 | 下一頁
fdf_open | 上一層 | fdf_save


fdf_set_ap

(PHP 3>= 3.0.6, PHP 4 )

fdf_set_ap -- Set the appearance of a field

Description

bool fdf_set_ap ( resource fdf_document, string field_name, int face, string filename, int page_number)

The fdf_set_ap() function sets the appearance of a field (i.e. the value of the /AP key). The possible values of face are FDFNormalAP, FDFRolloverAP and FDFDownAP.

上一頁 | 首頁 | 下一頁
fdf_save | 上一層 | fdf_set_encoding


fdf_set_encoding

(PHP 4 >= 4.1.0)

fdf_set_encoding -- Sets FDF character encoding

Description

bool fdf_set_encoding ( resource fdf_document, string encoding)

fdf_set_encoding() sets the character encoding in FDF document fdf_document. encoding should be the valid encoding name. Currently the following values are supported: "Shift-JIS", "UHC", "GBK","BigFive". An empty string resets the encoding to the default PDFDocEncoding/Unicode scheme.

上一頁 | 首頁 | 下一頁
fdf_set_ap | 上一層 | fdf_set_file


fdf_set_file

(PHP 3>= 3.0.6, PHP 4 )

fdf_set_file -- Set PDF document to display FDF data in

Description

bool fdf_set_file ( resource fdf_document, string url [, string target_frame])

The fdf_set_file() selects a different PDF document to display the form results in then the form it originated from. The url needs to be given as an absolute URL.

The frame to display the document in may be selected using the optional parameter target_frame or the function fdf_set_target_frame().

例子 1. Passing FDF data to a second form

<?php
  /* set content type for Adobe FDF */
  fdf_header();

  /* start new fdf */
  $fdf = fdf_create();

  /* set field "foo" to value "bar" */
  $fdf_set_value($fdf, "foo", "bar");

  /* tell client to display FDF data using "fdf_form.pdf" */
  fdf_set_file($fdf, "http://www.example.com/fdf_form.pdf");

  /* output fdf */
  fdf_save();

  /* clean up */
  fdf_close();
?>

See also fdf_get_file() and fdf_set_target_frame().

上一頁 | 首頁 | 下一頁
fdf_set_encoding | 上一層 | fdf_set_flags


fdf_set_flags

(PHP 4 >= 4.0.2)

fdf_set_flags -- Sets a flag of a field

Description

bool fdf_set_flags ( resource fdf_document, string fieldname, int whichFlags, int newFlags)

The fdf_set_flags() sets certain flags of the given field fieldname.

See also fdf_set_opt().

上一頁 | 首頁 | 下一頁
fdf_set_file | 上一層 | fdf_set_javascript_action


fdf_set_javascript_action

(PHP 4 >= 4.0.2)

fdf_set_javascript_action -- Sets an javascript action of a field

Description

bool fdf_set_javascript_action ( resource fdf_document, string fieldname, int trigger, string script)

fdf_set_javascript_action() sets a javascript action for the given field fieldname.

See also fdf_set_submit_form_action().

上一頁 | 首頁 | 下一頁
fdf_set_flags | 上一層 | fdf_set_opt


fdf_set_opt

(PHP 4 >= 4.0.2)

fdf_set_opt -- Sets an option of a field

Description

bool fdf_set_opt ( resource fdf_document, string fieldname, int element, string str1, string str2)

The fdf_set_opt() sets options of the given field fieldname.

See also fdf_set_flags().

上一頁 | 首頁 | 下一頁
fdf_set_javascript_action | 上一層 | fdf_set_status


fdf_set_status

(PHP 3>= 3.0.6, PHP 4 )

fdf_set_status -- Set the value of the /STATUS key

Description

bool fdf_set_status ( resource fdf_document, string status)

The fdf_set_status() sets the value of the /STATUS key. When a client recieves a FDF with a status set it will present the value in an alert box.

See also fdf_get_status().

上一頁 | 首頁 | 下一頁
fdf_set_opt | 上一層 | fdf_set_submit_form_action


fdf_set_submit_form_action

(PHP 4 >= 4.0.2)

fdf_set_submit_form_action -- Sets a submit form action of a field

Description

bool fdf_set_submit_form_action ( resource fdf_document, string fieldname, int trigger, string script, int flags)

The fdf_set_submit_form_action() sets a submit form action for the given field fieldname.

See also fdf_set_javascript_action().

上一頁 | 首頁 | 下一頁
fdf_set_status | 上一層 | fdf_set_target_frame


fdf_set_target_frame

(no version information, might be only in CVS)

fdf_set_target_frame -- Set target frame for form display

Description

bool fdf_target_frame ( resource fdf_document, string frame_name)

Sets the target frame to display a result PDF defined with fdf_save_file() in.

See also fdf_save_file().

上一頁 | 首頁 | 下一頁
fdf_set_submit_form_action | 上一層 | fdf_set_value


fdf_set_value

(PHP 3>= 3.0.6, PHP 4 )

fdf_set_value -- Set the value of a field

Description

bool fdf_set_value ( resource fdf_document, string fieldname, mixed value [, int isName])

The fdf_set_value() function sets the value for a field named fieldname. The value will be stored as a string unless it is an array. In this case all array elements will be stored as a value array.

註: In older versions of the fdf toolkit last parameter determined if the field value was to be converted to a PDF Name (isName = 1) or set to a PDF String (isName = 0). The value is no longer used in the current toolkit version 5.0. For compatibility reasons it is still supported as an optional parameter beginning with PHP 4.3, but ignored internaly.

Support for value arrays was added in PHP 4.3.

See also fdf_get_value() and fdf_remove_item().

上一頁 | 首頁 | 下一頁
fdf_set_target_frame | 上一層 | fdf_set_version


fdf_set_version

(no version information, might be only in CVS)

fdf_set_version -- Sets version number for a FDF file

Description

string fdf_set_version ( resource fdf_document, string version)

This function will set the fdf version for the given fdf_document. Some features supported by this extension are only available in newer fdf versions. For the current FDF toolkit 5.0 version may be either '1.2', '1.3' or '1.4'.

See also fdf_get_version().

上一頁 | 首頁 | 下一頁
fdf_set_value | 上一層 | FriBiDi functions


feof

(PHP 3, PHP 4 )

feof -- 測試文件指針是否到了文件結束的位置

說明

int feof ( int fp)

如果文件指針到了 EOF 或者出錯時則傳回 TRUE，否則傳回 FALSE。

文件指針必須有效，並且是通過 fopen()，popen() 或 fsockopen() 成功打開的。

上一頁 | 首頁 | 下一頁
fclose | 上一層 | fflush


fflush

(PHP 4 >= 4.0.1)

fflush -- 將緩衝內容輸出到文件

說明

int fflush ( int fp)

本函式強制將所有緩衝的輸出寫入 fp 文件句柄所指向的資源。成功傳回 TRUE，否則傳回 FALSE。

文件指針必須有效，並且是通過 fopen()，popen() 或 fsockopen() 成功打開的。

上一頁 | 首頁 | 下一頁
feof | 上一層 | fgetc


fgetc

(PHP 3, PHP 4 )

fgetc -- 從文件指針中讀取字元

說明

string fgetc ( int fp)

傳回一個包含有一個字元的字串，該字元從 fp 指向的文件中得到。碰到 EOF 則傳回 FALSE。

文件指針必須有效，並且是通過 fopen()，popen() 或 fsockopen() 成功打開的。

參見 fread()，fopen()，popen()，fsockopen() 和 fgets()。

上一頁 | 首頁 | 下一頁
fflush | 上一層 | fgetcsv


fgetcsv

(PHP 3>= 3.0.8, PHP 4 )

fgetcsv -- 從文件指針中讀入一行並解析 CSV 字段

說明

array fgetcsv ( int fp, int length [, string delimiter [, string enclosure]])

和 fgets() 類似，只除了 fgetcsv() 解析讀入的行並找出 CSV 格式的字段然後傳回一個包含這些字段的陣列。字段分隔符是逗號，或者用可選的第三個參數另外指定。字段用雙引號包圍，或者用可選的第四個參數另外指定。Delimiter 和 enclosure 不能是 null 並且只有第一個字元有效。

fp 必須是通過 fopen()，popen() 或者 fsockopen() 成功打開的有效文件指針。

length 必須大於 CVS 文件中長度最大的行（以便於處理行結束字元）。

fgetcsv() 出錯時傳回 FALSE，包括碰到文件結束時。

註: CSV 文件中的空行將被傳回為一個包含有單個 NULL 字段的陣列，不會被當成錯誤。

enclosure 是 PHP 4.3.0 新加的。

例子 1. fgetcsv() 例子 - 讀取並顯示 CSV 文件的整個內容

$row = 1;
$fp = fopen ("test.csv","r");
while ($data = fgetcsv ($fp, 1000, ",")) {
    $num = count ($data);
    print "<p> $num fields in line $row: <br>";
    $row++;
    for ($c=0; $c < $num; $c++) {
        print $data[$c] . "<br>";
    }
}
fclose ($fp);
上一頁 | 首頁 | 下一頁
fgetc | 上一層 | fgets


fgets

(PHP 3, PHP 4 )

fgets -- 從文件指針中讀取一行

說明

string fgets ( int fp [, int length])

從 fp 指向的文件中讀取一行並傳回長度最多為 length - 1 字節的字串。碰到換行符（包括在傳回值中）、EOF 或者已經讀取了 length - 1 字節後停止（看先碰到那一種情況）。如果沒有指定 length，則預定為 1K，或者說 1024 字節。

出錯時傳回 FALSE。

通常的缺陷：

習慣了 C 語言中 fgets() 語法的人應該注意到 EOF 是怎樣被傳回的。

文件指針必須有效，並且是通過 fopen() 或 fsockopen() 成功打開的。

以下是一個簡單例子：

例子 1. 逐行讀取文件

$fd = fopen ("/tmp/inputfile.txt", "r");
while (!feof ($fd)) {
    $buffer = fgets($fd, 4096);
    echo $buffer;
}
fclose ($fd);

註: length 參數從 PHP 4.2.0 起成為可選項。

註: 如果碰到 PHP 在讀取文件時不能識別 Macintosh 文件格式，可以啟動 auto_detect_line_endings 的執行時配置選項。

參見 fread()，fopen()，popen()，fgetc()，fsockopen() 和 socket_set_timeout()。

上一頁 | 首頁 | 下一頁
fgetcsv | 上一層 | fgetss


fgetss

(PHP 3, PHP 4 )

fgetss -- 從文件指針中讀取一行並過濾掉 HTML 標記

說明

string fgetss ( int fp, int length [, string allowable_tags])

和 fgets() 相同，只除了 fgetss 嘗試從讀取的文本中去掉任何 HTML 和 PHP 標記。

可以用可選的第三個參數指定哪些標記不被去掉。

註: allowable_tags 是 PHP 3.0.13，PHP 4.0.0 新加的。

註: 如果碰到 PHP 在讀取文件時不能識別 Macintosh 文件格式，可以啟動 auto_detect_line_endings 的執行時配置選項。

參見 fgets()，fopen()，fsockopen()，popen() 和 strip_tags()。

上一頁 | 首頁 | 下一頁
fgets | 上一層 | file_exists


file

(PHP 3, PHP 4 )

file -- 把整個文件讀入一個陣列中

說明

array file ( string filename [, int use_include_path])

和 readfile() 一樣，只除了 file() 將文件作為一個陣列傳回。陣列中的每個單元都是文件中相應的一行，包括換行符在內。

註: 傳回的陣列中每一行都包括了行結束符，因此如果不需要行結束符時還需要使用 trim() 函式。

註: 如果碰到 PHP 在讀取文件時不能識別 Macintosh 文件格式，可以啟動 auto_detect_line_endings 的執行時配置選項。

可以將可選的第二個參數設為 "1"，如果也想在 include_path 中搜尋文件的話。

<?php
// 將一個 web 頁面讀入到一個陣列中並輸出
$fcontents = file ('http://www.example.com/');
while (list ($line_num, $line) = each ($fcontents)) {
    echo "<b>Line $line_num:</b>; ", htmlspecialchars ($line), "<br>\n";
}

// 將一個 web 頁面讀入到一個字串
$fcontents = implode ('', file ('http://www.example.com/'));
?>

註: 從 PHP 4.3.0 開始可以用 file_get_contents() 來將文件讀入到一個字串傳回，二進制文件也可以。

警告

該函式（到目前為止）不適用於二進制對象！

提示: 如果 "fopen wrappers" 已經被啟動，則您在使用該函式的時候，可以把 URL 作為文件名來使用。請參閱 fopen() 獲取怎樣指定文件名的詳細訊息以及支援的 URL 協議的列表 附錄 I。

參見 readfile()，fopen()，fsockopen() 和 popen()。

上一頁 | 首頁 | 下一頁
file_get_contents | 上一層 | fileatime


file_exists

(PHP 3, PHP 4 )

file_exists -- 檢查文件是否存在

說明

bool file_exists ( string filename)

如果由 filename 指定的文件存在則傳回 TRUE，否則傳回 FALSE。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

本函式的傳回結果會被緩存。更多詳細資料見 clearstatcache()。

使用 Windows 共享: 在 Windows 中要用 //computername/share/filename 或者 \\\\computername\share\filename 來檢查網路中的共享文件。

例子 1. 測試一個文件是否存在

<?php
$filename = '/path/to/foo.txt';

if (file_exists($filename)) {
    print "The file $filename exists";
} else {
    print "The file $filename does not exist";
}
?>

參見 is_readable()，is_writable()，is_file() 和 file()。

上一頁 | 首頁 | 下一頁
fgetss | 上一層 | file_get_contents


file_get_contents

(PHP 4 CVS only)

file_get_contents -- 將整個文件讀入一個字串

說明

string file_get_contents ( string filename [, int use_include_path])

和 readfile() 一樣，只除了 file_get_contents() 將文件傳回為一個字串。

註: 該函式適用於二進制對象！

提示: 如果 "fopen wrappers" 已經被啟動，則您在使用該函式的時候，可以把 URL 作為文件名來使用。請參閱 fopen() 獲取怎樣指定文件名的詳細訊息以及支援的 URL 協議的列表 附錄 I。

參見 fgets()，file()，fread()，include() 和 readfile()。

上一頁 | 首頁 | 下一頁
file_exists | 上一層 | file


fileatime

(PHP 3, PHP 4 )

fileatime -- 取得文件的上次連接時間

說明

int fileatime ( string filename)

傳回文件上次被連接的時間，如果出錯則傳回 FALSE。時間以 Unix 時間戳的方式傳回。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

注意：一個文件的 atime 應該在不論何時讀取了此文件中的資料塊時被更改。當一個應用程序定期連接大量文件或目錄時很影響性能。有些 Unix 文件系統可以在加載時關閉 atime 的更新以提高這類程序的性能。USENET 新聞組假脫機是一個常見的例子。在這種文件系統下本函式沒有用處。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
file | 上一層 | filectime


filectime

(PHP 3, PHP 4 )

filectime -- 取得文件的 inode 修改時間

說明

int filectime ( string filename)

傳回文件上次 inode 被修改的時間，如果出錯則傳回 FALSE。時間以 Unix 時間戳的方式傳回。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

注意：在大多數 Unix 文件系統中，當一個文件的 inode 資料被改變時則該文件被認為是修改了。也就是說，當文件的權限，所有者，所有組或其它 inode 中的元資料被更新時。參見 filemtime()（這才是你想用於在 web 頁面中建立“最後更新時間”腳注的函式）和 fileatime()。

注意某些 Unix 說明文本中把 ctime 說成是該文件建立的時間，這是錯的。在大多數 Unix 文件系統中沒有 Unix 文件的建立時間。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
fileatime | 上一層 | filegroup


filegroup

(PHP 3, PHP 4 )

filegroup -- 取得文件的組

說明

int filegroup ( string filename)

取得該文件所屬組的 ID。如果出錯則傳回 FALSE。組 ID 以數字格式傳回，用 posix_getgrgid() 來將其解析為組名。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

註: 本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
filectime | 上一層 | fileinode


fileinode

(PHP 3, PHP 4 )

fileinode -- 取得文件的 inode

說明

int fileinode ( string filename)

傳回文件的 inode 節點號，出錯時傳回 FALSE。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
filegroup | 上一層 | filemtime


filemtime

(PHP 3, PHP 4 )

filemtime -- 取得文件修改時間

說明

int filemtime ( string filename)

傳回文件上次被修改的時間，出錯時傳回 FALSE。時間以 Unix 時間戳的方式傳回。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

注意：本函式傳回文件中的資料塊上次被寫入的時間，也就是說，文件的內容上次被修改的時間。對本函式的結果使用 date() 函式來得到可讀的修改時間用於頁面的腳注。

參見 filectime() 和 touch()。

上一頁 | 首頁 | 下一頁
fileinode | 上一層 | fileowner


fileowner

(PHP 3, PHP 4 )

fileowner -- 取得文件的所有者

說明

int fileowner ( string filename)

傳回文件所有的用戶 ID，如果出錯則傳回 FALSE。用戶 ID 以數字格式傳回，用 posix_getpwuid() 來將其解析為用戶名。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
filemtime | 上一層 | fileperms


fileperms

(PHP 3, PHP 4 )

fileperms -- 取得文件的權限

說明

int fileperms ( string filename)

傳回文件的連接權限，如果出錯則傳回 FALSE。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
fileowner | 上一層 | filesize


filepro

(PHP 3, PHP 4 )

filepro -- Read and verify the map file

Description

bool filepro ( string directory)

This reads and verifies the map file, storing the field count and info.

No locking is done, so you should avoid modifying your filePro database while it may be opened in PHP.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

上一頁 | 首頁 | 下一頁
filepro_rowcount | 上一層 | 文件系統函式庫


filepro_fieldcount

(PHP 3, PHP 4 )

filepro_fieldcount -- Find out how many fields are in a filePro database

Description

int filepro_fieldcount ( void)

Returns the number of fields (columns) in the opened filePro database.

See also filepro().

上一頁 | 首頁 | 下一頁
filePro functions | 上一層 | filepro_fieldname


filepro_fieldname

(PHP 3, PHP 4 )

filepro_fieldname -- Gets the name of a field

Description

string filepro_fieldname ( int field_number)

Returns the name of the field corresponding to field_number.

上一頁 | 首頁 | 下一頁
filepro_fieldcount | 上一層 | filepro_fieldtype


filepro_fieldtype

(PHP 3, PHP 4 )

filepro_fieldtype -- Gets the type of a field

Description

string filepro_fieldtype ( int field_number)

Returns the edit type of the field corresponding to field_number.

上一頁 | 首頁 | 下一頁
filepro_fieldname | 上一層 | filepro_fieldwidth


filepro_fieldwidth

(PHP 3, PHP 4 )

filepro_fieldwidth -- Gets the width of a field

Description

int filepro_fieldwidth ( int field_number)

Returns the width of the field corresponding to field_number.

上一頁 | 首頁 | 下一頁
filepro_fieldtype | 上一層 | filepro_retrieve


filepro_retrieve

(PHP 3, PHP 4 )

filepro_retrieve -- Retrieves data from a filePro database

Description

string filepro_retrieve ( int row_number, int field_number)

Returns the data from the specified location in the database.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

上一頁 | 首頁 | 下一頁
filepro_fieldwidth | 上一層 | filepro_rowcount


filepro_rowcount

(PHP 3, PHP 4 )

filepro_rowcount -- Find out how many rows are in a filePro database

Description

int filepro_rowcount ( void)

Returns the number of rows in the opened filePro database.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

See also filepro().

上一頁 | 首頁 | 下一頁
filepro_retrieve | 上一層 | filepro


filesize

(PHP 3, PHP 4 )

filesize -- 取得文件大小

說明

int filesize ( string filename)

傳回文件大小的字節數，如果出錯傳回 FALSE。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

上一頁 | 首頁 | 下一頁
fileperms | 上一層 | filetype


filetype

(PHP 3, PHP 4 )

filetype -- 取得文件型別

說明

string filetype ( string filename)

傳回文件的型別。可能的值有 fifo，char，dir，block，link，file 和 unknown。

如果出錯則傳回 FALSE。

本函式的結果會被緩存。詳細訊息見 clearstatcache()。

本函式不能用於遠程文件，被檢查的文件必須通過伺服器的文件系統來連接。

參見 is_dir()，is_file()，is_link()，file_exists() 和 stat()。

上一頁 | 首頁 | 下一頁
filesize | 上一層 | flock


floatval

(PHP 4 >= 4.2.0)

floatval -- Get float value of a variable

Description

float floatval ( mixed var)

Returns the float value of var.

Var may be any scalar type. You cannot use floatval() on arrays or objects.

$var = '122.34343The';
$float_value_of_var = floatval ($var);
print $float_value_of_var; // prints 122.34343

See also intval(), strval(), settype() and Type juggling.

上一頁 | 首頁 | 下一頁
empty | 上一層 | get_defined_vars


flock

(PHP 3>= 3.0.7, PHP 4 )

flock -- Portable advisory file locking

Description

bool flock ( int fp, int operation [, int &wouldblock])

PHP supports a portable way of locking complete files in an advisory way (which means all accessing programs have to use the same way of locking or it will not work).

flock() operates on fp which must be an open file pointer. operation is one of the following values:

  • To acquire a shared lock (reader), set operation to LOCK_SH (set to 1 prior to PHP 4.0.1).

  • To acquire an exclusive lock (writer), set operation to LOCK_EX (set to 2 prior to PHP 4.0.1).

  • To release a lock (shared or exclusive), set operation to LOCK_UN (set to 3 prior to PHP 4.0.1).

  • If you don't want flock() to block while locking, add LOCK_NB (4 prior to PHP 4.0.1) to operation.

flock() allows you to perform a simple reader/writer model which can be used on virtually every platform (including most Unix derivatives and even Windows). The optional third argument is set to TRUE if the lock would block (EWOULDBLOCK errno condition)

flock() returns TRUE on success and FALSE on error (e.g. when a lock could not be acquired).

註: Because flock() requires a file pointer, you may have to use a special lock file to protect access to a file that you intend to truncate by opening it in write mode (with a "w" or "w+" argument to fopen()).

警告

flock() will not work on NFS and many other networked file systems. Check your operating system documentation for more details.

On some operating systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you may not be able to rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!

flock() is not supported on antiquated filesystems like FAT and its derivates and will therefore always return FALSE under this environments (this is especially true for Windows 98 users).

上一頁 | 首頁 | 下一頁
filetype | 上一層 | fnmatch


fnmatch

(PHP 4 CVS only)

fnmatch -- Match filename against a pattern

Description

array fnmatch ( string pattern, string string [, int flags])

fnmatch() checks if the passed string would match the given shell wildcard pattern.

This is especialy usefull for filenames, but may also be used on regular strings. The average user may be used to shell patterns or at least in their simplest form to '?' and '*' wildcards so using fnmatch() instead of ereg() or preg_match() for frontend search expression input may be way more convenient for non-programming users.

例子 1. Checking a color name against a shell wildcard pattern.

if(fnmatch("*gr[ae]y", $color)) {
  echo "some form of gray ...";
}

See also glob(),
ereg(),
preg_match()
and the unix manpage on fnmatch(3) for flag names
(as long as they are not documented here ).

上一頁 | 首頁 | 下一頁
flock | 上一層 | fopen


fopen

(PHP 3, PHP 4 )

fopen -- Opens file or URL

Description

int fopen ( string filename, string mode [, int use_include_path [, resource zcontext]])

fopen() binds a named resource, specified by filename, to a stream. If filename is of the form "scheme://...", it is assumed to be a URL and PHP will search for a protocol handler (also known as a wrapper) for that scheme. If no wrappers for that protocol are registered, PHP will emit a notice to help you track potential problems in your script and then continue as though filename specifies a regular file.

If PHP has decided that filename specifies a local file, then it will try to open a stream on that file. The file must be accessible to PHP, so you need to ensure that the file access permissions allow this access. If you have enabled safe_mode, or open_basedir further restrictions may apply.

If PHP has decided that filename specifies a registered protocol, and that protocol is registered as a network URL, PHP will check to make sure that allow_url_fopen is enabled. If it is switched off, PHP will emit a warning and the fopen call will fail.

註: The list of supported protocols can be found in 附錄 I.

mode specifies the type of access you require to the stream. It may be any of the following:

  • 'r' - Open for reading only; place the file pointer at the beginning of the file.

  • 'r+' - Open for reading and writing; place the file pointer at the beginning of the file.

  • 'w' - Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.

  • 'w+' - Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.

  • 'a' - Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.

  • 'a+' - Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.

註: The mode may contain the letter 'b'. This is useful only on systems which differentiate between binary and text files (i.e. Windows. It's useless on Unix). If not needed, this will be ignored. You are encouraged to include the 'b' flag in order to make your scripts more portable.

The optional third use_include_path parameter can be set to '1' or TRUE if you want to search for the file in the include_path, too.

The optional fourth zcontext is used for specifying tuning parameters and callbacks.

If the open fails, the function returns FALSE.

例子 1. fopen() example

<?php
$fp = fopen ("/home/rasmus/file.txt", "r");
$fp = fopen ("/home/rasmus/file.gif", "wb");
$fp = fopen ("http://www.example.com/", "r");
$fp = fopen ("ftp://user:password@example.com/", "w");
?>

If you are experiencing problems with reading and writing to files and you're using the server module version of PHP, remember to make sure that the files and directories you're using are accessible to the server process.

On the Windows platform, be careful to escape any backslashes used in the path to the file, or use forward slashes.

<?php
$fp = fopen ("c:\\data\\info.txt", "r");
?>

See also 附錄 I,
fclose(),
fgets(),
fsockopen(),
file(),
file_exists(),
is_readable(),
socket_set_timeout(), and
popen().

上一頁 | 首頁 | 下一頁
fnmatch | 上一層 | fpassthru


fpassthru

(PHP 3, PHP 4 )

fpassthru -- Output all remaining data on a file pointer

Description

int fpassthru ( int fp)

Reads to EOF on the given file pointer from the current position and writes the results to the output buffer.

If an error occurs, fpassthru() returns FALSE.

The file pointer must be valid, and must point to a file successfully opened by fopen(), popen(), or fsockopen(). You may need to call rewind() to reset the file pointer to the beginning of the file if you have already written data to the file. The file is closed when fpassthru() is done reading it (leaving fp useless).

If you just want to dump the contents of a file to the output buffer, without first modifying it or seeking to a particular offset, you may want to use the readfile(), which saves you the fopen() call.

註: When using fpassthru() on a binary file on Windows systems, you should make sure to open the file in binary mode by appending a b to the mode used in the call to fopen().

You are encouraged to use the b flag when dealing with binary files, even if your system does not require it, so that your scripts will be more portable.

See also readfile(),
fopen(), popen(), and
fsockopen()

上一頁 | 首頁 | 下一頁
fopen | 上一層 | fputs


fputs

(PHP 3, PHP 4 )

fputs -- Writes to a file pointer

Description

int fputs ( int fp, string str [, int length])

fputs() is an alias to fwrite(), and is identical in every way. Note that the length parameter is optional and if not specified the entire string will be written.

上一頁 | 首頁 | 下一頁
fpassthru | 上一層 | fread


fread

(PHP 3, PHP 4 )

fread -- Binary-safe file read

Description

string fread ( int fp, int length)

fread() reads up to length bytes from the file pointer referenced by fp. Reading stops when length bytes have been read or EOF is reached, whichever comes first.

// get contents of a file into a string
$filename = "/usr/local/something.txt";
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);

註: On systems which differentiate between binary and text files (i.e. Windows) the file must be opened with 'b' included in fopen() mode parameter.

$filename = "c:\\files\\somepic.gif";
$fd = fopen ($filename, "rb");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);

See also fwrite(), fopen(),
fsockopen(), popen(),
fgets(), fgetss(),
fscanf(), file(), and
fpassthru().

上一頁 | 首頁 | 下一頁
fputs | 上一層 | fscanf


FrenchToJD

(PHP 3, PHP 4 )

FrenchToJD -- Converts a date from the French Republican Calendar to a Julian Day Count

Description

int frenchtojd ( int month, int day, int year)

Converts a date from the French Republican Calendar to a Julian Day Count.

These routines only convert dates in years 1 through 14 (Gregorian dates 22 September 1792 through 22 September 1806). This more than covers the period when the calendar was in use.

上一頁 | 首頁 | 下一頁
easter_days | 上一層 | GregorianToJD


fribidi_log2vis

(PHP 4 >= 4.0.4)

fribidi_log2vis -- Convert a logical string to a visual one

Description

string fribidi_log2vis ( string str, string direction, int charset)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
FriBiDi functions | 上一層 | FTP functions


fscanf

(PHP 4 >= 4.0.1)

fscanf -- Parses input from a file according to a format

Description

mixed fscanf ( int handle, string format [, string var1])

The function fscanf() is similar to sscanf(), but it takes its input from a file associated with handle and interprets the input according to the specified format. If only two parameters were passed to this function, the values parsed will be returned as an array. Otherwise, if optional parameters are passed, the function will return the number of assigned values. The optional parameters must be passed by reference.

Any whitespace in the format string matches any whitespace in the input stream. This means that even a tab \t in the format string can match a single space character in the input stream.

例子 1. fscanf() Example

$fp = fopen ("users.txt","r");
while ($userinfo = fscanf ($fp, "%s\t%s\t%s\n")) {
    list ($name, $profession, $countrycode) = $userinfo;
    //... do something with the values
}
fclose($fp);

例子 2. users.txt

javier  argonaut        pe
hiroshi sculptor        jp
robert  slacker us
luigi   florist it

See also fread(), fgets(),
fgetss(), sscanf(),
printf(), and sprintf().

上一頁 | 首頁 | 下一頁
fread | 上一層 | fseek


fseek

(PHP 3, PHP 4 )

fseek -- Seeks on a file pointer

Description

int fseek ( int fp, int offset [, int whence])

Sets the file position indicator for the file referenced by fp.The new position, measured in bytes from the beginning of the file, is obtained by adding offset to the position specified by whence, whose values are defined as follows:

SEEK_SET - Set position equal to offset bytes.
SEEK_CUR - Set position to current location plus offset.
SEEK_END - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)

If whence is not specified, it is assumed to be SEEK_SET.

Upon success, returns 0; otherwise, returns -1. Note that seeking past EOF is not considered an error.

May not be used on file pointers returned by fopen() if they use the "http://" or "ftp://" formats.

註: The whence argument was added after PHP 4.0.0.

See also ftell() and rewind().

上一頁 | 首頁 | 下一頁
fscanf | 上一層 | fstat


fstat

(PHP 4 )

fstat -- Gets information about a file using an open file pointer

Description

array fstat ( int fp)

Gathers the statistics of the file opened by the file pointer fp. This function is similar to the stat() function except that it operates on an open file pointer instead of a filename.

Returns an array with the statistics of the file with the following elements:

  1. device

  2. inode

  3. number of links

  4. user id of owner

  5. group id owner

  6. device type if inode device *

  7. size in bytes

  8. time of last access

  9. time of last modification

  10. time of last change

  11. blocksize for filesystem I/O *

  12. number of blocks allocated

* - only valid on systems supporting the st_blksize type--other systems (i.e. Windows) return -1

The results of this function are cached. See clearstatcache() for more details.

上一頁 | 首頁 | 下一頁
fseek | 上一層 | ftell


ftell

(PHP 3, PHP 4 )

ftell -- Tells file pointer read/write position

Description

int ftell ( int fp)

Returns the position of the file pointer referenced by fp; i.e., its offset into the file stream.

If an error occurs, returns FALSE.

The file pointer must be valid, and must point to a file successfully opened by fopen() or popen().

See also fopen(), popen(), fseek(), and rewind().

上一頁 | 首頁 | 下一頁
fstat | 上一層 | ftruncate


ftruncate

(PHP 4 )

ftruncate -- Truncates a file to a given length

Description

int ftruncate ( int fp, int size)

Takes the filepointer, fp, and truncates the file to length, size. This function returns TRUE on success and FALSE on failure.

上一頁 | 首頁 | 下一頁
ftell | 上一層 | fwrite


func_get_arg

(PHP 4 )

func_get_arg -- Return an item from the argument list

Description

mixed func_get_arg ( int arg_num)

Returns the argument which is at the arg_num'th offset into a user-defined function's argument list. Function arguments are counted starting from zero. func_get_arg() will generate a warning if called from outside of a function definition.

If arg_num is greater than the number of arguments actually passed, a warning will be generated and func_get_arg() will return FALSE.

<?php
function foo() {
     $numargs = func_num_args();
     echo "Number of arguments: $numargs<br>\n";
     if ($numargs >= 2) {
     echo "Second argument is: " . func_get_arg (1) . "<br>\n";
     }
}

foo (1, 2, 3);
?>

func_get_arg() may be used in conjunction with func_num_args() and func_get_args() to allow user-defined functions to accept variable-length argument lists.

註: This function was added in PHP 4.

上一頁 | 首頁 | 下一頁
create_function | 上一層 | func_get_args


func_get_args

(PHP 4 )

func_get_args -- Returns an array comprising a function's argument list

Description

array func_get_args ( void)

Returns an array in which each element is the corresponding member of the current user-defined function's argument list. func_get_args() will generate a warning if called from outside of a function definition.

<?php
function foo() {
    $numargs = func_num_args();
    echo "Number of arguments: $numargs<br>\n";
    if ($numargs >= 2) {
    echo "Second argument is: " . func_get_arg (1) . "<br>\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
    echo "Argument $i is: " . $arg_list[$i] . "<br>\n";
    }
}

foo (1, 2, 3);
?>

func_get_args() may be used in conjunction
with func_num_args() and
func_get_arg() to allow user-defined functions
to accept variable-length argument lists.

註: This function was added in PHP 4.

上一頁 | 首頁 | 下一頁
func_get_arg | 上一層 | func_num_args


func_num_args

(PHP 4 )

func_num_args -- Returns the number of arguments passed to the function

Description

int func_num_args ( void)

Returns the number of arguments passed into the current user-defined function. func_num_args() will generate a warning if called from outside of a user-defined function.

<?php
function foo() {
    $numargs = func_num_args();
    echo "Number of arguments: $numargs\n";
}

foo (1, 2, 3);    // Prints 'Number of arguments: 3'
?>

func_num_args() may be used in conjunction
with func_get_arg() and
func_get_args() to allow user-defined
functions to accept variable-length argument lists.

上一頁 | 首頁 | 下一頁
func_get_args | 上一層 | function_exists


fwrite

(PHP 3, PHP 4 )

fwrite -- Binary-safe file write

Description

int fwrite ( int fp, string string [, int length])

fwrite() writes the contents of string to the file stream pointed to by fp. If the length argument is given, writing will stop after length bytes have been written or the end of string is reached, whichever comes first.

fwrite() returns the number of bytes written, or -1 on error.

Note that if the length argument is given, then the magic_quotes_runtime configuration option will be ignored and no slashes will be stripped from string.

註: On systems which differentiate between binary and text files (i.e. Windows) the file must be opened with 'b' included in fopen() mode parameter.

See also fread(), fopen(),
fsockopen(), popen(), and
fputs().

上一頁 | 首頁 | 下一頁
ftruncate | 上一層 | glob


get_class

(PHP 4 )

get_class -- Returns the name of the class of an object

Description

string get_class ( object obj)

This function returns the name of the class of which the object obj is an instance. Returns FALSE if obj is not an object.

註: get_class() returns a user defined class name in lowercase. A class defined in a PHP extension is returned in its original notation.

See also get_parent_class(),
gettype(), and
is_subclass_of().

上一頁 | 首頁 | 下一頁
get_class_vars | 上一層 | get_declared_classes


get_class_methods

(PHP 4 )

get_class_methods -- Returns an array of class methods' names

Description

array get_class_methods ( mixed class_name)

This function returns an array of method names defined for the class specified by class_name.

註: As of PHP 4.0.6, you can specify the object itself instead of class_name. For example:

$class_methods = get_class_methods($my_class); // see below the full example

例子 1. get_class_methods() example

<?php

class myclass {
    // constructor
    function myclass() {
        return(TRUE);
    }

    // method 1
    function myfunc1() {
        return(TRUE);
    }

    // method 2
    function myfunc2() {
        return(TRUE);
    }
}

$my_object = new myclass();

$class_methods = get_class_methods(get_class($my_object));

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

?>

Will produce:

myclass
myfunc1
myfunc2

See also get_class_vars() and get_object_vars().

上一頁 | 首頁 | 下一頁
class_exists | 上一層 | get_class_vars


get_class_vars

(PHP 4 )

get_class_vars -- Returns an array of default properties of the class

Description

array get_class_vars ( string class_name)

This function will return an associative array of default properties of the class. The resulting array elements are in the form of varname => value.

註: Uninitialized class variables will not be reported by get_class_vars().

例子 1. get_class_vars() example

<?php

class myclass {

    var $var1; // this has no default value...
    var $var2 = "xyz";
    var $var3 = 100;

    // constructor
    function myclass() {
        return(TRUE);
    }

}

$my_class = new myclass();

$class_vars = get_class_vars(get_class($my_class));

foreach ($class_vars as $name => $value) {
    echo "$name : $value\n";
}

?>

Will produce:

var2 : xyz
var3 : 100

See also get_class_methods(), get_object_vars()

上一頁 | 首頁 | 下一頁
get_class_methods | 上一層 | get_class


get_declared_classes

(PHP 4 )

get_declared_classes -- Returns an array with the name of the defined classes

Description

array get_declared_classes ( void)

This function returns an array of the names of the declared classes in the current script.

註: In PHP 4.0.1pl2, three extra classes are returned at the beginning of the array: stdClass (defined in Zend/zend.c), OverloadedTestClass (defined in ext/standard/basic_functions.c) and Directory (defined in ext/standard/dir.c).

Also note that depending on what libraries you have compiled into PHP, additional classes could be present. This means that you will not be able to define your own classes using these names. There is a list of predefined classes in the Predefined Classes section of the appendices.

See also class_exists().

上一頁 | 首頁 | 下一頁
get_class | 上一層 | get_object_vars


get_defined_constants

(PHP 4 >= 4.1.0)

get_defined_constants -- Returns an associative array with the names of all the constants and their values

Description

array get_defined_constants ( void)

This function returns the names and values of all the constants currently defined. This includes those created by extensions as well as those created with the define() function.

For example the line below

print_r (get_defined_constants());

will print a list like:

Array
(
    [E_ERROR] => 1
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_ALL] => 2047
    [TRUE] => 1
)

See also get_loaded_extensions(),
get_defined_functions() and
get_defined_vars().

上一頁 | 首頁 | 下一頁
get_current_user | 上一層 | get_extension_funcs


get_object_vars

(PHP 4 )

get_object_vars -- Returns an associative array of object properties

Description

array get_object_vars ( object obj)

This function returns an associative array of defined object properties for the specified object obj. If variables declared in the class of which the obj is an instance, have not been assigned a value, those will not be returned in the array.

例子 1. Use of get_object_vars()

<?php
class Point2D {
    var $x, $y;
    var $label;

    function Point2D($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    function setLabel($label) {
        $this->label = $label;
    }

    function getPoint() {
        return array("x" => $this->x,
                     "y" => $this->y,
                     "label" => $this->label);
    }
}

// "$label" is declared but not defined
$p1 = new Point2D(1.233, 3.445);
print_r(get_object_vars($p1));

$p1->setLabel("point #1");
print_r(get_object_vars($p1));

?>
The printout of the above program will be:
Array
 (
     [x] => 1.233
     [y] => 3.445
 )

 Array
 (
     [x] => 1.233
     [y] => 3.445
     [label] => point #1
 )

See also get_class_methods() and get_class_vars()!

上一頁 | 首頁 | 下一頁
get_declared_classes | 上一層 | get_parent_class


get_parent_class

(PHP 4 )

get_parent_class -- Retrieves the parent class name for object or class

Description

string get_parent_class ( mixed obj)

If obj is an object, returns the name of the parent class of the class of which obj is an instance.

If obj is a string, returns the name of the parent class of the class with that name. This functionality was added in PHP 4.0.5.

See also get_class() and is_subclass_of()

上一頁 | 首頁 | 下一頁
get_object_vars | 上一層 | is_a


getallheaders

(PHP 3, PHP 4 )

getallheaders -- Fetch all HTTP request headers

Description

array getallheaders ( void)

getallheaders() is an alias for apache_request_headers(). It will return an associative array of all the HTTP headers in the current request. Please read the apache_request_headers() documentation for more information on how this function works.

註: In PHP 4.3.0, getallheaders() became an alias for apache_request_headers(). Essentially, it was renamed. This is because this function only works when PHP is compiled as an Apache Module.

See also apache_request_headers().

上一頁 | 首頁 | 下一頁
ebcdic2ascii | 上一層 | virtual


getcwd

(PHP 4 )

getcwd -- 取得當前工作目錄

說明

string getcwd ( void)

傳回當前工作目錄。

參見 chdir()。

上一頁 | 首頁 | 下一頁
closedir | 上一層 | opendir


getdate

(PHP 3, PHP 4 )

getdate -- 取得日期／時間訊息

說明

array getdate ( [int timestamp])

傳回一個根據 timestamp 得出的包含有日期訊息的結合陣列。如果沒有給出時間戳則認為是當前本地時間。陣列中的單元如下：

  • "seconds" - 秒數

  • "minutes" - 分鐘數

  • "hours" - 小時數

  • "mday" - 月份中的第幾日

  • "wday" - 星期中的第幾日，數字格式，從 0 表示星期天到 6 表示星期六

  • "mon" - 月份，數字

  • "year" - 年份，數字

  • "yday" - 年份中的第幾日，數字，例如 "299"

  • "weekday" - 星期中的第幾日，完整的文本格式，例如 "Friday"

  • "month" - 月份，完整的文本格式，例如 "January"

例子 1. getdate() 例子

$today = getdate();
$month = $today['month'];
$mday = $today['mday'];
$year = $today['year'];
echo "$month $mday, $year";

上一頁 | 首頁 | 下一頁
date | 上一層 | gettimeofday


gettext

(PHP 3>= 3.0.7, PHP 4 )

gettext -- Lookup a message in the current domain

Description

string gettext ( string message)

This function returns a translated string if one is found in the translation table, or the submitted message if not found. You may use the underscore character '_' as an alias to this function.

例子 1. gettext()-check

<?php
// Set language to German
setlocale(LC_ALL, 'de');

// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");

// Choose domain
textdomain("myPHPApp");

// Print a test message
print gettext("Welcome to My PHP Application");

// Or use the alias _() for gettext()
print _("Have a nice day");
?>
上一頁 | 首頁 | 下一頁
dngettext | 上一層 | ngettext


gettimeofday

(PHP 3>= 3.0.7, PHP 4 )

gettimeofday -- 取得當前時間

說明

array gettimeofday ( void)

本函式是 gettimeofday(2) 的接口。傳回一個結合陣列，包含有系統呼叫傳回的資料。

  • "sec" - 秒數

  • "usec" - 微秒數

  • "minuteswest" - 格林威治向西的分鐘數

  • "dsttime" - 夏令時修正的型別

上一頁 | 首頁 | 下一頁
getdate | 上一層 | gmdate


gettype

(PHP 3, PHP 4 )

gettype -- Get the type of a variable

Description

string gettype ( mixed var)

Returns the type of the PHP variable var.

警告

Never use gettype() to test for a certain type, since the returned string may be subject to change in a future version. In addition, it is slow too, as it involves string comparision .

Instead, use the is_* functions.

Possibles values for the returned string are:

  • "boolean" (since PHP 4)

  • "integer"

  • "double" (for historical reasons "double" is returned in case of a float, and not simply "float")

  • "string"

  • "array"

  • "object"

  • "resource" (since PHP 4)

  • "NULL" (since PHP 4)

  • "user function" (PHP 3 only, deprecated)

  • "unknown type"

For PHP 4, you should use function_exists() and method_exists() to replace the prior usage of gettype() on a function.

See also
settype(),
is_array(),
is_bool(),
is_float(),
is_integer(),
is_null(),
is_numeric(),
is_object(),
is_resource(),
is_scalar(), and
is_string().

上一頁 | 首頁 | 下一頁
get_resource_type | 上一層 | import_request_variables


glob

(PHP 4 CVS only)

glob -- Find pathnames matching a pattern

Description

array glob ( string pattern [, int flags])

The glob() function searches for all the pathnames matching pattern according to the rules used by the shell. No tilde expansion or parameter substitution is done.

Returns an array containing the matched files/directories or FALSE on error.

例子 1. Convenient way how glob() can replace opendir() and friends.

foreach (glob("*.txt") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

This could result in the following output:

funclist.txt size 44686
funcsummary.txt size 267625
quickref.txt size 137820

See also opendir(),
readdir() and
closedir(), fnmatch()
and the unix manpage on glob(3) for flag names
(as long as they are not documented here ).

上一頁 | 首頁 | 下一頁
fwrite | 上一層 | is_dir


gmdate

(PHP 3, PHP 4 )

gmdate -- 格式化一個 GMT/CUT 日期／時間

說明

string gmdate ( string format [, int timestamp])

同 date() 函式完全一樣，只除了傳回的時間是格林威治標準時（GMT）。例如當在中國（GMT +0800）執行以下程序時，第一行顯示“Jan 01 2000 00:00:00”而第二行顯示“Dec 31 1999 16:00:00”。

例子 1. gmdate() 例子

echo date ("M d Y H:i:s", mktime (0,0,0,1,1,2000));
echo gmdate ("M d Y H:i:s", mktime (0,0,0,1,1,2000));

參見 date()，mktime()，gmmktime() 和 strftime()。

上一頁 | 首頁 | 下一頁
gettimeofday | 上一層 | gmmktime


gmmktime

(PHP 3, PHP 4 )

gmmktime -- 取得 GMT 日期的 UNIX 時間戳

說明

int gmmktime ( int hour, int minute, int second, int month, int day, int year [, int is_dst])

和 mktime() 完全一樣，只除了傳回值是格林威治標準時的時間戳。

上一頁 | 首頁 | 下一頁
gmdate | 上一層 | gmstrftime


gmstrftime

(PHP 3>= 3.0.12, PHP 4 )

gmstrftime -- 根據區域設置格式化 GMT/CUT 時間／日期

說明

string gmstrftime ( string format [, int timestamp])

和 strftime() 的行為相同，只除了傳回時間是格林威治標準時（GMT）。例如，當在東部標準時（EST，GMT -500）執行時，下面第一行顯示“Dec 31 1998 20:00:00”，而第二行顯示“Jan 01 1999 01:00:00”。

例子 1. gmstrftime() 例子

setlocale (LC_TIME, 'en_US');
echo strftime ("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n";
echo gmstrftime ("%b %d %Y %H:%M:%S", mktime (20,0,0,12,31,98))."\n";

參見 strftime()。

上一頁 | 首頁 | 下一頁
gmmktime | 上一層 | localtime


GregorianToJD

(PHP 3, PHP 4 )

GregorianToJD -- Converts a Gregorian date to Julian Day Count

Description

int gregoriantojd ( int month, int day, int year)

Valid Range for Gregorian Calendar 4714 B.C. to 9999 A.D.

Although this function can handle dates all the way back to 4714 B.C., such use may not be meaningful. The Gregorian calendar was not instituted until October 15, 1582 (or October 5, 1582 in the Julian calendar). Some countries did not accept it until much later. For example, Britain converted in 1752, The USSR in 1918 and Greece in 1923. Most European countries used the Julian calendar prior to the Gregorian.

例子 1. Calendar functions

<?php
$jd = GregorianToJD (10,11,1970);
echo "$jd\n";
$gregorian = JDToGregorian ($jd);
echo "$gregorian\n";
?>

上一頁 | 首頁 | 下一頁
FrenchToJD | 上一層 | JDDayOfWeek


gzwrite

(PHP 3, PHP 4 )

gzwrite -- Binary-safe gz-file write

Description

int gzwrite ( resource zp, string string [, int length])

gzwrite() writes the contents of string to the gz-file stream pointed to by zp. If the length argument is given, writing will stop after length (uncompressed) bytes have been written or the end of string is reached, whichever comes first.

gzwrite() returns the number of (uncompressed) bytes written to the gz-file stream pointed to by zp.

Note that if the length argument is given, then the magic_quotes_runtime configuration option will be ignored and no slashes will be stripped from string.

See also gzread(), gzopen(), and gzputs().

上一頁 | 首頁 | 下一頁
gzuncompress | 上一層 | readgzfile


header

(PHP 3, PHP 4 )

header -- Send a raw HTTP header

Description

int header ( string string [, bool replace [, int http_reponse_code]])

header() is used to send raw HTTP headers. See the HTTP/1.1 specification for more information on HTTP headers.

The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace, but if you pass in FALSE as the second argument you can force multiple headers of the same type. For example:

<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', FALSE);
?>

The second optional http_response_code force the HTTP response code to the specified value. (This parameter is available in PHP 4.3.0 and higher.)

There are two special-case header calls. The first is a header that starts with the string "HTTP/" (case is not significant), which will be used to figure out the HTTP status code to send. For example, if you have configured Apache to use a PHP script to handle requests for missing files (using the ErrorDocument directive), you may want to make sure that your script generates the proper status code.

<?php
  header("HTTP/1.0 404 Not Found");
?>

註: The HTTP status header line will always be the first sent to the client, regardless of the actual header() call beeing the first or not. The status may be overridden by calling header() with a new status line at any time unless the HTTP headers have already been sent.

註: In PHP 3, this only works when PHP is compiled as an Apache module. You can achieve the same effect using the Status header.

<?php
header("Status: 404 Not Found");
?>

The second special case is the "Location:" header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless some 3xx status code has already been set.

<?php
header("Location: http://www.example.com/"); /* Redirect browser */
exit;                 /* Make sure that code below does
                         not get executed when we redirect. */
?>

註: HTTP/1.1 requires an absolute URI as argument to Location: including the scheme, hostname and absolute path, but some clients accept relative URIs. You can usually use $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] and dirname() to make an absolute URI from a relative one yourself:

<?php
header("Location: http://".$_SERVER['HTTP_HOST']
                      .dirname($_SERVER['PHP_SELF'])
                      ."/".$relative_url);
?>

PHP scripts often generate dynamic content that must not be cached by the client browser or any proxy caches between the server and the client browser. Many proxies and clients can be forced to disable caching with

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                                     // always modified
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0
?>

註: You may find that your pages aren't cached even if you don't output all of the headers above. There are a number of options that users may be able to set for their browser that change its default caching behavior. By sending the headers above, you should override any settings that may otherwise cause the output of your script to be cached.

Additionally, session_cache_limiter() and the session.cache_limiter configuration setting can be used to automatically generate the correct caching-related headers when sessions are being used.

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

<?php header ("Content-type: audio/x-pn-realaudio"); ?>
// Broken, note the blank line above

註: In PHP 4, you can use output buffering to get around this problem, with the overhead of all of your output to the browser being buffered in the server until you send it. You can do this by calling ob_start() and ob_end_flush() in your script, or setting the output_buffering configuration directive on in your php.ini or server configuration files.

If you want the user to be prompted to save the data you are sending, such as a generated PDF file, you can use the Content-Disposition header to supply a recommended filename and force the browser to display the save dialog.

<?php
// We'll be outputting a PDF
header("Content-type: application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition: attachment; filename=downloaded.pdf");

// The PDF source is in original.pdf
readfile('original.pdf');
?>

註: There is a bug in Microsoft Internet Explorer 4.01 that prevents this from working. There is no workaround. There is also a bug in Microsoft Internet Explorer 5.5 that interferes with this, which can be resolved by upgrading to Service Pack 2 or later.

註: If safe mode is enabled the uid of the script is added to the realm part of the WWW-Authenticate header if you set this header (used for HTTP Authentication).

See also headers_sent(), setcookie(), and the section on HTTP authentication.

上一頁 | 首頁 | 下一頁
HTTP functions | 上一層 | headers_sent


htmlspecialchars

(PHP 3, PHP 4 )

htmlspecialchars -- Convert special characters to HTML entities

Description

string htmlspecialchars ( string string [, int quote_style [, string charset]])

Certain characters have special significance in HTML, and should be represented by HTML entities if they are to preserve their meanings. This function returns a string with some of these conversions made; the translations made are those most useful for everyday web programming. If you require all HTML character entities to be translated, use htmlentities() instead.

This function is useful in preventing user-supplied text from containing HTML markup, such as in a message board or guest book application. The optional second argument, quote_style, tells the function what to do with single and double quote characters. The default mode, ENT_COMPAT, is the backwards compatible mode which only translates the double-quote character and leaves the single-quote untranslated. If ENT_QUOTES is set, both single and double quotes are translated and if ENT_NOQUOTES is set neither single nor double quotes are translated.

The translations performed are:

  • '&' (ampersand) becomes '&amp;'

  • '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.

  • ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.

  • '<' (less than) becomes '&lt;'

  • '>' (greater than) becomes '&gt;'

例子 1. htmlspecialchars() example

$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);

Note that this function does not translate anything beyond what is listed above. For full entity translation, see htmlentities(). Support for the optional second argument was added in PHP 3.0.17 and PHP 4.0.3.

The third argument defines character set used in conversion. The default character set is ISO-8859-1. Support for this third argument was added in PHP 4.1.0.

See also get_html_translation_table(), htmlentities() and nl2br().

上一頁 | 首頁 | 下一頁
htmlentities | 上一層 | implode


ibase_pconnect

(PHP 3>= 3.0.6, PHP 4 )

ibase_pconnect -- Creates an persistent connection to an InterBase database

Description

int ibase_pconnect ( string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])

ibase_pconnect() acts very much like ibase_connect() with two major differences. First, when connecting, the function will first try to find a (persistent) link that's already opened with the same parameters. If one is found, an identifier for it will be returned instead of opening a new connection. Second, the connection to the InterBase server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (ibase_close() will not close links established by ibase_pconnect()). This type of link is therefore called 'persistent'.

註: buffers was added in PHP4-RC2.

註: dialect was added in PHP4-RC2. It is functional only with InterBase 6 and versions higher than that.

註: role was added in PHP4-RC2. It is functional only with InterBase 5 and versions higher than that.

See also ibase_connect() for the meaning of parameters passed to this function. They are exactly the same.

上一頁 | 首頁 | 下一頁
ibase_num_fields | 上一層 | ibase_prepare


ifx_pconnect

(PHP 3>= 3.0.3, PHP 4 )

ifx_pconnect -- Open persistent Informix connection

Description

int ifx_pconnect ( [string database [, string userid [, string password]]])

Returns: A positive Informix persistent link identifier on success, or FALSE on error

ifx_pconnect() acts very much like ifx_connect() with two major differences.

This function behaves exactly like ifx_connect() when PHP is not running as an Apache module. First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (ifx_close() will not close links established by ifx_pconnect()).

This type of links is therefore called 'persistent'.

See also: ifx_connect().

上一頁 | 首頁 | 下一頁
ifx_num_rows | 上一層 | ifx_prepare


ignore_user_abort

(PHP 3>= 3.0.7, PHP 4 )

ignore_user_abort -- Set whether a client disconnect should abort script execution

Description

int ignore_user_abort ( [int setting])

This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting. See the Connection Handling section in the Features chapter for a complete description of connection handling in PHP.

上一頁 | 首頁 | 下一頁
highlight_string | 上一層 | leak


imap_body

(PHP 3, PHP 4 )

imap_body -- Read the message body

Description

string imap_body ( resource imap_stream, int msg_number [, int options])

imap_body() returns the body of the message, numbered msg_number in the current mailbox. The optional flags are a bit mask with one or more of the following:

  • FT_UID - The msgno is a UID

  • FT_PEEK - Do not set the \Seen flag if not already set

  • FT_INTERNAL - The return string is in internal format, will not canonicalize to CRLF.

imap_body() will only return a verbatim copy of the message body. To extract single parts of a multipart MIME-encoded message you have to use imap_fetchstructure() to analyze its structure and imap_fetchbody() to extract a copy of a single body component.

上一頁 | 首頁 | 下一頁
imap_binary | 上一層 | imap_bodystruct


imap_createmailbox

(PHP 3, PHP 4 )

imap_createmailbox -- Create a new mailbox

Description

bool imap_createmailbox ( resource imap_stream, string mbox)

imap_createmailbox() creates a new mailbox specified by mbox. Names containing international characters should be encoded by imap_utf7_encode()

Returns TRUE on success and FALSE on error.

See also imap_renamemailbox(),
imap_deletemailbox() and
imap_open() for the format
of mbox names.

例子 1. imap_createmailbox() example

$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
     or die("can't connect: ".imap_last_error());

$name1 = "phpnewbox";
$name2 = imap_utf7_encode("phpnewb&ouml;x");

$newname = $name1;

echo "Newname will be '$name1'<br>\n";

# we will now create a new mailbox "phptestbox" in your inbox folder,
# check its status after creation and finaly remove it to restore
# your inbox to its initial state
if(@imap_createmailbox($mbox,imap_utf7_encode("{your.imap.host}INBOX.$newname"))) {
  $status = @imap_status($mbox,"{your.imap.host}INBOX.$newname",SA_ALL);
  if($status) {
    print("your new mailbox '$name1' has the following status:<br>\n");
    print("Messages:   ". $status->messages   )."<br>\n";
    print("Recent:     ". $status->recent     )."<br>\n";
    print("Unseen:     ". $status->unseen     )."<br>\n";
    print("UIDnext:    ". $status->uidnext    )."<br>\n";
    print("UIDvalidity:". $status->uidvalidity)."<br>\n";

    if(imap_renamemailbox($mbox,"{your.imap.host}INBOX.$newname","{your.imap.host}INBOX.$name2")) {
      echo "renamed new mailbox from '$name1' to '$name2'<br>\n";
      $newname=$name2;
    } else {
      print "imap_renamemailbox on new mailbox failed: ".imap_last_error()."<br>\n";
    }
  } else {
    print  "imap_status on new mailbox failed: ".imap_last_error()."<br>\n";
  }
  if(@imap_deletemailbox($mbox,"{your.imap.host}INBOX.$newname")) {
    print "new mailbox removed to restore initial state<br>\n";
  } else {
    print  "imap_deletemailbox on new mailbox failed: ".implode("<br>\n",imap_errors())."<br>\n";
  }

} else {
  print  "could not create new mailbox: ".implode("<br>\n",imap_errors())."<br>\n";
}

imap_close($mbox);

上一頁 | 首頁 | 下一頁
imap_close | 上一層 | imap_delete


imap_headerinfo

(PHP 3, PHP 4 )

imap_headerinfo -- Read the header of the message

Description

object imap_headerinfo ( resource imap_stream, int msg_number [, int fromlength [, int subjectlength [, string defaulthost]]])

This function returns an object of various header elements.

remail, date, Date, subject, Subject, in_reply_to, message_id,
newsgroups, followup_to, references

message flags:
Recent - 'R' if recent and seen,
'N' if recent and not seen,
' ' if not recent
Unseen - 'U' if not seen AND not recent,
' ' if seen OR not seen and recent
Answered -'A' if answered,
' ' if unanswered
Deleted - 'D' if deleted,
' ' if not deleted
Draft - 'X' if draft,
' ' if not draft
Flagged - 'F' if flagged,
' ' if not flagged

NOTE that the Recent/Unseen behavior is a little odd. If you want to
know if a message is Unseen, you must check for

Unseen == 'U' || Recent == 'N'

toaddress (full to: line, up to 1024 characters)

to[] (returns an array of objects from the To line, containing):
personal
adl
mailbox
host

fromaddress (full from: line, up to 1024 characters)

from[] (returns an array of objects from the From line, containing):
personal
adl
mailbox
host

ccaddress (full cc: line, up to 1024 characters)
cc[] (returns an array of objects from the Cc line, containing):
personal
adl
mailbox
host

bccaddress (full bcc line, up to 1024 characters)
bcc[] (returns an array of objects from the Bcc line, containing):
personal
adl
mailbox
host

reply_toaddress (full reply_to: line, up to 1024 characters)
reply_to[] (returns an array of objects from the Reply_to line,
containing):
personal
adl
mailbox
host

senderaddress (full sender: line, up to 1024 characters)
sender[] (returns an array of objects from the sender line, containing):
personal
adl
mailbox
host

return_path (full return-path: line, up to 1024 characters)
return_path[] (returns an array of objects from the return_path line,
containing):
personal
adl
mailbox
host

udate (mail message date in unix time)

fetchfrom (from line formatted to fit fromlength
characters)

fetchsubject (subject line formatted to fit subjectlength characters)

上一頁 | 首頁 | 下一頁
imap_header | 上一層 | imap_headers


imap_list

(PHP 3>= 3.0.4, PHP 4 )

imap_list -- Read the list of mailboxes

Description

array imap_list ( resource imap_stream, string ref, string pattern)

Returns an array containing the names of the mailboxes. See imap_getmailboxes() for a description of ref and pattern.

例子 1. imap_list() example

$mbox = imap_open("{your.imap.host}","username","password",OP_HALFOPEN)
      or die("can't connect: ".imap_last_error());

$list = imap_list($mbox,"{your.imap.host}","*");
if(is_array($list)) {
  reset($list);
  while (list($key, $val) = each($list))
    print imap_utf7_decode($val)."<br>\n";
} else
  print "imap_list failed: ".imap_last_error()."\n";

imap_close($mbox);

上一頁 | 首頁 | 下一頁
imap_last_error | 上一層 | imap_listmailbox


imap_listscan

(no version information, might be only in CVS)

imap_listscan -- Read the list of mailboxes, takes a string to search for in the text of the mailbox

Description

array imap_listscan ( resource imap_stream, string ref, string pattern, string content)

Returns an array containing the names of the mailboxes that have content in the text of the mailbox. This function is similar to imap_listmailbox(), but it will additionally check for the presence of the string content inside the mailbox data. See imap_getmailboxes() for a description of ref and pattern.

上一頁 | 首頁 | 下一頁
imap_listmailbox | 上一層 | imap_listsubscribed


imap_lsub

(PHP 3>= 3.0.4, PHP 4 )

imap_lsub -- List all the subscribed mailboxes

Description

array imap_lsub ( resource imap_stream, string ref, string pattern)

Returns an array of all the mailboxes that you have subscribed. This is almost identical to imap_listmailbox(), but will only return mailboxes the user you logged in as has subscribed.

上一頁 | 首頁 | 下一頁
imap_listsubscribed | 上一層 | imap_mail_compose


imap_renamemailbox

(PHP 3, PHP 4 )

imap_renamemailbox -- Rename an old mailbox to new mailbox

Description

bool imap_renamemailbox ( resource imap_stream, string old_mbox, string new_mbox)

This function renames on old mailbox to new mailbox (see imap_open() for the format of mbox names).

Returns TRUE on success and FALSE on error.

See also imap_createmailbox(),
imap_deletemailbox(), and
imap_open() for the format of
mbox.

上一頁 | 首頁 | 下一頁
imap_qprint | 上一層 | imap_reopen


implode

(PHP 3, PHP 4 )

implode -- Join array elements with a string

Description

string implode ( string glue, array pieces)

Returns a string containing a string representation of all the array elements in the same order, with the glue string between each element.

例子 1. implode() example

<?php

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

print $comma_separated; // lastname,email,phone

?>

註: implode() can, for historical reasons, accept its parameters in either order. For consistency with explode(), however, it may be less confusing to use the documented order of arguments.

See also explode(), and split().

上一頁 | 首頁 | 下一頁
htmlspecialchars | 上一層 | join


in_array

(PHP 4 )

in_array -- 如果陣列中存在該值則傳回 TRUE

說明

bool in_array ( mixed needle, array haystack [, bool strict])

在 haystack 中搜索 needle，如果找到則傳回 TRUE，否則傳回 FALSE。

如果第三個參數 strict 的值為 TRUE 則 in_array() 函式還會檢查 needle 的型別是否和 haystack 中的相同。

註: 如果 needle 是字串，則比較是區分大小寫的。

註: 在 PHP 版本 4.2.0 之前，needle 不允許是一個陣列。

例子 1. in_array() 例子

$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array ("Irix", $os)) {
    print "Got Irix";
}
if (in_array ("mac", $os)) {
    print "Got mac";
}

第二個條件失敗，因為 in_array() 是區分大小寫的，所以以上程序顯示為：
Got Irix

例子 2. in_array() 嚴格型別檢查例子

<?php
$a = array('1.10', 12.4, 1.13);

if (in_array('12.4', $a, TRUE))
    echo "'12.4' found with strict check\n";
if (in_array(1.13, $a, TRUE))
    echo "1.13 found with strict check\n";
?>

將顯示：
1.13 found with strict check

例子 3. in_array() 中用陣列作為 needle

<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array ('p', 'h'), $a))
    echo "'ph' was found\n";
if (in_array(array ('f', 'i'), $a))
    echo "'fi' was found\n";
if (in_array('o', $a))
    echo "'o' was found\n";
?>

// This will output:

'ph' was found
'o' was found

參見 array_search()。

上一頁 | 首頁 | 下一頁
extract | 上一層 | key


include

PHP 手冊
上一頁 章 12. 流程控制 下一頁

include()

The include() 語句包括並執行指定文件。

以下文檔也適用於 require()。這兩種結構除了在如何處理失敗之外完全一樣。include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說，如果你想在遇到丟失文件時停止處理頁面就用 require()。include() 就不是這樣，腳本會繼續執行。同時也要確認設置了合適的 include_path。

當一個文件被包括時，其中所包含的代碼繼承了 include 所在行的變數範圍。從該處開始，呼叫文件在該行處可用的任何變數在被呼叫的文件中也都可用。

例子 12-3. 基本的 include() 例子

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

如果 include 出現於呼叫文件中的一個函式裡，則被呼叫的文件中所包含的所有代碼將表現得如同它們是在該函式內部定義的一樣。所以它將遵循該函式的變數範圍。

例子 12-4. 函式中的包括

<?php

function foo()
{
global $color;

    include 'vars.php';

    echo "A $color $fruit";
}

/* vars.php is in the scope of foo() so     *
 * $fruit is NOT available outside of this  *
 * scope.  $color is because we declared it *
 * as global.                               */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

當一個文件被包括時，語法解析器在目標文件的開頭脫離 PHP 模式並進入 HTML 模式，到文件結尾處恢複。由於此原因，目標文件中應被當作 PHP 代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。

如果“URL fopen wrappers”在 PHP 中被啟動（預定配置），可以用 URL（通過 HTTP 或者其它支援的封裝協議 － 所支援的協議見 附錄 I）而不是本地文件來指定要被包括的文件。如果目標伺服器將目標文件作為 PHP 代碼解釋，則可以用適用於 HTTP GET 的 URL 請求字串來向被包括的文件傳遞變數。嚴格的說這和包括一個文件並繼承父文件的變數空間並不是一回事；該腳本文件實際上已經在遠程伺服器上執行了，而本地腳本則包括了其結果。

警告

Windows 版本的 PHP 在 4.3 版之前不支援該函式的遠程文件連接，即使 allow_url_fopen 選項已被啟動。

例子 12-5. 通過 HTTP 進行的 include()

<?php

/* This example assumes that www.example.com is configured to parse .php *
 * files and not .txt files. Also, 'Works' here means that the variables *
 * $foo and $bar are available within the included file.                 */

// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include 'file.txt';  // Works.
include 'file.php';  // Works.

?>
相關訊息參見使用遠程文件，fopen() 和 file()。

因為 include() 和 require() 是特殊的語言結構，在條件語句中使用必須將其放在語句組中（大括號中）。

例子 12-6. include() 與條件語句組

<?php

// This is WRONG and will not work as desired.
if ($condition)
    include $file;
else
    include $other;

// This is CORRECT.
if ($condition) {
    include $file;
} else {
    include $other;
}

?>

處理傳回值：可以在被包括的文件中使用 return() 語句來終止該文件中程序的執行並傳回呼叫它的腳本。同樣也可以從被包括的文件中傳回值。可以像普通函式一樣獲得 include 呼叫的傳回值。

註: 在 PHP 3 中，除非是在函式中呼叫否則被包括的文件中不能出現 return。在此情況下 return() 作用於該函式而不是整個文件。

例子 12-7. include() 和 return() 語句

return.php
<?php

$var = 'PHP';

return $var;

?>

noreturn.php
<?php

$var = 'PHP';

?>

testreturns.php
<?php

$foo = include 'return.php';

echo $foo; // prints 'PHP'

$bar = include 'noreturn.php';

echo $bar; // prints 1

?>

$bar 的值為 1 是因為 include 成功執行了。注意以上例子中的區別。第一個在被包括的文件中用了 return() 而另一個沒有。其它幾種把文件“包括”到變數的方法是用 fopen()，file() 或者 include() 連同輸出控制函式一起使用。

參見 require()，require_once()，include_once()，readfile()，virtual() 和 include_path。


include_once

PHP 手冊
上一頁 章 12. 流程控制 下一頁

include_once()

The include_once() 語句在腳本執行期間包括並執行指定文件。此行為和 include() 語句類似，唯一區別是如果該文件中的代碼已經被包括了，則不會再次包括。如同此語句名字暗示的那樣，只會包括一次。

include_once() 應該用於在腳本執行期間同一個文件有可能被包括超過一次的情況下，你想確保它只被包括一次以避免函式重定義，變數重新設值等問題。

使用 require_once() 和 include_once() 的更多例子見最新的 PHP 源程序發行包中的 PEAR 代碼。

註: include_once() 是 PHP 4.0.1pl2 中新加入的。

註: 要注意 include_once() 和 require_once() 在大小寫不敏感的操作系統中（例如 Windows）的行為可能不是你所期望的。

例子 12-9. include_once() 是大小寫敏感的

include_once("a.php"); // this will include a.php
include_once("A.php"); // this will include a.php again on Windows!

警告

Windows 版本的 PHP 在 4.3 版之前不支援該函式的遠程文件連接，即使 allow_url_fopen 選項已被啟動。

參見 include()，require()，require_once()，get_required_files()，get_included_files()，readfile() 和 virtual()。

上一頁 | 首頁 | 下一頁
require_once() | 上一層 | 函式


ingres_pconnect

(PHP 4 >= 4.0.2)

ingres_pconnect -- Open a persistent connection to an Ingres II database

Description

resource ingres_pconnect ( [string database [, string username [, string password]]])

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Returns a Ingres II link resource on success, or FALSE on failure.

See ingres_connect() for parameters details and examples. There are only 2 differences between ingres_pconnect() and ingres_connect() : First, when connecting, the function will first try to find a (persistent) link that's already opened with the same parameters. If one is found, an identifier for it will be returned instead of opening a new connection. Second, the connection to the Ingres server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (ingres_close() will not close links established by ingres_pconnect()). This type of link is therefore called 'persistent'.

See also ingres_connect() and ingres_close().

上一頁 | 首頁 | 下一頁
ingres_num_rows | 上一層 | ingres_query


ini_set

(PHP 4 )

ini_set -- Sets the value of a configuration option

Description

string ini_set ( string varname, string newvalue)

Sets the value of the given configuration option. Returns the old value on success, FALSE on failure. The configuration option will keep this new value during the script's execution, and will be restored at the script's ending.

Not all the available options can be changed using ini_set(). Below is a table with a list of all PHP options (as of PHP 4.2.0), indicating which ones can be changed/set and at what level.

表格 1. Configuration options

Name | Default | Changeable
com.allow_dcom | "0" | PHP_INI_SYSTEM
com.autoregister_typelib | "0" | PHP_INI_SYSTEM
com.autoregister_verbose | "0" | PHP_INI_SYSTEM
com.autoregister_casesensitive | "1" | PHP_INI_SYSTEM
com.typelib_file | "" | PHP_INI_SYSTEM
crack.default_dictionary | NULL | PHP_INI_SYSTEM
exif.encode_unicode | "ISO-8859-15" | PHP_INI_ALL
exif.decode_unicode_motorola | "UCS-2BE" | PHP_INI_ALL
exif.decode_unicode_intel | "UCS-2LE" | PHP_INI_ALL
exif.encode_jis | "" | PHP_INI_ALL
exif.decode_jis_motorola | "JIS" | PHP_INI_ALL
exif.decode_jis_intel | "JIS" | PHP_INI_ALL
fbsql.allow_persistent | "1" | PHP_INI_SYSTEM
fbsql.generate_warnings | "0" | PHP_INI_SYSTEM
fbsql.autocommit | "1" | PHP_INI_SYSTEM
fbsql.max_persistent | "-1" | PHP_INI_SYSTEM
fbsql.max_links | "128" | PHP_INI_SYSTEM
fbsql.max_connections | "128" | PHP_INI_SYSTEM
fbsql.max_results | "128" | PHP_INI_SYSTEM
fbsql.batchSize | "1000" | PHP_INI_SYSTEM
fbsql.default_host | NULL | PHP_INI_SYSTEM
fbsql.default_user | "_SYSTEM" | PHP_INI_SYSTEM
fbsql.default_password | "" | PHP_INI_SYSTEM
fbsql.default_database | "" | PHP_INI_SYSTEM
fbsql.default_database_password | "" | PHP_INI_SYSTEM
hwapi.allow_persistent | "0" | PHP_INI_SYSTEM
hyerwave.allow_persistent | "0" | PHP_INI_SYSTEM
hyperwave.default_port | "418" | PHP_INI_ALL
iconv.input_encoding | ICONV_INPUT_ENCODING | PHP_INI_ALL
iconv.output_encoding | ICONV_OUTPUT_ENCODING | PHP_INI_ALL
iconv.internal_encoding | ICONV_INTERNAL_ENCODING | PHP_INI_ALL
ifx.allow_persistent | "1" | PHP_INI_SYSTEM
ifx.max_persistent | "-1" | PHP_INI_SYSTEM
ifx.max_links | "-1" | PHP_INI_SYSTEM
ifx.default_host | NULL | PHP_INI_SYSTEM
ifx.default_user | NULL | PHP_INI_SYSTEM
ifx.default_password | NULL | PHP_INI_SYSTEM
ifx.blobinfile | "1" | PHP_INI_ALL
ifx.textasvarchar | "0" | PHP_INI_ALL
ifx.byteasvarchar | "0" | PHP_INI_ALL
ifx.charasvarchar | "0" | PHP_INI_ALL
ifx.nullformat | "0" | PHP_INI_ALL
ingres.allow_persistent | "1" | PHP_INI_SYSTEM
ingres.max_persistent | "-1" | PHP_INI_SYSTEM
ingres.max_links | "-1" | PHP_INI_SYSTEM
ingres.default_database | NULL | PHP_INI_ALL
ingres.default_user | NULL | PHP_INI_ALL
ingres.default_password | NULL | PHP_INI_ALL
ibase.allow_persistent | "1" | PHP_INI_SYSTEM
ibase.max_persistent | "-1" | PHP_INI_SYSTEM
ibase.max_links | "-1" | PHP_INI_SYSTEM
ibase.default_user | NULL | PHP_INI_ALL
ibase.default_password | NULL | PHP_INI_ALL
ibase.timestampformat | "%m/%d/%Y%H:%M:%S" | PHP_INI_ALL
ibase.dateformat | "%m/%d/%Y" | PHP_INI_ALL
ibase.timeformat | "%H:%M:%S" | PHP_INI_ALL
java.class.path | NULL | PHP_INI_ALL
java.home | NULL | PHP_INI_ALL
java.library.path | NULL | PHP_INI_ALL
java.library | JAVALIB | PHP_INI_ALL
java.library | NULL | PHP_INI_ALL
ldap.max_links | "-1" | PHP_INI_SYSTEM
mbstring.detect_order | NULL | PHP_INI_ALL
mbstring.http_input | NULL | PHP_INI_ALL
mbstring.http_output | NULL | PHP_INI_ALL
mbstring.internal_encoding | NULL | PHP_INI_ALL
mbstring.substitute_character | NULL | PHP_INI_ALL
mbstring.func_overload | "0" | PHP_INI_SYSTEM
mcrypt.algorithms_dir | NULL | PHP_INI_ALL
mcrypt.modes_dir | NULL | PHP_INI_ALL
mime_magic.magicfile | "/usr/share/misc/magic.mime" | PHP_INI_SYSTEM
mssql.allow_persistent | "1" | PHP_INI_SYSTEM
mssql.max_persistent | "-1" | PHP_INI_SYSTEM
mssql.max_links | "-1" | PHP_INI_SYSTEM
mssql.max_procs | "25" | PHP_INI_ALL
mssql.min_error_severity | "10" | PHP_INI_ALL
mssql.min_message_severity | "10" | PHP_INI_ALL
mssql.compatability_mode | "0" | PHP_INI_ALL
mssql.connect_timeout | "5" | PHP_INI_ALL
mssql.timeout | "60" | PHP_INI_ALL
mssql.textsize | "-1" | PHP_INI_ALL
mssql.textlimit | "-1" | PHP_INI_ALL
mssql.batchsize | "0" | PHP_INI_ALL
mssql.datetimeconvert | "1" | PHP_INI_ALL
mysql.allow_persistent | "1" | PHP_INI_SYSTEM
mysql.max_persistent | "-1" | PHP_INI_SYSTEM
mysql.max_links | "-1" | PHP_INI_SYSTEM
mysql.default_host | NULL | PHP_INI_ALL
mysql.default_user | NULL | PHP_INI_ALL
mysql.default_password | NULL | PHP_INI_ALL
mysql.default_port | NULL | PHP_INI_ALL
mysql.default_socket | NULL | PHP_INI_ALL
ncurses.value | "42" | PHP_INI_ALL
ncurses.string | "foobar" | PHP_INI_ALL
odbc.allow_persistent | "1" | PHP_INI_SYSTEM
odbc.max_persistent | "-1" | PHP_INI_SYSTEM
odbc.max_links | "-1" | PHP_INI_SYSTEM
odbc.default_db | NULL | PHP_INI_ALL
odbc.default_user | NULL | PHP_INI_ALL
odbc.default_pw | NULL | PHP_INI_ALL
odbc.defaultlrl | "4096" | PHP_INI_ALL
odbc.defaultbinmode | "1" | PHP_INI_ALL
odbc.check_persistent | "1" | PHP_INI_SYSTEM
pfpro.defaulthost | "test.signio.com" |
pfpro.defaulthost | "test-payflow.verisign.com" |
pfpro.defaultport | "443" | PHP_INI_ALL
pfpro.defaulttimeout | "30" | PHP_INI_ALL
pfpro.proxyaddress | "" | PHP_INI_ALL
pfpro.proxyport | "" | PHP_INI_ALL
pfpro.proxylogon | "" | PHP_INI_ALL
pfpro.proxypassword | "" | PHP_INI_ALL
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM
pgsql.max_links | "-1" | PHP_INI_SYSTEM
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM
pgsql.ignore_notice | "0" | PHP_INI_ALL
pgsql.log_notice | "0" | PHP_INI_ALL
session.save_path | "/tmp" | PHP_INI_ALL
session.name | "PHPSESSID" | PHP_INI_ALL
session.save_handler | "files" | PHP_INI_ALL
session.auto_start | "0" | PHP_INI_ALL
session.gc_probability | "1" | PHP_INI_ALL
session.gc_maxlifetime | "1440" | PHP_INI_ALL
session.serialize_handler | "php" | PHP_INI_ALL
session.cookie_lifetime | "0" | PHP_INI_ALL
session.cookie_path | "/" | PHP_INI_ALL
session.cookie_domain | "" | PHP_INI_ALL
session.cookie_secure | "" | PHP_INI_ALL
session.use_cookies | "1" | PHP_INI_ALL
session.use_only_cookies | "0" | PHP_INI_ALL
session.referer_check | "" | PHP_INI_ALL
session.entropy_file | "" | PHP_INI_ALL
session.entropy_length | "0" | PHP_INI_ALL
session.cache_limiter | "nocache" | PHP_INI_ALL
session.cache_expire | "180" | PHP_INI_ALL
session.use_trans_sid | "1" | PHP_INI_SYSTEM|PHP_INI_PERDIR
session.encode_sources | "globals,track" | PHP_INI_ALL
extname.global_value | "42" | PHP_INI_ALL
extname.global_string | "foobar" | PHP_INI_ALL
assert.active | "1" | PHP_INI_ALL
assert.bail | "0" | PHP_INI_ALL
assert.warning | "1" | PHP_INI_ALL
assert.callback | NULL | PHP_INI_ALL
assert.quiet_eval | "0" | PHP_INI_ALL
safe_mode_protected_env_vars | SAFE_MODE_PROTECTED_ENV_VARS | PHP_INI_SYSTEM
safe_mode_allowed_env_vars | SAFE_MODE_ALLOWED_ENV_VARS | PHP_INI_SYSTEM
url_rewriter.tags | "a=href,area=href,frame=src,form=fakeentry" | PHP_INI_ALL
sybct.allow_persistent | "1" | PHP_INI_SYSTEM
sybct.max_persistent | "-1" | PHP_INI_SYSTEM
sybct.max_links | "-1" | PHP_INI_SYSTEM
sybct.min_server_severity | "10" | PHP_INI_ALL
sybct.min_client_severity | "10" | PHP_INI_ALL
sybct.hostname | NULL | PHP_INI_ALL
tokenizer.global_value | "42" | PHP_INI_ALL
tokenizer.global_string | "foobar" | PHP_INI_ALL
vpopmail.directory | "" | PHP_INI_ALL
zlib.output_compression | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR
zlib.output_compression_level | "-1" | PHP_INI_ALL
define_syslog_variables | "0" | PHP_INI_ALL
highlight.bg | HL_BG_COLOR | PHP_INI_ALL
highlight.comment | HL_COMMENT_COLOR | PHP_INI_ALL
highlight.default | HL_DEFAULT_COLOR | PHP_INI_ALL
highlight.html | HL_HTML_COLOR | PHP_INI_ALL
highlight.keyword | HL_KEYWORD_COLOR | PHP_INI_ALL
highlight.string | HL_STRING_COLOR | PHP_INI_ALL
allow_call_time_pass_reference | "1" | PHP_INI_SYSTEM|PHP_INI_PERDIR
asp_tags | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR
display_errors | "1" | PHP_INI_ALL
display_startup_errors | "0" | PHP_INI_ALL
enable_dl | "1" | PHP_INI_SYSTEM
expose_php | "1" | PHP_INI_SYSTEM
html_errors | "1" | PHP_INI_SYSTEM
xmlrpc_errors | "0" | PHP_INI_SYSTEM
xmlrpc_error_number | "0" | PHP_INI_ALL
ignore_user_abort | "0" | PHP_INI_ALL
implicit_flush | "0" | PHP_INI_PERDIR|PHP_INI_SYSTEM
log_errors | "0" | PHP_INI_ALL
log_errors_max_len | "1024" | PHP_INI_ALL
ignore_repeated_errors | "0" | PHP_INI_ALL
ignore_repeated_source | "0" | PHP_INI_ALL
magic_quotes_gpc | "1" | PHP_INI_PERDIR|PHP_INI_SYSTEM
magic_quotes_runtime | "0" | PHP_INI_ALL
magic_quotes_sybase | "0" | PHP_INI_ALL
output_buffering | "0" | PHP_INI_PERDIR|PHP_INI_SYSTEM
output_handler | NULL | PHP_INI_PERDIR|PHP_INI_SYSTEM
register_argc_argv | "1" | PHP_INI_PERDIR|PHP_INI_SYSTEM
register_globals | "0" | PHP_INI_PERDIR|PHP_INI_SYSTEM
safe_mode | "1" | PHP_INI_SYSTEM
safe_mode | "0" | PHP_INI_SYSTEM
safe_mode_include_dir | NULL | PHP_INI_SYSTEM
safe_mode_gid | "0" | PHP_INI_SYSTEM
short_open_tag | DEFAULT_SHORT_OPEN_TAG | PHP_INI_SYSTEM|PHP_INI_PERDIR
sql.safe_mode | "0" | PHP_INI_SYSTEM
track_errors | "0" | PHP_INI_ALL
y2k_compliance | "0" | PHP_INI_ALL
unserialize_callback_func | NULL | PHP_INI_ALL
arg_separator.output | "&" | PHP_INI_ALL
arg_separator.input | "&" | PHP_INI_SYSTEM|PHP_INI_PERDIR
auto_append_file | NULL | PHP_INI_SYSTEM|PHP_INI_PERDIR
auto_prepend_file | NULL | PHP_INI_SYSTEM|PHP_INI_PERDIR
doc_root | NULL | PHP_INI_SYSTEM
default_charset | SAPI_DEFAULT_CHARSET | PHP_INI_ALL
default_mimetype | SAPI_DEFAULT_MIMETYPE | PHP_INI_ALL
error_log | NULL | PHP_INI_ALL
extension_dir | PHP_EXTENSION_DIR | PHP_INI_SYSTEM
gpc_order | "GPC" | PHP_INI_ALL
include_path | PHP_INCLUDE_PATH | PHP_INI_ALL
max_execution_time | "30" | PHP_INI_ALL
open_basedir | NULL | PHP_INI_SYSTEM
safe_mode_exec_dir | "1" | PHP_INI_SYSTEM
upload_max_filesize | "2M" | PHP_INI_SYSTEM
file_uploads | "1" | PHP_INI_SYSTEM
post_max_size | "8M" | PHP_INI_SYSTEM
upload_tmp_dir | NULL | PHP_INI_SYSTEM
user_dir | NULL | PHP_INI_SYSTEM
variables_order | NULL | PHP_INI_ALL
error_append_string | NULL | PHP_INI_ALL
error_prepend_string | NULL | PHP_INI_ALL
SMTP | "localhost" | PHP_INI_ALL
smtp_port | 25 | PHP_INI_ALL
browscap | NULL | PHP_INI_SYSTEM
error_reporting | NULL | PHP_INI_ALL
memory_limit | "8M" | PHP_INI_ALL
precision | "14" | PHP_INI_ALL
sendmail_from | NULL | PHP_INI_ALL
sendmail_path | DEFAULT_SENDMAIL_PATH | PHP_INI_SYSTEM
disable_functions | "" | PHP_INI_SYSTEM
allow_url_fopen | "1" | PHP_INI_ALL
always_populate_raw_post_data | "0" | PHP_INI_ALL
xbithack | "0" | PHP_INI_ALL
engine | "1" | PHP_INI_ALL
last_modified | "0" | PHP_INI_ALL
child_terminate | "0" | PHP_INI_ALL
async_send | "0" | PHP_INI_ALL

表格 2. Definition of PHP_INI_* constants

Constant | Value | Meaning
PHP_INI_USER | 1 | Entry can be set in user scripts
PHP_INI_PERDIR | 2 | Entry can be set in .htaccess and VHost directives in httpd.conf.
PHP_INI_SYSTEM | 4 | Entry can be set in php.ini or httpd.conf (but not in VHost blocks in httpd.conf).
PHP_INI_ALL | 7 | Entry can be set anywhere

See also: ini_alter(),
ini_get(), and
ini_restore()

上一頁 | 首頁 | 下一頁
ini_restore | 上一層 | php_logo_guid


is_a

(PHP 4 >= 4.2.0)

is_a -- Returns TRUE if the object is of this class or has this class as one of its parents

Description

bool is_a ( object object, string class_name)

This function returns TRUE if the object is of this class or has this class as one of its parents, FALSE otherwise.

See also get_class(),
get_parent_class(), and
is_subclass_of().

上一頁 | 首頁 | 下一頁
get_parent_class | 上一層 | is_subclass_of


is_array

(PHP 3, PHP 4 )

is_array -- Finds whether a variable is an array

Description

bool is_array ( mixed var)

Returns TRUE if var is an array, FALSE otherwise.

See also
is_float(),
is_int(),
is_integer(),
is_string(), and
is_object().

上一頁 | 首頁 | 下一頁
intval | 上一層 | is_bool


is_dir

(PHP 3, PHP 4 )

is_dir -- Tells whether the filename is a directory

Description

bool is_dir ( string filename)

Returns TRUE if the filename exists and is a directory. If filename is a relative filename, it will be checked relative to the current working directory.

The results of this function are cached. See clearstatcache() for more details.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

See also chdir(), dir,
opendir(), is_file() and
is_link().

上一頁 | 首頁 | 下一頁
glob | 上一層 | is_executable


is_executable

(PHP 3, PHP 4 )

is_executable -- Tells whether the filename is executable

Description

bool is_executable ( string filename)

Returns TRUE if the filename exists and is executable.

The results of this function are cached. See clearstatcache() for more details.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

See also is_file() and is_link().

上一頁 | 首頁 | 下一頁
is_dir | 上一層 | is_file


is_file

(PHP 3, PHP 4 )

is_file -- Tells whether the filename is a regular file

Description

bool is_file ( string filename)

Returns TRUE if the filename exists and is a regular file.

The results of this function are cached. See clearstatcache() for more details.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

See also is_dir() and is_link().

上一頁 | 首頁 | 下一頁
is_executable | 上一層 | is_link


is_float

(PHP 3, PHP 4 )

is_float -- Finds whether a variable is a float

Description

bool is_float ( mixed var)

Returns TRUE if var is a float, FALSE otherwise.

註: To test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric().

See also
is_bool(),
is_int(),
is_integer(),
is_numeric(),
is_string(),
is_array(), and
is_object(),

上一頁 | 首頁 | 下一頁
is_double | 上一層 | is_int


is_int

(PHP 3, PHP 4 )

is_int -- Find whether a variable is an integer

Description

bool is_int ( mixed var)

Returns TRUE if var is an integer FALSE otherwise.

註: To test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric().

See also is_bool(),
is_float(),
is_integer(),
is_numeric(),
is_string(),
is_array(), and
is_object().

上一頁 | 首頁 | 下一頁
is_float | 上一層 | is_integer


is_integer

is_integer -- Alias of is_int()

Description

This function is an alias of is_int().

上一頁 | 首頁 | 下一頁
is_int | 上一層 | is_long


is_link

(PHP 3, PHP 4 )

is_link -- Tells whether the filename is a symbolic link

Description

bool is_link ( string filename)

Returns TRUE if the filename exists and is a symbolic link.

The results of this function are cached. See clearstatcache() for more details.

See also is_dir(), is_file(), and readlink().

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

上一頁 | 首頁 | 下一頁
is_file | 上一層 | is_readable


is_readable

(PHP 3, PHP 4 )

is_readable -- Tells whether the filename is readable

Description

bool is_readable ( string filename)

Returns TRUE if the filename exists and is readable.

Keep in mind that PHP may be accessing the file as the user id that the web server runs as (often 'nobody'). Safe mode limitations are not taken into account.

The results of this function are cached. See clearstatcache() for more details.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

See also is_writable().

上一頁 | 首頁 | 下一頁
is_link | 上一層 | is_uploaded_file


is_subclass_of

(PHP 4 )

is_subclass_of -- Returns TRUE if the object has this class as one of its parents

Description

bool is_subclass_of ( object object, string class_name)

This function returns TRUE if the object object, belongs to a class which is a subclass of class_name, FALSE otherwise.

See also get_class(),
get_parent_class() and
is_a().

上一頁 | 首頁 | 下一頁
is_a | 上一層 | method_exists


is_uploaded_file

(PHP 3>= 3.0.17, PHP 4 >= 4.0.3)

is_uploaded_file -- Tells whether the file was uploaded via HTTP POST

Description

bool is_uploaded_file ( string filename)

Returns TRUE if the file named by filename was uploaded via HTTP POST. This is useful to help ensure that a malicious user hasn't tried to trick the script into working on files upon which it should not be working--for instance, /etc/passwd.

This sort of check is especially important if there is any chance that anything done with uploaded files could reveal their contents to the user, or even to other users on the same system.

is_uploaded_file() is available only in versions of PHP 3 after PHP 3.0.16, and in versions of PHP 4 after 4.0.2. If you are stuck using an earlier version, you can use the following function to help protect yourself:

註: The following example will not work in versions of PHP 4 after 4.0.2. It depends on internal functionality of PHP which changed after that version.

<?php
/* Userland test for uploaded file. */
function is_uploaded_file($filename) {
    if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
        $tmp_file = dirname(tempnam('', ''));
    }
    $tmp_file .= '/' . basename($filename);
    /* User might have trailing slash in php.ini... */
    return (ereg_replace('/+', '/', $tmp_file) == $filename);
}

/* This is how to use it, since you also don't have
 * move_uploaded_file() in these older versions: */
if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
    copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
    echo "Possible file upload attack: filename '$HTTP_POST_FILES[userfile]'.";
}
?>

See also move_uploaded_file(), and the section Handling file uploads for a simple usage example.

上一頁 | 首頁 | 下一頁
is_readable | 上一層 | is_writable


is_writable

(PHP 4 )

is_writable -- Tells whether the filename is writable

Description

bool is_writable ( string filename)

Returns TRUE if the filename exists and is writable. The filename argument may be a directory name allowing you to check if a directory is writeable.

Keep in mind that PHP may be accessing the file as the user id that the web server runs as (often 'nobody'). Safe mode limitations are not taken into account.

The results of this function are cached. See clearstatcache() for more details.

This function will not work on remote files; the file to be examined must be accessible via the server's filesystem.

See also is_readable().

上一頁 | 首頁 | 下一頁
is_uploaded_file | 上一層 | is_writeable


is_writeable

(PHP 3, PHP 4 )

is_writeable -- Tells whether the filename is writable

Description

bool is_writeable ( string filename)

This is an alias for is_writable()

上一頁 | 首頁 | 下一頁
is_writable | 上一層 | link


JDDayOfWeek

(PHP 3, PHP 4 )

JDDayOfWeek -- Returns the day of the week

Description

mixed jddayofweek ( int julianday, int mode)

Returns the day of the week. Can return a string or an integer depending on the mode.

表格 1. Calendar week modes

Mode | Meaning
0 | Returns the day number as an int (0=sunday, 1=monday, etc)
1 | Returns string containing the day of week (english-gregorian)
2 | Returns a string containing the abbreviated day of week (english-gregorian)

上一頁 | 首頁 | 下一頁
GregorianToJD | 上一層 | JDMonthName


JDMonthName

(PHP 3, PHP 4 )

JDMonthName -- Returns a month name

Description

string jdmonthname ( int julianday, int mode)

Returns a string containing a month name. mode tells this function which calendar to convert the Julian Day Count to, and what type of month names are to be returned.

表格 1. Calendar modes

Mode | Meaning | Values
0 | Gregorian - abbreviated | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
1 | Gregorian | January, February, March, April, May, June, July, August, September, October, November, December
2 | Julian - abbreviated | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
3 | Julian | January, February, March, April, May, June, July, August, September, October, November, December
4 | Jewish | Tishri, Heshvan, Kislev, Tevet, Shevat, AdarI, AdarII, Nisan, Iyyar, Sivan, Tammuz, Av, Elul
5 | French Republican | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra

上一頁 | 首頁 | 下一頁
JDDayOfWeek | 上一層 | JDToFrench


JDToFrench

(PHP 3, PHP 4 )

JDToFrench -- Converts a Julian Day Count to the French Republican Calendar

Description

string jdtofrench ( int juliandaycount)

Converts a Julian Day Count to the French Republican Calendar.

上一頁 | 首頁 | 下一頁
JDMonthName | 上一層 | JDToGregorian


JDToGregorian

(PHP 3, PHP 4 )

JDToGregorian -- Converts Julian Day Count to Gregorian date

Description

string jdtogregorian ( int julianday)

Converts Julian Day Count to a string containing the Gregorian date in the format of "month/day/year".

上一頁 | 首頁 | 下一頁
JDToFrench | 上一層 | JDToJewish


JDToJewish

(PHP 3, PHP 4 )

JDToJewish -- Converts a Julian Day Count to the Jewish Calendar

Description

string jdtojewish ( int julianday)

Converts a Julian Day Count the the Jewish Calendar.

上一頁 | 首頁 | 下一頁
JDToGregorian | 上一層 | JDToJulian


JDToJulian

(PHP 3, PHP 4 )

JDToJulian -- Converts a Julian Day Count to a Julian Calendar Date

Description

string jdtojulian ( int julianday)

Converts Julian Day Count to a string containing the Julian Calendar Date in the format of "month/day/year".

上一頁 | 首頁 | 下一頁
JDToJewish | 上一層 | jdtounix


jdtounix

(PHP 4 )

jdtounix -- Convert Julian Day to UNIX timestamp

Description

int jdtounix ( int jday)

This function will return a UNIX timestamp corresponding to the Julian Day given in jday or FALSE if jday is not inside the UNIX epoch (Gregorian years between 1970 and 2037 or 2440588 <= jday <= 2465342 ). The time returned is localtime (and not GMT).

See also unixtojd().

上一頁 | 首頁 | 下一頁
JDToJulian | 上一層 | JewishToJD


JewishToJD

(PHP 3, PHP 4 )

JewishToJD -- Converts a date in the Jewish Calendar to Julian Day Count

Description

int jewishtojd ( int month, int day, int year)

Although this function can handle dates all the way back to the year 1 (3761 B.C.), such use may not be meaningful. The Jewish calendar has been in use for several thousand years, but in the early days there was no formula to determine the start of a month. A new month was started when the new moon was first observed.

上一頁 | 首頁 | 下一頁
jdtounix | 上一層 | JulianToJD


join

(PHP 3, PHP 4 )

join -- Join array elements with a string

Description

string join ( string glue, array pieces)

join() is an alias to implode(), and is identical in every way.

See also explode(), implode(), and split().

上一頁 | 首頁 | 下一頁
implode | 上一層 | levenshtein


JulianToJD

(PHP 3, PHP 4 )

JulianToJD -- Converts a Julian Calendar date to Julian Day Count

Description

int juliantojd ( int month, int day, int year)

Valid Range for Julian Calendar 4713 B.C. to 9999 A.D.

Although this function can handle dates all the way back to 4713 B.C., such use may not be meaningful. The calendar was created in 46 B.C., but the details did not stabilize until at least 8 A.D., and perhaps as late at the 4th century. Also, the beginning of a year varied from one culture to another - not all accepted January as the first month.

注意

Remember, the current calendar system being used worldwide is the Gregorian calendar. gregoriantojd() can be used to convert such dates to their Julian Day count.

上一頁 | 首頁 | 下一頁
JewishToJD | 上一層 | unixtojd


key

(PHP 3, PHP 4 )

key -- 從結合陣列中取得鍵名

說明

mixed key ( array array)

key() 傳回陣列中當前單元的鍵名。

參見 current() 和 next()。

上一頁 | 首頁 | 下一頁
in_array | 上一層 | krsort


krsort

(PHP 3>= 3.0.13, PHP 4 )

krsort -- 對陣列按照鍵名逆向排序

說明

int krsort ( array array [, int sort_flags])

對陣列按照鍵名逆向排序，保留鍵名到資料的關聯。主要用於結合陣列。

例子 1. krsort() 例子

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

本例將顯示：

d = lemon
c = apple
b = banana
a = orange

可以用可選參數 sort_flags 改變排序的行為，詳情見 sort()。

參見 asort()，arsort()，ksort()，sort()，natsort() 和 rsort()。

上一頁 | 首頁 | 下一頁
key | 上一層 | ksort


ksort

(PHP 3, PHP 4 )

ksort -- 對陣列按照鍵名排序

說明

int ksort ( array array [, int sort_flags])

對陣列按照鍵名排序，保留鍵名到資料的關聯。本函式主要用於結合陣列。

例子 1. ksort() 例子

$fruits = array ("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

本例將顯示：

a = orange
b = banana
c = apple
d = lemon

可以用可選參數 sort_flags 改變排序的行為，詳情見 sort()。

參見 asort()，arsort()，krsort()，uksort()，sort()，natsort() 和 rsort()。

註: 第二個參數是 PHP 4 新加的。

上一頁 | 首頁 | 下一頁
krsort | 上一層 | list


ldap_unbind

(PHP 3, PHP 4 )

ldap_unbind -- Unbind from LDAP directory

Description

bool ldap_unbind ( resource link_identifier)

如果成功則傳回 TRUE，失敗則傳回 FALSE。

ldap_unbind() function unbinds from the LDAP directory.

上一頁 | 首頁 | 下一頁
ldap_t61_to_8859 | 上一層 | Mail functions


link

(PHP 3, PHP 4 )

link -- Create a hard link

Description

int link ( string target, string link)

link() creates a hard link.

See also the symlink() to create soft links, and readlink() along with linkinfo().

上一頁 | 首頁 | 下一頁
is_writeable | 上一層 | linkinfo


linkinfo

(PHP 3, PHP 4 )

linkinfo -- Gets information about a link

Description

int linkinfo ( string path)

linkinfo() returns the st_dev field of the UNIX C stat structure returned by the lstat system call. This function is used to verify if a link (pointed to by path) really exists (using the same method as the S_ISLNK macro defined in stat.h). Returns 0 or FALSE in case of error.

See also symlink(), link(), and readlink().

上一頁 | 首頁 | 下一頁
link | 上一層 | lstat


list

(PHP 3, PHP 4 )

list -- 把陣列中的值賦給一些變數

說明

void list ( mixed ...)

像 array() 一樣，這不是真正的函式，而是語言結構。list() 用一步操作給一組變數進行設值。

註: list() 僅能用於數字索引的陣列並假定數字索引從 0 開始。

例子 1. list() 例子

<?php

$info = array('coffee', 'brown', 'caffeine');

// Listing all the variables
list($drink, $color, $power) = $info;
print "$drink is $color and $power makes it special.\n";

// Listing some of them
list($drink, , $power) = $info;
print "$drink has $power.\n";

// Or let's skip to only the third one
list( , , $power) = $info;
print "I need $power!\n";

?>

例子 2. 使用 list() 的例子

<table>
 <tr>
  <th>Employee name</th>
  <th>Salary</th>
 </tr>

<?php

$result = mysql_query ("SELECT id, name, salary FROM employees",$conn);
while (list ($id, $name, $salary) = mysql_fetch_row ($result)) {
    print (" <tr>\n".
           "  <td><a href=\"info.php?id=$id\">$name</a></td>\n".
           "  <td>$salary</td>\n".
           " </tr>\n");
}

?>

</table>

警告

list() 從最右邊一個參數開始設值。如果你用單純的變數，不用擔心這一點。但是如果你用了具有索引的陣列，通常你期望得到的結果和在 list() 中寫的一樣是從左到右的，但實際上不是。是以相反順序設值的。

例子 3. 在 list() 中使用陣列索引

<?php

$info = array('coffee', 'brown', 'caffeine');

list($a[0], $a[1], $a[2]) = $info;

var_dump($a);

?>
產生如下輸出（注意單元順序和 list() 語法中所寫的順序的比較）：
array(3) {
  [2]=>
  string(8) "caffeine"
  [1]=>
  string(5) "brown"
  [0]=>
  string(6) "coffee"
}

參見 each()，array() 和 extract()。

上一頁 | 首頁 | 下一頁
ksort | 上一層 | natcasesort


localtime

(PHP 4 )

localtime -- 取得本地時間

說明

array localtime ( [int timestamp [, bool is_associative]])

localtime() 函式傳回一個陣列，其結構和 C 函式呼叫傳回的完全一樣。localtime() 的第一個參數是時間戳，如果沒有給出則使用當前時間。第二個參數是 is_associative，如果設為 0 或未提供則傳回的是普通的數字索引陣列。如果該參數設為 1 則 localtime() 函式傳回包含有所有從 C 的 localtime 函式呼叫所傳回的不同單元的結合陣列。結合陣列中不同的鍵名為：

  • "tm_sec" - 秒數

  • "tm_min" - 分鐘數

  • "tm_hour" - 小時

  • "tm_mday" - 月份中的第幾日

  • "tm_mon" - 年份中的第幾個月，從 0 開始表示一月

  • "tm_year" - 年份，從 1900 開始

  • "tm_wday" - 星期中的第幾天

  • "tm_yday" - 一年中的第幾天

  • "tm_isdst" - 夏令時當前是否生效

上一頁 | 首頁 | 下一頁
gmstrftime | 上一層 | microtime


lstat

(PHP 3>= 3.0.4, PHP 4 )

lstat -- Gives information about a file or symbolic link

Description

array lstat ( string filename)

Gathers the statistics of the file or symbolic link named by filename. This function is identical to the stat() function except that if the filename parameter is a symbolic link, the status of the symbolic link is returned, not the status of the file pointed to by the symbolic link.

Returns an array with the statistics of the file with the following elements:

  1. device

  2. inode

  3. inode protection mode

  4. number of links

  5. user id of owner

  6. group id owner

  7. device type if inode device *

  8. size in bytes

  9. time of last access

  10. time of last modification

  11. time of last change

  12. blocksize for filesystem I/O *

  13. number of blocks allocated

* - only valid on systems supporting the st_blksize type--other systems (i.e. Windows) return -1.

lstat() cannot be used on remote files.

The results of this function are cached. See clearstatcache() for more details.

上一頁 | 首頁 | 下一頁
linkinfo | 上一層 | mkdir


mb_convert_encoding

(PHP 4 >= 4.0.6)

mb_convert_encoding -- Convert character encoding

Description

string mb_convert_encoding ( string str, string to-encoding [, mixed from-encoding])

mb_convert_encoding() converts character encoding of string str from from-encoding to to-encoding.

str : String to be converted.

from-encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.

例子 1. mb_convert_encoding() example

/* Convert internal character encoding to SJIS */
$str = mb_convert_encoding($str, "SJIS");

/* Convert EUC-JP to UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");

/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");

See also: mb_detect_order().

上一頁 | 首頁 | 下一頁
Multi-Byte String Functions | 上一層 | mb_convert_kana


mb_convert_kana

(PHP 4 >= 4.0.6)

mb_convert_kana -- Convert "kana" one from another ("zen-kaku" ,"han-kaku" and more)

Description

string mb_convert_kana ( string str, string option [, mixed encoding])

mb_convert_kana() performs "han-kaku" - "zen-kaku" conversion for string str. It returns converted string. This function is only useful for Japanese.

option is conversion option. Default value is "KV".

encoding is character encoding. If it is omitted, internal character encoding is used.

Applicable Conversion Options

       option : Specify with conversion of following options. Default "KV"
       "r" :  Convert "zen-kaku" alphabets to "han-kaku"
       "R" :  Convert "han-kaku" alphabets to "zen-kaku"
       "n" :  Convert "zen-kaku" numbers to "han-kaku"
       "N" :  Convert "han-kaku" numbers to "zen-kaku"
       "a" :  Convert "zen-kaku" alphabets and numbers to "han-kaku"
       "A" :  Convert "zen-kaku" alphabets and numbers to "han-kaku"
       (Characters included in "a", "A" options are
       U+0021 - U+007E excluding U+0022, U+0027, U+005C, U+007E)
       "s" :  Convert "zen-kaku" space to "han-kaku" (U+3000 -> U+0020)
       "S" :  Convert "han-kaku" space to "zen-kaku" (U+0020 -> U+3000)
       "k" :  Convert "zen-kaku kata-kana" to "han-kaku kata-kana"
       "K" :  Convert "han-kaku kata-kana" to "zen-kaku kata-kana"
       "h" :  Convert "zen-kaku hira-gana" to "han-kaku kata-kana"
       "H" :  Convert "han-kaku kata-kana" to "zen-kaku hira-gana"
       "c" :  Convert "zen-kaku kata-kana" to "zen-kaku hira-gana"
       "C" :  Convert "zen-kaku hira-gana" to "zen-kaku kata-kana"
       "V" :  Collapse voiced sound notation and convert them into a character. Use with "K","H"

例子 1. mb_convert_kana() example

/* Convert all "kana" to "zen-kaku" "kata-kana" */
$str = mb_convert_kana($str, "KVC");

/* Convert "han-kaku" "kata-kana" to "zen-kaku" "kata-kana"
   and "zen-kaku" alpha-numeric to "han-kaku" */
$str = mb_convert_kana($str, "KVa");

上一頁 | 首頁 | 下一頁
mb_convert_encoding | 上一層 | mb_convert_variables


mb_decode_mimeheader

(PHP 4 >= 4.0.6)

mb_decode_mimeheader -- Decode string in MIME header field

Description

string mb_decode_mimeheader ( string str)

mb_decode_mimeheader() decodes encoded-word string str in MIME header.

It returns decoded string in internal character encoding.

See also mb_encode_mimeheader().

上一頁 | 首頁 | 下一頁
mb_convert_variables | 上一層 | mb_decode_numericentity


mb_detect_encoding

(PHP 4 >= 4.0.6)

mb_detect_encoding -- Detect character encoding

Description

string mb_detect_encoding ( string str [, mixed encoding-list])

mb_detect_encoding() detects character encoding in string str. It returns detected character encoding.

encoding-list is list of character encoding. Encoding order may be specified by array or comma separated list string.

If encoding_list is omitted, detect_order is used.

例子 1. mb_detect_encoding() example

/* Detect character encoding with current detect_order */
echo mb_detect_encoding($str);

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
echo mb_detect_encoding($str, "auto");

/* Specify encoding_list character encoding by comma separated list */
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");

/* Use array to specify encoding_list  */
$ary[] = "ASCII";
$ary[] = "JIS";
$ary[] = "EUC-JP";
echo mb_detect_encoding($str, $ary);

See also: mb_detect_order().

上一頁 | 首頁 | 下一頁
mb_decode_numericentity | 上一層 | mb_detect_order


mb_encode_mimeheader

(PHP 4 >= 4.0.6)

mb_encode_mimeheader -- Encode string for MIME header

Description

string mb_encode_mimeheader ( string str [, string charset [, string transfer-encoding [, string linefeed]]])

mb_encode_mimeheader() converts string str to encoded-word for header field. It returns converted string in ASCII encoding.

charset is character encoding name. Default is ISO-2022-JP.

transfer-encoding is transfer encoding. It should be one of "B" (Base64) or "Q" (Quoted-Printable). Default is "B".

linefeed is end of line marker. Default is "\r\n" (CRLF).

例子 1. mb_convert_kana() example

$name = ""; // kanji
$mbox = "kru";
$doma = "gtinn.mon";
$addr = mb_encode_mimeheader($name, "UTF-7", "Q") . " <" . $mbox . "@" . $doma . ">";
echo $addr;

See also mb_decode_mimeheader().

上一頁 | 首頁 | 下一頁
mb_detect_order | 上一層 | mb_encode_numericentity


mb_http_input

(PHP 4 >= 4.0.6)

mb_http_input -- Detect HTTP input character encoding

Description

string mb_http_input ( [string type])

mb_http_input() returns result of HTTP input character encoding detection.

type: Input string specifies input type. "G" for GET, "P" for POST, "C" for COOKIE. If type is omitted, it returns last input type processed.

Return Value: Character encoding name. If mb_http_input() does not process specified HTTP input, it returns FALSE.

See also mb_internal_encoding(),
mb_http_output(),
mb_detect_order().

上一頁 | 首頁 | 下一頁
mb_get_info | 上一層 | mb_http_output


mb_http_output

(PHP 4 >= 4.0.6)

mb_http_output -- Set/Get HTTP output character encoding

Description

string mb_http_output ( [string encoding])

If encoding is set, mb_http_output() sets HTTP output character encoding to encoding. Output after this function is converted to encoding. mb_http_output() returns TRUE for success and FALSE for failure.

If encoding is omitted, mb_http_output() returns current HTTP output character encoding.

See also mb_internal_encoding(),
mb_http_input(),
mb_detect_order().

上一頁 | 首頁 | 下一頁
mb_http_input | 上一層 | mb_internal_encoding


mb_internal_encoding

(PHP 4 >= 4.0.6)

mb_internal_encoding -- Set/Get internal character encoding

Description

string mb_internal_encoding ( [string encoding])

mb_internal_encoding() sets internal character encoding to encoding If parameter is omitted, it returns current internal encoding.

encoding is used for HTTP input character encoding conversion, HTTP output character encoding conversion and default character encoding for string functions defined by mbstring module.

encoding: Character encoding name

Return Value: If encoding is set,mb_internal_encoding() returns TRUE for success, otherwise returns FALSE. If encoding is omitted, it returns current character encoding name.

例子 1. mb_internal_encoding() example

/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");

/* Display current internal character encoding */
echo mb_internal_encoding();

See also mb_http_input(),
mb_http_output(),
mb_detect_order().

上一頁 | 首頁 | 下一頁
mb_http_output | 上一層 | mb_language


mb_strcut

(PHP 4 >= 4.0.6)

mb_strcut -- Get part of string

Description

string mb_strcut ( string str, int start [, int length [, string encoding]])

mb_strcut() returns the portion of str specified by the start and length parameters.

mb_strcut() performs equivalent operation as mb_substr() with different method. If start position is multi-byte character's second byte or larger, it starts from first byte of multi-byte character.

It subtracts string from str that is shorter than length AND character that is not part of multi-byte string or not being middle of shift sequence.

encoding is character encoding. If it is not set, internal character encoding is used.

See also mb_substr(), mb_internal_encoding().

上一頁 | 首頁 | 下一頁
mb_split | 上一層 | mb_strimwidth


mb_strlen

(PHP 4 >= 4.0.6)

mb_strlen -- Get string length

Description

string mb_strlen ( string str [, string encoding])

mb_strlen() returns number of characters in string str having character encoding encoding. A multi-byte character is counted as 1.

encoding is character encoding for str. If encoding is omitted, internal character encoding is used.

See also mb_internal_encoding(), strlen().

上一頁 | 首頁 | 下一頁
mb_strimwidth | 上一層 | mb_strpos


mb_strpos

(PHP 4 >= 4.0.6)

mb_strpos -- Find position of first occurrence of string in a string

Description

int mb_strpos ( string haystack, string needle [, int offset [, string encoding]])

mb_strpos() returns the numeric position of the first occurrence of needle in the haystack string. If needle is not found, it returns FALSE.

mb_strpos() performs multi-byte safe strpos() operation based on number of characters. needle position is counted from the beginning of the haystack. First character's position is 0. Second character position is 1, and so on.

If encoding is omitted, internal character encoding is used. mb_strrpos() accepts string for needle where strrpos() accepts only character.

offset is search offset. If it is not specified, 0 is used.

encoding is character encoding name. If it is omitted, internal character encoding is used.

See also mb_strpos(),
mb_internal_encoding(),
strpos()

上一頁 | 首頁 | 下一頁
mb_strlen | 上一層 | mb_strrpos


mb_strrpos

(PHP 4 >= 4.0.6)

mb_strrpos -- Find position of last occurrence of a string in a string

Description

int mb_strrpos ( string haystack, string needle [, string encoding])

mb_strrpos() returns the numeric position of the last occurrence of needle in the haystack string. If needle is not found, it returns FALSE.

mb_strrpos() performs multi-byte safe strrpos() operation based on number of characters. needle position is counted from the beginning of haystack. First character's position is 0. Second character position is 1.

If encoding is omitted, internal encoding is assumed. mb_strrpos() accepts string for needle where strrpos() accepts only character.

encoding is character encoding. If it is not specified, internal character encoding is used.

See also mb_strpos(),
mb_internal_encoding(),
strrpos().

上一頁 | 首頁 | 下一頁
mb_strpos | 上一層 | mb_strwidth


mb_substr

(PHP 4 >= 4.0.6)

mb_substr -- Get part of string

Description

string mb_substr ( string str, int start [, int length [, string encoding]])

mb_substr() returns the portion of str specified by the start and length parameters.

mb_substr() performs multi-byte safe substr() operation based on number of characters. Position is counted from the beginning of str. First character's position is 0. Second character position is 1, and so on.

If encoding is omitted, internal encoding is assumed.

encoding is character encoding. If it is omitted, internal character encoding is used.

See also mb_strcut(), mb_internal_encoding().

上一頁 | 首頁 | 下一頁
mb_substitute_character | 上一層 | MCAL functions


method_exists

(PHP 4 )

method_exists -- Checks if the class method exists

Description

bool method_exists ( object object, string method_name)

This function returns TRUE if the method given by method_name has been defined for the given object, FALSE otherwise.

上一頁 | 首頁 | 下一頁
is_subclass_of | 上一層 | ClibPDF functions


microtime

(PHP 3, PHP 4 )

microtime -- 傳回當前 UNIX 時間戳和微秒數

說明

string microtime ( void)

傳回格式為“msec sec”的字串，其中 sec 是當前的 Unix 時間戳，msec 是微秒部分。本函式僅在支援 gettimeofday() 系統呼叫的操作系統下可用。

字串的兩部分都是以秒為單位傳回的。

例子 1. microtime() 例子

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
    }

$time_start = getmicrotime();

for ($i=0; $i < 1000; $i++){
    //do nothing, 1000 times
    }

$time_end = getmicrotime();
$time = $time_end - $time_start;

echo "Did nothing in $time seconds";

參見 time()。

上一頁 | 首頁 | 下一頁
localtime | 上一層 | mktime


ming_setcubicthreshold

(PHP 4 >= 4.0.5)

ming_setcubicthreshold -- Set cubic threshold (?)

Description

void ming_setcubicthreshold ( int threshold)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
Ming functions for Flash | 上一層 | ming_setscale


ming_setscale

(PHP 4 >= 4.0.5)

ming_setscale -- Set scale (?)

Description

void ming_setscale ( int scale)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
ming_setcubicthreshold | 上一層 | ming_useswfversion


mkdir

(PHP 3, PHP 4 )

mkdir -- Makes directory

Description

int mkdir ( string pathname, int mode)

Attempts to create the directory specified by pathname.

Note that you probably want to specify the mode as an octal number, which means it should have a leading zero. The mode is also modified by the current umask, which you can change using umask().

mkdir ("/path/to/my/dir", 0700);

如果成功則傳回 TRUE，失敗則傳回 FALSE。

See also rmdir().

上一頁 | 首頁 | 下一頁
lstat | 上一層 | move_uploaded_file


mktime

(PHP 3, PHP 4 )

mktime -- 取得一個日期的 UNIX 時間戳

說明

int mktime ( int hour, int minute, int second, int month, int day, int year [, int is_dst])

警告：注意參數的奇怪順序，這和標準的 UNIX mktime() 呼叫中的參數順序不同。在腳本經常會混淆這些值而出錯。

根據給出的參數傳回 Unix 時間戳。時間戳是一個長整數，包含了從 Unix 新紀元（1970 年 1 月 1 日）到給定時間的秒數。

參數可以從右向左省略，任何省略的參數會被設置成本地日期和時間的當前值。

is_dst 在夏令時可以被設為 1，如果不是則設為 0，或者不知道是否為夏令時的話設為 -1（預設值）。如果不知道，PHP 會嘗試自己判斷。這可能會產生未預期（但不是錯誤）的結果。

註: is_dst 是 3.0.10 版新加的。

mktime() 可以用來做日期計算和驗証，對於超出範圍的輸入它可以自動計算出正確的值來。例如，下面的每一行都會輸出字串“Jan-01-1998”。

例子 1. mktime() 例子

echo date ("M-d-Y", mktime (0,0,0,12,32,1997));
echo date ("M-d-Y", mktime (0,0,0,13,1,1997));
echo date ("M-d-Y", mktime (0,0,0,1,1,1998));
echo date ("M-d-Y", mktime (0,0,0,1,1,98));
Year 可以是兩位或四位數字，取值從 0-69 表示 2000-2069 以及 70-99 表示 1970-1999（在如今很常見的 time_t 是 32 位有符號整數的系統中，year 的有效範圍是 1902 到 2037）。

給定月份的最後一天可以表達為下個月的第 "0" 天，而不是 -1 天。下面兩個例子都將產生字串“The last day in Feb 2000 is: 29”。

例子 2. 每個月的最後一天

$lastday = mktime (0,0,0,3,0,2000);
echo strftime ("Last day in Feb 2000 is: %d", $lastday);

$lastday = mktime (0,0,0,4,-31,2000);
echo strftime ("Last day in Feb 2000 is: %d", $lastday);

年，月，日都等於零的日期被認為是非法的（否則會被當作 30.11.1999，這是很怪的行為）。

參見 date() 和 time()。

上一頁 | 首頁 | 下一頁
microtime | 上一層 | strftime


move_uploaded_file

(PHP 4 >= 4.0.3)

move_uploaded_file -- Moves an uploaded file to a new location

Description

bool move_uploaded_file ( string filename, string destination)

This function checks to ensure that the file designated by filename is a valid upload file (meaning that it was uploaded via PHP's HTTP POST upload mechanism). If the file is valid, it will be moved to the filename given by destination.

If filename is not a valid upload file, then no action will occur, and move_uploaded_file() will return FALSE.

If filename is a valid upload file, but cannot be moved for some reason, no action will occur, and move_uploaded_file() will return FALSE. Additionally, a warning will be issued.

This sort of check is especially important if there is any chance that anything done with uploaded files could reveal their contents to the user, or even to other users on the same system.

註: 當 安全模式（safe mode） 被啟動，PHP 將檢查您將要操作的文件或者目錄與正在執行的腳本是否有相同的 UID。

註: move_uploaded_file() is not affected by the normal safe-mode UID-restrictions. This is not unsafe because move_uploaded_file() only operates on files uploaded via PHP.

警告

If the destination file already exists, it will be overwritten.

See also is_uploaded_file(), and the section Handling file uploads for a simple usage example.

上一頁 | 首頁 | 下一頁
mkdir | 上一層 | parse_ini_file


msql_create_db

(PHP 3, PHP 4 )

msql_create_db -- Create mSQL database

Description

int msql_create_db ( string database name [, int link_identifier])

msql_create_db() attempts to create a new database on the server associated with the specified link identifier.

See also: msql_drop_db().

上一頁 | 首頁 | 下一頁
msql_connect | 上一層 | msql_createdb


msql_drop_db

(PHP 3, PHP 4 )

msql_drop_db -- Drop (delete) mSQL database

Description

int msql_drop_db ( string database_name, int link_identifier)

如果成功則傳回 TRUE，失敗則傳回 FALSE。

msql_drop_db() attempts to drop (remove) an entire database from the server associated with the specified link identifier.

See also: msql_create_db().

上一頁 | 首頁 | 下一頁
msql_dbname | 上一層 | msql_dropdb


msql_free_result

(PHP 3, PHP 4 )

msql_free_result -- Free result memory

Description

int msql_free_result ( int query_identifier)

msql_free_result() frees the memory associated with query_identifier. When PHP completes a request, this memory is freed automatically, so you only need to call this function when you want to make sure you don't use too much memory while the script is running.

上一頁 | 首頁 | 下一頁
msql_fieldtype | 上一層 | msql_freeresult


msql_list_dbs

(PHP 3, PHP 4 )

msql_list_dbs -- List mSQL databases on server

Description

int msql_list_dbs ( void)

msql_list_dbs() will return a result pointer containing the databases available from the current msql daemon. Use the msql_dbname() function to traverse this result pointer.

上一頁 | 首頁 | 下一頁
msql_freeresult | 上一層 | msql_list_fields


msql_list_fields

(PHP 3, PHP 4 )

msql_list_fields -- List result fields

Description

int msql_list_fields ( string database, string tablename)

msql_list_fields() retrieves information about the given tablename. Arguments are the database name and the table name. A result pointer is returned which can be used with msql_fieldflags(), msql_fieldlen(), msql_fieldname(), and msql_fieldtype(). A query identifier is a positive integer. The function returns -1 if a error occurs. A string describing the error will be placed in $phperrmsg, and unless the function was called as @msql_list_fields() then this error string will also be printed out.

See also msql_error().

上一頁 | 首頁 | 下一頁
msql_list_dbs | 上一層 | msql_list_tables


msql_list_tables

(PHP 3, PHP 4 )

msql_list_tables -- List tables in an mSQL database

Description

int msql_list_tables ( string database)

msql_list_tables() takes a database name and
result pointer much like the msql()
function. The msql_tablename() function should
be used to extract the actual table names from the result
pointer.

上一頁 | 首頁 | 下一頁
msql_list_fields | 上一層 | msql_listdbs


msql_num_fields

(PHP 3, PHP 4 )

msql_num_fields -- Get number of fields in result

Description

int msql_num_fields ( int query_identifier)

msql_num_fields() returns the number of fields in a result set.

See also: msql(),
msql_query(),
msql_fetch_field(), and
msql_num_rows().

上一頁 | 首頁 | 下一頁
msql_listtables | 上一層 | msql_num_rows


msql_num_rows

(PHP 3, PHP 4 )

msql_num_rows -- Get number of rows in result

Description

int msql_num_rows ( int query_identifier)

msql_num_rows() returns the number of rows in a result set.

See also: msql(),
msql_query(), and
msql_fetch_row().

上一頁 | 首頁 | 下一頁
msql_num_fields | 上一層 | msql_numfields


msql_pconnect

(PHP 3, PHP 4 )

msql_pconnect -- Open persistent mSQL connection

Description

int msql_pconnect ( [string server [, string username [, string password]]])

Returns a positive mSQL persistent link identifier on success, or FALSE on error.

msql_pconnect() acts very much like msql_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (msql_close() will not close links established by msql_pconnect()).

This type of links is therefore called 'persistent'.

上一頁 | 首頁 | 下一頁
msql_numrows | 上一層 | msql_query


msql_result

(PHP 3, PHP 4 )

msql_result -- Get result data

Description

int msql_result ( int query_identifier, int i, mixed field)

Returns the contents of the cell at the row and offset in the specified mSQL result set.

msql_result() returns the contents of one cell from a mSQL result set. The field argument can be the field's offset, or the field's name, or the field's table dot field's name (fieldname.tablename). If the column name has been aliased ('select foo as bar from ...'), use the alias instead of the column name.

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than msql_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.

Recommended high-performance alternatives:
msql_fetch_row(),
msql_fetch_array(), and
msql_fetch_object().

上一頁 | 首頁 | 下一頁
msql_regcase | 上一層 | msql_select_db


msql_select_db

(PHP 3, PHP 4 )

msql_select_db -- Select mSQL database

Description

int msql_select_db ( string database_name, int link_identifier)

Returns TRUE on success, FALSE on error.

msql_select_db() sets the current active database on the server that's associated with the specified link identifier. If no link identifier is specified, the last opened link is assumed. If no link is open, the function will try to establish a link as if msql_connect() was called, and use it.

Every subsequent call to msql_query() will be made on the active database.

See also: msql_connect(),
msql_pconnect(), and
msql_query().

上一頁 | 首頁 | 下一頁
msql_result | 上一層 | msql_selectdb


mssql_pconnect

(PHP 3, PHP 4 )

mssql_pconnect -- Open persistent MS SQL connection

Description

int mssql_pconnect ( [string servername [, string username [, string password]]])

Returns: A positive MS SQL persistent link identifier on success, or FALSE on error.

mssql_pconnect() acts very much like mssql_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (mssql_close() will not close links established by mssql_pconnect()).

This type of links is therefore called 'persistent'.

上一頁 | 首頁 | 下一頁
mssql_num_rows | 上一層 | mssql_query


mysql_create_db

(PHP 3, PHP 4 )

mysql_create_db -- Create a MySQL database

Description

bool mysql_create_db ( string database name [, resource link_identifier])

mysql_create_db() attempts to create a new database on the server associated with the specified link identifier.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

例子 1. MySQL create database example

<?php
    $link = mysql_pconnect("localhost", "mysql_user", "mysql_password")
        or exit("Could not connect");

    if (mysql_create_db("my_db")) {
        print ("Database created successfully\n");
    } else {
        printf ("Error creating database: %s\n", mysql_error ());
    }
?>

For downwards compatibility mysql_createdb() can also be used. This is deprecated, however.

註: The function mysql_create_db() is deprecated. It is preferable to use mysql_query() to issue a SQL CREATE DATABASE Statement instead.

See also: mysql_drop_db(), mysql_query().

上一頁 | 首頁 | 下一頁
mysql_connect | 上一層 | mysql_data_seek


mysql_db_query

(PHP 3, PHP 4 )

mysql_db_query -- Send a MySQL query

Description

resource mysql_db_query ( string database, string query [, resource link_identifier])

Returns a positive MySQL result resource to the query result, or FALSE on error. The function also returns TRUE/FALSE for INSERT/UPDATE/DELETE queries to indicate success/failure.

mysql_db_query() selects a database and executes a query on it. If the optional link identifier isn't specified, the function will try to find an open link to the MySQL server and if no such link is found it'll try to create one as if mysql_connect() was called with no arguments.

Be aware that this function does NOT switch back to the database you were connected before. In other words, you can't use this function to temporarily run a sql query on another database, you would have to manually switch back. Users are strongly encouraged to use the database.table syntax in their sql queries instead of this function.

See also mysql_connect() and mysql_query().

註: This function has been deprecated since PHP 4.0.6. Do not use this function. Use mysql_select_db() and mysql_query() instead.

上一頁 | 首頁 | 下一頁
mysql_db_name | 上一層 | mysql_drop_db


mysql_drop_db

(PHP 3, PHP 4 )

mysql_drop_db -- Drop (delete) a MySQL database

Description

bool mysql_drop_db ( string database_name [, resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

mysql_drop_db() attempts to drop (remove) an entire database from the server associated with the specified link identifier.

For downward compatibility mysql_dropdb() can also be used. This is deprecated, however.

註: The function mysql_drop_db() is deprecated. It is preferable to use mysql_query() to issue a SQL DROP DATABASE statement instead.

See also: mysql_create_db(), mysql_query().

上一頁 | 首頁 | 下一頁
mysql_db_query | 上一層 | mysql_errno


mysql_field_flags

(PHP 3, PHP 4 )

mysql_field_flags -- Get the flags associated with the specified field in a result

Description

string mysql_field_flags ( resource result, int field_offset)

mysql_field_flags() returns the field flags of the specified field. The flags are reported as a single word per flag separated by a single space, so that you can split the returned value using explode().

The following flags are reported, if your version of MySQL is current enough to support them: "not_null", "primary_key", "unique_key", "multiple_key", "blob", "unsigned", "zerofill", "binary", "enum", "auto_increment", "timestamp".

For downward compatibility mysql_fieldflags() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_fetch_row | 上一層 | mysql_field_len


mysql_field_len

(PHP 3, PHP 4 )

mysql_field_len -- Returns the length of the specified field

Description

int mysql_field_len ( resource result, int field_offset)

mysql_field_len() returns the length of the specified field.

For downward compatibility mysql_fieldlen() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_field_flags | 上一層 | mysql_field_name


mysql_field_name

(PHP 3, PHP 4 )

mysql_field_name -- Get the name of the specified field in a result

Description

string mysql_field_name ( resource result, int field_index)

mysql_field_name() returns the name of the specified field index. result must be a valid result identifier and field_index is the numerical offset of the field.

註: field_index starts at 0.

e.g. The index of the third field would actually be 2, the index of the fourth field would be 3 and so on.

例子 1. mysql_field_name() example

/* The users table consists of three fields:
 *   user_id
 *   username
 *   password.
 */
$link = mysql_connect('localhost', "mysql_user", "mysql_password");
mysql_select_db($dbname, $link)
    or die("Could not set $dbname");
$res = mysql_query("select * from users", $link);

echo mysql_field_name($res, 0) . "\n";
echo mysql_field_name($res, 2);

The above example would produce the following output:
user_id
password

For downwards compatibility mysql_fieldname() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_field_len | 上一層 | mysql_field_seek


mysql_field_table

(PHP 3, PHP 4 )

mysql_field_table -- Get name of the table the specified field is in

Description

string mysql_field_table ( resource result, int field_offset)

Returns the name of the table that the specifed field is in.

For downward compatibility mysql_fieldtable() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_field_seek | 上一層 | mysql_field_type


mysql_field_type

(PHP 3, PHP 4 )

mysql_field_type -- Get the type of the specified field in a result

Description

string mysql_field_type ( resource result, int field_offset)

mysql_field_type() is similar to the mysql_field_name() function. The arguments are identical, but the field type is returned instead. The field type will be one of "int", "real", "string", "blob", and others as detailed in the MySQL documentation.

例子 1. MySQL field types

<?php
    mysql_connect("localhost", "mysql_username", "mysql_password");
    mysql_select_db("mysql");
    $result = mysql_query("SELECT * FROM func");
    $fields = mysql_num_fields($result);
    $rows   = mysql_num_rows($result);
    $table = mysql_field_table($result, 0);
    echo "Your '".$table."' table has ".$fields." fields and ".$rows." record(s)\n";
    echo "The table has the following fields:\n";
    for ($i=0; $i < $fields; $i++) {
        $type  = mysql_field_type($result, $i);
        $name  = mysql_field_name($result, $i);
        $len   = mysql_field_len($result, $i);
        $flags = mysql_field_flags($result, $i);
        echo $type." ".$name." ".$len." ".$flags."\n";
    }
    mysql_free_result($result);
    mysql_close();
?>

The above example would produce the following output:

Your 'func' table has 4 fields and 1 record(s)
The table has the following fields:
string name 64 not_null primary_key binary
int ret 1 not_null
string dl 128 not_null
string type 9 not_null enum

For downward compatibility mysql_fieldtype() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_field_table | 上一層 | mysql_free_result


mysql_free_result

(PHP 3, PHP 4 )

mysql_free_result -- Free result memory

Description

bool mysql_free_result ( resource result)

mysql_free_result() will free all memory associated with the result identifier result.

mysql_free_result() only needs to be called if you are concerned about how much memory is being used for queries that return large result sets. All associated result memory is automatically freed at the end of the script's execution.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

For downward compatibility mysql_freeresult() can also be used. This is deprecated, however.

上一頁 | 首頁 | 下一頁
mysql_field_type | 上一層 | mysql_get_client_info


mysql_list_dbs

(PHP 3, PHP 4 )

mysql_list_dbs -- List databases available on a MySQL server

Description

resource mysql_list_dbs ( [resource link_identifier])

mysql_list_dbs() will return a result pointer containing the databases available from the current mysql daemon. Use the mysql_tablename() function to traverse this result pointer, or any function for result tables.

例子 1. mysql_list_dbs() example

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db_list = mysql_list_dbs($link);

while ($row = mysql_fetch_object($db_list)) {
    echo $row->Database . "\n";
}
?>

The above example would produce the following output:
database1
database2
database3
...

註: The above code would just as easily work with mysql_fetch_row() or other similar functions.

For downward compatibility mysql_listdbs() can also be used. This is deprecated however.

See also mysql_db_name().

上一頁 | 首頁 | 下一頁
mysql_insert_id | 上一層 | mysql_list_fields


mysql_list_fields

(PHP 3, PHP 4 )

mysql_list_fields -- List MySQL result fields

Description

resource mysql_list_fields ( string database_name, string table_name [, resource link_identifier])

mysql_list_fields() retrieves information
about the given table name. Arguments are the database name and
the table name. A result pointer is returned which can be used
with mysql_field_flags(),
mysql_field_len(),
mysql_field_name(), and
mysql_field_type().

例子 1. mysql_list_fields() example

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

$fields = mysql_list_fields("database1", "table1", $link);
$columns = mysql_num_fields($fields);

for ($i = 0; $i < $columns; $i++) {
    echo mysql_field_name($fields, $i) . "\n";
}

The above example would produce the following output:
field1
field2
field3
...

For downward compatibility mysql_listfields() can also be used. This is deprecated however.

上一頁 | 首頁 | 下一頁
mysql_list_dbs | 上一層 | mysql_list_processes


mysql_list_tables

(PHP 3, PHP 4 )

mysql_list_tables -- List tables in a MySQL database

Description

resource mysql_list_tables ( string database [, resource link_identifier])

mysql_list_tables() takes a database name and returns a result pointer much like the mysql_query() function. You can use the mysql_tablename() function to extract the actual table names from the result pointer, or any other result table function such as mysql_fetch_assoc().

The database parameter is the name of the database to retrieve the list of tables from. Upon failure, mysql_list_tables() returns FALSE.

For downward compatibility, the function alias named mysql_listtables() can be used. This is deprecated however and is not recommended.

例子 1. mysql_list_tables Example

<?php
    $dbname = 'mysql_dbname';

    if (!mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
        print 'Could not connect to mysql';
        exit;
    }

    $result = mysql_list_tables($dbname);

    if (!$result) {
        print "DB Error, could not list tables\n";
        print 'MySQL Error: ' . mysql_error();
        exit;
    }

    while ($row = mysql_fetch_row($result)) {
        print "Table: $row[0]\n";
    }

    mysql_free_result($result);
?>

See also: mysql_list_dbs(), and mysql_tablename().

上一頁 | 首頁 | 下一頁
mysql_list_processes | 上一層 | mysql_num_fields


mysql_num_fields

(PHP 3, PHP 4 )

mysql_num_fields -- Get number of fields in result

Description

int mysql_num_fields ( resource result)

mysql_num_fields() returns the number of fields in a result set.

See also:
mysql_select_db(),
mysql_query(),
mysql_fetch_field(),
mysql_num_rows().

For downward compatibility mysql_numfields() can also be used. This is deprecated however.

上一頁 | 首頁 | 下一頁
mysql_list_tables | 上一層 | mysql_num_rows


mysql_num_rows

(PHP 3, PHP 4 )

mysql_num_rows -- Get number of rows in result

Description

int mysql_num_rows ( resource result)

mysql_num_rows() returns the number of rows in a result set. This command is only valid for SELECT statements. To retrieve the number of rows affected by a INSERT, UPDATE or DELETE query, use mysql_affected_rows().

例子 1. mysql_num_rows() example

<?php

$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result);

echo "$num_rows Rows\n";

?>

註: If you use mysql_unbuffered_query(), mysql_num_rows() will not return the correct value until all the rows in the result set have been retrieved.

See also:
mysql_affected_rows(),
mysql_connect(),
mysql_data_seek(),
mysql_select_db(), and
mysql_query().

For downward compatibility mysql_numrows() can also be used. This is deprecated however.

上一頁 | 首頁 | 下一頁
mysql_num_fields | 上一層 | mysql_pconnect


mysql_pconnect

(PHP 3, PHP 4 )

mysql_pconnect -- Open a persistent connection to a MySQL server

Description

resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]])

Returns a positive MySQL persistent link identifier on success, or FALSE on error.

mysql_pconnect() establishes a connection to a MySQL server. The following defaults are assumed for missing optional parameters: server = 'localhost:3306', username = name of the user that owns the server process and password = empty password. The client_flags parameter can be a combination of the constants MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE or MYSQL_CLIENT_INTERACTIVE.

The server parameter can also include a port number. eg. "hostname:port" or a path to a socket eg. ":/path/to/socket" for the localhost.

註: Support for ":port" was added in 3.0B4.

Support for the ":/path/to/socket" was added in 3.0.10.

mysql_pconnect() acts very much like mysql_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (mysql_close() will not close links established by mysql_pconnect()).

The optional client_flags parameter became available in PHP 4.3.0.

This type of link is therefore called 'persistent'.

註: Note, that these kind of links only work if you are using a module version of PHP. See the Persistent Database Connections section for more information.

警告

Using persistent connections can require a bit of tuning of your Apache and MySQL configurations to ensure that you do not exceed the number of connections allowed by MySQL.

上一頁 | 首頁 | 下一頁
mysql_num_rows | 上一層 | mysql_ping


mysql_result

(PHP 3, PHP 4 )

mysql_result -- Get result data

Description

mixed mysql_result ( resource result, int row [, mixed field])

mysql_result() returns the contents of one cell from a MySQL result set. The field argument can be the field's offset, or the field's name, or the field's table dot field name (tablename.fieldname). If the column name has been aliased ('select foo as bar from...'), use the alias instead of the column name.

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than mysql_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.

Calls to mysql_result() should not be mixed with calls to other functions that deal with the result set.

Recommended high-performance alternatives:
mysql_fetch_row(),
mysql_fetch_array(), and
mysql_fetch_object().

上一頁 | 首頁 | 下一頁
mysql_real_escape_string | 上一層 | mysql_select_db


mysql_select_db

(PHP 3, PHP 4 )

mysql_select_db -- Select a MySQL database

Description

bool mysql_select_db ( string database_name [, resource link_identifier])

如果成功則傳回 TRUE，失敗則傳回 FALSE。

mysql_select_db() sets the current active database on the server that's associated with the specified link identifier. If no link identifier is specified, the last opened link is assumed. If no link is open, the function will try to establish a link as if mysql_connect() was called without arguments, and use it.

Every subsequent call to mysql_query() will be made on the active database.

See also:
    mysql_connect(),
    mysql_pconnect(), and
    mysql_query().

For downward compatibility mysql_selectdb() can also be used. This is deprecated however.

上一頁 | 首頁 | 下一頁
mysql_result | 上一層 | mysql_stat


natcasesort

(PHP 4 )

natcasesort -- 用“自然排序”算法對陣列進行不區分大小寫字母的排序

說明

void natcasesort ( array array)

本函式實現了一個和人們通常對字母數字字串進行排序的方法一樣的排序算法，這被稱為“自然排序”。

natcasesort() 是 natsort() 函式的不區分大小寫字母的版本。見 natsort() 中說明本算法和通常的計算機字串排序算法的區別的例子。

更多訊息見 Martin Pool 的 Natural Order String Comparison 頁面。

參見 sort()，natsort()，strnatcmp() 和 strnatcasecmp()。

上一頁 | 首頁 | 下一頁
list | 上一層 | natsort


natsort

(PHP 4 )

natsort -- 用“自然排序”算法對陣列排序

說明

void natsort ( array array)

本函式實現了一個和人們通常對字母數字字串進行排序的方法一樣的排序算法，這被稱為“自然排序”。本算法和通常的計算機字串排序算法（用於 sort()）的區別示例如下：

例子 1. natsort() 例子

<?php
$array1 = $array2 = array ("img12.png", "img10.png", "img2.png", "img1.png");

sort($array1);
echo "Standard sorting\n";
print_r($array1);

natsort($array2);
echo "\nNatural order sorting\n";
print_r($array2);
?>

以上代碼顯示結果為：

Standard sorting
Array
(
    [0] => img1.png
    [1] => img10.png
    [2] => img12.png
    [3] => img2.png
)

Natural order sorting
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)
更多訊息見 Martin Pool 的 Natural Order String Comparison 頁面。

註: 如果你想保持索引／值的關聯，考慮使用 usort($arr, 'strnatcmp')。

參見 natcasesort()，strnatcmp() 和 strnatcasecmp()。

上一頁 | 首頁 | 下一頁
natcasesort | 上一層 | next


next

(PHP 3, PHP 4 )

next -- 將陣列中的內部指針向前移動一位

說明

mixed next ( array array)

傳回陣列內部指針指向的下一個單元，或當沒有更多單元時傳回 FALSE。

next() 和 current() 的行為類似，只有一點區別，在傳回值之前將內部指針向前移動一位。這意味著它傳回的是下一個陣列單元並將陣列指針向前移動了一位。如果移動指針的結果是超出了陣列單元的末端，則 next() 傳回 FALSE。

警告

如果陣列包含空的單元，或者單元的值是 0 則本函式碰到這些單元也傳回 FALSE。要正確遍歷可能含有空單元或者單元值為 0 的陣列，參見 each() 函式。

參見 current()，end()，prev() 和 reset()。

上一頁 | 首頁 | 下一頁
natsort | 上一層 | pos


OCICollAppend

(PHP 4 >= 4.0.6)

OCICollAppend -- Coming soon

Description

string OCICollAppend ( object collection, object object)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICancel | 上一層 | OCICollAssign


OCICollAssign

(PHP 4 >= 4.0.6)

OCICollAssign -- Coming soon

Description

string OCICollAssign ( object collection, object object)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollAppend | 上一層 | OCICollAssignElem


OCICollAssignElem

(PHP 4 >= 4.0.6)

OCICollAssignElem -- Coming soon

Description

string OCICollAssignElem ( object collection, string ndx, string val)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollAssign | 上一層 | OCICollGetElem


OCICollGetElem

(PHP 4 >= 4.0.6)

OCICollGetElem -- Coming soon

Description

string OCICollGetElem ( object collection, string ndx)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollAssignElem | 上一層 | OCICollMax


OCICollMax

(PHP 4 >= 4.0.6)

OCICollMax -- Coming soon

Description

string OCICollMax ( object collection)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollGetElem | 上一層 | OCICollSize


OCICollSize

(PHP 4 >= 4.0.6)

OCICollSize -- Coming soon

Description

string OCICollSize ( object collection)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollMax | 上一層 | OCICollTrim


OCICollTrim

(PHP 4 >= 4.0.6)

OCICollTrim -- Coming soon

Description

string OCICollTrim ( object collection, int num)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCICollSize | 上一層 | OCIColumnIsNULL


OCIFreeDesc

(PHP 4 )

OCIFreeDesc -- Deletes a large object descriptor

Description

int OCIFreeDesc ( object lob)

OCIFreeDesc() returns TRUE if successful, or FALSE if unsuccessful.

上一頁 | 首頁 | 下一頁
OCIFreeCursor | 上一層 | OCIFreeStatement


OCIFreeStatement

(PHP 3>= 3.0.5, PHP 4 )

OCIFreeStatement -- Free all resources associated with a statement

Description

int OCIFreeStatement ( int stmt)

OCIFreeStatement() returns TRUE if successful, or FALSE if unsuccessful.

上一頁 | 首頁 | 下一頁
OCIFreeDesc | 上一層 | OCIInternalDebug


OCILoadLob

(PHP 4 )

OCILoadLob -- Coming soon

Description

string OCILoadLob ( object lob)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCIInternalDebug | 上一層 | OCILogOff


OCIPLogon

(PHP 3>= 3.0.8, PHP 4 )

OCIPLogon -- Connect to an Oracle database using a persistent connection

Description

int OCIPLogon ( string username, string password [, string db])

OCIPLogon() creates a persistent connection to an Oracle 8 database and logs on. The optional third parameter can either contain the name of the local Oracle instance or the name of the entry in tnsnames.ora to which you want to connect. If the optional third parameter is not specified, PHP uses the environment variables ORACLE_SID (Oracle instance) or TWO_TASK (tnsnames.ora) to determine which database to connect to.

See also OCILogon() and OCINLogon().

上一頁 | 首頁 | 下一頁
OCIParse | 上一層 | OCIResult


OCISaveLob

(PHP 4 )

OCISaveLob -- Coming soon

Description

string OCISaveLob ( object lob)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCIRowCount | 上一層 | OCISaveLobFile


OCISaveLobFile

(PHP 4 )

OCISaveLobFile -- Coming soon

Description

string OCISaveLobFile ( object lob)

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCISaveLob | 上一層 | OCIServerVersion


OCIWriteLobToFile

(PHP 4 )

OCIWriteLobToFile -- Coming soon

Description

void OCIWriteLobToFile ( object lob [, string filename [, int start [, int lenght]]])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
OCIStatementType | 上一層 | OpenSSL functions


odbc_exec

(PHP 3>= 3.0.6, PHP 4 )

odbc_exec -- Prepare and execute a SQL statement

Description

resource odbc_exec ( resource connection_id, string query_string)

Returns FALSE on error. Returns an ODBC result identifier if the SQL command was executed successfully.

odbc_exec() will send an SQL statement to the database server specified by connection_id. This parameter must be a valid identifier returned by odbc_connect() or odbc_pconnect().

See also: odbc_prepare() and odbc_execute() for multiple execution of SQL statements.

上一頁 | 首頁 | 下一頁
odbc_errormsg | 上一層 | odbc_execute


odbc_field_len

(PHP 3>= 3.0.6, PHP 4 )

odbc_field_len -- Get the length (precision) of a field

Description

int odbc_field_len ( resource result_id, int field_number)

odbc_field_len() will return the length of the field referecend by number in the given ODBC result identifier. Field numbering starts at 1.

See also: odbc_field_scale() to get the scale of a floating point number.

上一頁 | 首頁 | 下一頁
odbc_fetch_row | 上一層 | odbc_field_name


odbc_pconnect

(PHP 3>= 3.0.6, PHP 4 )

odbc_pconnect -- Open a persistent database connection

Description

int odbc_pconnect ( string dsn, string user, string password [, int cursor_type])

Returns an ODBC connection id or 0 (FALSE) on error. This function is much like odbc_connect(), except that the connection is not really closed when the script has finished. Future requests for a connection with the same dsn, user, password combination (via odbc_connect() and odbc_pconnect()) can reuse the persistent connection.

註: Persistent connections have no effect if PHP is used as a CGI program.

For information about the optional cursor_type parameter see the odbc_connect() function. For more information on persistent connections, refer to the PHP FAQ.

上一頁 | 首頁 | 下一頁
odbc_num_rows | 上一層 | odbc_prepare


opendir

(PHP 3, PHP 4 )

opendir -- 打開目錄句柄

說明

resource opendir ( string path)

傳回一個目錄句柄，可以在之後用在 closedir()，readdir() 和 rewinddir() 呼叫中。

如果 path 不是一個合法的目錄或者因為權限限制或文件系統錯誤而不能打開目錄，opendir() 傳回 FALSE 並產生一個 PHP 錯誤訊息。可以在 opendir() 前面加上“@”符號來抑制錯誤訊息的輸出。

例子 1. opendir() 例子

<?php

if ($dir = @opendir("/tmp")) {
  while (($file = readdir($dir)) !== false) {
    echo "$file\n";
  }
  closedir($dir);
}

?>

參見 is_dir()。

上一頁 | 首頁 | 下一頁
getcwd | 上一層 | readdir


Ora_pLogon

(PHP 3, PHP 4 )

Ora_pLogon -- 打開一個持久的 Oracle 連接

描述

int ora_plogon ( string user, string password)

用給定的用戶名和密碼在 PHP 和一個 Oracle 資料庫之間建立一個持久的連接。

參見 ora_logon()。

上一頁 | 首頁 | 下一頁
Ora_Parse | 上一層 | Ora_Rollback


parse_ini_file

(PHP 4 )

parse_ini_file -- Parse a configuration file

Description

array parse_ini_file ( string filename [, bool process_sections])

parse_ini_file() loads in the ini file specified in filename, and returns the settings in it in an associative array. By setting the last process_sections parameter to TRUE, you get a multidimensional array, with the section names and settings included. The default for process_sections is FALSE

註: This function has nothing to do with the php.ini file. It is already processed, the time you run your script. This function can be used to read in your own application's configuration files.

註: If a value in the ini file contains any non-alphanumeric characters it needs to be enclosed in double-quotes (").

註: Since PHP 4.2.1 this function is also affected by safe_mode and open_basedir.

The structure of the ini file is similar to that of the php.ini's.

警告

If the ini file you are trying to parse is malformed, PHP will exit.

例子 1. Contents of sample.ini

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5

[second_section]
path = /usr/local/bin
URL = "http://www.example.com/~username"

例子 2. parse_ini_file() example

<?php

// Parse without sections
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);

// Parse with sections
$ini_array = parse_ini_file("sample.ini", TRUE);
print_r($ini_array);

?>

Would produce:

Array
(
    [one] => 1
    [five] => 5
    [path] => /usr/local/bin
    [URL] => http://www.example.com/~username
)
Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

)

上一頁 | 首頁 | 下一頁
move_uploaded_file | 上一層 | pathinfo


passthru

(PHP 3, PHP 4 )

passthru -- Execute an external program and display raw output

Description

void passthru ( string command [, int return_var])

The passthru() function is similar to the exec() function in that it executes a command. If the return_var argument is present, the return status of the Unix command will be placed here. This function should be used in place of exec() or system() when the output from the Unix command is binary data which needs to be passed directly back to the browser. A common use for this is to execute something like the pbmplus utilities that can output an image stream directly. By setting the Content-type to image/gif and then calling a pbmplus program to output a gif, you can create PHP scripts that output images directly.

警告

If you are going to allow data coming from user input to be passed to this function, then you should be using escapeshellarg() or escapeshellcmd() to make sure that users cannot trick the system into executing arbitrary commands.

註: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.

See also exec(), system(), popen(), escapeshellcmd(), and the backtick operator.

上一頁 | 首頁 | 下一頁
exec | 上一層 | proc_close


pathinfo

(PHP 4 >= 4.0.3)

pathinfo -- Returns information about a file path

Description

array pathinfo ( string path)

pathinfo() returns an associative array containing information about path. The following array elements are returned: dirname, basename and extension.

例子 1. pathinfo() Example

<?php

$path_parts = pathinfo("/www/htdocs/index.html");

echo $path_parts["dirname"] . "\n";
echo $path_parts["basename"] . "\n";
echo $path_parts["extension"] . "\n";

?>

Would produce:

/www/htdocs
index.html
html

See also dirname(),
basename(), parse_url()
and realpath().

上一頁 | 首頁 | 下一頁
parse_ini_file | 上一層 | pclose


pclose

(PHP 3, PHP 4 )

pclose -- Closes process file pointer

Description

int pclose ( int fp)

Closes a file pointer to a pipe opened by popen().

The file pointer must be valid, and must have been returned by a successful call to popen().

Returns the termination status of the process that was run.

See also popen().

上一頁 | 首頁 | 下一頁
pathinfo | 上一層 | popen


pcntl_wtermsig

(PHP 4 >= 4.1.0)

pcntl_wtermsig -- Returns the signal which caused the child to terminate

Description

int pcntl_wtermsig ( int status)

Returns the number of the signal that caused the child process to terminate. This function is only useful if pcntl_wifsignaled() returned TRUE.

The parameter status is the status parameter supplied to a successfull call to pcntl_waitpid().

See also pcntl_waitpid(),
pcntl_signal() and
pcntl_wifsignaled().

上一頁 | 首頁 | 下一頁
pcntl_wstopsig | 上一層 | Program Execution functions


pdf_add_bookmark

(PHP 4 >= 4.0.1)

pdf_add_bookmark -- Adds bookmark for current page

Description

int pdf_add_bookmark ( int pdf object, string text [, int parent [, int open]])

Add a nested bookmark under parent, or a new top-level bookmark if parent = 0. Returns a bookmark descriptor which may be used as parent for subsequent nested bookmarks. If open = 1, child bookmarks will be folded out, and invisible if open = 0.

上一頁 | 首頁 | 下一頁
pdf_add_annotation | 上一層 | pdf_add_launchlink


pdf_translate

(PHP 3>= 3.0.6, PHP 4 )

pdf_translate -- Sets origin of coordinate system

Description

void pdf_translate ( int pdf object, float tx, float ty)

Translate the origin of the coordinate system.

上一頁 | 首頁 | 下一頁
pdf_stroke | 上一層 | Verisign Payflow Pro functions


pfsockopen

(PHP 3>= 3.0.7, PHP 4 )

pfsockopen -- Open persistent Internet or Unix domain socket connection

Description

int pfsockopen ( string hostname, int port [, int errno [, string errstr [, int timeout]]])

This function behaves exactly as fsockopen() with the difference that the connection is not closed after the script finishes. It is the persistent version of fsockopen().

上一頁 | 首頁 | 下一頁
openlog | 上一層 | socket_get_status


pg_client_encoding

(PHP 3 CVS only, PHP 4 >= 4.0.3)

pg_client_encoding -- 取得客戶端編碼方式

說明

string pg_client_encoding ( [resource connection])

pg_client_encoding() 以字串形式傳回客戶端編碼。所傳回的字串為以下之一：SQL_ASCII，EUC_JP，EUC_CN，EUC_KR，EUC_TW，UNICODE，MULE_INTERNAL，LATINX (X=1...9)，KOI8，WIN，ALT，SJIS，BIG5，WIN1250。

註: 本函式需要 PHP-4.0.3 或以上版本以及 PostgreSQL-7.0 或以上版本。如果在編譯 libpq 時沒有加入多字節編碼支援，則 pg_set_client_encoding() 總是傳回 "SQL_ASCII"。所支援的編碼方式取決於 PostgreSQL 的版本。詳情參見 PostgreSQL 手冊如何加入多字節支援以及所支援的編碼方式。

本函式以前被稱為 pg_clientencoding()。

參見 pg_set_client_encoding()。

上一頁 | 首頁 | 下一頁
pg_cancel_query | 上一層 | pg_close


pg_pconnect

(PHP 3, PHP 4 )

pg_pconnect -- 打開一個持久的 PostgreSQL 連接

說明

resource pg_pconnect ( string connection_string)

pg_pconnect() 打開一個到 PostgreSQL 資料庫的持久連接。傳回其它 PostgreSQL 函式所需要的連接資源號。

connection_string 參數的定義見 pg_connect()。

要打開持久連接功能，php.ini 中的 pgsql.allow_persistent 參數必須為 "On"（也是預設值）。 最大持久連接數目由 php.ini 中的 pgsql.max_persistent 參數定義（預定為 -1 表示沒有限制）。所有連接的數目可由 php.ini 中的 pgsql.max_links 參數設置。

pg_close() 不能關閉由 pg_pconnect() 打開的持久連接。

參見 pg_connect()。

上一頁 | 首頁 | 下一頁
pg_options | 上一層 | pg_ping


pg_set_client_encoding

(PHP 3 CVS only, PHP 4 >= 4.0.3)

pg_set_client_encoding -- 設定客戶端編碼

說明

int pg_set_client_encoding ( [resource connection, string encoding])

pg_set_client_encoding() 設定客戶端編碼方式，成功傳回 0，出錯傳回 -1。

encoding 是客戶端的編碼方式，可以為：SQL_ASCII，EUC_JP，EUC_CN，EUC_KR，EUC_TW，UNICODE，MULE_INTERNAL，LATINX (X=1...9)，KOI8，WIN，ALT，SJIS，BIG5，WIN1250。可用的編碼取決於 PostgreSQL 和 libpq 的版本。參考 PostgreSQL 手冊查看你的 PostgreSQL 所支援的編碼方式。

註: 本函式需要 PHP 4.0.3 或以上版本以及 PostgreSQL 7.0 或以上版本。所支援的編碼方式取決於 PostgreSQL 的版本，詳情參考 PostgreSQL 手冊。

本函式以前的名字為 pg_setclientencoding()。

參見 pg_client_encoding()。

上一頁 | 首頁 | 下一頁
pg_send_query | 上一層 | pg_trace


phpinfo

(PHP 3, PHP 4 )

phpinfo -- Outputs lots of PHP information

Description

int phpinfo ( [int what])

Outputs a large amount of information about the current state of PHP. This includes information about PHP compilation options and extensions, the PHP version, server information and environment (if compiled as a module), the PHP environment, OS version information, paths, master and local values of configuration options, HTTP headers, and the PHP License.

Because every system is setup differently, phpinfo() is commonly used to check configuration settings and for available predefined variables on a given system. Also, phpinfo() is a valuable debugging tool as it contains all EGPCS (Environment, GET, POST, Cookie, Server) data.

The output may be customized by passing one or more of the following constants bitwise values summed together in the optional what parameter. One can also combine the respective constants or bitwise values together with the or operator.

表格 1. phpinfo() options

Name (constant) | Value | Description
INFO_GENERAL | 1 | The configuration line, php.ini location, build date, Web Server, System and more.
INFO_CREDITS | 2 | PHP 4 Credits. See also phpcredits().
INFO_CONFIGURATION | 4 | Current Local and Master values for php directives. See also ini_get().
INFO_MODULES | 8 | Loaded modules and their respective settings.
INFO_ENVIRONMENT | 16 | Environment Variable information that's also available in $_ENV.
INFO_VARIABLES | 32 | Shows all predefined variables from EGPCS (Environment, GET, POST, Cookie, Server).
INFO_LICENSE | 64 | PHP License information. See also the license faq.
INFO_ALL | -1 | Shows all of the above. This is the default value.

例子 1. phpinfo() examples

<?php

// Show all information, defaults to INFO_ALL
phpinfo();

// Show just the module information.
// phpinfo(8) yields identical results.
phpinfo(INFO_MODULES);

?>

註: Parts of the information displayed are disabled when the expose_php configuration setting is set to off. This includes the PHP and Zend logos, and the credits.

See also: phpversion(),
phpcredits(),
php_logo_guid(), ini_get(),
ini_set(), and the section on Predefined
Variables.

上一頁 | 首頁 | 下一頁
phpcredits | 上一層 | phpversion


popen

(PHP 3, PHP 4 )

popen -- Opens process file pointer

Description

int popen ( string command, string mode)

Opens a pipe to a process executed by forking the command given by command.

Returns a file pointer identical to that returned by fopen(), except that it is unidirectional (may only be used for reading or writing) and must be closed with pclose(). This pointer may be used with fgets(), fgetss(), and fputs().

If an error occurs, returns FALSE.

$fp = popen ("/bin/ls", "r");

註: If the command to be executed could not be found, a valid resource is returned. This may seem odd, but makes sense; it allows you to access any error message returned by the shell:

<?php
error_reporting(E_ALL);

/* Add redirection so we can get stderr. */
$fp = popen('/path/to/spooge 2>&1', 'r');
echo "'$fp'; " . gettype($fp) . "\n";
$read = fread($fp, 2096);
echo $read;
pclose($fp);
?>

See also pclose().

上一頁 | 首頁 | 下一頁
pclose | 上一層 | readfile


pos

(PHP 3, PHP 4 )

pos -- 得到陣列當前的單元

說明

mixed pos ( array array)

本函式是 current() 的別名。

參見 end()，next()，prev() 和 reset()。

上一頁 | 首頁 | 下一頁
next | 上一層 | prev


preg_split

(PHP 3>= 3.0.9, PHP 4 )

preg_split -- Split string by a regular expression

Description

array preg_split ( string pattern, string subject [, int limit [, int flags]])

註: Parameter flags was added in PHP 4 Beta 3.

Returns an array containing substrings of subject split along boundaries matched by pattern.

If limit is specified, then only substrings up to limit are returned, and if limit is -1, it actually means "no limit", which is useful for specifying the flags.

flags can be any combination of the following flags (combined with bitwise | operator):

PREG_SPLIT_NO_EMPTY

If this flag is set, only non-empty pieces will be returned by preg_split().

PREG_SPLIT_DELIM_CAPTURE

If this flag is set, parenthesized expression in the delimiter pattern will be captured and returned as well. This flag was added for 4.0.5.

PREG_SPLIT_OFFSET_CAPTURE

If this flag is set, for every occuring match the appendant string offset will also be returned. Note that this changes the return value in an array where every element is an array consisting of the matched string at offset 0 and it's string offset into subject at offset 1. This flag is available since PHP 4.3.0 .

例子 1. preg_split() example : Get the parts of a search string.

// split the phrase by any number of commas or space characters,
// which include " ", \r, \t, \n and \f
$keywords = preg_split ("/[\s,]+/", "hypertext language, programming");

例子 2. Splitting a string into component characters.

$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);

例子 3. Splitting a string into matches and their offsets.

$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);

will yield

Array
(
    [0] => Array
        (
            [0] => hypertext
            [1] => 0
        )

    [1] => Array
        (
            [0] => language
            [1] => 10
        )

    [2] => Array
        (
            [0] => programming
            [1] => 19
        )

)

See also
spliti(),
split(),
implode(),
 preg_match(),
preg_match_all(), and
preg_replace().

上一頁 | 首頁 | 下一頁
preg_replace | 上一層 | qtdom functions


prev

(PHP 3, PHP 4 )

prev -- 將陣列的內部指針倒回一位

說明

mixed prev ( array array)

傳回陣列內部指針指向的前一個單元，或當沒有更多單元時傳回 FALSE。

警告

如果陣列包含空的單元，或者單元的值是 0 則本函式碰到這些單元也傳回 FALSE。要正確遍歷可能含有空單元或者單元值為 0 的陣列，參見 each() 函式。

prev() 和 next() 的行為類似，只除了它將內部指針倒回一位而不是前移一位。

參見 current()，end()，next() 和 reset()。

上一頁 | 首頁 | 下一頁
pos | 上一層 | range


print

(PHP 3, PHP 4 )

print -- Output a string

Description

print ( string arg)

Outputs arg. 如果成功則傳回 TRUE，失敗則傳回 FALSE。

print() is not actually a real function (it is a language construct) so you are not required to use parentheses with it.

例子 1. print() examples

<?php
print("Hello World");

print "print() also works without parentheses.";

print "This spans
multiple lines. The newlines will be
output as well";

print "This spans\nmultiple lines. The newlines will be\noutput as well.";

print "escaping characters is done \"Like this\".";

// You can use variables inside of an print statement
$foo = "foobar";
$bar = "barbaz";

print "foo is $foo"; // foo is foobar

// Using single quotes will print the variable name, not the value
print 'foo is $foo'; // foo is $foo

// If you are not using any other characters, you can just print variables
print $foo;          // foobar

print <<<END
This uses the "here document" syntax to output
multiple lines with $variable interpolation. Note
that the here document terminator must appear on a
line with just a semicolon no extra whitespace!
END;
?>

See also echo(), printf(), and flush().

上一頁 | 首頁 | 下一頁
parse_str | 上一層 | printf


proc_close

(PHP 4 CVS only)

proc_close -- Close a process opened by proc_open and return the exit code of that process.

Description

int proc_close ( resource process)

proc_close() is similar to pclose() except that it only works on processes opened by proc_open(). proc_close() waits for the process to terminate, and returns it's exit code. If you have open pipes to that process, you should fclose() them prior to calling this function in order to avoid a deadlock - the child process may not be able to exit while the pipes are open.

上一頁 | 首頁 | 下一頁
passthru | 上一層 | proc_open


proc_open

(PHP 4 CVS only)

proc_open -- Execute a command and open file pointers for input/output

Description

resource proc_open ( string cmd, array descriptorspec, array pipes)

proc_open() is similar to popen() but provides a much greater degree of control over the program execution. cmd is the command to be executed by the shell. descriptorspec is an indexed array where the key represents the descriptor number and the value represents how PHP will pass that descriptor to the child process. pipes will be set to an indexed array of file pointers that correspond to PHP's end of any pipes that are created. The return value is a resource representing the process; you should free it using proc_close() when you are finished with it.

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "/tmp/error-output.txt", "a"), // stderr is a file to write to
);
$process = proc_open("php", $descriptorspec, $pipes);
if (is_resource($process)) {
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // Any error output will be appended to /tmp/error-output.txt

    fwrite($pipes[0], "<?php echo \"Hello World!\"; ?>");
    fclose($pipes[0]);

    while(!feof($pipes[1])) {
        echo fgets($pipes[1], 1024);
    }
    fclose($pipes[1]);
    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}

The file descriptor numbers in descriptorspec are not limited to 0, 1 and 2 - you may specify any valid file descriptor number and it will be passed to the child process. This allows your script to interoperate with other scripts that run as "co-processes". In particular, this is useful for passing passphrases to programs like PGP, GPG and openssl in a more secure manner. It is also useful for reading status information provided by those programs on auxillary file descriptors.

註: Windows compatibility: Descriptors beyond 2 (stderr) are made available to the child process as inheritable handles, but since the Windows architecture does not associate file descriptor numbers with low-level handles, the child process does not (yet) have a means of accessing those handles. Stdin, stdout and stderr work as expected.

註: This function was introduced in PHP 4.3.0.

註: If you only need a uni-directional (one-way) process pipe, use popen() instead, as it is much easier to use.

See also exec(), system(),
passthru(), popen(),
escapeshellcmd(), and the backtick operator.

上一頁 | 首頁 | 下一頁
proc_close | 上一層 | shell_exec


putenv

(PHP 3, PHP 4 )

putenv -- Sets the value of an environment variable

Description

void putenv ( string setting)

Adds setting to the server environment. The environment variable will only exist for the duration of the current request. At the end of the request the environment is restored to its original state.

Setting certain environment variables may be a potential security breach. The safe_mode_allowed_env_vars directive contains a comma-delimited list of prefixes. In Safe Mode, the user may only alter environment variables whose names begin with the prefixes supplied by this directive. By default, users will only be able to set environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive is empty, PHP will let the user modify ANY environment variable!

The safe_mode_protected_env_vars directive contains a comma-delimited list of environment variables, that the end user won't be able to change using putenv(). These variables will be protected even if safe_mode_allowed_env_vars is set to allow to change them.

警告

These directives have only effect when safe-mode itself is enabled!

例子 1. Setting an Environment Variable

putenv ("UNIQID=$uniqid");

See also getenv().

上一頁 | 首頁 | 下一頁
phpversion | 上一層 | set_magic_quotes_runtime


range

(PHP 3>= 3.0.8, PHP 4 )

range -- 建立一個包含指定範圍單元的陣列

說明

array range ( mixed low, mixed high)

range() 傳回陣列中從 low 到 high 的單元，包括它們本身。如果 low > high，則序列將從 high 到 low。

例子 1. range() 例子

foreach(range(0, 9) as $number) {
    echo $number;
}
foreach(range('a', 'z') as $letter) {
    echo $letter;
}
foreach(range('z', 'a') as $letter) {
    echo $letter;
}

註: 在版本 4.1.0 之前 range() 函式只產生遞增的整數陣列。對於字元序列和遞減陣列的支援是 4.1.0 加入的。

例子 2. 模擬遞減序列和字元序列

# array_reverse 可以用來調換 range 的順序
foreach(array_reverse(range(0,9)) as $number) {
    echo $number;
}

# array_map() 可以用 chr() 將整數轉換成字元
foreach(array_map('chr', range(ord('a'),ord('z'))) as $character) {
    echo $character;
}

另一個使用的例子參見 shuffle()。

上一頁 | 首頁 | 下一頁
prev | 上一層 | reset


readdir

(PHP 3, PHP 4 )

readdir -- 從目錄句柄中讀取條目

說明

string readdir ( resource dir_handle)

傳回目錄中下一個文件的文件名。文件名以在文件系統中的排序傳回。

請留意下面例子中檢查 readdir() 傳回值的風格。我們明確地測試傳回值是否全等於（值和型別都相同 － 更多訊息參見比較運算符）FALSE，否則任何目錄項的名稱求值為 FALSE 的都會導致循環停止（例如一個目錄名為“0”）。

例子 1. 列出目錄中的所有文件

// 注意在 4.0.0-RC2 之前不存在 !== 運算符
<?php
if ($handle = opendir('/path/to/files')) {
    echo "Directory handle: $handle\n";
    echo "Files:\n";

    /* 這是遍歷目錄正確的方法 */
    while (false !== ($file = readdir($handle))) {
        echo "$file\n";
    }

    /* 這是錯誤地遍歷目錄的方法 */
    while ($file = readdir($handle)) {
        echo "$file\n";
    }

    closedir($handle);
}
?>

注意 readdir() 將會傳回 . 和 .. 條目。如果不想要它們，只要過濾掉即可：

例子 2. 列出當前目錄的所有文件並去掉 . 和 ..

<?php
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "$file\n";
        }
    }
    closedir($handle);
}
?>

參見 is_dir()。

上一頁 | 首頁 | 下一頁
opendir | 上一層 | rewinddir


readfile

(PHP 3, PHP 4 )

readfile -- Outputs a file

Description

int readfile ( string filename [, int use_include_path])

Reads a file and writes it to the output buffer.

Returns the number of bytes read from the file. If an error occurs, FALSE is returned and unless the function was called as @readfile, an error message is printed.

提示: 如果 "fopen wrappers" 已經被啟動，則您在使用該函式的時候，可以把 URL 作為文件名來使用。請參閱 fopen() 獲取怎樣指定文件名的詳細訊息以及支援的 URL 協議的列表 附錄 I。

You can use the optional second parameter and set it to "1", if you want to search for the file in the include_path, too.

See also fpassthru(),
file(), fopen(),
include(), require(),
virtual() and 附錄 I.

上一頁 | 首頁 | 下一頁
popen | 上一層 | readlink


readlink

(PHP 3, PHP 4 )

readlink -- Returns the target of a symbolic link

Description

string readlink ( string path)

readlink() does the same as the readlink C function and returns the contents of the symbolic link path or 0 in case of error.

See also is_link(),
symlink(), and
linkinfo().

上一頁 | 首頁 | 下一頁
readfile | 上一層 | realpath


realpath

(PHP 4 )

realpath -- Returns canonicalized absolute pathname

Description

string realpath ( string path)

realpath() expands all symbolic links and resolves references to '/./', '/../' and extra '/' characters in the input path and return the canonicalized absolute pathname. The resulting path will have no symbolic link, '/./' or '/../' components.

realpath() returns FALSE on failure, e.g. if the file does not exists.

例子 1. realpath() example

$real_path = realpath ("../../index.php");

See also: basename(),
dirname(), and
pathinfo().

上一頁 | 首頁 | 下一頁
readlink | 上一層 | rename


recode_string

(PHP 3>= 3.0.13, PHP 4 )

recode_string -- Recode a string according to a recode request

Description

string recode_string ( string request, string string)

Recode the string string according to the recode request request. Returns the recoded string or FALSE, if unable to perform the recode request.

A simple recode request may be "lat1..iso646-de". See also the GNU Recode documentation of your installation for detailed instructions about recode requests.

例子 1. Basic recode_string() example:

print recode_string ("us..flat", "The following character has a diacritical mark: &aacute;");

上一頁 | 首頁 | 下一頁
recode_file | 上一層 | recode


register_shutdown_function

(PHP 3>= 3.0.4, PHP 4 )

register_shutdown_function -- Register a function for execution on shutdown

Description

int register_shutdown_function ( callback function)

Registers the function named by function to be executed when script processing is complete.

Multiple calls to register_shutdown_function() can be made, and each will be called in the same order as they were registered. If you call exit() within one registered shutdown function, processing will stop completely and no other registered shutdown functions will be called.

The registered shutdown functions are called after the request has been completed (including sending any output buffers), so it is not possible to send output to the browser using echo() or print(), or retrieve the contents of any output buffers using ob_get_contents().

上一頁 | 首頁 | 下一頁
get_defined_functions | 上一層 | register_tick_function


rename

(PHP 3, PHP 4 )

rename -- Renames a file

Description

bool rename ( string oldname, string newname)

Attempts to rename oldname to newname.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

例子 1. Example with rename()

<?php
  rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>

上一頁 | 首頁 | 下一頁
realpath | 上一層 | rewind


require

PHP 手冊
上一頁 章 12. 流程控制 下一頁

require()

require() 語句包括並執行指定文件。

require() 語句包括並執行指定文件。有關包括如何工作的詳細訊息見 include() 的文檔。

require() 和 include() 除了怎樣處理失敗之外在各方面都完全一樣。include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說，如果你想在丟失文件時停止處理頁面，那就別猶豫了，用 require() 吧。include() 就不是這樣，腳本會繼續執行。同時也要確認設置了合適的include_path。

例子 12-2. 基本的 require() 例子

<?php

require 'prepend.php';

require $somefile;

require ('somefile.txt');

?>

更多例子參見 include() 文檔。

註: 在 PHP 4.0.2 之前適用以下規則：require() 總是會嘗試讀取目標文件，即使它所在的行根本就不會執行。條件語句不會影響 require()。不過如果 require() 所在的行沒有執行，則目標文件中的代碼也不會執行。同樣，循環結構也不影響 require() 的行為。儘管目標文件中包含的代碼仍然是循環的主體，但 require() 本身只會執行一次。

警告

Windows 版本的 PHP 在 4.3 版之前不支援該函式的遠程文件連接，即使 allow_url_fopen 選項已被啟動。

參見 include()，require_once()，include_once()，eval()，file()，readfile()，virtual() 和 include_path。

上一頁 | 首頁 | 下一頁
return | 上一層 | include()


require_once

PHP 手冊
上一頁 章 12. 流程控制 下一頁

require_once()

require_once() 語句在腳本執行期間包括並執行指定文件。此行為和 require() 語句類似，唯一區別是如果該文件中的代碼已經被包括了，則不會再次包括。有關此語句怎樣工作參見 require() 的文檔。

require_once() 應該用於在腳本執行期間同一個文件有可能被包括超過一次的情況下，你想確保它只被包括一次以避免函式重定義，變數重新設值等問題。

使用 require_once() 和 include_once() 的例子見最新的 PHP 源程序發行包中的 PEAR 代碼。

註: require_once() 是 PHP 4.0.1pl2 中新加入的。

註: 要注意 require_once() 和 include_once() 在大小寫不敏感的操作系統中（例如 Windows）的行為可能不是你所期望的。

例子 12-8. require_once() 是大小寫敏感的

require_once("a.php"); // this will include a.php
require_once("A.php"); // this will include a.php again on Windows!

警告

Windows 版本的 PHP 在 4.3 版之前不支援該函式的遠程文件連接，即使 allow_url_fopen 選項已被啟動。

參見: require()，include()，include_once()，get_required_files()，get_included_files()，readfile() 和 virtual()。


reset

(PHP 3, PHP 4 )

reset -- 將陣列的內部指針指向第一個單元

說明

mixed reset ( array array)

reset() 將 array 的內部指針倒回到第一個單元。

reset() 傳回第一個陣列單元的值。

參見 current()，each()，next() 和 prev()。

上一頁 | 首頁 | 下一頁
range | 上一層 | rsort


restore_error_handler

(PHP 4 >= 4.0.1)

restore_error_handler -- Restores the previous error handler function

Description

void restore_error_handler ( void)

Used after changing the error handler function using set_error_handler(), to revert to the previous error handler (which could be the built-in or a user defined function)

See also error_reporting(),
set_error_handler(),
trigger_error(), user_error()

上一頁 | 首頁 | 下一頁
error_reporting | 上一層 | set_error_handler


return

如果在一個函式中呼叫，return() 語句立即結束此函式的執行並將它的參數作為函式的值傳回。return() 也會終止 eval() 語句或者腳本文件的執行。

如果在全域範圍中呼叫，則當前腳本文件中止執行。如果當前腳本文件是被 include() 的或者 require() 的，則控制交回呼叫文件。此外，如果當前腳本是被 include() 的，則 return() 的值會被當作 include() 呼叫的傳回值。如果在主腳本文件中呼叫 return()，則腳本中止執行。如果當前腳本文件是在配置文件中的 auto_prepend_file 或者 auto_append_file 所指定的，則此腳本文件中止執行。

更多訊息見傳回值。

註: 注意既然 return() 是語言結構而不是函式，並不需要用括號將參數括起來。事實上不用括號比用括號更常見，儘管用哪一種並無所謂。

上一頁 | 首頁 | 下一頁
declare | 上一層 | require()


rewind

(PHP 3, PHP 4 )

rewind -- Rewind the position of a file pointer

Description

int rewind ( int fp)

Sets the file position indicator for fp to the beginning of the file stream.

If an error occurs, returns 0, otherwise it returns 1.

The file pointer must be valid, and must point to a file successfully opened by fopen().

註: If you have opened the file in append ("a") mode, any data you write to the file will always be appended, regardless of the file position.

See also fseek() and ftell().

上一頁 | 首頁 | 下一頁
rename | 上一層 | rmdir


rewinddir

(PHP 3, PHP 4 )

rewinddir -- 倒回目錄句柄

說明

void rewinddir ( resource dir_handle)

將 dir_handle 指定的目錄流重置到目錄的開頭。

上一頁 | 首頁 | 下一頁
readdir | 上一層 | DOM XML functions


rmdir

(PHP 3, PHP 4 )

rmdir -- Removes directory

Description

bool rmdir ( string dirname)

Attempts to remove the directory named by dirname. The directory must be empty, and the relevant permissions must permit this. 如果成功則傳回 TRUE，失敗則傳回 FALSE。

See also mkdir() and unlink().

上一頁 | 首頁 | 下一頁
rewind | 上一層 | set_file_buffer


rsort

(PHP 3, PHP 4 )

rsort -- 對陣列逆向排序

說明

void rsort ( array array [, int sort_flags])

本函式對陣列進行逆向排序（最高到最低）。

例子 1. rsort() 例子

$fruits = array ("lemon", "orange", "banana", "apple");
rsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

本例將顯示：

0 = orange
1 = lemon
2 = banana
3 = apple

fruits 被按照字母順序逆向排序。

可以用可選參數 sort_flags 改變排序的行為，詳情見 sort()。

參見 arsort()，asort()，ksort()，sort() 和 usort()。

上一頁 | 首頁 | 下一頁
reset | 上一層 | shuffle


rtrim

(PHP 3, PHP 4 )

rtrim -- Strip whitespace from the end of a string

Description

string rtrim ( string str [, string charlist])

註: The second parameter was added in PHP 4.1.0

This function returns a string with whitespace stripped from the end of str. Without the second parameter, rtrim() will strip these characters:

  • " " (ASCII 32 (0x20)), an ordinary space.

  • "\t" (ASCII 9 (0x09)), a tab.

  • "\n" (ASCII 10 (0x0A)), a new line (line feed).

  • "\r" (ASCII 13 (0x0D)), a carriage return.

  • "\0" (ASCII 0 (0x00)), the NUL-byte.

  • "\x0B" (ASCII 11 (0x0B)), a vertical tab.

You can also specify the characters you want to strip, by means of the charlist parameter. Simply list all characters that you want to be stripped. With .. you can specify a range of characters.

例子 1. Usage example of rtrim()

<?php

$text = "\t\tThese are a few words :) ...  ";
$trimmed = rtrim($text);
// $trimmed = "\t\tThese are a few words :) ..."
$trimmed = rtrim($text," \t.");
// $trimmed = "\t\tThese are a few words :)"
$clean = rtrim($binary,"\0x00..\0x1F");
// trim the ASCII control characters at the end of $binary
// (from 0 to 31 inclusive)

?>

See also trim() and ltrim().

上一頁 | 首頁 | 下一頁
quotemeta | 上一層 | setlocale


set_file_buffer

set_file_buffer -- Alias of stream_set_write_buffer()

Description

This function is an alias of stream_set_write_buffer().

上一頁 | 首頁 | 下一頁
rmdir | 上一層 | stat


set_magic_quotes_runtime

(PHP 3>= 3.0.6, PHP 4 )

set_magic_quotes_runtime -- Sets the current active configuration setting of magic_quotes_runtime

Description

long set_magic_quotes_runtime ( int new_setting)

Set the current active configuration setting of magic_quotes_runtime (0 for off, 1 for on).

See also: get_magic_quotes_gpc() and get_magic_quotes_runtime().

上一頁 | 首頁 | 下一頁
putenv | 上一層 | set_time_limit


set_time_limit

(PHP 3, PHP 4 )

set_time_limit -- Limits the maximum execution time

Description

void set_time_limit ( int seconds)

Set the number of seconds a script is allowed to run. If this is reached, the script returns a fatal error. The default limit is 30 seconds or, if it exists, the max_execution_time value defined in the configuration file. If seconds is set to zero, no time limit is imposed.

When called, set_time_limit() restarts the timeout counter from zero. In other words, if the timeout is the default 30 seconds, and 25 seconds into script execution a call such as set_time_limit(20) is made, the script will run for a total of 45 seconds before timing out.

set_time_limit() has no effect when PHP is running in safe mode. There is no workaround other than turning off safe mode or changing the time limit in the configuration file.

註: The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running.

上一頁 | 首頁 | 下一頁
set_magic_quotes_runtime | 上一層 | version_compare


setcookie

(PHP 3, PHP 4 )

setcookie -- Send a cookie

Description

boolean setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace. If output exists prior to calling this function, setcookie() will fail and return FALSE. If setcookie() successfully runs, it will return TRUE. This does not indicate whether the user accepted the cookie.

All the arguments except the name argument are optional. If only the name argument is present, the cookie by that name will be deleted from the remote client. You may also replace any argument with an empty string ("") in order to skip that argument. The expire and secure arguments are integers and cannot be skipped with an empty string. Use a zero (0) instead. The expire argument is a regular Unix time integer as returned by the time() or mktime() functions. The secure indicates that the cookie should only be transmitted over a secure HTTPS connection.

Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE or $HTTP_COOKIE_VARS arrays. Note, autoglobals such as $_COOKIE became available in PHP 4.1.0. $HTTP_COOKIE_VARS has existed since PHP 3.

Common Pitfalls:

  • Cookies will not become visible until the next loading of a page that the cookie should be visible for. To test if a cookie was successfully set, check for the cookie on a next loading page before the cookie expires. Expire time is set via the expire parameter.

  • Cookies must be deleted with the same parameters as they were set with.

  • Cookies names can be set as array names and will be available to your PHP scripts as arrays but seperate cookies are stored on the users system. Consider explode() or serialize() to set one cookie with multiple names and values.

In PHP 3, multiple calls to setcookie() in the same script will be performed in reverse order. If you are trying to delete one cookie before inserting another you should put the insert before the delete. In PHP 4, multiple calls to setcookie() are performed in the order called.

Some examples follow how to send cookies:

例子 1. setcookie() send examples

setcookie ("TestCookie", $value);
setcookie ("TestCookie", $value,time()+3600);  /* expire in 1 hour */
setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);

When deleting a cookie you should assure that the expiration date is in the past, to trigger the removal mechanism in your browser. Examples follow how to delete cookies sent in previous example:

例子 2. setcookie() delete examples

// set the expiration date to one hour ago
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);

Note that the value portion of the cookie will automatically be urlencoded when you send the cookie, and when it is received, it is automatically decoded and assigned to a variable by the same name as the cookie name. To see the contents of our test cookie in a script, simply use one of the following examples:

echo $TestCookie;
echo $_COOKIE["TestCookie"];

You may also set array cookies by using array notation in the cookie name. This has the effect of setting as many cookies as you have array elements, but when the cookie is received by your script, the values are all placed in an array with the cookie's name:

setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie)) {
    while (list ($name, $value) = each ($cookie)) {
        echo "$name == $value<br>\n";
    }
}

For more information on cookies, see Netscape's cookie specification at http://www.netscape.com/newsref/std/cookie_spec.html.

Microsoft Internet Explorer 4 with Service Pack 1 applied does not correctly deal with cookies that have their path parameter set.

Netscape Communicator 4.05 and Microsoft Internet Explorer 3.x appear to handle cookies incorrectly when the path and time are not set.

上一頁 | 首頁 | 下一頁
headers_sent | 上一層 | Hyperwave functions


setlocale

(PHP 3, PHP 4 )

setlocale -- Set locale information

Description

string setlocale ( mixed category, string locale [, string ...])

string setlocale ( mixed category, array locale)

Category is a named constant (or string) specifying the category of the functions affected by the locale setting:

  • LC_ALL for all of the below

  • LC_COLLATE for string comparison, see strcoll()

  • LC_CTYPE for character classification and conversion, for example strtoupper()

  • LC_MONETARY for localeconv()

  • LC_NUMERIC for decimal separator (See also localeconv())

  • LC_TIME for date and time formatting with strftime()

If locale is the empty string "", the locale names will be set from the values of environment variables with the same names as the above categories, or from "LANG".

If locale is zero or "0", the locale setting is not affected, only the current setting is returned.

If locale is an array or followed by additional parameters then each array element or parameter is tried to be set as new locale until success. This is usefull if a locale is known under different names on different systems or for providing a fallback for a possibly not available locale.

註: Passing multiple locales is not available before PHP 4.3

Setlocale returns the new current locale, or FALSE if the locale functionality is not implemented in the platform, the specified locale does not exist or the category name is invalid. An invalid category name also causes a warning message.

例子 1. setlocale() Examples

<?php
    /* Set locale to Dutch */
    setlocale (LC_ALL, 'nl_NL');

    /* Output: vrijdag 22 december 1978 */
    echo strftime ("%A %e %B %Y", mktime (0, 0, 0, 12, 22, 1978));

    /* try different possible locale names for german */
    $loc_de = setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
    echo "Preferred locale for german on this system is '$loc_de'";
?>

上一頁 | 首頁 | 下一頁
rtrim | 上一層 | similar_text


settype

(PHP 3, PHP 4 )

settype -- Set the type of a variable

Description

bool settype ( mixed var, string type)

Set the type of variable var to type.

Possibles values of type are:

  • "boolean" (or, since PHP 4.2.0, "bool")

  • "integer" (or, since PHP 4.2.0, "int")

  • "float" (only possible since PHP 4.2.0, for older versions use the deprecated variant "double")

  • "string"

  • "array"

  • "object"

  • "null" (since PHP 4.2.0)

Returns TRUE if successful; otherwise returns FALSE.

例子 1. settype() example

$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)

See also gettype(), type-casting and type-juggling.

上一頁 | 首頁 | 下一頁
serialize | 上一層 | strval


shell_exec

(PHP 4 )

shell_exec -- Execute command via shell and return complete output as string

Description

string shell_exec ( string cmd)

This function is identical to the backtick operator.

上一頁 | 首頁 | 下一頁
proc_open | 上一層 | system


shuffle

(PHP 3>= 3.0.8, PHP 4 )

shuffle -- 將陣列打亂

說明

void shuffle ( array array)

本函式打亂（隨機排列單元的順序）一個陣列。必須用 srand() 播下本函式的隨機數發生器種子。

例子 1. shuffle() 例子

$numbers = range (1,20);
srand ((float)microtime()*1000000);
shuffle ($numbers);
while (list (, $number) = each ($numbers)) {
    echo "$number ";
}

參見 arsort()，asort()，ksort()，rsort()，sort() 和 usort()。

上一頁 | 首頁 | 下一頁
rsort | 上一層 | sizeof


sizeof

(PHP 3, PHP 4 )

sizeof -- 統計變數中的單元數目

說明

int sizeof ( mixed var)

sizeof() 函式是 count() 的別名。

參見 count()。

上一頁 | 首頁 | 下一頁
shuffle | 上一層 | sort


snmprealwalk

(PHP 3>= 3.0.8, PHP 4 )

snmprealwalk -- Return all objects including their respective object ID within the specified one

Description

array snmprealwalk ( string host, string community, string object_id [, int timeout [, int retries]])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
snmpget | 上一層 | snmpset


sort

(PHP 3, PHP 4 )

sort -- 對陣列排序

說明

void sort ( array array [, int sort_flags])

本函式對陣列進行排序。當本函式結束時陣列單元將被從最低到最高重新安排。

例子 1. sort() 例子

<?php

$fruits = array ("lemon", "orange", "banana", "apple");
sort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "fruits[".$key."] = ".$val."\n";
}

?>

本例將顯示：

fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

fruits 被按照字母順序排序。

可選的第二個參數 sort_flags 可以用以下值改變排序的行為：

排序型別標記：

  • SORT_REGULAR - 正常比較單元

  • SORT_NUMERIC - 單元被作為數字來比較

  • SORT_STRING - 單元被作為字串來比較

參見 arsort()，asort()，ksort()，natsort()，natcasesort()，rsort()，usort()，array_multisort() 和 uksort()。

註: 第二個參數是 PHP 4 新加的。

上一頁 | 首頁 | 下一頁
sizeof | 上一層 | uasort


split

(PHP 3, PHP 4 )

split -- split string into array by regular expression

Description

array split ( string pattern, string string [, int limit])

註: preg_split(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to split().

Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the regular expression pattern. If limit is set, the returned array will contain a maximum of limit elements with the last element containing the whole rest of string. If an error occurs, split() returns FALSE.

To split off the first four fields from a line from /etc/passwd:

例子 1. split() Example

list($user,$pass,$uid,$gid,$extra)= split (":", $passwd_line, 5);

註: If there are n occurrences of pattern, the returned array will contain n+1 items. For example, if there is no occurrence of pattern, an array with only one element will be returned. Of course, this is also true if string is empty.

To parse a date which may be delimited with slashes, dots, or hyphens:

例子 2. split() Example

$date = "04/30/1973";  // Delimiters may be slash, dot, or hyphen
list ($month, $day, $year) = split ('[/.-]', $date);
echo "Month: $month; Day: $day; Year: $year<br>\n";

Note that pattern is case-sensitive.

Note that if you don't require the power of regular expressions, it is faster to use explode(), which doesn't incur the overhead of the regular expression engine.

For users looking for a way to emulate Perl's @chars = split('', $str) behaviour, please see the examples for preg_split().

Please note that pattern is a regular expression. If you want to split on any of the characters which are considered special by regular expressions, you'll need to escape them first. If you think split() (or any other regex function, for that matter) is doing something weird, please read the file regex.7, included in the regex/ subdirectory of the PHP distribution. It's in manpage format, so you'll want to do something along the lines of man /usr/local/src/regex/regex.7 in order to read it.

See also:
preg_split(),
 spliti(),
explode(),
implode(),
chunk_split(), and
wordwrap().

上一頁 | 首頁 | 下一頁
eregi | 上一層 | spliti


sql_regcase

(PHP 3, PHP 4 )

sql_regcase -- Make regular expression for case insensitive match

Description

string sql_regcase ( string string)

Returns a valid regular expression which will match string, ignoring case. This expression is string with each character converted to a bracket expression; this bracket expression contains that character's uppercase and lowercase form if applicable, otherwise it contains the original character twice.

例子 1. sql_regcase() Example

echo sql_regcase ("Foo bar");
prints
[Ff][Oo][Oo] [Bb][Aa][Rr]
.

This can be used to achieve case insensitive pattern matching in products which support only case sensitive regular expressions.

上一頁 | 首頁 | 下一頁
spliti | 上一層 | Semaphore, Shared Memory and IPC Functions


stat

(PHP 3, PHP 4 )

stat -- Gives information about a file

Description

array stat ( string filename)

Gathers the statistics of the file named by filename.

Returns an array with the statistics of the file with the following elements:

  1. device

  2. inode

  3. inode protection mode

  4. number of links

  5. user id of owner

  6. group id owner

  7. device type if inode device *

  8. size in bytes

  9. time of last access

  10. time of last modification

  11. time of last change

  12. blocksize for filesystem I/O *

  13. number of blocks allocated

* - only valid on systems supporting the st_blksize type--other systems (i.e. Windows) return -1.

Returns FALSE in case of error.

stat() cannot be used on remote files.

The results of this function are cached. See clearstatcache() for more details.

上一頁 | 首頁 | 下一頁
set_file_buffer | 上一層 | stream_get_meta_data


stream_get_meta_data

(no version information, might be only in CVS)

stream_get_meta_data -- 從封裝協議文件指針中取得報頭／元資料

說明

mixed stream_get_meta_data ( int fp)

傳回現有 stream 的訊息。可以是任何通過 fopen()，fsockopen() 和 pfsockopen() 建立的流。傳回的陣列包含以下項目：

  • timed_out (bool) - 如果在上次呼叫 fread() 或者 fgets() 中等待資料時流超時了則為 TRUE。

  • blocked (bool) - 如果流處於阻塞 IO 模式時為 TRUE。參見 socket_set_blocking()。

  • eof (bool) - 如果流到達文件末尾時為 TRUE。注意對於 socket 流甚至當 unread_bytes 為非零值時也可以為 TRUE。要測定是否有更多資料可讀，用 feof() 替代讀取本項目的值。

  • unread_bytes (int) - 當前讀取緩衝區中的字節數。

以下項目是 PHP 4.3 新加的：

  • stream_type (string) - 一個描述流底層實現的標注。

  • wrapper_type (string) - 一個描述流的分層協議封裝實現的標注。更多關於封裝協議的訊息見 附錄 I。

  • wrapper_data (mixed) - 當前流附加的封裝協議資料。更多封裝協議及其資料的訊息見 附錄 I。

  • filters (array) - 包含有被疊加在當前流的任何過濾器名的陣列。過濾器目前沒有文檔。

註: 本函式是 PHP 4.3 引進的，在此版本之前，可以用 socket_get_status() 來取得前四個項目並且僅能用於基於 socket 的流。

在 PHP 4.3 及以後版本中，socket_get_status() 是本函式的別名。

註: 本函式不能作用於通過 Socket 擴展庫創建的流。

上一頁 | 首頁 | 下一頁
stat | 上一層 | stream_register_wrapper


stream_register_wrapper

(no version information, might be only in CVS)

stream_register_wrapper -- 註冊一個用 PHP 類實現的 URL 封裝協議

說明

boolean stream_register_wrapper ( string protocol, string classname)

stream_register_wrapper() 允許用戶實現自定義的協議處理器和流，用於所有其它的文件系統函式中（例如 fopen()，fread() 等）。

要實現一個封裝協議，需要按照如下定義聲明一個包含有一些函式的類。當有人對你的流使用 fopen 時，PHP 將創建一個 classname 的實例並呼叫該實例的方法。必須嚴格按照如下的描述實現方法 - 否則將導致不明確的行為。

如果 protocol 已經有了處理協議，則 stream_register_wrapper() 將傳回 FALSE。

boolean stream_open ( string path, string mode, int options, string opened_path)

當你的流對象被創建之後立即會呼叫此方法。path 指定了傳入 fopen() 以及此對象需要取回的 URL。可以用 parse_url() 來將此 URL 分割成幾部分。

mode 用來打開文件的模式，和 fopen() 中的一樣。你有責任檢查 mode 對於所請求的 path 是否合法。

options 保存了通過流 API 設定的附加標志。可以保存以下一個值或者用 OR 合並的多個值。

標志 | 說明
STREAM_USE_PATH | 如果 path 是相對路徑，則用 include_path 搜索資源。
STREAM_REPORT_ERRORS | 如果設定了本標志，你有責任在打開流時用 trigger_error() 來喚起錯誤。如果沒有設定這個標志，那麼你不需要喚起任何錯誤。

如果成功打開了 path，並且在 options 中設定了 STREAM_USE_PATH，你需要將 opened_path 設定為實際被打開的文件／資源的完整路徑。

如果成功打開了所請求的資源，應該傳回 TRUE，否則傳回 FALSE。

void stream_close ( void )

本方法在流關閉時被呼叫，使用 fclose()。必須釋放被流鎖定或分配的任何資源。

string stream_read ( int count)

當對流進行 fread() 和 fgets() 操作時本方法被呼叫。必須從當前讀寫位置以字串傳回最多 count 字節的資料。如果可用資料少於 count 字節，則傳回盡可能多的資料。如果沒有可供傳回的資料，傳回 FALSE 或者空字串。必須用成功讀取的字節數去更新流的讀寫位置。

int stream_write ( string data)

當對流進行 fwrite() 操作時本方法被呼叫。必須將 data 儲存到你的流使用的底層存儲空間去。如果沒有足夠的空間了，則試著保存盡可能多的字節。應該傳回成功被保存入流的字節數，或者沒有保存時傳回 0。必須用成功寫入的字節數去更新流的讀寫位置。

boolean stream_eof ( void )

當對流進行 feof() 操作時本方法被呼叫。如果讀寫位置到了流的盡頭或者沒有更多資料可讀時傳回 TRUE，否則傳回 FALSE。

int stream_tell ( void )

當對流進行 ftell() 操作時本方法被呼叫。應該傳回流的當前讀寫位置。

boolean stream_seek ( int offset, int whence)

當對流進行 fseek() 操作時本方法被呼叫。應該根據 offset 和 whence 來更新流的讀寫位置。這些參數的更多訊息見 fseek()。如果位置成功更新了則傳回 TRUE，否則傳回 FALSE。

boolean stream_flush ( void )

當對流進行 fflush() 操作時本方法被呼叫。如果你在流中緩存了資料還沒有寫入底層存儲空間時，那現在應該做了。如果緩存資料被成功保存（或沒有資料可供保存）時傳回 TRUE，當資料無法被保存時傳回 FALSE。

下面的例子實現了一個 var:// 協議處理器，可以允許使用標準的文件系統流函式來對指定的全域變數進行讀寫操作，例如 fread()。var:// 協議的實現如下，給出 url "var://foo" 將可以讀寫 $GLOBALS["foo"]。

例子 1. 讀寫全域變數的流

class VariableStream {
    var $position;
    var $varname;

    function stream_open($path, $mode, $options, &$opened_path)
    {
        $url = parse_url($path);
        $this->varname = $url["host"];
        $this->position = 0;

        return true;
    }

    function stream_read($count)
    {
        $ret = substr($GLOBALS[$this->varname], $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }

    function stream_write($data)
    {
        $left = substr($GLOBALS[$this->varname], 0, $this->position);
        $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
        $GLOBALS[$this->varname] = $left . $data . $right;
        $this->position += strlen($data);
        return strlen($data);
    }

    function stream_tell()
    {
        return $this->position;
    }

    function stream_eof()
    {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }

    function stream_seek($offset, $whence)
    {
        switch($whence) {
            case SEEK_SET:
                if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
                     $this->position = $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_CUR:
                if ($offset >= 0) {
                     $this->position += $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_END:
                if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
                     $this->position = strlen($GLOBALS[$this->varname]) + $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            default:
                return false;
        }
    }
}

stream_register_wrapper("var", "VariableStream")
    or die("Failed to register protocol");

$myvar = "";

$fp = fopen("var://myvar", "r+");

fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");

rewind($fp);
while(!feof($fp)) {
    echo fgets($fp)
}
fclose($fp);
var_dump($myvar);

上一頁 | 首頁 | 下一頁
stream_get_meta_data | 上一層 | stream_set_blocking


stream_set_blocking

(no version information, might be only in CVS)

stream_set_blocking -- Set blocking/non-blocking mode on a stream

Description

bool stream_set_blocking ( resource stream, int mode)

If mode is FALSE, the given stream will be switched to non-blocking mode, and if TRUE, it will be switched to blocking mode. This affects calls like fgets() and fread() that read from the stream. In non-blocking mode an fgets() call will always return right away while in blocking mode it will wait for data to become available on the stream.

This function was previously called as set_socket_blocking() and later socket_set_blocking() but this usage is deprecated.

註: Prior to PHP 4.3, this function only worked on socket based streams. Since PHP 4.3, this function works for any stream that supports non-blocking mode (currently, regular files and socket streams).

上一頁 | 首頁 | 下一頁
stream_register_wrapper | 上一層 | stream_set_timeout


stream_set_timeout

(no version information, might be only in CVS)

stream_set_timeout -- Set timeout period on a stream

Description

bool stream_set_timeout ( resource stream, int seconds, int microseconds)

Sets the timeout value on stream, expressed in the sum of seconds and microseconds.

例子 1. stream_set_timeout() Example

<?php
$fp = fsockopen("www.example.com", 80);
if(!$fp) {
    echo "Unable to open\n";
} else {
    fputs($fp, "GET / HTTP/1.0\n\n");
    $start = time();
    socket_set_timeout($fp, 2);
    $res = fread($fp, 2000);
    var_dump(stream_get_meta_data($fp));
    fclose($fp);
    print $res;
}
?>

註: As of PHP 4.3, this function can (potentially) work on any kind of stream. In PHP 4.3, socket based streams are still the only kind supported in the PHP core, although streams from other extensions may support this function.

This function was previously called as set_socket_timeout() and later socket_set_timeout() but this usage is deprecated.

See also: fsockopen() and fopen().

上一頁 | 首頁 | 下一頁
stream_set_blocking | 上一層 | stream_set_write_buffer


stream_set_write_buffer

(no version information, might be only in CVS)

stream_set_write_buffer -- Sets file buffering on the given stream

Description

int stream_set_write_buffer ( resource stream, int buffer)

Output using fwrite() is normally buffered at 8K. This means that if there are two processes wanting to write to the same output stream (a file), each is paused after 8K of data to allow the other to write. stream_set_write_buffer() sets the buffering for write operations on the given filepointer stream to buffer bytes. If buffer is 0 then write operations are unbuffered. This ensures that all writes with fwrite() are completed before other processes are allowed to write to that output stream.

The function returns 0 on success, or EOF if the request cannot be honored.

The following example demonstrates how to use stream_set_write_buffer() to create an unbuffered stream.

例子 1. stream_set_write_buffer() example

$fp = fopen($file, "w");
if ($fp) {
  stream_set_write_buffer($fp, 0);
  fputs($fp, $output);
  fclose($fp);
}

See also fopen() and fwrite().

上一頁 | 首頁 | 下一頁
stream_set_timeout | 上一層 | symlink


strftime

(PHP 3, PHP 4 )

strftime -- 根據區域設置格式化本地時間／日期

說明

string strftime ( string format [, int timestamp])

傳回用給定的格式字串對給出的 timestamp 進行格式輸出後的字串。如果沒有給出時間戳則用當前的本地時間。月份和星期幾以及其它和語言有關的字串寫法和用 setlocale() 設定的當前的區域有關。

格式字串能識別下列轉換標記：

  • %a - 當前區域星期幾的簡寫

  • %A - 當前區域星期幾的全稱

  • %b - 當前區域月份的簡寫

  • %B - 當前區域月份的全稱

  • %c - 當前區域首選的日期時間表達

  • %C - 世紀值（年份除以 100 後取整，範圍從 00 到 99）

  • %d - 月份中的第幾天，十進制數字（範圍從 01 到 31）

  • %D - 和 %m/%d/%y 一樣

  • %e - 月份中的第幾天，十進制數字，一位的數字前會加上一個空格（範圍從 ' 1' 到 '31'）

  • %g - 和 %G 一樣，但是沒有世紀

  • %G - 4 位數的年份，符合 ISO 星期數（參見 %V）。和 %V 的格式和值一樣，只除了如果 ISO 星期數屬於前一年或者後一年，則使用那一年。

  • %h - 和 %b 一樣

  • %H - 24 小時制的十進制小時數（範圍從 00 到 23）

  • %I - 12 小時制的十進制小時數（範圍從 00 到 12）

  • %j - 年份中的第幾天，十進制數（範圍從 001 到 366）

  • %m - 十進制月份（範圍從 01 到 12）

  • %M - 十進制分鐘數

  • %n - 換行符

  • %p - 根據給定的時間值為 `am' 或 `pm'，或者當前區域設置中的相應字串

  • %r - 用 a.m. 和 p.m. 符號的時間

  • %R - 24 小時符號的時間

  • %S - 十進制秒數

  • %t - 制表符

  • %T - 當前時間，和 %H:%M:%S 一樣

  • %u - 星期幾的十進制數表達 [1,7]，1 表示星期一

    警告

    儘管 ISO 9889:1999（當前的 C 標準）明確指出一周從星期一開始，但是 Sun Solaris 的一周似乎從星期天開始並作為 1。

  • %U - 本年的第幾周，從第一周的第一個星期天作為第一天開始

  • %V - 本年第幾周的 ISO 8601:1988 格式，範圍從 01 到 53，第 1 周是本年第一個至少還有 4 天的星期，星期一作為每周的第一天。（用 %G 或者 %g 作為指定時間戳相應周數的年份組成。）

  • %W - 本年的第幾周數，從第一周的第一個星期一作為第一天開始

  • %w - 星期中的第幾天，星期天為 0

  • %x - 當前區域首選的時間表示法，不包括時間

  • %X - 當前區域首選的時間表示法，不包括日期

  • %y - 沒有世紀數的十進制年份（範圍從 00 到 99）

  • %Y - 包括世紀數的十進制年份

  • %Z - 時區名或縮寫

  • %% - 文字上的 `%' 字元

註: 可能不是所有的轉換標記都被 C 庫文件支援，這種情況下 PHP 的 strftime() 也不支援。這意味著例如 %e, %T 和 %D（可能更多）在 Windows 下不起作用。

例子 1. strftime() 例子

setlocale (LC_TIME, "C");
print (strftime ("%A in Finnish is "));
setlocale (LC_TIME, "fi_FI");
print (strftime ("%A, in French "));
setlocale (LC_TIME, "fr_FR");
print (strftime ("%A and in German "));
setlocale (LC_TIME, "de_DE");
print (strftime ("%A.\n"));
本例在你的系統中安裝有各自的區域設置後才能工作。

參見 setlocale() 和 mktime() 以及 Open Group specification of strftime()。

上一頁 | 首頁 | 下一頁
mktime | 上一層 | strtotime


strstr

(PHP 3, PHP 4 )

strstr -- Find first occurrence of a string

Description

string strstr ( string haystack, string needle)

Returns part of haystack string from the first occurrence of needle to the end of haystack.

If needle is not found, returns FALSE.

If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.

註: This function is case-sensitive. For case-insensitive searches, use stristr().

例子 1. strstr() example

$email = 'user@example.com';
$domain = strstr($email, '@');
print $domain; // prints @example.com

See also ereg(), preg_match(),
strchr(), stristr(),
strpos(), strrchr(), and
substr().

上一頁 | 首頁 | 下一頁
strspn | 上一層 | strtok


strtotime

(PHP 3>= 3.0.12, PHP 4 )

strtotime -- 將任何英文文本的日期時間描述解析為 UNIX 時間戳

說明

int strtotime ( string time [, int now])

本函式預期接受一個包含英文日期格式的字串並嘗試將其解析為 UNIX 時間戳。如果 time 的格式是絕對時間則 now 參數不起作用。如果 time 的格式是相對時間則其所相對的時間由 now 提供，或者如果未提供 now 參數時用當前時間。失敗時傳回 -1。

因為 strtotime() 的行為是依照 GNU 日期語法的，因此請看看 GNU 手冊中的 Date Input Formats。這裡記述了 time 參數的合法語法。

例子 1. strtotime() 例子

echo strtotime ("now"), "\n";
echo strtotime ("10 September 2000"), "\n";
echo strtotime ("+1 day"), "\n";
echo strtotime ("+1 week"), "\n";
echo strtotime ("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime ("next Thursday"), "\n";
echo strtotime ("last Monday"), "\n";

例子 2. 檢查失敗

$str = 'Not Good';
if (($timestamp = strtotime($str)) === -1) {
    echo "The string ($str) is bogus";
} else {
    echo "$str == ". date('l dS of F Y h:i:s A',$timestamp);
}

註: 有效的時間戳典型範圍是從格林威治時間 1901 年 12 月 13 日 星期五 20:45:54 到 2038年 1 月 19 日 星期二 03:14:07。（該日期根據 32 位有符號整數的最小值和最大值而來。）

上一頁 | 首頁 | 下一頁
strftime | 上一層 | time


sybase_affected_rows

(PHP 3>= 3.0.6, PHP 4 )

sybase_affected_rows -- get number of affected rows in last query

Description

int sybase_affected_rows ( [int link_identifier])

Returns: The number of affected rows by the last query.

sybase_affected_rows() returns the number of rows affected by the last INSERT, UPDATE or DELETE query on the server associated with the specified link identifier. If the link identifier isn't specified, the last opened link is assumed.

This command is not effective for SELECT statements, only on statements which modify records. To retrieve the number of rows returned from a SELECT, use sybase_num_rows().

註: This function is only available using the CT library interface to Sybase, and not the DB library.

上一頁 | 首頁 | 下一頁
Sybase functions | 上一層 | sybase_close


sybase_close

(PHP 3, PHP 4 )

sybase_close -- close Sybase connection

Description

bool sybase_close ( int link_identifier)

Returns: TRUE on success, FALSE on error

sybase_close() closes the link to a Sybase database that's associated with the specified link identifier. If the link identifier isn't specified, the last opened link is assumed.

Note that this isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.

sybase_close() will not close persistent links generated by sybase_pconnect().

See also: sybase_connect(), sybase_pconnect().

上一頁 | 首頁 | 下一頁
sybase_affected_rows | 上一層 | sybase_connect


sybase_connect

(PHP 3, PHP 4 )

sybase_connect -- open Sybase server connection

Description

int sybase_connect ( string servername, string username, string password [, string charset])

Returns: A positive Sybase link identifier on success, or FALSE on error.

sybase_connect() establishes a connection to a Sybase server. The servername argument has to be a valid servername that is defined in the 'interfaces' file.

In case a second call is made to sybase_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

The link to the server will be closed as soon as the execution of the script ends, unless it's closed earlier by explicitly calling sybase_close().

See also sybase_pconnect(), sybase_close().

上一頁 | 首頁 | 下一頁
sybase_close | 上一層 | sybase_data_seek


sybase_data_seek

(PHP 3, PHP 4 )

sybase_data_seek -- move internal row pointer

Description

bool sybase_data_seek ( int result_identifier, int row_number)

Returns: TRUE on success, FALSE on failure

sybase_data_seek() moves the internal row pointer of the Sybase result associated with the specified result identifier to pointer to the specifyed row number. The next call to sybase_fetch_row() would return that row.

See also: sybase_data_seek().

上一頁 | 首頁 | 下一頁
sybase_connect | 上一層 | sybase_fetch_array


sybase_fetch_array

(PHP 3, PHP 4 )

sybase_fetch_array -- fetch row as array

Description

array sybase_fetch_array ( int result)

Returns: An array that corresponds to the fetched row, or FALSE if there are no more rows.

sybase_fetch_array() is an extended version of sybase_fetch_row(). In addition to storing the data in the numeric indices of the result array, it also stores the data in associative indices, using the field names as keys.

An important thing to note is that using sybase_fetch_array() is NOT significantly slower than using sybase_fetch_row(), while it provides a significant added value.

For further details, also see sybase_fetch_row().

上一頁 | 首頁 | 下一頁
sybase_data_seek | 上一層 | sybase_fetch_field


sybase_fetch_field

(PHP 3, PHP 4 )

sybase_fetch_field -- get field information

Description

object sybase_fetch_field ( int result [, int field_offset])

Returns an object containing field information.

sybase_fetch_field() can be used in order to obtain information about fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retreived by sybase_fetch_field() is retreived.

The properties of the object are:

  • name - column name. if the column is a result of a function, this property is set to computed#N, where #N is a serial number.

  • column_source - the table from which the column was taken

  • max_length - maximum length of the column

  • numeric - 1 if the column is numeric

  • type - datatype of the column

See also sybase_field_seek()

上一頁 | 首頁 | 下一頁
sybase_fetch_array | 上一層 | sybase_fetch_object


sybase_fetch_object

(PHP 3, PHP 4 )

sybase_fetch_object -- fetch row as object

Description

int sybase_fetch_object ( int result)

Returns: An object with properties that correspond to the fetched row, or FALSE if there are no more rows.

sybase_fetch_object() is similar to sybase_fetch_array(), with one difference - an object is returned, instead of an array. Indirectly, that means that you can only access the data by the field names, and not by their offsets (numbers are illegal property names).

Speed-wise, the function is identical to sybase_fetch_array(), and almost as quick as sybase_fetch_row() (the difference is insignificant).

See also: sybase_fetch_array() and sybase_fetch_row().

上一頁 | 首頁 | 下一頁
sybase_fetch_field | 上一層 | sybase_fetch_row


sybase_fetch_row

(PHP 3, PHP 4 )

sybase_fetch_row -- get row as enumerated array

Description

array sybase_fetch_row ( int result)

Returns: An array that corresponds to the fetched row, or FALSE if there are no more rows.

sybase_fetch_row() fetches one row of data from the result associated with the specified result identifier. The row is returned as an array. Each result column is stored in an array offset, starting at offset 0.

Subsequent call to sybase_fetch_row() would return the next row in the result set, or FALSE if there are no more rows.

See also: sybase_fetch_array(),
          sybase_fetch_object(),
          sybase_data_seek(),
          sybase_fetch_lengths(), and
          sybase_result().

上一頁 | 首頁 | 下一頁
sybase_fetch_object | 上一層 | sybase_field_seek


sybase_field_seek

(PHP 3, PHP 4 )

sybase_field_seek -- set field offset

Description

int sybase_field_seek ( int result, int field_offset)

Seeks to the specified field offset. If the next call to sybase_fetch_field() won't include a field offset, this field would be returned.

See also: sybase_fetch_field().

上一頁 | 首頁 | 下一頁
sybase_fetch_row | 上一層 | sybase_free_result


sybase_free_result

(PHP 3, PHP 4 )

sybase_free_result -- free result memory

Description

bool sybase_free_result ( int result)

sybase_free_result() only needs to be called if you are worried about using too much memory while your script is running. All result memory will automatically be freed when the script ends. You may call sybase_free_result() with the result identifier as an argument and the associated result memory will be freed.

上一頁 | 首頁 | 下一頁
sybase_field_seek | 上一層 | sybase_get_last_message


sybase_get_last_message

(PHP 3, PHP 4 )

sybase_get_last_message -- Returns the last message from the server

Description

string sybase_get_last_message ( void)

sybase_get_last_message() returns the last message reported by the server.

上一頁 | 首頁 | 下一頁
sybase_free_result | 上一層 | sybase_min_client_severity


sybase_min_client_severity

(PHP 3, PHP 4 )

sybase_min_client_severity -- Sets minimum client severity

Description

void sybase_min_client_severity ( int severity)

sybase_min_client_severity() sets the minimum client severity level.

註: This function is only available using the CT library interface to Sybase, and not the DB library.

See also: sybase_min_server_severity().

上一頁 | 首頁 | 下一頁
sybase_get_last_message | 上一層 | sybase_min_error_severity


sybase_min_error_severity

(PHP 3, PHP 4 )

sybase_min_error_severity -- Sets minimum error severity

Description

void sybase_min_error_severity ( int severity)

sybase_min_error_severity() sets the minimum error severity level.

See also: sybase_min_message_severity().

上一頁 | 首頁 | 下一頁
sybase_min_client_severity | 上一層 | sybase_min_message_severity


sybase_min_message_severity

(PHP 3, PHP 4 )

sybase_min_message_severity -- Sets minimum message severity

Description

void sybase_min_message_severity ( int severity)

sybase_min_message_severity() sets the minimum message severity level.

See also: sybase_min_error_severity().

上一頁 | 首頁 | 下一頁
sybase_min_error_severity | 上一層 | sybase_min_server_severity


sybase_min_server_severity

(PHP 3, PHP 4 )

sybase_min_server_severity -- Sets minimum server severity

Description

void sybase_min_server_severity ( int severity)

sybase_min_server_severity() sets the minimum server severity level.

註: This function is only available using the CT library interface to Sybase, and not the DB library.

See also: sybase_min_client_severity().

上一頁 | 首頁 | 下一頁
sybase_min_message_severity | 上一層 | sybase_num_fields


sybase_num_fields

(PHP 3, PHP 4 )

sybase_num_fields -- get number of fields in result

Description

int sybase_num_fields ( int result)

sybase_num_fields() returns the number of fields in a result set.

See also:
sybase_db_query(),
sybase_query(),
sybase_fetch_field(),
sybase_num_rows().

上一頁 | 首頁 | 下一頁
sybase_min_server_severity | 上一層 | sybase_num_rows


sybase_num_rows

(PHP 3, PHP 4 )

sybase_num_rows -- get number of rows in result

Description

int sybase_num_rows ( int result)

sybase_num_rows() returns the number of rows in a result set.

See also:
sybase_db_query(),
sybase_query() and,
sybase_fetch_row().

上一頁 | 首頁 | 下一頁
sybase_num_fields | 上一層 | sybase_pconnect


sybase_pconnect

(PHP 3, PHP 4 )

sybase_pconnect -- open persistent Sybase connection

Description

int sybase_pconnect ( string servername, string username, string password [, string charset])

Returns: A positive Sybase persistent link identifier on success, or FALSE on error

sybase_pconnect() acts very much like sybase_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (sybase_close() will not close links established by sybase_pconnect()()).

This type of links is therefore called 'persistent'.

上一頁 | 首頁 | 下一頁
sybase_num_rows | 上一層 | sybase_query


sybase_query

(PHP 3, PHP 4 )

sybase_query -- send Sybase query

Description

int sybase_query ( string query, int link_identifier)

Returns: A positive Sybase result identifier on success, or FALSE on error.

sybase_query() sends a query to the currently active database on the server that's associated with the specified link identifier. If the link identifier isn't specified, the last opened link is assumed. If no link is open, the function tries to establish a link as if sybase_connect() was called, and use it.

See also:
sybase_db_query(),
sybase_select_db(), and
sybase_connect().

上一頁 | 首頁 | 下一頁
sybase_pconnect | 上一層 | sybase_result


sybase_result

(PHP 3, PHP 4 )

sybase_result -- get result data

Description

string sybase_result ( int result, int row, mixed field)

Returns: The contents of the cell at the row and offset in the specified Sybase result set.

sybase_result() returns the contents of one cell from a Sybase result set. The field argument can be the field's offset, or the field's name, or the field's table dot field's name (tablename.fieldname). If the column name has been aliased ('select foo as bar from...'), use the alias instead of the column name.

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than sybase_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.

Recommended high-performance alternatives:
sybase_fetch_row(),
sybase_fetch_array(), and
sybase_fetch_object().

上一頁 | 首頁 | 下一頁
sybase_query | 上一層 | sybase_select_db


sybase_select_db

(PHP 3, PHP 4 )

sybase_select_db -- select Sybase database

Description

bool sybase_select_db ( string database_name, int link_identifier)

Returns: TRUE on success, FALSE on error

sybase_select_db() sets the current active database on the server that's associated with the specified link identifier. If no link identifier is specified, the last opened link is assumed. If no link is open, the function will try to establish a link as if sybase_connect() was called, and use it.

Every subsequent call to sybase_query() will be made on the active database.

See also:
    sybase_connect(),
    sybase_pconnect(), and
    sybase_query()

上一頁 | 首頁 | 下一頁
sybase_result | 上一層 | Tokenizer functions


symlink

(PHP 3, PHP 4 )

symlink -- Creates a symbolic link

Description

int symlink ( string target, string link)

symlink() creates a symbolic link from the existing target with the specified name link.

See also link() to create hard links, and readlink() along with linkinfo().

上一頁 | 首頁 | 下一頁
stream_set_write_buffer | 上一層 | tempnam


syslog

(PHP 3, PHP 4 )

syslog -- Generate a system log message

Description

int syslog ( int priority, string message)

syslog() generates a log message that will be distributed by the system logger. priority is a combination of the facility and the level, values for which are given in the next section. The remaining argument is the message to send, except that the two characters %m will be replaced by the error message string (strerror) corresponding to the present value of errno.

表格 1. syslog() Priorities (in descending order)

Constant | Description
LOG_EMERG | system is unusable
LOG_ALERT | action must be taken immediately
LOG_CRIT | critical conditions
LOG_ERR | error conditions
LOG_WARNING | warning conditions
LOG_NOTICE | normal, but significant, condition
LOG_INFO | informational message
LOG_DEBUG | debug-level message

例子 1. Using syslog()

<?php
define_syslog_variables();
// open syslog, include the process ID and also send
// the log to standard error, and use a user defined
// logging mechanism
openlog("myScripLog", LOG_PID | LOG_PERROR, LOG_LOCAL0);

// some code

if (authorized_client()) {
    // do something
} else {
    // unauthorized client!
    // log the attempt
    $access = date("Y/m/d H:i:s");
    syslog(LOG_WARNING,"Unauthorized client: $access $REMOTE_ADDR ($HTTP_USER_AGENT)");
}

closelog();
?>
For information on setting up a user defined log handler, see the syslog.conf(5) Unix manual page. More information on the syslog facilities and option can be found in the man pages for syslog(3) on Unix machines.

On Windows NT, the syslog service is emulated using the Event Log.

See also define_syslog_variables(),
openlog() and
closelog().

上一頁 | 首頁 | 下一頁
socket_set_timeout | 上一層 | Ncurses terminal screen control functions


system

(PHP 3, PHP 4 )

system -- Execute an external program and display output

Description

string system ( string command [, int return_var])

system() is just like the C version of the function in that it executes the given command and outputs the result. If a variable is provided as the second argument, then the return status code of the executed command will be written to this variable.

警告

If you are going to allow data coming from user input to be passed to this function, then you should be using escapeshellarg() or escapeshellcmd() to make sure that users cannot trick the system into executing arbitrary commands.

註: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.

The system() call also tries to automatically flush the web server's output buffer after each line of output if PHP is running as a server module.

Returns the last line of the command output on success, and FALSE on failure.

If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

See also exec(),
passthru(), popen(),
escapeshellcmd(), and the backtick operator.

上一頁 | 首頁 | 下一頁
shell_exec | 上一層 | Printer functions


tempnam

(PHP 3, PHP 4 )

tempnam -- Create file with unique file name

Description

string tempnam ( string dir, string prefix)

Creates a file with a unique filename in the specified directory. If the directory does not exist, tempnam() may generate a file in the system's temporary directory, and return the name of that.

Prior to PHP 4.0.6, the behaviour of the tempnam() function was system dependent. On Windows the TMP environment variable will override the dir parameter, on Linux the TMPDIR environment variable has precedence, while SVR4 will always use your dir parameter if the directory it points to exists. Consult your system documentation on the tempnam(3) function if in doubt.

Returns the new temporary filename, or the FALSE string on failure.

例子 1. tempnam() example

$tmpfname = tempnam ("/tmp", "FOO");

$fp = fopen($tmpfname, "w");
fwrite($fp, "writing to tempfile");
fclose($fp);

// do here something

unlink($tmpfname);

註: This function's behavior changed in 4.0.3. The temporary file is also created to avoid a race condition where the file might appear in the filesystem between the time the string was generated and before the the script gets around to creating the file. Note, that you need to remove the file in case you need it no more, it is not done automatically.

See also tmpfile() and unlink().

上一頁 | 首頁 | 下一頁
symlink | 上一層 | tmpfile


time

(PHP 3, PHP 4 )

time -- 傳回當前的 UNIX 時間戳

說明

int time ( void)

傳回自從 Unix 新紀元（格林威治時間 1970 年 1 月 1 日 00:00:00）到當前時間的秒數。

參見 date()。

上一頁 | 首頁 | 下一頁
strtotime | 上一層 | dBase functions


tmpfile

(PHP 3>= 3.0.13, PHP 4 )

tmpfile -- Creates a temporary file

Description

int tmpfile ( void)

Creates a temporary file with an unique name in write mode, returning a file handle similar to the one returned by fopen(). The file is automatically removed when closed (using fclose()), or when the script ends.

For details, consult your system documentation on the tmpfile(3) function, as well as the stdio.h header file.

例子 1. tmpfile() example

$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fclose($temp); // this removes the file

See also tempnam().

上一頁 | 首頁 | 下一頁
tempnam | 上一層 | touch


touch

(PHP 3, PHP 4 )

touch -- Sets access and modification time of file

Description

int touch ( string filename [, int time [, int atime]])

Attempts to set the access and modification time of the file named by filename to the value given by time. If the option time is not given, uses the present time. This is equivalent to what utime (sometimes referred to as utimes) does. If the third option atime is present, the access time of the given filename is set to the value of atime. Note that the access time is always modified, regardless of the number of parameters.

If the file does not exist, it is created.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

例子 1. touch() example

if (touch ($FileName)) {
    print "$FileName modification time has been
           changed to todays date and time";
} else {
    print "Sorry Could Not change modification time of $FileName";
}

上一頁 | 首頁 | 下一頁
tmpfile | 上一層 | umask


uasort

(PHP 3>= 3.0.4, PHP 4 )

uasort -- 使用用戶自定義的比較函式對陣列中的值進行排序並保持索引關聯

說明

void uasort ( array array, function cmp_function)

本函式對陣列排序並保持索引和單元之間的關聯。主要用於對那些單元順序很重要的結合陣列進行排序。比較函式是用戶自定義的。

註: 用戶自定義比較函式的例子請參考 usort() 和 uksort()。

註: 第二個參數函式名可以替換為一個陣列，該陣列由一個對象名和該對象名的一個方法名兩個元素組成。

參見 usort()，uksort()，sort()，asort()，arsort()，ksort() 和 rsort()。

上一頁 | 首頁 | 下一頁
sort | 上一層 | uksort


uksort

(PHP 3>= 3.0.4, PHP 4 )

uksort -- 使用用戶自定義的比較函式對陣列中的鍵名進行排序

說明

void uksort ( array array, function cmp_function)

本函式將使用用戶提供的比較函式對陣列中的鍵名進行排序。如果要排序的陣列需要用一種不尋常的標準進行排序，那麼應該使用此函式。

例子 1. uksort() 例子

function cmp ($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (4 => "four", 3 => "three", 20 => "twenty", 10 => "ten");

uksort ($a, "cmp");

while (list ($key, $value) = each ($a)) {
    echo "$key: $value\n";
}

本例將顯示：

20: twenty
10: ten
4: four
3: three

註: 第二個參數函式名可以替換為一個陣列，該陣列由一個對象名和該對象名的一個方法名兩個元素組成。

參見 usort()，uasort()，sort()，asort()，arsort()，ksort()，natsort() 和 rsort()。

上一頁 | 首頁 | 下一頁
uasort | 上一層 | usort


umask

(PHP 3, PHP 4 )

umask -- Changes the current umask

Description

int umask ( int mask)

umask() sets PHP's umask to mask & 0777 and returns the old umask. When PHP is being used as a server module, the umask is restored when each request is finished.

umask() without arguments simply returns the current umask.

上一頁 | 首頁 | 下一頁
touch | 上一層 | unlink


unixtojd

(PHP 4 )

unixtojd -- Convert UNIX timestamp to Julian Day

Description

int unixtojd ( [int timestamp])

Return the Julian Day for a UNIX timestamp (seconds since 1.1.1970), or for the current day if no timestamp is given.

See also jdtounix().

上一頁 | 首頁 | 下一頁
JulianToJD | 上一層 | CCVS API Functions


unlink

(PHP 3, PHP 4 )

unlink -- Deletes a file

Description

int unlink ( string filename)

Deletes filename. Similar to the Unix C unlink() function.

如果成功則傳回 TRUE，失敗則傳回 FALSE。

See also rmdir() for removing directories.

上一頁 | 首頁 | 下一頁
umask | 上一層 | Forms Data Format functions


unset

(PHP 3, PHP 4 )

unset -- Unset a given variable

Description

void unset ( mixed var [, mixed var [, ...]])

註: unset() is a language construct.

unset() destroys the specified variables. Note that in PHP 3, unset() will always return TRUE (actually, the integer value 1). In PHP 4, however, unset() is no longer a true function: it is now a statement. As such no value is returned, and attempting to take the value of unset() results in a parse error.

例子 1. unset() example

// destroy a single variable
unset ($foo);

// destroy a single element of an array
unset ($bar['quux']);

// destroy more than one variable
unset ($foo1, $foo2, $foo3);

The behavior of unset() inside of a function can vary depending on what type of variable you are attempting to destroy.

If a globalized variable is unset() inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset() was called.

function destroy_foo() {
    global $foo;
    unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;

The above example would output:

bar

If a variable that is PASSED BY REFERENCE is unset() inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset() was called.

function foo(&$bar) {
    unset($bar);
    $bar = "blah";
}

$bar = 'something';
echo "$bar\n";

foo($bar);
echo "$bar\n";

The above example would output:

something
something

If a static variable is unset() inside of a function, unset() destroyes the variable and all its references.

function foo() {
    static $a;
    $a++;
    echo "$a\n";
    unset($a);
}

foo();
foo();
foo();

The above example would output:

1
2
3

If you would like to unset() a global variable inside of a function, you can use the $GLOBALS array to do so:

function foo() {
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();

See also isset() and empty().

上一頁 | 首頁 | 下一頁
unserialize | 上一層 | var_dump


urlencode

(PHP 3, PHP 4 )

urlencode -- URL-encodes string

Description

string urlencode ( string str)

Returns a string in which all non-alphanumeric characters except -_. have been replaced with a percent (%) sign followed by two hex digits and spaces encoded as plus (+) signs. It is encoded the same way that the posted data from a WWW form is encoded, that is the same way as in application/x-www-form-urlencoded media type. This differs from the RFC1738 encoding (see rawurlencode()) in that for historical reasons, spaces are encoded as plus (+) signs. This function is convenient when encoding a string to be used in a query part of an URL, as a convenient way to pass variables to the next page:

例子 1. urlencode() example

echo '<a href="mycgi?foo=', urlencode($userinput), '">';

Note: Be careful about variables that may match HTML entities. Things like &amp, &copy and &pound are parsed by the browser and the actual entity is used instead of the desired variable name. This is an obvious hassle that the W3C has been telling people about for years. The reference is here: http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHP supports changing the argument separator to the W3C-suggested semi-colon through the arg_separator .ini directive. Unfortunately most user agents do not send form data in this semi-colon separated format. A more portable way around this is to use &amp; instead of & as the separator. You don't need to change PHP's arg_separator for this. Leave it as &, but simply encode your URLs using htmlentities()(urlencode($data)).

例子 2. urlencode/htmlentities() example

echo '<a href="mycgi?foo=', htmlentities(urlencode($userinput)), '">';

See also urldecode(),
htmlentities(),
rawurldecode(),
rawurlencode().

上一頁 | 首頁 | 下一頁
urldecode | 上一層 | Variable Functions


user_error

(PHP 4 )

user_error -- Generates a user-level error/warning/notice message

Description

void user_error ( string error_msg [, int error_type])

This is an alias for the function trigger_error().

See also error_reporting(),
set_error_handler(),
restore_error_handler(), and
trigger_error()

上一頁 | 首頁 | 下一頁
trigger_error | 上一層 | FrontBase Functions


usort

(PHP 3>= 3.0.3, PHP 4 )

usort -- 使用用戶自定義的比較函式對陣列中的值進行排序

說明

void usort ( array array, string cmp_function)

本函式將用用戶自定義的比較函式對一個陣列中的值進行排序。如果要排序的陣列需要用一種不尋常的標準進行排序，那麼應該使用此函式。

比較函式必須在第一個參數被認為小於，等於或大於第二個參數時分別傳回一個小於，等於或大於零的整數。

註: 如果兩個成員比較結果相同，則它們在排序後的陣列中的順序未經定義。直到 PHP 4.0.6 為止，用戶自定義函式將保留這些單元的原有順序。但是由於在 4.1.0 中引進了新的排序算法，結果將不是這樣了，對此也沒有一個有效的解決方案。

例子 1. usort() 例子

function cmp ($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (3, 2, 5, 6, 1);

usort ($a, "cmp");

while (list ($key, $value) = each ($a)) {
    echo "$key: $value\n";
}

本例將顯示：

0: 6
1: 5
2: 3
3: 2
4: 1

註: 很明顯在這個小例子中用 rsort() 函式更合適。

例子 2. 使用多維陣列的 usort() 例子

function cmp ($a, $b) {
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list ($key, $value) = each ($fruits)) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}

當排序多維陣列時，$a 和 $b 包含到陣列第一個索引的引用。

本例將顯示：

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

註: 第二個參數函式名可以替換為一個陣列，該陣列由一個對象名和該對象名的一個方法名兩個元素組成。

例子 3. 使用對象的成員函式的 usort() 例子

class TestObj {
    var $name;

    function TestObj($name)
    {
        $this->name = $name;
    }

    /* This is the static comparing function: */
    function cmp_obj($a, $b)
    {
        $al = strtolower($a->name);
        $bl = strtolower($b->name);
        if ($al == $bl) return 0;
        return ($al > $bl) ? +1 : -1;
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

uasort($a, array ("TestObj", "cmp_obj"));

foreach ($a as $item) {
    print $item->name."\n";
}

本例將顯示：

b
c
d

警告

如果比較函式沒有傳回相容的值的話，在某些 C 的庫中（例如 Solaris 系統）的基本的快速排序函式可能會導致 PHP 崩潰。

參見 uasort()，uksort()，sort()，asort()，arsort()，ksort()，natsort() 和 rsort()。

上一頁 | 首頁 | 下一頁
uksort | 上一層 | Aspell functions [deprecated]


var_dump

(PHP 3>= 3.0.5, PHP 4 )

var_dump -- Dumps information about a variable

Description

void var_dump ( mixed expression [, mixed expression [, ...]])

This function returns structured information about one or more expressions that includes its type and value. Arrays are explored recursively with values indented to show structure.

提示: 為了防止程序直接將結果輸出到瀏覽器，您可以使用輸出控制函式（output-control functions）來捕獲函式的輸出，並把它們保存到一個 string 型的變數中。

Compare var_dump() to print_r().

<pre>
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_dump ($a);

/* output:
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

*/

$b = 3.1;
$c = TRUE;
var_dump($b,$c);

/* output:
float(3.1)
bool(true)

*/
?>
</pre>

上一頁 | 首頁 | 下一頁
unset | 上一層 | var_export


virtual

(PHP 3, PHP 4 )

virtual -- Perform an Apache sub-request

Description

int virtual ( string filename)

virtual() is an Apache-specific function which is equivalent to <!--#include virtual...--> in mod_include. It performs an Apache sub-request. It is useful for including CGI scripts or .shtml files, or anything else that you would parse through Apache. Note that for a CGI script, the script must generate valid CGI headers. At the minimum that means it must generate a Content-type header. For PHP files, you need to use include() or require(); virtual() cannot be used to include a document which is itself a PHP file.

To run the sub-request, all buffers are terminated and flushed to the browser, pending headers are sent too.

上一頁 | 首頁 | 下一頁
getallheaders | 上一層 | 陣列函式庫


xpath_new_context

(PHP 4 >= 4.0.4)

xpath_new_context -- Creates new xpath context

Description

object xpath_new_context ( object dom document)

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

See also xpath_eval()

上一頁 | 首頁 | 下一頁
xpath_eval | 上一層 | xptr_eval


xptr_new_context

(PHP 4 >= 4.0.4)

xptr_new_context -- Create new XPath Context

Description

string xptr_new_context ( [object doc_handle])

警告

該函式目前尚無參考文檔；僅參數列表可用。

上一頁 | 首頁 | 下一頁
xptr_eval | 上一層 | .NET functions


函式的參數

通過參數列表可以傳遞訊息到函式，該列表是以逗號作為分隔符的變數和常數列表。

PHP 支援按值傳遞參數（預定）, 通過引用傳遞, 和 預定參數值. 可變長度參數列表僅在 PHP 4 和後續版本中支援；更多訊息請參照 可變長度參數列表 和涉及到的相關函式 func_num_args()， func_get_arg(), 和 func_get_args()。 PHP 3 中通過傳遞一個陣列參數可以達到類似的效果：

function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}

通過引用傳遞參數

預設情況下，函式參數通過值傳遞（因而即使在函式內部改變參數的值，它 並不會改變函式外部的值）。如果你希望允許函式修改它的參數值，你必須 通過引用傳遞參數。

如果想要函式的一個參數總是通過引用傳遞，你可以在函式定義中該參數的 前面預先加上符號（&）：

function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'

預定參數的值

函式可以定義 C++ 風格的標量參數預設值，如下：

function makecoffee ($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");

上述片斷的輸出是：
Making a cup of cappuccino.
Making a cup of espresso.

預設值必須是標量，不是（比如）變數或者類成員。

請注意當使用預定參數時，任何預定參數必須放在任何非預定參數的右側；否則， 可能函式將不會按照預期的情況工作。考慮下面的代碼片斷：

function makeyogurt ($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");   // won't work as expected

上述例子的輸出時：
Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Making a bowl of raspberry .

現在，比較上面的例子和這個例子：

function makeyogurt ($flavour, $type = "acidophilus")
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");   // works as expected

這個例子的輸出是：
Making a bowl of acidophilus raspberry.

可變長度參數列表

PHP 4 已經在用戶自定義函式中支援可變長度參數列表。這個真的很簡單， 使用 func_num_args()，func_get_arg()，和 func_get_args() 函式.

無需特別的語法，參數列表仍然能夠被明確無誤的傳遞給函式並且正常運轉。

上一頁 | 首頁 | 下一頁
函式 | 上一層 | 傳回值


舊的函式

old_function 語句允許你使用 PHP/FI2 的語法聲明函式， （你必須把‘function’替換為‘old_function’） 舊的函式

這是一個不被贊成的特性，應該只用在 PHP/FI2->PHP 3 轉換器中。

警告

以 old_function 聲明的函式無法從 PHP 的內部代碼呼叫。 除了別的事情以外, 這意味著你不能在諸如 usort()， array_walk()，和 register_shutdown_function() 等函式中使用它們。你可以通過寫一個外殼函式（以正常的 PHP 3 形式）來 呼叫 old_function。

上一頁 | 首頁 | 下一頁
傳回值 | 上一層 | 變數函式


傳回值

值通過使用可選的傳回語句傳回。任何型別都可以傳回，其中包括列表和對象。 這導致函式立即結束它的執行，並且將控制權傳遞回它被呼叫的行。更多訊息 請參照 return()。

function square ($num)
{
    return $num * $num;
}
echo square (4);   // outputs '16'.

函式不能傳回多個值，但為了獲得簡單的結果，可以傳回一個列表。

function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();

從函式傳回一個引用，你必須在函式聲明和指派傳回值給一個變數時都使用引用操作符 & ：

function &returns_reference()
{
    return $someref;
}

$newref =& returns_reference();

有關引用的更多訊息, 請查看 引用的解釋.

上一頁 | 首頁 | 下一頁
函式的參數 | 上一層 | 舊的函式


變數函式

PHP 支援變數函式的概念。這意味著如果一個變數名後有圓括號，PHP 將尋找 與變數的值相同的函式，並且將嘗試執行它。除了別的事情以外，這個可以被 用於實現回調函式，函式表等等。

變數函式不能用於語言結構，例如 echo()，
unset()，isset()，
empty() 和 include()。
儘管如此，結構 print() 卻是個例外，可以執行。
這是 PHP 函式和語言結構之間的主要不同之一。

例子 13-1. 變數函式示例

<?php
function foo()
{
    echo "In foo()<br>\n";
}

function bar($arg = '')
{
    echo "In bar(); argument was '$arg'.<br>\n";
}

$func = 'foo';
$func();
$func = 'bar';
$func('test');
?>

相關內容參考 變數的變數 和 function_exists().

上一頁 | 首頁 | 下一頁
舊的函式 | 上一層 | 類與對象


PHP 及其相關工程的歷史

PHP 手冊
上一頁 下一頁

附錄 A. PHP 及其相關工程的歷史

目錄
PHP 的歷史
PHP 相關工程的歷史
PHP 相關書籍
PHP 相關文章

PHP 在過去的幾年裡走過了漫長的道路。成長為處理 Web 的最卓越的語言並非易事。如果您對 PHP 如何發展到今天很感興趣，那麼，請繼續讀下去吧。

PHP 的歷史

PHP/FI

PHP 繼承自一個老的工程，名叫 PHP/FI。PHP/FI 在1995年由 Rasmus Lerdorf 創建，最初只是一套簡單的 Perl 腳本，用來跟蹤連接他主頁的人們的訊息。它給這一套腳本取名為“Personal Home Page Tools”。隨著更多功能需求的增加，Rasmus 寫了一個更大的 C 語言的實現，它可以連接資料庫，可以讓用戶開發簡單的動態 Web 程序。Rasmus 公開了 PHP/FI 的原始碼，以便每個人都可以使用它，同時大家也可以修正它的Bug並且改進它的原始碼。

PHP/FI，一個專為個人主頁/表單提供解釋程序的程序，已經包含了今天 PHP 的一些基本功能。它有著 Perl 樣式的變數，自動解釋表單變數，並可以嵌入 HTML。語法本身與 Perl 很相似，但是它很有限，很簡單，還稍微有些不協調。

到1997年，PHP/FI 2.0，也就是它的 C 語言實現的第二版在全世界已經有幾千個用戶（估計）和大約 50,000 個域名安裝，大約是 Internet 所有域名的 1%。但是那時只有幾個人在為該工程撰寫少量當代碼，它仍然只是一個人的工程。

PHP/FI 2.0 在經歷了數個beta版本的發布後於1997年11月發布了官方正式版本。不久，PHP 3.0 的第一個 alpha 版本的發布，PHP 從此走向了成功。

PHP 3

PHP 3.0 是類似於當今 PHP 語法結構的第一個版本。Andi Gutmans 和 Zeev Suraski 在開發他們的商業程序時，發現 PHP/FI 2.0 功能明顯不足，於是他們重寫了代碼。這就是 PHP 3.0。經過Andi, Rasmus 和 Zeev 一系列的努力，考慮到 PHP/FI 已存在的用戶群，他們決定聯合發布 PHP 3.0 作為 PHP/FI 2.0 的官方後繼版本。而 PHP/FI 2.0 的進一步開發幾乎終止了。

PHP 3.0 的一個最強大的功能是它的可擴展性。除了給最終用戶提供資料庫、協議和 API 的基礎結構，它的可擴展性還吸引了大量的開發人員加入並送出新的模塊。後來証實，這是 PHP 3.0 取得巨大成功的關鍵。PHP 3.0 中的其它關鍵功能包括面向對象的支援和更強大和協調的語法結構。

這個全新的語言伴隨著一個新的名稱發布。它從 PHP/FI 2.0 的名稱中移去了暗含“本語言只限於個人使用”的部分。它被命名為簡單的縮寫“PHP”。這是一種遞歸的縮寫，它的全稱是──PHP: Hypertext Preprocessor。

1998 年末，PHP 的安裝人數幾近10,000，有大約100,000個網站報告他們使用了PHP。在 PHP 3.0 的頂峰，Internet 上 10% 的 Web 伺服器上都安裝了它。

約九個月的公開測試後，官方於1998年6月正式發布 PHP 3.0。

PHP 4

1998 年的冬天，PHP 3.0 官方發布不久，Andi Gutmans 和 Zeev Suraski 開始重新編寫 PHP 代碼。設計目標是增強複雜程序執行時的性能和 PHP 自身代碼的模塊性。PHP 3.0 的新功能和廣泛的第三方資料庫、API的支援使得這樣程序的編寫成為可能，但是 PHP 3.0 沒有高效處理如此複雜程序的能力。

新的被稱為“Zend Engine”（這是 Zeev 和 Andi 的縮寫）的引擎，成功的實現了設計目標，並在1999年中期首次引入 PHP。基於該引擎並結合了更多新功能的 PHP 4.0，在 PHP 3.0 發布兩年後，於2000年5月發布了官方正式版本。除了更高的性能以外，PHP 4.0 還包含了其它一些關鍵功能，比如：支援更多的 Web 伺服器；HTTP Sessions 支援；輸出緩存(output buffering)；更安全的處理用戶輸入的方法；一些新的語言結構。

PHP 4 是當前 PHP 的最新版本。修改和增強 Zend Engine 以使 PHP 5.0 整合新功能的工作已經開始。

今天，已經有10,000名開發人員（估計）和幾百萬網站報告已安裝了 PHP，占整個 Internet 域名的 20%。

PHP 的開發小組有很多優秀的開發人員，同時還有大量的優秀人才在進行 PHP 相關工程的開發工作，如 PEAR 和 PHP 文檔的工程。

PHP 5

PHP 的未來主要受其核心，Zend Engine 控制。PHP 5 將包含新一代的 Zend Engine 2.0。請連接其網站以獲取更多關於該引擎的訊息。

上一頁 | 首頁 | 下一頁
附錄 | 上一層 | PHP 相關工程的歷史


PHP 相關書籍

隨著 PHP 的成長，人們越來越認識到它是一個世界流行的開發平台。看到這種趨勢的最有趣方法之一就是：這些年 PHP 相關書籍越來越多。

據我們所知，最早的 PHP 專業書籍是“php- dynamische webauftritte professionell realisieren”──一本1999年出版的德國書籍，作者是 Egon Schmid、Christian Cartus 和 Richard Blume。第一本關於 PHP 的英文書隨後出版，書名是“Core PHP Programming”，作者為： Leon Atkinson。這兩本書都是寫 PHP 3.0 的。

這兩本書是這類圖書的第一本──隨後，大量的 PHP 相關圖書上市。英文版本超過40種，德文50種，法文20種！除此之外，你可以發現西班牙文、韓文、日文、中文和希伯來文等等語言版本的 PHP 相關圖書。

這麼大量的圖書，這麼多作者的寫作，這麼多出版商的出版，並出現了這麼多語言的版本──這強烈的証明 PHP 在世界範圍內的成功！

上一頁 | 首頁 | 下一頁
PHP 相關工程的歷史 | 上一層 | PHP 相關文章


PHP 相關文章

據我們所知，關於 PHP 的在雜志上的第一篇文章於 1998 年末在法國的“Informatiques Magazine”雜志上發表，是描述 PHP 3.0 的。據記載，這是大量出版在雜志上 PHP 相關文章的第一篇。

關於 PHP 的文章出現在 Dr. Dobbs、Linux Enterprise、Linux Magazine等等出版物上。關於在 Windows 下如何轉換 ASP 程序到 PHP 的文章甚至出現在了微軟自己的 MSDN 上！

上一頁 | 首頁 | 下一頁
PHP 相關書籍 | 上一層 | 從 PHP 3 移植到 PHP 4


PHP 相關工程的歷史

PEAR

PEAR，PHP 擴展與應用資源庫（the PHP Extension and Application Repository，原為 PHP Extension and Add-on Repository）是 PHP 程序的基礎類，並可能在將來增強為在開發人員間分發 PHP 和 C 語言編寫的 PHP 擴展的關鍵方法。

PEAR 在2000年1月於 Tel Aviv 舉行的 PHP 開發者會議(PDM)中誕生。這個工程由 Stig S. Bakken 創建。現在，他正專注於他的第一個小女兒，Malin Bakken。

2000 年早些時候，PEAR 已經成長為一個巨大的，有意義的工程。大量的開發人員在為實現普通的、可重用德、功能強大的代碼而努力工作著。這給整個 PHP 團體都帶來極大的益處。今天 PEAR 包含了大量的基礎類，包括資料庫連接、內容緩存、數學計算、電子商務等等。

PHP 質量保証體系(QA)

PHP 質量保証體系於2000年夏設立，因為用戶批評 PHP 在發布前沒有進行足夠的針對產品環境的測試。質量保証小組由精通 PHP 基礎代碼的核心人員組成。這些開發人員將精力花費在本地化和修複 PHP 的 Bug 上。除此之外，其他小組成員也在各種不同的平台上對這些修複進行測試並提供反饋訊息。

PHP-GTK

PHP-GTK 是編寫客戶端圖形用戶界面(GUI)程序的 PHP 解決方案。Andrei Zmievski 回憶了 PHP-GTK 計劃和創建的過程：

“我總是對 GUI 編程有著濃厚的興趣。我發現 Gtk+ 是一個非常好的工具包，除了一點──它使用的 C 語言很令人乏味。目睹了 PyGtk 和 GTK-Perl 的實現，我決定嘗試 PHP 是否也能夠被做成 Gtk+ 的接口。2000年8月，我有了更多的業餘時間，於是我開始試驗。我參考了 PyGtk 的實現方法，因為它有著相當完全的實現和漂亮的面向對象的接口。James Henstridge，PyG的作者，在最初的籌備階段提供了極大的幫助。

“手工寫 Gtk+ 函式全部的接口幾乎是不可能的事情，所以我把重點放在了代碼產生上，就像 PyGtk 做的一樣。代碼產生器是一個PHP 程序，它可以讀取包含 Gtk+ 類、常數和方法訊息的一系列的 .defs 文件並產生與 PHP 相接口的 C 代碼。無法自動產生的部分可以送出到 .overrides 文件。

“代碼產生器和基礎結構的工作花了我一定的時間，因為我在2000年秋天這段時間裡只能花很少的時間在 PHP-GTK 上。在我把 PHP-GTK 給 Frank Kromann 演示過後，他產生了濃厚的興趣，並開始幫助我完成代碼產生器和 Win32 的實現。當我們寫了第一個 Hello World 程序並設法使之工作之時，我們的喜悅之情溢於言表。兩個多月後，這個工程初見成效，並於2001年3月1日發布了內部版本。這個故事迅速的打擊了 SlashDot。(The story promptly hit SlashDot.)(TODO)

“感到 PHP-GTK 前景廣闊，我便為它專門設置了郵件列表和 CVS 知識庫。同時，gtk.php.net 網站也在 Colin Viebrock 的幫助下建立起來。文檔的工作也由 James Moore 承擔起來。

“PHP-GTK 發布之後，它愈加流行。我們有自己的文檔小組，手冊持續更新。人們開始為 PHP-GTK 編寫擴展。越來越多的程序已經開始使用它了。

上一頁 | 首頁 | 下一頁
PHP 及其相關工程的歷史 | 上一層 | PHP 相關書籍


PHP 手冊

Stig Sæther Bakken
Alexander Aulbach
Egon Schmid
Jim Winstead
Lars Torben Wilson
Rasmus Lerdorf
Andrei Zmievski
Jouni Ahto

編輯

穆少磊
肖盛文
宋琪
李達
黃嘯宇
王遠之
孫慮

02-11-2002

版權 © 1997, 1998, 1999, 2000, 2001, 2002 PHP 文檔小組

目錄
前言
I. 入門指引
1. 簡介
2. 簡易教學
3. 安裝
4. Configuration
5. Security
II. 語言參考
6. 基本語法
7. 型別
8. 變數
9. 常數
10. 表達式
11. 運算符
12. 流程控制
13. 函式
14. 類與對象
15. 引用的解釋
III. 特點
16. 用 PHP 進行 HTTP 認証
17. Cookies
18. 文件上傳處理
19. 使用遠程文件
20. 連接處理
21. 資料庫永久連接
22. 安全模式
23. PHP 的命令行模式
IV. 函式參考
I. Apache 專用函式
II. 陣列函式庫
III. Aspell functions [deprecated]
IV. BCMath Arbitrary Precision Mathematics Functions
V. Bzip2 Compression Functions
VI. Calendar functions
VII. CCVS API Functions
VIII. COM support functions for Windows
IX. Class/Object Functions
X. ClibPDF functions
XI. Crack functions
XII. CURL, Client URL Library Functions
XIII. Cybercash payment functions
XIV. Crｅdit Mutuel CyberMUT functions
XV. Cyrus IMAP administration functions
XVI. Character type functions
XVII. Database (dbm-style) abstraction layer functions
XVIII. 時間日期函式庫
XIX. dBase functions
XX. DBM Functions
XXI. dbx functions
XXII. DB++ Functions
XXIII. Direct IO functions
XXIV. 目錄函式庫
XXV. DOM XML functions
XXVI. .NET functions
XXVII. Error Handling and Logging Functions
XXVIII. FrontBase Functions
XXIX. filePro functions
XXX. 文件系統函式庫
XXXI. Forms Data Format functions
XXXII. FriBiDi functions
XXXIII. FTP functions
XXXIV. Function Handling functions
XXXV. Gettext
XXXVI. GMP functions
XXXVII. HTTP functions
XXXVIII. Hyperwave functions
XXXIX. Hyperwave API functions
XL. iconv functions
XLI. Image functions
XLII. IMAP, POP3 and NNTP functions
XLIII. Informix functions
XLIV. InterBase functions
XLV. Ingres II functions
XLVI. IRC Gateway Functions
XLVII. PHP / Java Integration
XLVIII. LDAP functions
XLIX. Mail functions
L. mailparse functions
LI. 數學函式
LII. Multi-Byte String Functions
LIII. MCAL functions
LIV. Mcrypt Encryption Functions
LV. MCVE Payment Functions
LVI. Mhash Functions
LVII. Mimetype Functions
LVIII. Microsoft SQL Server functions
LIX. Ming functions for Flash
LX. Miscellaneous functions
LXI. mnoGoSearch Functions
LXII. mSQL functions
LXIII. MySQL 函式庫
LXIV. Mohawk Software session handler functions
LXV. muscat functions
LXVI. Network Functions
LXVII. Ncurses terminal screen control functions
LXVIII. Lotus Notes functions
LXIX. Unified ODBC functions
LXX. Object Aggregation/Composition Functions
LXXI. Oracle 8 函式
LXXII. OpenSSL functions
LXXIII. Oracle 函式
LXXIV. Ovrimos SQL functions
LXXV. Output Control Functions
LXXVI. Object property and method call overloading
LXXVII. PDF functions
LXXVIII. Verisign Payflow Pro functions
LXXIX. PHP Options&Information
LXXX. POSIX functions
LXXXI. PostgreSQL 資料庫函式庫
LXXXII. Process Control Functions
LXXXIII. Program Execution functions
LXXXIV. Printer functions
LXXXV. Pspell Functions
LXXXVI. GNU Readline
LXXXVII. GNU Recode functions
LXXXVIII. Regular Expression Functions (Perl-Compatible)
LXXXIX. qtdom functions
XC. Regular Expression Functions (POSIX Extended)
XCI. Semaphore, Shared Memory and IPC Functions
XCII. SESAM database functions
XCIII. Session handling functions
XCIV. Shared Memory Functions
XCV. Shockwave Flash functions
XCVI. SNMP functions
XCVII. Socket functions
XCVIII. String functions
XCIX. Sybase functions
C. Tokenizer functions
CI. URL Functions
CII. Variable Functions
CIII. vpopmail functions
CIV. W32api functions
CV. WDDX Functions
CVI. XML 語法解析函式
CVII. XML-RPC functions
CVIII. XSLT functions
CIX. YAZ functions
CX. YP/NIS Functions
CXI. Zip File Functions (Read Only Access)
CXII. Zlib Compression Functions
V. Extending PHP 4.0
24. Overview
25. Extension Possibilities
26. Source Layout
27. PHP's Automatic Build System
28. Creating Extensions
29. Using Extensions
30. Troubleshooting
31. Source Discussion
32. Accepting Arguments
33. Creating Variables
34. Duplicating Variable Contents: The Copy Constructor
35. Returning Values
36. Printing Information
37. Startup and Shutdown Functions
38. Calling User Functions
39. Initialization File Support
40. Where to Go from Here
41. Reference: Some Configuration Macros
42. API Macros
43. Streams API for PHP Extension Authors
Overview
Streams Basics
Streams Common API Reference
Streams Dir API Reference
Streams File API Reference
Streams Socket API Reference
Streams Structures
Streams Constants
VI. FAQ: 常見問題
44. 一般訊息
45. 郵件列表
46. 獲取 PHP
47. 資料庫問題
48. 安裝
49. 編譯問題
50. 使用 PHP
51. PHP 和 HTML
52. PHP 和 COM
53. PHP 和其它語言
54. 從 PHP/FI 2 移植到 PHP 3
55. 從 PHP 3 移植到 PHP 4
56. 雜類問題
VII. 附錄
A. PHP 及其相關工程的歷史
B. 從 PHP 3 移植到 PHP 4
C. 從 PHP/FI 2 移植到 PHP 3
D. 排除 PHP 程序的錯誤
E. 擴展 PHP
F. 函式別名列表
G. 保留字列表
H. 資源型別列表
I. 支援的協議／封裝協議列表
J. 解析器代號列表
K. 關於本手冊
L. 補充說明
下一頁
前言


Apache 伺服器

本節包括 Apache 下安裝 PHP 的說明和提示，包括 Unix 和 Windows 版本。

Unix 下的 Apache 中安裝 PHP 的詳細資料

你可以根據完整配置選項列表在以下第 10 行中加入你選擇的參數。這裡把具體版本號略去了以確保本說明的不會出錯。你需要把下面的 'xxx' 替換成你得到的文件中確切的數值。

例子 3-5. PHP 4 的 Apache 共享模塊版本安裝說明

1.  gunzip apache_xxx.tar.gz
2.  tar -xvf apache_xxx.tar
3.  gunzip php-xxx.tar.gz
4.  tar -xvf php-xxx.tar
5.  cd apache_xxx
6.  ./configure --prefix=/www --enable-module=so
7.  make
8.  make install
9.  cd ../php-xxx
10. ./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install

  如果在安裝之後你決定修改配置選項，那麼只需重複以上最後三步。
  只須重新啟動 Apache 就可以使新模塊生效。不需要重新編譯 Apache。

13. cp php.ini-dist /usr/local/lib/php.ini

  你可以編輯 php.ini 來設置 PHP 選項。如果你想把 php.ini 放在
  其它目錄，在第 10 步加上以下選項：
  --with-config-file-path=/path

14. 編輯 httpd.conf 或者 srm.conf 文件，確認以下兩行存在並且沒有被註釋：

   AddType application/x-httpd-php .php

   LoadModule php4_module        libexec/libphp4.so

  你可以在這裡使用任何後綴。.php 只是我們建議的一個。你甚至可以
  加上 .html 以及 .php3 以確保向下相容。

  在 LoadModule 語句右邊的路徑必須指向你的 PHP 模塊所在的路徑。
  如果按照以上步驟進行那麼上面的語句是正確的。

15. 用你通常的過程啟動 Apache。(你必須完全停止 Apache 再重新啟動，
    而不是用 HUP 或者 USR1 信號使 Apache 重新加載。)

根據你的 Unix 系統和 Apache 安裝方法的不同，有很多方法停止和重啟動 Apache。以下是一些不同的 Apache/Unix 下重啟動 Apache 的典型命令。你需要把 /path/to/ 替換成你系統上的確切路徑。

1. 在一些 Linux 和 SysV 的變種下：
/etc/rc.d/init.d/httpd restart

2. 使用 apachectl 腳本：
/path/to/apachectl stop
/path/to/apachectl start

3. httpdctl 和 httpsdctl（使用了 OpenSSL），類似 apachectl：
/path/to/httpsdctl stop
/path/to/httpsdctl start

4. 使用了 mod_ssl，或其他 SSL 伺服器，你可能需要手工重啟動：
/path/to/apachectl stop
/path/to/apachectl startssl

apachectl 和 http(s)dctl 程序所在的路徑在不同系統中通常不一樣。如果你的系統中有 locate 或者 whereis 或者 which 命令，那麼可以幫你找到這些控制程序。

編譯 PHP 和 Apache 的不同例子還有：

./configure --with-apxs --with-pgsql

這個配置將產生在 Apache 的 httpd.conf 文件中用 LoadModule 加載的 libphp4.so 共享庫。而 PostgreSQL 支援將嵌入到 libphp4.so 庫中。

./configure --with-apxs --with-pgsql=shared

這個配置將產生 Apache 的 libphp4.so 共享庫，並且還產生 pgsql.so 共享庫，可以在 php.ini 文件中用 extension 指令加載，或者在 PHP 腳本中用 dl() 函式明確地加載。

./configure --with-apache=/path/to/apache_source --with-pgsql

這個配置將產生 libmodphp4.a 庫，mod_php4.c 和一些相關的文件並且拷貝到 Apache 源程序目錄中的 src/modules/php4 目錄下。然後用 --activate-module=src/modules/php4/libphp4.a 編譯 Apache，Apache 編譯系統會產生 libphp4.a 並且將其靜態地連接到 httpd 程序中。PostgreSQL 支援也直接包括在這個 httpd 程序中了，因此最終結果是單一的一個包括了所有 Apache 和 PHP 支援的 httpd 可執行文件。

./configure --with-apache=/path/to/apache_source --with-pgsql=shared

這個配置和上面一樣 － 除了沒有在最後的 httpd 可執行文件中包括 PostgreSQL 的支援以及產生了一個 pgsql.so 共享庫以外。該共享庫可以在 php.ini 文件中或者用 dl() 函式加載。

當選擇不同的方法編譯 PHP 時，需要考慮每種方法的優勢和缺點。用共享對象方式編譯 PHP 意味著可以單獨編譯 Apache，並且不用在增加或修改了 PHP 的時候重新編譯所有程序。用內置方法編譯 PHP（靜態方式）意味著 PHP 可以加載和執行得更快。更多訊息見 Apache 的 DSO 支援頁面。

註: Apache 預定的 httpd.conf 文件中目前包括類似如下的內容：

User nobody
Group "#-1"

除非你把它修改成“Group nogroup”或者其它類似的（“Group daemon”也很通用），PHP 將不能打開文件。

註: 確認在使用 --with-apxs=/path/to/apxs 時指向 Apache 安裝後的目錄中的 apxs。絕對不能用 Apache 源程序中的 apxs 而要用安裝後的 apxs。

Windows 下在 Apache 1.3.x 中安裝 PHP

有兩種方式使 PHP 工作於 Windows 下的 Apache 1.3.x。一種是 CGI 方式（php.exe），另一種是使用 Apache 模塊 DLL。不管哪種方式都需要停止 Apache，編輯 srm.conf 或者 httpd.conf 來配置 Apache 以加入PHP支援。

值得在這裡指出現在 Windows 下的 SAPI 模塊更加穩定了，我們推薦使用模塊方式，因為更加透明和安全。

儘管有幾種不同方法在 Apache 下配置 PHP，但是對新手來說還是非常簡單易用的。有關更多的 httpd.conf 配置指令請參考 Apache 文檔。

如果你按照手工安裝步驟一節中的說明把 PHP 解壓縮到了 c:\php\ 目錄下，那麼需要加入以下三行到 Apache 配置文件中以 CGI 方式安裝：

  • ScriptAlias /php/ "c:/php/"

  • AddType application/x-httpd-php .php .phtml

  • Action application/x-httpd-php "/php/php.exe"

注意上面的第二行在原來的 httpd.conf 中就有的，不過被註釋了。還有記住用你自己放置 PHP 的路徑替換 c:/php/。

警告

在 CGI 方式下，你的伺服器可能會受到幾種攻擊的影響。閱讀 CGI 安全一節學習如何防止攻擊。

如果你想在 Apache 中用模塊方式使用 PHP，確認把 php4ts.dll 拷貝到 windows/system（Windows 9x/Me）或者 winnt/system32（Windows NT/2000/XP）目錄下，覆蓋原來的文件。然後在 Apache 配置文件中加入以下兩行：

  • LoadModule php4_module c:/php/sapi/php4apache.dll

  • AddType application/x-httpd-php .php .phtml

修改了配置文件之後記住重新啟動 Apache，例如如果你的 Apache 是作為 Windows 的服務安裝的，NET STOP APACHE 後面接上 NET START APACHE。或者用你通常使用的快捷方式。

註: 在用 Apache 的 Windows installer 安裝之後，你可能發現需要在配置文件（httpd.conf）中用 AddModule 指令定義 mod_php4.c。在配置文件接近開頭的地方有一些 AddModule 指令，在其中加入 AddModule mod_php4.c 一行。如果定義了 ClearModuleList 指令的話這一步尤其重要。如果不這麼做可能會導致 PHP 不能被註冊為 Apache 的模塊。

有兩種方式使用源程序語法彩色顯示特色，但是取決於你的安裝方法。如果你配置了 Apache 的 SAPI 模塊方式使用 PHP，那麼加入下面一行就可以使用本特色：AddType application/x-httpd-php-source .phps

如果你用 CGI 方式使用 PHP，那你需要用 show_source() 函式。建立一個 PHP 文件，加入以下代碼：<?php show_source ("original_php_script.php"); ?>。用你想要顯示原始碼的文件名替換掉 original_php_script.php。

註: 在 Windows-Apache 組合中，所有路徑中的反斜線例如 "c:\directory\file.ext" 都必須轉換成斜線，如 "c:/directory/file.ext"。

上一頁 | 首頁 | 下一頁
Servers-CGI/Commandline | 上一層 | Caudium 伺服器


Caudium 伺服器

PHP 4 可以被編譯為 Caudium Web 伺服器的一個 Pike 模塊。注意 PHP 3 並不可以這麼做。請參考下面的安裝說明以將 PHP 4 安裝到 Caudium 伺服器中。

例子 3-6. Caudium 安裝說明

1.  在安裝 PHP 4 之前請確認您已經正確安裝了 Caudium 伺服器。
    要想使 PHP 4 正確的工作，您還需要 Pike 7.0.268 或更高版本。
    為了方便起見，我們假定 Caudium 安裝在 /opt/caudium/server/ 中。
2.  進入目錄 php-x.y.z （x.y.z 是 PHP 的版本號）。
3.  ./configure --with-caudium=/opt/caudium/server
4.  make
5.  make install
6.  如果 Caudium 正在執行請重新啟動它。
7.  登錄圖形配置界面，進入需要 PHP 4 支援的虛擬伺服器。
8.  點擊 Add Module 之後點擊 locate，然後增加 PHP 4 腳本支援模塊。
9.  如果出現 'PHP 4 interpreter isn't available' 的錯誤提示，
    請重新啟動您的 Web 伺服器。如果還是不行，請檢查
    /opt/caudium/logs/debug/default.1 中是否有與
    <filename>PHP4.so</filename> 文件相關的錯誤。您也要查看
    <filename>caudium/server/lib/[pike-version]/PHP4.so</filename>
    這個文件是否存在。
10. 如果需要，請配置 PHP 腳本支援模塊。

您當然可以將各種 PHP 4 的擴展模塊編譯到 Caudium 伺服器中。請參閱 configure 選項完全列表 以獲得完整的訊息。

註: 當編譯 PHP 4 的 MySQL 的支援時，您必須確認使用了正常的 MySQL 客戶端代碼。否則如果您的 Pike 已經支援 MySQL，就會產生衝突。您應該在編譯的時候使用 --with-mysql 選項指定 MySQL 的安裝目錄。

上一頁 | 首頁 | 下一頁
Apache 伺服器 | 上一層 | Servers-fhttpd


Servers-CGI/Commandline

The default is to build PHP as a CGI program. This creates a commandline interpreter, which can be used for CGI processing, or for non-web-related PHP scripting. If you are running a web server PHP has module support for, you should generally go for that solution for performance reasons. However, the CGI version enables Apache users to run different PHP-enabled pages under different user-ids. Please make sure you read through the Security chapter if you are going to run PHP as a CGI.

Testing

If you have built PHP as a CGI program, you may test your build by typing make test. It is always a good idea to test your build. This way you may catch a problem with PHP on your platform early instead of having to struggle with it later.

Benchmarking

If you have built PHP 3 as a CGI program, you may benchmark your build by typing make bench. Note that if Safe Mode is on by default, the benchmark may not be able to finish if it takes longer then the 30 seconds allowed. This is because the set_time_limit() can not be used in safe mode. Use the max_execution_time configuration setting to control this time for your own scripts. make bench ignores the configuration file.

註: make bench is only available for PHP 3.

Using Variables

Some server supplied enviroment variables are not defined in the current CGI/1.1 specification. Only the following variables are defined there; everything else should be treated as 'vendor extensions': AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL and SERVER_SOFTWARE

上一頁 | 首頁 | 下一頁
Windows 系統下的安裝 | 上一層 | Apache 伺服器


Complete list of configure options

註: These are only used at compile time. If you want to alter PHP's runtime configuration, please see the chapter on Configuration.

The following is a complete list of options supported by PHP 4 configure scripts (as of 4.1.0), used when compiling in Unix-like environments. Some are available in PHP 3, some in PHP 4, and some in both. This is not noted yet.

There are general configuration options for the configure script, consult the appropriate manual pages for GNU autoconf or use the command configure --help for a full, up-to-date list.

  • Database

  • Graphics

  • Miscellaneous

  • PHP Behaviour

  • Server

  • XML

Configure Options in PHP 4

註: These options are only used in PHP 4 as of PHP 4.1.0. Some are available in older versions of PHP 4, some even in PHP 3, some only in PHP 4.1.0. If you want to compile an older version, some options will probably not be available.

Database options

--with-db

Include old xDBM support (deprecated).

--enable-dba=shared

Build DBA as a shared module.

--with-gdbm[=DIR]

Include GDBM support.

--with-ndbm[=DIR]

Include NDBM support.

--with-db2[=DIR]

Include Berkeley DB2 support.

--with-db3[=DIR]

Include Berkeley DB3 support.

--with-dbm[=DIR]

Include DBM support.

--with-cdb[=DIR]

Include CDB support.

--enable-dbase

Enable the bundled dbase library.

--with-dbplus

Include dbplus support.

--enable-dbx

Enable dbx.

--with-fbsql[=DIR]

Include FrontBase support. DIR is the FrontBase base directory.

--enable-filepro

Enable the bundled read-only filePro support.

--with-fribidi[=DIR]

Include fribidi support (requires FriBidi >=0.1.12). DIR is the fribidi installation directory - default /usr/local/.

--with-informix[=DIR]

Include Informix support. DIR is the Informix base install directory, defaults to nothing.

--with-ingres[=DIR]

Include Ingres II support. DIR is the Ingres base directory (default /II/ingres).

--with-interbase[=DIR]

Include InterBase support. DIR is the InterBase base install directory, defaults to /usr/interbase.

--with-msql[=DIR]

Include mSQL support. DIR is the mSQL base install directory, defaults to /usr/local/Hughes.

--with-mysql[=DIR]

Include MySQL support. DIR is the MySQL base directory. If unspecified, the bundled MySQL library will be used.

--with-oci8[=DIR]

Include Oracle-oci8 support. Default DIR is ORACLE_HOME.

--with-adabas[=DIR]

Include Adabas D support. DIR is the Adabas base install directory, defaults to /usr/local.

--with-sapdb[=DIR]

Include SAP DB support. DIR is SAP DB base install directory, defaults to /usr/local.

--with-solid[=DIR]

Include Solid support. DIR is the Solid base install directory, defaults to /usr/local/solid.

--with-ibm-db2[=DIR]

Include IBM DB2 support. DIR is the DB2 base install directory, defaults to /home/db2inst1/sqllib.

--with-empress[=DIR]

Include Empress support. DIR is the Empress base install directory, defaults to $EMPRESSPATH. From PHP4, this option only supports Empress Version 8.60 and above.

--with-empress-bcs[=DIR]

Include Empress Local Access support. DIR is the Empress base install directory, defaults to $EMPRESSPATH. From PHP4, this option only supports Empress Version 8.60 and above.

--with-birdstep[=DIR]

Include Birdstep support. DIR is the Birdstep base install directory, defaults to /usr/local/birdstep.

--with-custom-odbc[=DIR]

Include a user defined ODBC support. The DIR is ODBC install base directory, which defaults to /usr/local. Make sure to define CUSTOM_ODBC_LIBS and have some odbc.h in your include dirs. E.g., you should define following for Sybase SQL Anywhere 5.5.00 on QNX, prior to run configure script: CPPFLAGS="-DODBC_QNX -DSQLANY_BUG" LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc".

--with-iodbc[=DIR]

Include iODBC support. DIR is the iODBC base install directory, defaults to /usr/local.

--with-esoob[=DIR]

Include Easysoft OOB support. DIR is the OOB base install directory, defaults to /usr/local/easysoft/oob/client.

--with-unixODBC[=DIR]

Include unixODBC support. DIR is the unixODBC base install directory, defaults to /usr/local.

--with-openlink[=DIR]

Include OpenLink ODBC support. DIR is the OpenLink base install directory, defaults to /usr/local. This is the same as iODBC.

--with-dbmaker[=DIR]

Include DBMaker support. DIR is the DBMaker base install directory, defaults to where the latest version of DBMaker is installed (such as /home/dbmaker/3.6).

--with-oracle[=DIR]

Include Oracle-oci7 support. Default DIR is ORACLE_HOME.

--with-ovrimos[=DIR]

Include Ovrimos SQL Server support. DIR is the Ovrimos' libsqlcli install directory.

--with-pgsql[=DIR]

Include PostgreSQL support. DIR is the PostgreSQL base install directory, defaults to /usr/local/pgsql. Set DIR to shared to build as a dl, or shared,DIR to build as a dl and still specify DIR.

--with-sybase[=DIR]

Include Sybase-DB support. DIR is the Sybase home directory, defaults to /home/sybase.

--with-sybase-ct[=DIR]

Include Sybase-CT support. DIR is the Sybase home directory. Defaults to /home/sybase.

--disable-unified-odbc

Disable unified ODBC support. Only applicable if iODBC, Adabas, Solid, Velocis or a custom ODBC interface is enabled. PHP 3 only!

Graphics options

--with-gd[=DIR]

Include GD support (DIR is GD's install dir). Set DIR to shared to build as a dl, or shared,DIR to build as a dl and still specify DIR.

--enable-gd-native-ttf

GD: Enable TrueType string function in gd.

--with-jpeg-dir=DIR

GD: Set the path to libjpeg install prefix.

--with-png-dir=DIR

GD: Set the path to libpng install prefix.

--with-xpm-dir=DIR

GD: Set the path to libXpm install prefix.

--with-freetype-dir=DIR

GD: Set the path to freetype2 install prefix.

--with-ttf[=DIR]

GD: Include FreeType 1.x support.

--with-t1lib[=DIR]

GD: Include T1lib support.

--with-cpdflib[=DIR]

Include cpdflib support (requires cpdflib >= 2). DIR is the cpdfllib install directory, defaults to /usr.

--with-jpeg-dir[=DIR]

jpeg dir for cpdflib 2.x.

--with-tiff-dir[=DIR]

tiff dir for cpdflib 2.x.

--with-pdflib[=DIR]

Include PDFlib support. DIR is the pdflib base install directory, defaults to /usr/local. Set DIR to shared to build as dl, or shared,DIR to build as dl and still specify DIR.

--with-jpeg-dir[=DIR]

PDFLIB: define libjpeg install directory.

--with-png-dir[=DIR]

PDFLIB: define libpng install directory.

--with-tiff-dir[=DIR]

PDFLIB: define libtiff install directory.

--with-swf[=DIR]

Include swf support.

--without-gd

Disable GD support. PHP 3 only!

--with-imagick

Include ImageMagick support. DIR is the install directory, and if left out, PHP will try to find it on its own. [experimental]. PHP 3 only!

--with-ming[=DIR]

Include ming support.

Misc options

--enable-force-cgi-redirect

Enable the security check for internal server redirects. You should use this if you are running the CGI version with Apache.

--enable-discard-path

If this is enabled, the PHP CGI binary can safely be placed outside of the web tree and people will not be able to circumvent .htaccess security.

--with-fastcgi=SRCDIR

Build PHP as FastCGI application.

--enable-debug

Compile with debugging symbols.

--with-layout=TYPE

Sets how installed files will be laid out. Type is one of PHP (default) or GNU.

--with-pear=DIR

Install PEAR in DIR (default PREFIX/lib/php).

--without-pear

Do not install PEAR.

--with-openssl[=DIR]

Include OpenSSL support (requires OpenSSL >= 0.9.5).

--enable-sigchild

Enable PHP's own SIGCHLD handler.

--disable-rpath

Disable passing additional runtime library search paths.

--enable-libgcc

Enable explicitly linking against libgcc.

--enable-php-streams

Include experimental php streams. Do not use unless you are testing the code!

--with-zlib-dir=<DIR>

Define the location of zlib install directory.

--with-zlib[=DIR]

Include zlib support (requires zlib >= 1.0.9). DIR is the zlib install directory.

--with-aspell[=DIR]

Include ASPELL support.

--enable-bcmath

Enable bc style precision math functions.

--with-bz2[=DIR]

Include BZip2 support.

--enable-calendar

Enable support for calendar conversion.

--with-ccvs[=DIR]

Include CCVS support.

--with-crack[=DIR]

Include crack support.

--enable-ctype

Enable ctype support.

--with-curl[=DIR]

Include CURL support.

--with-cybercash[=DIR]

Include CyberCash support. DIR is the CyberCash MCK install directory.

--with-cybermut[=DIR]

Include CyberMut (French Credit Mutuel telepaiement).

--with-cyrus

Include cyrus IMAP support.

--enable-exif

Enable exif support.

--with-fdftk[=DIR]

Include fdftk support.

--enable-ftp

Enable FTP support.

--with-gettext[=DIR]

Include GNU gettext support. DIR is the gettext install directory, defaults to /usr/local.

--with-gmp

Include gmp support.

--with-hyperwave

Include Hyperwave support.

--with-icap[=DIR]

Include ICAP support.

--with-iconv[=DIR]

Include iconv support.

--with-imap[=DIR]

Include IMAP support. DIR is the c-client install prefix.

--with-kerberos[=DIR]

IMAP: Include Kerberos support. DIR is the Kerberos install dir.

--with-imap-ssl[=DIR]

IMAP: Include SSL support. DIR is the OpenSSL install dir.

--with-ircg-config

Path to the ircg-config script.

--with-ircg

Include ircg support.

--with-java[=DIR]

Include Java support. DIR is the base install directory for the JDK. This extension can only be built as a shared dl.

--with-ldap[=DIR]

Include LDAP support. DIR is the LDAP base install directory.

--enable-mailparse

Enable mailparse support.

--enable-mbstring

Enable multibyte string support.

--enable-mbstr-enc-trans

Enable japanese encoding translation.

--with-mcal[=DIR]

Include MCAL support.

--with-mcrypt[=DIR]

Include mcrypt support. DIR is the mcrypt install directory.

--with-mhash[=DIR]

Include mhash support. DIR is the mhash install directory.

--with-mnogosearch[=DIR]

Include mnoGoSearch support. DIR is the mnoGoSearch base install directory, defaults to /usr/local/mnogosearch.

--with-muscat[=DIR]

Include muscat support.

--with-ncurses

Include ncurses support.

--enable-pcntl

Enable experimental pcntl support (CGI ONLY!)

--without-pcre-regex

Do not include Perl Compatible Regular Expressions support. Use --with-pcre-regex=DIR to specify DIR where PCRE's include and library files are located, if not using bundled library.

--with-pfpro[=DIR]

Include Verisign Payflow Pro support.

--disable-posix

Disable POSIX-like functions.

--with-pspell[=DIR]

Include PSPELL support.

--with-qtdom

Include QtDOM support (requires Qt >= 2.2.0).

--with-libedit[=DIR]

Include libedit readline replacement.

--with-readline[=DIR]

Include readline support. DIR is the readline install directory.

--with-recode[=DIR]

Include recode support. DIR is the recode install directory.

--with-satellite[=DIR]

Enable CORBA support via Satellite (EXPERIMENTAL) DIR is the base directory for ORBit.

--with-mm[=DIR]

Include mm support for session storage.

--enable-trans-sid

Enable transparent session id propagation.

--disable-session

Disable session support.

--enable-shmop

Enable shmop support.

--with-snmp[=DIR]

Include SNMP support. DIR is the SNMP base install directory, defaults to searching through a number of common locations for the snmp install. Set DIR to shared to build as a dl, or shared,DIR to build as a dl and still specify DIR.

--enable-ucd-snmp-hack

Enable UCD SNMP hack.

--enable-sockets

Enable sockets support.

--with-regex=TYPE

regex library type: system, apache, php.

--with-system-regex

Use system regex library (deprecated).

--enable-sysvsem

Enable System V semaphore support.

--enable-sysvshm

Enable the System V shared memory support.

--with-vpopmail[=DIR]

Include vpopmail support.

--with-tsrm-pthreads

Use POSIX threads (default).

--enable-shared[=PKGS]

Build shared libraries [default=yes].

--enable-static[=PKGS]

Build static libraries [default=yes].

--enable-fast-install[=PKGS]

Optimize for fast installation [default=yes].

--with-gnu-ld

Assume the C compiler uses GNU ld [default=no].

--disable-libtool-lock

Avoid locking (might break parallel builds).

--with-pic

Try to use only PIC/non-PIC objects [default=use both].

--with-yaz[=DIR]

Include YAZ support (ANSI/NISO Z39.50). DIR is the YAZ bin install directory.

--enable-memory-limit

Compile with memory limit support.

--disable-url-fopen-wrapper

Disable the URL-aware fopen wrapper that allows accessing files via HTTP or FTP.

--enable-versioning

Export only required symbols. See INSTALL for more information.

--disable-bcmath

Compile without bc style precision math functions. PHP 3 only!

--with-imsp[=DIR]

Include IMSp support (DIR is IMSP's include dir and libimsp.a dir). PHP 3 only!

--with-ftp

Include FTP support. PHP 3 only!

--with-mck[=DIR]

Include Cybercash MCK support. DIR is the cybercash mck build directory, defaults to /usr/src/mck-3.2.0.3-linux for help look in extra/cyberlib. PHP 3 only!

--disable-overload

Disable user-space object overloading support. PHP 3 only!

--enable-yp

Include YP support. PHP 3 only!

--with-zip

Include ZIP support (requires zziplib >= 0.10.6). PHP 3 only!

--with-mod-dav=DIR

Include DAV support through Apache's mod_dav, DIR is mod_dav's installation directory (Apache module version only!) PHP 3 only!

--enable-debugger

Compile with remote debugging functions. PHP 3 only!

--enable-versioning

Take advantage of versioning and scoping provided by Solaris 2.x and Linux. PHP 3 only!

PHP options

--enable-maintainer-mode

Enable make rules and dependencies not useful (and sometimes confusing) to the casual installer.

--with-config-file-path=PATH

Sets the path in which to look for php.ini, defaults to PREFIX/lib.

--enable-safe-mode

Enable safe mode by default.

--with-exec-dir[=DIR]

Only allow executables in DIR when in safe mode defaults to /usr/local/php/bin.

--enable-magic-quotes

Enable magic quotes by default.

--disable-short-tags

Disable the short-form <? start tag by default.

Server options

--with-aolserver=DIR

Specify path to the installed AOLserver.

--with-apxs[=FILE]

Build shared Apache module. FILE is the optional pathname to the Apache apxs tool; defaults to apxs. Make sure you specify the version of apxs that is actually installed on your system and NOT the one that is in the apache source tarball.

--with-apache[=DIR]

Build Apache module. DIR is the top-level Apache build directory, defaults to /usr/local/apache.

--with-mod_charset

Enable transfer tables for mod_charset (Rus Apache).

--with-apxs2[=FILE]

Build shared Apache 2.0 module. FILE is the optional pathname to the Apache apxs tool; defaults to apxs.

--with-fhttpd[=DIR]

Build fhttpd module. DIR is the fhttpd sources directory, defaults to /usr/local/src/fhttpd.

--with-isapi=DIR

Build PHP as an ISAPI module for use with Zeus.

--with-nsapi=DIR

Specify path to the installed Netscape Server.

--with-phttpd=DIR

No information yet.

--with-pi3web=DIR

Build PHP as a module for use with Pi3Web.

--with-roxen=DIR

Build PHP as a Pike module. DIR is the base Roxen directory, normally /usr/local/roxen/server.

--enable-roxen-zts

Build the Roxen module using Zend Thread Safety.

--with-servlet[=DIR]

Include servlet support. DIR is the base install directory for the JSDK. This SAPI prereqs the java extension must be built as a shared dl.

--with-thttpd=SRCDIR

Build PHP as thttpd module.

--with-tux=MODULEDIR

Build PHP as a TUX module (Linux only).

XML options

--with-dom[=DIR]

Include DOM support (requires libxml >= 2.4.2). DIR is the libxml install directory, defaults to /usr.

--disable-xml

Disable XML support using bundled expat lib.

--with-expat-dir=DIR

XML: external libexpat install dir.

--with-xmlrpc[=DIR]

Include XMLRPC-EPI support.

--enable-wddx

Enable WDDX support.

上一頁 | 首頁 | 下一頁
Problems? | 上一層 | Configuration


Servers-fhttpd

To build PHP as an fhttpd module, answer "yes" to "Build as an fhttpd module?" (the --with-fhttpd=DIR option to configure) and specify the fhttpd source base directory. The default directory is /usr/local/src/fhttpd. If you are running fhttpd, building PHP as a module will give better performance, more control and remote execution capability.

上一頁 | 首頁 | 下一頁
Caudium 伺服器 | 上一層 | IIS/PWS 伺服器


Unix/HP-UX installs

This section contains notes and hints specific to installing PHP on HP-UX systems.

例子 3-1. Installation Instructions for HP-UX 10

From: paul_mckay@clearwater-it.co.uk
04-Jan-2001 09:49
(These tips are for PHP 4.0.4 and Apache v1.3.9)

So you want to install PHP and Apache on a HP-UX 10.20 box?

1. You need gzip, download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/gzip-1.2.4a/gzip-1.2.4a-sd-10.20.depot.Z
uncompress the file and install using swinstall

2. You need gcc, download a binary distribution from
http://gatekeep.cs.utah.edu/ftp/hpux/Gnu/gcc-2.95.2/gcc-2.95.2-sd-10.20.depot.gz
gunzip this file and install gcc using swinstall.

3. You need the GNU binutils, you can download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/binutils-2.9.1/binutils-2.9.1-sd-10.20.depot.gz
gunzip and install using swinstall.

4. You now need bison, you can download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/bison-1.28/bison-1.28-sd-10.20.depot.gz
install as above.

5. You now need flex, you need to download the source from one of the
http://www.gnu.org mirrors. It is in the <filename>non-gnu</filename> directory of the ftp site.
Download the file, gunzip, then tar -xvf it. Go into the newly created flex
directory and do a ./configure, then a make, and then a make install

If you have errors here, it's probably because gcc etc. are not in your
PATH so add them to your PATH.

Right, now into the hard stuff.

6. Download the PHP and apache sources.

7. gunzip and tar -xvf them.

We need to hack a couple of files so that they can compile ok.

8. Firstly the configure file needs to be hacked because it seems to lose
track of the fact that you are a hpux machine, there will be a
better way of doing this but a cheap and cheerful hack is to put
    lt_target=hpux10.20
on line 47286 of the configure script.

9. Next, the Apache GuessOS file needs to be hacked. Under
apache_1.3.9/src/helpers change line 89 from
    "echo "hp${HPUXMACH}-hpux${HPUXVER}"; exit 0"
to:
    "echo "hp${HPUXMACH}-hp-hpux${HPUXVER}"; exit 0"

10. You cannot install PHP as a shared object under HP-UX so you must compile
it as a static, just follow the instructions at the Apache page.

11. PHP and apache should have compiled OK, but Apache won't start. you need
to create a new user for Apache, eg www, or apache. You then change lines 252
and 253 of the conf/httpd.conf in Apache so that instead of
    User nobody
    Group nogroup
you have something like
    User www
    Group sys

This is because you can't run Apache as nobody under hp-ux.
Apache and PHP should then work.

Hope this helps somebody,
Paul Mckay.
上一頁 | 首頁 | 下一頁
安裝 | 上一層 | Unix/Linux installs


IIS/PWS 伺服器

本節包括 IIS（Microsoft Internet Information Server）的說明和提示。以及 PWS/IIS 3，PWS 4 以及更新版本 和 IIS 4 以及更新版本 上 PHP 的安裝說明。

Windows 和 PWS/IIS 3

推薦使用PHP發行包中包含的註冊表文件（pws-php4cgi.reg）來配置伺服器。你可能需要編輯這個文件，確認擴展庫和 PHP 的安裝目錄符合你的設置。或者你可以按照以下步驟手工進行。

警告

以下步驟涉及到直接修改 Windows 註冊表，如果出錯會使你的系統不穩定。我們強烈推薦你先備份註冊表文件。PHP 開發小組將不對你損壞了註冊表負責。

  • 執行 Regedit。

  • 找到：HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /W3Svc /Parameters /ScriptMap。

  • 在編輯選單下選擇：新建->字串值（New->String Value）。

  • 輸入你想 PHP 腳本使用的文件後綴，例如 .php。

  • 雙擊這個新的字串值，並且在資料欄中輸入 php.exe 的路徑，例如：c:\php\php.exe。

  • 如果你希望其他後綴（例如 .php3）也和 PHP 關聯，重複以上步驟。

以下步驟並不影響 Web 伺服器安裝，並且僅適用於你的 PHP 腳本執行於命令行方式下（例如執行 c:\myscripts\test.php）或者在資源管理器中雙擊 PHP 文件。你可能更希望雙擊 PHP 文件時用文本編輯器打開，那麼可以跳過這一步。

  • 找到：HKEY_CLASSES_ROOT。

  • 在編輯選單中選擇：新建->主鍵（New->Key）。

  • 給該主鍵命名為你前一節中設置的後綴，例如：.php。

  • 選中該主鍵，在右邊一欄中雙擊“預定”（"Default"）並輸入 phpfile。

  • 對於你前一節中設置的其它後綴，重複以上步驟。

  • 現在再在 HKEY_CLASSES_ROOT 下面新建一個主鍵（New->Key），命名為 phpfile。

  • 選中主鍵 phpfile，在右邊一欄中雙擊“預定”（"Default"）並輸入 PHP Script。

  • 右鍵點擊主鍵 phpfile，選擇新建->主鍵（New->Key），命名為 Shell。

  • 右鍵點擊主鍵 Shell，選擇新建->主鍵（New->Key），命名為 open。

  • 右鍵點擊主鍵 open，選擇新建->主鍵（New->Key），命名為 command。

  • 選中主鍵 command，在右邊一欄中雙擊“預定”（"Default"）並且輸入 php.exe 的路徑，例如 c:\php\php.exe -q %1（別忘了 %1）。

  • 退出 Regedit。

  • 如果使用 PWS for Windows，重新啟動計算機使註冊表生效。

PWS和IIS 3 的用戶現在就擁有一個完全操作正常的 PHP 系統了。IIS 3 用戶還可以使用由 Steven Genusa 提供的一個極好的工具來配置腳本映射。

Windows 和 PWS 4 或更新版本

在 PWS 4 或者更新版本中安裝 PHP 有兩個選擇。一種是 CGI 方式，還有一種是使用 ISAPI 模塊的 DLL。

如果你選擇 CGI 方式，按照以下步驟：

  • 編輯 PHP 發行包中 SAPI 目錄下的 pws-php4cgi.reg文件，在裡面輸入正確的 php.exe 的路徑。反斜線必須雙寫，例如： [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="c:\\php\\php.exe"，然後雙擊此文件將其合並（Merge）到註冊表中。

  • 在個人 Web 管理器中，右鍵點擊你希望加入 PHP 支援的目錄，選擇“屬性”（Properties），選中“執行“（Execute）多選框，並確認。

如果你選擇 ISAPI 模塊，按照以下步驟：

  • 編輯 PHP 發行包中 SAPI 目錄下的 pws-php4isapi.reg 文件，在裡面輸入正確的 php4isapi.dll 的路徑。反斜線必須雙寫，例如： [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="c:\\php\\sapi\\php4isapi.dll"，然後雙擊此文件將其合並（Merge）到註冊表中。

  • 在個人 Web 管理器中，右鍵點擊你希望加入 PHP 支援的目錄，選擇“屬性”（Properties），選中“執行”（Execute）多選框，並確認。

無論哪種方式都需要重新啟動計算機以使改變設置生效。

Windows NT/2000/XP 和 IIS 4 或更新版本

要在 NT/2000/XP 中的 IIS 4 或更新版本中安裝 PHP，按照以下說明進行。有兩種選擇安裝 PHP，CGI 方式（php.exe）或者 ISAPI 模塊方式。

無論哪種方式，都需要打開管理中心（Microsoft Management Console，NT 4.0 Option Pack 中的 'Internet Services Manager'，或者 2000/XP 中的控制面板 -> 管理工具（Control Panel->Administrative Tools））。用右鍵點擊你的 Web Server 節點（多半是 'Default Web Site'），選擇“屬性”（Properties）。

如果你選擇 CGI 方式，按照以下步驟：

  • 在“主目錄”（Home Directory），“虛擬目錄”（Virtual Directory）或者“目錄”（Directory）標簽欄中，點擊“配置”（Configuration）按鈕，然後選擇“應用程序映射”（App Mappings）標簽欄。

  • 點擊“增加”（Add）按鈕，在“可執行文件”（Executable）框中輸入：c:\php\php.exe（假定你將 PHP 解壓縮到了 c:\php\）。

  • 在“文件後綴”（Extension）框中輸入你要使用的 PHP 後綴。'Method exclusions' 空著，選中“腳本引擎”（Script engine）。你也可以選中“檢查文件是否存在”（check that file exists）－ 略微損失一點性能，IIS 會先檢查腳本文件是否存在。這樣會輸出 404 的錯誤訊息而不是 PHP 沒有輸出任何資料的 cgi 錯誤。

    對於其它你想使用的 PHP 後綴重複以上兩個步驟。通常使用的有 .php 和 .phtml，對於一些老的程序還需要 .php3。

  • 設置適當的安全級別（在Internet Service Manager 中完成）。如果你使用了 NTFS，還需要在 php.exe 所在的目錄中給 I_USR_ 用戶加上“執行”的權限。

如果你選擇ISAPI模塊，按照以下步驟：

  • 如果你不用 PHP 進行 HTTP 認証的話，你可以（也應該）跳過這一步。在 ISAPI Filters 中，加入一個新的 ISAPI filter。用 PHP 作為過濾器的名字，並且提供 php4isapi.dll 所在的路徑。

  • 在“主目錄”（Home Directory）中點擊“配置”（Configuration）按鈕，在應用程序映射（Application Mappings）中增加一個新的條目。用 php4isapi.dll 的路徑作為可執行文件（Executable），用 .php 作為文件後綴，選中“腳本引擎”（Script Engine），而 'Method exclusions' 為空。

  • 完全停止 IIS 服務（NET STOP iisadmin）

  • 重新啟動IIS服務（NET START w3svc）

上一頁 | 首頁 | 下一頁
Servers-fhttpd | 上一層 | Servers-Netscape and iPlanet


Unix/Linux installs

This section contains notes and hints specific to installing PHP on Linux distributions.

Using Packages

Many Linux distributions have some sort of package installation system, such as RPM. This can assist in setting up a standard configuration, but if you need to have a different set of features (such as a secure server, or a different database driver), you may need to build PHP and/or your webserver. If you are unfamiliar with building and compiling your own software, it is worth checking to see whether somebody has already built a packaged version of PHP with the features you need.

上一頁 | 首頁 | 下一頁
Unix/HP-UX installs | 上一層 | Unix/Mac OS X installs


Unix/Mac OS X installs

This section contains notes and hints specific to installing PHP on Mac OS X Server.

Using Packages

There are a few pre-packaged and pre-compiled versions of PHP for Mac OS X. This can help in setting up a standard configuration, but if you need to have a different set of features (such as a secure server, or a different database driver), you may need to build PHP and/or your web server yourself. If you are unfamiliar with building and compiling your own software, it's worth checking whether somebody has already built a packaged version of PHP with the features you need.

Compiling for OS X server

There are two slightly different versions of Mac OS X, client and server. The following is for OS X Server.

例子 3-2. Mac OS X server install

1. Get the latest distributions of Apache and PHP
2. Untar them, and run the configure program on Apache like so.
    ./configure --exec-prefix=/usr \
    --localstatedir=/var \
    --mandir=/usr/share/man \
    --libexecdir=/System/Library/Apache/Modules \
    --iconsdir=/System/Library/Apache/Icons \
    --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
    --enable-shared=max \
    --enable-module=most \
    --target=apache

4. You may also want to add this line:
    setenv OPTIM=-O2
    If you want the compiler to do some optimization.

5. Next, go to the PHP 4 source directory and configure it.
    ./configure --prefix=/usr \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --mandir=/usr/share/man \
    --with-xml \
    --with-apache=/src/apache_1.3.12

    If you have any other additions (MySQL, GD, etc.), be sure to add
    them here. For the --with-apache string, put in the path to your
    apache source directory, for example "/src/apache_1.3.12".
6. make
7. make install
    This will add a directory to your Apache source directory under
    src/modules/php4.

8. Now, reconfigure Apache to build in PHP 4.
    ./configure --exec-prefix=/usr \
    --localstatedir=/var \
    --mandir=/usr/share/man \
    --libexecdir=/System/Library/Apache/Modules \
    --iconsdir=/System/Library/Apache/Icons \
    --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
    --enable-shared=max \
    --enable-module=most \
    --target=apache \
    --activate-module=src/modules/php4/libphp4.a

    You may get a message telling you that libmodphp4.a is out of date.
    If so, go to the src/modules/php4 directory inside your apache
    source directory and run this command:

    ranlib libmodphp4.a

    Then go back to the root of the apache source directory and run the
    above configure command again. That'll bring the link table up to
    date.

9. make

10. make install

11. copy and rename the php.ini-dist file to your "bin" directory from your
    PHP 4 source directory:
    cp php.ini-dist /usr/local/bin/php.ini

    or (if your don't have a local directory)

    cp php.ini-dist /usr/bin/php.ini

Other examples for Mac OS X client and Mac OS X server are available at Stepwise.

Compiling for MacOS X client

Those tips are graciously provided by Marc Liyanage.

The PHP module for the Apache web server included in Mac OS X. This version includes support for the MySQL and PostgreSQL databases.

NOTE: Be careful when you do this, you could screw up your Apache web server!

Do this to install:

  • 1. Open a terminal window

  • 2. Type "wget http://www.diax.ch/users/liyanage/software/macosx/libphp4.so.gz", wait for download to finish

  • 3. Type "gunzip libphp4.so.gz"

  • 4. Type "sudo apxs -i -a -n php4 libphp4.so"

Now type "sudo open -a TextEdit /etc/httpd/httpd.conf" TextEdit will open with the web server configuration file. Locate these two lines towards the end of the file: (Use the Find command)
#AddType application/x-httpd-php .php
   #AddType application/x-httpd-php-source .phps
Remove the two hash marks (#), then save the file and quit TextEdit.

Finally, type "sudo apachectl graceful" to restart the web server.

PHP should now be up and running. You can test it by dropping a file into your "Sites" folder which is called "test.php". Into that file, write this line: "<?php phpinfo() ?>".

Now open up 127.0.0.1/~your_username/test.php in your web browser. You should see a status table with information about the PHP module.

上一頁 | 首頁 | 下一頁
Unix/Linux installs | 上一層 | Unix/OpenBSD installs


Servers-Netscape and iPlanet

This section contains notes and hints specific to Netscape and iPlanet installs of PHP, both for Sun Solaris and Windows versions.

You can find more information about setting up PHP for the Netscape Enterprise Server here: http://benoit.noss.free.fr/php/install-php4.html

Installing PHP with Netscape on Sun Solaris

To build PHP with NES or iPlanet web servers, enter the proper install directory for the --with-nsapi = DIR option. The default directory is usually /opt/netscape/suitespot/. Please also read /php-xxx-version/sapi/nsapi/nsapi-readme.txt.

例子 3-7. Installation Example for Netscape Enterprise on Solaris

Instructions for Sun Solaris 2.6 with Netscape Enterprise Server 3.6
From: bhager@invacare.com

1. Install the following packages from www.sunfreeware.com or another
download site:

    flex-2_5_4a-sol26-sparc-local
    gcc-2_95_2-sol26-sparc-local
    gzip-1.2.4-sol26-sparc-local
    perl-5_005_03-sol26-sparc-local
    bison-1_25-sol26-sparc-local
    make-3_76_1-sol26-sparc-local
    m4-1_4-sol26-sparc-local
    autoconf-2.13
    automake-1.4
    mysql-3.23.24-beta (if you want mysql support)
    tar-1.13 (GNU tar)

2. Make sure your path includes the proper directories
    PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin
    export PATH

3. gunzip php-x.x.x.tar.gz (if you have a .gz dist, otherwise go to 4)
4. tar xvf php-x.x.x.tar
5. cd ../php-x.x.x

6. For the following step, make sure /opt/netscape/suitespot/ is where
   your netscape server is installed. Otherwise, change to correct path:
    /configure --with-mysql=/usr/local/mysql --with-nsapi=/opt/netscape/suitespot/ --enable-track-vars --enable-libgcc
7. make
8. make install
After performing the base install and reading the appropriate readme file, you may need to performs some additional configuration steps.

Firstly you may need to add some paths to the LD_LIBRARY_PATH environment for Netscape to find all the shared libs. This can best done in the start script for your Netscape server. Windows users can probably skip this step. The start script is often located in: /path/to/server/https-servername/start

You may also need to edit the configuration files that are located in:/path/to/server/https-servername/config/.

例子 3-8. Configuration Example for Netscape Enterprise

Configuration Instructions for Netscape Enterprise Server
From: bhager@invacare.com

1. Add the following line to mime.types:
    type=magnus-internal/x-httpd-php exts=php

2. Add the following to obj.conf, shlib will vary depending on
    your OS, for unix it will be something like
    /opt/netscape/suitespot/bin/libphp4.so.

    You should place the following lines after mime types init.
    Init fn="load-modules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" shlib="/php4/nsapiPHP4.dll"
    Init fn=php4_init errorString="Failed to initialize PHP!"

    <object name="default">
    .
    .
    .
    .#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog' lines
    Service fn="php4_execute" type="magnus-internal/x-httpd-php"
    .
    .
    </Object>

    <Object name="x-httpd-php">
    ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
    Service fn=php4_execute
    </Object>

    Authentication configuration

    PHP authentication cannot be used with any other authentication. ALL AUTHENTICATION IS
    PASSED TO YOUR PHP SCRIPT. To configure PHP Authentication for the entire server, add
    the following line:

    <Object name="default">
    AuthTrans fn=php4_auth_trans
    .
    .
    .
    .
    </Object>

    To use PHP Authentication on a single directory, add the following:

    <Object ppath="d:\path\to\authenticated\dir\*">
    AuthTrans fn=php4_auth_trans
    </Object>

If you are running Netscape Enterprise 4.x, then you should use the following:

例子 3-9. Configuration Example for Netscape Enterprise 4.x

Place these lines after the mime types init, and everything else is similar
to the example configuration above.
From: Graeme Hoose (GraemeHoose@BrightStation.com)

Init fn="load-modules" shlib="/path/to/server4/bin/libphp4.so" funcs="php4_init,php4_close,php4_execute,php4_auth_trans"
Init fn="php4_init" LateInit="yes"

Installing PHP with Netscape on Windows

To Install PHP as CGI (for Netscape Enterprise Server, iPlanet, perhaps Fastrack), do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed windows)

  • Make a file association from the command line. Type the following two lines:
    assoc .php=PHPScript
ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a dummy shellcgi directory and remove it just after (this step creates 5 important lines in obj.conf and allow the web server to handle shellcgi scripts).

  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php).

  • Do it for each web server instance you want php to run

More details about setting up PHP as a CGI executable can be found here: http://benoit.noss.free.fr/php/install-php.html

To Install PHP as NSAPI (for Netscape Enterprise Server, iPlanet, perhaps Fastrack, do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed windows)

  • Make a file association from the command line. Type the following two lines:
    assoc .php=PHPScript
ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/x-httpd-php, File Suffix:php).

  • Stop your web service and edit obj.conf. At the end of the Init section, place these two lines (necessarily after mime type init!):
    Init fn="load-modules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll"
Init fn="php4_init" errorString="Failed to initialise PHP!"

  • In The < Object name="default" > section, place this line necessarily after all 'ObjectType' and before all 'AddLog' lines:
    Service fn="php4_execute" type="magnus-internal/x-httpd-php"

  • At the end of the file, create a new object called x-httpd-php, by inserting these lines:
    <Object name="x-httpd-php">
ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
Service fn=php4_execute
</Object>

  • Restart your web service and apply changes

  • Do it for each web server instance you want PHP to run

More details about setting up PHP as an NSAPI filter can be found here: http://benoit.noss.free.fr/php/install-php4.html

上一頁 | 首頁 | 下一頁
IIS/PWS 伺服器 | 上一層 | Servers-OmniHTTPd Server


Servers-OmniHTTPd Server

This section contains notes and hints specific to OmniHTTPd.

OmniHTTPd 2.0b1 and up for Windows

You need to complete the following steps to make PHP work with OmniHTTPd. This is a CGI executable setup. SAPI is supported by OmniHTTPd, but some tests have shown that it is not so stable to use PHP as an ISAPI module.

  • Step 1: Install OmniHTTPd server.

  • Step 2: Right click on the blue OmniHTTPd icon in the system tray and select Properties

  • Step 3: Click on Web Server Global Settings

  • Step 4: On the 'External' tab, enter: virtual = .php | actual = c:\path-to-php-dir\php.exe, and use the Add button.

  • Step 5: On the Mime tab, enter: virtual = wwwserver/stdcgi | actual = .php, and use the Add button.

  • Step 6: Click OK

Repeat steps 2 - 6 for each extension you want to associate with PHP.

註: Some OmniHTTPd packages come with built in PHP support. You can choose at setup time to do a custom setup, and uncheck the PHP component. We recommend you to use the latest PHP binaries. Some OmniHTTPd servers come with PHP 4 beta distributions, so you should choose not to set up the built in support, but install your own. If the server is already on your machine, use the Replace button in Step 4 and 5 to set the new, correct information.

上一頁 | 首頁 | 下一頁
Servers-Netscape and iPlanet | 上一層 | Servers-Oreilly Website Pro


Unix/OpenBSD installs

This section contains notes and hints specific to installing PHP on OpenBSD 3.2.

Using Binary Packages

Using binary packages to install PHP on OpenBSD is the recommended and simplest method. The core package has been separated from the various modules, and each can be installed and removed independently from the others. The files you need can be found on your OpenBSD CD or on the FTP site.

The main package you need to install is php4-core-4.2.3.tgz, which contains the basic engine (plus gettext and iconv). Next, take a look at the module packages, such as php4-mysql-4.2.3.tgz or php4-imap-4.2.3.tgz. You need to use the phpxs command to activate and deactivate these modules in your php.ini file.

例子 3-3. OpenBSD Package Install Example

# pkg_add php4-core-4.2.3.tgz
# /usr/local/sbin/phpxs -s
# cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini
  (add in mysql)
# pkg_add php4-mysql-4.2.3.tgz
# /usr/local/sbin/phpxs -a mysql
  (add in imap)
# pkg_add php4-imap-4.2.3.tgz
# /usr/local/sbin/phpxs -a imap
  (remove mysql as a test)
# pkg_delete php4-mysql-4.2.3
# /usr/local/sbin/phpxs -r mysql
  (install the PEAR libraries)
# pkg_add php4-pear-4.2.3.tgz

Read the packages(7) manual page for more information about binary packages on OpenBSD.

Using Ports

You can also compile up PHP from source using the ports tree. However, this is only recommended for users familiar with OpenBSD. The PHP4 port is split into three sub-directories: core, extensions and pear. The extensions directory generates sub-packages for all of the supported PHP modules. If you find you do not want to create some of these modules, use the no_* FLAVOR. For example, to skip building the imap module, set the FLAVOR to no_imap.

Older Releases

Older releases of OpenBSD used the FLAVORS system to compile up a statically linked PHP. Since it is hard to generate binary packages using this method, it is now deprecated. You can still use the old stable ports trees if you wish, but they are unsupported by the OpenBSD team. If you have any comments about this, the current maintainer for the port is Anil Madhavapeddy.

上一頁 | 首頁 | 下一頁
Unix/Mac OS X installs | 上一層 | Unix/Solaris installs


Servers-Oreilly Website Pro

This section contains notes and hints specific to Oreilly Website Pro.

Oreilly Website Pro 2.5 and up for Windows

This list describes how to set up the PHP CGI binary or the ISAPI module to work with Oreilly Website Pro on Windows.

  • Edit the Server Properties and select the tab "Mapping".

  • From the List select "Associations" and enter the desired extension (.php) and the path to the CGI exe (ex. c:\php\php.exe) or the ISAPI DLL file (ex. c:\php\sapi\php4isapi.dll).

  • Select "Content Types" add the same extension (.php) and enter the content type. If you choose the CGI executable file, enter 'wwwserver/shellcgi', if you choose the ISAPI module, enter 'wwwserver/isapi' (both without quotes).

上一頁 | 首頁 | 下一頁
Servers-OmniHTTPd Server | 上一層 | Sambar 伺服器


Servers-Other web servers

PHP can be built to support a large number of web servers. Please see Server-related options for a full list of server-related configure options. The PHP CGI binaries are compatible with almost all webservers supporting the CGI standard.

上一頁 | 首頁 | 下一頁
Servers-Xitami | 上一層 | Problems?


Problems?

Read the FAQ

Some problems are more common than others. The most common ones are listed in the PHP FAQ, part of this manual.

Other problems

If you are still stuck, someone on the PHP installation mailing list may be able to help you. You should check out the archive first, in case someone already answered someone else who had the same problem as you. The archives are available from the support page on http://www.php.net/. To subscribe to the PHP installation mailing list, send an empty mail to php-install-subscribe@lists.php.net. The mailing list address is php-install@lists.php.net.

If you want to get help on the mailing list, please try to be precise and give the necessary details about your environment (which operating system, what PHP version, what web server, if you are running PHP as CGI or a server module, etc.), and preferably enough code to make others able to reproduce and test your problem.

Bug reports

If you think you have found a bug in PHP, please report it. The PHP developers probably don't know about it, and unless you report it, chances are it won't be fixed. You can report bugs using the bug-tracking system at http://bugs.php.net/. Please do not send bug reports in mailing list or personal letters. The bug system is also suitable to submit feature requests.

Read the How to report a bug document before submitting any bug reports!

上一頁 | 首頁 | 下一頁
Servers-Other web servers | 上一層 | Complete list of configure options


Sambar 伺服器

本節包含了 Windows 下面的 Sambar 伺服器的說明和提示。

Sambar Windows

本列表說明了怎樣在 Windows 下的 Sambar 伺服器中設置 ISAPI 模塊。

  • 在 Sambar 的安裝目錄中找到文件 mappings.ini（在 config 目錄下）。

  • 打開 mappings.ini 並在 [ISAPI] 下面加上以下一行：

    *.php = c:\php\php4isapi.dll

    （本行假定 PHP 安裝在 c:\php 中。）

  • 重新啟動 Sambar 伺服器以使更動生效。

上一頁 | 首頁 | 下一頁
Servers-Oreilly Website Pro | 上一層 | Servers-Xitami


Unix/Solaris installs

This section contains notes and hints specific to installing PHP on Solaris systems.

Required software

Solaris installs often lack C compilers and their related tools. The required software is as follows:

  • gcc (recommended, other C compilers may work)

  • make

  • flex

  • bison

  • m4

  • autoconf

  • automake

  • perl

  • gzip

  • tar

In addition, you will need to install (and possibly compile) any additional software specific to your configuration, such as Oracle or MySQL.

Using Packages

You can simplify the Solaris install process by using pkgadd to install most of your needed components.

上一頁 | 首頁 | 下一頁
Unix/OpenBSD installs | 上一層 | Installation on UNIX systems


Installation on UNIX systems

This section will guide you through the general configuration and installation of PHP on Unix systems. Be sure to investigate any sections specific to your platform or web server before you begin the process.

Prerequisite knowledge and software:

  • Basic UNIX skills (being able to operate "make" and a C compiler, if compiling)

  • An ANSI C compiler (if compiling)

  • flex (for compiling)

  • bison (for compiling)

  • A web server

  • Any module specific components (such as gd, pdf libs, etc.)

There are several ways to install PHP for the Unix platform, either with a compile and configure process, or through various pre-packaged methods. This documentation is mainly focused around the process of compiling and configuring PHP.

The initial PHP setup and configuration process is controlled by the use of the commandline options of the configure script. This page outlines the usage of the most common options, but there are many others to play with. Check out the Complete list of configure options for an exhaustive rundown. There are several ways to install PHP:

  • As an Apache module

  • As an fhttpd module

  • For use with AOLServer, NSAPI, phttpd, Pi3Web, Roxen, thttpd, or Zeus.

  • As a CGI executable

Apache Module Quick Reference

PHP can be compiled in a number of different ways, but one of the most popular is as an Apache module. The following is a quick installation overview.

例子 3-4. Quick Installation Instructions for PHP 4 (Apache Module Version)

1.  gunzip apache_1.3.x.tar.gz
2.  tar xvf apache_1.3.x.tar
3.  gunzip php-x.x.x.tar.gz
4.  tar xvf php-x.x.x.tar
5.  cd apache_1.3.x
6.  ./configure --prefix=/www
7.  cd ../php-x.x.x
8.  ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9.  make
10. make install
11. cd ../apache_1.3.x
12. ./configure --activate-module=src/modules/php4/libphp4.a
13. make
14. make install
15. cd ../php-x.x.x
16. cp php.ini-dist /usr/local/lib/php.ini
17. Edit your httpd.conf or srm.conf file and add:
      AddType application/x-httpd-php .php

18. Use your normal procedure for restarting the Apache server. (You must
    stop and restart the server, not just cause the server to reload by
    use a HUP or USR1 signal.)

Building

When PHP is configured, you are ready to build the CGI executable. The command make should take care of this. If it fails and you can't figure out why, see the Problems section.

上一頁 | 首頁 | 下一頁
Unix/Solaris installs | 上一層 | Windows 系統下的安裝


Windows 系統下的安裝

本節內容適用於 Windows 95/98/Me 以及 Windows NT/2000/XP。PHP 不能在16位平台例如 Windows 3.1 下執行。有時我們把支援 PHP 的 Windows 平台稱為 Win32。

有兩種方法安裝 PHP for Windows：手工安裝或者使用 InstallShield 安裝。

如果你有 Microsoft Visual Studio，也可以編譯 PHP 的源程序。

一旦在 Windows 系統下安裝好 PHP 之後，你可能需要加載各種擴展庫以實現更多的功能。

Windows InstallShield

Windows版的 PHP 安裝程序可以從 http://www.php.net/ 獲得，此程序將安裝 PHP 的 CGI 版本，並且自動配置好 IIS，PWS 和 Xitami 三種 Web 伺服器。注意，InstallShield Installer 是一種簡單易用的安裝方法，在很多方面都受到限制，例如不支援自動配置擴展庫。

安裝好你選用的 HTTP 伺服器並且確定工作正常。

執行可執行的安裝程序並按照安裝向導的提示進行安裝。安裝程序支援兩種安裝方法 － 標準，盡量提供最佳預定參數，高級，在安裝過程中提問。

安裝向導收集足夠的訊息來配置 php.ini 文件並且配置 Web 伺服器來使用 PHP。在 NT Workstation 下的 IIS 和 PWS 中，會列出伺服器上所有節點的腳本映射，你可以在這些節點中選擇哪些加入 PHP 的腳本映射。

一旦安裝結束，安裝程序會提示是否需要重新啟動系統。重啟動伺服器或者開始使用 PHP。

警告

注意，這樣安裝的 PHP 並不安全。如果你想要更安全的安裝 PHP，最好手工進行，並且小心地配置每個選項。自動進行的安裝程序只是提供一個可以馬上使用的 PHP，並不意味著可以用在在線的伺服器上。

手工安裝步驟

本安裝指南幫你手工安裝和配置 PHP 到你的 Windows Webserver。你需要從 http://www.php.net/ 下載一個包含可執行版本的 zip 包。本指南的原始版本由 Bob Silva 編輯，位於：http://www.umesd.k12.or.us/php/win32install.html。

本指南提供以下的手工安裝支援：

  • Personal Web Server 3，4 或更新版本

  • Internet Information Server 3，4 或更新版本

  • Apache 1.3.x

  • OmniHTTPd 2.0b1 及以上版本

  • Oreilly Website Pro

  • Xitami

  • Netscape Enterprise Server，iPlanet

PHP 4 for Windows 有兩種方式 － CGI 版的可執行文件（php.exe），以及一些 SAPI 模塊（例如：php4isapi.dll）。後一種是 PHP 4 新提供的方式，提供了顯著的性能增長以及一些新功能。

警告

SAPI 模塊在 4.1 版中有了顯著的增強，但是，在一些老系統中，你也許會遇到可能的伺服器錯誤或者其他的模塊例如 ASP 失敗。

如果你選擇了其中一個 SAPI 模塊並且是在 Windows 95 下使用，要確認從微軟的 DCOM 頁面下載安裝了 DCOM 更新。對於 ISAPI 模塊，需要 ISAPI 4.0 相容的Web 伺服器（在 IIS 4.0，PWS 4.0 以及 IIS 5.0 下測試通過）。不支援 IIS 3.0。如果需要本地 PHP 支援，你需要下載和安裝 Windows NT 4.0 Option Pack With IIS 4.0。

不論何種 Web 伺服器，都需要先進行以下步驟：

  • 將 PHP 壓縮包釋放到你選擇的目錄中。c:\php\ 就不錯。你可能不想用中間有空格的路徑（例如：C:\Program Files\PHP 就不太好），如果這樣做有些 Web 伺服器會崩潰。

  • 你需要確認 PHP 使用的 DLL 文件能被找到。具體涉及到哪些 DLL 文件是根據你用哪種 Web 伺服器和你是用 CGI 方式還是伺服器模塊方式使用 PHP 來決定的。php4ts.dll 是一定要用的。如果你用伺服器模塊（例如 ISAPI 或者 Apache）那你需要 sapi 目錄下相關的 DLL 文件。如果你用了任何 PHP 擴展庫那你也需要那些 DLL 文件。為了確保 DLL 文件能被找到，你可以要麼把這些文件拷貝到 system 目錄下（例如 winnt\system32 或者 windows\system），要麼確認這些文件和 PHP 的主要執行文件或者 Web 伺服器使用的 DLL 文件在同一個目錄下（例如 php.exe，php4apache.dll）。

    PHP 可執行文件，SAPI 模塊和一些擴展庫要依靠外部的 DLL 文件來執行。需要確認這些 DLL 文件所在目錄在 Windows 的路徑中。最好把以下文件拷貝到你的 system 目錄中，system 目錄通常為：

    c:\windows\system for Windows 9x/ME
    c:\winnt\system32 for Windows NT/2000
    c:\windows\system32 for Windows XP

    需要拷貝的文件是：

    php4ts.dll，如果已經存在，則覆蓋之。
    PHP發行包中 'dlls' 目錄下的所有文件。如果這些文件已經安裝在你的系統中，僅在不能正確執行時才覆蓋它們（在覆蓋前，最好備份原來的文件，或者把原來的文件移動到別的文件夾中 － 以防出錯）。

    下載最新版的 Microsoft Data Access Components（MDAC），尤其是使用 Windows 9x/NT4 時。MDAC 位於 http://www.microsoft.com/data/。

  • 拷貝你選中的 ini 文件（見下面）到你的 '%WINDOWS%' 目錄下，如果使用的是 Windows 9x/Me，或者到 '%SYSTEMROOT%' 目錄下，如果使用的是 Windows NT/2000/XP 並且改名為 php.ini。典型的 '%WINDOWS%' 或者 '%SYSTEMROOT%' 目錄為：

    c:\windows for Windows 9x/ME/XP
    c:\winnt 或 c:\winnt40 for NT/2000 servers

    在 PHP 的 zip 包中提供了兩個版本的 ini 文件，php.ini-dist 和 php.ini-optimized。我們建議你使用 php.ini-optimized，因為我們優化了此文件中的預定設置以達到更佳性能與安全。最好仔細研究所有的 ini 設置並且自己手工設置每一項參數。如果你想達到最佳的安全性，那這正是為你准備的。當然了，PHP 在預定的 ini 文件下也一樣執行得很好。

  • 編輯你的新 php.ini 文件：

    • 你需要修改 'extension_dir' 設置以指向你安裝 PHP 的目錄，或者你放置那些 php_*.dll 文件的目錄。請注意最後有一個反斜線。例如：c:\php\extensions\

    • 如果你使用 OmniHTTPd，不要進行這一步。設置 'doc_root' 指向你 Webserver 的 document_root。例如：c:\apache\htdocs 或者 c:\webroot

    • 選擇哪些擴展庫你希望在 PHP 啟動時加載。閱讀 Windows 擴展庫部分學習如何加載，以及哪些是已經加載了的。注意在新安裝 PHP 時，建議先不要加載任何擴展庫，先確認 PHP 執行正常之後再在 php.ini 中加載它們。

    • PHP 發行包的 browscap 目錄下提供了一個 browscap.ini 文件，你可以用它覆蓋系統中原有的。在 PWS 和 IIS 中，該文件在 Windows 9x/Me 下位於 c:\windows\system\inetsrv\browscap.ini，在 NT/2000 下位於 c:\winnt\system32\inetsrv\browscap.ini，在 XP 下位於 c:\windows\system32\inetsrv\browscap.ini。

    • 注意 Windows 版中的 mibs 目錄包括了 SNMP 的支援文件。該目錄應該被移動到：DRIVE:\usr\mibs（DRIVE 是安裝了 PHP 的盤符）。

    • 如果你在 Windows NT，2000 或者 XP 下使用了 NTFS，確認執行 Webserver 的用戶對於 php.ini 有讀的權限（例如使其對所有人可讀）。

  • 在 PWS 下給 webroot 執行的權限：

    • 啟動“個人 Web 管理器”（PWS Web Manager）

    • 選中“<Home>”，點擊“編輯屬性(E)”

    • 選中“執行”（Execute）多選框

編譯源程序

開始之前，很值得回答一下這個問題：“為什麼在 Windows 下編譯這麼難？”兩個原因：

  1. Windows 下還沒有願意免費共享代碼的開發人員群體。直接結果就是沒有足夠的投資去建立支援這種開發方式的體系。大體上，盡量做到的可用資源都是從 UNIX 下的工具來的。不要奇怪這種傳統不時會出現。

  2. 下面幾乎所有的說明都是“看過就忘”的型別。所以坐穩當並且盡可能忠實地按照說明來做。

准備

在開始之前，需要下載很多東西...

  • 對初學者，從最近的 cygwin 鏡像站點下載 Cygwin 工具包。這將提供在編譯中用到的大多數流行的 GNU 工具。

  • 從 PHP 站點下載其餘需要的編譯工具：http://www.php.net/extra/win32build.zip。

  • 下載 PHP 使用的 DNS 解析器的原始碼：http://www.php.net/extra/bindlib_w32.zip。用這個替代 win32build.zip 中的 resolv.lib。

  • 如果你還沒有 unzip 工具，那你需要一個。可以從 InfoZip 下載一個免費的。

  • 如果你計劃把 PHP 編譯成 Apache 的靜態模塊那你還需要你用的 Apache 相應版本的源程序。

最後，你還需要 PHP 4 的原始碼。你可以通過 匿名 CVS 得到最新的開發版本。如果你有了 snapshot 或者原始碼的 tar.gz 文件，你不僅需要 untar 和 unzip 它們，還要在 Microsoft Visual C++ 處理之前把 *.dsp 和 *.dsw 文件中的換行符轉換成回車換行。

註: 把 Zend 和 TSRM 目錄放到 PHP 4 目錄之中，以便在編譯過程中能夠找到項目文件。

放到一起

  • 遵循你選擇的解壓縮工具的用法。

  • 執行 setup.exe，按照安裝說明進行。如果你選擇的安裝目錄不是 c:\cygnus，設置 Cygwin 環境變數讓編譯程序知道。在 Windows 95/98 下設置環境變數可以通過在 autoexec.bat 中加入一行做到。在 Windows NT 中，打開我的電腦 => 控制面板 => 系統，並且選擇環境變數標簽。

警告

建立一個臨時目錄給 Cygwin 使用，否則很多命令（尤其是 bison）將出錯。在 Windows 95/98 下，mkdir C:\TMP。在 Windows NT 下，mkdir %SystemDrive%\tmp。

  • 建一個目錄把 win32build.zip 解壓縮到裡面。

  • 執行 Microsoft Visual C++，選擇 Tools => Options 選單，在對話框中選擇 Directories 標簽。依次在下拉框中選擇 Executable，Include 和 Library files，確認 cygwin\bin，win32build\include 和 win32build\lib 在每個列表框中都包括。（要加入一項，選擇列表框最下面的空行並且輸入路徑)。典型的列表看上如同：

    • c:\cygnus\bin

    • c:\php-win32build\include

    • c:\php-win32build\lib

    點擊 OK，退回到 Visual C++。

  • 另外建一個目錄並且把 bindlib_w32.zip 解壓縮到裡面。決定你是需要調試符號（bindlib - Win32 Debug）還是不需要（bindlib - Win32 Release）。建立適當配置：

    • 圖形界面用戶，執行 VC++，選擇 File => Open Workspace 選單並選擇 bindlib。接著選擇 Build => Set Active Configuration 選單並選擇需要的配置。最後選擇 Build => Rebuild All。

    • 命令行用戶，確認你要麼註冊了 C++ 環境變數，要麼執行了 vcvars.bat，然後執行下面任意一個：

      • msdev bindlib.dsp /MAKE "bindlib - Win32 Debug"

      • msdev bindlib.dsp /MAKE "bindlib - Win32 Release"

    • 到這一步，你應該得到一個 resolv.lib 在你的 Debug 或者 Release 目錄下。拷貝此文件到 win32build\lib 目錄下並且覆蓋同名的文件。

編譯

對於初學者最好的上手方法是編譯 standalone/CGI 版本。

  • 圖形界面用戶，執行 VC++，選擇 File => Open Workspace 選單並選擇 php4ts。接著選擇 Build => Set Active Configuration 選單並選擇需要的配置。最後選擇 Build => Rebuild All。

  • 命令行用戶，確認你要麼註冊了 C++ 環境變數，要麼執行了 vcvars.bat，然後執行下面任意一個：

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS"

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS"

    • 到這一步，你應該得到一個可用的 php.exe 在你的 Debug_TS 或者 Release_TS 目錄下。

重複以上步驟處理 php4isapi.dsp（在 sapi\isapi 目錄下）來編譯使 PHP 能夠和 Microsoft IIS 集成的代碼。

有可能通過編輯 main/config.win32.h.in 文件來對編譯過程做一些較小的定制。

Windows 擴展庫的安裝

在安裝好 PHP 和 Webserver 之後，你可能想安裝一些擴展庫以增加功能。下表說明了一些可用的擴展庫。你可以通過去掉 php.ini 中 'extension=php_*.dll' 前面的註釋來選擇哪些擴展庫在 PHP 啟動時被加載。你也可以在程序中用 dl() 函式動態加載。

PHP 4 擴展庫的 DLL 文件開頭都是 'php_'（PHP 3 中是 'php3_' ）。這避免了 PHP 擴展庫和它們的支援庫混淆。

註: 在PHP 4.0.6 版中 BCMath，Calendar，COM，FTP，MySQL，ODBC，PCRE，Session，WDDX 和 XML 的支援都是內置的。不需要加載任何擴展庫就可以使用這些函式。你可以查看自己的版本中的 README.txt 或者 install.txt 文件哪些模塊是內置的。

註: 一些擴展庫需要其它的 DLL 文件支援才能執行。有幾個在發行包的 'dlls' 目錄下。但是有一些，例如 Oracla（php_oci8.dll）所需要的 DLL 文件並沒有包括在發行包中。

把 'DLLs' 目錄下綁定的 DLL 文件拷貝到 Windows 路徑中的目錄中。安全的地方有：

c:\windows\system for Windows 9x/Me
c:\winnt\system32 for Windows NT/2000
c:\windows\system32 for Windows XP

如果這些文件已經安裝在你的系統中，僅在不能正確執行時才覆蓋它們（在覆蓋前，最好備份原來的文件，或者把原來的文件移動到別的文件夾中 － 以防出錯)。

表格 3-1. PHP 擴展庫

庫名 | 說明 | 注意
php_bz2.dll | bzip2 壓縮函式庫 | 無
php_calendar.dll | Calendar 轉換函式庫 | 自 PHP 4.0.3 起內置
php_cpdf.dll | ClibPDF 函式庫 | 無
php_crack.dll | Crack 函式庫 | 無
php3_crypt.dll | 加密函式庫 | 未知
php_ctype.dll | ctype 族函式庫 | 無
php_curl.dll | CURL，客戶端 URL 函式庫 | 需要：libeay32.dll，ssleay32.dll（已包含）
php_cybercash.dll | Cybercash 支付函式庫 | 無
php_db.dll | DBM 函式庫 | 不贊成使用。用 DBA 代替（php_dba.dll）
php_dba.dll | DBA：資料庫（dbm-style）抽象層函式庫 | 無
php_dbase.dll | dBase 函式庫 | 無
php3_dbm.dll | Berkeley DB2 庫 | 未知
php_domxml.dll | DOM XML 函式庫 | 需要：libxml2.dll（已包含）
php_dotnet.dll | .NET 函式庫 | 無
php_exif.dll | 從 JPEG 讀取 EXIF 表頭訊息 | 無
php_fbsql.dll | FrontBase 函式庫 | 無
php_fdf.dll | FDF：表單資料格式化函式庫. | 需要：fdftk.dll （已包含）
php_filepro.dll | filePro 函式庫 | 只讀連接
php_ftp.dll | FTP 函式庫 | 自 PHP 4.0.3 起內置
php_gd.dll | GD 庫圖像處理函式庫 | 無
php_gettext.dll | Gettext 函式庫 | 需要：gnu_gettext.dll（已包含）
php_hyperwave.dll | HyperWave 函式庫 | 無
php_iconv.dll | ICONV 字元集轉換 | 需要：iconv-1.3.dll（已包含）
php_ifx.dll | Informix 函式庫 | 需要：Informix 庫文件
php_iisfunc.dll | IIS 管理函式庫 | 無
php_imap.dll | IMAP POP3 和 NNTP 函式庫 | PHP 3：php3_imap4r1.dll
php_ingres.dll | Ingres II 函式庫 | 需要：Ingres II 庫文件
php_interbase.dll | InterBase 函式庫 | 需要：gds32.dll（已包含）
php_java.dll | Java 擴展 | 需要：jvm.dll（已包含）
php_ldap.dll | LDAP 函式庫 | 需要：libsasl.dll（已包含）
php_mhash.dll | Mhash 函式庫 | 無
php_ming.dll | Ming 函式庫 － Flash 支援 | 無
php_msql.dll | mSQL 函式庫 | 需要：msql.dll（已包含）
php3_msql1.dll | mSQL 1 客戶端 | 未知
php3_msql2.dll | mSQL 2 客戶端 | 未知
php_mssql.dll | MSSQL 函式庫 | 需要：ntwdblib.dll（已包含）
php3_mysql.dll | MySQL 函式庫 | 自 PHP 4 起內置
php3_nsmail.dll | Netscape 郵件函式庫 | 未知
php3_oci73.dll | Oracle 函式庫 | 未知
php_oci8.dll | Oracle 8 函式庫 | 需要：Oracle 8 客戶端庫文件
php_openssl.dll | OpenSSL 函式庫 | 需要：libeay32.dll（已包含）
php_oracle.dll | Oracle 函式庫 | 需要：Oracle 7 客戶端庫文件
php_pdf.dll | PDF 函式庫 | 無
php_pgsql.dll | PostgreSQL 函式庫 | 無
php_printer.dll | Printer 函式庫 | 無
php_xslt.dll | XSLT 函式庫 | 需要：sablot.dll（已包含）
php_snmp.dll | SNMP 函式庫 | 僅在 NT 下使用！
php_sybase_ct.dll | Sybase 函式庫 | 需要：Sybase 客戶端庫文件
php_yaz.dll | YAZ 函式庫 | 無
php_zlib.dll | ZLib 壓縮函式庫 | 無

上一頁 | 首頁 | 下一頁
Installation on UNIX systems | 上一層 | Servers-CGI/Commandline


Servers-Xitami

This section contains notes and hints specific to Xitami.

Xitami for Windows

This list describes how to set up the PHP CGI binary to work with Xitami on Windows.

  • Make sure the webserver is running, and point your browser to xitamis admin console (usually http://127.0.0.1/admin), and click on Configuration.

  • Navigate to the Filters, and put the extension which PHP should parse (i.e. .php) into the field File extensions (.xxx).

  • In Filter command or script put the path and name of your php executable i.e. c:\php\php.exe.

  • Press the 'Save' icon.

  • Restart the server to reflect changes.

上一頁 | 首頁 | 下一頁
Sambar 伺服器 | 上一層 | Servers-Other web servers


PHP 能做什麼？

PHP 能做任何事。PHP 主要是用於伺服端的腳本程序，因此您可以用 PHP 來完成任何其它的 CGI 程序能夠完成的工作，例如收集表單資料，產生動態網頁，或者發送/接收 Cookies。但 PHP 的功能遠不局限於此。

PHP 腳本主要用於以下三個領域。

  • 伺服端腳本。這是 PHP 最傳統，也是最主要的目標領域。開展這項工作您需要具備以下三點：PHP 解析器（CGI 或者伺服器模塊）、WEB 伺服器和 WEB 瀏覽器。您需要在執行 WEB 伺服器時，安裝並配置 PHP，然後，可以用 WEB 瀏覽器來連接 PHP 程序的輸出，即瀏覽伺服端的 PHP 頁面。請查閱“安裝須知”一章以獲取更多訊息。

  • 命令行腳本。您可以編寫一段 PHP 腳本，並且不需要任何伺服器或者瀏覽器來執行它。通過這種方式，您僅僅只需要 PHP 解析器來執行。這種用法對於依賴 cron （Unix 或者 Linux 環境）或者 Task Scheduler （Windows 環境）的日常執行的腳本來說是理想的選擇。這些腳本也可以用來處理簡單的文本。請參閱“PHP 的命令行模式”以獲取更多訊息。

  • 編寫客戶端的 GUI 應用程序。對於基於視窗式的應用程序來說，PHP 或許不是一種最好的語言，但是如果您非常精通 PHP，並且希望在您的客戶端應用程序中使用 PHP 的一些高級特性，您可以利用 PHP-GTK 來編寫這些程序。用這種方法，您還可以編寫跨平台的應用程序。PHP-GTK 是 PHP 的一個擴展，在通常發布的 PHP 包中並不包含它。如果您對 PHP-GTK 感興趣，請連接其網站以獲取更多訊息。

PHP 能夠用在所有的主流操作系統上，包括 Linux、Unix 的各種變種（包括 HP-UX、Solaris 和 OpenBSD）、Microsoft Windows、Mac OS X、RISC OS 等。今天，PHP已經支援了大多數的 WEB 伺服器，包括 Apache、Microsoft Internet Information Server (IIS)、Personal Web Server (PWS)、Netscape 以及 iPlant server、Oreilly Website Pro Server、Caudium、Xitami、OmniHTTPd 等。對於大多數的伺服器，PHP 提供了一個模塊；還有一些 PHP 支援 CGI 標準，使得 PHP 能夠作為 CGI 處理器來工作。

綜上所述，使用 PHP，您可以自由地選擇操作系統和 WEB 伺服器。同時，您還可以在開發時選擇使用面對過程和面對對象，或者兩者混和的方式來開發。儘管 PHP 目前的版本還沒有支援 OOP 所有的標準，但很多代碼倉庫和大型的應用程序（包括 PEAR 庫）僅使用 OOP 代碼來開發。

使用 PHP，您並不局限於輸出 HTML。PHP 還能被用來動態輸出圖像、PDF 文件甚至 Flash 動畫（使用 libswf 和 Ming）。您還能夠非常簡便的輸出文本，例如 XHTML 以及任何其它形式的 XML 文件。PHP 能夠自動產生這些文件，在伺服端開闢出一塊動態內容的緩存，可以直接把它們顯示出來，或者將它們存儲到文件系統中。

PHP 最強大最顯著的特性之一，是它支援很大範圍的資料庫。您會發現利用 PHP 編寫資料庫支援的網頁簡單得難以置信。目前，PHP 支援如下資料庫：

Adabas D | Ingres | Oracle (OCI7 and OCI8)
dBase | InterBase | Ovrimos
Empress | FrontBase | PostgreSQL
FilePro (read-only) | mSQL | Solid
Hyperwave | Direct MS-SQL | Sybase
IBM DB2 | MySQL | Velocis
Informix | ODBC | Unix dbm

我們同時還有一個 DBX 擴展庫使得您可以自由的使用該擴展庫支援的任何資料庫。另外，PHP 還支援 ODBC，即 Open Database Connection Standard（開放資料庫連接標準），因此您可以連接任何其它支援該世界標準的資料庫。

PHP 還支援利用諸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM（Windows 環境）等不計其數的協議的服務。您還可以開放原始網路端口，使得任何其它的協議能夠協同工作。PHP 支援和所有 WEB 開發語言之間的 WDDX 複雜資料交換。關於相互連接，PHP 已經支援了對 Java 對象的即時連接，並且可以將他們自由的用作 PHP 對象。您甚至可以用我們的 CORBA 擴展庫來連接遠程對象。

PHP 具有極其有效的文本處理特性，支援從 POSIX 擴展或者 Perl 正則表達式到 XML 文檔解析。為了解析和連接 XML 文檔，我們支援了 SAX 和 DOM 標準。您可以使用我們的 XSLT 擴展庫來轉換 XML 文檔。

如果您將 PHP 用於電子商務領域，您會發現其 Cybercash payment、CyberMUT、VeriSign Payflow Pro 以及 CCVS 函式對於您的在線交易程序來所是非常有用的。

另外，我們還有很多其它有趣的擴展庫。例如 mnoGoSearch 搜索引擎函式、IRC 網關函式、多種壓縮工具（gzip、bz2）、日歷轉換、翻譯……

由於在這裡我們無法列出 PHP 所有的特性和可提供的便利，請您參閱“PHP 的安裝”以及“函式參考”等有關章節以獲取關於這裡提到的擴展庫更多的訊息。

上一頁 | 首頁 | 下一頁
簡介 | 上一層 | 簡易教學


繼承

通常你需要這樣一些類，這些類與其它現有的類擁有相同變數和函式。實際上，定義一個 通用類，用於你所有的項目，並且不斷豐富這個類以適應你的每個具體項目，將是一個不錯 的練習。為了使這一點變得更加容易，類可以從其它的類中擴展出來。擴展或派生出來的類 擁有其基類（this is called 'inheritance' despite the fact that nobody died） 的所有變數和函式，並包含所有你在派生類中定義的部分。類中的元素不可能減少，就是說， 不可以注銷任何存在的函式或者變數。一個擴充類總是依賴一個單獨的基類，也就是說， 多繼承是不支援的。使用關鍵字‘extends’來擴展一個類。

class Named_Cart extends Cart
{
    var $owner;

    function set_owner ($name)
    {
        $this->owner = $name;
    }
}

上述示例定義了名為 Named_Cart 的類，該類擁有 Cart 類的所有變數和函式，加上 附加的變數 $owner 和一個附加函式 set_owner()。現在，你以正常的方式創建了一 個 named cart，並且可以設置並取得 carts 的所有者。而正常的 cart 類的函式依舊 可以在 named carts 中使用：

$ncart = new Named_Cart;    // Create a named cart
$ncart->set_owner("kris");  // Name that cart
print $ncart->owner;        // print the cart owners name
$ncart->add_item("10", 1);  // (inherited functionality from cart)

這個也可以叫做“父－子”關係。你創建一個類，父類，並使用 extends 來創建一個 基於 父類的新類：子類。你甚至可以使用這個新的子類來 創建另外一個基於這個子類的類。

註: 類只有在定義後才可以使用！如果你須要類 Named_Cart 繼承類 Cart， 你必須首先定義 Cart 類。如果你須要創建另一個基於 Named_Cart 類 的 Yellow_named_cart 類，你必須首先定義 Named_Cart 類。 簡捷的說：類定義的順序是非常重要的。

上一頁 | 首頁 | 下一頁
類與對象 | 上一層 | 建構函式


::

注意

下列內容僅在 PHP 4 中有效。

有時，在沒有聲明任何實例的情況下連接類中的函式或者基類中的函式和變數很有用處。 而 :: 操作符即用於此情況。

class A
{
    function example()
    {
        echo "I am the original function A::example().<br>\n";
    }
}

class B extends A
{
    function example()
    {
        echo "I am the redefined function B::example().<br>\n";
        A::example();
    }
}

// there is no object of class A.
// this will print
//   I am the original function A::example().<br>
A::example();

// create an object of class B.
$b = new B;

// this will print
//   I am the redefined function B::example().<br>
//   I am the original function A::example().<br>
$b->example();

上面的例子呼叫了 A 類的函式 example()，但是這裡並不存在 A 類的對象，
因此不能這樣用 $a->example() 或者類似的方法呼叫 example()。反而我們
將 example() 作為一個類函式來呼叫，也就是說，作為一個類自身的函式來呼叫
，而不是這個類的任何對象。

這裡有類函式，但沒有類的變數。實際上，在呼叫函式時完全沒有任何對象。因而 一個類的函式可以不使用任何對象（但可以使用局部或者全域變數），並且可以根本 不使用 $this 變數。

上面的例子中，類 B 重新定義了函式 example()。A 類中原始定義的函式 example() 將被屏蔽並且不再生效，除非你使用 :: 操作符來連接 A 類中的 example() 函式。 如： A::example() （實際上，你必須編寫 parent::example()，下一章介紹該內容。）

就此而論，對於當前對象，它可能有對象變數。因而，你可以在對象函式的內部 使用 $this 和對象變數。

上一頁 | 首頁 | 下一頁
建構函式 | 上一層 | parent


parent

當你發現自己正在寫一些連接基類的變數和函式的代碼時，這充分說明了 你的派生類非常的精練、專業。

Instead of using the literal name of the base class in your code, you should be using the special name parent, which refers to the name of your base class as given in the extends declaration of your class. By doing this, you avoid using the name of your base class in more than one place. Should your inheritance tree change during implementation, the change is easily made by simply changing the extends declaration of your class. 你應該在代碼中使用專用名稱 parent 替代基類的名稱， 來連接

class A
{
    function example()
    {
        echo "I am A::example() and provide basic functionality.<br>\n";
    }
}

class B extends A
{
    function example()
    {
        echo "I am B::example() and provide additional functionality.<br>\n";
        parent::example();
    }
}

$b = new B;

// This will call B::example(), which will in turn call A::example().
$b->example();

上一頁 | 首頁 | 下一頁
:: | 上一層 | 序列化對象－會話中的對象


語言參考

PHP 手冊
上一頁 下一頁

II. 語言參考

目錄
6. 基本語法
7. 型別
8. 變數
9. 常數
10. 表達式
11. 運算符
12. 流程控制
13. 函式
14. 類與對象
15. 引用的解釋
上一頁 | 首頁 | 下一頁
Keeping Current |  | 基本語法


註釋

PHP 支援 'C'，'C++' 和 Unix Shell 風格的註釋。例如:

<?php
    echo "This is a test"; // This is a one-line c++ style comment
    /* This is a multi line comment
       yet another line of comment */
    echo "This is yet another test";
    echo "One Final Test"; # This is shell-style style comment
?>

"單行" 註釋僅僅註釋到行末或者當前的 PHP 代碼塊，無論哪個首先出現。

<h1>This is an <?php # echo "simple";?> example.</h1>
<p>The header above will say 'This is an example'.

小心不要嵌套 'C' 風格的註釋，當註釋大量代碼時，可能犯該錯誤。

<?php
 /*
    echo "This is a test"; /* This comment will cause a problem */
 */
?>

"單行" 註釋僅僅註釋到行末或者當前的 PHP 代碼塊，無論哪個首先出現。這意味著 // ?> 後面的 HTML 代碼將被顯示出來，?> 跳出了 PHP 模式並且傳回 HTML 模式，而且 // 註釋 符並不會影響到模式的轉換。

上一頁 | 首頁 | 下一頁
指令分隔符 | 上一層 | 型別


指令分隔符

指令分隔方式與 C 或者 Perl 類似 -- 每個語句由分號格開。

結束標記（?>）同樣隱含語句的結束，因此下面的代碼是等價的：

<?php
    echo "This is a test";
?>

<?php echo "This is a test" ?>

上一頁 | 首頁 | 下一頁
基本語法 | 上一層 | 註釋


預定義常數

PHP 向它執行的任何腳本提供了大量的預定義常數。不過很多常數都是由不同的擴展庫定義的，只有在加載了這些擴展庫時才會出現，或者動態加載後，或者在編譯時已經包括進去了。

預定義常數的列表見預定義常數一節。

上一頁 | 首頁 | 下一頁
常數 | 上一層 | 表達式


建構函式

注意

PHP 3 和 PHP4 的建構函式有所不同。PHP 4 的語義更可取。

建構函式是類中的一個特殊函式，當使用 new 操作符 創建一個類的實例時，建構函式將會自動呼叫。PHP 3 中，當函式於類同名時， 這個函式將成為建構函式。PHP 4 ，類中定義的函式與類同名時，這個函式將 成為一個建構函式－區別很微妙，但非常關鍵（見下文）。

// Works in PHP 3 and PHP 4.
class Auto_Cart extends Cart
{
    function Auto_Cart()
    {
        $this->add_item ("10", 1);
    }
}

上文定義了一個 Auto_Cart 類，即 Cart 類加上一個建構函式，當每次使用 "new" 創建 一個新的 Auto_Cart 類實例時，建構函式將自動呼叫並將一件商品的數目初始化為 “10”。 建構函式可以使用參數，而且這些參數可選的，它們可以使建構函式更加有用。為了依然可以 不帶參數的使用類，所有建構函式的參數應該提供預設值，使其可選。

// Works in PHP 3 and PHP 4.
class Constructor_Cart extends Cart
{
    function Constructor_Cart($item = "10", $num = 1)
    {
        $this->add_item ($item, $num);
    }
}

// Shop the same old boring stuff.

$default_cart = new Constructor_Cart;

// Shop for real...

$different_cart = new Constructor_Cart("20", 17);

你也可以使用 @ 操作符來 消除 發生在建構函式中的錯誤。e.g. @new.

注意

PHP 3，派生類和建構函式有許多限制。仔細閱讀下列範例以理解這些限制。

class A
{
    function A()
    {
      echo "I am the constructor of A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// no constructor is being called in PHP 3.
$b = new B;

PHP 3，在上面的示例中將不會有建構函式被呼叫。PHP 3 的規則是：“建構函式是與類 同名的函式”。這裡，類的名字是 B，但是類 B 中沒有函式 B()。什麼也不會發生。

PHP 4 修正了這個問題，並介紹了另外的新規則：如果一個類沒有建構函式，如果父類有建構 函式的話，父類的建構函式將會被呼叫。PHP 4 中，上面的例子將會輸出“I am the constructor of A.<br>”。

class A
{
    function A()
    {
        echo "I am the constructor of A.<br>\n";
    }

    function B()
    {
        echo "I am a regular function named B in class A.<br>\n";
        echo "I am not a constructor in A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// This will call B() as a constructor.
$b = new B;

如果是 PHP 3，A 類中的函式 B() 將立即成為類 B 中的建構函式，雖然並不是有意如此。 PHP 3 中的規則是：“建構函式是與類同名的函式”。PHP 3 並不關心函式是不是在 B 類 中定義的，或者是否已經被繼承。

PHP 4 修改了規則：“建構函式與定義其自身的類同名”。因而在 PHP 4 中，類 B 將 不會有屬於自身的建構函式，並且父類的建構函式將會被呼叫，顯示出 “I am the constructor of A.<br>”。 [譯者注,by Verdana: 這裡似乎有問題，實際輸出的結果，並不象這裡說的那樣。實際輸出的 內容是“I am a regular function named B in class A......”，輸出的是 B() 的內容 也就是說，例子中的註釋“This will call B() as a constructor”是正確的。如果從 A 類 中移除函式 B()，那麼將輸出 A() 的內容。]

注意

不管是 PHP 3 還是 PHP 4 都不能從派生類的建構函式中自動呼叫基類的建構函式。 It is your reponsibility to prapagater the call to constructors upstream where appropriate.

註: PHP 3 或者 PHP 4 中都沒有析構函式。你可以使用 register_shutdown_function() 函式來模擬多數析構函式的效果。

當對象被銷毀，使用 unset() 或者簡單的脫離範圍，析構函式都會自動呼叫。 但 PHP 中沒有析構函式。

上一頁 | 首頁 | 下一頁
繼承 | 上一層 | ::


The magic functions __sleep and __wakeup

serialize() checks if your class has a function with the magic name __sleep. If so, that function is being run prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.

The intended use of __sleep is to close any database connections that object may have, committing pending data or perform similar cleanup tasks. Also, the function is useful if you have very large objects which need not be saved completely.

Conversely, unserialize() checks for the presence of a function with the magic name __wakeup. If present, this function can reconstruct any resources that object may have.

The intended use of __wakeup is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.

上一頁 | 首頁 | 下一頁
序列化對象－會話中的對象 | 上一層 | References inside the constructor


References inside the constructor

Creating references within the constructor can lead to confusing results. This tutorial-like section helps you to avoid problems.

class Foo
{
    function Foo($name)
    {
        // create a reference inside the global array $globalref
        global $globalref;
        $globalref[] = &$this;
        // set name to passed value
        $this->setName($name);
        // and put it out
        $this->echoName();
    }

    function echoName()
    {
        echo "<br>",$this->name;
    }

    function setName($name)
    {
        $this->name = $name;
    }
}

Let us check out if there is a difference between $bar1 which has been created using the copy = operator and $bar2 which has been created using the reference =& operator...

$bar1 = new Foo('set in constructor');
$bar1->echoName();
$globalref[0]->echoName();

/* output:
set in constructor
set in constructor
set in constructor */

$bar2 =& new Foo('set in constructor');
$bar2->echoName();
$globalref[1]->echoName();

/* output:
set in constructor
set in constructor
set in constructor */

Apparently there is no difference, but in fact there is a very significant one: $bar1 and $globalref[0] are _NOT_ referenced, they are NOT the same variable. This is because "new" does not return a reference by default, instead it returns a copy.

註: There is no performance loss (since PHP 4 and up use reference counting) returning copies instead of references. On the contrary it is most often better to simply work with copies instead of references, because creating references takes some time where creating copies virtually takes no time (unless none of them is a large array or object and one of them gets changed and the other(s) one(s) subsequently, then it would be wise to use references to change them all concurrently).

To prove what is written above let us watch the code below.

// now we will change the name. what do you expect?
// you could expect that both $bar1 and $globalref[0] change their names...
$bar1->setName('set from outside');

// as mentioned before this is not the case.
$bar1->echoName();
$globalref[0]->echoName();

/* output:
set from outside
set in constructor */

// let us see what is different with $bar2 and $globalref[1]
$bar2->setName('set from outside');

// luckily they are not only equal, they are the same variable
// thus $bar2->name and $globalref[1]->name are the same too
$bar2->echoName();
$globalref[1]->echoName();

/* output:
set from outside
set from outside */

Another final example, try to understand it.

class A
{
    function A($i)
    {
        $this->value = $i;
        // try to figure out why we do not need a reference here
        $this->b = new B($this);
    }

    function createRef()
    {
        $this->c = new B($this);
    }

    function echoValue()
    {
        echo "<br>","class ",get_class($this),': ',$this->value;
    }
}

class B
{
    function B(&$a)
    {
        $this->a = &$a;
    }

    function echoValue()
    {
        echo "<br>","class ",get_class($this),': ',$this->a->value;
    }
}

// try to undestand why using a simple copy here would yield
// in an undesired result in the *-marked line
$a =& new A(10);
$a->createRef();

$a->echoValue();
$a->b->echoValue();
$a->c->echoValue();

$a->value = 11;

$a->echoValue();
$a->b->echoValue(); // *
$a->c->echoValue();

/*
output:
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11
*/

上一頁 | 首頁 | 下一頁
The magic functions __sleep and __wakeup | 上一層 | 引用的解釋


序列化對象－會話中的對象

註: In PHP 3, objects will lose their class association throughout the process of serialization and unserialization. The resulting variable is of type object, but has no class and no methods, thus it is pretty useless (it has become just like an array with a funny syntax).

注意

The following information is valid for PHP 4 only.

serialize() returns a string containing a byte-stream representation of any value that can be stored in PHP. unserialize() can use this string to recreate the original variable values. Using serialize to save an object will save all variables in an object. The functions in an object will not be saved, only the name of the class.

In order to be able to unserialize() an object, the class of that object needs to be defined. That is, if you have an object $a of class A on page1.php and serialize this, you'll get a string that refers to class A and contains all values of variabled contained in $a. If you want to be able to unserialize this on page2.php, recreating $a of class A, the definition of class A must be present in page2.php. This can be done for example by storing the class defintion of class A in an include file and including this file in both page1.php and page2.php.

classa.inc:
  class A
  {
      var $one = 1;

      function show_one()
      {
          echo $this->one;
      }
  }

page1.php:
  include("classa.inc");

  $a = new A;
  $s = serialize($a);
  // store $s somewhere where page2.php can find it.
  $fp = fopen("store", "w");
  fputs($fp, $s);
  fclose($fp);

page2.php:
  // this is needed for the unserialize to work properly.
  include("classa.inc");

  $s = implode("", @file("store"));
  $a = unserialize($s);

  // now use the function show_one() of the $a object.
  $a->show_one();

If you are using sessions and use session_register() to register objects, these objects are serialized automatically at the end of each PHP page, and are unserialized automatically on each of the following pages. This basically means that these objects can show up on any of your pages once they become part of your session.

It is strongly recommended that you include the class definitions of all such registered objects on all of your pages, even if you do not actually use these classes on all of your pages. If you don't and an object is being unserialized without its class definition being present, it will lose its class association and become an object of class stdClass without any functions available at all, that is, it will become quite useless.

So if in the example above $a became part of a session by running session_register("a"), you should include the file classa.inc on all of your pages, not only page1.php and page2.php.

上一頁 | 首頁 | 下一頁
parent | 上一層 | The magic functions __sleep and __wakeup


算術運算符

還記得學校裡學到的基本數學知識嗎？就和它們一樣。

表格 11-2. 算術運算符

例子 | 名稱 | 結果
$a + $b | 加法 | $a 和 $b 的和。
$a - $b | 減法 | $a 和 $b 的差。
$a * $b | 乘法 | $a 和 $b 的積。
$a / $b | 除法 | $a 除以 $b 的商。
$a % $b | 取模 | $a 除以 $b 的餘數。

除號（“/”）總是傳回浮點數，即使兩個運算數是整數（或由字串轉換成的整數）也是這樣。

上一頁 | 首頁 | 下一頁
運算符 | 上一層 | 設值運算符


陣列運算符

PHP 僅有的一個陣列運算符是 + 運算符。它把右邊的陣列附加到左邊的陣列後，但是重複的鍵值不會被覆蓋。

$a = array("a" => "apple", "b" => "banana");
$b = array("a" =>"pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b;

var_dump($c);
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}

上一頁 | 首頁 | 下一頁
字串運算符 | 上一層 | 流程控制


設值運算符

基本的設值運算符是“=”。你一開始可能會以為它是“等於”，其實不是的。它實際上意味著把右邊表達式的值賦給左運算數。

設值運算表達式的值也就是所賦的值。也就是說，“$a = 3”的值是 3。這樣就可以使你做一些小技巧：

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.

在基本設值運算符之外，還有適合於所有二元算術和字串運算符的“組和運算符”，這可以讓你在一個表達式中使用它的值並把表達式的結果賦給它，例如：

$a = 3;
$a += 5; // sets $a to 8, as if we had said: $a = $a + 5;
$b = "Hello ";
$b .= "There!"; // sets $b to "Hello There!", just like $b = $b . "There!";

注意設值運算將原變數的值拷貝到新變數中（傳值設值），所以改變其中一個並不影響另一個。這也適合於你在在緊密循環中拷貝一些值例如大數值。PHP 4 支援引用設值，用 $var = &$othervar; 語法，但在 PHP 3 中不可能這樣做。“引用設值”意味著兩個變數都指向同一個資料，沒有任何資料的拷貝。有關引用的更多訊息見引用的說明。

上一頁 | 首頁 | 下一頁
算術運算符 | 上一層 | 位運算符


位運算符

位運算符允許對整型數中指定的位進行置位。如果左右參數都是字串，則位運算符將操作這個字串中的字元。

<?php
    echo 12 ^ 9; // Outputs '5'

    echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
                     // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

    echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0
                            // 'a' ^ 'e' = #4
?>

表格 11-3. 位運算符

例子 | 名稱 | 結果
$a & $b | And（按位與） | 將在 $a 和 $b 中都為 1 的位設為 1。
$a | $b | Or（按位或） | 將在 $a 或者 $b 中為 1 的位設為 1。
$a ^ $b | Xor（按位異或） | 將在 $a 和 $b 中不同的位設為 1。
~ $a | Not（按位非） | 將 $a 中為 0 的位設為 1，反之亦然。
$a << $b | Shift left（左移） | 將 $a 中的位向左移動 $b 次（每一次移動都表示“乘以 2”）。
$a >> $b | Shift right（右移） | 將 $a 中的位向右移動 $b 次（每一次移動都表示“除以 2”）。
上一頁 | 首頁 | 下一頁
設值運算符 | 上一層 | 比較運算符


比較運算符

比較運算符，如同它們名稱所暗示的，允許你對兩個值進行比較。

表格 11-4. 比較運算符

例子 | 名稱 | 結果
$a == $b | 等於 | TRUE，如果 $a 等於 $b。
$a === $b | 全等 | TRUE，如果 $a 等於 $b，並且它們的型別也相同。(PHP 4 only)
$a != $b | 不等 | TRUE，如果 $a 不等於 $b。
$a <> $b | 不等 | TRUE，如果 $a 不等於 $b。
$a !== $b | 非全等 | TRUE，如果 $a 不等於 $b，或者它們的型別不同。(PHP 4 only)
$a < $b | 小與 | TRUE，如果 $a 嚴格小於 $b。
$a > $b | 大於 | TRUE，如果 $a 嚴格 $b。
$a <= $b | 小於等於 | TRUE，如果 $a 小於或者等於 $b。
$a >= $b | 大於等於 | TRUE，如果 $a 大於或者等於 $b。

另外一個條件運算符是“?:”（或三元）運算符，它和 C 以及很多其它語言的操作一樣。

(expr1) ? (expr2) : (expr3);

如果 expr1 的值為 TRUE，則此表達式的值為 expr2，如果 expr1 的值為 FALSE，則此表達式的值為 expr3。

上一頁 | 首頁 | 下一頁
位運算符 | 上一層 | 錯誤控制運算符


錯誤控制運算符

PHP 支援一個錯誤控制運算符：@。當將其放置在一個 PHP 表達式之前，該表達式可能產生的任何錯誤訊息都被忽略掉。

如果啟動了 track_errors 特性，表達式所產生的任何錯誤訊息都被存放在變數 $php_errormsg 中。此變數在每次出錯時都會被覆蓋，所以如果想用它的話就要盡早檢查。

<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
    die ("Failed opening file: error was '$php_errormsg'");

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.

?>

註: @ 運算符只對表達式有效。對新手來說一個簡單的規則就是：如果你能從某處得到值，你就能在它前面加上 @ 運算符。例如，你可以把它放在變數，函式和 include() 呼叫，常數，等等之前。不能把它放在函式或類的定義之前，也不能用於條件結構例如 if 和 foreach 等。

參見 error_reporting()。

註: 錯誤控制前綴“@”不會屏蔽解析錯誤的訊息。

警告

目前的“@”錯誤控制運算符前綴甚至使導致腳本終止的嚴重錯誤的錯誤報告也失效。這意味著如果你在某個不存在或型別錯誤的函式呼叫前用了“@”來抑制錯誤訊息，那腳本會沒有任何跡象顯示原因而死在那裡。

上一頁 | 首頁 | 下一頁
比較運算符 | 上一層 | 執行運算符


執行運算符

PHP 支援一個執行運算符：反引號（``）。注意這不是單引號！PHP 將嘗試將反引號中的內容作為外殼命令來執行，並將其輸出訊息傳回（例如，可以賦給一個變數而不是簡單地丟棄到標準輸出）。

$output = `ls -al`;
echo "<pre>$output</pre>";

註: 反引號運算符在啟動了 safe mode 或者關閉了 shell_exec() 時是無效的。

參見 escapeshellcmd()，exec()，passthru()，popen()，shell_exec() 和 system()。

上一頁 | 首頁 | 下一頁
錯誤控制運算符 | 上一層 | 加一／減一運算符


加一／減一運算符

PHP 支援 C 風格的前／後加一與減一運算符。

表格 11-5. 加一／減一運算符

例子 | 名稱 | 效果
++$a | 前加 | $a 的值加一，然後傳回 $a。
$a++ | 後加 | 傳回 $a，然後將 $a 的值加一。
--$a | 前減 | $a 的值減一， 然後傳回 $a。
$a-- | 後減 | 傳回 $a，然後將 $a 的值減一。

一個簡單的示例腳本：

<?php
echo "<h3>Postincrement</h3>";
$a = 5;
echo "Should be 5: " . $a++ . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";

echo "<h3>Preincrement</h3>";
$a = 5;
echo "Should be 6: " . ++$a . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";

echo "<h3>Postdecrement</h3>";
$a = 5;
echo "Should be 5: " . $a-- . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";

echo "<h3>Predecrement</h3>";
$a = 5;
echo "Should be 4: " . --$a . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";
?>

上一頁 | 首頁 | 下一頁
執行運算符 | 上一層 | 邏輯運算符


邏輯運算符

表格 11-6. 邏輯運算符

例子 | 名稱 | 結果
$a and $b | And（邏輯與） | TRUE，如果 $a 與 $b 都為 TRUE。
$a or $b | Or（邏輯或） | TRUE，如果 $a 或 $b 任一為 TRUE。
$a xor $b | Xor（邏輯異或） | TRUE，如果 $a 或 $b 任一為 TRUE，但不同時是。
! $a | Not（邏輯非） | TRUE，如果 $a 不為 TRUE。
$a && $b | And（邏輯與） | TRUE，如果 $a 與 $b 都為 TRUE。
$a || $b | Or（邏輯或） | TRUE，如果 $a 或 $b 任一為 TRUE。

“與”和“或”有兩種不同形式運算符的原因是它們操作的優先級不同。（見運算符優先級。）

上一頁 | 首頁 | 下一頁
加一／減一運算符 | 上一層 | 字串運算符


字串運算符

有兩個字串運算符。第一個是連接運算符（“.”），它傳回其左右參數連接後的字串。第二個是連接設值運算符（“.=”），它將右邊參數附加到左邊的參數後。更多訊息見設值運算符。

$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";
$a .= "World!";     // now $a contains "Hello World!"

上一頁 | 首頁 | 下一頁
邏輯運算符 | 上一層 | 陣列運算符


引用不是什麼

如前所述，引用不是指針。這意味著下面的結構不會產生你預期的效果：

function foo (&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);

這將使 foo 函式中的 $var 變數在函式呼叫時和 $bar 綁定在一起，但接著又被重新綁定到了 $GLOBALS["baz"] 上面。不可能通過引用機制將 $bar 在函式呼叫範圍內綁定到別的變數上面，因為在函式 foo 中並沒有變數 $bar（它被表示為 $var，但是 $var 只有變數內容而沒有呼叫符號表中的名字到值的綁定）。

上一頁 | 首頁 | 下一頁
引用做什麼 | 上一層 | 引用傳遞


引用傳遞

你可以將一個變數通過引用傳遞給函式，這樣該函式就可以修改其參數的值。語法如下：

function foo (&$var)
{
    $var++;
}

$a=5;
foo ($a);
// $a is 6 here

注意在函式呼叫時沒有引用符號 － 只有函式定義中有。光是函式定義就足夠使參數通過引用來正確傳遞了。

以下內容可以通過引用傳遞：

  • 變數，例如 foo($a)

  • New 語句，例如 foo(new foobar())

  • 從函式中傳回的引用，例如：

    function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());

    詳細解釋見引用傳回。

任何其它表達式都不能通過引用傳遞，結果未定義。例如下面引用傳遞的例子是無效的：

function bar() // Note the missing &
{
    $a = 5;
    return $a;
}
foo(bar());

foo($a = 5) // Expression, not variable
foo(5) // Constant, not variable

這些條件是 PHP 4.0.4 以及以後版本有的。

上一頁 | 首頁 | 下一頁
引用不是什麼 | 上一層 | 引用傳回


引用傳回

引用傳回用在當你想用函式找到引用應該被綁定在哪一個變數上面時。當傳回引用時，使用此語法：

function &find_var ($param)
{
    ...code...
    return $found_var;
}

$foo =& find_var ($bar);
$foo->x = 2;

本例中 find_var 函式所傳回的對象的屬性將被設定（譯者：指的是 $foo->x = 2; 語句），而不是拷貝，就和沒有用引用語法一樣。

註: 和參數傳遞不同，這裡必須在兩個地方都用 & 符號 － 來指出傳回的是一個引用，而不是通常的一個拷貝，同樣也指出 $foo 是作為引用的綁定，而不是通常的設值。

上一頁 | 首頁 | 下一頁
引用傳遞 | 上一層 | 取消引用


引用定位

許多 PHP 的語法結構是通過引用機制實現的，所以上述有關引用綁定的一切也都適用於這些結構。一些結構，例如引用傳遞和傳回，已經在上面提到了。其它使用引用的結構有：

global 引用

當用 global $var 聲明一個變數時實際上建立了一個到全域變數的引用。也就是說和這樣做是相同的：

$var =& $GLOBALS["var"];

這意味著，例如，unset $var 不會 unset 全域變數。

$this

在一個對象的方法中，$this 永遠是呼叫它的對象的引用。

上一頁 | 首頁 | 下一頁
取消引用 | 上一層 | 特點


取消引用

當你 unset 一個引用，只是斷開了變數名和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如：

$a = 1;
$b =& $a;
unset ($a);

不會 unset $b，只是 $a。

再拿這個和 Unix 的 unlink 呼叫來類比一下可能有助於理解。

上一頁 | 首頁 | 下一頁
引用傳回 | 上一層 | 引用定位


引用做什麼

PHP 的引用允許你用兩個變數來指向同一個內容。意思是，當你這樣做時：

$a =& $b

這意味著 $a 和 $b 指向了同一個變數。

註: $a 和 $b 在這裡是完全相同的，這並不是 $a 指向了 $b 或者相反，而是 $a 和 $b 指向了同一個地方。

同樣的語法可以用在函式中，它傳回引用，以及用在 new 運算符中（PHP 4.0.4 以及以後版本）：

$bar =& new fooclass();
$foo =& find_var ($bar);

註: 不用 & 運算符導致對象產生了一個拷貝。如果你在類中用 $this，它將作用於該類當前的實例。沒有用 & 的設值將拷貝這個實例（例如對象）並且 $this 將作用於這個拷貝上，這並不總是想要的結果。由於性能和內存消耗的問題，通常你只想工作在一個實例上面。

儘管你可以用 @ 運算符來關閉建構函式中的任何錯誤訊息，例如用 @new，但用 &new 語句時這不起效果。這是 Zend 引擎的一個限制並且會導致一個解析錯誤。

引用做的第二件事是用引用傳遞變數。這是通過在函式內建立一個本地變數並且該變數在呼叫範圍內引用了同一個內容來實現的。例如：

function foo (&$var)
{
    $var++;
}

$a=5;
foo ($a);

將使 $a 變成 6。這是因為在 foo 函式中變數 $var 指向了和 $a 指向的同一個內容。更多詳細解釋見引用傳遞。

引用做的第三件事是引用傳回。

上一頁 | 首頁 | 下一頁
引用的解釋 | 上一層 | 引用不是什麼


陣列

PHP 中的陣列實際上是一個有序圖。圖是一種把 values 映射到 keys 的型別。此型別在很多方面做了優化，因此你可以把它當成真正的陣列來使用，或列表（矢量），散列表（是圖的一種實現），字典，集合，棧，隊列以及更多可能性。因為可以用另一個 PHP 陣列作為值，也可以很容易地模擬樹。

解釋這些結構超出了本手冊的範圍，但對於每種結構你至少會發現一個例子。要得到這些結構的更多訊息，我們建議你參考有關此廣闊主題的外部著作。

語法

定義 array()

可以用 array() 語言結構來新建一個 array。它接受一定數量用逗號分隔的 key => value 參數對。

key 可以是 integer 或者 string。如果鍵名是一個 integer 的標準表達方法，則被解釋為整數（例如 "8" 將被解釋為 8，而 "08" 將被解釋為 "08"）。

值可以是任何值。

如果省略鍵名，則取當前最大的整數索引，而新的鍵名將是該值加一。整數可以為負，所以對於負的索引也是這樣。例如最大的索引是 -6 將導致新的鍵名是 -5。如果還不存在整數索引，則鍵名將為 0（零）。如果你指定的鍵名已經有了值，則該值會被覆蓋。

使用 true 作為鍵名將使 integer 1 成為鍵名。使用 false 作為鍵名將使 integer 0 成為鍵名。使用 NULL 作為鍵名將等同於使用空字串。使用空字串作為鍵名將新建（或覆蓋）一個用空字串作為鍵名的值，這和用空的方括號不一樣。

不能用陣列和對象作為鍵名。這樣做會導致一個警告：Illegal offset type。

array( [key =>] value
     , ...
     )
// key is either string or nonnegative integer
// value can be anything

用方括號的語法新建／修改

可以通過明示地設定值來改變一個現有的陣列。

這是通過在方括號內指定鍵名來給陣列設值實現的。也可以省略鍵名，在這種情況下給變數名加上一對空的方括號（“[]”）。
$arr[key] = value;
$arr[] = value;
// key is either string or nonnegative integer
// value can be anything
如果 $arr 還不存在，將會新建一個。這也是一種定義陣列的替換方法。要改變一個值，只要給它賦一個新值。如果要刪除一個鍵名／值對，要對它用 unset()。

實用函式

有相當多的實用函式作用於陣列，參見陣列函式庫一節。

註: unset() 函式允許取消一個陣列中的鍵名。要注意陣列將不會重建索引。

$a = array( 1 => 'one', 2 => 'two', 3 => 'three' );
unset( $a[2] );
/* 將產生一個陣列，定義為
   $a = array( 1=>'one', 3=>'three');
   而不是
   $a = array( 1 => 'one', 2 => 'three');
*/

foreach 控制結構是專門用於陣列的。它提供了一個簡單的方法來遍歷陣列。

陣列做什麼和不做什麼

為什麼 $foo[bar] 錯了？

應該始終在陣列的索引上加上引號。例如用 $foo['bar'] 而不是 $foo[bar]。但是為什麼 $foo[bar] 錯了呢？你可能在老的腳本中見過如下語法：

$foo[bar] = 'enemy';
echo $foo[bar];
// etc

這樣是錯的，但可以起作用。那麼為什麼錯了呢？原因是此代碼中有一個未定義的常數（bar）而不是字串（'bar'－注意引號），而 PHP 可能會在以後定義此常數，不幸的是你的代碼中有同樣的名字。它可以起作用，因為未定義常數會被轉換為同樣名字的字串。

和在語法一節中規定的一樣，在方括號（“[”和“]”）之間必須有一個表達式。這意味著你可以這樣寫：

echo $arr[ foo(true) ];

這是一個用函式傳回值作為陣列索引的例子。PHP 也可以用已知常數，你可能之前已經見過 E_*。

$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";

注意 E_ERROR 也是個合法的標籤，就和第一個例子中的 bar 一樣。但是上一個例子實際上和如下寫法是一樣的：

$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";

因為 E_ERROR 等於 1，等等。

那麼 $foo[bar] 怎麼可能起作用的呢？它起作用是因為根據語法的預期，bar 被當成了一個常數表達式。然而，在這個例子中不存在名為 bar 的常數。PHP 就假定你指的是字面上的 bar，也就是字串 "bar"，但你忘記寫引號了。

那麼為什麼這樣做不好？

在未來的某一時刻，PHP 開發小組可能會想新增一個常數或者關鍵字，那你就有麻煩了。例如你已經不能這樣用 empty 和 default 這兩個詞了，因為他們是保留字。

註: 當你把 error_reporting 設為 E_ALL 時，你將會看到無論何時使用了未定義的 index 時，PHP 都會產生通知（在你的腳本中加入一行 error_reporting(E_ALL);）。

註: 在雙引號 string 中，另一種語法是合法的。細節見字串中的變數解析。

例子

PHP 中的陣列型別有非常多的用途，因此這裡有一些例子展示陣列的完整威力。

// this
$a = array( 'color' => 'red'
          , 'taste' => 'sweet'
          , 'shape' => 'round'
          , 'name'  => 'apple'
          ,            4        // key will be 0
          );

// is completely equivalent with
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[]        = 4;        // key will be 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// will result in the array array( 0 => 'a' , 1 => 'b' , 2 => 'c' ),
// or simply array('a', 'b', 'c')

例子 7-4. 使用 array()

// Array as (property-)map
$map = array( 'version'    => 4
            , 'OS'         => 'Linux'
            , 'lang'       => 'english'
            , 'short_tags' => true
            );

// strictly numerical keys
$array = array( 7
              , 8
              , 0
              , 156
              , -10
              );
// this is the same as array( 0 => 7, 1 => 8, ...)

$switching = array(         10 // key = 0
                  , 5    =>  6
                  , 3    =>  7
                  , 'a'  =>  4
                  ,         11 // key = 6 (maximum of integer-indices was 5)
                  , '8'  =>  2 // key = 8 (integer!)
                  , '02' => 77 // key = '02'
                  , 0    => 12 // the value 10 will be overwritten by 12
                  );

// empty array
$empty = array();

例子 7-5. 集合

$colors = array('red','blue','green','yellow');

foreach ( $colors as $color ) {
    echo "Do you like $color?\n";
}

/* output:
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
*/

注意目前不可能在這樣一個循環中直接改變陣列的值。可以改變的例子如下：

例子 7-6. 集合

foreach ($colors as $key => $color) {
    // won't work:
    //$color = strtoupper($color);

    //works:
    $colors[$key] = strtoupper($color);
}
print_r($colors);

/* output:
Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)
*/

本例產生一個基於一的陣列。

例子 7-7. 基於一的陣列

$firstquarter  = array(1 => 'January', 'February', 'March');
print_r($firstquarter);

/* output:
Array
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)
*/

例子 7-8. 填充真正的陣列

// fill an array with all items from a directory
$handle = opendir('.');
while ($file = readdir($handle))
{
    $files[] = $file;
}
closedir($handle);

陣列是有序的。你也可以使用不同的排序函式來改變順序。更多訊息參見陣列函式庫。

例子 7-9. 陣列排序

sort($files);
print_r($files);

因為陣列中的值可以為任意值，也可是另一個陣列。這樣你可以產生遞歸或多維陣列。

例子 7-10. 遞歸和多維陣列

$fruits = array ( "fruits"  => array ( "a" => "orange"
                                     , "b" => "banana"
                                     , "c" => "apple"
                                     )
                , "numbers" => array ( 1
                                     , 2
                                     , 3
                                     , 4
                                     , 5
                                     , 6
                                     )
                , "holes"   => array (      "first"
                                     , 5 => "second"
                                     ,      "third"
                                     )
                );
上一頁 | 首頁 | 下一頁
字串 | 上一層 | 對象


布爾型

這是最簡單的型別。boolean 表達了真值，可以為 TRUE 或 FALSE。

註: 布爾型別是 PHP 4 引進的。

語法

要指定一個布爾值，使用關鍵字 TRUE 或 FALSE。兩個都是大小寫不敏感的。

$foo = True; // assign the value TRUE to $foo

通常你用某些運算符傳回 boolean 值，並將其傳遞給流程控制。

// == is an operator which returns a boolean
if ($action == "show_version") {
    echo "The version is 1.23";
}

// this is not necessary:
if ($show_separators == TRUE) {
    echo "<hr>\n";
}

// because you can simply type this:
if ($show_separators) {
    echo "<hr>\n";
}

轉換為布爾值

要明示地將一個值轉換成 boolean，用 (bool) 或者 (boolean) 來強制轉換。但是很多情況下不需要用強制轉換，因為當運算符，函式或者流程控制需要一個 boolean 參數時，該值會被自動轉換。

參見型別戲法。

當轉換為 boolean 時，以下值被認為是 FALSE：

  • 布爾值 FALSE

  • 整型值 0（零）

  • 浮點型值 0.0（零）

  • 空白字串和字串 "0"

  • 沒有單元的陣列

  • 沒有單元的對象

  • 特殊型別NULL（包括尚未設定的變數）

所有其它值都被認為是 TRUE（包括任何資源）。

警告

-1 和其它非零值（不論正負）一樣，被認為是 TRUE！

上一頁 | 首頁 | 下一頁
型別 | 上一層 | 整型


浮點型

浮點數（也叫“floats”，“doubles”或“real numbers”）可以用以下任何語法定義：
$a = 1.234; $a = 1.2e3; $a = 7E-10;
浮點數的字長和平台相關，儘管通常最大值是 1.8e308 並具有 14 位十進制數字的精度（64 位 IEEE 格式）。

浮點數精度

顯然簡單的十進制分數如同 0.1 或 0.7 不能在不丟失一點點精度的情況下轉換為內部二進制的格式。這就會造成混亂的結果：例如，floor((0.1+0.7)*10) 通常會傳回 7 而不是預期中的 8，因為該結果內部的表示其實是類似 7.9999999999...。

這和一個事實有關，那就是不可能精確的用有限位數表達某些十進制分數。例如，十進制的 1/3 變成了 0.3333333. . .。

所以永遠不要相信浮點數結果精確到了最後一位，也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度，應該使用任意精度數學函式庫或者 gmp 函式庫。

上一頁 | 首頁 | 下一頁
整型 | 上一層 | 字串


整型

一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。

參見任意長度整數和浮點數。

語法

整型值可以用十進制，十六進制或八進制符號指定，前面可以加上可選的符號（- 或者 +）。

如果用八進制符號，數字前必須加上 0（零），用十六進制符號數字前必須加上 0x。

例子 7-1. 整數文字表達

$a = 1234; # 十進制數
$a = -123; # 一個負數
$a = 0123; # 八進制數（等於十進制的 83）
$a = 0x1A; # 十六進制數（等於十進制的 26）
整型數的字長和平台有關，儘管通常最大值是大約二十億（32 位有符號）。PHP 不支援無符號整數。

整數溢出

如果你指定一個數超出了 integer 的範圍，將會被解釋為 float。同樣如果你執行的運算結果超出了 integer 範圍，也會傳回 float。

$large_number =  2147483647;
var_dump($large_number);
// 輸出為：int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// 輸出為：float(2147483648)

// 同樣也適用於十六進制表示的整數：
var_dump( 0x80000000 );
// 輸出為：float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);
// 輸出為：float(50000000000)

警告

不幸的是 PHP 中有個 bug，因此當有負數參與時結果並不總是正確。例如當運算 -50000 * $million 時結果是 -429496728。不過當兩個運算數都是正數時就沒問題。

這個問題已經在 PHP 4.1.0 中解決了。

PHP 中沒有整除的運算符。1/2 產生出 float 0.5。

var_dump( 25/7 );
// 輸出為：float(3.5714285714286)

轉換為整形

要明示地將一個值轉換為 integer，用 (int) 或 (integer) 強制轉換。不過大多數情況下都不需要強制轉換，因為當運算符，函式或流程控制需要一個 integer 參數時，值會自動轉換。

參見型別戲法。

從布爾值轉換

FALSE 將產生出 0（零），TRUE 將產生出 1（壹）。

從浮點數轉換

當從浮點數轉換成整數時，數字將被取整（丟棄小數位）。

如果浮點數超出了整數範圍（通常為 +/- 2.15e+9 = 2^31），則結果不確定，因為沒有足夠的精度使浮點數給出一個確切的整數結果。在此情況下沒有警告，甚至沒有任何通知！

（譯者注：）在 Linux 下傳回結果是最小負數（-2147483648），而在 Windows 下傳回結果是零（0）。

警告

決不要將未知的分數強制轉換為 integer，這樣有時會導致意外的結果。

echo (int) ( (0.1+0.7) * 10 ); // echoes 7!

更多訊息見浮點數精度。

從字串轉換

參見字串轉換。

從其它型別轉換

注意

沒有定義從其它型別轉換為整型的行為。目前的行為和值先轉換為布爾值一樣。不過不要依靠此行為，因為它會未加通知地改變。

上一頁 | 首頁 | 下一頁
布爾型 | 上一層 | 浮點型


NULL

特殊的 NULL 值表示一個變數沒有值。NULL 型別唯一可能的值就是 NULL。

註: NULL 型別是 PHP 4 引進的。

在下列情況下一個變數被認為是 NULL：

  • 被設值為 NULL。

  • 尚未被設值。

  • 被 unset()。

語法

NULL 型別只有一個值，就是大小寫敏感的關鍵字 NULL。

$var = NULL;

參見 is_null() 和 unset()。

上一頁 | 首頁 | 下一頁
資源 | 上一層 | 型別戲法


對象

對象初始化

要初始化一個對象，用 new 語句將對象實例到一個變數中。

<?php
class foo
{
    function do_foo()
    {
        echo "Doing foo.";
    }
}

$bar = new foo;
$bar->do_foo();
?>

完整的討論見類與對象一章。

上一頁 | 首頁 | 下一頁
陣列 | 上一層 | 資源


資源

一個資源是一個特殊變數，保存了到外部資源的一個引用。資源是通過專門的函式來建立和使用的。所有這些函式及其相應資源型別見附錄。

註: 資源型別是 PHP 4 引進的。

釋放資源

由於 PHP4 Zend 引擎引進了資源計數系統，可以自動檢測到一個資源不再被引用了（和 Java 一樣）。這種情況下此資源使用的所有外部資源都會被垃圾回收系統釋放。由此原因，很少需要用某些 free-result 函式來手工釋放內存。

註: 持久資料庫連接比較特殊，它們不會被垃圾回收系統破壞。參見資料庫永久連接一章。

上一頁 | 首頁 | 下一頁
對象 | 上一層 | NULL


字串

string 是一系列字元。在 PHP 中，字元和字節一樣，也就是說，一共有 256 種不同字元的可能性。這也暗示 PHP 對 Unicode 沒有本地支援。

註: 一個字串變得非常巨大也沒有問題，PHP 沒有給字串的大小強加實現範圍，所以完全沒有理由擔心長字串。

語法

字串可以用三種字面上的方法定義。

  • 單引號

  • 雙引號

  • 定界符

單引號

指定一個簡單字串的最簡單的方法是用單引號（字元 '）括起來。

要表示一個單引號，需要用反斜線（\）轉義，和很多其它語言一樣。如果在單引號之前或字串結尾需要出現一個反斜線，需要用兩個反斜線表示。注意如果你試圖轉義任何其它字元，反斜線本身也會被顯示出來！所以通常不需要轉義反斜線本身。

註: 在 PHP 3 中，此情況下將發出一個 E_NOTICE 級的警告。

註: 和其他兩種語法不同，單引號字串中出現的變數不會被變數的值替代。

echo 'this is a simple string';
echo 'You can also have embedded newlines in strings,
like this way.';
echo 'Arnold once said: "I\'ll be back"';
// output: ... "I'll be back"
echo 'Are you sure you want to delete C:\\*.*?';
// output: ... delete C:\*.*?
echo 'Are you sure you want to delete C:\*.*?';
// output: ... delete C:\*.*?
echo 'I am trying to include at this point: \n a newline';
// output: ... this point: \n a newline

雙引號

如果用雙引號（"）括起字串，PHP 懂得更多特殊字元的轉義序列：

表格 7-1. 轉義字元

序列 | 含義
\n | 換行（LF 或 ASCII 字元 0x0A（10））
\r | 回車（CR 或 ASCII 字元 0x0D（13））
\t | 水平制表符（HT 或 ASCII 字元 0x09（9））
\\ | 反斜線
\$ | 美元符號
\" | 雙引號
\[0-7]{1,3} | 此正則表達式序列匹配一個用八進制符號表示的字元
\x[0-9A-Fa-f]{1,2} | 此正則表達式序列匹配一個用十六進制符號表示的字元

此外，如果試圖轉義任何其它字元，反斜線本身也會被顯示出來！

雙引號字串最重要的一點是其中的變數名會被變數值替代。細節參見字串解析。

定界符

另一種給字串定界的方法使用定界符語法（“<<<”）。應該在 <<< 之後提供一個標籤，然後是字串，然後是同樣的標籤結束字串。

結束標籤必須從行的第一列開始。同樣，標籤也必須遵循 PHP 中其它任何標簽的命名規則：只能包含字母數字下劃線，而且必須以下劃線或非數字字元開始。

警告

很重要的一點必須指出，結束標籤所在的行不能包含任何其它字元，可能除了一個分號（;）之外。這尤其意味著該標籤不能被縮進，而且在分號之前和之後都不能有任何空格或制表符。

定界符文本表現的就和雙引號字串一樣，只是沒有雙引號。這意味著在定界符文本中不需要轉義引號，不過仍然可以用以上列出來的轉義代碼。變數會被展開，但當在定界符文本中表達複雜變數時和字串一樣同樣也要注意。

例子 7-2. 定界符字串例子

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* More complex example, with variables. */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

註: 定界符支援是 PHP 4 中加入的。

變數解析

當用雙引號或者定界符指定字串時，其中的變數會被解析。

有兩種語法，一種簡單的和一種複雜的。簡單語法最通用和方便，它提供了解析變數，陣列值，或者對象屬性的方法。

複雜語法是 PHP 4 引進的，可以用大括號括起一個表達式。

簡單語法

如果遇到美元符號（$），解析器會盡可能多地取得後面的字元以組成一個合法的變數名。如果你想明示指定名字的結束，用大括號把變數名括起來。

$beer = 'Heineken';
echo "$beer's taste is great"; // works, "'" is an invalid character for varnames
echo "He drank some $beers"; // won't work, 's' is a valid character for varnames
echo "He drank some ${beer}s"; // works

同樣也可以解析陣列索引或者對象屬性。對於陣列索引，右方括號（]）標志著索引的結束。對象屬性則和簡單變數適用同樣的規則，儘管對於對象屬性沒有像變數那樣的小技巧。

$fruits = array( 'strawberry' => 'red' , 'banana' => 'yellow' );

// note that this works differently outside string-quotes.
echo "A banana is $fruits[banana].";

echo "This square is $square->width meters broad.";

// Won't work. For a solution, see the complex syntax.
echo "This square is $square->width00 centimeters broad.";

對於任何更複雜的情況，應該使用複雜語法。

複雜（大括號）語法

不是因為語法複雜而稱其為複雜，而是因為用此方法可以包含複雜的表達式。

事實上，用此語法你可以在字串中包含任何在名字空間的值。僅僅用和在字串之外同樣的方法寫一個表達式，然後用 { 和 } 把它包含進來。因為不能轉義“{”，此語法僅在 $ 緊跟在 { 後面時被識別（用“{\$”或者“\{$”來得到一個字面上的“{$”）。用一些例子可以更清晰：

$great = 'fantastic';
echo "This is { $great}"; // 不行，輸出為：This is { fantastic}
echo "This is {$great}";  // 可以，輸出為：This is fantastic
echo "This square is {$square->width}00 centimeters broad.";
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason
// as $foo[bar] is wrong outside a string.
echo "This is wrong: {$arr[foo][3]}";

echo "You should do it this way: {$arr['foo'][3]}";
echo "You can even write {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";

連接字串中的字元

字串中的字元可以通過在字串之後用大括號指定所要字元從零開始的偏移量來連接。

註: 為了向下相容，仍然可以用方括號。不過此語法在 PHP 4 中不贊成使用。

例子 7-3. 一些字串例子

<?php
/* Assigning a string. */
$str = "This is a string";

/* Appending to it. */
$str = $str . " with some more text";

/* Another way to append, includes an escaped newline. */
$str .= " and a newline at the end.\n";

/* This string will end up being '<p>Number: 9</p>' */
$num = 9;
$str = "<p>Number: $num</p>";

/* This one will be '<p>Number: $num</p>' */
$num = 9;
$str = '<p>Number: $num</p>';

/* Get the first character of a string  */
$str = 'This is a test.';
$first = $str{0};

/* Get the last character of a string. */
$str = 'This is still a test.';
$last = $str{strlen($str)-1};
?>

實用函式

字串可以用“.”（點）運算符連接。注意這裡不能用“+”（加）運算符。更多訊息參見字串運算符。

有很多實用函式來改變字串。

普通函式見字串函式庫一節，高級搜索和替換見正則表達式函式（兩種口味：Perl 和 POSIX 擴展）。

還有 URL 字串函式，以及加密／解密字串的函式（mcrypt 和 mhash）。

最後，如果還是找不到你要的函式，參見字元型別函式庫。

字串轉換

當一個字串被當作數字來求值時，根據以下規則來決定結果的型別和值。

如果包括“.”，“e”或▽l”其中任何一個字元的話，字串被當作 float 來求值。否則就被當作整數。

該值由字串最前面的部分決定。如果字串以合法的數字資料開始，就用該數字作為其值，否則其值為 0（零）。合法數字資料由可選的正負號開始，後面跟著一個或多個數字（可選地包括十進制分數），後面跟著可選的指數。指數是一個“e”或者▽l”後面跟著一個或多個數字。

$foo = 1 + "10.5";              // $foo is float (11.5)
$foo = 1 + "-1.3e3";            // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";         // $foo is integer (1)
$foo = 1 + "bob3";              // $foo is integer (1)
$foo = 1 + "10 Small Pigs";     // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;        // $foo is float (11)
$foo = "10.0 pigs " + 1.0;      // $foo is float (11)

此轉換的更多訊息見 Unix 手冊中關於 strtod(3) 的部分。

如果你想測試本節中的任何例子，可以拷貝和粘貼這些例子並且加上下面這一行自己看看會發生什麼：

echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";

上一頁 | 首頁 | 下一頁
浮點型 | 上一層 | 陣列


型別戲法

PHP 在變數定義中不需要（或不支援）明示的型別定義；變數型別是根據使用該變數的上下文所決定的。也就是說，如果你把一個字串值賦給變數 var，var 就成了一個字串。如果你又把一個整型值賦給 var，那它就成了一個整數。

PHP 的自動型別轉換的一個例子是加號“+”。如果任何一個運算數是浮點數，則所有的運算數都被當成浮點數，結果也是浮點數。否則運算數會被解釋為整數，結果也是整數。注意這並沒有改變這些運算數本身的型別；改變的僅是這些運算數如何被求值。

$foo = "0";  // $foo is string (ASCII 48)

$foo += 2;   // $foo is now an integer (2)
$foo = $foo + 1.3;  // $foo is now a float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";     // $foo is integer (15)

如果上面兩個例子看上去古怪的話，參見字串轉換。

如果你要強制將一個變數當作某種型別來求值，參見型別強制轉換一節。如果你要改變一個變數的型別，參見 settype()。

如果你想要測試本節中任何例子的話，可以用 var_dump() 函式。

註: 陣列的自動轉換行為目前沒有定義。

$a = "1";     // $a 是字串
$a[0] = "f";  // 是字串偏移量嗎？結果會是什麼？

由於 PHP 支援通過偏移量進行的字串索引，這和陣列索引的語法一樣。以上的例子就產生了一個問題：$a 應該變成一個第一個元素是“f”的陣列呢，還是“f”成了字串 $a 的第一個字元？

由於此原因，在 PHP 3.0.12 和 PHP 4.0b3-RC4 中這種自動轉換的結果被當成未定義。解決方案仍在討論之中。

（譯者注：）PHP 4 中上面的一個例子出錯，第二個例子的結果將是字串 $a = 'f'。

型別強制轉換

PHP 中的型別強制轉換和 C 中的非常像：在要轉換的變數之前加上用括號括起來的目標型別。

$foo = 10;   // $foo is an integer
$bar = (float) $foo;   // $bar is a float

允許的強制轉換有：

  • (int), (integer) - 轉換成整型

  • (bool), (boolean) - 轉換成布爾型

  • (float), (double), (real) - 轉換成浮點型

  • (string) - 轉換成字串

  • (array) - 轉換成陣列

  • (object) - 轉換成對象

註: 除了用強制轉換將變數轉換成字串之外，還可以將變數用雙引號引起來。

注意在括號內允許有空格和制表符，所以下面兩個例子功能相同：

$foo = (int) $bar;
$foo = ( int ) $bar;

當在某些型別之間強制轉換時確切地會發生什麼可能不是很明顯。更多訊息見如下小節：

  • 轉換為布爾值

  • 轉換為整型

當強制將陣列轉換為字串時，結果將是 Array 這個詞。當強制將對象轉換為字串時，結果將是 Object 這個詞。

當強制將一個標量或字串轉換為陣列時，變數將成為陣列的第一個元素：

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // outputs 'ciao'

當強制將一個標量或字串轉換為對象時，變數會成為對象的屬性，屬性名為“scalar”：

$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;  // outputs 'ciao'

上一頁 | 首頁 | 下一頁
NULL | 上一層 | 變數


PHP 的外部變數

HTML 表單 (GET 和 POST)

When a form is submitted to a PHP script, the information from that form is automatically made available to the script. There are many ways to access this information, for example:

例子 8-1. 一個簡單的 HTML 表單

<form action="foo.php" method="post">
    Name:  <input type="text" name="username"><br>
    Email: <input type="text" name="email"><br>
    <input type="submit" name="submit" value="Submit me!">
</form>

Depending on your particular setup and personal preferences, there are many ways to access data from your HTML forms. Some examples are:

例子 8-2. 從一個簡單的 POST HTML 表單連接資料

<?php
// Available since PHP 4.1.0

   print $_POST['username'];
   print $_REQUEST['username'];

   import_request_variables('p', 'p_');
   print $p_username;

// Available since PHP 3.

   print $HTTP_POST_VARS['username'];

// Available if the PHP directive register_globals = on.  As of
// PHP 4.2.0 the default value of register_globals = off.
// Using/relying on this method is not preferred.

   print $username;
?>

Using a GET form is similar except you'll use the appropriate GET predefined variable instead. GET also applies to the QUERY_STRING (the information after the '?' in an URL). So, for example, http://www.example.com/test.php?id=3 contains GET data which is accessible with $_GET['id']. See also $_REQUEST and import_request_variables().

註: Superglobal arrays, like $_POST and $_GET, became available in PHP 4.1.0

As shown, before PHP 4.2.0 the default value for register_globals was on. And, in PHP 3 it was always on. The PHP community is encouraging all to not rely on this directive as it's preferred to assume it's off and code accordingly.

註: The magic_quotes_gpc configuration directive affects Get, Post and Cookie values. If turned on, value (It's "PHP!") will automagically become (It\'s \"PHP!\"). Escaping is needed for DB insertion. See also addslashes(), stripslashes() and magic_quotes_sybase.

PHP also understands arrays in the context of form variables (see the related faq). You may, for example, group related variables together, or use this feature to retrieve values from a multiple select input. For example, let's post a form to itself and upon submission display the data:

例子 8-3. 更複雜的表單變數

<?php
if ($HTTP_POST_VARS['action'] == 'submitted') {
    print '<pre>';

    print_r($HTTP_POST_VARS);
    print '<a href="'. $HTTP_SERVER_VARS['PHP_SELF'] .'">Please try again</a>';

    print '</pre>';
} else {
?>
<form action="<?php echo $HTTP_SERVER_VARS['PHP_SELF']; ?>" method="post">
    Name:  <input type="text" name="personal[name]"><br>
    Email: <input type="text" name="personal[email]"><br>
    Beer: <br>
    <select multiple name="beer[]">
        <option value="warthog">Warthog</option>
        <option value="guinness">Guinness</option>
        <option value="stuttgarter">Stuttgarter Schwabenbr漉</option>
    </select><br>
    <input type="hidden" name="action" value="submitted">
    <input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?>

In PHP 3, the array form variable usage is limited to single-dimensional arrays. In PHP 4, no such restriction applies.

IMAGE SUBMIT 變數名

When submitting a form, it is possible to use an image instead of the standard submit button with a tag like:

<input type="image" src="image.gif" name="sub">

When the user clicks somewhere on the image, the accompanying form will be transmitted to the server with two additional variables, sub_x and sub_y. These contain the coordinates of the user click within the image. The experienced may note that the actual variable names sent by the browser contains a period rather than an underscore, but PHP converts the period to an underscore automatically.

HTTP Cookies

PHP transparently supports HTTP cookies as defined by Netscape's Spec. Cookies are a mechanism for storing data in the remote browser and thus tracking or identifying return users. You can set cookies using the setcookie() function. Cookies are part of the HTTP header, so the SetCookie function must be called before any output is sent to the browser. This is the same restriction as for the header() function. Cookie data is then available in the appropriate cookie data arrays, such as $_COOKIE, $HTTP_COOKIE_VARS as well as in $_REQUEST. See the setcookie() manual page for more details and examples.

If you wish to assign multiple values to a single cookie variable, you may assign it as an array. For example:

<?php
  setcookie("MyCookie[foo]", "Testing 1", time()+3600);
  setcookie("MyCookie[bar]", "Testing 2", time()+3600);
?>

That will create two seperate cookies although MyCookie will now be a single array in your script. If you want to set just one cookie with multiple values, consider using serialize() or explode() on the value first.

Note that a cookie will replace a previous cookie by the same name in your browser unless the path or domain is different. So, for a shopping cart application you may want to keep a counter and pass this along. i.e.

例子 8-4. 一個 setcookie() 的示例

<?php
$count++;
setcookie("count", $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

變數名中點

Typically, PHP does not alter the names of variables when they are passed into a script. However, it should be noted that the dot (period, full stop) is not a valid character in a PHP variable name. For the reason, look at it:
<?php
$varname.ext;  /* invalid variable name */
?>
Now, what the parser sees is a variable named $varname, followed by the string concatenation operator, followed by the barestring (i.e. unquoted string which doesn't match any known key or reserved words) 'ext'. Obviously, this doesn't have the intended result.

For this reason, it is important to note that PHP will automatically replace any dots in incoming variable names with underscores.

確定變數型別

Because PHP determines the types of variables and converts them (generally) as needed, it is not always obvious what type a given variable is at any one time. PHP includes several functions which find out what type a variable is, such as: gettype(), is_array(), is_float(), is_int(), is_object(), and is_string(). See also the chapter on Types.

上一頁 | 首頁 | 下一頁
可變變數 | 上一層 | 常數


預定義變數

PHP 提供了大量的預定義變數。由於許多變數依賴於執行的伺服器的版本和設置，及其它因素，所以並沒有詳細的說明文檔。一些預定義變數在 PHP 以命令行形式執行時並不生效。有關這些變數的詳細列表，請參閱“保留的預定義變數”一章。

警告

PHP 4.2.0 以及後續版本中， PHP 指令 register_globals 的預設值為 off. 這是 PHP 的一個主要變化。讓 register_globals 的值為 off 將影響到預定義變數集在全域範圍內的有效性。例如，為了得到 DOCUMENT_ROOT 的值，你將必須使用 $_SERVER['DOCUMENT_ROOT'] 代替 $DOCUMENT_ROOT，又如，使用 $_GET['id'] 來代替 $id 從 URL http://www.example.com/test.php?id=3 中獲取 id 值，亦或使用 $_ENV['HOME'] 來代替 $HOME 獲取環境變數 HOME 的值。

更多相關訊息，請閱讀配置項目 register_globals，有關安全性的一章 使用 Register Globals，以及 PHP 4.1.0 和 4.2.0 的發行通告.

請優先使用可用的 PHP 預定義變數，如 超級全域陣列。

從 PHP 4.1.0 開始，PHP 提供了一套附加的預定陣列，這些陣列變數包含了來自 Web 伺服器（如果可用），執行環境，和用戶輸入的資料。這些陣列非常特別，它們在全域範圍內自動生效，例如，在任何範圍內自動生效。為此，它們常因是 "autoglobals" 或者 "superglobals" 而聞名。（PHP 中尚且沒有一種可使用戶自定義超級全域變數的機制）超級全域變數羅列於下文中；但是為了得到它們的內容和關於 PHP 預定義變數的進一步的討論以及它們的本質，請參閱 預定義變數。而且，你也將注意到舊的地預定義陣列（$HTTP_*_VARS）仍舊存在。

如果某些 variables_order 中的變數沒有設定，它們的對應的 PHP 預定義陣列也是空的。

PHP 超全域變數

$GLOBALS

包含一個引用指向每個當前腳本的全域範圍內有效的變數。該陣列的鍵標為全域變數的 名稱。從 PHP 3 開始存在 $GLOBALS 陣列。

$_SERVER

變數由 Web 伺服器設定或者直接與當前腳本的執行環境相關聯。類似於舊陣列 $HTTP_SERVER_VARS 陣列（依然有效，但反對使用）。

$_GET

經由 HTTP GET 方法送出至腳本的變數。類似於舊陣列 $HTTP_GET_VARS 陣列（依然有效，但反對使用）。

$_POST

經由 HTTP POST 方法送出至腳本的變數。類似於舊陣列 $HTTP_POST_VARS 陣列（依然有效，但反對使用）。

$_COOKIE

經由 HTTP Cookies 方法送出至腳本的變數。類似於舊陣列 $HTTP_COOKIE_VARS 陣列（依然有效，但反對使用）。

$_FILES

經由 HTTP POST 文件上傳而送出至腳本的變數。類似於舊陣列 $HTTP_POST_FILES 陣列（依然有效，但反對使用）。詳細訊息請參閱 POST 方法上傳。

$_ENV

執行環境送出至腳本的變數。類似於舊陣列 $HTTP_ENV_VARS 陣列（依然有效，但反對使用）。

$_REQUEST

經由任何用戶輸入機制送出至腳本的變數，因此該陣列並不值得信任。所有包含在該陣列中的變數的存在與否 以及變數的順序均按照 php.ini 中的 variables_order 配置指示來定義。該陣列沒有直接模擬 PHP 4.1.0 的早期版本。參照 import_request_variables()。

註: 當執行於 命令行 模式時，這個陣列將 不會 包含 argv 和 argc 入口；它們已經存在於陣列 $_SERVER 中。

$_SESSION

當前註冊給腳本會話的變數。類似於舊陣列 $HTTP_SESSION_VARS 陣列（依然有效，但反對使用）。詳細訊息，請參照 Session 處理函式 章節。

上一頁 | 首頁 | 下一頁
變數 | 上一層 | 變數範圍


變數範圍

變數的範圍即它定義的上下文背景（譯者:說白了，也就是它的生效範圍）。大部分的 PHP 變數只有一個單獨的範圍。這個單獨的範圍跨度同樣包含了 include 和 require 引入的文件。範例:

<?php
$a = 1;
include "b.inc";
?>

這裡變數 $a 將會在包含文件 b.inc 中生效。但是，在用戶自定義函式中，一個局部函式範圍將被引入。任何用於函式內部的變數按預設情況將被限制在局部函式範圍內。範例：

<?php
$a = 1; /* global scope */

function Test()
{
    echo $a; /* reference to local scope variable */
}

Test();
?>

這個腳本不會有任何輸出因為 echo 語句引用了一個局部版本的變數 $a， 而且在這個範圍內，它並沒有被設值。你可能注意到 PHP 的全域變數和 C 語言有一點點不同，在 C 語言中，全域變數在函式中自動生效，除非被局部變數覆蓋。這可能引起一些問題，有些人可能漫不經心的改變一個全域變數。 PHP 中全域變數在函式中使用時必須申明為全域。例如：

<?php
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
}

Sum();
echo $b;
?>

以上腳本的輸出將是 "3"。在函式中申明了全域變數 $a 和 $b，任何變數的所有引用變數都會指向到全域變數。對於一個函式能夠申明的全域變數的最大個數，PHP 沒有限制。

在全域範圍內連接變數的第二個辦法，是用特殊的 PHP 自定義 $GLOBALS 陣列。前面的例子可以寫成：

<?php
$a = 1;
$b = 2;

function Sum()
{
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}

Sum();
echo $b;
?>

在 $GLOBALS 陣列中，每一個變數為一個元素，鍵名對應變數名，值變數的內容。$GLOBALS 之所以在全域範圍內存在，是因為 $GLOBALS 是一個 superglobal 變數。以下範例顯示了 superglobals 的用處：

<?php
function test_global()
{
    // 大多數的預定義變數並不 "super"，它們需要用 'global' 關鍵字來使它們在函式的本地區域中有效。
    global $HTTP_POST_VARS;

    print $HTTP_POST_VARS['name'];

    // Superglobals 在任何範圍內都有效，它們並不需要 'global' 聲明。Superglobals 是在 PHP 4.1.0 引入的。
    print $_POST['name'];
}
?>

Another important feature of variable scoping is the static variable. A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope. Consider the following example:

<?php
function Test ()
{
    $a = 0;
    echo $a;
    $a++;
}
?>

This function is quite useless since every time it is called it sets $a to 0 and prints "0". The $a++ which increments the variable serves no purpose since as soon as the function exits the $a variable disappears. To make a useful counting function which will not lose track of the current count, the $a variable is declared static:

<?php
function Test()
{
    static $a = 0;
    echo $a;
    $a++;
}
?>

Now, every time the Test() function is called it will print the value of $a and increment it.

Static variables also provide one way to deal with recursive functions. A recursive function is one which calls itself. Care must be taken when writing a recursive function because it is possible to make it recurse indefinitely. You must make sure you have an adequate way of terminating the recursion. The following simple function recursively counts to 10, using the static variable $count to know when to stop:

<?php
function Test()
{
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        Test ();
    }
    $count--;
}
?>

The Zend Engine 1, driving PHP4, implements the static and global modifier for variables in terms of references. For example, a true global variable imported inside a function scope with the global statement actually creates a reference to the global variable. This can lead to unexpected behaviour which the following example addresses:

<?php
function test_global_ref() {
    global $obj;
    $obj = &new stdclass;
}

function test_global_noref() {
    global $obj;
    $obj = new stdclass;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

Executing this example will result in the following output:

NULL
object(stdClass)(0) {
}

A similar behaviour applies to the static statement. References are not stored statically:

<?php
function &get_instance_ref() {
    static $obj;

    echo "Static object: ";
    var_dump($obj);
    if (!isset($obj)) {
        // Assign a reference to the static variable
        $obj = &new stdclass;
    }
    $obj->property++;
    return $obj;
}

function &get_instance_noref() {
    static $obj;

    echo "Static object: ";
    var_dump($obj);
    if (!isset($obj)) {
        // Assign the object to the static variable
        $obj = new stdclass;
    }
    $obj->property++;
    return $obj;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

Executing this example will result in the following output:

Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)(1) {
  ["property"]=>
  int(1)
}

This example demonstrates that when assigning a reference to a static variable, it's not remembered when you call the &get_instance_ref() function a second time.

上一頁 | 首頁 | 下一頁
預定義變數 | 上一層 | 可變變數


可變變數

Sometimes it is convenient to be able to have variable variable names. That is, a variable name which can be set and used dynamically. A normal variable is set with a statement such as:

<?php
$a = "hello";
?>

A variable variable takes the value of a variable and treats that as the name of a variable. In the above example, hello, can be used as the name of a variable by using two dollar signs. i.e.

<?php
$$a = "world";
?>

At this point two variables have been defined and stored in the PHP symbol tree: $a with contents "hello" and $hello with contents "world". Therefore, this statement:

<?php
echo "$a ${$a}";
?>

produces the exact same output as:

<?php
echo "$a $hello";
?>

i.e. they both produce: hello world.

In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.

Please note that variable variables cannot be used with PHP's Superglobal arrays. This means you cannot do things like ${$_GET}. If you are looking for a way to handle availability of superglobals and the old HTTP_*_VARS, you might want to try referencing them.

上一頁 | 首頁 | 下一頁
變數範圍 | 上一層 | PHP 的外部變數


從 PHP/FI 2 移植到 PHP 3

PHP 手冊
上一頁 下一頁

附錄 C. 從 PHP/FI 2 移植到 PHP 3

目錄
關於 PHP 3.0 的不相容性
開始/結束標記
if..endif 語法
while 語法
表達式型別
錯誤消息已經改變
布爾值的快速計算
函式 TRUE/FALSE 傳回值
其它不相容

關於 PHP 3.0 的不相容性

PHP 3.0 從底層重寫了代碼。它有著比 2.0 更健壯和統一的解析器。3.0 也更快、占用更少的內存。但是，這些改進難以避免相容性的削弱，包括語法和功能上相容性的削弱。

另外，PHP 的開發者嘗試在版本 3.0 中使得 PHP 的語法和語義更加簡潔，這也導致了一些不相容。最後，我們相信這些改變是值得的。

本章將會指導你認識從 PHP/FI 2.0 到 PHP 3.0 升級所帶來的的障礙並幫助你解決它。這裡沒有提到 3.0 的新功能，除非必要。

一個轉換程序可以幫助您自動轉換舊有的 PHP/FI 2.0 腳本。這個程序可以在 PHP 3.0 發布包中的 convertor 子目錄中找到。可是，該程序只能轉換語法的改變，因此，您仍然需要仔細閱讀下面的部分。

上一頁 | 首頁 | 下一頁
處理全域變數 | 上一層 | 開始/結束標記


從 PHP 3 移植到 PHP 4

PHP 手冊
上一頁 下一頁

附錄 B. 從 PHP 3 移植到 PHP 4

目錄
PHP 4 所作的改變
同時執行 PHP 3 和 PHP 4
移植配置文件
解析器行為
錯誤報告
初始化
empty("0")
缺少的函式
PHP 3 擴展
字串中的變數替換
Cookies
處理全域變數

PHP 4 所作的改變

PHP 4 和其整合的 Zend engine 極大的增強了 PHP 的性能和相容性，對細節代碼也十分注意。所以從 PHP 3 到 PHP 4 的移植要比從 PHP/FI 2 到 PHP 3 的移植容易得多。很多 PHP 3 的代碼無需修改就可以在 PHP 4 中執行，但是您還是需要在轉換程序執行環境時注意一些細節。下面就是一些提示。

上一頁 | 首頁 | 下一頁
PHP 相關文章 | 上一層 | 同時執行 PHP 3 和 PHP 4


移植配置文件

全域配置文件 php3.ini 已經改名為 php.ini。

Apache 配置文件也有一些細微的更動。PHP 模塊所屬的 MIME 型別已經改變。

application/x-httpd-php3        -->    application/x-httpd-php
application/x-httpd-php3-source -->    application/x-httpd-php-source

您可以使得您的配置文件工作在兩個 PHP 版本上（取決於哪個版本編譯到伺服器上），使用下面的語法：

AddType  application/x-httpd-php3        .php3
AddType  application/x-httpd-php3-source .php3s

AddType  application/x-httpd-php         .php
AddType  application/x-httpd-php-source  .phps

除此之外，關於 PHP 的 Apache 指令已經改變。

從 PHP 4.0 開始，只有四個 Apache 指令與 PHP 相關：

php_value [PHP directive name] [value]
php_flag [PHP directive name] [On|Off]
php_admin_value [PHP directive name] [value]
php_admin_flag [PHP directive name] [On|Off]

Admin values 和非 Admin values 有兩處不同：

  • Admin values（或 flags）指僅可以出現在伺服器範圍內的 apache 配置文件（例如：httpd.conf）。

  • Standard values（或 flags）無法控制某種 PHP 指令，例如──安全模式（如果您在 .htaccess 文件中覆蓋了安全模式的設定，安全模式就失去了它的意義）。相比較，Admin values 可以更改任何 PHP 指令的值。

為了使翻譯進程更加容易，PHP 4 捆綁了自動轉換您的 Apache 配置文件和 .htaccess 文件使 PHP 3 和 PHP 4 都可以工作。但這些腳本並不轉換 MIME 型別！您需要自己轉換它。

要轉換您的 Apache 配置文件，執行 apconf-conv.sh 腳本（在 scripts/apache/ 目錄）例如：

~/php4/scripts/apache:#  ./apconf-conv.sh /usr/local/apache/conf/httpd.conf

您原來的配置文件會更名為 httpd.conf.orig。

要轉換您的 .htaccess 文件，執行 aphtaccess-conv.sh 腳本（也在 scripts/apache/ directory 目錄下）：

~/php4/scripts/apache:#  find / -name .htaccess -exec ./aphtaccess-conv.sh {} \;

同樣的，您原有的 .htaccess 文件會以 .orig 後綴保存。

執行轉換腳本需要安裝 awk。

上一頁 | 首頁 | 下一頁
同時執行 PHP 3 和 PHP 4 | 上一層 | 解析器行為


Cookies

PHP 3 在設置 cookies 時有一個不好的習慣，它總是將 setcookie() 所設置的 cookies 以相反的順序保存。PHP 4 改變了這個習慣，創建 cookies 時以您的代碼中設置 cookies 的順序保存。

這可能使得原有代碼不能正常工作。但是 PHP 3 的行為的確很古怪，應該加以改變以防止將來產生更多的問題。

上一頁 | 首頁 | 下一頁
字串中的變數替換 | 上一層 | 處理全域變數


empty("0")

可能最具爭議的改變是對 empty() 函式行為的改變。一個僅包含字元“0”（是零，不是英文字母“O”）的字串現在被認為是空字串，而 PHP 3 中則相反。

這個改變對 web 程序很有意義，所有的 input 表單傳回的都是 string，甚至填寫的是數字。PHP 能夠自動進行型別轉換。但另一方面，這可能不是您代碼的原意，可能導致您代碼莫名其妙的錯誤。

上一頁 | 首頁 | 下一頁
初始化 | 上一層 | 缺少的函式


錯誤報告

配置的改變

PHP 3 錯誤報告的級別是簡單的將不同的錯誤報告級別的數字相加而成。通常 15 代表報告所有錯誤，而 7 代表報告除了 notice 訊息以外的所有錯誤。

PHP 4 有一整套錯誤和警告的級別，並且配置解析器允許使用符號常數來定義顯示的錯誤級別。

錯誤報告級別應該被明確的配置。如果您不想顯示某種錯誤訊息，您需要將他們從 E_ALL 符號常數中排除。聽起來很複雜嗎？讓我們看看吧。如果您想顯示除了以 E_NOTICE 表示的 notice 訊息以外的所有錯誤訊息，您就應該在 php.ini 中設置：error_reporting = E_ALL & ~ ( E_NOTICE ) 。如果您還不想顯示 warning 訊息，只需要使用“|”運算符：error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )。

警告

當您把代碼從 PHP 3 升級到 PHP 4 時，您需要檢查這些設置，並呼叫 error_reporting() 函式，否則您可能會屏蔽一些新的錯誤報告型別，特別是 E_COMPILE_ERROR。這可能將導致沒有任何反饋訊息的空白頁，使得您不知發生了什麼，也不知道問題所在。

警告

使用舊有的從 7 到 15 的數字來設置錯誤報告的級別不是個好主意，因為這屏蔽了 PHP 4 中新的錯誤類產生的錯誤訊息。這可能導致非常奇怪的現象：腳本不能執行卻沒有任何錯誤提示。

這在過去已經導致了許多重複的 bug 報告。人們報告新的腳本引擎不能跟蹤腳本文件中經常發生的缺少“}”的錯誤。事實上，這是由不正確的配置引起的。

所以，檢查您錯誤報告的設置是在腳本無法執行而沒有出現錯誤提示時您應做的第一件事。Zend engine 到現在已經很成熟了，一般不會出現如此奇怪的現象。

額外的警告訊息

許多已存在的 PHP 3 代碼使用的語言樣式在現在應當被看做是非常糟糕的。因此，如果用 PHP 4 編譯該腳本，會產生很多額外的警告訊息。如果您不想看到這些訊息，只要簡單的把 E_NOTICE 選項關閉。但更好的做法是修正代碼。

最常見的出現 notice 提示訊息的情況是在陣列索引中使用沒有加引號的字串。PHP 3 和 PHP 4 在沒有同名的常數定義時都會把它解釋為字串，但是無論何時只要有常數是以該字串命名，您的腳本就可能會出現錯誤。如果有黑客利用這一點，設法重定義該常數，這個腳本就存在安全漏洞。所以只要出現未加引號的索引，PHP 4 就會警告您對它加以修正。舉例來說，有漏洞的代碼 $_SERVER[REQUEST_METHOD]，只要將它改為 $_SERVER['REQUEST_METHOD']，錯誤提示就會消失。

PHP 4 還會對未初始化的變數或陣列元素加以提示。

上一頁 | 首頁 | 下一頁
解析器行為 | 上一層 | 初始化


PHP 3 擴展

為 PHP 3 寫的擴展在 PHP 4 中不再工作，二進制或原始碼都不行。但如果您有擴展的原始代碼，將它轉換為 PHP 4 的擴展很容易。這已經不在本文所討論的範圍中了。

上一頁 | 首頁 | 下一頁
缺少的函式 | 上一層 | 字串中的變數替換


初始化

PHP 4 中靜態變數和類成員僅接受標量值，而 PHP 3 中接受任何有效的表達式。這是由於解析和執行的分離，導致只有在解析器看到初始化代碼後才能執行。

您應該使用建構器來初始化類。對靜態變數，只有靜態的值才有意義。

上一頁 | 首頁 | 下一頁
錯誤報告 | 上一層 | empty("0")


缺少的函式

雖然 PHP 4 帶來了許多新功能、函式和擴展，您還是會發現一些本在 PHP 3 中存在的函式不見了。少量的內核函式被取消，因為它們不符合 Zend engine 新的解析──執行的模式。另外一些函式甚至是擴展完全的被荒廢，是因為新的函式可以更好的完成舊函式的功能。一些函式只是空函式，而另一些因為版權衝突而取消了。

由於概念的改變而取消的函式

PHP 4 現在將解析從執行中分離，因此不可能在執行時間改變解析器（現在已經嵌入 Zend engine）的行為，此時已經解析完畢了。所以函式 short_tags() 不再存在。您仍然可以對 php.ini 文件設置適當的值以改變編譯器的行為。

另一個 PHP 3 的功能在 PHP 4 中不複存在：內部捆綁的 debug 接口。現在有第三方 Zend engine 的 add-ons 有著類似的功能。

不推薦使用的函式和擴展

Adabas and Solid 資料庫擴展不再推薦使用。最好使用統一的 ODBC 擴展代替。

unset() 的改變

unset()，雖然仍然可以使用，但是它成為了語言結構的一部分，而不是一個函式。

這對 unset() 的行為不會產生什麼影響，但是使用 function_exists() 函式測試“unset”時會傳回 FALSE。它已經是 PHP 語言的一部分，雖然它很像函式。這和 echo() 是一樣的。

另一個實際的改變是，不能間接呼叫 unset()。因此 $func="unset"; $func($somevar) 不再工作。

上一頁 | 首頁 | 下一頁
empty("0") | 上一層 | PHP 3 擴展


解析器行為

解析和執行現在變為兩個完全獨立的步驟。只有當完全成功的解析後，程序才會執行。

這種改變所帶來的一個新的要求是一個腳本文件所包含的另一個文件必須有著完整的語法結構。您不能將一個完整的控制結構分散在不同的文件中。這意味著您不能在一個文件中開始一個 for 或 while 循環、一個 if 或 switch 塊，而在另一個文件中結束它們，或在另一個文件中使用 else、endif、case 或 break。

但是在循環或其它控制結構中包含額外的腳本文件是允許的。只要控制的關鍵詞和相應的 {...} 在同一個單元（文件或使用函式 eval() 結合的字串）中就可以了。

不過，在循環或其它控制結構中包含額外的腳本文件並不是一個好的遍程習慣。

另外，一種在 PHP 3 中不常見的代碼──從一個 require 的文件中傳回值──在 PHP 4 中也不能使用。而從一個 include 文件中傳回值還是允許的。

上一頁 | 首頁 | 下一頁
移植配置文件 | 上一層 | 錯誤報告


同時執行 PHP 3 和 PHP 4

最新的操作系統提供了執行多版本和範圍程序的能力。這個功能使得在一個 Apache 伺服器上同時執行 PHP 3 和 PHP 4 成為可能。

已知該功能可以執行在如下平台：

  • 包含新版本 binutils 的 Linux（binutils 2.9.1.0.25 測試通過）

  • Solaris 2.5 或更高版本

  • FreeBSD（3.2，4.0 測試通過）

要啟用該功能，需要配置(configure) PHP3 和 PHP4 的 APXS（使用 --with-apxs 參數）以及所需的鏈接擴展（使用 --enable-versioning 參數）。其餘的和標準安裝方法一樣。例如：

$ ./configure \
  --with-apxs=/apache/bin/apxs \
  --enable-versioning \
  --with-mysql \
  --enable-track-vars

上一頁 | 首頁 | 下一頁
從 PHP 3 移植到 PHP 4 | 上一層 | 移植配置文件


字串中的變數替換

PHP 4 增加了一個新的機制以替換字串中的變數。您現在可以連接字串中的對象成員變數和多維陣列元素。

如果您想這麼做，您需要使用大括號將一個美元符號和變數名括起來，就像這樣：{$...}。

要在字串中嵌入對象成員變數，只要簡單的寫 "text {$obj->member} text"。而在 PHP 3 中，您得使用 "text ".$obj->member." text"。

這個改進可以使代碼更易讀，但這可能會破壞用 PHP 3 寫的代碼。但是您很容易修正它：在代碼中查找字串中的 {$，使用搜索替換工具將它替換為 \{$。

上一頁 | 首頁 | 下一頁
PHP 3 擴展 | 上一層 | Cookies


處理全域變數

在 PHP 3 和 PHP 4 早些版本中處理全域變數的重心放在了易用上，而現在，焦點放到了如何更安全的處理它們上。在 PHP 3 中下面的代碼工作正常，但是 PHP 4 中就要使用 unset($GLOBALS["id"]);。這僅僅是全域變數處理的一個問題。您應當總是使用 $GLOBALS，在更新版本的 PHP 4 中您應該強迫自己在大部分情況中使用它。更多訊息請參考 global 參考章節.

例子 B-1. 全域變數的移植

<?php
$id = 1;
function test()
{
    global $id;
    unset($id);
}
test();
echo($id); // 在 PHP 4 中這裡會顯示出 1
?>
上一頁 | 首頁 | 下一頁
Cookies | 上一層 | 從 PHP/FI 2 移植到 PHP 3


其它不相容

  • PHP 3.0 的 Apache 模塊不再支援 Apache 1.2 以前的版本。PHP 3.0 需要 Apache 1.2 或更高版本。

  • echo() 不再支援格式化字串。如果想格式化字串，使用 printf() 函式。

  • 在 PHP/FI 2.0 中，$foo[0] 和 $foo有著同樣的效果。而 3.0 則不是這樣的。

  • 不再支援使用 $array[] 讀取陣列。

    也就是說，您不可以通過作 $data = $array[] 的循環來遍歷一個陣列。使用 current() 和 next() 函式來代替。

    同樣的，$array1[] = $array2 並沒有把 $array2 的值賦給 $array1，而是把 $array2 這個陣列賦給 $array1 的最後一項。這種情況也發生在多維陣列上。

  • "+" 不再重載為字串串連的運算符，它的作用是把字串轉換為數字並將它們相加。如果想串連字串，使用 "." 代替。

例子 C-11. 從 2.0 移植：串連字串

echo "1" + "1";

在 PHP 2.0 中該程序會顯示 11，而在 PHP 3.0 中會顯示 2。如果要在 PHP 3.0 中達到同樣的效果，應該使用：
echo "1"."1";
$a = 1;
$b = 1;
echo $a + $b;

上面的程序在 PHP 2.0 和 3.0 中都會顯示 2。
$a = 1;
$b = 1;
echo $a.$b;
面的程序在 PHP 3.0 中會顯示 11。

上一頁 | 首頁 | 下一頁
函式 TRUE/FALSE 傳回值 | 上一層 | 排除 PHP 程序的錯誤


while 語法

如 if..endif 一樣，while..endwhile 的語法也進行了改變：

例子 C-7. 移植：舊有 while..endwhile 語法

while ($more_to_come);
    ...
endwhile;

例子 C-8. 移植：新的 new while..endwhile 語法

while ($more_to_come):
    ...
endwhile;

警告

如果您在 PHP 3.0 中使用舊的 while..endwhile 語法，您的程序會進入死循環.

上一頁 | 首頁 | 下一頁
if..endif 語法 | 上一層 | 表達式型別


布爾值的快速計算

PHP 3.0 中的布爾值採取了快速計算的方法。這就意味著如同 (1 || test_me()) 的表達式將不會執行函式 test_me()。因為這個表達式的值始終為 1。

這只是一個很小的相容性問題，但是會造成一些意想不到的結果。

上一頁 | 首頁 | 下一頁
錯誤消息已經改變 | 上一層 | 函式 TRUE/FALSE 傳回值


錯誤消息已經改變

PHP 3.0 的錯誤消息通常比 2.0 的更加精確，但是您不會像 2.0 那樣得到錯誤代碼的片斷。您會獲得一個文件名和錯誤所在的行號。

上一頁 | 首頁 | 下一頁
表達式型別 | 上一層 | 布爾值的快速計算


表達式型別

PHP/FI 2.0 根據表達式左邊判斷表達式的型別，而 PHP 3.0 則根據表達式兩邊進行判斷。這便可能導致 2.0 下執行正常的腳本在 3.0 下導致異常。

考慮以下例子：

$a[0]=5;
$a[1]=7;

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}

在 PHP/FI 2.0 中，這段程序將顯示所有 $a 的索引，而在 PHP 3.0 中，這個程序什麼都不會現實。原因是，在 PHP 2.0 中，因為左邊參數的型別是 string，於是，一個 string 的關係便建立起來。當然 "" 並不等於 "0"，循環從頭到尾。而在 PHP 3.0 中，當一個 string 和一個 integer 比較時，將 string 轉換為 integer 並比較。結果是比較值為 0 的 atoi("")，和同樣是值為 0 的 variablelist，也就是 0==0。所以循環根本沒有執行。

很容易修正它。把 while 聲明替換為：

while ((string)$key != "") {

上一頁 | 首頁 | 下一頁
while 語法 | 上一層 | 錯誤消息已經改變


if..endif 語法

使用 if(); elseif(); else; endif; 這一系列複雜的語句無助於 PHP 3.0 解析器的效率。因此，語法改變為：

例子 C-5. 移植：舊有 if..endif 語法

if ($foo);
    echo "yep\n";
elseif ($bar);
    echo "almost\n";
else;
    echo "nope\n";
endif;

例子 C-6. 移植：新的 if..endif 語法

if ($foo):
    echo "yep\n";
elseif ($bar):
    echo "almost\n";
else:
    echo "nope\n";
endif;
注意，在所有的聲明中分號均改為冒號，除了末尾的 endif 以外。

上一頁 | 首頁 | 下一頁
開始/結束標記 | 上一層 | while 語法


開始/結束標記

首先您應該注意 PHP 的開始/結束標記已經改變。老的 <? > 已經被三種新的形式所替換：

例子 C-1. 移植：舊有的開始/結束標記

<? echo "這是 PHP/FI 2.0 的代碼。\n"; ?>
PHP/FI 2.0 支援這種變化：

例子 C-2. 移植：第一種開始/結束標記

<? echo "這是 PHP 3.0 的代碼！\n"; ?>
請注意，結束標記現在由一個問號和一個大於號組成而不僅是一個大於號。但是，您如果計劃在您的伺服器上使用 XML，您會發現錯誤。這是因為 PHP 可能會把 XML 文檔中的標記當作 PHP 代碼執行。因此，建議使用以下方法：

例子 C-3. 移植：第二種開始/結束標記

<?php echo "這是 PHP 3.0 的代碼！\n"; ?>
一些編輯器並不能識別並處理指示標記，Microsoft FrontPage 就是其中之一。為了使之正常工作，您可以使用下面的方法：

例子 C-4. 移植：第三種開始/結束標記

<script language="php">

  echo "這是 PHP 3.0 的代碼！\n";

</script>

上一頁 | 首頁 | 下一頁
從 PHP/FI 2 移植到 PHP 3 | 上一層 | if..endif 語法


函式 TRUE/FALSE 傳回值

大量的內部函式被重寫，使之在成功執行時傳回 TRUE，而在失敗時傳回 FALSE。這就如同 PHP/FI 2.0 分別傳回 0 和 -1 一樣。這種改變使得更多的邏輯代碼得以執行，比如 $fp = fopen("/your/file") or fail("darn!");。因為 PHP/FI 2.0 對函式執行失敗的傳回值沒有明確的規定，所以在使用 2.0 到 3.0 轉換器時必須手工檢查函式傳回值帶來的影響。

例子 C-9. 從 2.0 移植：傳回值，舊有代碼

$fp = fopen($file, "r");
if ($fp == -1);
    echo("無法讀取文件：$file。<br>\n");
endif;

例子 C-10. 從 2.0 移植：傳回值，新的代碼

$fp = @fopen($file, "r") or print("無法讀取文件：$file。<br>\n");

上一頁 | 首頁 | 下一頁
布爾值的快速計算 | 上一層 | 其它不相容


補充說明

PHP 手冊
上一頁

附錄 L. 補充說明

上一頁 | 首頁
手冊譯文 | 上一層


擴展 PHP

PHP 手冊
上一頁 下一頁

附錄 E. 擴展 PHP

目錄
為 PHP 新增函式
Calling User Functions
Reporting Errors

為 PHP 新增函式

函式原型

所有的函式有著如下形式：
void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {

}
即使您的函式沒有任何參數，這也是它被呼叫的方式。

函式參數

參數總是屬於 pval 型別。該型別包含了各個參數的實際型別。因此，如果您的函式有兩個參數，您應該在您的函式頂部做如下工作：

例子 E-1. 取得函式參數

pval *arg1, *arg2;
if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&arg1,&arg2)==FAILURE) {
   WRONG_PARAM_COUNT;
}
注意：參數既可以被值(value)傳遞又可以被引用(reference)傳遞。兩種情況您都需要將 &(pval *) 傳遞給 getParameters 函式。如果您想檢查第 n 個參數是否通過引用傳遞給您，您可以使用 ParameterPassedByReference(ht,n) 函式。它的傳回值為 0 或者 1。

當您改變了任何已傳遞的參數，無論它們是以值或者引用的方式傳遞，您都可以對它使用 pval_destructor 函式來銷毀它。或者如果它是一個您想增加的陣列，您可以使用類似於 internal_functions.h 中定義函式的方法來將傳回值 return_value 作為陣列來操作。

Also if you change a parameter to IS_STRING make sure you first assign the new estrdup()'ed string and the string length, and only later change the type to IS_STRING. If you change the string of a parameter which already IS_STRING or IS_ARRAY you should run pval_destructor on it first.

Variable Function Arguments

A function can take a variable number of arguments. If your function can take either 2 or 3 arguments, use the following:

例子 E-2. Variable function arguments

pval *arg1, *arg2, *arg3;
int arg_count = ARG_COUNT(ht);

if (arg_count < 2 || arg_count > 3 ||
    getParameters(ht,arg_count,&arg1,&arg2,&arg3)==FAILURE) {
    WRONG_PARAM_COUNT;
}

Using the Function Arguments

The type of each argument is stored in the pval type field. This type can be any of the following:

表格 E-1. PHP Internal Types

IS_STRING | String
IS_DOUBLE | Double-precision floating point
IS_LONG | Long integer
IS_ARRAY | Array
IS_EMPTY | None
IS_USER_FUNCTION | ??
IS_INTERNAL_FUNCTION | ?? (if some of these cannot be passed to a function - delete)
IS_CLASS | ??
IS_OBJECT | ??

If you get an argument of one type and would like to use it as another, or if you just want to force the argument to be of a certain type, you can use one of the following conversion functions:
convert_to_long(arg1);
convert_to_double(arg1);
convert_to_string(arg1);
convert_to_boolean_long(arg1); /* If the string is "" or "0" it becomes 0, 1 otherwise */
convert_string_to_number(arg1);  /* Converts string to either LONG or DOUBLE depending on string */

These function all do in-place conversion. They do not return anything.

The actual argument is stored in a union; the members are:

  • IS_STRING: arg1->value.str.val

  • IS_LONG: arg1->value.lval

  • IS_DOUBLE: arg1->value.dval

Memory Management in Functions

Any memory needed by a function should be allocated with either emalloc() or estrdup(). These are memory handling abstraction functions that look and smell like the normal malloc() and strdup() functions. Memory should be freed with efree().

There are two kinds of memory in this program: memory which is returned to the parser in a variable, and memory which you need for temporary storage in your internal function. When you assign a string to a variable which is returned to the parser you need to make sure you first allocate the memory with either emalloc() or estrdup(). This memory should NEVER be freed by you, unless you later in the same function overwrite your original assignment (this kind of programming practice is not good though).

For any temporary/permanent memory you need in your functions/library you should use the three emalloc(), estrdup(), and efree() functions. They behave EXACTLY like their counterpart functions. Anything you emalloc() or estrdup() you have to efree() at some point or another, unless it's supposed to stick around until the end of the program; otherwise, there will be a memory leak. The meaning of "the functions behave exactly like their counterparts" is: if you efree() something which was not emalloc()'ed nor estrdup()'ed you might get a segmentation fault. So please take care and free all of your wasted memory.

If you compile with "-DDEBUG", PHP will print out a list of all memory that was allocated using emalloc() and estrdup() but never freed with efree() when it is done running the specified script.

Setting Variables in the Symbol Table

A number of macros are available which make it easier to set a variable in the symbol table:

  • SET_VAR_STRING(name,value)

  • SET_VAR_DOUBLE(name,value)

  • SET_VAR_LONG(name,value)

警告

Be careful with SET_VAR_STRING. The value part must be malloc'ed manually because the memory management code will try to free this pointer later. Do not pass statically allocated memory into a SET_VAR_STRING.

Symbol tables in PHP are implemented as hash tables. At any given time, &symbol_table is a pointer to the 'main' symbol table, and active_symbol_table points to the currently active symbol table (these may be identical like in startup, or different, if you're inside a function).

The following examples use 'active_symbol_table'. You should replace it with &symbol_table if you specifically want to work with the 'main' symbol table. Also, the same functions may be applied to arrays, as explained below.

例子 E-3. Checking whether $foo exists in a symbol table

if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { exists... }
else { doesn't exist }

例子 E-4. Finding a variable's size in a symbol table

hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue);
check(pvalue.type);
Arrays in PHP are implemented using the same hashtables as symbol tables. This means the two above functions can also be used to check variables inside arrays.

If you want to define a new array in a symbol table, you should do the following.

First, you may want to check whether it exists and abort appropriately, using hash_exists() or hash_find().

Next, initialize the array:

例子 E-5. Initializing a new array

pval arr;

if (array_init(&arr) == FAILURE) { failed... };
hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL);
This code declares a new array, named $foo, in the active symbol table. This array is empty.

Here's how to add new entries to it:

例子 E-6. Adding entries to a new array

pval entry;

entry.type = IS_LONG;
entry.value.lval = 5;

/* defines $foo["bar"] = 5 */
hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL);

/* defines $foo[7] = 5 */
hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL);

/* defines the next free place in $foo[],
 * $foo[8], to be 5 (works like php2)
 */
hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL);
If you'd like to modify a value that you inserted to a hash, you must first retrieve it from the hash. To prevent that overhead, you can supply a pval ** to the hash add function, and it'll be updated with the pval * address of the inserted element inside the hash. If that value is NULL (like in all of the above examples) - that parameter is ignored.

hash_next_index_insert() uses more or less the same logic as "$foo[] = bar;" in PHP 2.0.

If you are building an array to return from a function, you can initialize the array just like above by doing:

if (array_init(return_value) == FAILURE) { failed...; }

...and then adding values with the helper functions:

add_next_index_long(return_value,long_value);
add_next_index_double(return_value,double_value);
add_next_index_string(return_value,estrdup(string_value));

Of course, if the adding isn't done right after the array initialization, you'd probably have to look for the array first:
pval *arr;

if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { can't find... }
else { use arr->value.ht... }

Note that hash_find receives a pointer to a pval pointer, and not a pval pointer.

Just about any hash function returns SUCCESS or FAILURE (except for hash_exists(), which returns a boolean truth value).

Returning simple values

A number of macros are available to make returning values from a function easier.

The RETURN_* macros all set the return value and return from the function:

  • RETURN

  • RETURN_FALSE

  • RETURN_TRUE

  • RETURN_LONG(l)

  • RETURN_STRING(s,dup) If dup is TRUE, duplicates the string

  • RETURN_STRINGL(s,l,dup) Return string (s) specifying length (l).

  • RETURN_DOUBLE(d)

The RETVAL_* macros set the return value, but do not return.

  • RETVAL_FALSE

  • RETVAL_TRUE

  • RETVAL_LONG(l)

  • RETVAL_STRING(s,dup) If dup is TRUE, duplicates the string

  • RETVAL_STRINGL(s,l,dup) Return string (s) specifying length (l).

  • RETVAL_DOUBLE(d)

The string macros above will all estrdup() the passed 's' argument, so you can safely free the argument after calling the macro, or alternatively use statically allocated memory.

If your function returns boolean success/error responses, always use RETURN_TRUE and RETURN_FALSE respectively.

Returning complex values

Your function can also return a complex data type such as an object or an array.

Returning an object:

  1. Call object_init(return_value).

  2. Fill it up with values. The functions available for this purpose are listed below.

  3. Possibly, register functions for this object. In order to obtain values from the object, the function would have to fetch "this" from the active_symbol_table. Its type should be IS_OBJECT, and it's basically a regular hash table (i.e., you can use regular hash functions on .value.ht). The actual registration of the function can be done using:
    add_method( return_value, function_name, function_ptr );

The functions used to populate an object are:

  • add_property_long( return_value, property_name, l ) - Add a property named 'property_name', of type long, equal to 'l'

  • add_property_double( return_value, property_name, d ) - Same, only adds a double

  • add_property_string( return_value, property_name, str ) - Same, only adds a string

  • add_property_stringl( return_value, property_name, str, l ) - Same, only adds a string of length 'l'

Returning an array:

  1. Call array_init(return_value).

  2. Fill it up with values. The functions available for this purpose are listed below.

The functions used to populate an array are:

  • add_assoc_long(return_value,key,l) - add associative entry with key 'key' and long value 'l'

  • add_assoc_double(return_value,key,d)

  • add_assoc_string(return_value,key,str,duplicate)

  • add_assoc_stringl(return_value,key,str,length,duplicate) specify the string length

  • add_index_long(return_value,index,l) - add entry in index 'index' with long value 'l'

  • add_index_double(return_value,index,d)

  • add_index_string(return_value,index,str)

  • add_index_stringl(return_value,index,str,length) - specify the string length

  • add_next_index_long(return_value,l) - add an array entry in the next free offset with long value 'l'

  • add_next_index_double(return_value,d)

  • add_next_index_string(return_value,str)

  • add_next_index_stringl(return_value,str,length) - specify the string length

Using the resource list

PHP has a standard way of dealing with various types of resources. This replaces all of the local linked lists in PHP 2.0.

Available functions:

  • php3_list_insert(ptr, type) - returns the 'id' of the newly inserted resource

  • php3_list_delete(id) - delete the resource with the specified id

  • php3_list_find(id,*type) - returns the pointer of the resource with the specified id, updates 'type' to the resource's type

Typically, these functions are used for SQL drivers but they can be used for anything else; for instance, maintaining file descriptors.

Typical list code would look like this:

例子 E-7. Adding a new resource

RESOURCE *resource;

/* ...allocate memory for resource and acquire resource... */
/* add a new resource to the list */
return_value->value.lval = php3_list_insert((void *) resource, LE_RESOURCE_TYPE);
return_value->type = IS_LONG;

例子 E-8. Using an existing resource

pval *resource_id;
RESOURCE *resource;
int type;

convert_to_long(resource_id);
resource = php3_list_find(resource_id->value.lval, &type);
if (type != LE_RESOURCE_TYPE) {
    php3_error(E_WARNING,"resource index %d has the wrong type",resource_id->value.lval);
    RETURN_FALSE;
}
/* ...use resource... */

例子 E-9. Deleting an existing resource

pval *resource_id;
RESOURCE *resource;
int type;

convert_to_long(resource_id);
php3_list_delete(resource_id->value.lval);
The resource types should be registered in php3_list.h, in enum list_entry_type. In addition, one should add shutdown code for any new resource type defined, in list.c's list_entry_destructor() (even if you don't have anything to do on shutdown, you must add an empty case).

Using the persistent resource table

PHP has a standard way of storing persistent resources (i.e., resources that are kept in between hits). The first module to use this feature was the MySQL module, and mSQL followed it, so one can get the general impression of how a persistent resource should be used by reading mysql.c. The functions you should look at are:

php3_mysql_do_connect
php3_mysql_connect()
php3_mysql_pconnect()

The general idea of persistence modules is this:

  1. Code all of your module to work with the regular resource list mentioned in section (9).

  2. Code extra connect functions that check if the resource already exists in the persistent resource list. If it does, register it as in the regular resource list as a pointer to the persistent resource list (because of 1., the rest of the code should work immediately). If it doesn't, then create it, add it to the persistent resource list AND add a pointer to it from the regular resource list, so all of the code would work since it's in the regular resource list, but on the next connect, the resource would be found in the persistent resource list and be used without having to recreate it. You should register these resources with a different type (e.g. LE_MYSQL_LINK for non-persistent link and LE_MYSQL_PLINK for a persistent link).

If you read mysql.c, you'll notice that except for the more complex connect function, nothing in the rest of the module has to be changed.

The very same interface exists for the regular resource list and the persistent resource list, only 'list' is replaced with 'plist':

  • php3_plist_insert(ptr, type) - returns the 'id' of the newly inserted resource

  • php3_plist_delete(id) - delete the resource with the specified id

  • php3_plist_find(id,*type) - returns the pointer of the resource with the specified id, updates 'type' to the resource's type

However, it's more than likely that these functions would prove to be useless for you when trying to implement a persistent module. Typically, one would want to use the fact that the persistent resource list is really a hash table. For instance, in the MySQL/mSQL modules, when there's a pconnect() call (persistent connect), the function builds a string out of the host/user/passwd that were passed to the function, and hashes the SQL link with this string as a key. The next time someone calls a pconnect() with the same host/user/passwd, the same key would be generated, and the function would find the SQL link in the persistent list.

Until further documented, you should look at mysql.c or msql.c to see how one should use the plist's hash table abilities.

One important thing to note: resources going into the persistent resource list must *NOT* be allocated with PHP's memory manager, i.e., they should NOT be created with emalloc(), estrdup(), etc. Rather, one should use the regular malloc(), strdup(), etc. The reason for this is simple - at the end of the request (end of the hit), every memory chunk that was allocated using PHP's memory manager is deleted. Since the persistent list isn't supposed to be erased at the end of a request, one mustn't use PHP's memory manager for allocating resources that go to it.

When you register a resource that's going to be in the persistent list, you should add destructors to it both in the non-persistent list and in the persistent list. The destructor in the non-persistent list destructor shouldn't do anything. The one in the persistent list destructor should properly free any resources obtained by that type (e.g. memory, SQL links, etc). Just like with the non-persistent resources, you *MUST* add destructors for every resource, even it requires no destruction and the destructor would be empty. Remember, since emalloc() and friends aren't to be used in conjunction with the persistent list, you mustn't use efree() here either.

Adding runtime configuration directives

Many of the features of PHP can be configured at runtime. These configuration directives can appear in either the designated php3.ini file, or in the case of the Apache module version in the Apache .conf files. The advantage of having them in the Apache .conf files is that they can be configured on a per-directory basis. This means that one directory may have a certain safemodeexecdir for example, while another directory may have another. This configuration granularity is especially handy when a server supports multiple virtual hosts.

The steps required to add a new directive:

  1. Add directive to php3_ini_structure struct in mod_php3.h.

  2. In main.c, edit the php3_module_startup function and add the appropriate cfg_get_string() or cfg_get_long() call.

  3. Add the directive, restrictions and a comment to the php3_commands structure in mod_php3.c. Note the restrictions part. RSRC_CONF are directives that can only be present in the actual Apache .conf files. Any OR_OPTIONS directives can be present anywhere, include normal .htaccess files.

  4. In either php3take1handler() or php3flaghandler() add the appropriate entry for your directive.

  5. In the configuration section of the _php3_info() function in functions/info.c you need to add your new directive.

  6. And last, you of course have to use your new directive somewhere. It will be addressable as php3_ini.directive.

上一頁 | 首頁 | 下一頁
除錯器協議 | 上一層 | Calling User Functions


Reporting Errors

To report errors from an internal function, you should call the php3_error() function. This takes at least two parameters -- the first is the level of the error, the second is the format string for the error message (as in a standard printf() call), and any following arguments are the parameters for the format string. The error levels are:

E_NOTICE

Notices are not printed by default, and indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script. For example, trying to access the value of a variable which has not been set, or calling stat() on a file that doesn't exist.

E_WARNING

Warnings are printed by default, but do not interrupt script execution. These indicate a problem that should have been trapped by the script before the call was made. For example, calling ereg() with an invalid regular expression.

E_ERROR

Errors are also printed by default, and execution of the script is halted after the function returns. These indicate errors that can not be recovered from, such as a memory allocation problem.

E_PARSE

Parse errors should only be generated by the parser. The code is listed here only for the sake of completeness.

E_CORE_ERROR

This is like an E_ERROR, except it is generated by the core of PHP. Functions should not generate this type of error.

E_CORE_WARNING

This is like an E_WARNING, except it is generated by the core of PHP. Functions should not generate this type of error.

E_COMPILE_ERROR

This is like an E_ERROR, except it is generated by the Zend Scripting Engine. Functions should not generate this type of error.

E_COMPILE_WARNING

This is like an E_WARNING, except it is generated by the Zend Scripting Engine. Functions should not generate this type of error.

E_USER_ERROR

This is like an E_ERROR, except it is generated in PHP code by using the PHP function trigger_error(). Functions should not generate this type of error.

E_USER_WARNING

This is like an E_WARNING, except it is generated by using the PHP function trigger_error(). Functions should not generate this type of error.

E_USER_NOTICE

This is like an E_NOTICE, except it is generated by using the PHP function trigger_error(). Functions should not generate this type of error.

E_ALL

All of the above. Using this error_reporting level will show all error types.

上一頁 | 首頁 | 下一頁
Calling User Functions | 上一層 | 函式別名列表


前言

PHP，即“PHP: Hypertext Preprocessor”，是一種廣泛用於 Open Source（開放原始碼）的尤其適合 Web 開發並可以嵌入 HTML 的多用途腳本語言。它的語法接近 C，Java 和 Perl，而且容易學習。該語言的主要目標是讓 Web 開發人員快速的書寫動態產生的網頁，然而，PHP 的功能並不局限於此。

本手冊基本上由函式參考組成，此外包括語言參考、PHP 主要特點以及其它補充訊息。

您可以在 http://www.php.net/docs.php 下載這個手冊的幾種格式的版本。 供下載的手冊將隨其內容的變化而更新。關於手冊發展的更多訊息， 請參閱附錄：“關於本手冊”。

上一頁 | 首頁 | 下一頁
PHP 手冊 |  | 入門指引


Aspell functions [deprecated]

PHP 手冊
上一頁 下一頁

III. Aspell functions [deprecated]

介紹

The aspell() functions allows you to check the spelling on a word and offer suggestions.

需求

aspell works only with very old (up to .27.* or so) versions of aspell library. Neither this module, nor those versions of aspell library are supported any longer. If you want to use spell-checking capabilities in PHP, use pspell instead. It uses pspell library and works with newer versions of aspell.

安裝

You need the aspell library, available from: http://aspell.sourceforge.net/.

相關參考

See also pspell.

目錄
aspell_check_raw -- Check a word without changing its case or trying to trim it [deprecated]
aspell_check -- Check a word [deprecated]
aspell_new -- Load a new dictionary [deprecated]
aspell_suggest -- Suggest spellings of a word [deprecated]
上一頁 | 首頁 | 下一頁
usort | 上一層 | aspell_check_raw


BCMath Arbitrary Precision Mathematics Functions

PHP 手冊
上一頁 下一頁

IV. BCMath Arbitrary Precision Mathematics Functions

介紹

For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision, represented as strings.

需求

Since PHP 4.0.4, libbcmath is bundled with PHP. You don't need any external libraries for this extension.

安裝

In PHP 4, these functions are only available if PHP was configured with --enable-bcmath. In PHP 3, these functions are only available if PHP was not configured with --disable-bcmath.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. BC math configuration options

Name | Default | Changeable
bcmath.scale | 0 | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

bcmath.scale integer

Number of decimal digits for all bcmath functions.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
bcadd -- Add two arbitrary precision numbers
bccomp -- Compare two arbitrary precision numbers
bcdiv -- Divide two arbitrary precision numbers
bcmod -- Get modulus of an arbitrary precision number
bcmul -- Multiply two arbitrary precision number
bcpow -- Raise an arbitrary precision number to another
bcscale -- Set default scale parameter for all bc math functions
bcsqrt -- Get the square root of an arbitrary precision number
bcsub -- Subtract one arbitrary precision number from another
上一頁 | 首頁 | 下一頁
aspell_suggest | 上一層 | bcadd


Bzip2 Compression Functions

PHP 手冊
上一頁 下一頁

V. Bzip2 Compression Functions

介紹

The bzip2 functions are used to transparently read and write bzip2 (.bz2) compressed files.

需求

This module uses the functions of the bzip2 library by Julian Seward

安裝

Bzip2 support in PHP is not enabled by default. You will need to use the --with-bz2 configuration option when compiling PHP to enable bzip2 support. This module requires bzip2/libbzip2 version >= 1.0.x.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

This extension defines one resource type: a file pointer identifying the bz2-file to work on.

預定義常數

該擴展模塊未定義任何常數。

範例

This example opens a temporary file and writes a test string to it, then prints out the contents of the file.

例子 1. Small bzip2 Example

<?php

$filename = "/tmp/testfile.bz2";
$str = "This is a test string.\n";

// open file for writing
$bz = bzopen($filename, "w");

// write string to file
bzwrite($bz, $str);

// close file
bzclose($bz);

// open file for reading
$bz = bzopen($filename, "r");

// read 10 characters
print bzread($bz, 10);

// output until end of the file (or the next 1024 char) and close it.
print bzread($bz);

bzclose($bz);

?>
目錄
bzclose -- Close a bzip2 file pointer
bzcompress -- Compress a string into bzip2 encoded data
bzdecompress -- Decompresses bzip2 encoded data
bzerrno -- Returns a bzip2 error number
bzerror -- Returns the bzip2 error number and error string in an array
bzerrstr -- Returns a bzip2 error string
bzflush -- Force a write of all buffered data
bzopen -- Open a bzip2 compressed file
bzread -- Binary safe bzip2 file read
bzwrite -- Binary safe bzip2 file write
上一頁 | 首頁 | 下一頁
bcsub | 上一層 | bzclose


Calendar functions

PHP 手冊
上一頁 下一頁

VI. Calendar functions

介紹

The calendar extension presents a series of functions to simplify converting between different calendar formats. The intermediary or standard it is based on is the Julian Day Count. The Julian Day Count is a count of days starting from January 1st, 4713 B.C. To convert between calendar systems, you must first convert to Julian Day Count, then to the calendar system of your choice. Julian Day Count is very different from the Julian Calendar! For more information on Julian Day Count, visit http://serendipity.magnet.ch/hermetic/cal_stud/jdn.htm. For more information on calendar systems visit http://genealogy.org/~scottlee/cal-overview.html. Excerpts from this page are included in these instructions, and are in quotes.

安裝

To get these functions to work, you have to compile PHP with --enable-calendar.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

CAL_GREGORIAN (integer)

CAL_JULIAN (integer)

CAL_JEWISH (integer)

CAL_FRENCH (integer)

CAL_NUM_CALS (integer)

CAL_DOW_DAYNO (integer)

CAL_DOW_SHORT (integer)

CAL_DOW_LONG (integer)

CAL_MONTH_GREGORIAN_SHORT (integer)

CAL_MONTH_GREGORIAN_LONG (integer)

CAL_MONTH_JULIAN_SHORT (integer)

CAL_MONTH_JULIAN_LONG (integer)

CAL_MONTH_JEWISH (integer)

CAL_MONTH_FRENCH (integer)

The following constants are available since PHP 4.3.0 :

CAL_EASTER_DEFAULT (integer)

CAL_EASTER_ROMAN (integer)

CAL_EASTER_ALWAYS_GREGORIAN (integer)

CAL_EASTER_ALWAYS_JULIAN (integer)

目錄
cal_days_in_month -- Return the number of days in a month for a given year and calendar
cal_from_jd -- Converts from Julian Day Count to a supported calendar and return extended information
cal_info -- Returns information about a particular calendar
cal_to_jd -- Converts from a supported calendar to Julian Day Count
easter_date -- Get UNIX timestamp for midnight on Easter of a given year
easter_days -- Get number of days after March 21 on which Easter falls for a given year
FrenchToJD -- Converts a date from the French Republican Calendar to a Julian Day Count
GregorianToJD -- Converts a Gregorian date to Julian Day Count
JDDayOfWeek -- Returns the day of the week
JDMonthName -- Returns a month name
JDToFrench -- Converts a Julian Day Count to the French Republican Calendar
JDToGregorian -- Converts Julian Day Count to Gregorian date
JDToJewish -- Converts a Julian Day Count to the Jewish Calendar
JDToJulian -- Converts a Julian Day Count to a Julian Calendar Date
jdtounix -- Convert Julian Day to UNIX timestamp
JewishToJD -- Converts a date in the Jewish Calendar to Julian Day Count
JulianToJD -- Converts a Julian Calendar date to Julian Day Count
unixtojd -- Convert UNIX timestamp to Julian Day
上一頁 | 首頁 | 下一頁
bzwrite | 上一層 | cal_days_in_month


CCVS API Functions

PHP 手冊
上一頁 下一頁

VII. CCVS API Functions

介紹

These functions interface the CCVS API, allowing you to work directly with CCVS from your PHP scripts. CCVS is RedHat's solution to the "middle-man" in credit card processing. It lets you directly address the credit card clearing houses via your *nix box and a modem. Using the CCVS module for PHP, you can process credit cards directly through CCVS via your PHP Scripts. The following references will outline the process.

註: CCVS has been discontinued by Red Hat and there are no plans to issue further keys or support contracts. Those looking for a replacement can consider MCVE by Main Street Softworks as a potential replacement. It is similar in design and has documented PHP support!

安裝

To enable CCVS Support in PHP, first verify your CCVS installation directory. You will then need to configure PHP with the --with-ccvs option. If you use this option without specifying the path to your CCVS installation, PHP will attempt to look in the default CCVS Install location (/usr/local/ccvs). If CCVS is in a non-standard location, run configure with: --with-ccvs=$ccvs_path, where $ccvs_path is the path to your CCVS installation. Please note that CCVS support requires that $ccvs_path/lib and $ccvs_path/include exist, and include cv_api.h under the include directory and libccvs.a under the lib directory.

Additionally, a ccvsd process will need to be running for the configurations you intend to use in your PHP scripts. You will also need to make sure the PHP Processes are running under the same user as your CCVS was installed as (e.g. if you installed CCVS as user 'ccvs', your PHP processes must run as 'ccvs' as well.)

相關參考

Additional information about CCVS can be found at http://www.redhat.com/products/ccvs. RedHat maintains slightly outdated but still useful documentation at http://www.redhat.com/products/ccvs/support/CCVS3.3docs/ProgPHP.html.

目錄
ccvs_add -- Add data to a transaction
ccvs_auth -- Perform credit authorization test on a transaction
ccvs_command -- Performs a command which is peculiar to a single protocol, and thus is not available in the general CCVS API
ccvs_count -- Find out how many transactions of a given type are stored in the system
ccvs_delete -- Delete a transaction
ccvs_done -- Terminate CCVS engine and do cleanup work
ccvs_init -- Initialize CCVS for use
ccvs_lookup -- Look up an item of a particular type in the database #
ccvs_new -- Create a new, blank transaction
ccvs_report -- Return the status of the background communication process
ccvs_return -- Transfer funds from the merchant to the credit card holder
ccvs_reverse -- Perform a full reversal on an already-processed authorization
ccvs_sale -- Transfer funds from the credit card holder to the merchant
ccvs_status -- Check the status of an invoice
ccvs_textvalue -- Get text return value for previous function call
ccvs_void -- Perform a full reversal on a completed transaction
上一頁 | 首頁 | 下一頁
unixtojd | 上一層 | ccvs_add


Class/Object Functions

PHP 手冊
上一頁 下一頁

IX. Class/Object Functions

介紹

These functions allow you to obtain information about classes and instance objects. You can obtain the name of the class to which a object belongs, as well as its member properties and methods. Using these functions, you can find out not only the class membership of an object, but also its parentage (i.e. what class is the object class extending).

範例

In this example, we first define a base class and an extension of the class. The base class describes a general vegetable, whether it is edible or not and what is its color. The subclass Spinach adds a method to cook it and another to find out if it is cooked.

例子 1. classes.inc

<?php

// base class with member properties and methods
class Vegetable {

    var $edible;
    var $color;

    function Vegetable( $edible, $color="green" ) {
        $this->edible = $edible;
        $this->color = $color;
    }

    function is_edible() {
        return $this->edible;
    }

    function what_color() {
        return $this->color;
    }

} // end of class Vegetable

// extends the base class
class Spinach extends Vegetable {

    var $cooked = false;

    function Spinach() {
        $this->Vegetable( true, "green" );
    }

    function cook_it() {
        $this->cooked = true;
    }

    function is_cooked() {
        return $this->cooked;
    }

} // end of class Spinach

?>

We then instantiate 2 objects from these classes and print out information about them, including their class parentage. We also define some utility functions, mainly to have a nice printout of the variables.

例子 2. test_script.php

<pre>
<?php

include "classes.inc";

// utility functions

function print_vars($obj) {
    $arr = get_object_vars($obj);
    while (list($prop, $val) = each($arr))
        echo "\t$prop = $val\n";
}

function print_methods($obj) {
    $arr = get_class_methods(get_class($obj));
    foreach ($arr as $method)
        echo "\tfunction $method()\n";
}

function class_parentage($obj, $class) {
    global $$obj;
    if (is_subclass_of($$obj, $class)) {
        echo "Object $obj belongs to class ".get_class($$obj);
        echo " a subclass of $class\n";
    } else {
        echo "Object $obj does not belong to a subclass of $class\n";
    }
}

// instantiate 2 objects

$veggie = new Vegetable(true,"blue");
$leafy = new Spinach();

// print out information about objects
echo "veggie: CLASS ".get_class($veggie)."\n";
echo "leafy: CLASS ".get_class($leafy);
echo ", PARENT ".get_parent_class($leafy)."\n";

// show veggie properties
echo "\nveggie: Properties\n";
print_vars($veggie);

// and leafy methods
echo "\nleafy: Methods\n";
print_methods($leafy);

echo "\nParentage:\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>
</pre>

One important thing to note in the example above is that the object $leafy is an instance of the class Spinach which is a subclass of Vegetable, therefore the last part of the script above will output:

[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable

目錄
call_user_method_array -- Call a user method given with an array of parameters [deprecated]
call_user_method -- Call a user method on an specific object [deprecated]
class_exists -- Checks if the class has been defined
get_class_methods -- Returns an array of class methods' names
get_class_vars -- Returns an array of default properties of the class
get_class -- Returns the name of the class of an object
get_declared_classes -- Returns an array with the name of the defined classes
get_object_vars -- Returns an associative array of object properties
get_parent_class -- Retrieves the parent class name for object or class
is_a -- Returns TRUE if the object is of this class or has this class as one of its parents
is_subclass_of -- Returns TRUE if the object has this class as one of its parents
method_exists -- Checks if the class method exists
上一頁 | 首頁 | 下一頁
com_set | 上一層 | call_user_method_array


COM support functions for Windows

PHP 手冊
上一頁 下一頁

VIII. COM support functions for Windows

介紹

COM is a technology which allows the reuse of code written in any language (by any language) using a standard calling convention and hiding behind APIs the implementation details such as what machine the Component is stored on and the executable which houses it. It can be thought of as a super Remote Procedure Call (RPC) mechanism with some basic object roots. It separates implementation from interface.

COM encourages versioning, separation of implementation from interface and hiding the implementation details such as executable location and the language it was written in.

需求

COM functions are only available on the Windows version of PHP.

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Com configuration options

Name | Default | Changeable
com.allow_dcom | "0" | PHP_INI_SYSTEM
com.autoregister_typelib | "0" | PHP_INI_SYSTEM
com.autoregister_verbose | "0" | PHP_INI_SYSTEM
com.autoregister_casesensitive | "1" | PHP_INI_SYSTEM
com.typelib_file | "" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

CLSCTX_INPROC_SERVER (integer)

CLSCTX_INPROC_HANDLER (integer)

CLSCTX_LOCAL_SERVER (integer)

CLSCTX_REMOTE_SERVER (integer)

CLSCTX_SERVER (integer)

CLSCTX_ALL (integer)

VT_NULL (integer)

VT_EMPTY (integer)

VT_UI1 (integer)

VT_I2 (integer)

VT_I4 (integer)

VT_R4 (integer)

VT_R8 (integer)

VT_BOOL (integer)

VT_ERROR (integer)

VT_CY (integer)

VT_DATE (integer)

VT_BSTR (integer)

VT_DECIMAL (integer)

VT_UNKNOWN (integer)

VT_DISPATCH (integer)

VT_VARIANT (integer)

VT_I1 (integer)

VT_UI2 (integer)

VT_UI4 (integer)

VT_INT (integer)

VT_UINT (integer)

VT_ARRAY (integer)

VT_BYREF (integer)

CP_ACP (integer)

CP_MACCP (integer)

CP_OEMCP (integer)

CP_UTF7 (integer)

CP_UTF8 (integer)

CP_SYMBOL (integer)

CP_THREAD_ACP (integer)

相關參考

For further information on COM read the COM specification or perhaps take a look at Don Box's Yet Another COM Library (YACL)

目錄
COM -- COM class
VARIANT -- VARIANT class
com_addref -- Increases the components reference counter.
com_get -- Gets the value of a COM Component's property
com_invoke -- Calls a COM component's method.
com_isenum -- Grabs an IEnumVariant
com_load_typelib -- Loads a Typelib
com_load -- Creates a new reference to a COM component
com_propget -- Gets the value of a COM Component's property
com_propput -- Assigns a value to a COM component's property
com_propset -- Assigns a value to a COM component's property
com_release -- Decreases the components reference counter.
com_set -- Assigns a value to a COM component's property
上一頁 | 首頁 | 下一頁
ccvs_void | 上一層 | COM


ClibPDF functions

PHP 手冊
上一頁 下一頁

X. ClibPDF functions

介紹

ClibPDF lets you create PDF documents with PHP. It is available for download from FastIO, but requires that you purchase a license for commercial use. ClibPDF functionality and API are similar to PDFlib.

This documentation should be read alongside the ClibPDF manual since it explains the library in much greater detail.

Many functions in the native ClibPDF and the PHP module, as well as in PDFlib, have the same name. All functions except for cpdf_open() take the handle for the document as their first parameter.

Currently this handle is not used internally since ClibPDF does not support the creation of several PDF documents at the same time. Actually, you should not even try it, the results are unpredictable. I can't oversee what the consequences in a multi threaded environment are. According to the author of ClibPDF this will change in one of the next releases (current version when this was written is 1.10). If you need this functionality use the pdflib module.

A nice feature of ClibPDF (and PDFlib) is the ability to create the pdf document completely in memory without using temporary files. It also provides the ability to pass coordinates in a predefined unit length. (This feature can also be simulated by pdf_translate() when using the PDFlib functions.)

Another nice feature of ClibPDF is the fact that any page can be modified at any time even if a new page has been already opened. The function cpdf_set_current_page() allows to leave the current page and presume modifying an other page.

Most of the functions are fairly easy to use. The most difficult part is probably creating a very simple PDF document at all. The following example should help you to get started. It creates a document with one page. The page contains the text "Times-Roman" in an outlined 30pt font. The text is underlined.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

CPDF_PM_NONE (integer)

CPDF_PM_OUTLINES (integer)

CPDF_PM_THUMBS (integer)

CPDF_PM_FULLSCREEN (integer)

CPDF_PL_SINGLE (integer)

CPDF_PL_1COLUMN (integer)

CPDF_PL_2LCOLUMN (integer)

CPDF_PL_2RCOLUMN (integer)

範例

例子 1. Simple ClibPDF Example

<?php
$cpdf = cpdf_open(0);
cpdf_page_init($cpdf, 1, 0, 595, 842, 1.0);
cpdf_add_outline($cpdf, 0, 0, 0, 1, "Page 1");
cpdf_begin_text($cpdf);
cpdf_set_font($cpdf, "Times-Roman", 30, "WinAnsiEncoding");
cpdf_set_text_rendering($cpdf, 1);
cpdf_text($cpdf, "Times Roman outlined", 50, 750);
cpdf_end_text($cpdf);
cpdf_moveto($cpdf, 50, 740);
cpdf_lineto($cpdf, 330, 740);
cpdf_stroke($cpdf);
cpdf_finalize($cpdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($cpdf);
cpdf_close($cpdf);
?>

The pdflib distribution contains a more complex example which creates a series of pages with an analog clock. Here is that example converted into PHP using the ClibPDF extension:

例子 2. pdfclock example from pdflib 2.0 distribution

<?php
$radius = 200;
$margin = 20;
$pagecount = 40;

$pdf = cpdf_open(0);
cpdf_set_creator($pdf, "pdf_clock.php3");
cpdf_set_title($pdf, "Analog Clock");

while($pagecount-- > 0) {
  cpdf_page_init($pdf, $pagecount+1, 0, 2 * ($radius + $margin), 2 * ($radius + $margin), 1.0);

  cpdf_set_page_animation($pdf, 4, 0.5, 0, 0, 0);  /* wipe */

  cpdf_translate($pdf, $radius + $margin, $radius + $margin);
  cpdf_save($pdf);
  cpdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);

  /* minute strokes */
  cpdf_setlinewidth($pdf, 2.0);
  for ($alpha = 0; $alpha < 360; $alpha += 6)
    {
    cpdf_rotate($pdf, 6.0);
    cpdf_moveto($pdf, $radius, 0.0);
    cpdf_lineto($pdf, $radius-$margin/3, 0.0);
    cpdf_stroke($pdf);
    }

  cpdf_restore($pdf);
  cpdf_save($pdf);

  /* 5 minute strokes */
  cpdf_setlinewidth($pdf, 3.0);
  for ($alpha = 0; $alpha < 360; $alpha += 30)
  {
    cpdf_rotate($pdf, 30.0);
    cpdf_moveto($pdf, $radius, 0.0);
    cpdf_lineto($pdf, $radius-$margin, 0.0);
    cpdf_stroke($pdf);
  }

  $ltime = getdate();

  /* draw hour hand */
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['minutes']/60.0) + $ltime['hours'] - 3.0) * 30.0);
  cpdf_moveto($pdf, -$radius/10, -$radius/20);
  cpdf_lineto($pdf, $radius/2, 0.0);
  cpdf_lineto($pdf, -$radius/10, $radius/20);
  cpdf_closepath($pdf);
  cpdf_fill($pdf);
  cpdf_restore($pdf);

  /* draw minute hand */
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['seconds']/60.0) + $ltime['minutes'] - 15.0) * 6.0);
  cpdf_moveto($pdf, -$radius/10, -$radius/20);
  cpdf_lineto($pdf, $radius * 0.8, 0.0);
  cpdf_lineto($pdf, -$radius/10, $radius/20);
  cpdf_closepath($pdf);
  cpdf_fill($pdf);
  cpdf_restore($pdf);

  /* draw second hand */
  cpdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
  cpdf_setlinewidth($pdf, 2);
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
  cpdf_moveto($pdf, -$radius/5, 0.0);
  cpdf_lineto($pdf, $radius, 0.0);
  cpdf_stroke($pdf);
  cpdf_restore($pdf);

  /* draw little circle at center */
  cpdf_circle($pdf, 0, 0, $radius/30);
  cpdf_fill($pdf);

  cpdf_restore($pdf);

  cpdf_finalize_page($pdf, $pagecount+1);
}

cpdf_finalize($pdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($pdf);
cpdf_close($pdf);
?>

相關參考

See also the PDFlib extension documentation.

目錄
cpdf_add_annotation -- Adds annotation
cpdf_add_outline -- Adds bookmark for current page
cpdf_arc -- Draws an arc
cpdf_begin_text -- Starts text section
cpdf_circle -- Draw a circle
cpdf_clip -- Clips to current path
cpdf_close -- Closes the pdf document
cpdf_closepath_fill_stroke -- Close, fill and stroke current path
cpdf_closepath_stroke -- Close path and draw line along path
cpdf_closepath -- Close path
cpdf_continue_text -- Output text in next line
cpdf_curveto -- Draws a curve
cpdf_end_text -- Ends text section
cpdf_fill_stroke -- Fill and stroke current path
cpdf_fill -- Fill current path
cpdf_finalize_page -- Ends page
cpdf_finalize -- Ends document
cpdf_global_set_document_limits -- Sets document limits for any pdf document
cpdf_import_jpeg -- Opens a JPEG image
cpdf_lineto -- Draws a line
cpdf_moveto -- Sets current point
cpdf_newpath -- Starts a new path
cpdf_open -- Opens a new pdf document
cpdf_output_buffer -- Outputs the pdf document in memory buffer
cpdf_page_init -- Starts new page
cpdf_place_inline_image -- Places an image on the page
cpdf_rect -- Draw a rectangle
cpdf_restore -- Restores formerly saved environment
cpdf_rlineto -- Draws a line
cpdf_rmoveto -- Sets current point
cpdf_rotate_text -- Sets text rotation angle
cpdf_rotate -- Sets rotation
cpdf_save_to_file -- Writes the pdf document into a file
cpdf_save -- Saves current environment
cpdf_scale -- Sets scaling
cpdf_set_action_url -- Sets hyperlink
cpdf_set_char_spacing -- Sets character spacing
cpdf_set_creator -- Sets the creator field in the pdf document
cpdf_set_current_page -- Sets current page
cpdf_set_font_directories -- Sets directories to search when using external fonts
cpdf_set_font_map_file -- Sets fontname to filename translation map when using external fonts
cpdf_set_font -- Select the current font face and size
cpdf_set_horiz_scaling -- Sets horizontal scaling of text
cpdf_set_keywords -- Sets the keywords field of the pdf document
cpdf_set_leading -- Sets distance between text lines
cpdf_set_page_animation -- Sets duration between pages
cpdf_set_subject -- Sets the subject field of the pdf document
cpdf_set_text_matrix -- Sets the text matrix
cpdf_set_text_pos -- Sets text position
cpdf_set_text_rendering -- Determines how text is rendered
cpdf_set_text_rise -- Sets the text rise
cpdf_set_title -- Sets the title field of the pdf document
cpdf_set_viewer_preferences -- How to show the document in the viewer
cpdf_set_word_spacing -- Sets spacing between words
cpdf_setdash -- Sets dash pattern
cpdf_setflat -- Sets flatness
cpdf_setgray_fill -- Sets filling color to gray value
cpdf_setgray_stroke -- Sets drawing color to gray value
cpdf_setgray -- Sets drawing and filling color to gray value
cpdf_setlinecap -- Sets linecap parameter
cpdf_setlinejoin -- Sets linejoin parameter
cpdf_setlinewidth -- Sets line width
cpdf_setmiterlimit -- Sets miter limit
cpdf_setrgbcolor_fill -- Sets filling color to rgb color value
cpdf_setrgbcolor_stroke -- Sets drawing color to rgb color value
cpdf_setrgbcolor -- Sets drawing and filling color to rgb color value
cpdf_show_xy -- Output text at position
cpdf_show -- Output text at current position
cpdf_stringwidth -- Returns width of text in current font
cpdf_stroke -- Draw line along path
cpdf_text -- Output text with parameters
cpdf_translate -- Sets origin of coordinate system
上一頁 | 首頁 | 下一頁
method_exists | 上一層 | cpdf_add_annotation


Crack functions

PHP 手冊
上一頁 下一頁

XI. Crack functions

介紹

These functions allow you to use the CrackLib library to test the 'strength' of a password. The 'strength' of a password is tested by that checks length, use of upper and lower case and checked against the specified CrackLib dictionary. CrackLib will also give helpful diagnostic messages that will help 'strengthen' the password.

需求

More information regarding CrackLib along with the library can be found at http://www.users.dircon.co.uk/~crypto/.

安裝

In order to use these functions, you must compile PHP with Crack support by using the --with-crack[=DIR] option.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Crack configuration options

Name | Default | Changeable
crack.default_dictionary | NULL | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

This example shows how to open a CrackLib dictionary, test a given password, retrieve any diagnostic messages, and close the dictionary.

例子 1. CrackLib example

<?php
// Open CrackLib Dictionary
$dictionary = crack_opendict('/usr/local/lib/pw_dict')
     or die('Unable to open CrackLib dictionary');

// Perform password check
$check = crack_check($dictionary, 'gx9A2s0x');

// Retrieve messages
$diag = crack_getlastmessage();
echo $diag; // 'strong password'

// Close dictionary
crack_closedict($dictionary);
?>

註: If crack_check() returns TRUE, crack_getlastmessage() will return 'strong password'.

目錄
crack_check -- Performs an obscure check with the given password
crack_closedict -- Closes an open CrackLib dictionary
crack_getlastmessage -- Returns the message from the last obscure check
crack_opendict -- Opens a new CrackLib dictionary
上一頁 | 首頁 | 下一頁
cpdf_translate | 上一層 | crack_check


Character type functions

PHP 手冊
上一頁 下一頁

XVI. Character type functions

介紹

The functions provided by this extension check whether a character or string falls into a certain character class according to the current locale (see also setlocale()).

When called with an integer argument these functions behave exactly like their C counterparts from "ctype.h".

When called with a string argument they will check every character in the string and will only return TRUE if every character in the string matches the requested criteria. When called with an empty string the result will always be TRUE.

Passing anything else but a string or integer will return FALSE immediately.

需求

None besides functions from the standard C library which are always available.

安裝

Beginning with PHP 4.2.0 these functions are enabled by default. For older versions you have to configure and compile PHP with --enable-ctype.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
ctype_alnum -- Check for alphanumeric character(s)
ctype_alpha -- Check for alphabetic character(s)
ctype_cntrl -- Check for control character(s)
ctype_digit -- Check for numeric character(s)
ctype_graph -- Check for any printable character(s) except space
ctype_lower -- Check for lowercase character(s)
ctype_print -- Check for printable character(s)
ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character
ctype_space -- Check for whitespace character(s)
ctype_upper -- Check for uppercase character(s)
ctype_xdigit -- Check for character(s) representing a hexadecimal digit
上一頁 | 首頁 | 下一頁
cyrus_unbind | 上一層 | ctype_alnum


CURL, Client URL Library Functions

PHP 手冊
上一頁 下一頁

XII. CURL, Client URL Library Functions

介紹

PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP's ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.

These functions have been added in PHP 4.0.2.

需求

In order to use the CURL functions you need to install the CURL package. PHP requires that you use CURL 7.0.2-beta or higher. PHP will not work with any version of CURL below version 7.0.2-beta. From PHP version 4.2.3 you will atleast need CURL version 7.9.0 or higher.

安裝

To use PHP's CURL support you must also compile PHP --with-curl[=DIR] where DIR is the location of the directory containing the lib and include directories. In the "include" directory there should be a folder named "curl" which should contain the easy.h and curl.h files. There should be a file named "libcurl.a" located in the "lib" directory.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

CURLOPT_PORT (integer)

CURLOPT_FILE (integer)

CURLOPT_INFILE (integer)

CURLOPT_INFILESIZE (integer)

CURLOPT_URL (integer)

CURLOPT_PROXY (integer)

CURLOPT_VERBOSE (integer)

CURLOPT_HEADER (integer)

CURLOPT_HTTPHEADER (integer)

CURLOPT_NOPROGRESS (integer)

CURLOPT_NOBODY (integer)

CURLOPT_FAILONERROR (integer)

CURLOPT_UPLOAD (integer)

CURLOPT_POST (integer)

CURLOPT_FTPLISTONLY (integer)

CURLOPT_FTPAPPEND (integer)

CURLOPT_NETRC (integer)

CURLOPT_FOLLOWLOCATION (integer)

CURLOPT_FTPASCII (integer)

CURLOPT_PUT (integer)

CURLOPT_MUTE (integer)

CURLOPT_USERPWD (integer)

CURLOPT_PROXYUSERPWD (integer)

CURLOPT_RANGE (integer)

CURLOPT_TIMEOUT (integer)

CURLOPT_POSTFIELDS (integer)

CURLOPT_REFERER (integer)

CURLOPT_USERAGENT (integer)

CURLOPT_FTPPORT (integer)

CURLOPT_LOW_SPEED_LIMIT (integer)

CURLOPT_LOW_SPEED_TIME (integer)

CURLOPT_RESUME_FROM (integer)

CURLOPT_COOKIE (integer)

CURLOPT_SSLCERT (integer)

CURLOPT_SSLCERTPASSWD (integer)

CURLOPT_WRITEHEADER (integer)

CURLOPT_SSL_VERIFYHOST (integer)

CURLOPT_COOKIEFILE (integer)

CURLOPT_SSLVERSION (integer)

CURLOPT_TIMECONDITION (integer)

CURLOPT_TIMEVALUE (integer)

CURLOPT_CUSTOMREQUEST (integer)

CURLOPT_STDERR (integer)

CURLOPT_TRANSFERTEXT (integer)

CURLOPT_RETURNTRANSFER (integer)

CURLOPT_QUOTE (integer)

CURLOPT_POSTQUOTE (integer)

CURLOPT_INTERFACE (integer)

CURLOPT_KRB4LEVEL (integer)

CURLOPT_HTTPPROXYTUNNEL (integer)

CURLOPT_FILETIME (integer)

CURLOPT_WRITEFUNCTION (integer)

CURLOPT_READFUNCTION (integer)

CURLOPT_PASSWDFUNCTION (integer)

CURLOPT_HEADERFUNCTION (integer)

CURLOPT_MAXREDIRS (integer)

CURLOPT_MAXCONNECTS (integer)

CURLOPT_CLOSEPOLICY (integer)

CURLOPT_FRESH_CONNECT (integer)

CURLOPT_FORBID_REUSE (integer)

CURLOPT_RANDOM_FILE (integer)

CURLOPT_EGDSOCKET (integer)

CURLOPT_CONNECTTIMEOUT (integer)

CURLOPT_SSL_VERIFYPEER (integer)

CURLOPT_CAINFO (integer)

CURLOPT_COOKIEJAR (integer)

CURLOPT_SSL_CIPHER_LIST (integer)

CURLOPT_BINARYTRANSFER (integer)

CURLCLOSEPOLICY_LEAST_RECENTLY_USED (integer)

CURLCLOSEPOLICY_LEAST_TRAFFIC (integer)

CURLCLOSEPOLICY_SLOWEST (integer)

CURLCLOSEPOLICY_CALLBACK (integer)

CURLCLOSEPOLICY_OLDEST (integer)

CURLINFO_EFFECTIVE_URL (integer)

CURLINFO_HTTP_CODE (integer)

CURLINFO_HEADER_SIZE (integer)

CURLINFO_REQUEST_SIZE (integer)

CURLINFO_TOTAL_TIME (integer)

CURLINFO_NAMELOOKUP_TIME (integer)

CURLINFO_CONNECT_TIME (integer)

CURLINFO_PRETRANSFER_TIME (integer)

CURLINFO_SIZE_UPLOAD (integer)

CURLINFO_SIZE_DOWNLOAD (integer)

CURLINFO_SPEED_DOWNLOAD (integer)

CURLINFO_SPEED_UPLOAD (integer)

CURLINFO_FILETIME (integer)

CURLINFO_SSL_VERIFYRESULT (integer)

CURLINFO_CONTENT_LENGTH_DOWNLOAD (integer)

CURLINFO_CONTENT_LENGTH_UPLOAD (integer)

CURLE_OK (integer)

CURLE_UNSUPPORTED_PROTOCOL (integer)

CURLE_FAILED_INIT (integer)

CURLE_URL_MALFORMAT (integer)

CURLE_URL_MALFORMAT_USER (integer)

CURLE_COULDNT_RESOLVE_PROXY (integer)

CURLE_COULDNT_RESOLVE_HOST (integer)

CURLE_COULDNT_CONNECT (integer)

CURLE_FTP_WEIRD_SERVER_REPLY (integer)

CURLE_FTP_ACCESS_DENIED (integer)

CURLE_FTP_USER_PASSWORD_INCORRECT (integer)

CURLE_FTP_WEIRD_PASS_REPLY (integer)

CURLE_FTP_WEIRD_USER_REPLY (integer)

CURLE_FTP_WEIRD_PASV_REPLY (integer)

CURLE_FTP_WEIRD_227_FORMAT (integer)

CURLE_FTP_CANT_GET_HOST (integer)

CURLE_FTP_CANT_RECONNECT (integer)

CURLE_FTP_COULDNT_SET_BINARY (integer)

CURLE_PARTIAL_FILE (integer)

CURLE_FTP_COULDNT_RETR_FILE (integer)

CURLE_FTP_WRITE_ERROR (integer)

CURLE_FTP_QUOTE_ERROR (integer)

CURLE_HTTP_NOT_FOUND (integer)

CURLE_WRITE_ERROR (integer)

CURLE_MALFORMAT_USER (integer)

CURLE_FTP_COULDNT_STOR_FILE (integer)

CURLE_READ_ERROR (integer)

CURLE_OUT_OF_MEMORY (integer)

CURLE_OPERATION_TIMEOUTED (integer)

CURLE_FTP_COULDNT_SET_ASCII (integer)

CURLE_FTP_PORT_FAILED (integer)

CURLE_FTP_COULDNT_USE_REST (integer)

CURLE_FTP_COULDNT_GET_SIZE (integer)

CURLE_HTTP_RANGE_ERROR (integer)

CURLE_HTTP_POST_ERROR (integer)

CURLE_SSL_CONNECT_ERROR (integer)

CURLE_FTP_BAD_DOWNLOAD_RESUME (integer)

CURLE_FILE_COULDNT_READ_FILE (integer)

CURLE_LDAP_CANNOT_BIND (integer)

CURLE_LDAP_SEARCH_FAILED (integer)

CURLE_LIBRARY_NOT_FOUND (integer)

CURLE_FUNCTION_NOT_FOUND (integer)

CURLE_ABORTED_BY_CALLBACK (integer)

CURLE_BAD_FUNCTION_ARGUMENT (integer)

CURLE_BAD_CALLING_ORDER (integer)

CURLE_HTTP_PORT_FAILED (integer)

CURLE_BAD_PASSWORD_ENTERED (integer)

CURLE_TOO_MANY_REDIRECTS (integer)

CURLE_UNKNOWN_TELNET_OPTION (integer)

CURLE_TELNET_OPTION_SYNTAX (integer)

CURLE_OBSOLETE (integer)

CURLE_SSL_PEER_CERTIFICATE (integer)

範例

Once you've compiled PHP with CURL support, you can begin using the curl functions. The basic idea behind the CURL functions is that you initialize a CURL session using the curl_init(), then you can set all your options for the transfer via the curl_exec() and then you finish off your session using the curl_close(). Here is an example that uses the CURL functions to fetch the example.com homepage into a file:

例子 1. Using PHP's CURL module to fetch the example.com homepage

<?php

$ch = curl_init ("http://www.example.com/");
$fp = fopen ("example_homepage.txt", "w");

curl_setopt ($ch, CURLOPT_FILE, $fp);
curl_setopt ($ch, CURLOPT_HEADER, 0);

curl_exec ($ch);
curl_close ($ch);
fclose ($fp);
?>

目錄
curl_close -- Close a CURL session
curl_errno -- Return an integer containing the last error number
curl_error -- Return a string containing the last error for the current session
curl_exec -- Perform a CURL session
curl_getinfo -- Get information regarding a specific transfer
curl_init -- Initialize a CURL session
curl_setopt -- Set an option for a CURL transfer
curl_version -- Return the current CURL version
上一頁 | 首頁 | 下一頁
crack_opendict | 上一層 | curl_close


Cybercash payment functions

PHP 手冊
上一頁 下一頁

XIII. Cybercash payment functions

安裝

These functions are only available if the interpreter has been compiled with the --with-cybercash=[DIR].

目錄
cybercash_base64_decode -- base64 decode data for Cybercash
cybercash_base64_encode -- base64 encode data for Cybercash
cybercash_decr -- Cybercash decrypt
cybercash_encr -- Cybercash encrypt
上一頁 | 首頁 | 下一頁
curl_version | 上一層 | cybercash_base64_decode


Crｅdit Mutuel CyberMUT functions

PHP 手冊
上一頁 下一頁

XIV. Crｅdit Mutuel CyberMUT functions

介紹

This extension allows you to process credit cards transactions using Crｅdit Mutuel CyberMUT system (http://www.creditmutuel.fr/centre_commercial/vendez_sur_internet.html).

CyberMUT is a popular Web Payment Service in France, provided by the Crｅdit Mutuel bank. If you are foreign in France, these functions will not be useful for you.

The use of these functions is almost identical to the original SDK functions, except for the parameters of return for cybermut_creerformulairecm() and cybermut_creerreponsecm(), which are returned directly by functions PHP, whereas they had passed in reference in the original functions.

These functions have been added in PHP 4.0.6.

註: These functions only provide a link to CyberMUT SDK. Be sure to read the CyberMUT Developers Guide for full details of the required parameters.

安裝

These functions are only available if PHP has been compiled with the --with-cybermut[=DIR] option, where DIR is the location of libcm-mac.a and cm-mac.h. You will require the appropriate SDK for your platform, which may be sent to you after your CyberMUT's subscription (contact them via Web, or go to the nearest Crｅdit Mutuel).

目錄
cybermut_creerformulairecm -- Generate HTML form of request for payment
cybermut_creerreponsecm -- Generate the acknowledgement of delivery of the confirmation of payment
cybermut_testmac -- Make sure that there no was data diddling contained in the received message of confirmation
上一頁 | 首頁 | 下一頁
cybercash_encr | 上一層 | cybermut_creerformulairecm


Cyrus IMAP administration functions

PHP 手冊
上一頁 下一頁

XV. Cyrus IMAP administration functions

介紹

警告

該函式目前尚無參考文檔；僅參數列表可用。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

CYRUS_CONN_NONSYNCLITERAL (integer)

CYRUS_CONN_INITIALRESPONSE (integer)

CYRUS_CALLBACK_NUMBERED (integer)

CYRUS_CALLBACK_NOLITERAL (integer)

目錄
cyrus_authenticate -- Authenticate against a Cyrus IMAP server
cyrus_bind -- Bind callbacks to a Cyrus IMAP connection
cyrus_close -- Close connection to a Cyrus IMAP server
cyrus_connect -- Connect to a Cyrus IMAP server
cyrus_query -- Send a query to a Cyrus IMAP server
cyrus_unbind -- Unbind ...
上一頁 | 首頁 | 下一頁
cybermut_testmac | 上一層 | cyrus_authenticate


時間日期函式庫

PHP 手冊
上一頁 下一頁

XVIII. 時間日期函式庫

介紹

可以用這些函式得到 PHP 所執行的伺服器的日期和時間。可以用這些函式將日期和時間以很多不同方式格式化輸出。

註: 請留意這些函式依賴於伺服器的地區設置。確認在使用這些函式時考慮到了夏令時的設置和閏年。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
checkdate -- 驗証一個格裡高裡日期
date -- 格式化一個本地時間／日期
getdate -- 取得日期／時間訊息
gettimeofday -- 取得當前時間
gmdate -- 格式化一個 GMT/CUT 日期／時間
gmmktime -- 取得 GMT 日期的 UNIX 時間戳
gmstrftime -- 根據區域設置格式化 GMT/CUT 時間／日期
localtime -- 取得本地時間
microtime -- 傳回當前 UNIX 時間戳和微秒數
mktime -- 取得一個日期的 UNIX 時間戳
strftime -- 根據區域設置格式化本地時間／日期
strtotime -- 將任何英文文本的日期時間描述解析為 UNIX 時間戳
time -- 傳回當前的 UNIX 時間戳
上一頁 | 首頁 | 下一頁
dba_sync | 上一層 | checkdate


Database (dbm-style) abstraction layer functions

PHP 手冊
上一頁 下一頁

XVII. Database (dbm-style) abstraction layer functions

介紹

These functions build the foundation for accessing Berkeley DB style databases.

This is a general abstraction layer for several file-based databases. As such, functionality is limited to a common subset of features supported by modern databases such as Sleepycat Software's DB2. (This is not to be confused with IBM's DB2 software, which is supported through the ODBC functions.)

需求

The behaviour of various aspects depends on the implementation of the underlying database. Functions such as dba_optimize() and dba_sync() will do what they promise for one database and will do nothing for others. You have to download and install supported dba-Handlers.

表格 1. List of DBA handlers

Handler | Notes
dbm | Dbm is the oldest (original) type of Berkeley DB style databases. You should avoid it, if possible. We do not support the compatibility functions built into DB2 and gdbm, because they are only compatible on the source code level, but cannot handle the original dbm format.
ndbm | Ndbm is a newer type and more flexible than dbm. It still has most of the arbitrary limits of dbm (therefore it is deprecated).
gdbm | Gdbm is the GNU database manager.
db2 | DB2 is Sleepycat Software's DB2. It is described as "a programmatic toolkit that provides high-performance built-in database support for both standalone and client/server applications.
db3 | DB3 is Sleepycat Software's DB3.
cdb | Cdb is "a fast, reliable, lightweight package for creating and reading constant databases." It is from the author of qmail and can be found here. Since it is constant, we support only reading operations.

When invoking the dba_open() or dba_popen() functions, one of the handler names must be supplied as an argument. The actually available list of handlers is displayed by invoking phpinfo().

安裝

By using the --enable-dba=shared configuration option you can build a dynamic loadable modul to enable PHP for basic support of dbm-style databases. You also have to add support for at least one of the following handlers by specifying the --with-XXXX configure switch to your PHP configure line.

表格 2. Supported DBA handlers

Handler | Configure Switch
dbm | To enable support for dbm add --with-dbm[=DIR].
ndbm | To enable support for ndbm add --with-ndbm[=DIR].
gdbm | To enable support for gdbm add --with-gdbm[=DIR].
db2 | To enable support for db2 add --with-db2[=DIR].
db3 | To enable support for db3 add --with-db3[=DIR].
cdb | To enable support for cdb add --with-cdb[=DIR].

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

The functions dba_open() and dba_popen() return a handle to the specified database file to access which is used by all other dba-function calls.

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. DBA example

<?php

$id = dba_open ("/tmp/test.db", "n", "db2");

if (!$id) {
    echo "dba_open failed\n";
    exit;
}

dba_replace ("key", "This is an example!", $id);

if (dba_exists ("key", $id)) {
    echo dba_fetch ("key", $id);
    dba_delete ("key", $id);
}

dba_close ($id);
?>

DBA is binary safe and does not have any arbitrary limits. However, it inherits all limits set by the underlying database implementation.

All file-based databases must provide a way of setting the file mode of a new created database, if that is possible at all. The file mode is commonly passed as the fourth argument to dba_open() or dba_popen().

You can access all entries of a database in a linear way by using the dba_firstkey() and dba_nextkey() functions. You may not change the database while traversing it.

例子 2. Traversing a database

<?php

// ...open database...

$key = dba_firstkey ($id);

while ($key != false) {
    if (...) {          // remember the key to perform some action later
        $handle_later[] = $key;
    }
    $key = dba_nextkey ($id);
}

for ($i = 0; $i < count($handle_later); $i++)
    dba_delete ($handle_later[$i], $id);

?>

目錄
dba_close -- Close database
dba_delete -- Delete entry specified by key
dba_exists -- Check whether key exists
dba_fetch -- Fetch data specified by key
dba_firstkey -- Fetch first key
dba_insert -- Insert entry
dba_nextkey -- Fetch next key
dba_open -- Open database
dba_optimize -- Optimize database
dba_popen -- Open database persistently
dba_replace -- Replace or insert entry
dba_sync -- Synchronize database
上一頁 | 首頁 | 下一頁
ctype_xdigit | 上一層 | dba_close


dBase functions

PHP 手冊
上一頁 下一頁

XIX. dBase functions

介紹

These functions allow you to access records stored in dBase-format (dbf) databases.

There is no support for indexes or memo fields. There is no support for locking, too. Two concurrent webserver processes modifying the same dBase file will very likely ruin your database.

dBase files are simple sequential files of fixed length records. Records are appended to the end of the file and delete records are kept until you call dbase_pack().

We recommend that you do not use dBase files as your production database. Choose any real SQL server instead; MySQL or Postgres are common choices with PHP. dBase support is here to allow you to import and export data to and from your web database, because the file format is commonly understood by Windows spreadsheets and organizers.

安裝

In order to use these functions, you must compile PHP with the --enable-dbase option.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
dbase_add_record -- Add a record to a dBase database
dbase_close -- Close a dBase database
dbase_create -- Creates a dBase database
dbase_delete_record -- Deletes a record from a dBase database
dbase_get_record_with_names -- Gets a record from a dBase database as an associative array
dbase_get_record -- Gets a record from a dBase database
dbase_numfields -- Find out how many fields are in a dBase database
dbase_numrecords -- Find out how many records are in a dBase database
dbase_open -- Opens a dBase database
dbase_pack -- Packs a dBase database
dbase_replace_record -- Replace a record in a dBase database
上一頁 | 首頁 | 下一頁
time | 上一層 | dbase_add_record


DBM Functions

PHP 手冊
上一頁 下一頁

XX. DBM Functions

介紹

These functions allow you to store records stored in a dbm-style database. This type of database (supported by the Berkeley DB, GDBM, and some system libraries, as well as a built-in flatfile library) stores key/value pairs (as opposed to the full-blown records supported by relational databases).

註: However, dbm support is deprecated and you are encourged to use the Database (dbm-style) abstraction layer functions instead.

需求

To use this functions you have to compile PHP with support for an underlying database. See the list of supported Databases.

安裝

In order to use these functions, you must compile PHP with dbm support by using the --with-db option. In addtion you must ensure support for an underlying database or you can use some sytem libraries.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

The function dbmopen() returns an database identifier which is used by the other dbm-functions.

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. DBM example

$dbm = dbmopen ("lastseen", "w");
if (dbmexists ($dbm, $userid)) {
    $last_seen = dbmfetch ($dbm, $userid);
} else {
    dbminsert ($dbm, $userid, time());
}
do_stuff();
dbmreplace ($dbm, $userid, time());
dbmclose ($dbm);

目錄
dblist -- Describes the DBM-compatible library being used
dbmclose -- Closes a dbm database
dbmdelete -- Deletes the value for a key from a DBM database
dbmexists -- Tells if a value exists for a key in a DBM database
dbmfetch -- Fetches a value for a key from a DBM database
dbmfirstkey -- Retrieves the first key from a DBM database
dbminsert -- Inserts a value for a key in a DBM database
dbmnextkey -- Retrieves the next key from a DBM database
dbmopen -- Opens a DBM database
dbmreplace -- Replaces the value for a key in a DBM database
上一頁 | 首頁 | 下一頁
dbase_replace_record | 上一層 | dblist


DB++ Functions

PHP 手冊
上一頁 下一頁

XXII. DB++ Functions

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

介紹

db++, made by the German company Concept asa, is a relational database system with high performance and low memory and disk usage in mind. While providing SQL as an additional language interface, it is not really a SQL database in the first place but provides its own AQL query language which is much more influenced by the relational algebra then SQL is.

Concept asa always had an interest in supporting open source languages, db++ has had Perl and Tcl call interfaces for years now and uses Tcl as its internal stored procedure language.

需求

This extension relies on external client libraries so you have to have a db++ client installed on the system you want to use this extension on.

Concept asa provides db++ Demo versions and documentation for Linux, some other UNIX versions. There is also a Windows version of db++, but this extension doesn't support it (yet).

安裝

In order to build this extension yourself you need the db++ client libraries and header files to be installed on your system (these are included in the db++ installation archives by default). You have to run configure with option --with-dbplus to build this extension.

configure looks for the client libraries and header files under the default paths /usr/dbplus, /usr/local/dbplus and /opt/dblus. If you have installed db++ in a different place you have add the installation path to the configure option like this: --with-dbplus=/your/installation/path.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

dbplus_relation

Most db++ functions operate on or return dbplus_relation resources. A dbplus_relation is a handle to a stored relation or a relation generated as the result of a query.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

db++ error codes

表格 1. DB++ Error Codes

PHP Constant | db++ constant | meaning
DBPLUS_ERR_NOERR (integer) | ERR_NOERR | Null error condition
DBPLUS_ERR_DUPLICATE (integer) | ERR_DUPLICATE | Tried to insert a duplicate tuple
DBPLUS_ERR_EOSCAN (integer) | ERR_EOSCAN | End of scan from rget()
DBPLUS_ERR_EMPTY (integer) | ERR_EMPTY | Relation is empty (server)
DBPLUS_ERR_CLOSE (integer) | ERR_CLOSE | The server can't close
DBPLUS_ERR_WLOCKED (integer) | ERR_WLOCKED | The record is write locked
DBPLUS_ERR_LOCKED (integer) | ERR_LOCKED | Relation was already locked
DBPLUS_ERR_NOLOCK (integer) | ERR_NOLOCK | Relation cannot be locked
DBPLUS_ERR_READ (integer) | ERR_READ | Read error on relation
DBPLUS_ERR_WRITE (integer) | ERR_WRITE | Write error on relation
DBPLUS_ERR_CREATE (integer) | ERR_CREATE | Create() system call failed
DBPLUS_ERR_LSEEK (integer) | ERR_LSEEK | Lseek() system call failed
DBPLUS_ERR_LENGTH (integer) | ERR_LENGTH | Tuple exceeds maximum length
DBPLUS_ERR_OPEN (integer) | ERR_OPEN | Open() system call failed
DBPLUS_ERR_WOPEN (integer) | ERR_WOPEN | Relation already opened for writing
DBPLUS_ERR_MAGIC (integer) | ERR_MAGIC | File is not a relation
DBPLUS_ERR_VERSION (integer) | ERR_VERSION | File is a very old relation
DBPLUS_ERR_PGSIZE (integer) | ERR_PGSIZE | Relation uses a different page size
DBPLUS_ERR_CRC (integer) | ERR_CRC | Invalid crc in the superpage
DBPLUS_ERR_PIPE (integer) | ERR_PIPE | Piped relation requires lseek()
DBPLUS_ERR_NIDX (integer) | ERR_NIDX | Too many secondary indices
DBPLUS_ERR_MALLOC (integer) | ERR_MALLOC | Malloc() call failed
DBPLUS_ERR_NUSERS (integer) | ERR_NUSERS | Error use of max users
DBPLUS_ERR_PREEXIT (integer) | ERR_PREEXIT | Caused by invalid usage
DBPLUS_ERR_ONTRAP (integer) | ERR_ONTRAP | Caused by a signal
DBPLUS_ERR_PREPROC (integer) | ERR_PREPROC | Error in the preprocessor
DBPLUS_ERR_DBPARSE (integer) | ERR_DBPARSE | Error in the parser
DBPLUS_ERR_DBRUNERR (integer) | ERR_DBRUNERR | Run error in db
DBPLUS_ERR_DBPREEXIT (integer) | ERR_DBPREEXIT | Exit condition caused by prexit() * procedure
DBPLUS_ERR_WAIT (integer) | ERR_WAIT | Wait a little (Simple only)
DBPLUS_ERR_CORRUPT_TUPLE (integer) | ERR_CORRUPT_TUPLE | A client sent a corrupt tuple
DBPLUS_ERR_WARNING0 (integer) | ERR_WARNING0 | The Simple routines encountered a non fatal error which was corrected
DBPLUS_ERR_PANIC (integer) | ERR_PANIC | The server should not really die but after a disaster send ERR_PANIC to all its clients
DBPLUS_ERR_FIFO (integer) | ERR_FIFO | Can't create a fifo
DBPLUS_ERR_PERM (integer) | ERR_PERM | Permission denied
DBPLUS_ERR_TCL (integer) | ERR_TCL | TCL_error
DBPLUS_ERR_RESTRICTED (integer) | ERR_RESTRICTED | Only two users
DBPLUS_ERR_USER (integer) | ERR_USER | An error in the use of the library by an application programmer
DBPLUS_ERR_UNKNOWN (integer) | ERR_UNKNOWN |

目錄
dbplus_add -- Add a tuple to a relation
dbplus_aql -- Perform AQL query
dbplus_chdir -- Get/Set database virtual current directory
dbplus_close -- Close a relation
dbplus_curr -- Get current tuple from relation
dbplus_errcode -- Get error string for given errorcode or last error
dbplus_errno -- Get error code for last operation
dbplus_find -- Set a constraint on a relation
dbplus_first -- Get first tuple from relation
dbplus_flush -- Flush all changes made on a relation
dbplus_freealllocks -- Free all locks held by this client
dbplus_freelock -- Release write lock on tuple
dbplus_freerlocks -- Free all tuple locks on given relation
dbplus_getlock -- Get a write lock on a tuple
dbplus_getunique -- Get a id number unique to a relation
dbplus_info -- ???
dbplus_last -- Get last tuple from relation
dbplus_lockrel -- Request write lock on relation
dbplus_next -- Get next tuple from relation
dbplus_open -- Open relation file
dbplus_prev -- Get previous tuple from relation
dbplus_rchperm -- Change relation permissions
dbplus_rcreate -- Creates a new DB++ relation
dbplus_rcrtexact -- Creates an exact but empty copy of a relation including indices
dbplus_rcrtlike -- Creates an empty copy of a relation with default indices
dbplus_resolve -- Resolve host information for relation
dbplus_restorepos -- ???
dbplus_rkeys -- Specify new primary key for a relation
dbplus_ropen -- Open relation file local
dbplus_rquery -- Perform local (raw) AQL query
dbplus_rrename -- Rename a relation
dbplus_rsecindex -- Create a new secondary index for a relation
dbplus_runlink -- Remove relation from filesystem
dbplus_rzap -- Remove all tuples from relation
dbplus_savepos -- ???
dbplus_setindex -- ???
dbplus_setindexbynumber -- ???
dbplus_sql -- Perform SQL query
dbplus_tcl -- Execute TCL code on server side
dbplus_tremove -- Remove tuple and return new current tuple
dbplus_undo -- ???
dbplus_undoprepare -- ???
dbplus_unlockrel -- Give up write lock on relation
dbplus_unselect -- Remove a constraint from relation
dbplus_update -- Update specified tuple in relation
dbplus_xlockrel -- Request exclusive lock on relation
dbplus_xunlockrel -- Free exclusive lock on relation
上一頁 | 首頁 | 下一頁
dbx_sort | 上一層 | dbplus_add


dbx functions

PHP 手冊
上一頁 下一頁

XXI. dbx functions

介紹

The dbx module is a database abstraction layer (db 'X', where 'X' is a supported database). The dbx functions allow you to access all supported databases using a single calling convention. The dbx-functions themselves do not interface directly to the databases, but interface to the modules that are used to support these databases.

需求

To be able to use a database with the dbx-module, the module must be either linked or loaded into PHP, and the database module must be supported by the dbx-module. Currently, following databases are supported, but others will follow:

  • FrontBase (available from PHP 4.1.0).

  • Microsoft SQL Server

  • MySQL

  • ODBC

  • PostgreSQL

  • Sybase-CT (available from PHP 4.2.0).

  • Oracle (oci8) (CVS only).

Documentation for adding additional database support to dbx can be found at http://www.guidance.nl/php/dbx/doc/.

安裝

In order to have these functions available, you must compile PHP with dbx support by using the --enable-dbx option and all options for the databases that will be used, e.g. for MySQL you must also specify --with-mysql=[DIR]. To get other supported databases to work with the dbx-module refer to their specific documentation.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. DBX Configuration Options

Name | Default | Changeable
dbx.colnames_case | "unchanged" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

註: This ini-option is in CVS only.

Here is a short explanation of the configuration directives.

dbx.colnames_case string

Columns names can be returned "unchanged" or converted to "uppercase" or "lowercase". This directive can be overridden with a flag to dbx_query().

資源型別

There are two resource types used in the dbx module. The first one is the link-object for a database connection, the second a result-object which helds the result of a query.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

DBX_MYSQL (integer)

DBX_ODBC (integer)

DBX_PGSQL (integer)

DBX_MSSQL (integer)

DBX_FBSQL (integer)

DBX_OCI8 (integer) CVS only

DBX_SYBASECT (integer)

DBX_PERSISTENT (integer)

DBX_RESULT_INFO (integer)

DBX_RESULT_INDEX (integer)

DBX_RESULT_ASSOC (integer)

DBX_COLNAMES_UNCHANGED (integer) CVS only

DBX_COLNAMES_UPPERCASE (integer) CVS only

DBX_COLNAMES_LOWERCASE (integer) CVS only

DBX_CMP_NATIVE (integer)

DBX_CMP_TEXT (integer)

DBX_CMP_NUMBER (integer)

DBX_CMP_ASC (integer)

DBX_CMP_DESC (integer)

目錄
dbx_close -- Close an open connection/database
dbx_compare -- Compare two rows for sorting purposes
dbx_connect -- Open a connection/database
dbx_error -- Report the error message of the latest function call in the module (not just in the connection)
dbx_escape_string -- Escape a string so it can safely be used in an sql-statement.
dbx_query -- Send a query and fetch all results (if any)
dbx_sort -- Sort a result from a dbx_query by a custom sort function
上一頁 | 首頁 | 下一頁
dbmreplace | 上一層 | dbx_close


Direct IO functions

PHP 手冊
上一頁 下一頁

XXIII. Direct IO functions

介紹

PHP supports the direct io functions as described in the Posix Standard (Section 6) for performing I/O functions at a lower level than the C-Language stream I/O functions (fopen, fread,..).

需求

無需外部庫文件就可以加入本擴展模塊的支援。

Installation

To get these functions to work, you have to configure PHP with --enable-dio.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

One resource type is defined by this extension: a file descriptor returnded by dio_open().

預定義常數

該擴展模塊未定義任何常數。

目錄
dio_close -- Closes the file descriptor given by fd
dio_fcntl -- Performs a c library fcntl on fd
dio_open -- Opens a new filename with specified permissions of flags and creation permissions of mode
dio_read -- Reads n bytes from fd and returns them, if n is not specified, reads 1k block
dio_seek -- Seeks to pos on fd from whence
dio_stat -- Gets stat information about the file descriptor fd
dio_tcsetattr -- Sets terminal attributes and baud rate for a serial port
dio_truncate -- Truncates file descriptor fd to offset bytes
dio_write -- Writes data to fd with optional truncation at length
上一頁 | 首頁 | 下一頁
dbplus_xunlockrel | 上一層 | dio_close


目錄函式庫

PHP 手冊
上一頁 下一頁

XXIV. 目錄函式庫

介紹

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

該擴展模塊未定義任何常數。

相關參考

相關函式例如 dirname()，is_dir()，mkdir() 和 rmdir()，見文件系統函式庫一節。

目錄
chdir -- 改變目錄
chroot -- 改變根目錄
dir -- directory 類
closedir -- 關閉目錄句柄
getcwd -- 取得當前工作目錄
opendir -- 打開目錄句柄
readdir -- 從目錄句柄中讀取條目
rewinddir -- 倒回目錄句柄
上一頁 | 首頁 | 下一頁
dio_write | 上一層 | chdir


DOM XML functions

PHP 手冊
上一頁 下一頁

XXV. DOM XML functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

The DOM XML extension has been overhauled in PHP 4.3.0 to better comply with the DOM standard. The extension still contains many old functions, but they should no longer be used. In particular, functions that are not object-oriented should be avoided.

The extension allows you to operate on an XML document with the DOM API. It also provides a function domxml_xmltree() to turn the complete XML document into a tree of PHP objects. Currently, this tree should be considered read-only — you can modify it, but this would not make any sense since DomDocument_dump_mem() cannot be applied to it. Therefore, if you want to read an XML file and write a modified version, use DomDocument_create_element(), DomDocument_create_text_node(), set_attribute(), etc. and finally the DomDocument_dump_mem() function.

需求

This extension makes use of the GNOME XML library. Download and install this library. You will need at least libxml-2.4.14.

安裝

This extension is only available if PHP was configured with --with-dom=[DIR].

Deprecated functions

There are quite a few functions that do not fit into the DOM standard and should no longer be used. These functions are listed in the following table. The function DomNode_append_child() has changed its behaviour. It now adds a child and not a sibling. If this breaks your application, use the non-DOM function DomNode_append_sibling().

表格 1. Deprecated functions and their replacements

Old function | New function
xmldoc | domxml_open_mem()
xmldocfile | domxml_open_file()
domxml_new_xmldoc | domxml_new_doc()
domxml_dump_mem | DomDocument_dump_mem()
domxml_dump_mem_file | DomDocument_dump_file()
DomDocument_dump_mem_file | DomDocument_dump_file()
DomDocument_add_root | DomDocument_create_element() followed by DomNode_append_child()
DomDocument_dtd | DomDocument_doctype()
DomDocument_root | DomDocument_document_element()
DomDocument_children | DomNode_child_nodes()
DomDocument_imported_node | No replacement.
DomNode_add_child | Create a new node with e.g. DomDocument_create_element() und add it with DomNode_append_child().
DomNode_children | DomNode_child_nodes()
DomNode_parent | DomNode_parent_node()
DomNode_new_child | Create a new node with e.g. DomDocument_create_element() and add it with DomNode_append_child().
DomNode_set_content | Create a new node with e.g. DomDocument_create_text_node() and add it with DomNode_append_child().
DomNode_get_content | Content is just a text node and can be accessed with DomNode_child_nodes().
DomNode_set_content | Content is just a text node and can be added with DomNode_append_child().

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

表格 2. XML constants

Constant | Value | Description
XML_ELEMENT_NODE (integer) | 1 | Node is an element
XML_ATTRIBUTE_NODE (integer) | 2 | Node is an attribute
XML_TEXT_NODE (integer) | 3 | Node is a piece of text
XML_CDATA_SECTION_NODE (integer) | 4 |
XML_ENTITY_REF_NODE (integer) | 5 |
XML_ENTITY_NODE (integer) | 6 | Node is an entity like &nbsp;
XML_PI_NODE (integer) | 7 | Node is a processing instruction
XML_COMMENT_NODE (integer) | 8 | Node is a comment
XML_DOCUMENT_NODE (integer) | 9 | Node is a document
XML_DOCUMENT_TYPE_NODE (integer) | 10 |
XML_DOCUMENT_FRAG_NODE (integer) | 11 |
XML_NOTATION_NODE (integer) | 12 |
XML_GLOBAL_NAMESPACE (integer) | 1 |
XML_LOCAL_NAMESPACE (integer) | 2 |
XML_HTML_DOCUMENT_NODE (integer) |  |
XML_DTD_NODE (integer) |  |
XML_ELEMENT_DECL_NODE (integer) |  |
XML_ATTRIBUTE_DECL_NODE (integer) |  |
XML_ENTITY_DECL_NODE (integer) |  |
XML_NAMESPACE_DECL_NODE (integer) |  |
XML_ATTRIBUTE_CDATA (integer) |  |
XML_ATTRIBUTE_ID (integer) |  |
XML_ATTRIBUTE_IDREF (integer) |  |
XML_ATTRIBUTE_IDREFS (integer) |  |
XML_ATTRIBUTE_ENTITY (integer) |  |
XML_ATTRIBUTE_NMTOKEN (integer) |  |
XML_ATTRIBUTE_NMTOKENS (integer) |  |
XML_ATTRIBUTE_ENUMERATION (integer) |  |
XML_ATTRIBUTE_NOTATION (integer) |  |
XPATH_UNDEFINED (integer) |  |
XPATH_NODESET (integer) |  |
XPATH_BOOLEAN (integer) |  |
XPATH_NUMBER (integer) |  |
XPATH_STRING (integer) |  |
XPATH_POINT (integer) |  |
XPATH_RANGE (integer) |  |
XPATH_LOCATIONSET (integer) |  |
XPATH_USERS (integer) |  |
XPATH_NUMBER (integer) |  |

Classes

The API of the module follows the DOM Level 2 standard as closely as possible. Consequently, the API is fully object-oriented. It is a good idea to have the DOM standard available when using this module. Though the API is object-oriented, there are many functions which can be called in a non-object-oriented way by passing the object to operate on as the first argument. These functions are mainly to retain compatibilty to older versions of the extension, and should not be used when creating new scripts.

This API differs from the official DOM API in two ways. First, all class attributes are implemented as functions with the same name. Secondly, the function names follow the PHP naming convention. This means that a DOM function lastChild() will be written as last_child().

This module defines a number of classes, which are listed — including their method — in the following tables. Classes with an equivalent in the DOM standard are named DOMxxx.

表格 3. List of classes

Class name | Parent classes
DomAttribute | DomNode
DomCData | DomNode
DomComment | DomCData : DomNode
DomDocument | DomNode
DomDocumentType | DomNode
DomElement | DomNode
DomEntity | DomNode
DomEntityReference | DomNode
DomProcessingInstruction | DomNode
DomText | DomCData : DomNode
Parser | Currently still called DomParser
XPathContext |

表格 4. DomDocument class (DomDocument : DomNode)

Method name | Function name | Remark
doctype | DomDocument_doctype() |
document_elemnent | DomDocument_document_element() |
create_element | DomDocument_create_element() |
create_text_node | DomDocument_create_text_node() |
create_comment | DomDocument_create_comment() |
create_cdata_section | DomDocument_create_cdata_section() |
create_processing_instruction | DomDocument_create_processing_instruction() |
create_attribute | DomDocument_create_attribute() |
create_entity_reference | DomDocument_create_entity_reference() |
get_elements_by_tagname | DomDocument_get_elements_by_tagname() |
get_element_by_id | DomDocument_get_element_by_id() |
dump_mem | DomDocument_dump_mem() | not DOM standard
dump_file | DomDocument_dump_file() | not DOM standard
html_dump_mem | DomDocument_html_dump_mem() | not DOM standard
xpath_init | xpath_init | not DOM standard
xpath_new_context | xpath_new_context | not DOM standard
xptr_new_context | xptr_new_context | not DOM standard

表格 5. DomElement class (DomElement : DomNode)

Method name | Function name | Remark
tagname | DomElement_tagname() |
get_attribute | DomElement_get_attribute() |
set_attribute | DomElement_set_attribute() |
remove_attribute | DomElement_remove_attribute() |
get_attribute_node | DomElement_get_attribute_node() |
get_elements_by_tagname | DomElement_get_elements_by_tagname() |
has_attribute | DomElement_has_attribute() |

表格 6. DomNode class

Method name | Remark
DomNode_node_name() |
DomNode_node_value() |
DomNode_node_type() |
DomNode_last_child() |
DomNode_first_child() |
DomNode_child_nodes() |
DomNode_previous_sibling() |
DomNode_next_sibling() |
DomNode_parent_node() |
DomNode_owner_document() |
DomNode_insert_before() |
DomNode_append_child() |
DomNode_append_sibling() | Not in DOM standard. This function emulates the former behaviour of DomNode_append_child().
DomNode_remove_child() |
DomNode_has_child_nodes() |
DomNode_has_attributes() |
DomNode_clone_node() |
DomNode_attributes() |
DomNode_unlink_node() | Not in DOM standard
DomNode_replace_node() | Not in DOM standard
DomNode_set_content() | Not in DOM standard, deprecated
DomNode_get_content() | Not in DOM standard, deprecated
DomNode_dump_node() | Not in DOM standard
DomNode_is_blank_node() | Not in DOM standard

表格 7. DomAttribute class (DomAttribute : DomNode)

Method name |  | Remark
name | DomAttribute_name() |
value | DomAttribute_value() |
specified | DomAttribute_specified() |

表格 8. DomProcessingInstruction class (DomProcessingInstruction : DomNode)

Method name | Function name | Remark
target | DomProcessingInstruction_target() |
data | DomProcessingInstruction_data() |

表格 9. Parser class

Method name | Function name | Remark
add_chunk | Parser_add_chunk() |
end | Parser_end() |

表格 10. XPathContext class

Method name | Function name | Remark
eval | XPathContext_eval() |
eval_expression | XPathContext_eval_expression() |
register_ns | XPathContext_register_ns() |

表格 11. DomDocumentType class (DomDocumentType : DomNode)

Method name | Function name | Remark
name | DomDocumentType_name() |
entities | DomDocumentType_entities() |
notations | DomDocumentType_notations() |
public_id | DomDocumentType_public_id() |
system_id | DomDocumentType_system_id() |
internal_subset | DomDocumentType_internal_subset() |

The classes DomDtd is derived from DomNode. DomComment is derived from DomCData.

範例

Many examples in this reference require an XML string. Instead of repeating this string in every example, it will be put into a file which will be included by each example. This include file is shown in the following example section. Alternatively, you could create an XML document and read it with DomDocument_open_file().

例子 1. Include file example.inc with XML string

<?php
$xmlstr = "<?xml version='1.0' standalone='yes'?>
<!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd'
[ <!ENTITY sp \"spanish\">
]>
<!-- lsfj  -->
<chapter language='en'><title language='en'>Title</title>
 <para language='ge'>
  &amp;sp;
  <!-- comment -->
  <informaltable ID='findme' language='&amp;sp;'>
   <tgroup cols='3'>
    <tbody>
     <row><entry>a1</entry><entry
morerows='1'>b1</entry><entry>c1</entry></row>
<row><entry>a2</entry><entry>c2</entry></row>
     <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
</chapter>";
?>

目錄
DomAttribute->name -- Returns name of attribute
DomAttribute->specified -- Checks if attribute is specified
DomAttribute->value -- Returns value of attribute
DomDocument->add_root [deprecated] -- Adds a root node
DomDocument->create_attribute -- Create new attribute
DomDocument->create_cdata_section -- Create new cdata node
DomDocument->create_comment -- Create new comment node
DomDocument->create_element_ns -- Create new element node with an associated namespace
DomDocument->create_element -- Create new element node
DomDocument->create_entity_reference --
DomDocument->create_processing_instruction -- Creates new PI node
DomDocument->create_text_node -- Create new text node
DomDocument->doctype -- Returns the document type
DomDocument->document_element -- Returns root element node
DomDocument->dump_file -- Dumps the internal XML tree back into a file
DomDocument->dump_mem -- Dumps the internal XML tree back into a string
DomDocument->get_element_by_id -- Searches for an element with a certain id
DomDocument->get_elements_by_tagname --
DomDocument->html_dump_mem -- Dumps the internal XML tree back into a string as HTML
DomDocument->xinclude -- Substitutes XIncludes in a DomDocument Object.
DomDocumentType->entities -- Returns list of entities
DomDocumentType->internal_subset -- Returns internal subset
DomDocumentType->name -- Returns name of document type
DomDocumentType->notations -- Returns list of notations
DomDocumentType->public_id -- Returns public id of document type
DomDocumentType->system_id -- Returns system id of document type
DomElement->get_attribute_node -- Returns value of attribute
DomElement->get_attribute -- Returns value of attribute
DomElement->get_elements_by_tagname -- Gets elements by tagname
DomElement->has_attribute -- Checks to see if attribute exists
DomElement->remove_attribute -- Removes attribute
DomElement->set_attribute -- Adds new attribute
DomElement->tagname -- Returns name of element
DomNode->add_namespace -- Adds a namespace declaration to a node.
DomNode->append_child -- Adds new child at the end of the children
DomNode->append_sibling -- Adds new sibling to a node
DomNode->attributes -- Returns list of attributes
DomNode->child_nodes -- Returns children of node
DomNode->clone_node -- Clones a node
DomNode->dump_node -- Dumps a single node
DomNode->first_child -- Returns first child of node
DomNode->get_content -- Gets content of node
DomNode->has_attributess -- Checks if node has attributes
DomNode->has_child_nodes -- Checks if node has children
DomNode->insert_before -- Inserts new node as child
DomNode->is_blank_node -- Checks if node is blank
DomNode->last_child -- Returns last child of node
DomNode->next_sibling -- Returns the next sibling of node
DomNode->node_name -- Returns name of node
DomNode->node_type -- Returns type of node
DomNode->node_value -- Returns value of a node
DomNode->owner_document -- Returns the document this node belongs to
DomNode->parent_node -- Returns the parent of the node
DomNode->prefix -- Returns name space prefix of node
DomNode->previous_sibling -- Returns the previous sibling of node
DomNode->remove_child -- Removes child from list of children
DomNode->replace_child -- Replaces a child
DomNode->replace_node -- Replaces node
DomNode->set_content -- Sets content of node
DomNode->set_name -- Sets name of node
DomNode->set_namespace -- Sets namespace of a node.
DomNode->unlink_node -- Deletes node
DomProcessingInstruction->data -- Returns data of pi node
DomProcessingInstruction->target -- Returns target of pi node
DomXsltStylesheet->process -- Applies the XSLT-Transformation on a DomDocument Object.
domxml_new_doc -- Creates new empty XML document
domxml_open_file -- Creates a DOM object from XML file
domxml_open_mem -- Creates a DOM object of an XML document
domxml_version -- Get XML library version
domxml_xmltree -- Creates a tree of PHP objects from an XML document
domxml_xslt_stylesheet_doc -- Creates a DomXsltStylesheet Object from a DomDocument Object.
domxml_xslt_stylesheet_file -- Creates a DomXsltStylesheet Object from a xsl document in a file.
domxml_xslt_stylesheet -- Creates a DomXsltStylesheet Object from a xml document in a string.
xpath_eval_expression -- Evaluates the XPath Location Path in the given string
xpath_eval -- Evaluates the XPath Location Path in the given string
xpath_new_context -- Creates new xpath context
xptr_eval -- Evaluate the XPtr Location Path in the given string
xptr_new_context -- Create new XPath Context
上一頁 | 首頁 | 下一頁
rewinddir | 上一層 | DomAttribute->name


.NET functions

PHP 手冊
上一頁 下一頁

XXVI. .NET functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
dotnet_load -- Loads a DOTNET module
上一頁 | 首頁 | 下一頁
xptr_new_context | 上一層 | dotnet_load


Error Handling and Logging Functions

PHP 手冊
上一頁 下一頁

XXVII. Error Handling and Logging Functions

介紹

These are functions dealing with error handling and logging. They allow you to define your own error handling rules, as well as modify the way the errors can be logged. This allows you to change and enhance error reporting to suit your needs.

With the logging functions, you can send messages directly to other machines, to an email (or email to pager gateway!), to system logs, etc., so you can selectively log and monitor the most important parts of your applications and websites.

The error reporting functions allow you to customize what level and kind of error feedback is given, ranging from simple notices to customized functions returned during errors.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Errors and Logging Configuration Options

Name | Default | Changeable
error_reporting | E_ALL & ~E_NOTICE | PHP_INI_ALL
display_errors | "1" | PHP_INI_ALL
display_startup_errors | "0" | PHP_INI_ALL
log_errors | "0" | PHP_INI_ALL
log_errors_max_len | "1024" | PHP_INI_ALL
ignore_repeated_errors | "0" | PHP_INI_ALL
ignore_repeated_source | "0" | PHP_INI_ALL
report_memleaks | "1" | PHP_INI_SYSTEM
track_errors | "0" | PHP_INI_ALL
html_errors | "1" | PHP_INI_ALL
docref_root | "http://www.php.net/" | PHP_INI_ALL
docref_ext | ".html" | PHP_INI_ALL
error_prepend_string | NULL | PHP_INI_ALL
error_append_string | NULL | PHP_INI_ALL
error_log | NULL | PHP_INI_ALL
warn_plus_overloading | NULL | PHP_INI??
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

error_reporting integer

Set the error reporting level. The parameter is either an integer representing a bit field, or named constants. The error_reporting levels and constants are described in Predefined Constants, and in php.ini. To set at runtime, use the error_reporting() function. See also the display_errors directive.

In PHP 4 the default value does not show E_NOTICE level errors. You may want to show them during development.

註: Enabling E_NOTICE during development has some benefits. For debugging purposes: NOTICE messages will warn you about possibls bugs in your code. For example, use of unassigned values are warned. It is extremely useful to find typos and to save time for debugging. NOTICE messages will warn you about bad style. For example, $arr[item] is better to be written as $arr['item'] since PHP tries to treat "item" as constant. If it is not a constant, PHP assumes it is a string index for the array.

In PHP 3, the default setting is (E_ERROR | E_WARNING | E_PARSE), meaning the same thing. Note, however, that since constants are not supported in PHP 3's php3.ini, the error_reporting setting there must be numeric; hence, it is 7.

display_errors boolean

This determines whether errors should be printed to the screen as part of the HTML output or not.

display_startup_errors boolean

Even when display_errors is on, errors that occur during PHP's startup sequence are not displayed. It's strongly recommended to keep display_startup_errors off, except for debugging.

log_errors boolean

Tells whether script error messages should be logged to the server's error log or error_log. This option is thus server-specific.

註: You're strongly advised to use error logging in place of error displaying on production web sites.

log_errors_max_len integer

Set the maximum length of log_errors in kbytes. In error_log information about the source is added. The default is 1024 and 0 allows to not apply any maximum length at all.

ignore_repeated_errors boolean

Do not log repeated messages. Repeated errors must occur in the same file on the same line until ignore_repeated_source is set true.

ignore_repeated_source boolean

Ignore source of message when ignoring repeated messages. When this setting is On you will not log errors with repeated messages from different files or sourcelines.

report_memleaks boolean

If this parameter is set to Off, then memory leaks will not be shown (on stdout or in the log). This has only effect in a debug compile, and if error_reporting includes E_WARNING in the allowed list

track_errors boolean

If enabled, the last error message will always be present in the variable $php_errormsg.

html_errors boolean

Turn off HTML tags in error messages. The new format for html errors produces clickable messages that direct the user to a page describing the error or function in causing the error. These references are affected by docref_root and docref_ext.

docref_root string

The new error format contains a reference to a page describing the error or function in causing the error. In case of manual pages you can download the manual in your language and set this ini directive to the url of your local copy. If your local copy of the manual can be reached by '/manual/' you can simply use docref_root=/manual/. Additional you have to set docref_ext to match the fileextensions of your copy docref_ext=.html. It is possible to use external references. For example you can use docref_root=http://manual/en/ or docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon&url=http%3A%2F%2Fwww.php.net%2F"

Most of the time you want the docref_root value to end with a slash '/'. But see the second example above which does not have nor need it.

docref_ext string

See docref_root.

註: The value of docref_ext must begin with a dot '.'.

error_prepend_string string

String to output before an error message.

error_append_string string

String to output after an error message.

error_log string

Name of the file where script errors should be logged. If the special value syslog is used, the errors are sent to the system logger instead. On UNIX, this means syslog(3) and on Windows NT it means the event log. The system logger is not supported on Windows 95. See also: syslog().

warn_plus_overloading boolean

If enabled, this option makes PHP output a warning when the plus (+) operator is used on strings. This is to make it easier to find scripts that need to be rewritten to using the string concatenator instead (.).

預定義常數

這裡列出的所有常數將作為 PHP 核心的一部分一直有效。

註: You may use these constant names in php.ini but not outside of PHP, like in httpd.conf, where you'd use the bitmask values instead.

表格 2. Errors and Logging

Value | Constant | Description | Note
1 | E_ERROR (integer) | Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted. |
2 | E_WARNING (integer) | Run-time warnings (non-fatal errors). Execution of the script is not halted. |
4 | E_PARSE (integer) | Compile-time parse errors. Parse errors should only be generated by the parser. |
8 | E_NOTICE (integer) | Run-time notices. Indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script. |
16 | E_CORE_ERROR (integer) | Fatal errors that occur during PHP's initial startup. This is like an E_ERROR, except it is generated by the core of PHP. | PHP 4 only
32 | E_CORE_WARNING (integer) | Warnings (non-fatal errors) that occur during PHP's initial startup. This is like an E_WARNING, except it is generated by the core of PHP. | PHP 4 only
64 | E_COMPILE_ERROR (integer) | Fatal compile-time errors. This is like an E_ERROR, except it is generated by the Zend Scripting Engine. | PHP 4 only
128 | E_COMPILE_WARNING (integer) | Compile-time warnings (non-fatal errors). This is like an E_WARNING, except it is generated by the Zend Scripting Engine. | PHP 4 only
256 | E_USER_ERROR (integer) | User-generated error message. This is like an E_ERROR, except it is generated in PHP code by using the PHP function trigger_error(). | PHP 4 only
512 | E_USER_WARNING (integer) | User-generated warning message. This is like an E_WARNING, except it is generated in PHP code by using the PHP function trigger_error(). | PHP 4 only
1024 | E_USER_NOTICE (integer) | User-generated notice message. This is like an E_NOTICE, except it is generated in PHP code by using the PHP function trigger_error(). | PHP 4 only
2047 | E_ALL (integer) | All errors and warnings, as supported. |

The above values (either numerical or symbolic) are used to build up a bitmask that specifies which errors to report. You can use the bitwise operators to combine these values or mask out certain types of errors. Note that only '|', '~', '!', and '&' will be understood within php.ini, however, and that no bitwise operators will be understood within php3.ini.

範例

Below we can see an example of using the error handling capabilities in PHP. We define a error handling function which logs the information into a file (using an XML format), and e-mails the developer in case a critical error in the logic happens.

例子 1. Using error handling in a script

<?php
// we will do our own error handling
error_reporting(0);

// user defined error handling function
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
    // timestamp for the error entry
    $dt = date("Y-m-d H:i:s (T)");

    // define an assoc array of error string
    // in reality the only entries we should
    // consider are 2,8,256,512 and 1024
    $errortype = array (
                1   =>  "Error",
                2   =>  "Warning",
                4   =>  "Parsing Error",
                8   =>  "Notice",
                16  =>  "Core Error",
                32  =>  "Core Warning",
                64  =>  "Compile Error",
                128 =>  "Compile Warning",
                256 =>  "User Error",
                512 =>  "User Warning",
                1024=>  "User Notice"
                );
    // set of errors for which a var trace will be saved
    $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);

    $err = "<errorentry>\n";
    $err .= "\t<datetime>".$dt."</datetime>\n";
    $err .= "\t<errornum>".$errno."</errornum>\n";
    $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n";
    $err .= "\t<errormsg>".$errmsg."</errormsg>\n";
    $err .= "\t<scriptname>".$filename."</scriptname>\n";
    $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n";

    if (in_array($errno, $user_errors))
        $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
    $err .= "</errorentry>\n\n";

    // for testing
    // echo $err;

    // save to the error log, and e-mail me if there is a critical user error
    error_log($err, 3, "/usr/local/php4/error.log");
    if ($errno == E_USER_ERROR)
        mail("phpdev@example.com","Critical User Error",$err);
}

function distance ($vect1, $vect2) {
    if (!is_array($vect1) || !is_array($vect2)) {
        trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
        return NULL;
    }

    if (count($vect1) != count($vect2)) {
        trigger_error("Vectors need to be of the same size", E_USER_ERROR);
        return NULL;
    }

    for ($i=0; $i<count($vect1); $i++) {
        $c1 = $vect1[$i]; $c2 = $vect2[$i];
        $d = 0.0;
        if (!is_numeric($c1)) {
            trigger_error("Coordinate $i in vector 1 is not a number, using zero",
                            E_USER_WARNING);
            $c1 = 0.0;
        }
        if (!is_numeric($c2)) {
            trigger_error("Coordinate $i in vector 2 is not a number, using zero",
                            E_USER_WARNING);
            $c2 = 0.0;
        }
        $d += $c2*$c2 - $c1*$c1;
    }
    return sqrt($d);
}

$old_error_handler = set_error_handler("userErrorHandler");

// undefined constant, generates a warning
$t = I_AM_NOT_DEFINED;

// define some "vectors"
$a = array(2,3,"foo");
$b = array(5.5, 4.3, -1.6);
$c = array (1,-3);

// generate a user error
$t1 = distance($c,$b)."\n";

// generate another user error
$t2 = distance($b,"i am not an array")."\n";

// generate a warning
$t3 = distance($a,$b)."\n";

?>

相關參考

See also syslog().

目錄
error_log -- send an error message somewhere
error_reporting -- set which PHP errors are reported
restore_error_handler -- Restores the previous error handler function
set_error_handler -- Sets a user-defined error handler function.
trigger_error -- Generates a user-level error/warning/notice message
user_error -- Generates a user-level error/warning/notice message
上一頁 | 首頁 | 下一頁
dotnet_load | 上一層 | error_log


Program Execution functions

PHP 手冊
上一頁 下一頁

LXXXIII. Program Execution functions

介紹

Those functions provides means to executes commands on the system itself, and means secure such commands.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

相關參考

Those functions are also closely related to the backtick operator.

目錄
escapeshellarg -- escape a string to be used as a shell argument
escapeshellcmd -- escape shell metacharacters
exec -- Execute an external program
passthru -- Execute an external program and display raw output
proc_close -- Close a process opened by proc_open and return the exit code of that process.
proc_open -- Execute a command and open file pointers for input/output
shell_exec -- Execute command via shell and return complete output as string
system -- Execute an external program and display output
上一頁 | 首頁 | 下一頁
pcntl_wtermsig | 上一層 | escapeshellarg


FrontBase Functions

PHP 手冊
上一頁 下一頁

XXVIII. FrontBase Functions

介紹

These functions allow you to access FrontBase database servers. More information about FrontBase can be found at http://www.frontbase.com/.

Documentation for FrontBase can be found at http://www.frontbase.com/cgi-bin/WebObjects/FrontBase.woa/wa/productsPage?currentPage=Documentation.

Frontbase support has been added to PHP 4.0.6.

需求

You must install the FrontBase database server or at least the fbsql client libraries to use this functions. You can get FrontBase from http://www.frontbase.com/.

安裝

In order to have these functions available, you must compile PHP with fbsql support by using the --with-fbsql option. If you use this option without specifying the path to fbsql, PHP will search for the fbsql client libraries in the default installation location for the platform. Users who installed FrontBase in a non standard directory should always specify the path to fbsql: --with-fbsql=/path/to/fbsql. This will force PHP to use the client libraries installed by FrontBase, avoiding any conflicts.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. FrontBase configuration options

Name | Default | Changeable
fbsql.allow_persistent | "1" | PHP_INI_SYSTEM
fbsql.generate_warnings | "0" | PHP_INI_SYSTEM
fbsql.autocommit | "1" | PHP_INI_SYSTEM
fbsql.max_persistent | "-1" | PHP_INI_SYSTEM
fbsql.max_links | "128" | PHP_INI_SYSTEM
fbsql.max_connections | "128" | PHP_INI_SYSTEM
fbsql.max_results | "128" | PHP_INI_SYSTEM
fbsql.batchSize | "1000" | PHP_INI_SYSTEM
fbsql.default_host | NULL | PHP_INI_SYSTEM
fbsql.default_user | "_SYSTEM" | PHP_INI_SYSTEM
fbsql.default_password | "" | PHP_INI_SYSTEM
fbsql.default_database | "" | PHP_INI_SYSTEM
fbsql.default_database_password | "" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

FBSQL_ASSOC (integer)

FBSQL_NUM (integer)

FBSQL_BOTH (integer)

FBSQL_LOCK_DEFERRED (integer)

FBSQL_LOCK_OPTIMISTIC (integer)

FBSQL_LOCK_PESSIMISTIC (integer)

FBSQL_ISO_READ_UNCOMMITTED (integer)

FBSQL_ISO_READ_COMMITTED (integer)

FBSQL_ISO_REPEATABLE_READ (integer)

FBSQL_ISO_SERIALIZABLE (integer)

FBSQL_ISO_VERSIONED (integer)

FBSQL_UNKNOWN (integer)

FBSQL_STOPPED (integer)

FBSQL_STARTING (integer)

FBSQL_RUNNING (integer)

FBSQL_STOPPING (integer)

FBSQL_NOEXEC (integer)

FBSQL_LOB_DIRECT (integer)

FBSQL_LOB_HANDLE (integer)

目錄
fbsql_affected_rows -- Get number of affected rows in previous FrontBase operation
fbsql_autocommit -- Enable or disable autocommit
fbsql_change_user -- Change logged in user of the active connection
fbsql_close -- Close FrontBase connection
fbsql_commit -- Commits a transaction to the database
fbsql_connect -- Open a connection to a FrontBase Server
fbsql_create_blob -- Create a BLOB
fbsql_create_clob -- Create a CLOB
fbsql_create_db -- Create a FrontBase database
fbsql_data_seek -- Move internal result pointer
fbsql_database_password -- Sets or retrieves the password for a FrontBase database
fbsql_database -- Get or set the database name used with a connection
fbsql_db_query -- Send a FrontBase query
fbsql_db_status -- Get the status for a given database
fbsql_drop_db -- Drop (delete) a FrontBase database
fbsql_errno -- Returns the numerical value of the error message from previous FrontBase operation
fbsql_error -- Returns the text of the error message from previous FrontBase operation
fbsql_fetch_array -- Fetch a result row as an associative array, a numeric array, or both
fbsql_fetch_assoc -- Fetch a result row as an associative array
fbsql_fetch_field -- Get column information from a result and return as an object
fbsql_fetch_lengths -- Get the length of each output in a result
fbsql_fetch_object -- Fetch a result row as an object
fbsql_fetch_row -- Get a result row as an enumerated array
fbsql_field_flags -- Get the flags associated with the specified field in a result
fbsql_field_len -- Returns the length of the specified field
fbsql_field_name -- Get the name of the specified field in a result
fbsql_field_seek -- Set result pointer to a specified field offset
fbsql_field_table -- Get name of the table the specified field is in
fbsql_field_type -- Get the type of the specified field in a result
fbsql_free_result -- Free result memory
fbsql_get_autostart_info -- No description given yet
fbsql_hostname -- Get or set the host name used with a connection
fbsql_insert_id -- Get the id generated from the previous INSERT operation
fbsql_list_dbs -- List databases available on a FrontBase server
fbsql_list_fields -- List FrontBase result fields
fbsql_list_tables -- List tables in a FrontBase database
fbsql_next_result -- Move the internal result pointer to the next result
fbsql_num_fields -- Get number of fields in result
fbsql_num_rows -- Get number of rows in result
fbsql_password -- Get or set the user password used with a connection
fbsql_pconnect -- Open a persistent connection to a FrontBase Server
fbsql_query -- Send a FrontBase query
fbsql_read_blob -- Read a BLOB from the database
fbsql_read_clob -- Read a CLOB from the database
fbsql_result -- Get result data
fbsql_rollback -- Rollback a transaction to the database
fbsql_select_db -- Select a FrontBase database
fbsql_set_lob_mode -- Set the LOB retrieve mode for a FrontBase result set
fbsql_set_transaction -- Set the transaction locking and isolation
fbsql_start_db -- Start a database on local or remote server
fbsql_stop_db -- Stop a database on local or remote server
fbsql_tablename -- Get table name of field
fbsql_username -- Get or set the host user used with a connection
fbsql_warnings -- Enable or disable FrontBase warnings
上一頁 | 首頁 | 下一頁
user_error | 上一層 | fbsql_affected_rows


Forms Data Format functions

PHP 手冊
上一頁 下一頁

XXXI. Forms Data Format functions

介紹

Forms Data Format (FDF) is a format for handling forms within PDF documents. You should read the documentation at http://partners.adobe.com/asn/developer/acrosdk/forms.html for more information on what FDF is and how it is used in general.

The general idea of FDF is similar to HTML forms. The difference is basically the format how data is transmitted to the server when the submit button is pressed (this is actually the Form Data Format) and the format of the form itself (which is the Portable Document Format, PDF). Processing the FDF data is one of the features provided by the fdf functions. But there is more. One may as well take an existing PDF form and populated the input fields with data without modifying the form itself. In such a case one would create a FDF document (fdf_create()) set the values of each input field (fdf_set_value()) and associate it with a PDF form (fdf_set_file()). Finally it has to be sent to the browser with MimeType application/vnd.fdf. The Acrobat reader plugin of your browser recognizes the MimeType, reads the associated PDF form and fills in the data from the FDF document.

If you look at an FDF-document with a text editor you will find a catalogue object with the name FDF. Such an object may contain a number of entries like Fields, F, Status etc.. The most commonly used entries are Fields which points to a list of input fields, and F which contains the filename of the PDF-document this data belongs to. Those entries are referred to in the FDF documentation as /F-Key or /Status-Key. Modifying this entries is done by functions like fdf_set_file() and fdf_set_status(). Fields are modified with fdf_set_value(), fdf_set_opt() etc..

需求

You need the FDF toolkit SDK available from http://partners.adobe.com/asn/developer/acrosdk/forms.html. As of PHP 4.3 you need at least SDK version 5.0. The FDF toolkit library is available in binary form only, platforms supported by Adobe are Win32, Linux, Solaris and AIX.

安裝

You must compile PHP with --with-fdftk[=DIR].

註: If you run into problems configuring PHP with fdftk support, check whether the header file fdftk.h and the library libfdftk.so are at the right place. The configure script supports both the directory structure of the FDF SDK distribution and the usual DIR/include / DIR/lib layout, so you can point it either directly to the unpacked distribution directory or put the header file and the appropriate library for your platform into e.g. /usr/local/include and /usr/local/lib and configure with --with-fdftk=/usr/local.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

fdf

Most fdf functions require a fdf resource as their first parameter. A fdf resource is a handle to an opened fdf file. fdf resources may be obtained using fdf_create(), fdf_open() and fdf_open_string().

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

FDFValue (integer)

FDFStatus (integer)

FDFFile (integer)

FDFID (integer)

FDFFf (integer)

FDFSetFf (integer)

FDFClearFf (integer)

FDFFlags (integer)

FDFSetF (integer)

FDFClrF (integer)

FDFAP (integer)

FDFAS (integer)

FDFAction (integer)

FDFAA (integer)

FDFAPRef (integer)

FDFIF (integer)

FDFEnter (integer)

FDFExit (integer)

FDFDown (integer)

FDFUp (integer)

FDFFormat (integer)

FDFValidate (integer)

FDFKeystroke (integer)

FDFCalculate (integer)

FDFNormalAP (integer)

FDFRolloverAP (integer)

FDFDownAP (integer)

範例

The following examples shows just the evaluation of form data.

例子 1. Evaluating a FDF document

<?php
// Open fdf from input string provided by the extension
// The pdf form contained several input text fields with the names
// volume, date, comment, publisher, preparer, and two checkboxes
// show_publisher and show_preparer.
$fdf = fdf_open_string($HTTP_FDF_DATA);
$volume = fdf_get_value($fdf, "volume");
echo "The volume field has the value '<B>$volume</B>'<BR>";

$date = fdf_get_value($fdf, "date");
echo "The date field has the value '<B>$date</B>'<BR>";

$comment = fdf_get_value($fdf, "comment");
echo "The comment field has the value '<B>$comment</B>'<BR>";

if(fdf_get_value($fdf, "show_publisher") == "On") {
  $publisher = fdf_get_value($fdf, "publisher");
  echo "The publisher field has the value '<B>$publisher</B>'<BR>";
} else
  echo "Publisher shall not be shown.<BR>";

if(fdf_get_value($fdf, "show_preparer") == "On") {
  $preparer = fdf_get_value($fdf, "preparer");
  echo "The preparer field has the value '<B>$preparer</B>'<BR>";
} else
  echo "Preparer shall not be shown.<BR>";
fdf_close($fdf);
?>

目錄
fdf_add_doc_javascript -- Adds javascript code to the FDF document
fdf_add_template -- Adds a template into the FDF document
fdf_close -- Close an FDF document
fdf_create -- Create a new FDF document
fdf_errno -- Return error code for last fdf operation
fdf_error -- Return error description for fdf error code
fdf_get_ap -- Get the appearance of a field
fdf_get_attachment -- Extracts uploaded file embedded in the FDF
fdf_get_encoding -- Get the value of the /Encoding key
fdf_get_file -- Get the value of the /F key
fdf_get_status -- Get the value of the /STATUS key
fdf_get_value -- Get the value of a field
fdf_get_version -- Gets version number for FDF api or file
fdf_header -- Sets FDF-specific output headers
fdf_next_field_name -- Get the next field name
fdf_open_string -- Read a FDF document from a string
fdf_open -- Open a FDF document
fdf_save_string -- Returns the FDF document as a string
fdf_save -- Save a FDF document
fdf_set_ap -- Set the appearance of a field
fdf_set_encoding -- Sets FDF character encoding
fdf_set_file -- Set PDF document to display FDF data in
fdf_set_flags -- Sets a flag of a field
fdf_set_javascript_action -- Sets an javascript action of a field
fdf_set_opt -- Sets an option of a field
fdf_set_status -- Set the value of the /STATUS key
fdf_set_submit_form_action -- Sets a submit form action of a field
fdf_set_target_frame -- Set target frame for form display
fdf_set_value -- Set the value of a field
fdf_set_version -- Sets version number for a FDF file
上一頁 | 首頁 | 下一頁
unlink | 上一層 | fdf_add_doc_javascript


filePro functions

PHP 手冊
上一頁 下一頁

XXIX. filePro functions

介紹

These functions allow read-only access to data stored in filePro databases.

filePro is a registered trademark of fP Technologies, Inc. You can find more information about filePro at http://www.fptech.com/.

目錄
filepro_fieldcount -- Find out how many fields are in a filePro database
filepro_fieldname -- Gets the name of a field
filepro_fieldtype -- Gets the type of a field
filepro_fieldwidth -- Gets the width of a field
filepro_retrieve -- Retrieves data from a filePro database
filepro_rowcount -- Find out how many rows are in a filePro database
filepro -- Read and verify the map file
上一頁 | 首頁 | 下一頁
fbsql_warnings | 上一層 | filepro_fieldcount


文件系統函式庫

PHP 手冊
上一頁 下一頁

XXX. 文件系統函式庫

介紹

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. 文件系統和流配置選項

名稱 | 預設值 | 作用範圍
allow_url_fopen | "1" | PHP_INI_ALL
user_agent | NULL | PHP_INI_ALL
default_socket_timeout | "60" | PHP_INI_ALL
from | NULL | ??
auto_detect_line_endings | "Off" | PHP_INI_ALL

這裡是對配置指令的一些簡單解說。

allow_url_fopen boolean

本選項啟動了 URL 形式的 fopen 封裝協議使得可以連接 URL 對象例如文件。預定的封裝協議提供用 ftp 和 http 協議來連接遠程文件，一些擴展庫例如 zlib 可能會註冊更多的封裝協議。

註: 本選項是版本 4.0.3 發行後立即引進的。4.0.3 以及以前的版本只能在編譯時通過配置項 --disable-url-fopen-wrapper 來取消此特性。

警告

Windows 版在 PHP 4.3 之前，下列函式不支援遠程文件連接：include()，include_once(), require()，require_once() 和 參考 XLI, Image functions 擴展庫中的 imagecreatefromXXX 函式。

user_agent string

定義 PHP 發送的 User-Agent。

default_socket_timeout integer

基於 socket 的流的預定超時時間（秒）。

註: 本配置參數是 PHP 4.3 引進的。

from="joe@example.com" string

定義匿名 ftp 的密碼（你的 email 位址）。

auto_detect_line_endings boolean

當設為 On 時，PHP 將檢查通過 fgets() 和 file() 取得的資料中的行結束符號是符合 Unix，MS-Dos，還是 Macintosh 的習慣。

這使得 PHP 可以和 Macintosh 系統交互操作，但是預設值是 Off，因為在檢測第一行的 EOL 習慣時會有很小的性能損失，而且在 Unix 系統下使用回車符號作為項目分隔符的人們會遭遇向下不相容的行為。

註: 本配置參數是 PHP 4.3 引進的。

資源型別

預定義常數

該擴展模塊未定義任何常數。

相關參考

相關函式參見目錄函式庫和程序執行函式庫小節。

目錄
basename -- 傳回路徑中的文件名部分
chgrp -- 改變文件所屬的組
chmod -- 改變文件模式
chown -- 改變文件的所有者
clearstatcache -- 清除文件狀態緩存
copy -- 拷貝文件
delete -- See unlink() or unset()
dirname -- 傳回路徑中的目錄部分
disk_free_space -- 傳回目錄中的可用空間
disk_total_space -- 傳回一個目錄的磁盤總大小
diskfreespace -- disk_free_space() 函式的別名
fclose -- 關閉一個已打開的文件指針
feof -- 測試文件指針是否到了文件結束的位置
fflush -- 將緩衝內容輸出到文件
fgetc -- 從文件指針中讀取字元
fgetcsv -- 從文件指針中讀入一行並解析 CSV 字段
fgets -- 從文件指針中讀取一行
fgetss -- 從文件指針中讀取一行並過濾掉 HTML 標記
file_exists -- 檢查文件是否存在
file_get_contents -- 將整個文件讀入一個字串
file -- 把整個文件讀入一個陣列中
fileatime -- 取得文件的上次連接時間
filectime -- 取得文件的 inode 修改時間
filegroup -- 取得文件的組
fileinode -- 取得文件的 inode
filemtime -- 取得文件修改時間
fileowner -- 取得文件的所有者
fileperms -- 取得文件的權限
filesize -- 取得文件大小
filetype -- 取得文件型別
flock -- Portable advisory file locking
fnmatch -- Match filename against a pattern
fopen -- Opens file or URL
fpassthru -- Output all remaining data on a file pointer
fputs -- Writes to a file pointer
fread -- Binary-safe file read
fscanf -- Parses input from a file according to a format
fseek -- Seeks on a file pointer
fstat -- Gets information about a file using an open file pointer
ftell -- Tells file pointer read/write position
ftruncate -- Truncates a file to a given length
fwrite -- Binary-safe file write
glob -- Find pathnames matching a pattern
is_dir -- Tells whether the filename is a directory
is_executable -- Tells whether the filename is executable
is_file -- Tells whether the filename is a regular file
is_link -- Tells whether the filename is a symbolic link
is_readable -- Tells whether the filename is readable
is_uploaded_file -- Tells whether the file was uploaded via HTTP POST
is_writable -- Tells whether the filename is writable
is_writeable -- Tells whether the filename is writable
link -- Create a hard link
linkinfo -- Gets information about a link
lstat -- Gives information about a file or symbolic link
mkdir -- Makes directory
move_uploaded_file -- Moves an uploaded file to a new location
parse_ini_file -- Parse a configuration file
pathinfo -- Returns information about a file path
pclose -- Closes process file pointer
popen -- Opens process file pointer
readfile -- Outputs a file
readlink -- Returns the target of a symbolic link
realpath -- Returns canonicalized absolute pathname
rename -- Renames a file
rewind -- Rewind the position of a file pointer
rmdir -- Removes directory
set_file_buffer -- Alias of stream_set_write_buffer()
stat -- Gives information about a file
stream_get_meta_data -- 從封裝協議文件指針中取得報頭／元資料
stream_register_wrapper -- 註冊一個用 PHP 類實現的 URL 封裝協議
stream_set_blocking -- Set blocking/non-blocking mode on a stream
stream_set_timeout -- Set timeout period on a stream
stream_set_write_buffer -- Sets file buffering on the given stream
symlink -- Creates a symbolic link
tempnam -- Create file with unique file name
tmpfile -- Creates a temporary file
touch -- Sets access and modification time of file
umask -- Changes the current umask
unlink -- Deletes a file
上一頁 | 首頁 | 下一頁
filepro | 上一層 | basename


FriBiDi functions

PHP 手冊
上一頁 下一頁

XXXII. FriBiDi functions

介紹

需求

安裝

執行時配置

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

FRIBIDI_CHARSET_UTF8 (integer)

FRIBIDI_CHARSET_8859_6 (integer)

FRIBIDI_CHARSET_8859_8 (integer)

FRIBIDI_CHARSET_CP1255 (integer)

FRIBIDI_CHARSET_CP1256 (integer)

FRIBIDI_CHARSET_ISIRI_3342 (integer)

目錄
fribidi_log2vis -- Convert a logical string to a visual one
上一頁 | 首頁 | 下一頁
fdf_set_version | 上一層 | fribidi_log2vis


FTP functions

PHP 手冊
上一頁 下一頁

XXXIII. FTP functions

介紹

The functions in this extension implement client access to file servers speaking the File Transfer Protocol (FTP) as defined in http://www.faqs.org/rfcs/rfc959.html.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

In order to use FTP functions with your PHP configuration, you should add the --enable-ftp option when installing PHP 4 or --with-ftp when using PHP 3.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

This extension uses one resource type, which is the link identifier of the FTP connection.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

FTP_ASCII (integer)

FTP_TEXT (integer)

FTP_BINARY (integer)

FTP_IMAGE (integer)

FTP_TIMEOUT_SEC (integer)

See ftp_set_option() for information.

The following constants were introduced in PHP 4.3.0.

FTP_AUTOSEEK (integer)

See ftp_set_option() for information.

FTP_AUTORESUME (integer)

Automatically determine resume position and start position for GET and PUT requests (only works if FTP_AUTOSEEK is enabled)

FTP_FAILED (integer)

Asynchronous transfer has failed

FTP_FINISHED (integer)

Asynchronous transfer has finished

FTP_MOREDATA (integer)

Asynchronous transfer is still active

範例

例子 1. FTP example

<?php
// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// check connection
if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        die;
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

// check upload status
if (!$upload) {
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }

// close the FTP stream
ftp_close($conn_id);
?>

目錄
ftp_cdup -- Changes to the parent directory
ftp_chdir -- Changes directories on a FTP server
ftp_close -- Closes an FTP connection
ftp_connect -- Opens an FTP connection
ftp_delete -- Deletes a file on the FTP server
ftp_exec -- Requests execution of a program on the FTP server
ftp_fget -- Downloads a file from the FTP server and saves to an open file
ftp_fput -- Uploads from an open file to the FTP server
ftp_get_option -- Retrieves various runtime behaviours of the current FTP stream
ftp_get -- Downloads a file from the FTP server
ftp_login -- Logs in to an FTP connection
ftp_mdtm -- Returns the last modified time of the given file
ftp_mkdir -- Creates a directory
ftp_nb_continue -- Continues retrieving/sending a file (non-blocking)
ftp_nb_fget -- Retrieves a file from the FTP server and writes it to an open file (non-blocking)
ftp_nb_fput -- Stores a file from an open file to the FTP server (non-blocking)
ftp_nb_get -- Retrieves a file from the FTP server and writes it to a local file (non-blocking)
ftp_nb_put -- Stores a file on the FTP server (non-blocking)
ftp_nlist -- Returns a list of files in the given directory
ftp_pasv -- Turns passive mode on or off
ftp_put -- Uploads a file to the FTP server
ftp_pwd -- Returns the current directory name
ftp_quit -- Closes an FTP connection
ftp_rawlist -- Returns a detailed list of files in the given directory
ftp_rename -- Renames a file on the FTP server
ftp_rmdir -- Removes a directory
ftp_set_option -- Set miscellaneous runtime FTP options
ftp_site -- Sends a SITE command to the server
ftp_size -- Returns the size of the given file
ftp_systype -- Returns the system type identifier of the remote FTP server
上一頁 | 首頁 | 下一頁
fribidi_log2vis | 上一層 | ftp_cdup


Function Handling functions

PHP 手冊
上一頁 下一頁

XXXIV. Function Handling functions

介紹

These functions all handle various operations involved in working with functions.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

預定義常數

該擴展模塊未定義任何常數。

目錄
call_user_func_array -- Call a user function given with an array of parameters
call_user_func -- Call a user function given by the first parameter
create_function -- Create an anonymous (lambda-style) function
func_get_arg -- Return an item from the argument list
func_get_args -- Returns an array comprising a function's argument list
func_num_args -- Returns the number of arguments passed to the function
function_exists -- Return TRUE if the given function has been defined
get_defined_functions -- Returns an array of all defined functions
register_shutdown_function -- Register a function for execution on shutdown
register_tick_function -- Register a function for execution on each tick
unregister_tick_function -- De-register a function for execution on each tick
上一頁 | 首頁 | 下一頁
ftp_systype | 上一層 | call_user_func_array


Gettext

PHP 手冊
上一頁 下一頁

XXXV. Gettext

介紹

The gettext functions implement an NLS (Native Language Support) API which can be used to internationalize your PHP applications. Please see the gettext documentation for your system for a thorough explanation of these functions or view the docs at http://www.gnu.org/manual/gettext/index.html.

需求

To use these functions you must download and install the GNU gettext package from http://www.gnu.org/software/gettext/gettext.html

安裝

To include GNU gettext support in your PHP build you must add the option --with-gettext[=DIR] where DIR is the gettext install directory, defaults to /usr/local.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
bind_textdomain_codeset -- Specify the character encoding in which the messages from the DOMAIN message catalog will be returned
bindtextdomain -- Sets the path for a domain
dcgettext -- Overrides the domain for a single lookup
dcngettext -- Plural version of dcgettext
dgettext -- Override the current domain
dngettext -- Plural version of dgettext
gettext -- Lookup a message in the current domain
ngettext -- Plural version of gettext
textdomain -- Sets the default domain
上一頁 | 首頁 | 下一頁
unregister_tick_function | 上一層 | bind_textdomain_codeset


GMP functions

PHP 手冊
上一頁 下一頁

XXXVI. GMP functions

介紹

These functions allow you to work with arbitrary-length integers using the GNU MP library.

These functions have been added in PHP 4.0.4.

註: Most GMP functions accept GMP number arguments, defined as resource below. However, most of these functions will also accept numeric and string arguments, given that it is possible to convert the latter to a number. Also, if there is a faster function that can operate on integer arguments, it would be used instead of the slower function when the supplied arguments are integers. This is done transparently, so the bottom line is that you can use integers in every function that expects GMP number. See also the gmp_init() function.

警告

If you want to explicitly specify a large integer, specify it as a string. If you don't do that, PHP will interpret the integer-literal first, possibly resulting in loss of precision, even before GMP comes into play.

需求

You can download the GMP library from http://www.swox.com/gmp/. This site also has the GMP manual available.

You will need GMP version 2 or better to use these functions. Some functions may require more recent version of the GMP library.

安裝

In order to have these functions available, you must compile PHP with GMP support by using the --with-gmp option.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

GMP_ROUND_ZERO (integer)

GMP_ROUND_PLUSINF (integer)

GMP_ROUND_MINUSINF (integer)

範例

例子 1. Factorial function using GMP

<?php
function fact ($x) {
    if ($x <= 1)
        return 1;
    else
        return gmp_mul ($x, fact ($x-1));
}

print gmp_strval (fact (1000)) . "\n";
?>

This will calculate factorial of 1000 (pretty big number) very fast.

相關參考

More mathmatical functions can be found in the sections BCMath Arbitrary Precision Mathematics Functions and Mathematical Functions.

目錄
gmp_abs -- Absolute value
gmp_add -- Add numbers
gmp_and -- Logical AND
gmp_clrbit -- Clear bit
gmp_cmp -- Compare numbers
gmp_com -- Calculates one's complement of a
gmp_div_q -- Divide numbers
gmp_div_qr -- Divide numbers and get quotient and remainder
gmp_div_r -- Remainder of the division of numbers
gmp_div -- Divide numbers
gmp_divexact -- Exact division of numbers
gmp_fact -- Factorial
gmp_gcd -- Calculate GCD
gmp_gcdext -- Calculate GCD and multipliers
gmp_hamdist -- Hamming distance
gmp_init -- Create GMP number
gmp_intval -- Convert GMP number to integer
gmp_invert -- Inverse by modulo
gmp_jacobi -- Jacobi symbol
gmp_legendre -- Legendre symbol
gmp_mod -- Modulo operation
gmp_mul -- Multiply numbers
gmp_neg -- Negate number
gmp_or -- Logical OR
gmp_perfect_square -- Perfect square check
gmp_popcount -- Population count
gmp_pow -- Raise number into power
gmp_powm -- Raise number into power with modulo
gmp_prob_prime -- Check if number is "probably prime"
gmp_random -- Random number
gmp_scan0 -- Scan for 0
gmp_scan1 -- Scan for 1
gmp_setbit -- Set bit
gmp_sign -- Sign of number
gmp_sqrt -- Square root
gmp_sqrtrm -- Square root with remainder
gmp_strval -- Convert GMP number to string
gmp_sub -- Subtract numbers
gmp_xor -- Logical XOR
上一頁 | 首頁 | 下一頁
textdomain | 上一層 | gmp_abs


HTTP functions

PHP 手冊
上一頁 下一頁

XXXVII. HTTP functions

介紹

These functions let you manipulate the output sent back to the remote browser right down to the HTTP protocol level.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
header -- Send a raw HTTP header
headers_sent -- Returns TRUE if headers have been sent
setcookie -- Send a cookie
上一頁 | 首頁 | 下一頁
gmp_xor | 上一層 | header


Hyperwave API functions

PHP 手冊
上一頁 下一頁

XXXIX. Hyperwave API functions

介紹

Hyperwave has been developed at IICM in Graz. It started with the name Hyper-G and changed to Hyperwave when it was commercialised (in 1996).

Hyperwave is not free software. The current version, 5.5, is available at http://www.hyperwave.com/. A time limited version can be ordered for free (30 days).

See also the Hyperwave module.

Hyperwave is an information system similar to a database (HIS, Hyperwave Information Server). Its focus is the storage and management of documents. A document can be any possible piece of data that may as well be stored in file. Each document is accompanied by its object record. The object record contains meta data for the document. The meta data is a list of attributes which can be extended by the user. Certain attributes are always set by the Hyperwave server, other may be modified by the user.

需求

Since 2001 there is a Hyperwave SDK available. It supports Java, JavaScript and C++. This PHP Extension is based on the C++ interface. In order to activate the hwapi support in PHP you will have to install the Hyperwave SDK first.

安裝

After installing the Hyperwave SDK, configure PHP with --with-hwapi=<dir$gt;.

Integration with Apache

The integration with Apache and possible other servers is already described in the Hyperwave module which has been the first extension to connect a Hyperwave Server.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Hyperwave API configuration options

Name | Default | Changeable
hwapi.allow_persistent | "0" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

Classes

The API provided by the HW_API extension is fully object oriented. It is very similar to the C++ interface of the Hyperwave SDK. It consist of the following classes.

  • HW_API

  • HW_API_Object

  • HW_API_Attribute

  • HW_API_Error

  • HW_API_Content

  • HW_API_Reason

Some basic classes like HW_API_String, HW_API_String_Array, etc., which exist in the Hyperwave SDK have not been implemented since PHP has powerful replacements for them.

Each class has certain method, whose names are identical to its counterparts in the Hyperwave SDK. Passing arguments to this function differs from all the other PHP extensions but is close to the C++ API of the HW SDK. Instead of passing serval parameters they are all put into an associated array and passed as one paramter. The names of the keys are identical to those documented in the HW SDK. The common parameters are listed below. If other parameters are required they will be documented if needed.

  • objectIdentifier The name or id of an object, e.g. "rootcollection", "0x873A8768 0x00000002".

  • parentIdentifier The name or id of an object which is considered to be a parent.

  • object An instance of class HW_API_Object.

  • parameters An instance of class HW_API_Object.

  • version The version of an object.

  • mode An integer value determine the way an operation is executed.

  • attributeSelector Any array of strings, each containing a name of an attribute. This is used if you retrieve the object record and want to include certain attributes.

  • objectQuery A query to select certain object out of a list of objects. This is used to reduce the number of objects which was delivered by a function like hw_api->children() or hw_api->find().

目錄
hw_api_attribute->key -- Returns key of the attribute
hw_api_attribute->langdepvalue -- Returns value for a given language
hw_api_attribute->value -- Returns value of the attribute
hw_api_attribute->values -- Returns all values of the attribute
hw_api_attribute -- Creates instance of class hw_api_attribute
hw_api->checkin -- Checks in an object
hw_api->checkout -- Checks out an object
hw_api->children -- Returns children of an object
hw_api_content->mimetype -- Returns mimetype
hw_api_content->read -- Read content
hw_api->content -- Returns content of an object
hw_api->copy -- Copies physically
hw_api->dbstat -- Returns statistics about database server
hw_api->dcstat -- Returns statistics about document cache server
hw_api->dstanchors -- Returns a list of all destination anchors
hw_api->dstofsrcanchors -- Returns destination of a source anchor
hw_api_error->count -- Returns number of reasons
hw_api_error->reason -- Returns reason of error
hw_api->find -- Search for objects
hw_api->ftstat -- Returns statistics about fulltext server
hwapi_hgcsp -- Returns object of class hw_api
hw_api->hwstat -- Returns statistics about Hyperwave server
hw_api->identify -- Log into Hyperwave Server
hw_api->info -- Returns information about server configuration
hw_api->insert -- Inserts a new object
hw_api->insertanchor -- Inserts a new object of type anchor
hw_api->insertcollection -- Inserts a new object of type collection
hw_api->insertdocument -- Inserts a new object of type document
hw_api->link -- Creates a link to an object
hw_api->lock -- Locks an object
hw_api->move -- Moves object between collections
hw_api_content -- Create new instance of class hw_api_content
hw_api_object->assign -- Clones object
hw_api_object->attreditable -- Checks whether an attribute is editable
hw_api_object->count -- Returns number of attributes
hw_api_object->insert -- Inserts new attribute
hw_api_object -- Creates a new instance of class hw_api_object
hw_api_object->remove -- Removes attribute
hw_api_object->title -- Returns the title attribute
hw_api_object->value -- Returns value of attribute
hw_api->object -- Retrieve attribute information
hw_api->objectbyanchor -- Returns the object an anchor belongs to
hw_api->parents -- Returns parents of an object
hw_api_reason->description -- Returns description of reason
hw_api_reason->type -- Returns type of reason
hw_api->remove -- Delete an object
hw_api->replace -- Replaces an object
hw_api->setcommitedversion -- Commits version other than last version
hw_api->srcanchors -- Returns a list of all source anchors
hw_api->srcsofdst -- Returns source of a destination object
hw_api->unlock -- Unlocks a locked object
hw_api->user -- Returns the own user object
hw_api->userlist -- Returns a list of all logged in users
上一頁 | 首頁 | 下一頁
hw_Who | 上一層 | hw_api_attribute->key


Hyperwave functions

PHP 手冊
上一頁 下一頁

XXXVIII. Hyperwave functions

介紹

Hyperwave has been developed at IICM in Graz. It started with the name Hyper-G and changed to Hyperwave when it was commercialised (in 1996).

Hyperwave is not free software. The current version, 5.5 is available at http://www.hyperwave.com/. A time limited version can be ordered for free (30 days).

See also the Hyperwave API module.

Hyperwave is an information system similar to a database (HIS, Hyperwave Information Server). Its focus is the storage and management of documents. A document can be any possible piece of data that may as well be stored in file. Each document is accompanied by its object record. The object record contains meta data for the document. The meta data is a list of attributes which can be extended by the user. Certain attributes are always set by the Hyperwave server, other may be modified by the user. An attribute is a name/value pair of the form name=value. The complete object record contains as many of those pairs as the user likes. The name of an attribute does not have to be unique, e.g. a title may appear several times within an object record. This makes sense if you want to specify a title in several languages. In such a case there is a convention, that each title value is preceded by the two letter language abbreviation followed by a colon, e.g. 'en:Title in English' or 'ge:Titel in deutsch'. Other attributes like a description or keywords are potential candidates. You may also replace the language abbreviation by any other string as long as it separated by colon from the rest of the attribute value.

Each object record has native a string representation with each name/value pair separated by a newline. The Hyperwave extension also knows a second representation which is an associated array with the attribute name being the key. Multilingual attribute values itself form another associated array with the key being the language abbreviation. Actually any multiple attribute forms an associated array with the string left to the colon in the attribute value being the key. (This is not fully implemented. Only the attributes Title, Description and Keyword are treated properly yet.)

Besides the documents, all hyper links contained in a document are stored as object records as well. Hyper links which are in a document will be removed from it and stored as individual objects, when the document is inserted into the database. The object record of the link contains information about where it starts and where it ends. In order to gain the original document you will have to retrieve the plain document without the links and the list of links and reinsert them. The functions hw_pipedocument() and hw_gettext() do this for you. The advantage of separating links from the document is obvious. Once a document to which a link is pointing to changes its name, the link can easily be modified accordingly. The document containing the link is not affected at all. You may even add a link to a document without modifying the document itself.

Saying that hw_pipedocument() and hw_gettext() do the link insertion automatically is not as simple as it sounds. Inserting links implies a certain hierarchy of the documents. On a web server this is given by the file system, but Hyperwave has its own hierarchy and names do not reflect the position of an object in that hierarchy. Therefore creation of links first of all requires a mapping from the Hyperwave hierarchy and namespace into a web hierarchy respective web namespace. The fundamental difference between Hyperwave and the web is the clear distinction between names and hierarchy in Hyperwave. The name does not contain any information about the objects position in the hierarchy. In the web the name also contains the information on where the object is located in the hierarchy. This leads to two possibles ways of mapping. Either the Hyperwave hierarchy and name of the Hyperwave object is reflected in the URL or the name only. To make things simple the second approach is used. Hyperwave object with name my_object is mapped to http://host/my_object disregarding where it resides in the Hyperwave hierarchy. An object with name parent/my_object could be the child of my_object in the Hyperwave hierarchy, though in a web namespace it appears to be just the opposite and the user might get confused. This can only be prevented by selecting reasonable object names.

Having made this decision a second problem arises. How do you involve PHP? The URL http://host/my_object will not call any PHP script unless you tell your web server to rewrite it to e.g. http://host/php_script/my_object and the script php_script evaluates the $PATH_INFO variable and retrieves the object with name my_object from the Hyperwave server. Their is just one little drawback which can be fixed easily. Rewriting any URL would not allow any access to other document on the web server. A PHP script for searching in the Hyperwave server would be impossible. Therefore you will need at least a second rewriting rule to exclude certain URLs like all e.g. starting with http://host/Hyperwave This is basically sharing of a namespace by the web and Hyperwave server.

Based on the above mechanism links are insert into documents.

It gets more complicated if PHP is not run as a server module or CGI script but as a standalone application e.g. to dump the content of the Hyperwave server on a CD-ROM. In such a case it makes sense to retain the Hyperwave hierarchy and map in onto the file system. This conflicts with the object names if they reflect its own hierarchy (e.g. by choosing names including '/'). Therefore '/' has to be replaced by another character, e.g. '_'.

The network protocol to communicate with the Hyperwave server is called HG-CSP (Hyper-G Client/Server Protocol). It is based on messages to initiate certain actions, e.g. get object record. In early versions of the Hyperwave Server two native clients (Harmony, Amadeus) were provided for communication with the server. Those two disappeared when Hyperwave was commercialised. As a replacement a so called wavemaster was provided. The wavemaster is like a protocol converter from HTTP to HG-CSP. The idea is to do all the administration of the database and visualisation of documents by a web interface. The wavemaster implements a set of placeholders for certain actions to customise the interface. This set of placeholders is called the PLACE Language. PLACE lacks a lot of features of a real programming language and any extension to it only enlarges the list of placeholders. This has led to the use of JavaScript which IMO does not make life easier.

Adding Hyperwave support to PHP should fill in the gap of a missing programming language for interface customisation. It implements all the messages as defined by the HG-CSP but also provides more powerful commands to e.g. retrieve complete documents.

Hyperwave has its own terminology to name certain pieces of information. This has widely been taken over and extended. Almost all functions operate on one of the following data types.

  • object ID: An unique integer value for each object in the Hyperwave server. It is also one of the attributes of the object record (ObjectID). Object ids are often used as an input parameter to specify an object.

  • object record: A string with attribute-value pairs of the form attribute=value. The pairs are separated by a carriage return from each other. An object record can easily be converted into an object array with hw_object2array(). Several functions return object records. The names of those functions end with obj.

  • object array: An associative array with all attributes of an object. The keys are the attribute names. If an attribute occurs more than once in an object record it will result in another indexed or associative array. Attributes which are language depended (like the title, keyword, description) will form an associative array with the keys set to the language abbreviations. All other multiple attributes will form an indexed array. PHP functions never return object arrays.

  • hw_document: This is a complete new data type which holds the actual document, e.g. HTML, PDF etc. It is somewhat optimized for HTML documents but may be used for any format.

Several functions which return an array of object records do also return an associative array with statistical information about them. The array is the last element of the object record array. The statistical array contains the following entries:

Hidden

Number of object records with attribute PresentationHints set to Hidden.

CollectionHead

Number of object records with attribute PresentationHints set to CollectionHead.

FullCollectionHead

Number of object records with attribute PresentationHints set to FullCollectionHead.

CollectionHeadNr

Index in array of object records with attribute PresentationHints set to CollectionHead.

FullCollectionHeadNr

Index in array of object records with attribute PresentationHints set to FullCollectionHead.

Total

Total: Number of object records.

需求

This extension needs a Hyperwave server downloadable from http://www.hyperwave.com/.

安裝

Integration with Apache

The Hyperwave extension is best used when PHP is compiled as an Apache module. In such a case the underlying Hyperwave server can be hidden from users almost completely if Apache uses its rewriting engine. The following instructions will explain this.

Since PHP with Hyperwave support built into Apache is intended to replace the native Hyperwave solution based on Wavemaster, we will assume that the Apache server will only serve as a Hyperwave web interface for these examples. This is not necessary but it simplifies the configuration. The concept is quite simple. First of all you need a PHP script which evaluates the $_ENV['PATH_INFO'] variable and treats its value as the name of a Hyperwave object. Let's call this script 'Hyperwave'. The URL http://your.hostname/Hyperwave/name_of_object would than return the Hyperwave object with the name 'name_of_object'. Depending on the type of the object the script has to react accordingly. If it is a collection, it will probably return a list of children. If it is a document it will return the mime type and the content. A slight improvement can be achieved if the Apache rewriting engine is used. From the users point of view it would be more straight forward if the URL http://your.hostname/name_of_object would return the object. The rewriting rule is quite easy:

RewriteRule ^/(.*) /usr/local/apache/htdocs/HyperWave/$1 [L]

Now every URL relates to an object in the Hyperwave server. This causes a simple to solve problem. There is no way to execute a different script, e.g. for searching, than the 'Hyperwave' script. This can be fixed with another rewriting rule like the following:

RewriteRule ^/hw/(.*) /usr/local/apache/htdocs/hw/$1 [L]

This will reserve the directory /usr/local/apache/htdocs/hw for additional scripts and other files. Just make sure this rule is evaluated before the one above. There is just a little drawback: all Hyperwave objects whose name starts with 'hw/' will be shadowed. So, make sure you don't use such names. If you need more directories, e.g. for images just add more rules or place them all in one directory. Before you put those instructions, don't forget to turn on the rewriting engine with

RewriteEngine on

You will need scripts:

  • to return the object itself

  • to allow searching

  • to identify yourself

  • to set your profile

  • one for each additional function like to show the object attributes, to show information about users, to show the status of the server, etc.

As an alternative to the Rewrite Engine, you can also consider using the Apache ErrorDocument directive, but be aware, that ErrorDocument redirected pages cannot receive POST data.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Hyperwave configuration options

Name | Default | Changeable
hyerwave.allow_persistent | "0" | PHP_INI_SYSTEM
hyperwave.default_port | "418" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

HW_ATTR_LANG (integer)

HW_ATTR_NR (integer)

HW_ATTR_NONE (integer)

Todo

There are still some things to do:

  • The hw_InsertDocument has to be split into hw_insertobject() and hw_putdocument().

  • The names of several functions are not fixed, yet.

  • Most functions require the current connection as its first parameter. This leads to a lot of typing, which is quite often not necessary if there is just one open connection. A default connection will improve this.

  • Conversion form object record into object array needs to handle any multiple attribute.

目錄
hw_Array2Objrec -- convert attributes from object array to object record
hw_changeobject -- Changes attributes of an object (obsolete)
hw_Children -- object ids of children
hw_ChildrenObj -- object records of children
hw_Close -- closes the Hyperwave connection
hw_Connect -- opens a connection
hw_connection_info -- Prints information about the connection to Hyperwave server
hw_Cp -- copies objects
hw_Deleteobject -- deletes object
hw_DocByAnchor -- object id object belonging to anchor
hw_DocByAnchorObj -- object record object belonging to anchor
hw_Document_Attributes -- object record of hw_document
hw_Document_BodyTag -- body tag of hw_document
hw_Document_Content -- returns content of hw_document
hw_Document_SetContent -- sets/replaces content of hw_document
hw_Document_Size -- size of hw_document
hw_dummy -- Hyperwave dummy function
hw_EditText -- retrieve text document
hw_Error -- error number
hw_ErrorMsg -- returns error message
hw_Free_Document -- frees hw_document
hw_GetAnchors -- object ids of anchors of document
hw_GetAnchorsObj -- object records of anchors of document
hw_GetAndLock -- return bject record and lock object
hw_GetChildColl -- object ids of child collections
hw_GetChildCollObj -- object records of child collections
hw_GetChildDocColl -- object ids of child documents of collection
hw_GetChildDocCollObj -- object records of child documents of collection
hw_GetObject -- object record
hw_GetObjectByQuery -- search object
hw_GetObjectByQueryColl -- search object in collection
hw_GetObjectByQueryCollObj -- search object in collection
hw_GetObjectByQueryObj -- search object
hw_GetParents -- object ids of parents
hw_GetParentsObj -- object records of parents
hw_getrellink -- Get link from source to dest relative to rootid
hw_GetRemote -- Gets a remote document
hw_GetRemoteChildren -- Gets children of remote document
hw_GetSrcByDestObj -- Returns anchors pointing at object
hw_GetText -- retrieve text document
hw_getusername -- name of currently logged in user
hw_Identify -- identifies as user
hw_InCollections -- check if object ids in collections
hw_Info -- info about connection
hw_InsColl -- insert collection
hw_InsDoc -- insert document
hw_insertanchors -- Inserts only anchors into text
hw_InsertDocument -- upload any document
hw_InsertObject -- inserts an object record
hw_mapid -- Maps global id on virtual local id
hw_Modifyobject -- modifies object record
hw_Mv -- moves objects
hw_New_Document -- create new document
hw_Objrec2Array -- convert attributes from object record to object array
hw_Output_Document -- prints hw_document
hw_pConnect -- make a persistent database connection
hw_PipeDocument -- retrieve any document
hw_Root -- root object id
hw_setlinkroot -- Set the id to which links are calculated
hw_stat -- Returns status string
hw_Unlock -- unlock object
hw_Who -- List of currently logged in users
上一頁 | 首頁 | 下一頁
setcookie | 上一層 | hw_Array2Objrec


InterBase functions

PHP 手冊
上一頁 下一頁

XLIV. InterBase functions

介紹

InterBase is a popular database put out by Borland/Inprise. More information about InterBase is available at http://www.interbase.com/. Oh, by the way, InterBase just joined the open source movement!

註: Full support for InterBase 6 was added in PHP 4.0.

This database uses a single quote (') character for escaping, a behavior similar to the Sybase database, add to your php.ini the following directive:

magic_quotes_sybase = On

需求

安裝

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. InterBase configuration options

Name | Default | Changeable
ibase.allow_persistent | "1" | PHP_INI_SYSTEM
ibase.max_persistent | "-1" | PHP_INI_SYSTEM
ibase.max_links | "-1" | PHP_INI_SYSTEM
ibase.default_user | NULL | PHP_INI_ALL
ibase.default_password | NULL | PHP_INI_ALL
ibase.timestampformat | "%m/%d/%Y%H:%M:%S" | PHP_INI_ALL
ibase.dateformat | "%m/%d/%Y" | PHP_INI_ALL
ibase.timeformat | "%H:%M:%S" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

IBASE_DEFAULT (integer)

IBASE_TEXT (integer)

IBASE_UNIXTIME (integer)

IBASE_READ (integer)

IBASE_COMMITTED (integer)

IBASE_CONSISTENCY (integer)

IBASE_NOWAIT (integer)

IBASE_TIMESTAMP (integer)

IBASE_DATE (integer)

IBASE_TIME (integer)

目錄
ibase_blob_add -- Add data into created blob
ibase_blob_cancel -- Cancel creating blob
ibase_blob_close -- Close blob
ibase_blob_create -- Create blob for adding data
ibase_blob_echo -- Output blob contents to browser
ibase_blob_get -- Get len bytes data from open blob
ibase_blob_import -- Create blob, copy file in it, and close it
ibase_blob_info -- Return blob length and other useful info
ibase_blob_open -- Open blob for retrieving data parts
ibase_close -- Close a connection to an InterBase database
ibase_commit -- Commit a transaction
ibase_connect -- Open a connection to an InterBase database
ibase_errmsg -- Returns error messages
ibase_execute -- Execute a previously prepared query
ibase_fetch_object -- Get an object from a InterBase database
ibase_fetch_row -- Fetch a row from an InterBase database
ibase_field_info -- Get information about a field
ibase_free_query -- Free memory allocated by a prepared query
ibase_free_result -- Free a result set
ibase_num_fields -- Get the number of fields in a result set
ibase_pconnect -- Creates an persistent connection to an InterBase database
ibase_prepare -- Prepare a query for later binding of parameter placeholders and execution
ibase_query -- Execute a query on an InterBase database
ibase_rollback -- Rolls back a transaction
ibase_timefmt -- Sets the format of timestamp, date and time type columns returned from queries
ibase_trans -- Begin a transaction
上一頁 | 首頁 | 下一頁
ifxus_write_slob | 上一層 | ibase_blob_add


iconv functions

PHP 手冊
上一頁 下一頁

XL. iconv functions

介紹

This module contains an interface to the iconv library functions. The iconv library functions convert strings between various character sets encodings. The supported character sets depend on the iconv() implementation on your system. Note that the iconv() function on some systems may not work as well as you expect. In this case, you should install the libiconv library.

需求

Your systems standard C library must provide the iconv() function or you must have libiconv installed on your system. The libiconv library is available from http://www.gnu.org/software/libiconv/.

安裝

To be able to use the functions defined in this module you must compile your PHP interpreter using the configure line --with-iconv[=DIR].

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Iconv configuration options

Name | Default | Changeable
iconv.input_encoding | ICONV_INPUT_ENCODING | PHP_INI_ALL
iconv.output_encoding | ICONV_OUTPUT_ENCODING | PHP_INI_ALL
iconv.internal_encoding | ICONV_INTERNAL_ENCODING | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

相關參考

See also the GNU Recode functions.

目錄
iconv_get_encoding -- Get current setting for character encoding conversion
iconv_set_encoding -- Set current setting for character encoding conversion
iconv -- Convert string to requested character encoding
ob_iconv_handler -- Convert character encoding as output buffer handler
上一頁 | 首頁 | 下一頁
hw_api->userlist | 上一層 | iconv_get_encoding


Informix functions

PHP 手冊
上一頁 下一頁

XLIII. Informix functions

介紹

The Informix driver for Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x and IDS 2000 is implemented in "ifx.ec" and "php3_ifx.h" in the informix extension directory. IDS 7.x support is fairly complete, with full support for BYTE and TEXT columns. IUS 9.x support is partly finished: the new data types are there, but SLOB and CLOB support is still under construction.

需求

Configuration notes: You need a version of ESQL/C to compile the PHP Informix driver. ESQL/C versions from 7.2x on should be OK. ESQL/C is now part of the Informix Client SDK.

Make sure that the "INFORMIXDIR" variable has been set, and that $INFORMIXDIR/bin is in your PATH before you run the "configure" script.

安裝

註: The configure script will autodetect the libraries and include directories, if you run configure --with_informix=yes. You can override this detection by specifying "IFX_LIBDIR", "IFX_LIBS" and "IFX_INCDIR" in the environment. The configure script will also try to detect your Informix server version. It will set the "HAVE_IFX_IUS" conditional compilation variable if your Informix version >= 9.00.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

註: Make sure that the Informix environment variables INFORMIXDIR and INFORMIXSERVER are available to the PHP ifx driver, and that the INFORMIX bin directory is in the PATH. Check this by running a script that contains a call to phpinfo() before you start testing. The phpinfo() output should list these environment variables. This is TRUE for both CGI php and Apache mod_php. You may have to set these environment variables in your Apache startup script.

The Informix shared libraries should also be available to the loader (check LD_LIBRARY_PATH or ld.so.conf/ldconfig).

Some notes on the use of BLOBs (TEXT and BYTE columns): BLOBs are normally addressed by BLOB identifiers. Select queries return a "blob id" for every BYTE and TEXT column. You can get at the contents with "string_var = ifx_get_blob($blob_id);" if you choose to get the BLOBs in memory (with : "ifx_blobinfile(0);"). If you prefer to receive the content of BLOB columns in a file, use "ifx_blobinfile(1);", and "ifx_get_blob($blob_id);" will get you the filename. Use normal file I/O to get at the blob contents.

For insert/update queries you must create these "blob id's" yourself with "ifx_create_blob();". You then plug the blob id's into an array, and replace the blob columns with a question mark (?) in the query string. For updates/inserts, you are responsible for setting the blob contents with ifx_update_blob().

The behaviour of BLOB columns can be altered by configuration variables that also can be set at runtime :

configuration variable : ifx.textasvarchar

configuration variable : ifx.byteasvarchar

runtime functions :

ifx_textasvarchar(0) : use blob id's for select queries with TEXT columns

ifx_byteasvarchar(0) : use blob id's for select queries with BYTE columns

ifx_textasvarchar(1) : return TEXT columns as if they were VARCHAR columns, so that you don't need to use blob id's for select queries.

ifx_byteasvarchar(1) : return BYTE columns as if they were VARCHAR columns, so that you don't need to use blob id's for select queries.

configuration variable : ifx.blobinfile

runtime function :

ifx_blobinfile_mode(0) : return BYTE columns in memory, the blob id lets you get at the contents.

ifx_blobinfile_mode(1) : return BYTE columns in a file, the blob id lets you get at the file name.

If you set ifx_text/byteasvarchar to 1, you can use TEXT and BYTE columns in select queries just like normal (but rather long) VARCHAR fields. Since all strings are "counted" in PHP, this remains "binary safe". It is up to you to handle this correctly. The returned data can contain anything, you are responsible for the contents.

If you set ifx_blobinfile to 1, use the file name returned by ifx_get_blob(..) to get at the blob contents. Note that in this case YOU ARE RESPONSIBLE FOR DELETING THE TEMPORARY FILES CREATED BY INFORMIX when fetching the row. Every new row fetched will create new temporary files for every BYTE column.

The location of the temporary files can be influenced by the environment variable "blobdir", default is "." (the current directory). Something like : putenv(blobdir=tmpblob"); will ease the cleaning up of temp files accidentally left behind (their names all start with "blb").

Automatically trimming "char" (SQLCHAR and SQLNCHAR) data: This can be set with the configuration variable

ifx.charasvarchar : if set to 1 trailing spaces will be automatically trimmed, to save you some "chopping".

NULL values: The configuration variable ifx.nullformat (and the runtime function ifx_nullformat()) when set to TRUE will return NULL columns as the string "NULL", when set to FALSE they return the empty string. This allows you to discriminate between NULL columns and empty columns.

表格 1. Informix configuration options

Name | Default | Changeable
ifx.allow_persistent | "1" | PHP_INI_SYSTEM
ifx.max_persistent | "-1" | PHP_INI_SYSTEM
ifx.max_links | "-1" | PHP_INI_SYSTEM
ifx.default_host | NULL | PHP_INI_SYSTEM
ifx.default_user | NULL | PHP_INI_SYSTEM
ifx.default_password | NULL | PHP_INI_SYSTEM
ifx.blobinfile | "1" | PHP_INI_ALL
ifx.textasvarchar | "0" | PHP_INI_ALL
ifx.byteasvarchar | "0" | PHP_INI_ALL
ifx.charasvarchar | "0" | PHP_INI_ALL
ifx.nullformat | "0" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

ifx.allow_persistent boolean

Whether to allow persistent Informix connections.

ifx.max_persistent integer

The maximum number of persistent Informix connections per process.

ifx.max_links integer

The maximum number of Informix connections per process, including persistent connections.

ifx.default_host string

The default host to connect to when no host is specified in ifx_connect() or ifx_pconnect(). Doesn't apply in safe mode.

ifx.default_user string

The default user id to use when none is specified in ifx_connect() or ifx_pconnect(). Doesn't apply in safe mode.

ifx.default_password string

The default password to use when none is specified in ifx_connect() or ifx_pconnect(). Doesn't apply in safe mode.

ifx.blobinfile boolean

Set to TRUE if you want to return blob columns in a file, FALSE if you want them in memory. You can override the setting at runtime with ifx_blobinfile_mode().

ifx.textasvarchar boolean

Set to TRUE if you want to return TEXT columns as normal strings in select statements, FALSE if you want to use blob id parameters. You can override the setting at runtime with ifx_textasvarchar().

ifx.byteasvarchar boolean

Set to TRUE if you want to return BYTE columns as normal strings in select queries, FALSE if you want to use blob id parameters. You can override the setting at runtime with ifx_textasvarchar().

ifx.charasvarchar boolean

Set to TRUE if you want to trim trailing spaces from CHAR columns when fetching them.

ifx.nullformat boolean

Set to TRUE if you want to return NULL columns as the literal string "NULL", FALSE if you want them returned as the empty string "". You can override this setting at runtime with ifx_nullformat().

資源型別

預定義常數

該擴展模塊未定義任何常數。

目錄
ifx_affected_rows -- Get number of rows affected by a query
ifx_blobinfile_mode -- Set the default blob mode for all select queries
ifx_byteasvarchar -- Set the default byte mode
ifx_close -- Close Informix connection
ifx_connect -- Open Informix server connection
ifx_copy_blob -- Duplicates the given blob object
ifx_create_blob -- Creates an blob object
ifx_create_char -- Creates an char object
ifx_do -- Execute a previously prepared SQL-statement
ifx_error -- Returns error code of last Informix call
ifx_errormsg -- Returns error message of last Informix call
ifx_fetch_row -- Get row as enumerated array
ifx_fieldproperties -- List of SQL fieldproperties
ifx_fieldtypes -- List of Informix SQL fields
ifx_free_blob -- Deletes the blob object
ifx_free_char -- Deletes the char object
ifx_free_result -- Releases resources for the query
ifx_get_blob -- Return the content of a blob object
ifx_get_char -- Return the content of the char object
ifx_getsqlca -- Get the contents of sqlca.sqlerrd[0..5] after a query
ifx_htmltbl_result -- Formats all rows of a query into a HTML table
ifx_nullformat -- Sets the default return value on a fetch row
ifx_num_fields -- Returns the number of columns in the query
ifx_num_rows -- Count the rows already fetched from a query
ifx_pconnect -- Open persistent Informix connection
ifx_prepare -- Prepare an SQL-statement for execution
ifx_query -- Send Informix query
ifx_textasvarchar -- Set the default text mode
ifx_update_blob -- Updates the content of the blob object
ifx_update_char -- Updates the content of the char object
ifxus_close_slob -- Deletes the slob object
ifxus_create_slob -- Creates an slob object and opens it
ifxus_free_slob -- Deletes the slob object
ifxus_open_slob -- Opens an slob object
ifxus_read_slob -- Reads nbytes of the slob object
ifxus_seek_slob -- Sets the current file or seek position
ifxus_tell_slob -- Returns the current file or seek position
ifxus_write_slob -- Writes a string into the slob object
上一頁 | 首頁 | 下一頁
imap_utf8 | 上一層 | ifx_affected_rows


Image functions

PHP 手冊
上一頁 下一頁

XLI. Image functions

介紹

PHP is not limited to creating just HTML output. It can also be used to create and manipulate image files in a variety of different image formats, including gif, png, jpg, wbmp, and xpm. Even more convenient, PHP can output image streams directly to a browser. You will need to compile PHP with the GD library of image functions for this to work. GD and PHP may also require other libraries, depending on which image formats you want to work with.

You can use the image functions in PHP to get the size of JPEG, GIF, PNG, SWF, TIFF and JPEG2000 images.

註: Read requirements section about how to expand image capabilities to read, write and modify images and to read meta data of pictures taken by digital cameras.

需求

If you have the GD library (available at http://www.boutell.com/gd/) you will also be able to create and manipulate images.

The format of images you are able to manipulate depend on the version of GD you install, and any other libraries GD might need to access those image formats. Versions of GD older than gd-1.6 support gif format images, and do not support png, where versions greater than gd-1.6 support png, not gif.

註: Since PHP 4.3 there is a bundled version of the GD lib. This bundled version has some additional features like alpha blending and should be used in preference to the external library since it's codebase is better maintained and more stable.

If you have PHP compiled with --enable-exif you are able to work with information stored in headers of JPEG and TIFF images. This way you can read meta data generated by digital cameras as mentioned above. These functions does not require the GD library.

註: PHP does not require any additional library for exif the module.

安裝

In order to read and write images in jpeg format, you will need to obtain and install jpeg-6b (available at ftp://ftp.uu.net/graphics/jpeg/), and then recompile GD to make use of jpeg-6b. You will also have to compile PHP with --with-jpeg-dir=/path/to/jpeg-6b.

To add support for Type 1 fonts, you can install t1lib (available at ftp://sunsite.unc.edu/pub/Linux/libs/graphics/), and then add --with-t1lib[=dir].

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

Exif supports automatically conversion for Unicode and JIS character encodings of user comments when module mbstring is available. This is done by first decoding the comment using the specified characterset. The result is then encoded with another characterset which should match your HTTP output.

表格 1. Exif configuration options

Name | Default | Changeable
exif.encode_unicode | "ISO-8859-15" | PHP_INI_ALL
exif.decode_unicode_motorola | "UCS-2BE" | PHP_INI_ALL
exif.decode_unicode_intel | "UCS-2LE" | PHP_INI_ALL
exif.encode_jis | "" | PHP_INI_ALL
exif.decode_jis_motorola | "JIS" | PHP_INI_ALL
exif.decode_jis_intel | "JIS" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

exif.encode_unicode string

exif.encode_unicode defines the characterset UNICODE user comments are handled. This defaults to ISO-8859-15 which should work for most non asian countries. The setting can be empty or must be an encoding supported by mbstring. If it is empty the current internal encoding of mbstring is used.

exif.decode_unicode_motorola string

exif.decode_unicode_motorola defines the image internal characterset for Unicode encoded user comments if image is in motorola byte order (big-endian). This setting cannot be empty but you can specify a list of encodings supported by mbstring. The default is UCS-2BE.

exif.decode_unicode_intel string

exif.decode_unicode_intel defines the image internal characterset for Unicode encoded user comments if image is in intel byte order (little-endian). This setting cannot be empty but you can specify a list of encodings supported by mbstring. The default is UCS-2LE.

exif.encode_jis string

exif.encode_jis defines the characterset JIS user comments are handled. This defaults to an empty value which forces the functions to use the current internal encoding of mbstring.

exif.decode_jis_motorola string

exif.decode_jis_motorola defines the image internal characterset for JIS encoded user comments if image is in motorola byte order (big-endian). This setting cannot be empty but you can specify a list of encodings supported by mbstring. The default is JIS.

exif.decode_jis_intel string

exif.decode_jis_intel defines the image internal characterset for JIS encoded user comments if image is in intel byte order (little-endian). This setting cannot be empty but you can specify a list of encodings supported by mbstring. The default is JIS.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

IMG_GIF (integer)

IMG_JPG (integer)

IMG_JPEG (integer)

IMG_PNG (integer)

IMG_WBMP (integer)

IMG_XPM (integer)

IMG_COLOR_TILED (integer)

IMG_COLOR_STYLED (integer)

IMG_COLOR_BRUSHED (integer)

IMG_COLOR_STYLEDBRUSHED (integer)

IMG_COLOR_TRANSPARENT (integer)

IMG_ARC_ROUNDED (integer)

IMG_ARC_PIE (integer)

IMG_ARC_CHORD (integer)

IMG_ARC_NOFILL (integer)

IMG_ARC_EDGED (integer)

IMAGETYPE_GIF (integer)

IMAGETYPE_JPG (integer)

IMAGETYPE_PNG (integer)

IMAGETYPE_SWF (integer)

IMAGETYPE_PSD (integer)

IMAGETYPE_BMP (integer)

IMAGETYPE_TIFF_II (integer)

IMAGETYPE_TIFF_MM (integer)

IMAGETYPE_JPC (integer)

IMAGETYPE_JP2 (integer)

IMAGETYPE_JPX (integer)

IMAGETYPE_SWC (integer)

範例

例子 1. PNG creation with PHP

<?php
    header("Content-type: image/png");
    $string = $_GET['text'];
    $im     = imagecreatefrompng("images/button1.png");
    $orange = imagecolorallocate($im, 220, 210, 60);
    $px     = (imagesx($im) - 7.5 * strlen($string)) / 2;
    imagestring($im, 3, $px, 9, $string, $orange);
    imagepng($im);
    imagedestroy($im);
?>
This example would be called from a page with a tag like: <img src="button.php?text">. The above button.php script then takes this "text" string and overlays it on top of a base image which in this case is "images/button1.png" and outputs the resulting image. This is a very convenient way to avoid having to draw new button images every time you want to change the text of a button. With this method they are dynamically generated.

目錄
exif_imagetype -- Determine the type of an image
exif_read_data -- Read the EXIF headers from JPEG or TIFF. This way you can read meta data generated by digital cameras.
exif_thumbnail -- Retrieve the embedded thumbnail of a TIFF or JPEG image
getimagesize -- Get the size of an image
image_type_to_mime_type -- Get Mime-Type for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
image2wbmp -- Output image to browser or file
imagealphablending -- Set the blending mode for an image
imagearc -- Draw a partial ellipse
imagechar -- Draw a character horizontally
imagecharup -- Draw a character vertically
imagecolorallocate -- Allocate a color for an image
imagecolorat -- Get the index of the color of a pixel
imagecolorclosest -- Get the index of the closest color to the specified color
imagecolorclosestalpha -- Get the index of the closest color to the specified color + alpha
imagecolorclosesthwb -- Get the index of the color which has the hue, white and blackness nearest to the given color
imagecolordeallocate -- De-allocate a color for an image
imagecolorexact -- Get the index of the specified color
imagecolorexactalpha -- Get the index of the specified color + alpha
imagecolorresolve -- Get the index of the specified color or its closest possible alternative
imagecolorresolvealpha -- Get the index of the specified color + alpha or its closest possible alternative
imagecolorset -- Set the color for the specified palette index
imagecolorsforindex -- Get the colors for an index
imagecolorstotal -- Find out the number of colors in an image's palette
imagecolortransparent -- Define a color as transparent
imagecopy -- Copy part of an image
imagecopymerge -- Copy and merge part of an image
imagecopymergegray -- Copy and merge part of an image with gray scale
imagecopyresampled -- Copy and resize part of an image with resampling
imagecopyresized -- Copy and resize part of an image
imagecreate -- Create a new palette based image
imagecreatefromgd2 -- Create a new image from GD2 file or URL
imagecreatefromgd2part -- Create a new image from a given part of GD2 file or URL
imagecreatefromgd -- Create a new image from GD file or URL
imagecreatefromgif -- Create a new image from file or URL
imagecreatefromjpeg -- Create a new image from file or URL
imagecreatefrompng -- Create a new image from file or URL
imagecreatefromstring -- Create a new image from the image stream in the string
imagecreatefromwbmp -- Create a new image from file or URL
imagecreatefromxbm -- Create a new image from file or URL
imagecreatefromxpm -- Create a new image from file or URL
imagecreatetruecolor -- Create a new true color image
imagedashedline -- Draw a dashed line
imagedestroy -- Destroy an image
imageellipse -- Draw an ellipse
imagefill -- Flood fill
imagefilledarc -- Draw a partial ellipse and fill it
imagefilledellipse -- Draw a filled ellipse
imagefilledpolygon -- Draw a filled polygon
imagefilledrectangle -- Draw a filled rectangle
imagefilltoborder -- Flood fill to specific color
imagefontheight -- Get font height
imagefontwidth -- Get font width
imageftbbox -- Give the bounding box of a text using fonts via freetype2
imagefttext -- Write text to the image using fonts using FreeType 2
imagegammacorrect -- Apply a gamma correction to a GD image
imagegd2 -- Output GD2 image to browser or file
imagegd -- Output GD image to browser or file
imagegif -- Output image to browser or file
imageinterlace -- Enable or disable interlace
imagejpeg -- Output image to browser or file
imageline -- Draw a line
imageloadfont -- Load a new font
imagepalettecopy -- Copy the palette from one image to another
imagepng -- Output a PNG image to either the browser or a file
imagepolygon -- Draw a polygon
imagepsbbox -- Give the bounding box of a text rectangle using PostScript Type1 fonts
imagepscopyfont -- Make a copy of an already loaded font for further modification
imagepsencodefont -- Change the character encoding vector of a font
imagepsextendfont -- Extend or condense a font
imagepsfreefont -- Free memory used by a PostScript Type 1 font
imagepsloadfont -- Load a PostScript Type 1 font from file
imagepsslantfont -- Slant a font
imagepstext -- To draw a text string over an image using PostScript Type1 fonts
imagerectangle -- Draw a rectangle
imagerotate -- Rotate an image with a given angle
imagesetbrush -- Set the brush image for line drawing
imagesetpixel -- Set a single pixel
imagesetstyle -- Set the style for line drawing
imagesetthickness -- Set the thickness for line drawing
imagesettile -- Set the tile image for filling
imagestring -- Draw a string horizontally
imagestringup -- Draw a string vertically
imagesx -- Get image width
imagesy -- Get image height
imagetruecolortopalette -- Convert a true color image to a palette image
imagettfbbox -- Give the bounding box of a text using TrueType fonts
imagettftext -- Write text to the image using TrueType fonts
imagetypes -- Return the image types supported by this PHP build
imagewbmp -- Output image to browser or file
iptcembed -- Embed binary IPTC data into a JPEG image
iptcparse -- Parse a binary IPTC http://www.iptc.org/ block into single tags.
jpeg2wbmp -- Convert JPEG image file to WBMP image file
png2wbmp -- Convert PNG image file to WBMP image file
read_exif_data -- Reads header information stored in TIFF and JPEG images
上一頁 | 首頁 | 下一頁
ob_iconv_handler | 上一層 | exif_imagetype


IMAP, POP3 and NNTP functions

PHP 手冊
上一頁 下一頁

XLII. IMAP, POP3 and NNTP functions

介紹

These functions are not limited to the IMAP protocol, despite their name. The underlying c-client library also supports NNTP, POP3 and local mailbox access methods.

需求

This extension requires the c-client library to be installed. Grab the latest version from ftp://ftp.cac.washington.edu/imap/ and compile it.

You have to copy some files to make sure they are in your link path (e.g.: /usr/local/lib/) and include directory (e.g.: /usr/local/include). The files to copy can be found in the source tree under imap-200x/c-lient after a succesfull run of make. Copy c-client.a to /usr/local/lib/libc-client.a or some other directory on your link path.

註: Make sure c-client.a ends up in your link path under the name libc-client.a.

Copy the following files to /usr/local/include or some other directory in your include path.

c-client.h
imap4r1.h
rfc822.h
mail.h
linkage.h
env.h
env_unix.h
fs.h
ftl.h
misc.h
nntp.h
nl.h
osdep.h
smtp.h
tcp.h

註: The name of env_unix.h depends on your OS. Make sure to copy this files with following symlinks option. To build the c-client library with SSL or/and Kerberos support read the docs supplied with the package.

安裝

To get these functions to work, you have to compile PHP with --with-imap.

註: Depending how the c-client was configured, you might also need to add --with-imap-ssl=/path/to/openssl/ and/or --with-kerberos into the PHP configure line.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

NIL (integer)

OP_DEBUG (integer)

OP_READONLY (integer)

OP_ANONYMOUS (integer)

OP_SHORTCACHE (integer)

OP_SILENT (integer)

OP_PROTOTYPE (integer)

OP_HALFOPEN (integer)

OP_EXPUNGE (integer)

OP_SECURE (integer)

CL_EXPUNGE (integer)

FT_UID (integer)

FT_PEEK (integer)

FT_NOT (integer)

FT_INTERNAL (integer)

FT_PREFETCHTEXT (integer)

ST_UID (integer)

ST_SILENT (integer)

ST_SET (integer)

CP_UID (integer)

CP_MOVE (integer)

SE_UID (integer)

SE_FREE (integer)

SE_NOPREFETCH (integer)

SO_FREE (integer)

SO_NOSERVER (integer)

SA_MESSAGES (integer)

SA_RECENT (integer)

SA_UNSEEN (integer)

SA_UIDNEXT (integer)

SA_UIDVALIDITY (integer)

SA_ALL (integer)

LATT_NOINFERIORS (integer)

LATT_NOSELECT (integer)

LATT_MARKED (integer)

LATT_UNMARKED (integer)

SORTDATE (integer)

SORTARRIVAL (integer)

SORTFROM (integer)

SORTSUBJECT (integer)

SORTTO (integer)

SORTCC (integer)

SORTSIZE (integer)

TYPETEXT (integer)

TYPEMULTIPART (integer)

TYPEMESSAGE (integer)

TYPEAPPLICATION (integer)

TYPEAUDIO (integer)

TYPEIMAGE (integer)

TYPEVIDEO (integer)

TYPEOTHER (integer)

ENC7BIT (integer)

ENC8BIT (integer)

ENCBINARY (integer)

ENCBASE64 (integer)

ENCQUOTEDPRINTABLE (integer)

ENCOTHER (integer)

相關參考

This document can't go into detail on all the topics touched by the provided functions. Further information is provided by the documentation of the c-client library source (docs/internal.txt). and the following RFC documents:

  • RFC2821: Simple Mail Transfer Protocol (SMTP).

  • RFC2822: Standard for ARPA internet text messages.

  • RFC2060: Internet Message Access Protocol (IMAP) Version 4rev1.

  • RFC1939: Post Office Protocol Version 3 (POP3).

  • RFC977: Network News Transfer Protocol (NNTP).

  • RFC2076: Common Internet Message Headers.

  • RFC2045 , RFC2046 , RFC2047 , RFC2048 & RFC2049: Multipurpose Internet Mail Extensions (MIME).

A detailed overview is also available in the books Programming Internet Email by David Wood and Managing IMAP by Dianna Mullet & Kevin Mullet.

警告

Crashes and startup problems of PHP may be encountered when loading this extension in conjunction with the recode extension. See the recode extension for more information.

目錄
imap_8bit -- Convert an 8bit string to a quoted-printable string
imap_alerts -- This function returns all IMAP alert messages (if any) that have occurred during this page request or since the alert stack was reset
imap_append -- Append a string message to a specified mailbox
imap_base64 -- Decode BASE64 encoded text
imap_binary -- Convert an 8bit string to a base64 string
imap_body -- Read the message body
imap_bodystruct -- Read the structure of a specified body section of a specific message
imap_check -- Check current mailbox
imap_clearflag_full -- Clears flags on messages
imap_close -- Close an IMAP stream
imap_createmailbox -- Create a new mailbox
imap_delete -- Mark a messge for deletion from current mailbox
imap_deletemailbox -- Delete a mailbox
imap_errors -- This function returns all of the IMAP errors (if any) that have occurred during this page request or since the error stack was reset.
imap_expunge -- Delete all messages marked for deletion
imap_fetch_overview -- Read an overview of the information in the headers of the given message
imap_fetchbody -- Fetch a particular section of the body of the message
imap_fetchheader -- Returns header for a message
imap_fetchstructure -- Read the structure of a particular message
imap_get_quota -- Retrieve the quota level settings, and usage statics per mailbox
imap_get_quotaroot -- Retrieve the quota settings per user
imap_getmailboxes -- Read the list of mailboxes, returning detailed information on each one
imap_getsubscribed -- List all the subscribed mailboxes
imap_header -- Read the header of the message
imap_headerinfo -- Read the header of the message
imap_headers -- Returns headers for all messages in a mailbox
imap_last_error -- This function returns the last IMAP error (if any) that occurred during this page request
imap_list -- Read the list of mailboxes
imap_listmailbox -- Read the list of mailboxes
imap_listscan -- Read the list of mailboxes, takes a string to search for in the text of the mailbox
imap_listsubscribed -- List all the subscribed mailboxes
imap_lsub -- List all the subscribed mailboxes
imap_mail_compose -- Create a MIME message based on given envelope and body sections
imap_mail_copy -- Copy specified messages to a mailbox
imap_mail_move -- Move specified messages to a mailbox
imap_mail -- Send an email message
imap_mailboxmsginfo -- Get information about the current mailbox
imap_mime_header_decode -- Decode MIME header elements
imap_msgno -- This function returns the message sequence number for the given UID
imap_num_msg -- Gives the number of messages in the current mailbox
imap_num_recent -- Gives the number of recent messages in current mailbox
imap_open -- Open an IMAP stream to a mailbox
imap_ping -- Check if the IMAP stream is still active
imap_qprint -- Convert a quoted-printable string to an 8 bit string
imap_renamemailbox -- Rename an old mailbox to new mailbox
imap_reopen -- Reopen IMAP stream to new mailbox
imap_rfc822_parse_adrlist -- Parses an address string
imap_rfc822_parse_headers -- Parse mail headers from a string
imap_rfc822_write_address -- Returns a properly formatted email address given the mailbox, host, and personal info.
imap_scanmailbox -- Read the list of mailboxes, takes a string to search for in the text of the mailbox
imap_search -- This function returns an array of messages matching the given search criteria
imap_set_quota -- Sets a quota for a given mailbox
imap_setacl -- Sets the ACL for a giving mailbox
imap_setflag_full -- Sets flags on messages
imap_sort -- Sort an array of message headers
imap_status -- This function returns status information on a mailbox other than the current one
imap_subscribe -- Subscribe to a mailbox
imap_thread -- Return threaded by REFERENCES tree
imap_uid -- This function returns the UID for the given message sequence number
imap_undelete -- Unmark the message which is marked deleted
imap_unsubscribe -- Unsubscribe from a mailbox
imap_utf7_decode -- Decodes a modified UTF-7 encoded string.
imap_utf7_encode -- Converts 8bit data to modified UTF-7 text.
imap_utf8 -- Converts text to UTF8
上一頁 | 首頁 | 下一頁
read_exif_data | 上一層 | imap_8bit


PHP Options&Information

PHP 手冊
上一頁 下一頁

LXXIX. PHP Options&Information

介紹

This functions enable you to get a lot of information about PHP itself, e.g. runtime configuration, loaded extensions, version and much more. You'll also find functions to set options for your running PHP. The probably best known function of PHP - phpinfo() - can be found here.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. PHP Options/Inf Configuration Options

Name | Default | Changeable
assert.active | "1" | PHP_INI_ALL
assert.bail | "0" | PHP_INI_ALL
assert.warning | "1" | PHP_INI_ALL
assert.callback | NULL | PHP_INI_ALL
assert.quiet_eval | "0" | PHP_INI_ALL
enable_dl | "1" | PHP_INI_SYSTEM
max_execution_time | "30" | PHP_INI_ALL
magic_quotes_gpc | "1" | PHP_INI_PERDIR|PHP_INI_SYSTEM
magic_quotes_runtime | "0" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

assert.active boolean

Enable assert() evaluation.

assert.bail boolean

Terminate script execution on failed assertions.

assert.warning boolean

Issue a PHP warning for each failed assertion.

assert.callback string

user function to call on failed assertions

assert.quiet_eval boolean

Use the current setting of error_reporting() during assertion expression evaluation. If enabled, no errors are shown (implicit error_reporting(0)) while evaluation. If disabled, errors are shown according to the settings of error_reporting()

enable_dl boolean

This directive is really only useful in the Apache module version of PHP. You can turn dynamic loading of PHP extensions with dl() on and off per virtual server or per directory.

The main reason for turning dynamic loading off is security. With dynamic loading, it's possible to ignore all the safe_mode and open_basedir restrictions.

The default is to allow dynamic loading, except when using safe-mode. In safe-mode, it's always imposible to use dl().

max_execution_time integer

This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30.

The maximum execution time is not affected by system calls, the sleep() function, etc. Please see the set_time_limit() function for more details.

magic_quotes_gpc boolean

Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically. If magic_quotes_sybase is also on, a single-quote is escaped with a single-quote instead of a backslash.

magic_quotes_runtime boolean

If magic_quotes_runtime is enabled, most functions that return data from any sort of external source including databases and text files will have quotes escaped with a backslash. If magic_quotes_sybase is also on, a single-quote is escaped with a single-quote instead of a backslash.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

這裡列出的所有常數將作為 PHP 核心的一部分一直有效。

表格 2. Pre-defined phpcredits() constants

Constant | Description
CREDITS_ALL | All the credits, equivalent to using: CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_FULLPAGE. It generates a complete stand-alone HTML page with the appropriate tags.
CREDITS_DOCS | The credits for the documentation team
CREDITS_FULLPAGE | Usually used in combination with the other flags. Indicates that the a complete stand-alone HTML page needs to be printed including the information indicated by the other flags.
CREDITS_GENERAL | General credits: Language design and concept, PHP 4.0 authors and SAPI module.
CREDITS_GROUP | A list of the core developers
CREDITS_MODULES | A list of the extension modules for PHP, and their authors
CREDITS_SAPI | A list of the server API modules for PHP, and their authors

表格 3. phpinfo() constants

Constant | Value | Description
INFO_GENERAL | 1 | The configuration line, php.ini location, build date, Web Server, System and more.
INFO_CREDITS | 2 | PHP 4 Credits. See also phpcredits().
INFO_CONFIGURATION | 4 | Current Local and Master values for php directives. See also ini_get().
INFO_MODULES | 8 | Loaded modules and their respective settings.
INFO_ENVIRONMENT | 16 | Environment Variable information that's also available in $_ENV.
INFO_VARIABLES | 32 | Shows all predefined variables from EGPCS (Environment, GET, POST, Cookie, Server).
INFO_LICENSE | 64 | PHP License information. See also the license faq.
INFO_ALL | -1 | Shows all of the above. This is the default value.

ASSERT_ACTIVE (integer)

ASSERT_CALLBACK (integer)

ASSERT_BAIL (integer)

ASSERT_WARNING (integer)

ASSERT_QUIET_EVAL (integer)

目錄
assert_options -- Set/get the various assert flags
assert -- Checks if assertion is FALSE
dl -- Loads a PHP extension at runtime
extension_loaded -- Find out whether an extension is loaded
get_cfg_var -- Gets the value of a PHP configuration option
get_current_user -- Gets the name of the owner of the current PHP script
get_defined_constants -- Returns an associative array with the names of all the constants and their values
get_extension_funcs -- Returns an array with the names of the functions of a module
get_included_files -- Returns an array with the names of included or required files
get_loaded_extensions -- Returns an array with the names of all modules compiled and loaded
get_magic_quotes_gpc -- Gets the current active configuration setting of magic quotes gpc
get_magic_quotes_runtime -- Gets the current active configuration setting of magic_quotes_runtime
get_required_files -- Returns an array with the names of included or required files
getenv -- Gets the value of an environment variable
getlastmod -- Gets time of last page modification
getmygid -- Get PHP script owner's GID
getmyinode -- Gets the inode of the current script
getmypid -- Gets PHP's process ID
getmyuid -- Gets PHP script owner's UID
getopt -- Gets options from the command line argument list
getrusage -- Gets the current resource usages
ini_alter -- Changes the value of a configuration option
ini_get_all -- Gets all configuration options
ini_get -- Gets the value of a configuration option
ini_restore -- Restores the value of a configuration option
ini_set -- Sets the value of a configuration option
php_logo_guid -- Gets the logo guid
php_sapi_name -- Returns the type of interface between web server and PHP
php_uname -- Returns information about the operating system PHP was built on
phpcredits -- Prints out the credits for PHP
phpinfo -- Outputs lots of PHP information
phpversion -- Gets the current PHP version
putenv -- Sets the value of an environment variable
set_magic_quotes_runtime -- Sets the current active configuration setting of magic_quotes_runtime
set_time_limit -- Limits the maximum execution time
version_compare -- Compares two "PHP-standardized" version number strings
zend_logo_guid -- Gets the zend guid
zend_version -- Gets the version of the current Zend engine
上一頁 | 首頁 | 下一頁
pfpro_version | 上一層 | assert_options


Ingres II functions

PHP 手冊
上一頁 下一頁

XLV. Ingres II functions

介紹

These functions allow you to access Ingres II database servers.

註: If you already used PHP extensions to access other database servers, note that Ingres doesn't allow concurrent queries and/or transaction over one connection, thus you won't find any result or transaction handle in this extension. The result of a query must be treated before sending another query, and a transaction must be commited or rolled back before opening another transaction (which is automaticaly done when sending the first query).

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

To compile PHP with Ingres support, you need the Open API library and header files included with Ingres II.

安裝

In order to have these functions available, you must compile php with Ingres support by using the --with-ingres option. If the II_SYSTEM environment variable isn't correctly set you may have to use --with-ingres=DIR to specify your Ingres installation directory.

When using this extension with Apache, if Apache does not start and complains with "PHP Fatal error: Unable to start ingres_ii module in Unknown on line 0" then make sure the environement variable II_SYSTEM is correctly set. Adding "export II_SYSTEM="/home/ingres/II" in the script that starts Apache, just before launching httpd, should be fine.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Ingres II configuration options

Name | Default | Changeable
ingres.allow_persistent | "1" | PHP_INI_SYSTEM
ingres.max_persistent | "-1" | PHP_INI_SYSTEM
ingres.max_links | "-1" | PHP_INI_SYSTEM
ingres.default_database | NULL | PHP_INI_ALL
ingres.default_user | NULL | PHP_INI_ALL
ingres.default_password | NULL | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

INGRES_ASSOC (integer)

INGRES_NUM (integer)

INGRES_BOTH (integer)

目錄
ingres_autocommit -- Switch autocommit on or off
ingres_close -- Close an Ingres II database connection
ingres_commit -- Commit a transaction
ingres_connect -- Open a connection to an Ingres II database
ingres_fetch_array -- Fetch a row of result into an array
ingres_fetch_object -- Fetch a row of result into an object.
ingres_fetch_row -- Fetch a row of result into an enumerated array
ingres_field_length -- Get the length of a field
ingres_field_name -- Get the name of a field in a query result.
ingres_field_nullable -- Test if a field is nullable
ingres_field_precision -- Get the precision of a field
ingres_field_scale -- Get the scale of a field
ingres_field_type -- Get the type of a field in a query result
ingres_num_fields -- Get the number of fields returned by the last query
ingres_num_rows -- Get the number of rows affected or returned by the last query
ingres_pconnect -- Open a persistent connection to an Ingres II database
ingres_query -- Send a SQL query to Ingres II
ingres_rollback -- Roll back a transaction
上一頁 | 首頁 | 下一頁
ibase_trans | 上一層 | ingres_autocommit


IRC Gateway Functions

PHP 手冊
上一頁 下一頁

XLVI. IRC Gateway Functions

介紹

With ircg you can build powerful, fast and scalable webchat solutions in conjunction with dedicated or public IRC servers.

IRCG runs under tis platforms:

  • AIX

  • FreeBSD

  • HP-UX

  • Irix

  • Linux

  • Solaris

  • Tru64

需求

To install and use IRCG you need the following software:

  1. IRCG-Library from Sascha Schumann.

  2. SGI Static Threads Library

  3. thttpd webserver

安裝

A detailed installation instruction can be found here.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

該擴展模塊未定義任何常數。

目錄
ircg_channel_mode -- Set channel mode flags for user
ircg_disconnect -- Close connection to server
ircg_fetch_error_msg -- Returns the error from previous ircg operation
ircg_get_username -- Get username for connection
ircg_html_encode -- Encodes HTML preserving output
ircg_ignore_add -- Add a user to your ignore list on a server
ircg_ignore_del -- Remove a user from your ignore list on a server
ircg_is_conn_alive -- Check connection status
ircg_join -- Join a channel on a connected server
ircg_kick -- Kick a user out of a channel on server
ircg_lookup_format_messages -- Select a set of format strings for display of IRC messages
ircg_msg -- Send message to channel or user on server
ircg_nick -- Change nickname on server
ircg_nickname_escape -- Encode special characters in nickname to be IRC-compliant
ircg_nickname_unescape -- Decodes encoded nickname
ircg_notice -- Send a notice to a user on server
ircg_part -- Leave a channel on server
ircg_pconnect -- Connect to an IRC server
ircg_register_format_messages -- Register a set of format strings for display of IRC messages
ircg_set_current -- Set current connection for output
ircg_set_file -- Set logfile for connection
ircg_set_on_die -- Set hostaction to be execute when connection dies
ircg_topic -- Set topic for channel on server
ircg_whois -- Query user information for nick on server
上一頁 | 首頁 | 下一頁
ingres_rollback | 上一層 | ircg_channel_mode


PHP / Java Integration

PHP 手冊
上一頁 下一頁

XLVII. PHP / Java Integration

介紹

There are two possible ways to bridge PHP and Java: you can either integrate PHP into a Java Servlet environment, which is the more stable and efficient solution, or integrate Java support into PHP. The former is provided by a SAPI module that interfaces with the Servlet server, the latter by this Java extension.

The Java extension provides a simple and effective means for creating and invoking methods on Java objects from PHP. The JVM is created using JNI, and everything runs in-process.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

You need a Java VM installed on your machine to use this extension.

安裝

Build instructions for this extension can be found in php4/ext/java/README.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Java configuration options

Name | Default | Changeable
java.class.path | NULL | PHP_INI_ALL
java.home | NULL | PHP_INI_ALL
java.library.path | NULL | PHP_INI_ALL
java.library | JAVALIB | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. Java Example

<?php
  // get instance of Java class java.lang.System in PHP
  $system = new Java('java.lang.System');

  // demonstrate property access
  print 'Java version='.$system->getProperty('java.version').' <br>';
  print 'Java vendor=' .$system->getProperty('java.vendor').' <br>';
  print 'OS='.$system->getProperty('os.name').' '.
              $system->getProperty('os.version').' on '.
              $system->getProperty('os.arch').' <br>';

  // java.util.Date example
  $formatter = new Java('java.text.SimpleDateFormat',
                        "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

  print $formatter->format(new Java('java.util.Date'));
?>

例子 2. AWT Example

<?php
  // This example is only intented to be run as a CGI.

  $frame  = new Java('java.awt.Frame', 'PHP');
  $button = new Java('java.awt.Button', 'Hello Java World!');

  $frame->add('North', $button);
  $frame->validate();
  $frame->pack();
  $frame->visible = True;

  $thread = new Java('java.lang.Thread');
  $thread->sleep(10000);

  $frame->dispose();
?>
Notes:

  • new Java() will create an instance of a class if a suitable constructor is available. If no parameters are passed and the default constructor is useful as it provides access to classes like java.lang.System which expose most of their functionallity through static methods.

  • Accessing a member of an instance will first look for bean properties then public fields. In other words, print $date.time will first attempt to be resolved as $date.getTime(), then as $date.time.

  • Both static and instance members can be accessed on an object with the same syntax. Furthermore, if the java object is of type java.lang.Class, then static members of the class (fields and methods) can be accessed.

  • Exceptions raised result in PHP warnings, and NULL results. The warnings may be eliminated by prefixing the method call with an "@" sign. The following APIs may be used to retrieve and reset the last error:

    • java_last_exception_get()

    • java_last_exception_clear()

  • Overload resolution is in general a hard problem given the differences in types between the two languages. The PHP Java extension employs a simple, but fairly effective, metric for determining which overload is the best match.

    Additionally, method names in PHP are not case sensitive, potentially increasing the number of overloads to select from.

    Once a method is selected, the parameters are cooerced if necessary, possibly with a loss of data (example: double precision floating point numbers will be converted to boolean).

  • In the tradition of PHP, arrays and hashtables may pretty much be used interchangably. Note that hashtables in PHP may only be indexed by integers or strings; and that arrays of primitive types in Java can not be sparse. Also note that these constructs are passed by value, so may be expensive in terms of memory and time.

Java Servlet SAPI

The Java Servlet SAPI builds upon the mechanism defined by the Java extension to enable the entire PHP processor to be run as a servlet. The primary advanatage of this from a PHP perspective is that web servers which support servlets typically take great care in pooling and reusing JVMs. Build instructions for the Servlet SAPI module can be found in php4/sapi/README. Notes:

  • While this code is intended to be able to run on any servlet engine, it has only been tested on Apache's Jakarta/tomcat to date. Bug reports, success stories and/or patches required to get this code to run on other engines would be appreciated.

  • PHP has a habit of changing the working directory. sapi/servlet will eventually change it back, but while PHP is running the servlet engine may not be able to load any classes from the CLASSPATH which are specified using a relative directory syntax, or find the work directory used for administration and JSP compilation tasks.

目錄
java_last_exception_clear -- Clear last Java exception
java_last_exception_get -- Get last Java exception
上一頁 | 首頁 | 下一頁
ircg_whois | 上一層 | java_last_exception_clear


LDAP functions

PHP 手冊
上一頁 下一頁

XLVIII. LDAP functions

介紹

LDAP is the Lightweight Directory Access Protocol, and is a protocol used to access "Directory Servers". The Directory is a special kind of database that holds information in a tree structure.

The concept is similar to your hard disk directory structure, except that in this context, the root directory is "The world" and the first level subdirectories are "countries". Lower levels of the directory structure contain entries for companies, organisations or places, while yet lower still we find directory entries for people, and perhaps equipment or documents.

To refer to a file in a subdirectory on your hard disk, you might use something like:

/usr/local/myapp/docs

The forwards slash marks each division in the reference, and the sequence is read from left to right.

The equivalent to the fully qualified file reference in LDAP is the "distinguished name", referred to simply as "dn". An example dn might be:

cn=John Smith,ou=Accounts,o=My Company,c=US

The comma marks each division in the reference, and the sequence is read from right to left. You would read this dn as:

country = US
organization = My Company
organizationalUnit = Accounts
commonName = John Smith

In the same way as there are no hard rules about how you organise the directory structure of a hard disk, a directory server manager can set up any structure that is meaningful for the purpose. However, there are some conventions that are used. The message is that you can not write code to access a directory server unless you know something about its structure, any more than you can use a database without some knowledge of what is available.

Lots of information about LDAP can be found at

  • Netscape

  • University of Michigan

  • OpenLDAP Project

  • LDAP World

The Netscape SDK contains a helpful Programmer's Guide in HTML format.

需求

You will need to get and compile LDAP client libraries from either the University of Michigan ldap-3.3 package or the Netscape Directory SDK 3.0 to compile PHP with LDAP support.

安裝

LDAP support in PHP is not enabled by default. You will need to use the --with-ldap configuration option when compiling PHP to enable LDAP support.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. LDAP configuration options

Name | Default | Changeable
ldap.max_links | "-1" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

LDAP_DEREF_NEVER (integer)

LDAP_DEREF_SEARCHING (integer)

LDAP_DEREF_FINDING (integer)

LDAP_DEREF_ALWAYS (integer)

LDAP_OPT_DEREF (integer)

LDAP_OPT_SIZELIMIT (integer)

LDAP_OPT_TIMELIMIT (integer)

LDAP_OPT_PROTOCOL_VERSION (integer)

LDAP_OPT_ERROR_NUMBER (integer)

LDAP_OPT_REFERRALS (integer)

LDAP_OPT_RESTART (integer)

LDAP_OPT_HOST_NAME (integer)

LDAP_OPT_ERROR_STRING (integer)

LDAP_OPT_MATCHED_DN (integer)

LDAP_OPT_SERVER_CONTROLS (integer)

LDAP_OPT_CLIENT_CONTROLS (integer)

LDAP_OPT_DEBUG_LEVEL (integer)

GSLC_SSL_NO_AUTH (integer)

GSLC_SSL_ONEWAY_AUTH (integer)

GSLC_SSL_TWOWAY_AUTH (integer)

範例

Retrieve information for all entries where the surname starts with "S" from a directory server, displaying an extract with name and email address.

例子 1. LDAP search example

<?php
// basic sequence with LDAP is connect, bind, search, interpret search
// result, close connection

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$ds=ldap_connect("localhost");  // must be a valid LDAP server!
echo "connect result is ".$ds."<p>";

if ($ds) {
    echo "Binding ...";
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                           // read-only access
    echo "Bind result is ".$r."<p>";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds,"o=My Company, c=US", "sn=S*");
    echo "Search result is ".$sr."<p>";

    echo "Number of entires returned is ".ldap_count_entries($ds,$sr)."<p>";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for ".$info["count"]." items returned:<p>";

    for ($i=0; $i<$info["count"]; $i++) {
        echo "dn is: ". $info[$i]["dn"] ."<br>";
        echo "first cn entry is: ". $info[$i]["cn"][0] ."<br>";
        echo "first email entry is: ". $info[$i]["mail"][0] ."<p>";
    }

    echo "Closing connection";
    ldap_close($ds);

} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
?>

Using the PHP LDAP calls

Before you can use the LDAP calls you will need to know ..

  • The name or address of the directory server you will use

  • The "base dn" of the server (the part of the world directory that is held on this server, which could be "o=My Company,c=US")

  • Whether you need a password to access the server (many servers will provide read access for an "anonymous bind" but require a password for anything else)

The typical sequence of LDAP calls you will make in an application will follow this pattern:

ldap_connect() // establish connection to server
|
ldap_bind() // anonymous or authenticated "login"
|
do something like search or update the directory
and display the results
|
ldap_close() // "logout"

目錄
ldap_8859_to_t61 -- Translate 8859 characters to t61 characters
ldap_add -- Add entries to LDAP directory
ldap_bind -- Bind to LDAP directory
ldap_close -- Close link to LDAP server
ldap_compare -- Compare value of attribute found in entry specified with DN
ldap_connect -- Connect to an LDAP server
ldap_count_entries -- Count the number of entries in a search
ldap_delete -- Delete an entry from a directory
ldap_dn2ufn -- Convert DN to User Friendly Naming format
ldap_err2str -- Convert LDAP error number into string error message
ldap_errno -- Return the LDAP error number of the last LDAP command
ldap_error -- Return the LDAP error message of the last LDAP command
ldap_explode_dn -- Splits DN into its component parts
ldap_first_attribute -- Return first attribute
ldap_first_entry -- Return first result id
ldap_first_reference -- Return first reference
ldap_free_result -- Free result memory
ldap_get_attributes -- Get attributes from a search result entry
ldap_get_dn -- Get the DN of a result entry
ldap_get_entries -- Get all result entries
ldap_get_option -- Get the current value for given option
ldap_get_values_len -- Get all binary values from a result entry
ldap_get_values -- Get all values from a result entry
ldap_list -- Single-level search
ldap_mod_add -- Add attribute values to current attributes
ldap_mod_del -- Delete attribute values from current attributes
ldap_mod_replace -- Replace attribute values with new ones
ldap_modify -- Modify an LDAP entry
ldap_next_attribute -- Get the next attribute in result
ldap_next_entry -- Get next result entry
ldap_next_reference -- Get next reference
ldap_parse_reference -- Extract information from reference entry
ldap_parse_result -- Extract information from result
ldap_read -- Read an entry
ldap_rename -- Modify the name of an entry
ldap_search -- Search LDAP tree
ldap_set_option -- Set the value of the given option
ldap_set_rebind_proc -- Set a callback function to do re-binds on referral chasing.
ldap_sort -- Sort LDAP result entries
ldap_start_tls -- Start TLS
ldap_t61_to_8859 -- Translate t61 characters to 8859 characters
ldap_unbind -- Unbind from LDAP directory
上一頁 | 首頁 | 下一頁
java_last_exception_get | 上一層 | ldap_8859_to_t61


Mail functions

PHP 手冊
上一頁 下一頁

XLIX. Mail functions

介紹

The mail() function allows you to send mail.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Mail configuration options

Name | Default | Changeable
SMTP | "localhost" | PHP_INI_ALL
smtp_port | "25" | PHP_INI_ALL
sendmail_from | NULL | PHP_INI_ALL
sendmail_path | DEFAULT_SENDMAIL_PATH | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

SMTP string

Used under Windows only: DNS name or IP address of the SMTP server PHP should use for mail sent with the mail() function.

SMTP int

Used under Windows only: Number of the port to connect to the server specified with the SMTP setting when sending mail with mail(); defaults to 25. Only available since PHP 4.3.0.

sendmail_from string

Which "From:" mail address should be used in mail sent from PHP under Windows.

sendmail_path string

Where the sendmail program can be found, usually /usr/sbin/sendmail or /usr/lib/sendmail. configure does an honest attempt of locating this one for you and set a default, but if it fails, you can set it here.

Systems not using sendmail should set this directive to the sendmail wrapper/replacement their mail system offers, if any. For example, Qmail users can normally set it to /var/qmail/bin/sendmail or /var/qmail/bin/qmail-inject.

qmail-inject does not require any option to process mail correctly.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
ezmlm_hash -- Calculate the hash value needed by EZMLM
mail -- send mail
上一頁 | 首頁 | 下一頁
ldap_unbind | 上一層 | ezmlm_hash


mailparse functions

PHP 手冊
上一頁 下一頁

L. mailparse functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
mailparse_determine_best_xfer_encoding -- Figures out the best way of encoding the content read from the file pointer fp, which must be seek-able
mailparse_msg_create -- Returns a handle that can be used to parse a message
mailparse_msg_extract_part_file -- Extracts/decodes a message section, decoding the transfer encoding
mailparse_msg_extract_part -- Extracts/decodes a message section. If callbackfunc is not specified, the contents will be sent to "stdout"
mailparse_msg_free -- Frees a handle allocated by mailparse_msg_crea
mailparse_msg_get_part_data -- Returns an associative array of info about the message
mailparse_msg_get_part -- Returns a handle on a given section in a mimemessage
mailparse_msg_get_structure -- Returns an array of mime section names in the supplied message
mailparse_msg_parse_file -- Parse file and return a resource representing the structure
mailparse_msg_parse -- Incrementally parse data into buffer
mailparse_rfc822_parse_addresses -- Parse addresses and returns a hash containing that data
mailparse_stream_encode -- Streams data from source file pointer, apply encoding and write to destfp
mailparse_uudecode_all -- Scans the data from fp and extract each embedded uuencoded file. Returns an array listing filename information
上一頁 | 首頁 | 下一頁
mail | 上一層 | mailparse_determine_best_xfer_encoding


數學函式

PHP 手冊
上一頁 下一頁

LI. 數學函式

介紹

這些數學函式將只會處理值在你計算機上整型和浮點型範圍內的數字。(與C 語言中 long resp. double 型別相當)。如果你要處理更大的數字，參看任意精度數學函式庫。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

這裡列出的所有常數將作為 PHP 核心的一部分一直有效。

表格 1. 數學常數

常數名 | 常數值 | 描述
M_PI | 3.14159265358979323846 | Pi
M_E | 2.7182818284590452354 | e
M_LOG2E | 1.4426950408889634074 | log_2 e
M_LOG10E | 0.43429448190325182765 | log_10 e
M_LN2 | 0.69314718055994530942 | log_e 2
M_LN10 | 2.30258509299404568402 | log_e 10
M_PI_2 | 1.57079632679489661923 | pi/2
M_PI_4 | 0.78539816339744830962 | pi/4
M_1_PI | 0.31830988618379067154 | 1/pi
M_2_PI | 0.63661977236758134308 | 2/pi
M_SQRTPI | 1.77245385090551602729 | sqrt(pi) [4.0.2]
M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(pi)
M_SQRT2 | 1.41421356237309504880 | sqrt(2)
M_SQRT3 | 1.73205080756887729352 | sqrt(3) [4.0.2]
M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2)
M_LNPI | 1.14472988584940017414 | log_e(pi) [4.0.2]
M_EULER | 0.57721566490153286061 | Euler constant [4.0.2]
只有常數 M_PI 在 PHP 4.0.0 之前就存在，其它所有常數從 PHP 4.0.0 起開始存在。用 [4.0.2] 標記的常數是在 PHP 4.0.2 中增加的。

目錄
abs -- 絕對值
acos -- Arc cosine
acosh -- Inverse hyperbolic cosine
asin -- Arc sine
asinh -- Inverse hyperbolic sine
atan2 -- arc tangent of two variables
atan -- Arc tangent
atanh -- Inverse hyperbolic tangent
base_convert -- Convert a number between arbitrary bases
bindec -- Binary to decimal
ceil -- Round fractions up
cos -- 餘弦
cosh -- Hyperbolic cosine
decbin -- Decimal to binary
dechex -- Decimal to hexadecimal
decoct -- Decimal to octal
deg2rad -- Converts the number in degrees to the radian equivalent
exp -- Calculates the exponent of e (the Neperian or Natural logarithm base)
expm1 -- Returns exp(number) - 1, computed in a way that is accurate even when the value of number is close to zero
floor -- Round fractions down
fmod -- Returns the floating point remainder (modulo) of the division of the arguments
getrandmax -- Show largest possible random value
hexdec -- Hexadecimal to decimal
hypot -- Returns sqrt( num1*num1 + num2*num2)
is_finite --
is_infinite --
is_nan --
lcg_value -- Combined linear congruential generator
log10 -- 以10為底的對數
log1p -- Returns log(1 + number), computed in a way that accurate even when the val ue of number is close to zero
log -- 自然對數
max -- Find highest value
min -- Find lowest value
mt_getrandmax -- Show largest possible random value
mt_rand -- Generate a better random value
mt_srand -- Seed the better random number generator
octdec -- Octal to decimal
pi -- 得到圓周率值
pow -- Exponential expression
rad2deg -- Converts the radian number to the equivalent number in degrees
rand -- Generate a random value
round -- Rounds a float
sin -- 正弦
sinh -- Hyperbolic sine
sqrt -- Square root
srand -- Seed the random number generator
tan -- 正切
tanh -- Hyperbolic tangent
上一頁 | 首頁 | 下一頁
mailparse_uudecode_all | 上一層 | abs


Multi-Byte String Functions

PHP 手冊
上一頁 下一頁

LII. Multi-Byte String Functions

介紹

There are many languages in which all characters can be expressed by single byte. Multi-byte character codes are used to express many characters for many languages. mbstring is developed to handle Japanese characters. However, many mbstring functions are able to handle character encoding other than Japanese.

A multi-byte character encoding represents single character with consecutive bytes. Some character encoding has shift(escape) sequences to start/end multi-byte character strings. Therefore, a multi-byte character string may be destroyed when it is divided and/or counted unless multi-byte character encoding safe method is used. This module provides multi-byte character safe string functions and other utility functions such as conversion functions.

Since PHP is basically designed for ISO-8859-1, some multi-byte character encoding does not work well with PHP. Therefore, it is important to set mbstring.internal_encoding to a character encoding that works with PHP.

PHP4 Character Encoding Requirements

  • Per byte encoding

  • Single byte characters in range of 00h-7fh which is compatible with ASCII

  • Multi-byte characters without 00h-7fh

These are examples of internal character encoding that works with PHP and does NOT work with PHP.

Character encodings work with PHP:
ISO-8859-*, EUC-JP, UTF-8

Character encodings do NOT work with PHP:
JIS, SJIS

Character encoding, that does not work with PHP, may be converted with mbstring's HTTP input/output conversion feature/function.

註: SJIS should not be used for internal encoding unless the reader is familiar with parser/compiler, character encoding and character encoding issues.

註: If you use databases with PHP, it is recommended that you use the same character encoding for both database and internal encoding for ease of use and better performance.

If you are using PostgreSQL, it supports character encoding that is different from backend character encoding. See the PostgreSQL manual for details.

安裝

mbstring is an extended module. You must enable the module with the configure script. Refer to the Install section for details.

The following configure options are related to the mbstring module.

  • --enable-mbstring : Enable mbstring functions. This option is required to use mbstring functions.

    註: As of PHP 4.3.0, the option --enable-mbstring will be enabled by default and replaced with --with-mbstring[=LANG] to support Chinese, Korean and Russian language support. Japanese character encoding is supported by default. If --with-mbstring=cn is used, simplified chinese encoding will be supported. If --with-mbstring=tw is used, traditional chinese encoding will be supported. If --with-mbstring=kr is used, korean encoding will be supported. If --with-mbstring=ru is used, russian encoding will be supported. If --with-mbstring=all is added, all supported character encoding in mbstring will be enabled, but the binary size of PHP will be maximized because of huge Unicode character maps. Note that Chinese, Korean and Russian encoding is experimentally supported in PHP 4.3.0.

  • --enable-mbstr-enc-trans : Enable HTTP input character encoding conversion using mbstring conversion engine. If this feature is enabled, HTTP input character encoding may be converted to mbstring.internal_encoding automatically.

    註: As of PHP 4.3.0, the option --enable-mbstr-enc-trans will be eliminated and replaced with mbstring.encoding_translation. HTTP input character encoding conversion is enabled when this is set to On (the default is Off).

  • --enable-mbregex : Enable regular expression functions with multibyte character support.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Multi-Byte String configuration options

Name | Default | Changeable
mbstring.language | NULL | PHP_INI_ALL
mbstring.detect_order | NULL | PHP_INI_ALL
mbstring.http_input | NULL | PHP_INI_ALL
mbstring.http_output | NULL | PHP_INI_ALL
mbstring.internal_encoding | NULL | PHP_INI_ALL
mbstring.script_encoding | NULL | PHP_INI_ALL
mbstring.substitute_character | NULL | PHP_INI_ALL
mbstring.func_overload | "0" | PHP_INI_SYSTEM
mbstring.encoding_translation | "0" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

  • mbstring.language defines default language used in mbstring. Note that this option defines mbstring.interanl_encoding and mbstring.interanl_encoding should be placed after mbstring.language in php.ini

  • mbstring.encoding_translation enables HTTP input character encoding detection and translation into internal chatacter encoding.

  • mbstring.internal_encoding defines default internal character encoding.

  • mbstring.http_input defines default HTTP input character encoding.

  • mbstring.http_output defines default HTTP output character encoding.

  • mbstring.detect_order defines default character code detection order. See also mb_detect_order().

  • mbstring.substitute_character defines character to substitute for invalid character encoding.

  • mbstring.func_overloadoverload(replace) single byte functions by mbstring functions. mail(), ereg(), etc. are overloaded by mb_send_mail(), mb_ereg(), etc. Possible values are 0, 1, 2, 4 or a combination of them. For example, 7 for overload everything. 0: No overload, 1: Overload mail() function, 2: Overload str*() functions, 4: Overload ereg*() functions.

Web Browsers are supposed to use the same character encoding when submitting form. However, browsers may not use the same character encoding. See mb_http_input() to detect character encoding used by browsers.

If enctype is set to multipart/form-data in HTML forms, mbstring does not convert character encoding in POST data. The user must convert them in the script, if conversion is needed.

Although, browsers are smart enough to detect character encoding in HTML. charset is better to be set in HTTP header. Change default_charset according to character encoding.

例子 1. php.ini setting example

; Set default language
mbstring.language        = English; Set default language to English (default)
mbstring.language        = Japanese; Set default language to Japanese

;; Set default internal encoding
;; Note: Make sure to use character encoding works with PHP
mbstring.internal_encoding    = UTF-8  ; Set internal encoding to UTF-8

;; HTTP input encoding translation is enabled.
mbstring.encoding_translation = On

;; Set default HTTP input character encoding
;; Note: Script cannot change http_input setting.
mbstring.http_input           = pass    ; No conversion.
mbstring.http_input           = auto    ; Set HTTP input to auto
                                ; "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS"
mbstring.http_input           = SJIS    ; Set HTTP2 input to  SJIS
mbstring.http_input           = UTF-8,SJIS,EUC-JP ; Specify order

;; Set default HTTP output character encoding
mbstring.http_output          = pass    ; No conversion
mbstring.http_output          = UTF-8   ; Set HTTP output encoding to UTF-8

;; Set default character encoding detection order
mbstring.detect_order         = auto    ; Set detect order to auto
mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Specify order

;; Set default substitute character
mbstring.substitute_character = 12307   ; Specify Unicode value
mbstring.substitute_character = none    ; Do not print character
mbstring.substitute_character = long    ; Long Example: U+3000,JIS+7E7E

例子 2. php.ini setting for EUC-JP users

;; Disable Output Buffering
output_buffering      = Off

;; Set HTTP header charset
default_charset       = EUC-JP

;; Set default language to Japanese
mbstring.language = Japanese

;; HTTP input encoding translation is enabled.
mbstring.encoding_translation = On

;; Set HTTP input encoding conversion to auto
mbstring.http_input   = auto

;; Convert HTTP output to EUC-JP
mbstring.http_output  = EUC-JP

;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP

;; Do not print invalid characters
mbstring.substitute_character = none

例子 3. php.ini setting for SJIS users

;; Enable Output Buffering
output_buffering     = On

;; Set mb_output_handler to enable output conversion
output_handler       = mb_output_handler

;; Set HTTP header charset
default_charset      = Shift_JIS

;; Set default language to Japanese
mbstring.language = Japanese

;; Set http input encoding conversion to auto
mbstring.http_input  = auto

;; Convert to SJIS
mbstring.http_output = SJIS

;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP

;; Do not print invalid characters
mbstring.substitute_character = none

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

MB_OVERLOAD_MAIL (integer)

MB_OVERLOAD_STRING (integer)

MB_OVERLOAD_REGEX (integer)

HTTP Input and Output

HTTP input/output character encoding conversion may convert binary data also. Users are supposed to control character encoding conversion if binary data is used for HTTP input/output.

If enctype for HTML form is set to multipart/form-data, mbstring does not convert character encoding in POST data. If it is the case, strings are needed to be converted to internal character encoding.

  • HTTP Input

    There is no way to control HTTP input character conversion from PHP script. To disable HTTP input character conversion, it has to be done in php.ini.

    例子 4. Disable HTTP input conversion in php.ini

    ;; Disable HTTP Input conversion
mbstring.http_input = pass
;; Disable HTTP Input conversion (PHP 4.3.0 or higher)
mbstring.encoding_translation = Off

    When using PHP as an Apache module, it is possible to override PHP ini setting per Virtual Host in httpd.conf or per directory with .htaccess. Refer to the Configuration section and Apache Manual for details.

  • HTTP Output

    There are several ways to enable output character encoding conversion. One is using php.ini, another is using ob_start() with mb_output_handler() as ob_start callback function.

    註: For PHP3-i18n users, mbstring's output conversion differs from PHP3-i18n. Character encoding is converted using output buffer.

例子 5. php.ini setting example

;; Enable output character encoding conversion for all PHP pages

;; Enable Output Buffering
output_buffering    = On

;; Set mb_output_handler to enable output conversion
output_handler      = mb_output_handler

例子 6. Script example

<?php

// Enable output character encoding conversion only for this page

// Set HTTP output character encoding to SJIS
mb_http_output('SJIS');

// Start buffering and specify "mb_output_handler" as
// callback function
ob_start('mb_output_handler');

?>

Supported Character Encodings

Currently, the following character encoding is supported by the mbstring module. Character encoding may be specified for mbstring functions' encoding parameter.

The following character encoding is supported in this PHP extension:

UCS-4, UCS-4BE, UCS-4LE, UCS-2, UCS-2BE, UCS-2LE, UTF-32, UTF-32BE, UTF-32LE, UCS-2LE, UTF-16, UTF-16BE, UTF-16LE, UTF-8, UTF-7, ASCII, EUC-JP, SJIS, eucJP-win, SJIS-win, ISO-2022-JP, JIS, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-13, ISO-8859-14, ISO-8859-15, byte2be, byte2le, byte4be, byte4le, BASE64, 7bit, 8bit and UTF7-IMAP.

As of PHP 4.3.0, the following character encoding support will be added experimentaly : EUC-CN, CP936, HZ, EUC-TW, CP950, BIG-5, EUC-KR, UHC (CP949), ISO-2022-KR, Windows-1251 (CP1251), Windows-1252 (CP1252), CP866, KOI8-R.

php.ini entry, which accepts encoding name, accepts "auto" and "pass" also. mbstring functions, which accepts encoding name, and accepts "auto".

If "pass" is set, no character encoding conversion is performed.

If "auto" is set, it is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS".

See also mb_detect_order()

註: "Supported character encoding" does not mean that it works as internal character code.

Overloading PHP string functions with multi byte string functions

Because almost PHP application written for language using single-byte character encoding, there are some difficulties for multibyte string handling including japanese. Almost PHP string functions such as substr() do not support multibyte string.

Multibyte extension (mbstring) has some PHP string functions with multibyte support (ex. substr() supports mb_substr()).

Multibyte extension (mbstring) also supports 'function overloading' to add multibyte string functionality without code modification. Using function overloading, some PHP string functions will be oveloaded multibyte string functions. For example, mb_substr() is called instead of substr() if function overloading is enabled. Function overload makes easy to port application supporting only single-byte encoding for multibyte application.

mbstring.func_overload in php.ini should be set some positive value to use function overloading. The value should specify the category of overloading functions, sbould be set 1 to enable mail function overloading. 2 to enable string functions, 4 to regular expression functions. For example, if is set for 7, mail, strings, regex functions should be overloaded. The list of overloaded functions are shown in below.

表格 2. Functions to be overloaded

value of mbstring.func_overload | original function | overloaded function
1 | mail() | mb_send_mail()
2 | strlen() | mb_strlen()
2 | strpos() | mb_strpos()
2 | strrpos() | mb_strrpos()
2 | substr() | mb_substr()
4 | ereg() | mb_ereg()
4 | eregi() | mb_eregi()
4 | ereg_replace() | mb_ereg_replace()
4 | eregi_replace() | mb_eregi_replace()
4 | split() | mb_split()

Basics of Japanese multi-byte characters

Most Japanese characters need more than 1 byte per character. In addition, several character encoding schemas are used under a Japanese environment. There are EUC-JP, Shift_JIS(SJIS) and ISO-2022-JP(JIS) character encoding. As Unicode becomes popular, UTF-8 is used also. To develop Web applications for a Japanese environment, it is important to use the character set for the task in hand, whether HTTP input/output, RDBMS and E-mail.

  • Storage for a character can be up to six bytes

  • A multi-byte character is usually twice of the width compared to single-byte characters. Wider characters are called "zen-kaku" - meaning full width, narrower characters are called "han-kaku" - meaning half width. "zen-kaku" characters are usually fixed width.

  • Some character encoding defines shift(escape) sequence for entering/exiting multi-byte character strings.

  • ISO-2022-JP must be used for SMTP/NNTP.

  • "i-mode" web site is supposed to use SJIS.

References

Multi-byte character encoding and its related issues are very complex. It is impossible to cover in sufficient detail here. Please refer to the following URLs and other resources for further readings.

  • Unicode/UTF/UCS/etc

    http://www.unicode.org/

  • Japanese/Korean/Chinese character information

    ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

目錄
mb_convert_encoding -- Convert character encoding
mb_convert_kana -- Convert "kana" one from another ("zen-kaku" ,"han-kaku" and more)
mb_convert_variables -- Convert character code in variable(s)
mb_decode_mimeheader -- Decode string in MIME header field
mb_decode_numericentity -- Decode HTML numeric string reference to character
mb_detect_encoding -- Detect character encoding
mb_detect_order -- Set/Get character encoding detection order
mb_encode_mimeheader -- Encode string for MIME header
mb_encode_numericentity -- Encode character to HTML numeric string reference
mb_ereg_match -- Regular expression match for multibyte string
mb_ereg_replace -- Replace regular expression with multibyte support
mb_ereg_search_getpos -- Returns start point for next regular expression match
mb_ereg_search_getregs -- Retrive the result from the last multibyte regular expression match
mb_ereg_search_init -- Setup string and regular expression for multibyte regular expression match
mb_ereg_search_pos -- Return position and length of matched part of multibyte regular expression for predefined multibyte string
mb_ereg_search_regs -- Returns the matched part of multibyte regular expression
mb_ereg_search_setpos -- Set start point of next regular expression match
mb_ereg_search -- Multibyte regular expression match for predefined multibyte string
mb_ereg -- Regular expression match with multibyte support
mb_eregi_replace -- Replace regular expression with multibyte support ignoring case
mb_eregi -- Regular expression match ignoring case with multibyte support
mb_get_info -- Get internal settings of mbstring
mb_http_input -- Detect HTTP input character encoding
mb_http_output -- Set/Get HTTP output character encoding
mb_internal_encoding -- Set/Get internal character encoding
mb_language -- Set/Get current language
mb_output_handler -- Callback function converts character encoding in output buffer
mb_parse_str -- Parse GET/POST/COOKIE data and set global variable
mb_preferred_mime_name -- Get MIME charset string
mb_regex_encoding -- Returns current encoding for multibyte regex as string
mb_regex_set_options -- Set/Get the default options for mbregex functions
mb_send_mail -- Send encoded mail.
mb_split -- Split multibyte string using regular expression
mb_strcut -- Get part of string
mb_strimwidth -- Get truncated string with specified width
mb_strlen -- Get string length
mb_strpos -- Find position of first occurrence of string in a string
mb_strrpos -- Find position of last occurrence of a string in a string
mb_strwidth -- Return width of string
mb_substitute_character -- Set/Get substitution character
mb_substr -- Get part of string
上一頁 | 首頁 | 下一頁
tanh | 上一層 | mb_convert_encoding


MCAL functions

PHP 手冊
上一頁 下一頁

LIII. MCAL functions

介紹

MCAL stands for Modular Calendar Access Library.

Libmcal is a C library for accessing calendars. It's written to be very modular, with pluggable drivers. MCAL is the calendar equivalent of the IMAP module for mailboxes.

With mcal support, a calendar stream can be opened much like the mailbox stream with the IMAP support. Calendars can be local file stores, remote ICAP servers, or other formats that are supported by the mcal library.

Calendar events can be pulled up, queried, and stored. There is also support for calendar triggers (alarms) and recurring events.

With libmcal, central calendar servers can be accessed, removing the need for any specific database or local file programming.

Most of the functions use an internal event structure that is unique for each stream. This alleviates the need to pass around large objects between functions. There are convenience functions for setting, initializing, and retrieving the event structure values.

註: PHP had an ICAP extension previously, but the original library and the PHP extension is not supported anymore. The suggested replacement is MCAL.

需求

This extension requires the mcal library to be installed. Grab the latest version from http://mcal.chek.com/ and compile and install it.

安裝

After you installed the mcal library, to get these functions to work, you have to compile PHP with --with-mcal.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

MCAL_SUNDAY (integer)

MCAL_MONDAY (integer)

MCAL_TUESDAY (integer)

MCAL_WEDNESDAY (integer)

MCAL_THURSDAY (integer)

MCAL_FRIDAY (integer)

MCAL_SATURDAY (integer)

MCAL_JANUARY (integer)

MCAL_FEBRUARY (integer)

MCAL_MARCH (integer)

MCAL_APRIL (integer)

MCAL_MAY (integer)

MCAL_JUNE (integer)

MCAL_JULY (integer)

MCAL_AUGUST (integer)

MCAL_SEPTEMBER (integer)

MCAL_OCTOBER (integer)

MCAL_NOVEMBER (integer)

MCAL_DECEMBER (integer)

MCAL_RECUR_NONE (integer)

MCAL_RECUR_DAILY (integer)

MCAL_RECUR_WEEKLY (integer)

MCAL_RECUR_MONTHLY_MDAY (integer)

MCAL_RECUR_MONTHLY_WDAY (integer)

MCAL_RECUR_YEARLY (integer)

MCAL_M_SUNDAY (integer)

MCAL_M_MONDAY (integer)

MCAL_M_TUESDAY (integer)

MCAL_M_WEDNESDAY (integer)

MCAL_M_THURSDAY (integer)

MCAL_M_FRIDAY (integer)

MCAL_M_SATURDAY (integer)

MCAL_M_WEEKDAYS (integer)

MCAL_M_WEEKEND (integer)

MCAL_M_ALLDAYS (integer)

目錄
mcal_append_event -- Store a new event into an MCAL calendar
mcal_close -- Close an MCAL stream
mcal_create_calendar -- Create a new MCAL calendar
mcal_date_compare -- Compares two dates
mcal_date_valid -- Returns TRUE if the given year, month, day is a valid date
mcal_day_of_week -- Returns the day of the week of the given date
mcal_day_of_year -- Returns the day of the year of the given date
mcal_days_in_month -- Returns the number of days in the given month
mcal_delete_calendar -- Delete an MCAL calendar
mcal_delete_event -- Delete an event from an MCAL calendar
mcal_event_add_attribute -- Adds an attribute and a value to the streams global event structure
mcal_event_init -- Initializes a streams global event structure
mcal_event_set_alarm -- Sets the alarm of the streams global event structure
mcal_event_set_category -- Sets the category of the streams global event structure
mcal_event_set_class -- Sets the class of the streams global event structure
mcal_event_set_description -- Sets the description of the streams global event structure
mcal_event_set_end -- Sets the end date and time of the streams global event structure
mcal_event_set_recur_daily -- Sets the recurrence of the streams global event structure
mcal_event_set_recur_monthly_mday -- Sets the recurrence of the streams global event structure
mcal_event_set_recur_monthly_wday -- Sets the recurrence of the streams global event structure
mcal_event_set_recur_none -- Sets the recurrence of the streams global event structure
mcal_event_set_recur_weekly -- Sets the recurrence of the streams global event structure
mcal_event_set_recur_yearly -- Sets the recurrence of the streams global event structure
mcal_event_set_start -- Sets the start date and time of the streams global event structure
mcal_event_set_title -- Sets the title of the streams global event structure
mcal_expunge -- Deletes all events marked for being expunged.
mcal_fetch_current_stream_event -- Returns an object containing the current streams event structure
mcal_fetch_event -- Fetches an event from the calendar stream
mcal_is_leap_year -- Returns if the given year is a leap year or not
mcal_list_alarms -- Return a list of events that has an alarm triggered at the given datetime
mcal_list_events -- Return a list of IDs for a date or a range of dates.
mcal_next_recurrence -- Returns the next recurrence of the event
mcal_open -- Opens up an MCAL connection
mcal_popen -- Opens up a persistent MCAL connection
mcal_rename_calendar -- Rename an MCAL calendar
mcal_reopen -- Reopens an MCAL connection
mcal_snooze -- Turn off an alarm for an event
mcal_store_event -- Modify an existing event in an MCAL calendar
mcal_time_valid -- Returns TRUE if the given year, month, day is a valid time
mcal_week_of_year -- Returns the week number of the given date
上一頁 | 首頁 | 下一頁
mb_substr | 上一層 | mcal_append_event


Mcrypt Encryption Functions

PHP 手冊
上一頁 下一頁

LIV. Mcrypt Encryption Functions

介紹

This is an interface to the mcrypt library, which supports a wide variety of block algorithms such as DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 and GOST in CBC, OFB, CFB and ECB cipher modes. Additionally, it supports RC6 and IDEA which are considered "non-free".

需求

These functions work using mcrypt.

If you linked against libmcrypt 2.4.x or higher, the following additional block algorithms are supported: CAST, LOKI97, RIJNDAEL, SAFERPLUS, SERPENT and the following stream ciphers: ENIGMA (crypt), PANAMA, RC4 and WAKE. With libmcrypt 2.4.x or higher another cipher mode is also available; nOFB.

安裝

To use it, download libmcrypt-x.x.tar.gz from here and follow the included installation instructions. You need to compile PHP with the --with-mcrypt parameter to enable this extension. Make sure you compile libmcrypt with the option --disable-posix-threads.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Mcrypt configuration options

Name | Default | Changeable
mcrypt.algorithms_dir | NULL | PHP_INI_ALL
mcrypt.modes_dir | NULL | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

Mcrypt can operate in four block cipher modes (CBC, OFB, CFB, and ECB). If linked against libmcrypt-2.4.x or higher the functions can also operate in the block cipher mode nOFB and in STREAM mode. Below you find a list with all supported encryption modes together with the constants that are defines for the encryption mode. For a more complete reference and discussion see Applied Cryptography by Schneier (ISBN 0-471-11709-9).

  • MCRYPT_MODE_ECB (electronic codebook) is suitable for random data, such as encrypting other keys. Since data there is short and random, the disadvantages of ECB have a favorable negative effect.

  • MCRYPT_MODE_CBC (cipher block chaining) is especially suitable for encrypting files where the security is increased over ECB significantly.

  • MCRYPT_MODE_CFB (cipher feedback) is the best mode for encrypting byte streams where single bytes must be encrypted.

  • MCRYPT_MODE_OFB (output feedback, in 8bit) is comparable to CFB, but can be used in applications where error propagation cannot be tolerated. It's insecure (because it operates in 8bit mode) so it is not recommended to use it.

  • MCRYPT_MODE_NOFB (output feedback, in nbit) is comparable to OFB, but more secure because it operates on the block size of the algorithm.

  • MCRYPT_MODE_STREAM is an extra mode to include some stream algorithms like WAKE or RC4.

Some other mode and random device constants:

MCRYPT_ENCRYPT (integer)

MCRYPT_DECRYPT (integer)

MCRYPT_DEV_RANDOM (integer)

MCRYPT_DEV_URANDOM (integer)

MCRYPT_RAND (integer)

Mcrypt ciphers

Here is a list of ciphers which are currently supported by the mcrypt extension. For a complete list of supported ciphers, see the defines at the end of mcrypt.h. The general rule with the mcrypt-2.2.x API is that you can access the cipher from PHP with MCRYPT_ciphername. With the libmcrypt-2.4.x and libmcrypt-2.5.x API these constants also work, but it is possible to specify the name of the cipher as a string with a call to mcrypt_module_open().

  • MCRYPT_3DES

  • MCRYPT_ARCFOUR_IV (libmcrypt > 2.4.x only)

  • MCRYPT_ARCFOUR (libmcrypt > 2.4.x only)

  • MCRYPT_BLOWFISH

  • MCRYPT_CAST_128

  • MCRYPT_CAST_256

  • MCRYPT_CRYPT

  • MCRYPT_DES

  • MCRYPT_DES_COMPAT (libmcrypt 2.2.x only)

  • MCRYPT_ENIGMA (libmcrypt > 2.4.x only, alias for MCRYPT_CRYPT)

  • MCRYPT_GOST

  • MCRYPT_IDEA (non-free)

  • MCRYPT_LOKI97 (libmcrypt > 2.4.x only)

  • MCRYPT_MARS (libmcrypt > 2.4.x only, non-free)

  • MCRYPT_PANAMA (libmcrypt > 2.4.x only)

  • MCRYPT_RIJNDAEL_128 (libmcrypt > 2.4.x only)

  • MCRYPT_RIJNDAEL_192 (libmcrypt > 2.4.x only)

  • MCRYPT_RIJNDAEL_256 (libmcrypt > 2.4.x only)

  • MCRYPT_RC2

  • MCRYPT_RC4 (libmcrypt 2.2.x only)

  • MCRYPT_RC6 (libmcrypt > 2.4.x only)

  • MCRYPT_RC6_128 (libmcrypt 2.2.x only)

  • MCRYPT_RC6_192 (libmcrypt 2.2.x only)

  • MCRYPT_RC6_256 (libmcrypt 2.2.x only)

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_SAFERPLUS (libmcrypt > 2.4.x only)

  • MCRYPT_SERPENT(libmcrypt > 2.4.x only)

  • MCRYPT_SERPENT_128 (libmcrypt 2.2.x only)

  • MCRYPT_SERPENT_192 (libmcrypt 2.2.x only)

  • MCRYPT_SERPENT_256 (libmcrypt 2.2.x only)

  • MCRYPT_SKIPJACK (libmcrypt > 2.4.x only)

  • MCRYPT_TEAN (libmcrypt 2.2.x only)

  • MCRYPT_THREEWAY

  • MCRYPT_TRIPLEDES (libmcrypt > 2.4.x only)

  • MCRYPT_TWOFISH (for older mcrypt 2.x versions, or mcrypt > 2.4.x )

  • MCRYPT_TWOFISH128 (TWOFISHxxx are available in newer 2.x versions, but not in the 2.4.x versions)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_WAKE (libmcrypt > 2.4.x only)

  • MCRYPT_XTEA (libmcrypt > 2.4.x only)

You must (in CFB and OFB mode) or can (in CBC mode) supply an initialization vector (IV) to the respective cipher function. The IV must be unique and must be the same when decrypting/encrypting. With data which is stored encrypted, you can take the output of a function of the index under which the data is stored (e.g. the MD5 key of the filename). Alternatively, you can transmit the IV together with the encrypted data (see chapter 9.3 of Applied Cryptography by Schneier (ISBN 0-471-11709-9) for a discussion of this topic).

範例

Mcrypt can be used to encrypt and decrypt using the above mentioned ciphers. If you linked against libmcrypt-2.2.x, the four important mcrypt commands (mcrypt_cfb(), mcrypt_cbc(), mcrypt_ecb(), and mcrypt_ofb()) can operate in both modes which are named MCRYPT_ENCRYPT and MCRYPT_DECRYPT, respectively.

例子 1. Encrypt an input value with TripleDES under 2.2.x in ECB mode

<?php
$key = "this is a very secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>
This example will give you the encrypted data as a string in $encrypted_data.

If you linked against libmcrypt 2.4.x or 2.5.x, these functions are still available, but it is recommended that you use the advanced functions.

例子 2. Encrypt an input value with TripleDES under 2.4.x and higher in ECB mode

<?php
    $key = "this is a very secret key";
    $input = "Let us meet at 9 o'clock at the secret place.";

    $td = mcrypt_module_open ('tripledes', '', 'ecb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
    mcrypt_generic_init ($td, $key, $iv);
    $encrypted_data = mcrypt_generic ($td, $input);
    mcrypt_generic_end ($td);
?>
This example will give you the encrypted data as a string in $encrypted_data. For a full example see mcrypt_module_open().

目錄
mcrypt_cbc -- Encrypt/decrypt data in CBC mode
mcrypt_cfb -- Encrypt/decrypt data in CFB mode
mcrypt_create_iv -- Create an initialization vector (IV) from a random source
mcrypt_decrypt -- Decrypts crypttext with given parameters
mcrypt_ecb -- Encrypt/decrypt data in ECB mode
mcrypt_enc_get_algorithms_name -- Returns the name of the opened algorithm
mcrypt_enc_get_block_size -- Returns the blocksize of the opened algorithm
mcrypt_enc_get_iv_size -- Returns the size of the IV of the opened algorithm
mcrypt_enc_get_key_size -- Returns the maximum supported keysize of the opened mode
mcrypt_enc_get_modes_name -- Returns the name of the opened mode
mcrypt_enc_get_supported_key_sizes -- Returns an array with the supported keysizes of the opened algorithm
mcrypt_enc_is_block_algorithm_mode -- Checks whether the encryption of the opened mode works on blocks
mcrypt_enc_is_block_algorithm -- Checks whether the algorithm of the opened mode is a block algorithm
mcrypt_enc_is_block_mode -- Checks whether the opened mode outputs blocks
mcrypt_enc_self_test -- This function runs a self test on the opened module
mcrypt_encrypt -- Encrypts plaintext with given parameters
mcrypt_generic_deinit -- This function deinitializes an encryption module
mcrypt_generic_end -- This function terminates encryption
mcrypt_generic_init -- This function initializes all buffers needed for encryption
mcrypt_generic -- This function encrypts data
mcrypt_get_block_size -- Get the block size of the specified cipher
mcrypt_get_cipher_name -- Get the name of the specified cipher
mcrypt_get_iv_size -- Returns the size of the IV belonging to a specific cipher/mode combination
mcrypt_get_key_size -- Get the key size of the specified cipher
mcrypt_list_algorithms -- Get an array of all supported ciphers
mcrypt_list_modes -- Get an array of all supported modes
mcrypt_module_close -- Close the mcrypt module
mcrypt_module_get_algo_block_size -- Returns the blocksize of the specified algorithm
mcrypt_module_get_algo_key_size -- Returns the maximum supported keysize of the opened mode
mcrypt_module_get_supported_key_sizes -- Returns an array with the supported keysizes of the opened algorithm
mcrypt_module_is_block_algorithm_mode -- This function returns if the the specified module is a block algorithm or not
mcrypt_module_is_block_algorithm -- This function checks whether the specified algorithm is a block algorithm
mcrypt_module_is_block_mode -- This function returns if the the specified mode outputs blocks or not
mcrypt_module_open -- This function opens the module of the algorithm and the mode to be used
mcrypt_module_self_test -- This function runs a self test on the specified module
mcrypt_ofb -- Encrypt/decrypt data in OFB mode
mdecrypt_generic -- This function decrypts data
上一頁 | 首頁 | 下一頁
mcal_week_of_year | 上一層 | mcrypt_cbc


MCVE Payment Functions

PHP 手冊
上一頁 下一頁

LV. MCVE Payment Functions

介紹

These functions interface the MCVE API (libmcve), allowing you to work directly with MCVE from your PHP scripts. MCVE is Main Street Softworks' solution to direct credit card processing. It lets you directly address the credit card clearing houses via your *nix box, modem and/or internet connection (bypassing the need for an additional service such as Authorize.Net or Pay Flow Pro). Using the MCVE module for PHP, you can process credit cards directly through MCVE via your PHP scripts. The following references will outline the process.

註: MCVE is the replacement for RedHat's CCVS. They contracted with RedHat in late 2001 to migrate all existing clientelle to the MCVE platform.

安裝

To enable MCVE Support in PHP, first verify your LibMCVE installation directory. You will then need to configure PHP with the --with-mcve option. If you use this option without specifying the path to your MCVE installation, PHP will attempt to look in the default LibMCVE Install location (/usr/local). If MCVE is in a non-standard location, run configure with: --with-mcve=$mcve_path, where $mcve_path is the path to your MCVE installation. Please note that MCVE support requires that $mcve_path/lib and $mcve_path/include exist, and include mcve.h under the include directory and libmcve.so and/or libmcve.a under the lib directory.

Since MCVE has true server/client separation, there are no additional requirements for running PHP with MCVE support. To test your MCVE extension in PHP, you may connect to testbox.mcve.com on port 8333 for IP, or port 8444 for SSL using the MCVE PHP API. Use 'vitale' for your username, and 'test' for your password. Additional information about test facilities are available at www.mcve.com.

相關參考

Additional documentation about MCVE's PHP API can be found at http://www.mcve.com/docs/phpapi.pdf. Main Street's documentation is complete and should be the primary reference for functions.

目錄
mcve_adduser -- Add an MCVE user using usersetup structure
mcve_adduserarg -- Add a value to user configuration structure
mcve_bt -- Get unsettled batch totals
mcve_checkstatus -- Check to see if a transaction has completed
mcve_chkpwd -- Verify Password
mcve_chngpwd -- Change the system administrator's password
mcve_completeauthorizations -- Number of complete authorizations in queue, returning an array of their identifiers
mcve_connect -- Establish the connection to MCVE
mcve_connectionerror -- Get a textual representation of why a connection failed
mcve_deleteresponse -- Delete specified transaction from MCVE_CONN structure
mcve_deletetrans -- Delete specified transaction from MCVE_CONN structure
mcve_deleteusersetup -- Deallocate data associated with usersetup structure
mcve_deluser -- Delete an MCVE user account
mcve_destroyconn -- Destroy the connection and MCVE_CONN structure
mcve_destroyengine -- Free memory associated with IP/SSL connectivity
mcve_disableuser -- Disable an active MCVE user account
mcve_edituser -- Edit MCVE user using usersetup structure
mcve_enableuser -- Enable an inactive MCVE user account
mcve_force -- Send a FORCE to MCVE. (typically, a phone-authorization)
mcve_getcell -- Get a specific cell from a comma delimited response by column name
mcve_getcellbynum -- Get a specific cell from a comma delimited response by column number
mcve_getcommadelimited -- Get the RAW comma delimited data returned from MCVE
mcve_getheader -- Get the name of the column in a comma-delimited response
mcve_getuserarg -- Grab a value from usersetup structure
mcve_getuserparam -- Get a user response parameter
mcve_gft -- Audit MCVE for Failed transactions
mcve_gl -- Audit MCVE for settled transactions
mcve_gut -- Audit MCVE for Unsettled Transactions
mcve_initconn -- Create and initialize an MCVE_CONN structure
mcve_initengine -- Ready the client for IP/SSL Communication
mcve_initusersetup -- Initialize structure to store user data
mcve_iscommadelimited -- Checks to see if response is comma delimited
mcve_liststats -- List statistics for all users on MCVE system
mcve_listusers -- List all users on MCVE system
mcve_maxconntimeout -- The maximum amount of time the API will attempt a connection to MCVE
mcve_monitor -- Perform communication with MCVE (send/receive data) Non-blocking
mcve_numcolumns -- Number of columns returned in a comma delimited response
mcve_numrows -- Number of rows returned in a comma delimited response
mcve_override -- Send an OVERRIDE to MCVE
mcve_parsecommadelimited -- Parse the comma delimited response so mcve_getcell, etc will work
mcve_ping -- Send a ping request to MCVE
mcve_preauth -- Send a PREAUTHORIZATION to MCVE
mcve_preauthcompletion -- Complete a PREAUTHORIZATION... Ready it for settlement
mcve_qc -- Audit MCVE for a list of transactions in the outgoing queue
mcve_responseparam -- Get a custom response parameter
mcve_return -- Issue a RETURN or CREDIT to MCVE
mcve_returncode -- Grab the exact return code from the transaction
mcve_returnstatus -- Check to see if the transaction was successful
mcve_sale -- Send a SALE to MCVE
mcve_setblocking -- Set blocking/non-blocking mode for connection
mcve_setdropfile -- Set the connection method to Drop-File
mcve_setip -- Set the connection method to IP
mcve_setssl -- Set the connection method to SSL
mcve_settimeout -- Set maximum transaction time (per trans)
mcve_settle -- Issue a settlement command to do a batch deposit
mcve_text_avs -- Get a textual representation of the return_avs
mcve_text_code -- Get a textual representation of the return_code
mcve_text_cv -- Get a textual representation of the return_cv
mcve_transactionauth -- Get the authorization number returned for the transaction (alpha-numeric)
mcve_transactionavs -- Get the Address Verification return status
mcve_transactionbatch -- Get the batch number associated with the transaction
mcve_transactioncv -- Get the CVC2/CVV2/CID return status
mcve_transactionid -- Get the unique system id for the transaction
mcve_transactionitem -- Get the ITEM number in the associated batch for this transaction
mcve_transactionssent -- Check to see if outgoing buffer is clear
mcve_transactiontext -- Get verbiage (text) return from MCVE or processing institution
mcve_transinqueue -- Number of transactions in client-queue
mcve_transnew -- Start a new transaction
mcve_transparam -- Add a parameter to a transaction
mcve_transsend -- Finalize and send the transaction
mcve_ub -- Get a list of all Unsettled batches
mcve_uwait -- Wait x microsecs
mcve_verifyconnection -- Set whether or not to PING upon connect to verify connection
mcve_verifysslcert -- Set whether or not to verify the server ssl certificate
mcve_void -- VOID a transaction in the settlement queue
上一頁 | 首頁 | 下一頁
mdecrypt_generic | 上一層 | mcve_adduser


Mhash Functions

PHP 手冊
上一頁 下一頁

LVI. Mhash Functions

介紹

These functions are intended to work with mhash. Mhash can be used to create checksums, message digests, message authentication codes, and more.

This is an interface to the mhash library. mhash supports a wide variety of hash algorithms such as MD5, SHA1, GOST, and many others. For a complete list of supported hashes, refer to the documentation of mhash. The general rule is that you can access the hash algorithm from PHP with MHASH_HASHNAME. For example, to access TIGER you use the PHP constant MHASH_TIGER.

需求

To use it, download the mhash distribution from its web site and follow the included installation instructions.

安裝

You need to compile PHP with the --with-mhash[=DIR] parameter to enable this extension. DIR is the mhash install directory.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

Here is a list of hashes which are currently supported by mhash. If a hash is not listed here, but is listed by mhash as supported, you can safely assume that this documentation is outdated.

  • MHASH_MD5

  • MHASH_SHA1

  • MHASH_HAVAL256

  • MHASH_HAVAL192

  • MHASH_HAVAL160

  • MHASH_HAVAL128

  • MHASH_RIPEMD160

  • MHASH_GOST

  • MHASH_TIGER

  • MHASH_CRC32

  • MHASH_CRC32B

範例

例子 1. Compute the MD5 digest and hmac and print it out as hex

<?php
$input = "what do ya want for nothing?";
$hash = mhash (MHASH_MD5, $input);
print "The hash is ".bin2hex ($hash)."<br />\n";
$hash = mhash (MHASH_MD5, $input, "Jefe");
print "The hmac is ".bin2hex ($hash)."<br />\n";
?>

This will produce:
The hash is d03cb659cbf9192dcd066272249f8412
The hmac is 750c783e6ab0b503eaa86e310a5db738

目錄
mhash_count -- Get the highest available hash id
mhash_get_block_size -- Get the block size of the specified hash
mhash_get_hash_name -- Get the name of the specified hash
mhash_keygen_s2k -- Generates a key
mhash -- Compute hash
上一頁 | 首頁 | 下一頁
mcve_void | 上一層 | mhash_count


Mimetype Functions

PHP 手冊
上一頁 下一頁

LVII. Mimetype Functions

介紹

The functions in this module try to guess the content type and encoding of a file by looking for certain magic byte sequences at specific positions within the file. While this is not a bullet proof approach the heuristics used do a very good job.

This extension is derivated from Apache mod_mime_magic, which is itself based on the file command maintaind by Ian F. Darwin. See the source code for further historic and copyright information.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

The extension needs a copy of the magic.mime as distributed with the file command. This file also part of most recent Linux distributions and usually stored in the /usr/share/misc directory.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Mimetype configuration options

Name | Default | Changeable
mime_magic.magicfile | "/usr/share/misc/magic.mime" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
mime_content_type -- Detect MIME Content-type for a file
上一頁 | 首頁 | 下一頁
mhash | 上一層 | mime_content_type


Ming functions for Flash

PHP 手冊
上一頁 下一頁

LIX. Ming functions for Flash

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

介紹

First of all: Ming is not an acronym. Ming is an open-source (LGPL) library which allows you to create SWF ("Flash") format movies. Ming supports almost all of Flash 4's features, including: shapes, gradients, bitmaps (pngs and jpegs), morphs ("shape tweens"), text, buttons, actions, sprites ("movie clips"), streaming mp3, and color transforms --the only thing that's missing is sound events.

Note that all values specifying length, distance, size, etc. are in "twips", twenty units per pixel. That's pretty much arbitrary, though, since the player scales the movie to whatever pixel size is specified in the embed/object tag, or the entire frame if not embedded.

Ming offers a number of advantages over the existing PHP/libswf module. You can use Ming anywhere you can compile the code, whereas libswf is closed-source and only available for a few platforms, Windows not one of them. Ming provides some insulation from the mundane details of the SWF file format, wrapping the movie elements in PHP objects. Also, Ming is still being maintained; if there's a feature that you want to see, just let us know ming@opaque.net.

Ming was added in PHP 4.0.5.

需求

To use Ming with PHP, you first need to build and install the Ming library. Source code and installation instructions are available at the Ming home page: http://ming.sourceforge.net/ along with examples, a small tutorial, and the latest news.

Download the ming archive. Unpack the archive. Go in the Ming directory. make. make install.

This will build libming.so and install it into /usr/lib/, and copy ming.h into /usr/include/. Edit the PREFIX= line in the Makefile to change the installation directory.

安裝

例子 1. built into php (unix)

mkdir <phpdir>/ext/ming
cp php_ext/* <phpdir>/ext/ming
cd <phpdir>
./buildconf
./configure --with-ming <other config options>

Build and install php as usual, restart web server if necessary.

Now either just add extension=php_ming.so to your php.ini file, or put dl('php_ming.so'); at the head of all of your Ming scripts.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

SWFBUTTON_HIT (integer)

SWFBUTTON_DOWN (integer)

SWFBUTTON_OVER (integer)

SWFBUTTON_UP (integer)

SWFBUTTON_MOUSEUPOUTSIDE (integer)

SWFBUTTON_DRAGOVER (integer)

SWFBUTTON_DRAGOUT (integer)

SWFBUTTON_MOUSEUP (integer)

SWFBUTTON_MOUSEDOWN (integer)

SWFBUTTON_MOUSEOUT (integer)

SWFBUTTON_MOUSEOVER (integer)

SWFFILL_RADIAL_GRADIENT (integer)

SWFFILL_LINEAR_GRADIENT (integer)

SWFFILL_TILED_BITMAP (integer)

SWFFILL_CLIPPED_BITMAP (integer)

SWFTEXTFIELD_HASLENGTH (integer)

SWFTEXTFIELD_NOEDIT (integer)

SWFTEXTFIELD_PASSWORD (integer)

SWFTEXTFIELD_MULTILINE (integer)

SWFTEXTFIELD_WORDWRAP (integer)

SWFTEXTFIELD_DRAWBOX (integer)

SWFTEXTFIELD_NOSELECT (integer)

SWFTEXTFIELD_HTML (integer)

SWFTEXTFIELD_ALIGN_LEFT (integer)

SWFTEXTFIELD_ALIGN_RIGHT (integer)

SWFTEXTFIELD_ALIGN_CENTER (integer)

SWFTEXTFIELD_ALIGN_JUSTIFY (integer)

SWFACTION_ONLOAD (integer)

SWFACTION_ENTERFRAME (integer)

SWFACTION_UNLOAD (integer)

SWFACTION_MOUSEMOVE (integer)

SWFACTION_MOUSEDOWN (integer)

SWFACTION_MOUSEUP (integer)

SWFACTION_KEYDOWN (integer)

SWFACTION_KEYUP (integer)

SWFACTION_DATA (integer)

預定義類

由於這些類是由該擴展模塊定義的，因此它們僅在該擴展模塊被編譯到 PHP 內核中，或者在執行時被動態加載後才有效。

Ming introduces 13 new objects in PHP, all with matching methods and attributes. To use them, you need to know about objects.

swfshape

swffill

swfgradient

swfbitmap

swftext

swftextfield

swffont

swfdisplayitem

swfmovie

swfbutton

swfaction

swfmorph

swfsprite

目錄
ming_setcubicthreshold -- Set cubic threshold (?)
ming_setscale -- Set scale (?)
ming_useswfversion -- Use SWF version (?)
SWFAction -- Creates a new Action.
SWFBitmap->getHeight -- Returns the bitmap's height.
SWFBitmap->getWidth -- Returns the bitmap's width.
SWFBitmap -- Loads Bitmap object
swfbutton_keypress -- Returns the action flag for keyPress(char)
SWFbutton->addAction -- Adds an action
SWFbutton->addShape -- Adds a shape to a button
SWFbutton->setAction -- Sets the action
SWFbutton->setdown -- Alias for addShape(shape, SWFBUTTON_DOWN))
SWFbutton->setHit -- Alias for addShape(shape, SWFBUTTON_HIT)
SWFbutton->setOver -- Alias for addShape(shape, SWFBUTTON_OVER)
SWFbutton->setUp -- Alias for addShape(shape, SWFBUTTON_UP)
SWFbutton -- Creates a new Button.
SWFDisplayItem->addColor -- Adds the given color to this item's color transform.
SWFDisplayItem->move -- Moves object in relative coordinates.
SWFDisplayItem->moveTo -- Moves object in global coordinates.
SWFDisplayItem->multColor -- Multiplies the item's color transform.
SWFDisplayItem->remove -- Removes the object from the movie
SWFDisplayItem->Rotate -- Rotates in relative coordinates.
SWFDisplayItem->rotateTo -- Rotates the object in global coordinates.
SWFDisplayItem->scale -- Scales the object in relative coordinates.
SWFDisplayItem->scaleTo -- Scales the object in global coordinates.
SWFDisplayItem->setDepth -- Sets z-order
SWFDisplayItem->setName -- Sets the object's name
SWFDisplayItem->setRatio -- Sets the object's ratio.
SWFDisplayItem->skewX -- Sets the X-skew.
SWFDisplayItem->skewXTo -- Sets the X-skew.
SWFDisplayItem->skewY -- Sets the Y-skew.
SWFDisplayItem->skewYTo -- Sets the Y-skew.
SWFDisplayItem -- Creates a new displayitem object.
SWFFill->moveTo -- Moves fill origin
SWFFill->rotateTo -- Sets fill's rotation
SWFFill->scaleTo -- Sets fill's scale
SWFFill->skewXTo -- Sets fill x-skew
SWFFill->skewYTo -- Sets fill y-skew
SWFFill -- Loads SWFFill object
swffont->getwidth -- Returns the string's width
SWFFont -- Loads a font definition
SWFGradient->addEntry -- Adds an entry to the gradient list.
SWFGradient -- Creates a gradient object
SWFMorph->getshape1 -- Gets a handle to the starting shape
SWFMorph->getshape2 -- Gets a handle to the ending shape
SWFMorph -- Creates a new SWFMorph object.
SWFMovie->add -- Adds any type of data to a movie.
SWFMovie->nextframe -- Moves to the next frame of the animation.
SWFMovie->output -- Dumps your lovingly prepared movie out.
SWFMovie->remove -- Removes the object instance from the display list.
SWFMovie->save -- Saves your movie in a file.
SWFMovie->setbackground -- Sets the background color.
SWFMovie->setdimension -- Sets the movie's width and height.
SWFMovie->setframes -- Sets the total number of frames in the animation.
SWFMovie->setrate -- Sets the animation's frame rate.
SWFMovie->streammp3 -- Streams a MP3 file.
SWFMovie -- Creates a new movie object, representing an SWF version 4 movie.
SWFShape->addFill -- Adds a solid fill to the shape.
SWFShape->drawCurve -- Draws a curve (relative).
SWFShape->drawCurveTo -- Draws a curve.
SWFShape->drawLine -- Draws a line (relative).
SWFShape->drawLineTo -- Draws a line.
SWFShape->movePen -- Moves the shape's pen (relative).
SWFShape->movePenTo -- Moves the shape's pen.
SWFShape->setLeftFill -- Sets left rasterizing color.
SWFShape->setLine -- Sets the shape's line style.
SWFShape->setRightFill -- Sets right rasterizing color.
SWFShape -- Creates a new shape object.
SWFSprite->add -- Adds an object to a sprite
SWFSprite->nextframe -- Moves to the next frame of the animation.
SWFSprite->remove -- Removes an object to a sprite
SWFSprite->setframes -- Sets the total number of frames in the animation.
SWFSprite -- Creates a movie clip (a sprite)
SWFText->addString -- Draws a string
SWFText->getWidth -- Computes string's width
SWFText->moveTo -- Moves the pen
SWFText->setColor -- Sets the current font color
SWFText->setFont -- Sets the current font
SWFText->setHeight -- Sets the current font height
SWFText->setSpacing -- Sets the current font spacing
SWFText -- Creates a new SWFText object.
SWFTextField->addstring -- Concatenates the given string to the text field
SWFTextField->align -- Sets the text field alignment
SWFTextField->setbounds -- Sets the text field width and height
SWFTextField->setcolor -- Sets the color of the text field.
SWFTextField->setFont -- Sets the text field font
SWFTextField->setHeight -- Sets the font height of this text field font.
SWFTextField->setindentation -- Sets the indentation of the first line.
SWFTextField->setLeftMargin -- Sets the left margin width of the text field.
SWFTextField->setLineSpacing -- Sets the line spacing of the text field.
SWFTextField->setMargins -- Sets the margins width of the text field.
SWFTextField->setname -- Sets the variable name
SWFTextField->setrightMargin -- Sets the right margin width of the text field.
SWFTextField -- Creates a text field object
上一頁 | 首頁 | 下一頁
mssql_select_db | 上一層 | ming_setcubicthreshold


Miscellaneous functions

PHP 手冊
上一頁 下一頁

LX. Miscellaneous functions

介紹

These functions were placed here because none of the other categories seemed to fit.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Misc. Configuration Options

Name | Default | Changeable
ignore_user_abort | "0" | PHP_INI_ALL
highlight.string | #CC0000 | PHP_INI_ALL
highlight.comment | #FF9900 | PHP_INI_ALL
highlight.keyword | #006600 | PHP_INI_ALL
highlight.bg | #FFFFFF | PHP_INI_ALL
highlight.default | #0000CC | PHP_INI_ALL
highlight.html | #000000 | PHP_INI_ALL
browscap | NULL | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

ignore_user_abort boolean

TRUE by default. If changed to FALSE scripts will be terminated as soon as they try to output something after a client has aborted their connection.

See also ignore_user_abort().

highlight.xxx string

Colors for Syntax Highlighting mode. Anything that's acceptable in <font color="??????"> would work.

browscap string

Name (e.g.: browscap.ini)and location of browser capabilities file. See also get_browser().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
connection_aborted -- Returns TRUE if client disconnected
connection_status -- Returns connection status bitfield
connection_timeout -- Return TRUE if script timed out
constant -- Returns the value of a constant
define -- Defines a named constant.
defined -- Checks whether a given named constant exists
die -- Alias of exit()
eval -- Evaluate a string as PHP code
exit -- Output a message and terminate the current script
get_browser -- Tells what the user's browser is capable of
highlight_file -- Syntax highlighting of a file
highlight_string -- Syntax highlighting of a string
ignore_user_abort -- Set whether a client disconnect should abort script execution
leak -- Leak memory
pack -- Pack data into binary string.
show_source -- Syntax highlighting of a file
sleep -- Delay execution
uniqid -- Generate a unique ID
unpack -- Unpack data from binary string
usleep -- Delay execution in microseconds
上一頁 | 首頁 | 下一頁
SWFTextField | 上一層 | connection_aborted


mnoGoSearch Functions

PHP 手冊
上一頁 下一頁

LXI. mnoGoSearch Functions

介紹

These functions allow you to access the mnoGoSearch (former UdmSearch) free search engine. mnoGoSearch is a full-featured search engine software for intranet and internet servers, distributed under the GNU license. mnoGoSearch has a number of unique features, which makes it appropriate for a wide range of applications from search within your site to a specialized search system such as cooking recipes or newspaper search, FTP archive search, news articles search, etc. It offers full-text indexing and searching for HTML, PDF, and text documents. mnoGoSearch consists of two parts. The first is an indexing mechanism (indexer). The purpose of the indexer is to walk through HTTP, FTP, NEWS servers or local files, recursively grabbing all the documents and storing meta-data about that documents in a SQL database in a smart and effective manner. After every document is referenced by its corresponding URL, meta-data is collected by the indexer for later use in a search process. The search is performed via Web interface. C, CGI, PHP and Perl search front ends are included.

More information about mnoGoSearch can be found at http://www.mnogosearch.ru/.

需求

Download mnoGosearch from http://www.mnogosearch.ru/ and install it on your system. You need at least version 3.1.10 of mnoGoSearch installed to use these functions.

安裝

In order to have these functions available, you must compile PHP with mnoGosearch support by using the --with-mnogosearch option. If you use this option without specifying the path to mnoGosearch, PHP will look for mnoGosearch under /usr/local/mnogosearch path by default. If you installed mnoGosearch at a different location you should specify it: --with-mnogosearch=DIR.

註: PHP contains built-in MySQL access library, which can be used to access MySQL. It is known that mnoGoSearch is not compatible with this built-in library and can work only with generic MySQL libraries. Thus, if you use mnoGoSearch with MySQL, during PHP configuration you have to indicate the directory of your MySQL installation, that was used during mnoGoSearch configuration, i.e. for example: --with-mnogosearch --with-mysql=/usr.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

UDM_FIELD_URLID (integer)

UDM_FIELD_URL (integer)

UDM_FIELD_CONTENT (integer)

UDM_FIELD_TITLE (integer)

UDM_FIELD_KEYWORDS (integer)

UDM_FIELD_DESC (integer)

UDM_FIELD_DESCRIPTION (integer)

UDM_FIELD_TEXT (integer)

UDM_FIELD_SIZE (integer)

UDM_FIELD_RATING (integer)

UDM_FIELD_SCORE (integer)

UDM_FIELD_MODIFIED (integer)

UDM_FIELD_ORDER (integer)

UDM_FIELD_CRC (integer)

UDM_FIELD_CATEGORY (integer)

UDM_FIELD_LANG (integer)

UDM_FIELD_CHARSET (integer)

UDM_PARAM_PAGE_SIZE (integer)

UDM_PARAM_PAGE_NUM (integer)

UDM_PARAM_SEARCH_MODE (integer)

UDM_PARAM_CACHE_MODE (integer)

UDM_PARAM_TRACK_MODE (integer)

UDM_PARAM_PHRASE_MODE (integer)

UDM_PARAM_CHARSET (integer)

UDM_PARAM_LOCAL_CHARSET (integer)

UDM_PARAM_BROWSER_CHARSET (integer)

UDM_PARAM_STOPTABLE (integer)

UDM_PARAM_STOP_TABLE (integer)

UDM_PARAM_STOPFILE (integer)

UDM_PARAM_STOP_FILE (integer)

UDM_PARAM_WEIGHT_FACTOR (integer)

UDM_PARAM_WORD_MATCH (integer)

UDM_PARAM_MAX_WORD_LEN (integer)

UDM_PARAM_MAX_WORDLEN (integer)

UDM_PARAM_MIN_WORD_LEN (integer)

UDM_PARAM_MIN_WORDLEN (integer)

UDM_PARAM_ISPELL_PREFIXES (integer)

UDM_PARAM_ISPELL_PREFIX (integer)

UDM_PARAM_PREFIXES (integer)

UDM_PARAM_PREFIX (integer)

UDM_PARAM_CROSS_WORDS (integer)

UDM_PARAM_CROSSWORDS (integer)

UDM_PARAM_VARDIR (integer)

UDM_PARAM_DATADIR (integer)

UDM_PARAM_HLBEG (integer)

UDM_PARAM_HLEND (integer)

UDM_PARAM_SYNONYM (integer)

UDM_PARAM_SEARCHD (integer)

UDM_PARAM_QSTRING (integer)

UDM_PARAM_REMOTE_ADDR (integer)

UDM_LIMIT_CAT (integer)

UDM_LIMIT_URL (integer)

UDM_LIMIT_TAG (integer)

UDM_LIMIT_LANG (integer)

UDM_LIMIT_DATE (integer)

UDM_PARAM_FOUND (integer)

UDM_PARAM_NUM_ROWS (integer)

UDM_PARAM_WORDINFO (integer)

UDM_PARAM_WORD_INFO (integer)

UDM_PARAM_SEARCHTIME (integer)

UDM_PARAM_SEARCH_TIME (integer)

UDM_PARAM_FIRST_DOC (integer)

UDM_PARAM_LAST_DOC (integer)

UDM_MODE_ALL (integer)

UDM_MODE_ANY (integer)

UDM_MODE_BOOL (integer)

UDM_MODE_PHRASE (integer)

UDM_CACHE_ENABLED (integer)

UDM_CACHE_DISABLED (integer)

UDM_TRACK_ENABLED (integer)

UDM_TRACK_DISABLED (integer)

UDM_PHRASE_ENABLED (integer)

UDM_PHRASE_DISABLED (integer)

UDM_CROSS_WORDS_ENABLED (integer)

UDM_CROSSWORDS_ENABLED (integer)

UDM_CROSS_WORDS_DISABLED (integer)

UDM_CROSSWORDS_DISABLED (integer)

UDM_PREFIXES_ENABLED (integer)

UDM_PREFIX_ENABLED (integer)

UDM_ISPELL_PREFIXES_ENABLED (integer)

UDM_ISPELL_PREFIX_ENABLED (integer)

UDM_PREFIXES_DISABLED (integer)

UDM_PREFIX_DISABLED (integer)

UDM_ISPELL_PREFIXES_DISABLED (integer)

UDM_ISPELL_PREFIX_DISABLED (integer)

UDM_ISPELL_TYPE_AFFIX (integer)

UDM_ISPELL_TYPE_SPELL (integer)

UDM_ISPELL_TYPE_DB (integer)

UDM_ISPELL_TYPE_SERVER (integer)

UDM_MATCH_WORD (integer)

UDM_MATCH_BEGIN (integer)

UDM_MATCH_SUBSTR (integer)

UDM_MATCH_END (integer)

目錄
udm_add_search_limit -- Add various search limits
udm_alloc_agent -- Allocate mnoGoSearch session
udm_api_version -- Get mnoGoSearch API version.
udm_cat_list -- Get all the categories on the same level with the current one.
udm_cat_path -- Get the path to the current category.
udm_check_charset -- Check if the given charset is known to mnogosearch
udm_check_stored -- Check connection to stored
udm_clear_search_limits -- Clear all mnoGoSearch search restrictions
udm_close_stored -- Close connection to stored
udm_crc32 -- Return CRC32 checksum of gived string
udm_errno -- Get mnoGoSearch error number
udm_error -- Get mnoGoSearch error message
udm_find -- Perform search
udm_free_agent -- Free mnoGoSearch session
udm_free_ispell_data -- Free memory allocated for ispell data
udm_free_res -- Free mnoGoSearch result
udm_get_doc_count -- Get total number of documents in database.
udm_get_res_field -- Fetch mnoGoSearch result field
udm_get_res_param -- Get mnoGoSearch result parameters
udm_load_ispell_data -- Load ispell data
udm_open_stored -- Open connection to stored
udm_set_agent_param -- Set mnoGoSearch agent session parameters
上一頁 | 首頁 | 下一頁
usleep | 上一層 | udm_add_search_limit


Mohawk Software session handler functions

PHP 手冊
上一頁 下一頁

LXIV. Mohawk Software session handler functions

介紹

msession is an interface to a high speed session daemon which can run either locally or remotely. It is designed to provide consistent session management for a PHP web farm. More Information about msession and the session server software itself can be found at http://www.mohawksoft.com/phoenix/.

需求

安裝

執行時配置

資源型別

預定義常數

目錄
msession_connect -- Connect to msession server
msession_count -- Get session count
msession_create -- Create a session
msession_destroy -- Destroy a session
msession_disconnect -- Close connection to msession server
msession_find -- Find value
msession_get_array -- Get array of ... ?
msession_get -- Get value from session
msession_getdata -- Get data ... ?
msession_inc -- Increment value in session
msession_list -- List ... ?
msession_listvar -- List sessions with variable
msession_lock -- Lock a session
msession_plugin -- Call an escape function within the msession personality plugin
msession_randstr -- Get random string
msession_set_array -- Set array of ...
msession_set -- Set value in session
msession_setdata -- Set data ... ?
msession_timeout -- Set/get session timeout
msession_uniq -- Get uniq id
msession_unlock -- Unlock a session
上一頁 | 首頁 | 下一頁
mysql_unbuffered_query | 上一層 | msession_connect


mSQL functions

PHP 手冊
上一頁 下一頁

LXII. mSQL functions

介紹

These functions allow you to access mSQL database servers. More information about mSQL can be found at http://www.hughes.com.au/.

需求

安裝

In order to have these functions available, you must compile PHP with msql support by using the --with-msql[=dir] option. The default location is /usr/local/Hughes.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. mSQL configuration options

Name | Default | Changeable
msql.allow_persistent | "On" | PHP_INI_SYSTEM
msql.max_persistent | "-1" | PHP_INI_SYSTEM
msql.max_links | "-1" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

msql.allow_persistent boolean

Whether to allow persistent mSQL connections.

msql.max_persistent integer

The maximum number of persistent mSQL connections per process.

msql.max_links integer

The maximum number of mSQL connections per process, including persistent connections.

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

MSQL_ASSOC (integer)

MSQL_NUM (integer)

MSQL_BOTH (integer)

目錄
msql_affected_rows -- Returns number of affected rows
msql_close -- Close mSQL connection
msql_connect -- Open mSQL connection
msql_create_db -- Create mSQL database
msql_createdb -- Create mSQL database
msql_data_seek -- Move internal row pointer
msql_dbname -- Get current mSQL database name
msql_drop_db -- Drop (delete) mSQL database
msql_dropdb -- Drop (delete) mSQL database
msql_error -- Returns error message of last msql call
msql_fetch_array -- Fetch row as array
msql_fetch_field -- Get field information
msql_fetch_object -- Fetch row as object
msql_fetch_row -- Get row as enumerated array
msql_field_seek -- Set field offset
msql_fieldflags -- Get field flags
msql_fieldlen -- Get field length
msql_fieldname -- Get field name
msql_fieldtable -- Get table name for field
msql_fieldtype -- Get field type
msql_free_result -- Free result memory
msql_freeresult -- Free result memory
msql_list_dbs -- List mSQL databases on server
msql_list_fields -- List result fields
msql_list_tables -- List tables in an mSQL database
msql_listdbs -- List mSQL databases on server
msql_listfields -- List result fields
msql_listtables -- List tables in an mSQL database
msql_num_fields -- Get number of fields in result
msql_num_rows -- Get number of rows in result
msql_numfields -- Get number of fields in result
msql_numrows -- Get number of rows in result
msql_pconnect -- Open persistent mSQL connection
msql_query -- Send mSQL query
msql_regcase -- Make regular expression for case insensitive match
msql_result -- Get result data
msql_select_db -- Select mSQL database
msql_selectdb -- Select mSQL database
msql_tablename -- Get table name of field
msql -- Send mSQL query
上一頁 | 首頁 | 下一頁
udm_set_agent_param | 上一層 | msql_affected_rows


Microsoft SQL Server functions

PHP 手冊
上一頁 下一頁

LVIII. Microsoft SQL Server functions

介紹

These functions allow you to access MS SQL Server database.

註: The MSSQL extension is available on Win32 systems only. You can use the Sybase extension to connect to MSSQL databases from other platforms.

需求

The extension requires the MS SQL Client Tools to be installed on the system where PHP is installed. The Client Tools can be installed from the MS SQL Server CD or by copying ntwdblib.dll from \winnt\system32 on the server to \winnt\system32 on the PHP box. Copying ntwdblib.dll will only provide access. Configuration of the client will require installation of all the tools.

安裝

The MSSQL extension is enabled by adding extension=php_mssql.dll to php.ini.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. MS SQL Server configuration options

Name | Default | Changeable
mssql.allow_persistent | "1" | PHP_INI_SYSTEM
mssql.max_persistent | "-1" | PHP_INI_SYSTEM
mssql.max_links | "-1" | PHP_INI_SYSTEM
mssql.min_error_severity | "10" | PHP_INI_ALL
mssql.min_message_severity | "10" | PHP_INI_ALL
mssql.compatability_mode | "0" | PHP_INI_ALL
mssql.connect_timeout | "5" | PHP_INI_ALL
mssql.timeout | "60" | PHP_INI_ALL
mssql.textsize | "-1" | PHP_INI_ALL
mssql.textlimit | "-1" | PHP_INI_ALL
mssql.batchsize | "0" | PHP_INI_ALL
mssql.datetimeconvert | "1" | PHP_INI_ALL
mssql.secure_connection | "0" | PHP_INI_SYSTEM
mssql.max_procs | "25" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

MSSQL_ASSOC (integer)

MSSQL_NUM (integer)

MSSQL_BOTH (integer)

SQLTEXT (integer)

SQLVARCHAR (integer)

SQLCHAR (integer)

SQLINT1 (integer)

SQLINT2 (integer)

SQLINT4 (integer)

SQLBIT (integer)

SQLFLT8 (integer)

目錄
mssql_bind -- Adds a parameter to a stored procedure or a remote stored procedure
mssql_close -- Close MS SQL Server connection
mssql_connect -- Open MS SQL server connection
mssql_data_seek -- Move internal row pointer
mssql_execute -- Executes a stored procedure on a MS SQL server database
mssql_fetch_array -- Fetch row as array
mssql_fetch_assoc -- Returns an associative array of the current row in the result set specified by result_id
mssql_fetch_batch -- Returns the next batch of records
mssql_fetch_field -- Get field information
mssql_fetch_object -- Fetch row as object
mssql_fetch_row -- Get row as enumerated array
mssql_field_length -- Get the length of a field
mssql_field_name -- Get the name of a field
mssql_field_seek -- Set field offset
mssql_field_type -- Get the type of a field
mssql_free_result -- Free result memory
mssql_get_last_message -- Returns the last message from server (over min_message_severity?)
mssql_guid_string -- Converts a 16 byte binary GUID to a string
mssql_init -- Initializes a stored procedure or a remote stored procedure
mssql_min_error_severity -- Sets the lower error severity
mssql_min_message_severity -- Sets the lower message severity
mssql_next_result -- Move the internal result pointer to the next result
mssql_num_fields -- Get number of fields in result
mssql_num_rows -- Get number of rows in result
mssql_pconnect -- Open persistent MS SQL connection
mssql_query -- Send MS SQL query
mssql_result -- Get result data
mssql_rows_affected -- Returns the number of records affected by the query
mssql_select_db -- Select MS SQL database
上一頁 | 首頁 | 下一頁
mime_content_type | 上一層 | mssql_bind


muscat functions

PHP 手冊
上一頁 下一頁

LXV. muscat functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
muscat_close -- Shuts down the muscat session and releases any memory back to PHP.
muscat_get -- Gets a line back from the core muscat API.
muscat_give -- Sends string to the core muscat API
muscat_setup_net -- Creates a new muscat session and returns the handle.
muscat_setup -- Creates a new muscat session and returns the handle.
上一頁 | 首頁 | 下一頁
msession_unlock | 上一層 | muscat_close


MySQL 函式庫

PHP 手冊
上一頁 下一頁

LXIII. MySQL 函式庫

介紹

你可以使用該函式庫連接 MySQL 資料庫伺服器。有關 MySQL 的詳細訊息可以到 http://www.mysql.com/ 查詢。

MySQL 的文檔可以在 http://www.mysql.com/documentation/ 找到。

需求

為了能夠順利的使用該函式庫，你必須在編譯 PHP 的時候增加 MySQL 的支援。

安裝

當你選擇了 --with-mysql 配置選項的時候，你打開了 PHP 連接 MySQL 資料庫的功能。 如果你沒有在配置選項中指定 MySQL 的路徑訊息，PHP 會使用內建的 MySQL 客戶端庫函式。在 PHP4 以後的版本中 MySQL 的功能是預定打開的；即使你沒有選擇上面的配置選項，預定的 MySQL 功能也會被打開。用戶如果需要執行一些特定使用 MySQL 的應用（如：以 Apache 模塊化方式執行的 PHP 3 和 PHP 4，或者 auth-mysql 模塊）需要指定 MySQL的路徑： --with-mysql=/path/to/mysql。 這會強迫 PHP 使用 MySQL 在本地安裝的客戶端庫函式來減少未知的衝突。

警告

當該擴展模塊與 recode 擴展模塊共同使用的時候，可能會造成 PHP 的崩潰和啟動時出現問題。請查詢 recode 擴展獲得更多的訊息。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. MySQL Configuration Options

Name | Default | Changeable
mysql.allow_persistent | "On" | PHP_INI_SYSTEM
mysql.max_persistent | "-1" | PHP_INI_SYSTEM
mysql.max_links | "-1" | PHP_INI_SYSTEM
mysql.default_port | NULL | PHP_INI_ALL
mysql.default_socket | NULL | PHP_INI_ALL
mysql.default_host | NULL | PHP_INI_ALL
mysql.default_user | NULL | PHP_INI_ALL
mysql.default_password | NULL | PHP_INI_ALL
mysql.connect_timeout | "0" | PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

mysql.allow_persistent boolean

Whether to allow persistent connections to MySQL.

mysql.max_persistent integer

The maximum number of persistent MySQL connections per process.

mysql.max_links integer

The maximum number of MySQL connections per process, including persistent connections.

mysql.default_port string

The default TCP port number to use when connecting to the database server if no other port is specified. If no default is specified, the port will be obtained from the MYSQL_TCP_PORT environment variable, the mysql-tcp entry in /etc/services or the compile-time MYSQL_PORT constant, in that order. Win32 will only use the MYSQL_PORT constant.

mysql.default_socket string

The default socket name to use when connecting to a local database server if no other socket name is specified.

mysql.default_host string

The default server host to use when connecting to the database server if no other host is specified. Doesn't apply in safe mode.

mysql.default_user string

The default user name to use when connecting to the database server if no other name is specified. Doesn't apply in safe mode.

mysql.default_password string

The default password to use when connecting to the database server if no other password is specified. Doesn't apply in safe mode.

mysql.connect_timeout integer

Connect timeout in seconds. On Linux this timeout is also used for waiting for the first answer from the server.

資源型別

在 MySQL 模塊中使用了兩種資源型別。第一種是資料庫的連接句柄，第二種是 SQL 查詢傳回的結果集。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

在 PHP 4.3.0 以後的版本中，允許在 mysql_connect() 函式和 mysql_pconnect() 函式中指定更多的客戶端標記。下面列出所定義的常數：

表格 2. MySQL 客戶端常數

常數 | 描述
MYSQL_CLIENT_COMPRESS | 使用壓縮的通訊協議
MYSQL_CLIENT_IGNORE_SPACE | 允許在函式名後留空格位
MYSQL_CLIENT_INTERACTIVE | 允許設置斷開連接之前所空閒等候的 interactive_timeout 時間。（代替 wait_timeout）

mysql_fetch_array() 函式使用一個常數來表示所傳回陣列的型別。下面是常數的定義：

表格 3. MySQL fetch 常數

常數 | 描述
MYSQL_ASSOC | 傳回的資料列使用字段名作為陣列的索引名。
MYSQL_BOTH | 傳回的資料列使用字段名及數字索引作為陣列的索引名。
MYSQL_NUM | 傳回的資料列使用數字索引作為陣列的索引名。索引從 0 開始，表示傳回結果的第一個字段。

範例

這個簡單的例子演示如何連接資料庫，執行查詢語句，顯示傳回結果集和斷開資料庫等一系列基本的 MySQL 操作。

例子 1. MySQL 擴展範例

<?php
    /* 連接選擇資料庫 */
    $link = mysql_connect("mysql_host", "mysql_user", "mysql_password")
        or die("Could not connect");
    print "Connected successfully";
    mysql_select_db("my_database") or die("Could not select database");

    /* 執行 SQL 查詢 */
    $query = "SELECT * FROM my_table";
    $result = mysql_query($query) or die("Query failed");

    /* 在 HTML 中顯示結果 */
    print "<table>\n";
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        print "\t<tr>\n";
        foreach ($line as $col_value) {
            print "\t\t<td>$col_value</td>\n";
        }
        print "\t</tr>\n";
    }
    print "</table>\n";

    /* 釋放資源 */
    mysql_free_result($result);

    /* 斷開連接 */
    mysql_close($link);
?>

目錄
mysql_affected_rows -- 取得前一次 MySQL 操作所影響的記錄行數
mysql_change_user -- Change logged in user of the active connection
mysql_client_encoding -- Returns the name of the character set
mysql_close -- Close MySQL connection
mysql_connect -- Open a connection to a MySQL Server
mysql_create_db -- Create a MySQL database
mysql_data_seek -- Move internal result pointer
mysql_db_name -- Get result data
mysql_db_query -- Send a MySQL query
mysql_drop_db -- Drop (delete) a MySQL database
mysql_errno -- Returns the numerical value of the error message from previous MySQL operation
mysql_error -- Returns the text of the error message from previous MySQL operation
mysql_escape_string -- Escapes a string for use in a mysql_query.
mysql_fetch_array -- Fetch a result row as an associative array, a numeric array, or both.
mysql_fetch_assoc -- Fetch a result row as an associative array
mysql_fetch_field -- Get column information from a result and return as an object
mysql_fetch_lengths -- Get the length of each output in a result
mysql_fetch_object -- Fetch a result row as an object
mysql_fetch_row -- Get a result row as an enumerated array
mysql_field_flags -- Get the flags associated with the specified field in a result
mysql_field_len -- Returns the length of the specified field
mysql_field_name -- Get the name of the specified field in a result
mysql_field_seek -- Set result pointer to a specified field offset
mysql_field_table -- Get name of the table the specified field is in
mysql_field_type -- Get the type of the specified field in a result
mysql_free_result -- Free result memory
mysql_get_client_info -- Get MySQL client info
mysql_get_host_info -- Get MySQL host info
mysql_get_proto_info -- Get MySQL protocol info
mysql_get_server_info -- Get MySQL server info
mysql_info -- Get information about the most recent query
mysql_insert_id -- Get the ID generated from the previous INSERT operation
mysql_list_dbs -- List databases available on a MySQL server
mysql_list_fields -- List MySQL result fields
mysql_list_processes -- List MySQL processes
mysql_list_tables -- List tables in a MySQL database
mysql_num_fields -- Get number of fields in result
mysql_num_rows -- Get number of rows in result
mysql_pconnect -- Open a persistent connection to a MySQL server
mysql_ping -- Ping a server connection or reconnect if there is no connection
mysql_query -- Send a MySQL query
mysql_real_escape_string -- Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection.
mysql_result -- Get result data
mysql_select_db -- Select a MySQL database
mysql_stat -- Get current system status
mysql_tablename -- Get table name of field
mysql_thread_id -- Return the current thread ID
mysql_unbuffered_query -- Send an SQL query to MySQL, without fetching and buffering the result rows
上一頁 | 首頁 | 下一頁
msql | 上一層 | mysql_affected_rows


Ncurses terminal screen control functions

PHP 手冊
上一頁 下一頁

LXVII. Ncurses terminal screen control functions

介紹

ncurses (new curses) is a free software emulation of curses in System V Rel 4.0 (and above). It uses terminfo format, supports pads, colors, multiple highlights, form characters and function key mapping.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

Ncurses is available for the following platforms:

  • AIX

  • BeOS

  • Cygwin

  • Digital Unix (aka OSF1)

  • FreeBSD

  • GNU/Linux

  • HPUX

  • IRIX

  • OS/2

  • SCO OpenServer

  • Solaris

  • SunOS

需求

You need the ncurses libraries and headerfiles. Download the latest version from the ftp://ftp.gnu.org/pub/gnu/ncurses/ or from an other GNU-Mirror.

安裝

To get these functions to work, you have to compile the CGI version of PHP with --with-ncurses.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Ncurses configuration options

Name | Default | Changeable
ncurses.value | "42" | PHP_INI_ALL
ncurses.string | "foobar" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

Error codes

On error ncurses functions return NCURSES_ERR.

Colors

表格 2. ncurses color constants

constant | meaning
NCURSES_COLOR_BLACK | no color (black)
NCURSES_COLOR_WHITE | white
NCURSES_COLOR_RED | red - supported when terminal is in color mode
NCURSES_COLOR_GREEN | green - supported when terminal is in color mod
NCURSES_COLOR_YELLOW | yellow - supported when terminal is in color mod
NCURSES_COLOR_BLUE | blue - supported when terminal is in color mod
NCURSES_COLOR_CYAN | cyan - supported when terminal is in color mod
NCURSES_COLOR_MAGENTA | magenta - supported when terminal is in color mod

Keys

表格 3. ncurses key constants

constant | meaning
NCURSES_KEY_F0 - NCURSES_KEY_F64 | function keys F1 - F64
NCURSES_KEY_DOWN | down arrow
NCURSES_KEY_UP | up arrow
NCURSES_KEY_LEFT | left arrow
NCURSES_KEY_RIGHT | right arrow
NCURSES_KEY_HOME | home key (upward+left arrow)
NCURSES_KEY_BACKSPACE | backspace
NCURSES_KEY_DL | delete line
NCURSES_KEY_IL | insert line
NCURSES_KEY_DC | delete character
NCURSES_KEY_IC | insert char or enter insert mode
NCURSES_KEY_EIC | exit insert char mode
NCURSES_KEY_CLEAR | clear screen
NCURSES_KEY_EOS | clear to end of screen
NCURSES_KEY_EOL | clear to end of line
NCURSES_KEY_SF | scroll one line forward
NCURSES_KEY_SR | scroll one line backward
NCURSES_KEY_NPAGE | next page
NCURSES_KEY_PPAGE | previous page
NCURSES_KEY_STAB | set tab
NCURSES_KEY_CTAB | clear tab
NCURSES_KEY_CATAB | clear all tabs
NCURSES_KEY_SRESET | soft (partial) reset
NCURSES_KEY_RESET | reset or hard reset
NCURSES_KEY_PRINT | print
NCURSES_KEY_LL | lower left
NCURSES_KEY_A1 | upper left of keypad
NCURSES_KEY_A3 | upper right of keypad
NCURSES_KEY_B2 | center of keypad
NCURSES_KEY_C1 | lower left of keypad
NCURSES_KEY_C3 | lower right of keypad
NCURSES_KEY_BTAB | back tab
NCURSES_KEY_BEG | beginning
NCURSES_KEY_CANCEL | cancel
NCURSES_KEY_CLOSE | close
NCURSES_KEY_COMMAND | cmd (command)
NCURSES_KEY_COPY | copy
NCURSES_KEY_CREATE | create
NCURSES_KEY_END | end
NCURSES_KEY_EXIT | exit
NCURSES_KEY_FIND | find
NCURSES_KEY_HELP | help
NCURSES_KEY_MARK | mark
NCURSES_KEY_MESSAGE | message
NCURSES_KEY_MOVE | move
NCURSES_KEY_NEXT | next
NCURSES_KEY_OPEN | open
NCURSES_KEY_OPTIONS | options
NCURSES_KEY_PREVIOUS | previous
NCURSES_KEY_REDO | redo
NCURSES_KEY_REFERENCE | ref (reference)
NCURSES_KEY_REFRESH | refresh
NCURSES_KEY_REPLACE | replace
NCURSES_KEY_RESTART | restart
NCURSES_KEY_RESUME | resume
NCURSES_KEY_SAVE | save
NCURSES_KEY_SBEG | shiftet beg (beginning)
NCURSES_KEY_SCANCEL | shifted cancel
NCURSES_KEY_SCOMMAND | shifted command
NCURSES_KEY_SCOPY | shifted copy
NCURSES_KEY_SCREATE | shifted create
NCURSES_KEY_SDC | shifted delete char
NCURSES_KEY_SDL | shifted delete line
NCURSES_KEY_SELECT | select
NCURSES_KEY_SEND | shifted end
NCURSES_KEY_SEOL | shifted end of line
NCURSES_KEY_SEXIT | shifted exit
NCURSES_KEY_SFIND | shifted find
NCURSES_KEY_SHELP | shifted help
NCURSES_KEY_SHOME | shifted home
NCURSES_KEY_SIC | shifted input
NCURSES_KEY_SLEFT | shifted left arrow
NCURSES_KEY_SMESSAGE | shifted message
NCURSES_KEY_SMOVE | shifted move
NCURSES_KEY_SNEXT | shifted next
NCURSES_KEY_SOPTIONS | shifted options
NCURSES_KEY_SPREVIOUS | shifted previous
NCURSES_KEY_SPRINT | shifted print
NCURSES_KEY_SREDO | shifted redo
NCURSES_KEY_SREPLACE | shifted replace
NCURSES_KEY_SRIGHT | shifted right arrow
NCURSES_KEY_SRSUME | shifted resume
NCURSES_KEY_SSAVE | shifted save
NCURSES_KEY_SSUSPEND | shifted suspend
NCURSES_KEY_UNDO | undo
NCURSES_KEY_MOUSE | mouse event has occured
NCURSES_KEY_MAX | maximum key value

Mouse

表格 4. mouse constants

Constant | meaning
NCURSES_BUTTON1_RELEASED - NCURSES_BUTTON4_RELEASED | button (1-4) released
NCURSES_BUTTON1_PRESSED - NCURSES_BUTTON4_PRESSED | button (1-4) pressed
NCURSES_BUTTON1_CLICKED - NCURSES_BUTTON4_CLICKED | button (1-4) clicked
NCURSES_BUTTON1_DOUBLE_CLICKED - NCURSES_BUTTON4_DOUBLE_CLICKED | button (1-4) double clicked
NCURSES_BUTTON1_TRIPLE_CLICKED - NCURSES_BUTTON4_TRIPLE_CLICKED | button (1-4) triple clicked
NCURSES_BUTTON_CTRL | ctrl pressed during click
NCURSES_BUTTON_SHIFT | shift pressed during click
NCURSES_BUTTON_ALT | alt pressed during click
NCURSES_ALL_MOUSE_EVENTS | report all mouse events
NCURSES_REPORT_MOUSE_POSITION | report mouse position
目錄
ncurses_addch -- Add character at current position and advance cursor
ncurses_addchnstr -- Add attributed string with specified length at current position
ncurses_addchstr -- Add attributed string at current position
ncurses_addnstr -- Add string with specified length at current position
ncurses_addstr -- Output text at current position
ncurses_assume_default_colors -- Define default colors for color 0
ncurses_attroff -- Turn off the given attributes
ncurses_attron -- Turn on the given attributes
ncurses_attrset -- Set given attributes
ncurses_baudrate -- Returns baudrate of terminal
ncurses_beep -- Let the terminal beep
ncurses_bkgd -- Set background property for terminal screen
ncurses_bkgdset -- Control screen background
ncurses_border -- Draw a border around the screen using attributed characters
ncurses_can_change_color -- Check if we can change terminals colors
ncurses_cbreak -- Switch of input buffering
ncurses_clear -- Clear screen
ncurses_clrtobot -- Clear screen from current position to bottom
ncurses_clrtoeol -- Clear screen from current position to end of line
ncurses_color_set -- Set fore- and background color
ncurses_curs_set -- Set cursor state
ncurses_def_prog_mode -- Saves terminals (program) mode
ncurses_def_shell_mode -- Saves terminals (shell) mode
ncurses_define_key -- Define a keycode
ncurses_delay_output -- Delay output on terminal using padding characters
ncurses_delch -- Delete character at current position, move rest of line left
ncurses_deleteln -- Delete line at current position, move rest of screen up
ncurses_delwin -- Delete a ncurses window
ncurses_doupdate -- Write all prepared refreshes to terminal
ncurses_echo -- Activate keyboard input echo
ncurses_echochar -- Single character output including refresh
ncurses_end -- Stop using ncurses, clean up the screen
ncurses_erase -- Erase terminal screen
ncurses_erasechar -- Returns current erase character
ncurses_filter --
ncurses_flash -- Flash terminal screen (visual bell)
ncurses_flushinp -- Flush keyboard input buffer
ncurses_getch -- Read a character from keyboard
ncurses_getmouse -- Reads mouse event
ncurses_halfdelay -- Put terminal into halfdelay mode
ncurses_has_colors -- Check if terminal has colors
ncurses_has_ic -- Check for insert- and delete-capabilities
ncurses_has_il -- Check for line insert- and delete-capabilities
ncurses_has_key -- Check for presence of a function key on terminal keyboard
ncurses_hline -- Draw a horizontal line at current position using an attributed character and max. n characters long
ncurses_inch -- Get character and attribute at current position
ncurses_init_color -- Set new RGB value for color
ncurses_init_pair -- Allocate a color pair
ncurses_init -- Initialize ncurses
ncurses_insch -- Insert character moving rest of line including character at current position
ncurses_insdelln -- Insert lines before current line scrolling down (negative numbers delete and scroll up)
ncurses_insertln -- Insert a line, move rest of screen down
ncurses_insstr -- Insert string at current position, moving rest of line right
ncurses_instr -- Reads string from terminal screen
ncurses_isendwin -- Ncurses is in endwin mode, normal screen output may be performed
ncurses_keyok -- Enable or disable a keycode
ncurses_killchar -- Returns current line kill character
ncurses_longname -- Returns terminals description
ncurses_mouseinterval -- Set timeout for mouse button clicks
ncurses_mousemask -- Sets mouse options
ncurses_move -- Move output position
ncurses_mvaddch -- Move current position and add character
ncurses_mvaddchnstr -- Move position and add attrributed string with specified length
ncurses_mvaddchstr -- Move position and add attributed string
ncurses_mvaddnstr -- Move position and add string with specified length
ncurses_mvaddstr -- Move position and add string
ncurses_mvcur -- Move cursor immediately
ncurses_mvdelch -- Move position and delete character, shift rest of line left
ncurses_mvgetch -- Move position and get character at new position
ncurses_mvhline -- Set new position and draw a horizontal line using an attributed character and max. n characters long
ncurses_mvinch -- Move position and get attributed character at new position
ncurses_mvvline -- Set new position and draw a vertical line using an attributed character and max. n characters long
ncurses_mvwaddstr -- Add string at new position in window
ncurses_napms -- Sleep
ncurses_newwin -- Create a new window
ncurses_nl -- Translate newline and carriage return / line feed
ncurses_nocbreak -- Switch terminal to cooked mode
ncurses_noecho -- Switch off keyboard input echo
ncurses_nonl -- Do not translate newline and carriage return / line feed
ncurses_noqiflush -- Do not flush on signal characters
ncurses_noraw -- Switch terminal out of raw mode
ncurses_putp --
ncurses_qiflush -- Flush on signal characters
ncurses_raw -- Switch terminal into raw mode
ncurses_refresh -- Refresh screen
ncurses_resetty -- Restores saved terminal state
ncurses_savetty -- Saves terminal state
ncurses_scr_dump -- Dump screen content to file
ncurses_scr_init -- Initialize screen from file dump
ncurses_scr_restore -- Restore screen from file dump
ncurses_scr_set -- Inherit screen from file dump
ncurses_scrl -- Scroll window content up or down without changing current position
ncurses_slk_attr -- Returns current soft label key attribute
ncurses_slk_attroff --
ncurses_slk_attron --
ncurses_slk_attrset --
ncurses_slk_clear -- Clears soft labels from screen
ncurses_slk_color -- Sets color for soft label keys
ncurses_slk_init -- Initializes soft label key functions
ncurses_slk_noutrefresh -- Copies soft label keys to virtual screen
ncurses_slk_refresh -- Copies soft label keys to screen
ncurses_slk_restore -- Restores soft label keys
ncurses_slk_touch -- Fources output when ncurses_slk_noutrefresh is performed
ncurses_standend -- Stop using 'standout' attribute
ncurses_standout -- Start using 'standout' attribute
ncurses_start_color -- Start using colors
ncurses_termattrs -- Returns a logical OR of all attribute flags supported by terminal
ncurses_termname -- Returns terminals (short)-name
ncurses_timeout -- Set timeout for special key sequences
ncurses_typeahead -- Specify different filedescriptor for typeahead checking
ncurses_ungetch -- Put a character back into the input stream
ncurses_ungetmouse -- Pushes mouse event to queue
ncurses_use_default_colors -- Assign terminal default colors to color id -1
ncurses_use_env -- Control use of environment information about terminal size
ncurses_use_extended_names -- Control use of extended names in terminfo descriptions
ncurses_vidattr --
ncurses_vline -- Draw a vertical line at current position using an attributed character and max. n characters long
ncurses_wrefresh -- Refresh window on terminal screen
上一頁 | 首頁 | 下一頁
syslog | 上一層 | ncurses_addch


Network Functions

PHP 手冊
上一頁 下一頁

LXVI. Network Functions

介紹

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Network Configuration Options

Name | Default | Changeable
define_syslog_variables | "0" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

define_syslog_variables boolean

Whether or not to define the various syslog variables (e.g. $LOG_PID, $LOG_CRON, etc.). Turning it off is a good idea performance-wise. At runtime, you can define these variables by calling define_syslog_variables().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

這裡列出的所有常數將作為 PHP 核心的一部分一直有效。

表格 2. openlog() Options

Constant | Description
LOG_CONS | if there is an error while sending data to the system logger, write directly to the system console
LOG_NDELAY | open the connection to the logger immediately
LOG_ODELAY | (default) delay opening the connection until the first message is logged
LOG_PERROR | print log message also to standard error
LOG_PID | include PID with each message

表格 3. syslog() Priorities (in descending order)

Constant | Description
LOG_EMERG | system is unusable
LOG_ALERT | action must be taken immediately
LOG_CRIT | critical conditions
LOG_ERR | error conditions
LOG_WARNING | warning conditions
LOG_NOTICE | normal, but significant, condition
LOG_INFO | informational message
LOG_DEBUG | debug-level message
目錄
checkdnsrr -- Check DNS records corresponding to a given Internet host name or IP address
closelog -- Close connection to system logger
debugger_off -- Disable internal PHP debugger
debugger_on -- Enable internal PHP debugger
define_syslog_variables -- Initializes all syslog related constants
fsockopen -- Open Internet or Unix domain socket connection
gethostbyaddr -- Get the Internet host name corresponding to a given IP address
gethostbyname -- Get the IP address corresponding to a given Internet host name
gethostbynamel -- Get a list of IP addresses corresponding to a given Internet host name
getmxrr -- Get MX records corresponding to a given Internet host name
getprotobyname -- Get protocol number associated with protocol name
getprotobynumber -- Get protocol name associated with protocol number
getservbyname -- Get port number associated with an Internet service and protocol
getservbyport -- Get Internet service which corresponds to port and protocol
ip2long -- Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address.
long2ip -- Converts an (IPv4) Internet network address into a string in Internet standard dotted format
openlog -- Open connection to system logger
pfsockopen -- Open persistent Internet or Unix domain socket connection
socket_get_status -- Alias of stream_get_meta_data().
socket_set_blocking -- Alias for stream_set_blocking()
socket_set_timeout -- Alias for stream_set_timeout()
syslog -- Generate a system log message
上一頁 | 首頁 | 下一頁
muscat_setup | 上一層 | checkdnsrr


YP/NIS Functions

PHP 手冊
上一頁 下一頁

CX. YP/NIS Functions

介紹

NIS (formerly called Yellow Pages) allows network management of important administrative files (e.g. the password file). For more information refer to the NIS manpage and Introduction to YP/NIS. There is also a book called Managing NFS and NIS by Hal Stern.

需求

None besides functions from standard Unix libraries which are always available (either libc or libnsl, configure will detect which one to use).

安裝

To get these functions to work, you have to configure PHP with --enable-yp.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

YPERR_BADARGS (integer)

YPERR_BADDB (integer)

YPERR_BUSY (integer)

YPERR_DOMAIN (integer)

YPERR_KEY (integer)

YPERR_MAP (integer)

YPERR_NODOM (integer)

YPERR_NOMORE (integer)

YPERR_PMAP (integer)

YPERR_RESRC (integer)

YPERR_RPC (integer)

YPERR_YPBIND (integer)

YPERR_YPERR (integer)

YPERR_YPSERV (integer)

YPERR_VERS (integer)

目錄
yp_all -- Traverse the map and call a function on each entry
yp_cat -- Return an array containing the entire map
yp_err_string -- Returns the error string associated with the previous operation
yp_errno -- Returns the error code of the previous operation
yp_first -- Returns the first key-value pair from the named map
yp_get_default_domain -- Fetches the machine's default NIS domain
yp_master -- Returns the machine name of the master NIS server for a map
yp_match -- Returns the matched line
yp_next -- Returns the next key-value pair in the named map.
yp_order -- Returns the order number for a map
上一頁 | 首頁 | 下一頁
yaz_wait | 上一層 | yp_all


Lotus Notes functions

PHP 手冊
上一頁 下一頁

LXVIII. Lotus Notes functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
notes_body -- Open the message msg_number in the specified mailbox on the specified server (leave serv
notes_copy_db -- Create a note using form form_name
notes_create_db -- Create a Lotus Notes database
notes_create_note -- Create a note using form form_name
notes_drop_db -- Drop a Lotus Notes database
notes_find_note -- Returns a note id found in database_name. Specify the name of the note. Leaving type bla
notes_header_info -- Open the message msg_number in the specified mailbox on the specified server (leave serv
notes_list_msgs -- Returns the notes from a selected database_name
notes_mark_read -- Mark a note_id as read for the User user_name
notes_mark_unread -- Mark a note_id as unread for the User user_name
notes_nav_create -- Create a navigator name, in database_name
notes_search -- Find notes that match keywords in database_name
notes_unread -- Returns the unread note id's for the current User user_name
notes_version -- Get the version Lotus Notes
上一頁 | 首頁 | 下一頁
ncurses_wrefresh | 上一層 | notes_body


Object Aggregation/Composition Functions

PHP 手冊
上一頁 下一頁

LXX. Object Aggregation/Composition Functions

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

介紹

In Object Oriented Programming, it is common to see the composition of simple classes (and/or instances) into a more complex one. This is a flexible strategy for building complicated objects and object hierachies and can function as a dynamic alternative to multiple inheritance. There are two ways to perform class (and/or object) composition depending on the relationship between the composed elements: Association and Aggregation.

An Association is a composition of independently constructed and externally visible parts. When we associate classes or objects, each one keeps a reference to the ones it is associated with. When we associate classes statically, one class will contain a reference to an instance of the other class. For example:

例子 1. Class association

class DateTime {

   function DateTime() {
       // empty constructor
   }

   function now() {
       return date("Y-m-d H:i:s");
   }
}

class Report {
   var $_dt = new DateTime();
   // more properties ...

   function Report() {
       // initialization code ...
   }

   function generateReport() {
       $dateTime = $_dt->now();
       // more code ...
   }

   // more methods ...
}

$rep = new Report();
We can also associate instances at runtime by passing a reference in a constructor (or any othe method), which allow us to dynamically change the association relationship between objects. We will modify the example above to illustrate this point:

例子 2. Object association

class DateTime {
   // same as previous example
}

class DateTimePlus {
   var $_format;

   function DateTimePlus($format="Y-m-d H:i:s") {
       $this->_format = $format
   }

   function now() {
       return date($this->_format);
   }
}

class Report {
   var $_dt;    // we'll keep the reference to DateTime here
   // more properties ...

   function Report() {
       // do some initialization
   }

   function setDateTime(&$dt) {
       $this->_dt =& $dt;
   }

   function generateReport() {
       $dateTime = $_dt->now();
       // more code ...
   }

   // more methods ...
}

$rep = new Report();
$dt = new DateTime();
$dtp = new DateTimePlus("l, F j, Y (h:i:s a, T)");

// generate report with simple date for web display
$rep->setDateTime(&$dt);
echo $rep->generateReport();

// later on in the code ...

// generate report with fancy date
$rep->setDateTime(&$dtp);
$output = $rep->generateReport();
// save $output in database
// ... etc ...

Aggregation, on the other hand, implies encapsulation (hidding) of the parts of the composition. We can aggregate classes by using a (static) inner class (PHP does not yet support inner classes), in this case the aggregated class definition is not accessible, except through the class that contains it. The aggregation of instances (object aggregation) involves the dynamic creation of subobjects inside an object, in the process, expanding the properties and methods of that object.

Object aggregation is a natural way of representing a whole-part relationship, (for example, molecules are aggregates of atoms), or can be used to obtain an effect equivalent to multiple inheritance, without having to permanently bind a subclass to two or more parent classes and their interfaces. In fact object aggregation can be more flexible, in which we can select what methods or properties to "inherit" in the aggregated object.

範例

We define 3 classes, each implementing a different storage method:

例子 3. storage_classes.inc

<?php
class FileStorage {
    var $data;

    function FileStorage($data) {
        $this->data = $data;
    }
    function write($name) {
        $fp = fopen(name, "w");
        fwrite($fp, $this->data);
        fclose($data);
    }
}

class WDDXStorage {
    var $data;
    var $version = "1.0";
    var $_id; // "private" variable

    function WDDXStorage($data) {
        $this->data = $data;
        $this->_id = $this->_genID();
    }

    function store() {
        if ($this->_id) {
            $pid = wddx_packet_start($this->_id);
            wddx_add_vars($pid, "this->data");
            $packet = wddx_packet_end($pid);
        } else {
            $packet = wddx_serialize_value($this->data);
        }
        $dbh = dba_open("varstore", "w", "gdbm");
        dba_insert(md5(uniqid("",true)), $packet, $dbh);
        dba_close($dbh);
    }

    // a private method
    function _genID() {
        return md5(uniqid(rand(),true));
    }
}

class DBStorage {
    var $data;
    var $dbtype = "mysql";

    function DBStorage($data) {
        $this->data = $data;
    }

    function save() {
        $dbh = mysql_connect();
        mysql_select_db("storage", $dbh);
        $serdata = serialize($this->data);
        mysql_query("insert into vars ('$serdata',now())", $dbh);
        mysql_close($dbh);
    }
}

?>

We then instantiate a couple of objects from the defined classes, and perform some aggregations and deaggregations, printing some object information along the way:

例子 4. test_aggregation.php

<?php
include "storageclasses.inc";

// some utilty functions

function p_arr($arr) {
    foreach($arr as $k=>$v)
        $out[] = "\t$k => $v";
    return implode("\n", $out);
}

function object_info($obj) {
    $out[] = "Class: ".get_class($obj);
    foreach(get_object_vars($obj) as $var=>$val)
        if (is_array($val))
            $out[] = "property: $var (array)\n".p_arr($val);
        else
            $out[] = "property: $var = $val";
    foreach(get_class_methods($obj) as $method)
        $out[] = "method: $method";
    return implode("\n", $out);
}

$data = array(M_PI, "kludge != cruft");

// we create some basic objects
$fs = new FileStorage($data);
$ws = new WDDXStorage($data);

// print information on the objects
echo "\$fs object\n";
echo object_info($fs)."\n";
echo "\n\$ws object\n";
echo object_info($ws)."\n";

// do some aggregation

echo "\nLet's aggregate \$fs to the WDDXStorage class\n";
aggregate($fs, "WDDXStorage");
echo "\$fs object\n";
echo object_info($fs)."\n";

echo "\nNow let us aggregate it to the DBStorage class\n";
aggregate($fs, "DBStorage");
echo "\$fs object\n";
echo object_info($fs)."\n";

echo "\nAnd finally deaggregate WDDXStorage\n";
deaggregate($fs, "WDDXStorage");
echo "\$fs object\n";
echo object_info($fs)."\n";

?>

We will now consider the output to understand some of the side-effects and limitation of object aggregation in PHP. First, the newly created $fs and $ws objects give the expected output (according to their respective class declaration). Note that for the purposes of object aggregation, private elements of a class/object begin with an underscore character ("_"), even though there is not real distinction between public and private class/object elements in PHP.

$fs object
Class: filestorage
property: data (array)
    0 => 3.1415926535898
    1 => kludge != cruft
method: filestorage
method: write

$ws object
Class: wddxstorage
property: data (array)
    0 => 3.1415926535898
    1 => kludge != cruft
property: version = 1.0
property: _id = ID::9bb2b640764d4370eb04808af8b076a5
method: wddxstorage
method: store
method: _genid

We then aggregate $fs with the WDDXStorage class, and print out the object information. We can see now that even though nominally the $fs object is still of FileStorage, it now has the property $version, and the method store(), both defined in WDDXStorage. One important thing to note is that it has not aggregated the private elements defined in the class, which are present in the $ws object. Also absent is the constructor from WDDXStorage, which will not be logical to aggegate.

Let's aggregate $fs to the WDDXStorage class
$fs object
Class: filestorage
property: data (array)
    0 => 3.1415926535898
    1 => kludge != cruft
property: version = 1.0
method: filestorage
method: write
method: store

The proccess of aggregation is cummulative, so when we aggregate $fs with the class DBStorage, generating an object that can use the storage methods of all the defined classes.

Now let us aggregate it to the DBStorage class
$fs object
Class: filestorage
property: data (array)
    0 => 3.1415926535898
    1 => kludge != cruft
property: version = 1.0
property: dbtype = mysql
method: filestorage
method: write
method: store
method: save

Finally, the same way we aggregated properties and methods dynamically, we can also deaggregate them from the object. So, if we deaggregate the class WDDXStorage from $fs, we will obtain:

And deaggregate the WDDXStorage methods and properties
$fs object
Class: filestorage
property: data (array)
    0 => 3.1415926535898
    1 => kludge != cruft
property: dbtype = mysql
method: filestorage
method: write
method: save

One point that we have not mentioned above, is that the process of aggregation will not override existing properties or methods in the objects. For example, the class FileStorage defines a $data property, and the class WDDXStorage also defines a similar property which will not override the one in the object acquired during instantiation from the class FileStorage.

目錄
aggregate_methods_by_list -- selective dynamic class methods aggregation to an object
aggregate_methods_by_regexp -- selective class methods aggregation to an object using a regular expression
aggregate_methods -- dynamic class and object aggregation of methods
aggregate_properties_by_list -- selective dynamic class properties aggregation to an object
aggregate_properties_by_regexp -- selective class properties aggregation to an object using a regular expression
aggregate_properties -- dynamic aggregation of class properties to an object
aggregate -- dynamic class and object aggregation of methods and properties
aggregation_info -- returns an associative array of the methods and properties from each class that has been aggregated to the object.
deaggregate -- removes the aggregated methods and properties from an object
上一頁 | 首頁 | 下一頁
odbc_tables | 上一層 | aggregate_methods_by_list


Oracle 8 函式

PHP 手冊
上一頁 下一頁

LXXI. Oracle 8 函式

介紹

這些函式允許你連接 Oracle8 和 Oracle7 資料庫。這些函式使用 Oracle8 Call-Interface (OCI8)。

該擴展比 Oracle 標準函式擴展更靈活。支援向 Oracle 位置標志符綁定局部和全域 PHP 變數，全面支援 LOB、FILE 和 ROWID，允許用戶使用用戶定義的變數。

需求

使用這個擴展需要 Oracle8 客戶端庫。

在使用這個擴展之前，請確認你已經為 Oracle 用戶和 web daemon 用戶正確設置了 Oracle 環境變數。下面列出了需要設置的環境變數：

  • ORACLE_HOME

  • ORACLE_SID

  • LD_PRELOAD

  • LD_LIBRARY_PATH

  • NLS_LANG

  • ORA_NLS33

在為 web 伺服器用戶設置環境變數之後，你還需要將 web 伺服器用戶(nobody、 www)加到 oracle 組中。

如果你的 web 伺服器不能夠啟動或者在啟動的時候崩潰: 檢查 Apache 是否使用了 pthread 庫:

# ldd /www/apache/bin/httpd
    libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
    libm.so.6 => /lib/libm.so.6 (0x4002f000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
    libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
    libc.so.6 => /lib/libc.so.6 (0x4007e000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

如果 libpthread 沒有列出，你必需重新安裝 Apache:

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install

請注意在象 UnixWare 在內的某些操作系統中，使用libthread 代替 libpthread。則PHP 和 Apache 必須使用 EXTRA_LIBS=-lthread 配置。

安裝

你必須使用 --with-oci8[=DIR] 編譯 PHP，DIR 的預設值是你的環境變數 ORACLE_HOME。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

OCI_DEFAULT (integer)

OCI_DESCRIBE_ONLY (integer)

OCI_COMMIT_ON_SUCCESS (integer)

OCI_EXACT_FETCH (integer)

SQLT_BFILEE (integer)

SQLT_CFILEE (integer)

SQLT_CLOB (integer)

SQLT_BLOB (integer)

SQLT_RDD (integer)

OCI_B_SQLT_NTY (integer)

OCI_SYSDATE (integer)

OCI_B_BFILE (integer)

OCI_B_CFILEE (integer)

OCI_B_CLOB (integer)

OCI_B_BLOB (integer)

OCI_B_ROWID (integer)

OCI_B_CURSOR (integer)

OCI_B_BIN (integer)

OCI_FETCHSTATEMENT_BY_COLUMN (integer)

OCI_FETCHSTATEMENT_BY_ROW (integer)

OCI_ASSOC (integer)

OCI_NUM (integer)

OCI_BOTH (integer)

OCI_RETURN_NULLS (integer)

OCI_RETURN_LOBS (integer)

OCI_DTYPE_FILE (integer)

OCI_DTYPE_LOB (integer)

OCI_DTYPE_ROWID (integer)

OCI_D_FILE (integer)

OCI_D_LOB (integer)

OCI_D_ROWID (integer)

範例

例子 1. OCI 提示

<?php
// by sergo@bacup.ru

// Use option: OCI_DEFAULT for execute command to delay execution
OCIExecute($stmt, OCI_DEFAULT);

// for retrieve data use (after fetch):

$result = OCIResult($stmt, $n);
if (is_object ($result)) $result = $result->load();

// For INSERT or UPDATE statement use:

$sql = "insert into table (field1, field2) values (field1 = 'value',
 field2 = empty_clob()) returning field2 into :field2";
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName ($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save ("some text");
OCICommit($conn);

?>

你可以使用與命令行相同的方法來連接存儲過程。

例子 2. 使用存儲過程

<?php
// by webmaster@remoterealty.com
$sth = OCIParse ( $dbh, "begin sp_newaddress( :address_id, '$firstname',
 '$lastname', '$company', '$address1', '$address2', '$city', '$state',
 '$postalcode', '$country', :error_code );end;" );

// This calls stored procedure sp_newaddress, with :address_id being an
// in/out variable and :error_code being an out variable.
// Then you do the binding:

   OCIBindByName ( $sth, ":address_id", $addr_id, 10 );
   OCIBindByName ( $sth, ":error_code", $errorcode, 10 );
   OCIExecute ( $sth );

?>

目錄
OCIBindByName -- 綁定一個 PHP 變數到一個 Oracle 位置標志符
OCICancel -- Cancel reading from cursor
OCICollAppend -- Coming soon
OCICollAssign -- Coming soon
OCICollAssignElem -- Coming soon
OCICollGetElem -- Coming soon
OCICollMax -- Coming soon
OCICollSize -- Coming soon
OCICollTrim -- Coming soon
OCIColumnIsNULL -- Test whether a result column is NULL
OCIColumnName -- Returns the name of a column
OCIColumnPrecision -- Coming soon
OCIColumnScale -- Coming soon
OCIColumnSize -- Return result column size
OCIColumnType -- Returns the data type of a column
OCIColumnTypeRaw -- Coming soon
OCICommit -- Commits outstanding transactions
OCIDefineByName -- Use a PHP variable for the define-step during a SELECT
OCIError -- Return the last error of stmt|conn|global
OCIExecute -- Execute a statement
OCIFetch -- Fetches the next row into result-buffer
OCIFetchInto -- Fetches the next row into result-array
OCIFetchStatement -- Fetch all rows of result data into an array
OCIFreeCollection -- 該函式目前暫時沒有參考文檔
OCIFreeCursor -- Free all resources associated with a cursor
OCIFreeDesc -- Deletes a large object descriptor
OCIFreeStatement -- Free all resources associated with a statement
OCIInternalDebug -- Enables or disables internal debug output
OCILoadLob -- Coming soon
OCILogOff -- Disconnects from Oracle
OCILogon -- Establishes a connection to Oracle
OCINewCollection -- Coming soon
OCINewCursor -- Return a new cursor (Statement-Handle)
OCINewDescriptor -- Initialize a new empty LOB or FILE descriptor
OCINLogon -- Establishes a new connection to Oracle
OCINumCols -- Return the number of result columns in a statement
OCIParse -- Parse a query and return a statement
OCIPLogon -- Connect to an Oracle database using a persistent connection
OCIResult -- Returns column value for fetched row
OCIRollback -- Rolls back outstanding transactions
OCIRowCount -- Gets the number of affected rows
OCISaveLob -- Coming soon
OCISaveLobFile -- Coming soon
OCIServerVersion -- 傳回一個包含伺服器版本訊息的字串
OCISetPrefetch -- Sets number of rows to be prefetched
OCIStatementType -- 傳回 OCI 命令的型別
OCIWriteLobToFile -- Coming soon
上一頁 | 首頁 | 下一頁
deaggregate | 上一層 | OCIBindByName


Unified ODBC functions

PHP 手冊
上一頁 下一頁

LXIX. Unified ODBC functions

介紹

In addition to normal ODBC support, the Unified ODBC functions in PHP allow you to access several databases that have borrowed the semantics of the ODBC API to implement their own API. Instead of maintaining multiple database drivers that were all nearly identical, these drivers have been unified into a single set of ODBC functions.

The following databases are supported by the Unified ODBC functions: Adabas D, IBM DB2, iODBC, Solid, and Sybase SQL Anywhere.

註: There is no ODBC involved when connecting to the above databases. The functions that you use to speak natively to them just happen to share the same names and syntax as the ODBC functions. The exception to this is iODBC. Building PHP with iODBC support enables you to use any ODBC-compliant drivers with your PHP applications. iODBC is maintained by OpenLink Software. More information on iODBC, as well as a HOWTO, is available at www.iodbc.org.

需求

To access any of the supported databases you need to have the required libraries installed.

安裝

Please see the Database installation options chapter for more information about configuring PHP with these databases.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Unified ODBC Configuration Options

Name | Default | Changeable
odbc.default_db * | NULL | PHP_INI_ALL
odbc.default_user * | NULL | PHP_INI_ALL
odbc.default_pw * | NULL | PHP_INI_ALL
odbc.allow_persistent | "1" | PHP_INI_SYSTEM
odbc.check_persistent | "1" | PHP_INI_SYSTEM
odbc.max_persistent | "-1" | PHP_INI_SYSTEM
odbc.max_links | "-1" | PHP_INI_SYSTEM
odbc.defaultlrl | "4096" | PHP_INI_ALL
odbc.defaultbinmode | "1" | PHP_INI_ALL

註: Entries marked with * are not implemented yet.

For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

odbc.default_db string

ODBC data source to use if none is specified in odbc_connect() or odbc_pconnect().

odbc.default_user string

User name to use if none is specified in odbc_connect() or odbc_pconnect().

odbc.default_pw string

Password to use if none is specified in odbc_connect() or odbc_pconnect().

odbc.allow_persistent boolean

Whether to allow persistent ODBC connections.

odbc.check_persistent boolean

Check that a connection is still valid before reuse.

odbc.max_persistent integer

The maximum number of persistent ODBC connections per process.

odbc.max_links integer

The maximum number of ODBC connections per process, including persistent connections.

odbc.defaultlrl integer

Handling of LONG fields. Specifies the number of bytes returned to variables.

odbc.defaultbinmode integer

Handling of binary data.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

ODBC_TYPE (integer)

ODBC_BINMODE_PASSTHRU (integer)

ODBC_BINMODE_RETURN (integer)

ODBC_BINMODE_CONVERT (integer)

SQL_ODBC_CURSORS (integer)

SQL_CUR_USE_DRIVER (integer)

SQL_CUR_USE_IF_NEEDED (integer)

SQL_CUR_USE_ODBC (integer)

SQL_CONCURRENCY (integer)

SQL_CONCUR_READ_ONLY (integer)

SQL_CONCUR_LOCK (integer)

SQL_CONCUR_ROWVER (integer)

SQL_CONCUR_VALUES (integer)

SQL_CURSOR_TYPE (integer)

SQL_CURSOR_FORWARD_ONLY (integer)

SQL_CURSOR_KEYSET_DRIVEN (integer)

SQL_CURSOR_DYNAMIC (integer)

SQL_CURSOR_STATIC (integer)

SQL_KEYSET_SIZE (integer)

SQL_CHAR (integer)

SQL_VARCHAR (integer)

SQL_LONGVARCHAR (integer)

SQL_DECIMAL (integer)

SQL_NUMERIC (integer)

SQL_BIT (integer)

SQL_TINYINT (integer)

SQL_SMALLINT (integer)

SQL_INTEGER (integer)

SQL_BIGINT (integer)

SQL_REAL (integer)

SQL_FLOAT (integer)

SQL_DOUBLE (integer)

SQL_BINARY (integer)

SQL_VARBINARY (integer)

SQL_LONGVARBINARY (integer)

SQL_DATE (integer)

SQL_TIME (integer)

SQL_TIMESTAMP (integer)

SQL_TYPE_DATE (integer)

SQL_TYPE_TIME (integer)

SQL_TYPE_TIMESTAMP (integer)

SQL_BEST_ROWID (integer)

SQL_ROWVER (integer)

SQL_SCOPE_CURROW (integer)

SQL_SCOPE_TRANSACTION (integer)

SQL_SCOPE_SESSION (integer)

SQL_NO_NULLS (integer)

SQL_NULLABLE (integer)

SQL_INDEX_UNIQUE (integer)

SQL_INDEX_ALL (integer)

SQL_ENSURE (integer)

SQL_QUICK (integer)

目錄
odbc_autocommit -- Toggle autocommit behaviour
odbc_binmode -- Handling of binary column data
odbc_close_all -- Close all ODBC connections
odbc_close -- Close an ODBC connection
odbc_columnprivileges -- Returns a result identifier that can be used to fetch a list of columns and associated privileges
odbc_columns -- Lists the column names in specified tables. Returns a result identifier containing the information.
odbc_commit -- Commit an ODBC transaction
odbc_connect -- Connect to a datasource
odbc_cursor -- Get cursorname
odbc_data_source -- Returns information about a current connection
odbc_do -- Synonym for odbc_exec()
odbc_error -- Get the last error code
odbc_errormsg -- Get the last error message
odbc_exec -- Prepare and execute a SQL statement
odbc_execute -- Execute a prepared statement
odbc_fetch_array -- Fetch a result row as an associative array
odbc_fetch_into -- Fetch one result row into array
odbc_fetch_object -- Fetch a result row as an object
odbc_fetch_row -- Fetch a row
odbc_field_len -- Get the length (precision) of a field
odbc_field_name -- Get the columnname
odbc_field_num -- Return column number
odbc_field_precision -- Synonym for odbc_field_len()
odbc_field_scale -- Get the scale of a field
odbc_field_type -- Datatype of a field
odbc_foreignkeys -- Returns a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table
odbc_free_result -- Free resources associated with a result
odbc_gettypeinfo -- Returns a result identifier containing information about data types supported by the data source.
odbc_longreadlen -- Handling of LONG columns
odbc_next_result -- Checks if multiple results are avaiable
odbc_num_fields -- Number of columns in a result
odbc_num_rows -- Number of rows in a result
odbc_pconnect -- Open a persistent database connection
odbc_prepare -- Prepares a statement for execution
odbc_primarykeys -- Returns a result identifier that can be used to fetch the column names that comprise the primary key for a table
odbc_procedurecolumns -- Retrieve information about parameters to procedures
odbc_procedures -- Get the list of procedures stored in a specific data source. Returns a result identifier containing the information.
odbc_result_all -- Print result as HTML table
odbc_result -- Get result data
odbc_rollback -- Rollback a transaction
odbc_setoption -- Adjust ODBC settings. Returns FALSE if an error occurs, otherwise TRUE.
odbc_specialcolumns -- Returns either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction
odbc_statistics -- Retrieve statistics about a table
odbc_tableprivileges -- Lists tables and the privileges associated with each table
odbc_tables -- Get the list of table names stored in a specific data source. Returns a result identifier containing the information.
上一頁 | 首頁 | 下一頁
notes_version | 上一層 | odbc_autocommit


OpenSSL functions

PHP 手冊
上一頁 下一頁

LXXII. OpenSSL functions

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

介紹

This module uses the functions of OpenSSL for generation and verification of signatures and for sealing (encrypting) and opening (decrypting) data. OpenSSL offers many features that this module currently doesn't support. Some of these may be added in the future.

需求

In order to use the OpenSSL functions you need to install the OpenSSL package. PHP-4.0.4pl1 requires OpenSSL >= 0.9.6, but PHP-4.0.5 and greater will also work with OpenSSL >= 0.9.5.

安裝

To use PHP's OpenSSL support you must also compile PHP --with-openssl[=DIR].

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

Key/Certificate parameters

Quite a few of the openssl functions require a key or a certificate parameter. PHP 4.0.5 and earlier have to use a key or certificate resource returned by one of the openssl_get_xxx functions. Later versions may use one of the following methods:

  • Certificates

    1. An X.509 resource returned from openssl_x509_read()

    2. A string having the format file://path/to/cert.pem; the named file must contain a PEM encoded certificate

    3. A string containing the content of a certificate, PEM encoded

  • Public/Private Keys

    1. A key resource returned from openssl_get_publickey() or openssl_get_privatekey()

    2. For public keys only: an X.509 resource

    3. A string having the format file://path/to/file.pem - the named file must contain a PEM encoded certificate/private key (it may contain both)

    4. A string containing the content of a certificate/key, PEM encoded

    5. For private keys, you may also use the syntax array($key, $passphrase) where $key represents a key specified using the file:// or textual content notation above, and $passphrase represents a string containing the passphrase for that private key

Certificate Verification

When calling a function that will verify a signature/certificate, the cainfo parameter is an array containing file and directory names that specify the locations of trusted CA files. If a directory is specified, then it must be a correctly formed hashed directory as the openssl command would use.

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

X509_PURPOSE_SSL_CLIENT (integer)

X509_PURPOSE_SSL_SERVER (integer)

X509_PURPOSE_NS_SSL_SERVER (integer)

X509_PURPOSE_SMIME_SIGN (integer)

X509_PURPOSE_SMIME_ENCRYPT (integer)

X509_PURPOSE_CRL_SIGN (integer)

X509_PURPOSE_ANY (integer)

OPENSSL_PKCS1_PADDING (integer)

OPENSSL_SSLV23_PADDING (integer)

OPENSSL_NO_PADDING (integer)

OPENSSL_PKCS1_OAEP_PADDING (integer)

OPENSSL_KEYTYPE_RSA (integer)

OPENSSL_KEYTYPE_DSA (integer)

OPENSSL_KEYTYPE_DH (integer)

PKCS7 Flags/Constants

The S/MIME functions make use of flags which are specified using a bitfield which can include one or more of the following values:

表格 1. PKCS7 CONSTANTS

Constant | Description
PKCS7_TEXT | adds text/plain content type headers to encrypted/signed message. If decrypting or verifying, it strips those headers from the output - if the decrypted or verified message is not of MIME type text/plain then an error will occur.
PKCS7_BINARY | normally the input message is converted to "canonical" format which is effectively using CR and LF as end of line: as required by the S/MIME specification. When this options is present, no translation occurs. This is useful when handling binary data which may not be in MIME format.
PKCS7_NOINTERN | when verifying a message, certificates (if any) included in the message are normally searched for the signing certificate. With this option only the certificates specified in the extracerts parameter of openssl_pkcs7_verify() are used. The supplied certificates can still be used as untrusted CAs however.
PKCS7_NOVERIFY | do not verify the signers certificate of a signed message.
PKCS7_NOCHAIN | do not chain verification of signers certificates: that is don't use the certificates in the signed message as untrusted CAs.
PKCS7_NOCERTS | when signing a message the signer's certificate is normally included - with this option it is excluded. This will reduce the size of the signed message but the verifier must have a copy of the signers certificate available locally (passed using the extracerts to openssl_pkcs7_verify() for example.
PKCS7_NOATTR | normally when a message is signed, a set of attributes are included which include the signing time and the supported symmetric algorithms. With this option they are not included.
PKCS7_DETACHED | When signing a message, use cleartext signing with the MIME type multipart/signed. This is the default if the flags parameter to openssl_pkcs7_sign() if you do not specify any flags. If you turn this option off, the message will be signed using opaque signing, which is more resistant to translation by mail relays but cannot be read by mail agents that do not support S/MIME.
PKCS7_NOSIGS | Don't try and verify the signatures on a message

註: These constants were added in 4.0.6.

目錄
openssl_csr_export_to_file -- Exports a CSR to a file
openssl_csr_export -- Exports a CSR to file or a var
openssl_csr_new -- Generates a privkey and CSR
openssl_csr_sign -- Signs a cert with another CERT
openssl_error_string -- Return openSSL error message
openssl_free_key -- Free key resource
openssl_get_privatekey -- Prepare a PEM formatted private key for use
openssl_get_publickey -- Extract public key from certificate and prepare it for use
openssl_open -- Open sealed data
openssl_pkcs7_decrypt -- Decrypts an S/MIME encrypted message
openssl_pkcs7_encrypt -- Encrypt an S/MIME message
openssl_pkcs7_sign -- sign an S/MIME message
openssl_pkcs7_verify -- Verifies the signature of an S/MIME signed message
openssl_pkey_export_to_file -- Gets an exportable representation of a key into a file
openssl_pkey_export -- Gets an exportable representation of a key into a string or file
openssl_pkey_new -- Generates a new private key
openssl_private_decrypt -- Decrypts data with private key
openssl_private_encrypt -- Encrypts data with private key
openssl_public_decrypt -- Decrypts data with public key
openssl_public_encrypt -- Encrypts data with public key
openssl_seal -- Seal (encrypt) data
openssl_sign -- Generate signature
openssl_verify -- Verify signature
openssl_x509_check_private_key -- Checks if a private key corresponds to a CERT
openssl_x509_checkpurpose -- Verifies if a certificate can be used for a particular purpose
openssl_x509_export_to_file -- Exports a CERT to file or a var
openssl_x509_export -- Exports a CERT to file or a var
openssl_x509_free -- Free certificate resource
openssl_x509_parse -- Parse an X509 certificate and return the information as an array
openssl_x509_read -- Parse an X.509 certificate and return a resource identifier for it
上一頁 | 首頁 | 下一頁
OCIWriteLobToFile | 上一層 | openssl_csr_export_to_file


Oracle 函式

PHP 手冊
上一頁 下一頁

LXXIII. Oracle 函式

介紹

該擴展增加對 Oracle 資料庫伺服器連接的支援。參見 OCI8 擴展。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

ORA_BIND_INOUT (integer)

ORA_BIND_IN (integer)

ORA_BIND_OUT (integer)

ORA_FETCHINTO_ASSOC (integer)

ORA_FETCHINTO_NULLS (integer)

目錄
Ora_Bind -- bind a PHP variable to an Oracle parameter
Ora_Close -- 關閉一個 Oracle 游標
Ora_ColumnName -- 取得列名
Ora_ColumnSize -- 取得列的大小
Ora_ColumnType -- 取得列的型別
Ora_Commit -- commit an Oracle transaction
Ora_CommitOff -- disable automatic commit
Ora_CommitOn -- enable automatic commit
Ora_Do -- 分析，執行，獲取
Ora_Error -- 獲得 Oracle 錯誤訊息
Ora_ErrorCode -- 獲得 Oracle 錯誤號
Ora_Exec -- 在 Oracle 游標上執行被分析後的語句
Ora_Fetch_Into -- 將一行資料放入陣列
Ora_Fetch -- 從一個游標中取得一行資料
Ora_GetColumn -- 取得列的資料
Ora_Logoff -- 關閉一個 Oracle 連接
Ora_Logon -- 打開一個 Oracle 連接
Ora_Numcols -- 傳回列的數目
Ora_Numrows -- 傳回行的數目
Ora_Open -- 打開一個 Oracle 游標
Ora_Parse -- 分析一條 SQL 語句
Ora_pLogon -- 打開一個持久的 Oracle 連接
Ora_Rollback -- roll back transaction
上一頁 | 首頁 | 下一頁
openssl_x509_read | 上一層 | Ora_Bind


Output Control Functions

PHP 手冊
上一頁 下一頁

LXXV. Output Control Functions

介紹

The Output Control functions allow you to control when output is sent from the script. This can be useful in several different situations, especially if you need to send headers to the browser after your script has began outputting data. The Output Control functions do not affect headers sent using header() or setcookie(), only functions such as echo() and data between blocks of PHP code.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Output Control configuration options

Name | Default | Changeable
output_buffering | "0" | PHP_INI_PERDIR|PHP_INI_SYSTEM
output_handler | NULL | PHP_INI_PERDIR|PHP_INI_SYSTEM
implicit_flush | "0" | PHP_INI_PERDIR|PHP_INI_SYSTEM
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

output_buffering boolean/integer

You can enable output buffering for all files by setting this directive to 'On'. If you wish to limit the size of the buffer to a certain size - you can use a maximum number of bytes instead of 'On', as a value for this directive (e.g., output_buffering=4096).

output_handler string

You can redirect all of the output of your scripts to a function. For example, if you set output_handler to mb_output_handler(), character encoding will be transparently converted to the specified encoding. Setting any output handler automatically turns on output buffering.

註:
      You cannot use both mb_output_handler() with
      ob_inconv_handler() and you cannot use both
      ob_gzhandler() and
      zlib.output_compression.

implicit_flush boolean

FALSE by default. Changing this to TRUE tells PHP to tell the output layer to flush itself automatically after every output block. This is equivalent to calling the PHP function flush() after each and every call to print() or echo() and each and every HTML block.

When using PHP within an web environment, turning this option on has serious performance implications and is generally recommended for debugging purposes only. This value defaults to TRUE when operating under the CLI SAPI.

See also ob_implicit_flush().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. Output Control example

<?php

ob_start();
echo "Hello\n";

setcookie ("cookiename", "cookiedata");

ob_end_flush();

?>

In the above example, the output from echo() would be stored in the output buffer until ob_end_flush() was called. In the mean time, the call to setcookie() successfully stored a cookie without causing an error. (You can not normally send headers to the browser after data has already been sent.)

註: When upgrading from PHP 4.1 (and 4.2) to 4.3 that due to a bug in earlier versions you must ensure that implict_flush is OFF in your php.ini, otherwise any output with ob_start() will be not be hidden from output.

相關參考

See also header() and setcookie().

目錄
flush -- Flush the output buffer
ob_clean -- Clean (erase) the output buffer
ob_end_clean -- Clean (erase) the output buffer and turn off output buffering
ob_end_flush -- Flush (send) the output buffer and turn off output buffering
ob_flush -- Flush (send) the output buffer
ob_get_contents -- Return the contents of the output buffer
ob_get_length -- Return the length of the output buffer
ob_get_level -- Return the nesting level of the output buffering mechanism
ob_get_status -- Get status of output buffers
ob_gzhandler -- ob_start callback function to gzip output buffer
ob_implicit_flush -- Turn implicit flush on/off
ob_start -- Turn on output buffering
上一頁 | 首頁 | 下一頁
ovrimos_rollback | 上一層 | flush


Object property and method call overloading

PHP 手冊
上一頁 下一頁

LXXVI. Object property and method call overloading

介紹

The purpose of this extension is to allow overloading of object property access and method calls. Only one function is defined in this extension, overload() which takes the name of the class that should have this functionality enabled. The class named has to define appropriate methods if it wants to have this functionality: __get(), __set() and __call() respectively for getting/setting a property, or calling a method. This way overloading can be selective. Inside these handler functions the overloading is disabled so you can access object properties normally.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

In order to use these functions, you must compile PHP with the --enable-overload option.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

Some simple examples on using the overload() function:

例子 1. Overloading a PHP class

<?php

class OO
{
    var $a = 111;
    var $elem = array('b' => 9, 'c' => 42);

    // Callback method for getting a property
    function __get($prop_name, &$prop_value)
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // Callback method for setting a property
    function __set($prop_name, $prop_value)
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }
}

// Here we overload the OO object
overload('OO');

$o = new OO;
print "\$o->a: $o->a\n"; // print: $o->a:
print "\$o->b: $o->b\n"; // print: $o->b: 9
print "\$o->c: $o->c\n"; // print: $o->c: 42
print "\$o->d: $o->d\n"; // print: $o->d:

// add a new item to the $elem array in OO
$o->x = 56;

// instantiate stdclass (it is built-in in PHP 4)
// $val is not overloaded!
$val = new stdclass;
$val->prop = 555;

// Set "a" to be an array with the $val object in it
// But __set() will put this in the $elem array
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

警告

As this is an experimental extension, not all things work. There is no __call() support currently, you can only overload the get and set operations for properties. You cannot invoke the original overloading handlers of the class, and __set() only works to one level of property access.

目錄
overload -- Enable property and method call overloading for a class
上一頁 | 首頁 | 下一頁
ob_start | 上一層 | overload


Ovrimos SQL functions

PHP 手冊
上一頁 下一頁

LXXIV. Ovrimos SQL functions

介紹

Ovrimos SQL Server, is a client/server, transactional RDBMS combined with Web capabilities and fast transactions.

需求

Ovrimos SQL Server is available at http://www.ovrimos.com/. You'll need to install the sqlcli library available in the Ovrimos SQL Server distribution.

安裝

To enable Ovrimos support in PHP just compile PHP with the --with-ovrimos parameter to configure script.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

範例

例子 1. Connect to Ovrimos SQL Server and select from a system table

<?php
$conn = ovrimos_connect ("server.domain.com", "8001", "admin", "password");
if ($conn != 0) {
    echo ("Connection ok!");
    $res = ovrimos_exec ($conn, "select table_id, table_name from sys.tables");
    if ($res != 0) {
        echo "Statement ok!";
        ovrimos_result_all ($res);
        ovrimos_free_result ($res);
    }
    ovrimos_close($conn);
}
?>
This will just connect to an Ovrimos SQL server.

目錄
ovrimos_close -- Closes the connection to ovrimos
ovrimos_commit -- Commits the transaction
ovrimos_connect -- Connect to the specified database
ovrimos_cursor -- Returns the name of the cursor
ovrimos_exec -- Executes an SQL statement
ovrimos_execute -- Executes a prepared SQL statement
ovrimos_fetch_into -- Fetches a row from the result set
ovrimos_fetch_row -- Fetches a row from the result set
ovrimos_field_len -- Returns the length of the output column
ovrimos_field_name -- Returns the output column name
ovrimos_field_num -- Returns the (1-based) index of the output column
ovrimos_field_type -- Returns the (numeric) type of the output column
ovrimos_free_result -- Frees the specified result_id
ovrimos_longreadlen -- Specifies how many bytes are to be retrieved from long datatypes
ovrimos_num_fields -- Returns the number of columns
ovrimos_num_rows -- Returns the number of rows affected by update operations
ovrimos_prepare -- Prepares an SQL statement
ovrimos_result_all -- Prints the whole result set as an HTML table
ovrimos_result -- Retrieves the output column
ovrimos_rollback -- Rolls back the transaction
上一頁 | 首頁 | 下一頁
Ora_Rollback | 上一層 | ovrimos_close


Process Control Functions

PHP 手冊
上一頁 下一頁

LXXXII. Process Control Functions

介紹

Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination. Process Control should not be enabled within a webserver environment and unexpected results may happen if any Process Control functions are used within a webserver environment.

This documentation is intended to explain the general usage of each of the Process Control functions. For detailed information about Unix process control you are encouraged to consult your systems documentation including fork(2), waitpid(2) and signal(2) or a comprehensive reference such as Advanced Programming in the UNIX Environment by W. Richard Stevens (Addison-Wesley).

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

Process Control support in PHP is not enabled by default. You will need to use the --enable-pcntl configuration option when compiling PHP to enable Process Control support.

註: Currently, this module will not function on non-Unix platforms (Windows).

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

The following list of signals are supported by the Process Control functions. Please see your systems signal(7) man page for details of the default behavior of these signals.

WNOHANG (integer)

WUNTRACED (integer)

SIG_IGN (integer)

SIG_DFL (integer)

SIG_ERR (integer)

SIGHUP (integer)

SIGINT (integer)

SIGQUIT (integer)

SIGILL (integer)

SIGTRAP (integer)

SIGABRT (integer)

SIGIOT (integer)

SIGBUS (integer)

SIGFPE (integer)

SIGKILL (integer)

SIGUSR1 (integer)

SIGSEGV (integer)

SIGUSR2 (integer)

SIGPIPE (integer)

SIGALRM (integer)

SIGTERM (integer)

SIGSTKFLT (integer)

SIGCLD (integer)

SIGCHLD (integer)

SIGCONT (integer)

SIGSTOP (integer)

SIGTSTP (integer)

SIGTTIN (integer)

SIGTTOU (integer)

SIGURG (integer)

SIGXCPU (integer)

SIGXFSZ (integer)

SIGVTALRM (integer)

SIGPROF (integer)

SIGWINCH (integer)

SIGPOLL (integer)

SIGIO (integer)

SIGPWR (integer)

SIGSYS (integer)

SIGBABY (integer)

範例

This example forks off a daemon process with a signal handler.

例子 1. Process Control Example

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die("could not fork");
} else if ($pid) {
     exit(); // we are the parent
} else {
     // we are the child
}

// detatch from the controlling terminal
if (!posix_setsid()) {
    die("could not detach from terminal");
}

// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

// loop forever performing tasks
while(1) {

    // do something interesting here

}

function sig_handler($signo) {

     switch($signo) {
         case SIGTERM:
             // handle shutdown tasks
             exit;
             break;
         case SIGHUP:
             // handle restart tasks
             break;
         default:
             // handle all other signals
     }

}

?>

相關參考

A look at the section about POSIX functions may be useful.

目錄
pcntl_exec -- Executes specified program in current process space
pcntl_fork -- Forks the currently running process
pcntl_signal -- Installs a signal handler
pcntl_waitpid -- Waits on or returns the status of a forked child
pcntl_wexitstatus -- Returns the return code of a terminated child
pcntl_wifexited -- Returns TRUE if status code represents a successful exit
pcntl_wifsignaled -- Returns TRUE if status code represents a termination due to a signal
pcntl_wifstopped -- Returns TRUE if child process is currently stopped
pcntl_wstopsig -- Returns the signal which caused the child to stop
pcntl_wtermsig -- Returns the signal which caused the child to terminate
上一頁 | 首頁 | 下一頁
pg_update | 上一層 | pcntl_exec


Regular Expression Functions (Perl-Compatible)

PHP 手冊
上一頁 下一頁

LXXXVIII. Regular Expression Functions (Perl-Compatible)

介紹

The syntax for patterns used in these functions closely resembles Perl. The expression should be enclosed in the delimiters, a forward slash (/), for example. Any character can be used for delimiter as long as it's not alphanumeric or backslash (\). If the delimiter character has to be used in the expression itself, it needs to be escaped by backslash. Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters.

The ending delimiter may be followed by various modifiers that affect the matching. See Pattern Modifiers.

PHP also supports regular expressions using a POSIX-extended syntax using the POSIX-extended regex functions..

需求

Regular expression support is provided by the PCRE library package, which is open source software, written by Philip Hazel, and copyright by the University of Cambridge, England. It is available at ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/.

安裝

Beginning with PHP 4.2.0 this function are enabled by default. For older versions you have to configure and compile PHP with --with-pcre-regex[=DIR] in order to use these functions. You can disable the pcre functions with --without-pcre-regex.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

表格 1. PREG constants

constant | description
PREG_PATTERN_ORDER | Orders results so that $matches[0] is an array of full pattern matches, $matches[1] is an array of strings matched by the first parenthesized subpattern, and so on. This flag is only used with preg_match_all().
PREG_SET_ORDER | Orders results so that $matches[0] is an array of first set of matches, $matches[1] is an array of second set of matches, and so on. This flag is only used with preg_match_all().
PREG_OFFSET_CAPTURE | See the description of PREG_SPLIT_OFFSET_CAPTURE. This flag is available since PHP 4.3.0 .
PREG_SPLIT_NO_EMPTY | This flag tells preg_split() to only return only non-empty pieces.
PREG_SPLIT_DELIM_CAPTURE | This flag tells preg_split() to capture parenthesized expression in the delimiter pattern as well. This flag is available since PHP 4.0.5 .
PREG_SPLIT_OFFSET_CAPTURE | If this flag is set, for every occuring match the appendant string offset will also be returned. Note that this changes the return value in an array where very element is an array consisting of the matched string at offset 0 and it's string offset into subject at offset 1. This flag is available since PHP 4.3.0 and is only used for preg_split().

範例

例子 1. Examples of valid patterns

  • /<\/\w+>/

  • |(\d{3})-\d+|Sm

  • /^(?i)php[34]/

  • {^\s+(\s+)?$}

例子 2. Examples of invalid patterns

  • /href='(.*)' - missing ending delimiter

  • /\w+\s*\w+/J - unknown modifier 'J'

  • 1-\d3-\d3-\d4| - missing starting delimiter

目錄
Pattern Modifiers -- Describes possible modifiers in regex patterns
Pattern Syntax -- Describes PCRE regex syntax
preg_grep -- Return array entries that match the pattern
preg_match_all -- Perform a global regular expression match
preg_match -- Perform a regular expression match
preg_quote -- Quote regular expression characters
preg_replace_callback -- Perform a regular expression search and replace using a callback
preg_replace -- Perform a regular expression search and replace
preg_split -- Split string by a regular expression
上一頁 | 首頁 | 下一頁
recode | 上一層 | Pattern Modifiers


PDF functions

PHP 手冊
上一頁 下一頁

LXXVII. PDF functions

介紹

The PDF functions in PHP can create PDF files using the PDFlib library created by Thomas Merz.

The documentation in this section is only meant to be an overview of the available functions in the PDFlib library and should not be considered an exhaustive reference. Please consult the documentation included in the source distribution of PDFlib for the full and detailed explanation of each function here. It provides a very good overview of what PDFlib is capable of doing and contains the most up-to-date documentation of all functions.

All of the functions in PDFlib and the PHP module have identical function names and parameters. You will need to understand some of the basic concepts of PDF and PostScript to efficiently use this extension. All lengths and coordinates are measured in PostScript points. There are generally 72 PostScript points to an inch, but this depends on the output resolution. Please see the PDFlib documentation included with the source distribution of PDFlib for a more thorough explanation of the coordinate system used.

Please note that most of the PDF functions require a pdf object as its first parameter. Please see the examples below for more information.

需求

PDFlib is available for download at http://www.pdflib.com/pdflib/index.html, but requires that you purchase a license for commercial use. The JPEG and TIFF libraries are required to compile this extension.

PDFlib 3.x Installation Hints

When using version 3.x of PDFlib, you should configure PDFlib with the option --enable-shared-pdflib.

Issues with older versions of PDFlib

Any version of PHP 4 after March 9, 2000 does not support versions of PDFlib older than 3.0.

PDFlib 3.0 or greater is supported by PHP 3.0.19 and later.

安裝

Please see the PDFlib installation section for more information about compiling PDF support into PHP.

執行時配置

該擴展模塊未定義任何設置指令。

Confusion with old PDFlib versions

Starting with PHP 4.0.5, the PHP extension for PDFlib is officially supported by PDFlib GmbH. This means that all the functions described in the PDFlib manual (V3.00 or greater) are supported by PHP 4 with exactly the same meaning and the same parameters. Only the return values may differ from the PDFlib manual, because the PHP convention of returning FALSE was adopted. For compatibility reasons, this binding for PDFlib still supports the old functions, but they should be replaced by their new versions. PDFlib GmbH will not support any problems arising from the use of these deprecated functions.

表格 1. Deprecated functions and their replacements

Old function | Replacement
pdf_put_image() | Not needed anymore.
pdf_execute_image() | Not needed anymore.
pdf_get_annotation() | pdf_get_bookmark() using the same parameters.
pdf_get_font() | pdf_get_value() passing "font" as the second parameter.
pdf_get_fontsize() | pdf_get_value() passing "fontsize" as the second parameter.
pdf_get_fontname() | pdf_get_parameter() passing "fontname" as the second parameter.
pdf_set_info_creator() | pdf_set_info() passing "Creator" as the second parameter.
pdf_set_info_title() | pdf_set_info() passing "Title" as the second parameter.
pdf_set_info_subject() | pdf_set_info() passing "Subject" as the second parameter.
pdf_set_info_author() | pdf_set_info() passing "Author" as the second parameter.
pdf_set_info_keywords() | pdf_set_info() passing "Keywords" as the second parameter.
pdf_set_leading() | pdf_set_value() passing "leading" as the second parameter.
pdf_set_text_rendering() | pdf_set_value() passing "textrendering" as the second parameter.
pdf_set_text_rise() | pdf_set_value() passing "textrise" as the second parameter.
pdf_set_horiz_scaling() | pdf_set_value() passing "horizscaling" as the second parameter.
pdf_set_text_matrix() | Not available anymore
pdf_set_char_spacing() | pdf_set_value() passing "charspacing" as the second parameter.
pdf_set_word_spacing() | pdf_set_value() passing "wordspacing" as the second parameter.
pdf_set_transition() | pdf_set_parameter() passing "transition" as the second parameter.
pdf_open() | pdf_new() plus an subsequent call of pdf_open_file()
pdf_set_font() | pdf_findfont() plus an subsequent call of pdf_setfont()
pdf_set_duration() | pdf_set_value() passing "duration" as the second parameter.
pdf_open_gif() | pdf_open_image_file() passing "gif" as the second parameter.
pdf_open_jpeg() | pdf_open_image_file() passing "jpeg" as the second parameter.
pdf_open_tiff() | pdf_open_image_file() passing "tiff" as the second parameter.
pdf_open_png() | pdf_open_image_file() passing "png" as the second parameter.
pdf_get_image_width() | pdf_get_value() passing "imagewidth" as the second parameter and the image as the third parameter.
pdf_get_image_height() | pdf_get_value() passing "imageheight" as the second parameter and the image as the third parameter.

範例

Most of the functions are fairly easy to use. The most difficult part is probably creating your first PDF document. The following example should help to get you started. It creates test.pdf with one page. The page contains the text "Times Roman outlined" in an outlined, 30pt font. The text is also underlined.

例子 1. Creating a PDF document with PDFlib

<?php
$pdf = pdf_new();
pdf_open_file($pdf, "test.pdf");
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Test for PHP wrapper of PDFlib 2.0");
pdf_set_info($pdf, "Creator", "See Author");
pdf_set_info($pdf, "Subject", "Testing");
pdf_begin_page($pdf, 595, 842);
pdf_add_outline($pdf, "Page 1");
pdf_set_font($pdf, "Times-Roman", 30, "host");
pdf_set_value($pdf, "textrendering", 1);
pdf_show_xy($pdf, "Times Roman outlined", 50, 750);
pdf_moveto($pdf, 50, 740);
pdf_lineto($pdf, 330, 740);
pdf_stroke($pdf);
pdf_end_page($pdf);
pdf_close($pdf);
pdf_delete($pdf);
echo "<A HREF=getpdf.php>finished</A>";
?>

The script getpdf.php just returns the pdf document.

<?php
$len = filesize($filename);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=foo.pdf");
readfile($filename);
?>

The PDFlib distribution contains a more complex example which creates a page with an analog clock. Here we use the in-memory creation feature of PDFlib to alleviate the need to use temporary files. The example was converted to PHP from the PDFlib example. (The same example is available in the CLibPDF documentation.)

例子 2. pdfclock example from PDFlib distribution

<?php
$radius = 200;
$margin = 20;
$pagecount = 10;

$pdf = pdf_new();

if (!pdf_open_file($pdf, "")) {
    print error;
    exit;
};

pdf_set_parameter($pdf, "warning", "true");

pdf_set_info($pdf, "Creator", "pdf_clock.php");
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Analog Clock");

while($pagecount-- > 0) {
    pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin));

    pdf_set_parameter($pdf, "transition", "wipe");
    pdf_set_value($pdf, "duration", 0.5);

    pdf_translate($pdf, $radius + $margin, $radius + $margin);
    pdf_save($pdf);
    pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);

    /* minute strokes */
    pdf_setlinewidth($pdf, 2.0);
    for ($alpha = 0; $alpha < 360; $alpha += 6) {
        pdf_rotate($pdf, 6.0);
        pdf_moveto($pdf, $radius, 0.0);
        pdf_lineto($pdf, $radius-$margin/3, 0.0);
        pdf_stroke($pdf);
    }

    pdf_restore($pdf);
    pdf_save($pdf);

    /* 5 minute strokes */
    pdf_setlinewidth($pdf, 3.0);
    for ($alpha = 0; $alpha < 360; $alpha += 30) {
        pdf_rotate($pdf, 30.0);
        pdf_moveto($pdf, $radius, 0.0);
        pdf_lineto($pdf, $radius-$margin, 0.0);
        pdf_stroke($pdf);
    }

    $ltime = getdate();

    /* draw hour hand */
    pdf_save($pdf);
    pdf_rotate($pdf,-(($ltime['minutes']/60.0)+$ltime['hours']-3.0)*30.0);
    pdf_moveto($pdf, -$radius/10, -$radius/20);
    pdf_lineto($pdf, $radius/2, 0.0);
    pdf_lineto($pdf, -$radius/10, $radius/20);
    pdf_closepath($pdf);
    pdf_fill($pdf);
    pdf_restore($pdf);

    /* draw minute hand */
    pdf_save($pdf);
    pdf_rotate($pdf,-(($ltime['seconds']/60.0)+$ltime['minutes']-15.0)*6.0);
    pdf_moveto($pdf, -$radius/10, -$radius/20);
    pdf_lineto($pdf, $radius * 0.8, 0.0);
    pdf_lineto($pdf, -$radius/10, $radius/20);
    pdf_closepath($pdf);
    pdf_fill($pdf);
    pdf_restore($pdf);

    /* draw second hand */
    pdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
    pdf_setlinewidth($pdf, 2);
    pdf_save($pdf);
    pdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
    pdf_moveto($pdf, -$radius/5, 0.0);
    pdf_lineto($pdf, $radius, 0.0);
    pdf_stroke($pdf);
    pdf_restore($pdf);

    /* draw little circle at center */
    pdf_circle($pdf, 0, 0, $radius/30);
    pdf_fill($pdf);

    pdf_restore($pdf);

    pdf_end_page($pdf);

    # to see some difference
    sleep(1);
}

pdf_close($pdf);

$buf = pdf_get_buffer($pdf);
$len = strlen($buf);

header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=foo.pdf");
print $buf;

pdf_delete($pdf);
?>

相關參考

註: An alternative PHP module for PDF document creation based on FastIO's ClibPDF is available. Please see the ClibPDF section for details. Note that ClibPDF has a slightly different API than PDFlib.

目錄
pdf_add_annotation -- Deprecated: Adds annotation
pdf_add_bookmark -- Adds bookmark for current page
pdf_add_launchlink -- Add a launch annotation for current page
pdf_add_locallink -- Add a link annotation for current page
pdf_add_note -- Add a note annotation for current page
pdf_add_outline -- Deprecated: Adds bookmark for current page
pdf_add_pdflink -- Adds file link annotation for current page
pdf_add_thumbnail -- Adds thumbnail for current page
pdf_add_weblink -- Adds weblink for current page
pdf_arc -- Draws an arc (counterclockwise)
pdf_arcn -- Draws an arc (clockwise)
pdf_attach_file -- Adds a file attachement for current page
pdf_begin_page -- Starts new page
pdf_begin_pattern -- Starts new pattern
pdf_begin_template -- Starts new template
pdf_circle -- Draws a circle
pdf_clip -- Clips to current path
pdf_close_image -- Closes an image
pdf_close_pdi_page -- Close the page handle
pdf_close_pdi -- Close the input PDF document
pdf_close -- Closes a pdf object
pdf_closepath_fill_stroke -- Closes, fills and strokes current path
pdf_closepath_stroke -- Closes path and draws line along path
pdf_closepath -- Closes path
pdf_concat -- Concatenate a matrix to the CTM
pdf_continue_text -- Outputs text in next line
pdf_curveto -- Draws a curve
pdf_delete -- Deletes a PDF object
pdf_end_page -- Ends a page
pdf_end_pattern -- Finish pattern
pdf_end_template -- Finish template
pdf_endpath -- Deprecated: Ends current path
pdf_fill_stroke -- Fills and strokes current path
pdf_fill -- Fills current path
pdf_findfont -- Prepare font for later use with pdf_setfont().
pdf_get_buffer -- Fetch the buffer containig the generated PDF data.
pdf_get_font -- Deprecated: font handling
pdf_get_fontname -- Deprecated: font handling
pdf_get_fontsize -- Deprecated: font handling
pdf_get_image_height -- Returns height of an image
pdf_get_image_width -- Returns width of an image
pdf_get_majorversion -- Returns the major version number of the PDFlib
pdf_get_minorversion -- Returns the minor version number of the PDFlib
pdf_get_parameter -- Gets certain parameters
pdf_get_pdi_parameter -- Get some PDI string parameters
pdf_get_pdi_value -- Gets some PDI numerical parameters
pdf_get_value -- Gets certain numerical value
pdf_initgraphics -- Resets graphic state
pdf_lineto -- Draws a line
pdf_makespotcolor -- Makes a spotcolor
pdf_moveto -- Sets current point
pdf_new -- Creates a new pdf object
pdf_open_CCITT -- Opens a new image file with raw CCITT data
pdf_open_file -- Opens a new pdf object
pdf_open_gif -- Deprecated: Opens a GIF image
pdf_open_image_file -- Reads an image from a file
pdf_open_image -- Versatile function for images
pdf_open_jpeg -- Deprecated: Opens a JPEG image
pdf_open_memory_image -- Opens an image created with PHP's image functions
pdf_open_pdi_page -- Prepare a page
pdf_open_pdi -- Opens a PDF file
pdf_open_png -- Deprecated: Opens a PNG image
pdf_open_tiff -- Deprecated: Opens a TIFF image
pdf_open -- Deprecated: Open a new pdf object
pdf_place_image -- Places an image on the page
pdf_place_pdi_page -- Places an image on the page
pdf_rect -- Draws a rectangle
pdf_restore -- Restores formerly saved environment
pdf_rotate -- Sets rotation
pdf_save -- Saves the current environment
pdf_scale -- Sets scaling
pdf_set_border_color -- Sets color of border around links and annotations
pdf_set_border_dash -- Sets dash style of border around links and annotations
pdf_set_border_style -- Sets style of border around links and annotations
pdf_set_char_spacing -- Deprecated: Sets character spacing
pdf_set_duration -- Deprecated: Sets duration between pages
pdf_set_font -- Deprecated: Selects a font face and size
pdf_set_horiz_scaling -- Sets horizontal scaling of text
pdf_set_info_author -- Fills the author field of the document
pdf_set_info_creator -- Fills the creator field of the document
pdf_set_info_keywords -- Fills the keywords field of the document
pdf_set_info_subject -- Fills the subject field of the document
pdf_set_info_title -- Fills the title field of the document
pdf_set_info -- Fills a field of the document information
pdf_set_leading -- Deprecated: Sets distance between text lines
pdf_set_parameter -- Sets certain parameters
pdf_set_text_matrix -- Deprecated: Sets the text matrix
pdf_set_text_pos -- Sets text position
pdf_set_text_rendering -- Deprecated: Determines how text is rendered
pdf_set_text_rise -- Deprecated: Sets the text rise
pdf_set_value -- Sets certain numerical value
pdf_set_word_spacing -- Depriciated: Sets spacing between words
pdf_setcolor -- Sets fill and stroke color
pdf_setdash -- Sets dash pattern
pdf_setflat -- Sets flatness
pdf_setfont -- Set the current font
pdf_setgray_fill -- Sets filling color to gray value
pdf_setgray_stroke -- Sets drawing color to gray value
pdf_setgray -- Sets drawing and filling color to gray value
pdf_setlinecap -- Sets linecap parameter
pdf_setlinejoin -- Sets linejoin parameter
pdf_setlinewidth -- Sets line width
pdf_setmatrix -- Sets current transformation matrix
pdf_setmiterlimit -- Sets miter limit
pdf_setpolydash -- Sets complicated dash pattern
pdf_setrgbcolor_fill -- Sets filling color to rgb color value
pdf_setrgbcolor_stroke -- Sets drawing color to rgb color value
pdf_setrgbcolor -- Sets drawing and filling color to rgb color value
pdf_show_boxed -- Output text in a box
pdf_show_xy -- Output text at given position
pdf_show -- Output text at current position
pdf_skew -- Skews the coordinate system
pdf_stringwidth -- Returns width of text using current font
pdf_stroke -- Draws line along path
pdf_translate -- Sets origin of coordinate system
上一頁 | 首頁 | 下一頁
overload | 上一層 | pdf_add_annotation


Verisign Payflow Pro functions

PHP 手冊
上一頁 下一頁

LXXVIII. Verisign Payflow Pro functions

介紹

This extension allows you to process credit cards and other financial transactions using Verisign Payment Services, formerly known as Signio (http://www.verisign.com/products/payflow/pro/index.html).

When using these functions, you may omit calls to pfpro_init() and pfpro_cleanup() as this extension will do so automatically if required. However the functions are still available in case you are processing a number of transactions and require fine control over the library. You may perform any number of transactions using pfpro_process() between the two.

These functions were added in PHP 4.0.2.

註: These functions only provide a link to Verisign Payment Services. Be sure to read the Payflow Pro Developers Guide for full details of the required parameters.

需求

You will require the appropriate SDK for your platform, which may be downloaded from within the manager interface once you have registered. If you are going to use this extension in an SSL-enabled webserver or with other SSL components (such as the CURL+SSL extension) you MUST get the beta SDK.

Once you have downloaded the SDK you should copy the files from the lib directory of the distribution. Copy the header file pfpro.h to /usr/local/include and the library file libpfpro.so to /usr/local/lib.

安裝

These functions are only available if PHP has been compiled with the --with-pfpro[=DIR] option.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Verisign Payflow Pro configuration options

Name | Default | Changeable
pfpro.defaulthost/PFPRO_VERSION < 3 | "test.signio.com" | PHP_INI_ALL
pfpro.defaulthost | "test-payflow.verisign.com" | PHP_INI_ALL
pfpro.defaultport | "443" | PHP_INI_ALL
pfpro.defaulttimeout | "30" | PHP_INI_ALL
pfpro.proxyaddress | "" | PHP_INI_ALL
pfpro.proxyport | "" | PHP_INI_ALL
pfpro.proxylogon | "" | PHP_INI_ALL
pfpro.proxypassword | "" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
pfpro_cleanup -- Shuts down the Payflow Pro library
pfpro_init -- Initialises the Payflow Pro library
pfpro_process_raw -- Process a raw transaction with Payflow Pro
pfpro_process -- Process a transaction with Payflow Pro
pfpro_version -- Returns the version of the Payflow Pro software
上一頁 | 首頁 | 下一頁
pdf_translate | 上一層 | pfpro_cleanup


PostgreSQL 資料庫函式庫

PHP 手冊
上一頁 下一頁

LXXXI. PostgreSQL 資料庫函式庫

介紹

PostgreSQL 是一個開放源碼的免費資料庫系統。Postgres 最初由加州大學伯克利分校計算機科學系開發，倡導了很多關係對象的觀念，這些觀念現在已經用在一些商業資料庫系統中。它提供了 SQL92/SQL99 語言支援，事務集成以及型別擴展。PostgreSQL 則是 Postgres 的一個開放原始碼的後代。

需求

要使用 PostgreSQL 支援，需要 PostgreSQL 6.5 或更新版本，PostgreSQL 7.0 或更新版本來使用所有的 PostgreSQL 模塊。PostgreSQL支援多種字元編碼包括多字節字元編碼。關於 PostgreSQL 的當前版本以及更多訊息見：http://www.postgresql.org/。

安裝

為增加 PostgreSQL 支援，在編譯 PHP 時需要 --with-pgsql[=DIR] 選項。如果可以用共享模塊方式，PostgreSQL 模塊可以在 php.ini 用 extension 指令或者 dl() 函式加載。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. PostgreSQL 配置選項

名稱 | 預設值 | 可變範圍
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM
pgsql.max_links | "-1" | PHP_INI_SYSTEM
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM
pgsql.ignore_notice | "0" | PHP_INI_ALL
pgsql.log_notice | "0" | PHP_INI_ALL
PHP_INI_* 常數的更多細節和定義參見 ini_set()。

下面是配置指令的簡短說明。

pgsql.allow_persistent boolean

是否允許持久的 Postgres 連接。

pgsql.max_persistent integer

每個進程所能有的持久 Postgres 連接數目。

pgsql.max_links integer

每個進程所能有的 Postgres 連接數目，包括持久連接。

使用方法及提示

警告

由於 notice message handling 代碼中的 bug，不推薦在 PHP 4.0.6 中使用 PostgreSQL 模塊。使用 4.1.0 或更新版本。

警告

為符合當前編碼標準，PostgreSQL 函式名稱將在 4.2.0 版本中改變。大多數新名稱將多出一個下劃線，例如 pg_lo_open()。一部分函式則改變了名稱以保持一致性。例如 pg_exec() 改為 pg_query()。老的函式名依然可以在 4.2.0 和以後的少數幾個版本中使用，但以後可能會刪除。

表格 2. 已改變的函式名

舊名稱 | 新名稱
pg_exec() | pg_query()
pg_getlastoid() | pg_last_oid()
pg_cmdtuples() | pg_affected_rows()
pg_numrows() | pg_num_rows()
pg_numfields() | pg_num_fields()
pg_fieldname() | pg_field_name()
pg_fieldsize() | pg_field_size()
pg_fieldnum() | pg_field_num()
pg_fieldprtlen() | pg_field_prtlen()
pg_fieldisnull() | pg_field_is_null()
pg_freeresult() | pg_free_result()
pg_result() | pg_fetch_result()
pg_loreadall() | pg_lo_read_all()
pg_locreate() | pg_lo_create()
pg_lounlink() | pg_lo_unlink()
pg_loopen() | pg_lo_open()
pg_loclose() | pg_lo_close()
pg_loread() | pg_lo_read()
pg_lowrite() | pg_lo_write()
pg_loimport() | pg_lo_import()
pg_loexport() | pg_lo_export()

為以後支援異步連接，將不再提倡用舊語法使用函式 pg_connect()/pg_pconnect()。請用連接字串作為參數來使用函式 pg_connect() 和 pg_pconnect()。

不是所有的版本都支援所有的函式，這和 libpq 的版本和編譯方法有關。如果編譯原始碼時少了一個函式，那麼 libpq 就不支援需要該函式的功能。

用比 PostgreSQL 伺服器所接受的連接更新的 libpq 版本也很重要。如果你用的 libpq 版本比 PostgreSQL 伺服器預期的低就可能出現問題。

PostgreSQL 在 6.3 (03/02/1998) 版之後預定使用 unix domain sockets，預定狀態下不會打開 TCP 端口。下面這張表說明了各種新建連接的可能性。TCP/IP socket 放在 /tmp/.s.PGSQL.5432。該選項可用 postmaster 中的 '-i' 參數打開，它表示“監視 TCP/IP 端口以及 Unix domain socket”。

表格 3. Postmaster 和 PHP

Postmaster | PHP | 狀態
postmaster & | pg_connect("dbname=MyDbName"); | OK
postmaster -i & | pg_connect("dbname=MyDbName"); | OK
postmaster & | pg_connect("host=localhost dbname=MyDbName"); | Unable to connect to PostgreSQL server: connectDB() failed: Is the postmaster running and accepting TCP/IP (with -i) connection at 'localhost' on port '5432'? in /path/to/file.php on line 20.
postmaster -i & | pg_connect("host=localhost dbname=MyDbName"); | OK

到 PostgreSQL 伺服器的連接可以通過以下命令串中的參數對建立：$conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword");

以前的語法： $conn = pg_connect ("host", "port", "options", "tty", "dbname") 已經不再提倡使用。

環境變數會影響 PostgreSQL 伺服器／客戶機的行為。例如如果連接串中省略了主機名，PostgreSQL 模塊將會查找環境變數 PGHOST。 不同版本所支援的環境變數不同，詳情參考 PostgreSQL Programmers's Manual (libpq - Environment Variables)。

確認已經給適當的用戶設置了環境變數。用 $_ENV 或 getenv() 來檢查當前進程可以使用哪些環境變數。

例子 1. 設定預定參數

PGHOST=pgsql.example.com
PGPORT=7890
PGDATABASE=web-system
PGUSER=web-user
PGPASSWORD=secret
PGDATESTYLE=ISO
PGTZ=JST
PGCLIENTENCODING=EUC-JP

export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD PGDATESTYLE PGTZ PGCLIENTENCODING

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

PGSQL_ASSOC (integer)

PGSQL_NUM (integer)

PGSQL_BOTH (integer)

PGSQL_CONNECTION_BAD (integer)

PGSQL_CONNECTION_OK (integer)

PGSQL_SEEK_SET (integer)

PGSQL_SEEK_CUR (integer)

PGSQL_SEEK_END (integer)

PGSQL_ESCAPE_STRING (integer)

PGSQL_ESCAPE_BYTEA (integer)

PGSQL_EMPTY_QUERY (integer)

PGSQL_COMMAND_OK (integer)

PGSQL_TUPLES_OK (integer)

PGSQL_COPY_OUT (integer)

PGSQL_COPY_IN (integer)

PGSQL_BAD_RESPONSE (integer)

PGSQL_NONFATAL_ERROR (integer)

PGSQL_FATAL_ERROR (integer)

範例

從 PostgreSQL 7.1.0 開始，在一個 text 型別字段中最多可以儲存 1GB 的資料。在老版本中則限制為一個塊的大小（預定 8KB，最大 32KB，編譯時指定）。

要使用 large object (lo) 接口，需要把 large object 函式放在一個事務段中。事務段以 SQL 語句 BEGIN 開始，如果該事務合法，以 COMMIT 或者 END結束，如果該事務失敗，則以 ROLLBACK 或者 ABORT結束。

例子 2. 使用 Large Object

<?php
    $database = pg_connect ("dbname=jacarta");
    pg_query ($database, "begin");
    $oid = pg_lo_create ($database);
    echo "$oid\n";
    $handle = pg_lo_open ($database, $oid, "w");
    echo "$handle\n";
    pg_lo_write ($handle, "large object data");
    pg_lo_close ($handle);
    pg_query ($database, "commit");
?>
在關閉 large object 之前不應關閉到 PostgreSQL 伺服器的連接。

目錄
pg_affected_rows -- 傳回受影響的記錄數目
pg_cancel_query -- 取消異步查詢
pg_client_encoding -- 取得客戶端編碼方式
pg_close -- 關閉一個 PostgreSQL 連接
pg_connect -- 打開一個 PostgreSQL 連接
pg_connection_busy -- 獲知連接是否為忙
pg_connection_reset -- 重置連接（再次連接）
pg_connection_status -- 獲得連接狀態
pg_convert -- 將關聯的陣列值轉換為適合 SQL 語句的格式。
pg_copy_from -- 根據陣列將記錄插入表中
pg_copy_to -- 將一個表拷貝到陣列中
pg_dbname -- 獲得資料庫名
pg_delete -- 刪除記錄
pg_end_copy -- 與 PostgreSQL 後端同步
pg_escape_bytea -- 轉義 bytea 型別的二進制資料
pg_escape_string -- 轉義 text/char 型別的字串
pg_fetch_all -- Fetch a row as an array
pg_fetch_array -- 提取一行作為陣列
pg_fetch_assoc -- Fetch a row as an array
pg_fetch_object -- 提取一行作為對象
pg_fetch_result -- 從結果資源中傳回值
pg_fetch_row -- 提取一行作為枚舉陣列
pg_field_is_null -- 測試字段是否為 NULL
pg_field_name -- 傳回字段的名字
pg_field_num -- 傳回字段的編號
pg_field_prtlen -- 傳回顯示出來的長度
pg_field_size -- 傳回指定字段占用內部存儲空間的大小
pg_field_type -- 傳回相應字段的型別名稱
pg_free_result -- 釋放查詢結果占用的內存
pg_get_notify -- Ping database connection
pg_get_pid -- Ping database connection
pg_get_result -- 取得異步查詢結果
pg_host -- 傳回和某連接關聯的主機名
pg_insert -- 將陣列插入到表中
pg_last_error -- 得到某連接的最後一條錯誤訊息
pg_last_notice -- 傳回 PostgreSQL 伺服器最新一條公告訊息
pg_last_oid -- 傳回上一個對象的 oid
pg_lo_close -- 關閉一個大型對象
pg_lo_create -- 新建一個大型對象
pg_lo_export -- 將大型對象導出到文件
pg_lo_import -- 將文件導入為大型對象
pg_lo_open -- 打開一個大型對象
pg_lo_read_all -- 讀入整個大型對象並直接發送給瀏覽器
pg_lo_read -- 從大型對象中讀入資料
pg_lo_seek -- 移動大型對象中的指針
pg_lo_tell -- 傳回大型對象的當前指針位置
pg_lo_unlink -- 刪除一個大型對象
pg_lo_write -- 向大型對象寫入資料
pg_meta_data -- Get meta data for table.
pg_num_fields -- 傳回字段的數目
pg_num_rows -- 傳回行的數目
pg_options -- 獲得和連接有關的選項
pg_pconnect -- 打開一個持久的 PostgreSQL 連接
pg_ping -- Ping database connection
pg_port -- 傳回該連接的端口號
pg_put_line -- 向 PostgreSQL 後端發送以 NULL 結尾的字串
pg_query -- 執行查詢
pg_result_error -- 獲得查詢結果的錯誤訊息
pg_result_seek -- Set internal row offset in result resource
pg_result_status -- 獲得查詢結果的狀態
pg_select -- 選擇記錄
pg_send_query -- 發送異步查詢
pg_set_client_encoding -- 設定客戶端編碼
pg_trace -- 啟動一個 PostgreSQL 連接的追蹤功能
pg_tty -- 傳回該連接的 tty 號
pg_unescape_bytea -- Escape binary for bytea type
pg_untrace -- 關閉 PostgreSQL 連接的追蹤功能
pg_update -- 更新表
上一頁 | 首頁 | 下一頁
posix_uname | 上一層 | pg_affected_rows


POSIX functions

PHP 手冊
上一頁 下一頁

LXXX. POSIX functions

介紹

This module contains an interface to those functions defined in the IEEE 1003.1 (POSIX.1) standards document which are not accessible through other means. POSIX.1 for example defined the open(), read(), write() and close() functions, too, which traditionally have been part of PHP 3 for a long time. Some more system specific functions have not been available before, though, and this module tries to remedy this by providing easy access to these functions.

警告

Sensitive data can be retrieved with the POSIX functions, e.g. posix_getpwnam() and friends. None of the POSIX function perform any kind of access checking when safe mode is enabled. It's therefore strongly advised to disable the POSIX extension at all (use --disable-posix in your configure line) if you're operating in such an environment.

註: The POSIX extension is not available on the Windows platform.

相關參考

The section about Process Control Functions maybe of interest for you.

目錄
posix_ctermid -- Get path name of controlling terminal
posix_getcwd -- Pathname of current directory
posix_getegid -- Return the effective group ID of the current process
posix_geteuid -- Return the effective user ID of the current process
posix_getgid -- Return the real group ID of the current process
posix_getgrgid -- Return info about a group by group id
posix_getgrnam -- Return info about a group by name
posix_getgroups -- Return the group set of the current process
posix_getlogin -- Return login name
posix_getpgid -- Get process group id for job control
posix_getpgrp -- Return the current process group identifier
posix_getpid -- Return the current process identifier
posix_getppid -- Return the parent process identifier
posix_getpwnam -- Return info about a user by username
posix_getpwuid -- Return info about a user by user id
posix_getrlimit -- Return info about system ressource limits
posix_getsid -- Get the current sid of the process
posix_getuid -- Return the real user ID of the current process
posix_isatty -- Determine if a file descriptor is an interactive terminal
posix_kill -- Send a signal to a process
posix_mkfifo -- Create a fifo special file (a named pipe)
posix_setegid -- Set the effective GID of the current process
posix_seteuid -- Set the effective UID of the current process
posix_setgid -- Set the GID of the current process
posix_setpgid -- set process group id for job control
posix_setsid -- Make the current process a session leader
posix_setuid -- Set the UID of the current process
posix_times -- Get process times
posix_ttyname -- Determine terminal device name
posix_uname -- Get system name
上一頁 | 首頁 | 下一頁
zend_version | 上一層 | posix_ctermid


Printer functions

PHP 手冊
上一頁 下一頁

LXXXIV. Printer functions

介紹

These functions are only available under Windows 9.x, ME, NT4 and 2000. They have been added in PHP 4 (4.0.4).

安裝

Add the line extension=php_printer.dll to your php.ini file.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Printer configuration options

Name | Default | Changeable
printer.default_printer | "" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

目錄
printer_abort -- Deletes the printer's spool file
printer_close -- Close an open printer connection
printer_create_brush -- Create a new brush
printer_create_dc -- Create a new device context
printer_create_font -- Create a new font
printer_create_pen -- Create a new pen
printer_delete_brush -- Delete a brush
printer_delete_dc -- Delete a device context
printer_delete_font -- Delete a font
printer_delete_pen -- Delete a pen
printer_draw_bmp -- Draw a bmp
printer_draw_chord -- Draw a chord
printer_draw_elipse -- Draw an ellipse
printer_draw_line -- Draw a line
printer_draw_pie -- Draw a pie
printer_draw_rectangle -- Draw a rectangle
printer_draw_roundrect -- Draw a rectangle with rounded corners
printer_draw_text -- Draw text
printer_end_doc -- Close document
printer_end_page -- Close active page
printer_get_option -- Retrieve printer configuration data
printer_list -- Return an array of printers attached to the server
printer_logical_fontheight -- Get logical font height
printer_open -- Open connection to a printer
printer_select_brush -- Select a brush
printer_select_font -- Select a font
printer_select_pen -- Select a pen
printer_set_option -- Configure the printer connection
printer_start_doc -- Start a new document
printer_start_page -- Start a new page
printer_write -- Write data to the printer
上一頁 | 首頁 | 下一頁
system | 上一層 | printer_abort


Pspell Functions

PHP 手冊
上一頁 下一頁

LXXXV. Pspell Functions

介紹

These functions allow you to check the spelling of a word and offer suggestions.

需求

To compile PHP with pspell support, you need the aspell and pspell libraries, available from http://aspell.sourceforge.net/ and http://aspell.net/ respectively.

安裝

If you have the libraries needed add the --with-pspell[=dir] option when compiling PHP.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

PSPELL_FAST (integer)

PSPELL_NORMAL (integer)

PSPELL_BAD_SPELLERS (integer)

PSPELL_RUN_TOGETHER (integer)

目錄
pspell_add_to_personal -- Add the word to a personal wordlist
pspell_add_to_session -- Add the word to the wordlist in the current session
pspell_check -- Check a word
pspell_clear_session -- Clear the current session
pspell_config_create -- Create a config used to open a dictionary
pspell_config_ignore -- Ignore words less than N characters long
pspell_config_mode -- Change the mode number of suggestions returned
pspell_config_personal -- Set a file that contains personal wordlist
pspell_config_repl -- Set a file that contains replacement pairs
pspell_config_runtogether -- Consider run-together words as valid compounds
pspell_config_save_repl -- Determine whether to save a replacement pairs list along with the wordlist
pspell_new_config -- Load a new dictionary with settings based on a given config
pspell_new_personal -- Load a new dictionary with personal wordlist
pspell_new -- Load a new dictionary
pspell_save_wordlist -- Save the personal wordlist to a file
pspell_store_replacement -- Store a replacement pair for a word
pspell_suggest -- Suggest spellings of a word
上一頁 | 首頁 | 下一頁
printer_write | 上一層 | pspell_add_to_personal


qtdom functions

PHP 手冊
上一頁 下一頁

LXXXIX. qtdom functions

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
qdom_error -- Returns the error string from the last QDOM operation or FALSE if no errors occured
qdom_tree -- creates a tree of an xml string
上一頁 | 首頁 | 下一頁
preg_split | 上一層 | qdom_error


GNU Readline

PHP 手冊
上一頁 下一頁

LXXXVI. GNU Readline

介紹

The readline() functions implement an interface to the GNU Readline library. These are functions that provide editable command lines. An example being the way Bash allows you to use the arrow keys to insert characters or scroll through command history. Because of the interactive nature of this library, it will be of little use for writing Web applications, but may be useful when writing scripts meant to be run from a shell.

需求

To use the readline functions, you need to install libreadline. You can find libreadline on the home page of the GNU Readline project, at http://cnswww.cns.cwru.edu/~chet/readline/rltop.html. It's maintained by Chet Ramey, who's also the author of Bash.

安裝

To use this functions you must compile PHP with readline support. You need to configure PHP --with-readline.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
readline_add_history -- Adds a line to the history
readline_clear_history -- Clears the history
readline_completion_function -- Registers a completion function
readline_info -- Gets/sets various internal readline variables
readline_list_history -- Lists the history
readline_read_history -- Reads the history
readline_write_history -- Writes the history
readline -- Reads a line
上一頁 | 首頁 | 下一頁
pspell_suggest | 上一層 | readline_add_history


GNU Recode functions

PHP 手冊
上一頁 下一頁

LXXXVII. GNU Recode functions

介紹

This module contains an interface to the GNU Recode library, version 3.5. The GNU Recode library converts files between various coded character sets and surface encodings. When this cannot be achieved exactly, it may get rid of the offending characters or fall back on approximations. The library recognises or produces nearly 150 different character sets and is able to convert files between almost any pair. Most RFC 1345 character sets are supported.

需求

You must have GNU Recode 3.5 or higher installed on your system. You can download the package from here.

安裝

To be able to use the functions defined in this module you must compile your PHP interpreter using the --with-recode[=DIR] option.

警告

Crashes and startup problems of PHP may be encountered when loading the recode as extension after loading any extension of mysql or imap. Loading the recode before those extension has proven to fix the problem. This is due a technical problem that both the c-client library used by imap and recode have their own hash_lookup() function and both mysql and recode have their own hash_insert function.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
recode_file -- Recode from file to file according to recode request
recode_string -- Recode a string according to a recode request
recode -- Recode a string according to a recode request
上一頁 | 首頁 | 下一頁
readline | 上一層 | recode_file


Regular Expression Functions (POSIX Extended)

PHP 手冊
上一頁 下一頁

XC. Regular Expression Functions (POSIX Extended)

介紹

註: PHP also supports regular expressions using a Perl-compatible syntax using the PCRE functions. Those functions support non-greedy matching, assertions, conditional subpatterns, and a number of other features not supported by the POSIX-extended regular expression syntax.

警告

These regular expression functions are not binary-safe. The PCRE functions are.

Regular expressions are used for complex string manipulation in PHP. The functions that support regular expressions are:

  • ereg()

  • ereg_replace()

  • eregi()

  • eregi_replace()

  • split()

  • spliti()

These functions all take a regular expression string as their first argument. PHP uses the POSIX extended regular expressions as defined by POSIX 1003.2. For a full description of POSIX regular expressions see the regex man pages included in the regex directory in the PHP distribution. It's in manpage format, so you'll want to do something along the lines of man /usr/local/src/regex/regex.7 in order to read it.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. Regular Expression Examples

ereg ("abc", $string);
/* Returns true if"abc"
   is found anywhere in $string. */

ereg ("^abc", $string);
/* Returns true if "abc";
   is found at the beginning of $string. */

ereg ("abc$", $string);
/* Returns true if "abc"
   is found at the end of $string. */

eregi ("(ozilla.[23]|MSIE.3)", $HTTP_USER_AGENT);
/* Returns true if client browser
   is Netscape 2, 3 or MSIE 3. */

ereg ("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string,$regs);
/* Places three space separated words
   into $regs[1], $regs[2] and $regs[3]. */

$string = ereg_replace ("^", "<br />", $string);
/* Put a <br /> tag at the beginning of $string. */

$string = ereg_replace ("$", "<br />", $string);
/* Put a <br />; tag at the end of $string. */

$string = ereg_replace ("\n", "", $string);
/* Get rid of any newline
   characters in $string. */

相關參考

For regular expressions in Perl-compatible syntax have a look at the PCRE functions. The simpler shell style wildcard pattern matching is provided by fnmatch().

目錄
ereg_replace -- Replace regular expression
ereg -- Regular expression match
eregi_replace -- replace regular expression case insensitive
eregi -- case insensitive regular expression match
split -- split string into array by regular expression
spliti -- Split string into array by regular expression case insensitive
sql_regcase -- Make regular expression for case insensitive match
上一頁 | 首頁 | 下一頁
qdom_tree | 上一層 | ereg_replace


Semaphore, Shared Memory and IPC Functions

PHP 手冊
上一頁 下一頁

XCI. Semaphore, Shared Memory and IPC Functions

介紹

This module provides wrappers for the System V IPC family of functions. It includes semaphores, shared memory and inter-process messaging (IPC).

Semaphores may be used to provide exclusive access to resources on the current machine, or to limit the number of processes that may simultaneously use a resource.

This module provides also shared memory functions using System V shared memory. Shared memory may be used to provide access to global variables. Different httpd-daemons and even other programs (such as Perl, C, ...) are able to access this data to provide a global data-exchange. Remember, that shared memory is NOT safe against simultaneous access. Use semaphores for synchronization.

表格 1. Limits of Shared Memory by the Unix OS

SHMMAX | max size of shared memory, normally 131072 bytes
SHMMIN | minimum size of shared memory, normally 1 byte
SHMMNI | max amount of shared memory segments on a system, normally 100
SHMSEG | max amount of shared memory segments per process, normally 6

The messaging functions may be used to send and receive messages to/from other processes. They provide a simple and effective means of exchanging data between processes, without the need for setting up an alternative using unix domain sockets.

註: These functions do not work on Windows systems.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

Support for this functions are not enabled by default. To enable System V semaphore support compile PHP with the option --enable-sysvsem. To enable the System V shared memory support compile PHP with the option --enable-sysvshm. To enable the System V messages support compile PHP with the option --enable-sysvmsg.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 2. Semaphore Configuration Options

Name | Default | Changeable
sysvmsg.value | "42" | PHP_INI_ALL
sysvmsg.string | "foobar" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

預定義常數

該擴展模塊未定義任何常數。

目錄
ftok -- Convert a pathname and a project identifier to a System V IPC key
msg_get_queue -- Create or attach to a message queue
msg_receive -- Receive a message from a message queue
msg_remove_queue -- Destroy a message queue
msg_send -- Send a message to a message queue
msg_set_queue -- Set information in the message queue data structure
msg_stat_queue -- Returns information from the message queue data structure
sem_acquire -- Acquire a semaphore
sem_get -- Get a semaphore id
sem_release -- Release a semaphore
sem_remove -- Remove a semaphore
shm_attach -- Creates or open a shared memory segment
shm_detach -- Disconnects from shared memory segment
shm_get_var -- Returns a variable from shared memory
shm_put_var -- Inserts or updates a variable in shared memory
shm_remove_var -- Removes a variable from shared memory
shm_remove -- Removes shared memory from Unix systems
上一頁 | 首頁 | 下一頁
sql_regcase | 上一層 | ftok


SESAM database functions

PHP 手冊
上一頁 下一頁

XCII. SESAM database functions

介紹

SESAM/SQL-Server is a mainframe database system, developed by Fujitsu Siemens Computers, Germany. It runs on high-end mainframe servers using the operating system BS2000/OSD.

In numerous productive BS2000 installations, SESAM/SQL-Server has proven

  • the ease of use of Java-, Web- and client/server connectivity,

  • the capability to work with an availability of more than 99.99%,

  • the ability to manage tens and even hundreds of thousands of users.

There is a PHP3 SESAM interface available which allows database operations via PHP-scripts.

註: Access to SESAM is only available with the latest CVS-Version of PHP3. PHP 4 does not support the SESAM database.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

sesam_oml string

Name of BS2000 PLAM library containing the loadable SESAM driver modules. Required for using SESAM functions. The BS2000 PLAM library must be set ACCESS=READ,SHARE=YES because it must be readable by the apache server's user id.

sesam_configfile string

Name of SESAM application configuration file. Required for using SESAM functions. The BS2000 file must be readable by the apache server's user id.

The application configuration file will usually contain a configuration like (see SESAM reference manual):

CNF=B
NAM=K
NOTYPE

sesam_messagecatalog string

Name of SESAM message catalog file. In most cases, this directive is not neccessary. Only if the SESAM message file is not installed in the system's BS2000 message file table, it can be set with this directive.

The message catalog must be set ACCESS=READ,SHARE=YES because it must be readable by the apache server's user id.

Configuration notes

There is no standalone support for the PHP SESAM interface, it works only as an integrated Apache module. In the Apache PHP module, this SESAM interface is configured using Apache directives.

表格 1. SESAM Configuration directives

Directive Meaning
php3_sesam_oml Name of BS2000 PLAM library containing the loadable SESAM driver modules. Required for using SESAM functions.

Example:

php3_sesam_oml $.SYSLNK.SESAM-SQL.030

php3_sesam_configfile Name of SESAM application configuration file. Required for using SESAM functions.

Example:

php3_sesam_configfile $SESAM.SESAM.CONF.AW

It will usually contain a configuration like (see SESAM reference manual):

CNF=B
NAM=K
NOTYPE

php3_sesam_messagecatalog Name of SESAM message catalog file. In most cases, this directive is not neccessary. Only if the SESAM message file is not installed in the system's BS2000 message file table, it can be set with this directive.

Example:

php3_sesam_messagecatalog $.SYSMES.SESAM-SQL.030

In addition to the configuration of the PHP/SESAM interface, you have to configure the SESAM-Database server itself on your mainframe as usual. That means:

  • starting the SESAM database handler (DBH), and

  • connecting the databases with the SESAM database handler

To get a connection between a PHP script and the database handler, the CNF and NAM parameters of the selected SESAM configuration file must match the id of the started database handler.

In case of distributed databases you have to start a SESAM/SQL-DCN agent with the distribution table including the host and database names.

The communication between PHP (running in the POSIX subsystem) and the database handler (running outside the POSIX subsystem) is realized by a special driver module called SQLSCI and SESAM connection modules using common memory. Because of the common memory access, and because PHP is a static part of the web server, database accesses are very fast, as they do not require remote accesses via ODBC, JDBC or UTM.

Only a small stub loader (SESMOD) is linked with PHP, and the SESAM connection modules are pulled in from SESAM's OML PLAM library. In the configuration, you must tell PHP the name of this PLAM library, and the file link to use for the SESAM configuration file (As of SESAM V3.0, SQLSCI is available in the SESAM Tool Library, which is part of the standard distribution).

Because the SQL command quoting for single quotes uses duplicated single quotes (as opposed to a single quote preceded by a backslash, used in some other databases), it is advisable to set the PHP configuration directives php3_magic_quotes_gpc and php3_magic_quotes_sybase to On for all PHP scripts using the SESAM interface.

Runtime considerations

Because of limitations of the BS2000 process model, the driver can be loaded only after the Apache server has forked off its server child processes. This will slightly slow down the initial SESAM request of each child, but subsequent accesses will respond at full speed.

When explicitly defining a Message Catalog for SESAM, that catalog will be loaded each time the driver is loaded (i.e., at the initial SESAM request). The BS2000 operating system prints a message after successful load of the message catalog, which will be sent to Apache's error_log file. BS2000 currently does not allow suppression of this message, it will slowly fill up the log.

Make sure that the SESAM OML PLAM library and SESAM configuration file are readable by the user id running the web server. Otherwise, the server will be unable to load the driver, and will not allow to call any SESAM functions. Also, access to the database must be granted to the user id under which the Apache server is running. Otherwise, connections to the SESAM database handler will fail.

Cursor Types

The result cursors which are allocated for SQL "select type" queries can be either "sequential" or "scrollable". Because of the larger memory overhead needed by "scrollable" cursors, the default is "sequential".

When using "scrollable" cursors, the cursor can be freely positioned on the result set. For each "scrollable" query, there are global default values for the scrolling type (initialized to: SESAM_SEEK_NEXT) and the scrolling offset which can either be set once by sesam_seek_row() or each time when fetching a row using sesam_fetch_row(). When fetching a row using a "scrollable" cursor, the following post-processing is done for the global default values for the scrolling type and scrolling offset:

表格 2. Scrolled Cursor Post-Processing

Scroll Type | Action
SESAM_SEEK_NEXT | none
SESAM_SEEK_PRIOR | none
SESAM_SEEK_FIRST | set scroll type to SESAM_SEEK_NEXT
SESAM_SEEK_LAST | set scroll type to SESAM_SEEK_PRIOR
SESAM_SEEK_ABSOLUTE | Auto-Increment internal offset value
SESAM_SEEK_RELATIVE | none. (maintain global default offset value, which allows for, e.g., fetching each 10th row backwards)

Porting note

Because in the PHP world it is natural to start indexes at zero (rather than 1), some adaptions have been made to the SESAM interface: whenever an indexed array is starting with index 1 in the native SESAM interface, the PHP interface uses index 0 as a starting point. E.g., when retrieving columns with sesam_fetch_row(), the first column has the index 0, and the subsequent columns have indexes up to (but not including) the column count ($array["count"]). When porting SESAM applications from other high level languages to PHP, be aware of this changed interface. Where appropriate, the description of the respective php sesam functions include a note that the index is zero based.

Security concerns

When allowing access to the SESAM databases, the web server user should only have as little privileges as possible. For most databases, only read access privilege should be granted. Depending on your usage scenario, add more access rights as you see fit. Never allow full control to any database for any user from the 'net! Restrict access to php scripts which must administer the database by using password control and/or SSL security.

Migration from other SQL databases

No two SQL dialects are ever 100% compatible. When porting SQL applications from other database interfaces to SESAM, some adaption may be required. The following typical differences should be noted:

  • Vendor specific data types

    Some vendor specific data types may have to be replaced by standard SQL data types (e.g., TEXT could be replaced by VARCHAR(max. size)).

  • Keywords as SQL identifiers

    In SESAM (as in standard SQL), such identifiers must be enclosed in double quotes (or renamed).

  • Display length in data types

    SESAM data types have a precision, not a display length. Instead of int(4) (intended use: integers up to '9999'), SESAM requires simply int for an implied size of 31 bits. Also, the only datetime data types available in SESAM are: DATE, TIME(3) and TIMESTAMP(3).

  • SQL types with vendor-specific unsigned, zerofill, or auto_increment attributes

    Unsigned and zerofill are not supported. Auto_increment is automatic (use "INSERT ... VALUES(*, ...)" instead of "... VALUES(0, ...)" to take advantage of SESAM-implied auto-increment.

  • int ... DEFAULT '0000'

    Numeric variables must not be initialized with string constants. Use DEFAULT 0 instead. To initialize variables of the datetime SQL data types, the initialization string must be prefixed with the respective type keyword, as in: CREATE TABLE exmpl ( xtime timestamp(3) DEFAULT TIMESTAMP '1970-01-01 00:00:00.000' NOT NULL );

  • $count = xxxx_num_rows();

    Some databases promise to guess/estimate the number of the rows in a query result, even though the returned value is grossly incorrect. SESAM does not know the number of rows in a query result before actually fetching them. If you REALLY need the count, try SELECT COUNT(...) WHERE ..., it will tell you the number of hits. A second query will (hopefully) return the results.

  • DROP TABLE thename;

    In SESAM, in the DROP TABLE command, the table name must be either followed by the keyword RESTRICT or CASCADE. When specifying RESTRICT, an error is returned if there are dependent objects (e.g., VIEWs), while with CASCADE, dependent objects will be deleted along with the specified table.

Notes on the use of various SQL types

SESAM does not currently support the BLOB type. A future version of SESAM will have support for BLOB.

At the PHP interface, the following type conversions are automatically applied when retrieving SQL fields:

表格 3. SQL to PHP Type Conversions

SQL Type | PHP Type
SMALLINT, INTEGER | integer
NUMERIC, DECIMAL, FLOAT, REAL, DOUBLE | float
DATE, TIME, TIMESTAMP | string
VARCHAR, CHARACTER | string
When retrieving a complete row, the result is returned as an array. Empty fields are not filled in, so you will have to check for the existence of the individual fields yourself (use isset() or empty() to test for empty fields). That allows more user control over the appearance of empty fields (than in the case of an empty string as the representation of an empty field).

Support of SESAM's "multiple fields" feature

The special "multiple fields" feature of SESAM allows a column to consist of an array of fields. Such a "multiple field" column can be created like this:

例子 1. Creating a "multiple field" column

CREATE TABLE multi_field_test (
    pkey CHAR(20) PRIMARY KEY,
    multi(3) CHAR(12)
)
and can be filled in using:

例子 2. Filling a "multiple field" column

INSERT INTO multi_field_test (pkey, multi(2..3) )
    VALUES ('Second', <'first_val', 'second_val'>)
Note that (like in this case) leading empty sub-fields are ignored, and the filled-in values are collapsed, so that in the above example the result will appear as multi(1..2) instead of multi(2..3).

When retrieving a result row, "multiple columns" are accessed like "inlined" additional columns. In the example above, "pkey" will have the index 0, and the three "multi(1..3)" columns will be accessible as indices 1 through 3.

相關參考

For specific SESAM details, please refer to the SESAM/SQL-Server documentation (english) or the SESAM/SQL-Server documentation (german), both available online, or use the respective manuals.

目錄
sesam_affected_rows -- Get number of rows affected by an immediate query
sesam_commit -- Commit pending updates to the SESAM database
sesam_connect -- Open SESAM database connection
sesam_diagnostic -- Return status information for last SESAM call
sesam_disconnect -- Detach from SESAM connection
sesam_errormsg -- Returns error message of last SESAM call
sesam_execimm -- Execute an "immediate" SQL-statement
sesam_fetch_array -- Fetch one row as an associative array
sesam_fetch_result -- Return all or part of a query result
sesam_fetch_row -- Fetch one row as an array
sesam_field_array -- Return meta information about individual columns in a result
sesam_field_name -- Return one column name of the result set
sesam_free_result -- Releases resources for the query
sesam_num_fields -- Return the number of fields/columns in a result set
sesam_query -- Perform a SESAM SQL query and prepare the result
sesam_rollback -- Discard any pending updates to the SESAM database
sesam_seek_row -- Set scrollable cursor mode for subsequent fetches
sesam_settransaction -- Set SESAM transaction parameters
上一頁 | 首頁 | 下一頁
shm_remove | 上一層 | sesam_affected_rows


Session handling functions

PHP 手冊
上一頁 下一頁

XCIII. Session handling functions

介紹

Session support in PHP consists of a way to preserve certain data across subsequent accesses. This enables you to build more customized applications and increase the appeal of your web site.

If you are familiar with the session management of PHPLIB, you will notice that some concepts are similar to PHP's session support.

A visitor accessing your web site is assigned an unique id, the so-called session id. This is either stored in a cookie on the user side or is propagated in the URL.

The session support allows you to register arbitrary numbers of variables to be preserved across requests. When a visitor accesses your site, PHP will check automatically (if session.auto_start is set to 1) or on your request (explicitly through session_start() or implicitly through session_register()) whether a specific session id has been sent with the request. If this is the case, the prior saved environment is recreated.

All registered variables are serialized after the request finishes. Registered variables which are undefined are marked as being not defined. On subsequent accesses, these are not defined by the session module unless the user defines them later.

註: Session handling was added in PHP 4.0.

Sessions and security

Using sessions, does not mean, you can be absolutely sure, that the session data can only be viewed by that user. This is important to keep in mind, when storing and displaying sensitive information. When storing data into a session, one should always ask themselves, what the damage is, when somebody else views that information, or how your application is affected when this session is actually somebody else.

For instance, if somebody else takes a session, can he then post a message in a forum, as that user and how big of a problem is that? Or perhaps he can view what the original user was thinking of ordering, because he gets access to that user's shopping cart. Obviously for a flowershop, this is less dramatic, than for a pharmacy.

Therefore, when dealing with sensitive information, there should always be additional methods to decide whether it is a valid session. Sessions are not reliable as a secure authentication mechanism.

Sessions rely on the session ID, meaning one can 'steal' a session, by stealing the session ID. This can be made harder, by using a cookie specifically a session cookie, but does not in any way make it impossible and still relies on the user closing all browser windows, to expire the session cookie. Besides that, even session cookies can be sniffed on a network or logged by a proxyserver.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

Session support is enabled in PHP by default. If you would not like to build your PHP with session support, you should specify the --disable-session option to configure.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Session configuration options

Name | Default | Changeable
session.save_path | "/tmp" | PHP_INI_ALL
session.name | "PHPSESSID" | PHP_INI_ALL
session.save_handler | "files" | PHP_INI_ALL
session.auto_start | "0" | PHP_INI_ALL
session.gc_probability | "1" | PHP_INI_ALL
session.gc_maxlifetime | "1440" | PHP_INI_ALL
session.serialize_handler | "php" | PHP_INI_ALL
session.cookie_lifetime | "0" | PHP_INI_ALL
session.cookie_path | "/" | PHP_INI_ALL
session.cookie_domain | "" | PHP_INI_ALL
session.cookie_secure | "" | PHP_INI_ALL
session.use_cookies | "1" | PHP_INI_ALL
session.use_only_cookies | "0" | PHP_INI_ALL
session.referer_check | "" | PHP_INI_ALL
session.entropy_file | "" | PHP_INI_ALL
session.entropy_length | "0" | PHP_INI_ALL
session.cache_limiter | "nocache" | PHP_INI_ALL
session.cache_expire | "180" | PHP_INI_ALL
session.use_trans_sid | "0" | PHP_INI_SYSTEM|PHP_INI_PERDIR
url_rewriter.tags | "a=href,area=href,frame=src,input=src,form=fakeentry" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

The session management system supports a number of configuration options which you can place in your php.ini file. We will give a short overview.

session.save_handler string

session.save_handler defines the name of the handler which is used for storing and retrieving data associated with a session. Defaults to files.

session.save_path string

session.save_path defines the argument which is passed to the save handler. If you choose the default files handler, this is the path where the files are created. Defaults to /tmp. If session.save_path's path depth is more than 2, garbage collection will not be performed.

警告

If you leave this set to a world-readable directory, such as /tmp (the default), other users on the server may be able to hijack sessions by getting the list of files in that directory.

註: Windows users have to change this variable in order to use PHP's session functions. Make sure to specify a valid path, e.g.: c:/temp.

session.name string

session.name specifies the name of the session which is used as cookie name. It should only contain alphanumeric characters. Defaults to PHPSESSID.

session.auto_start boolean

session.auto_start specifies whether the session module starts a session automatically on request startup. Defaults to 0 (disabled).

session.cookie_lifetime integer

session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means "until the browser is closed." Defaults to 0.

session.serialize_handler string

session.serialize_handler defines the name of the handler which is used to serialize/deserialize data. Currently, a PHP internal format (name php) and WDDX is supported (name wddx). WDDX is only available, if PHP is compiled with WDDX support. Defaults to php.

session.gc_probability integer

session.gc_probability specifies the probability that the gc (garbage collection) routine is started on each request in percent. Defaults to 1.

session.gc_maxlifetime integer

session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up.

註: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other fs where atime tracking is not available.

session.referer_check string

session.referer_check contains the substring you want to check each HTTP Referer for. If the Referer was sent by the client and the substring was not found, the embedded session id will be marked as invalid. Defaults to the empty string.

session.entropy_file string

session.entropy_file gives a path to an external resource (file) which will be used as an additional entropy source in the session id creation process. Examples are /dev/random or /dev/urandom which are available on many Unix systems.

session.entropy_length integer

session.entropy_length specifies the number of bytes which will be read from the file specified above. Defaults to 0 (disabled).

session.use_cookies boolean

session.use_cookies specifies whether the module will use cookies to store the session id on the client side. Defaults to 1 (enabled).

session.use_only_cookies boolean

session.use_only_cookies specifies whether the module will only use cookies to store the session id on the client side. Defaults to 0 (disabled, for backward compatibility). Enabling this setting prevents attacks involved passing session ids in URLs. This setting was added in PHP 4.3.0.

session.cookie_path string

session.cookie_path specifies path to set in session_cookie. Defaults to /.

session.cookie_domain string

session.cookie_domain specifies domain to set in session_cookie. Default is none at all.

session.cache_limiter string

session.cache_limiter specifies cache control method to use for session pages (none/nocache/private/private_no_expire/public). Defaults to nocache.

session.cache_expire integer

session.cache_expire specifies time-to-live for cached session pages in minutes, this has no effect for nocache limiter. Defaults to 180.

session.use_trans_sid boolean

session.use_trans_sid whether transparent sid support is enabled or not. Defaults to 0 (disabled).

註: For PHP 4.1.2 or less, it is enabled by compiling with --enable-trans-sid. From PHP 4.2.0, trans-sid feature is always compiled.

URL based session management has additional security risks compared to cookie based session management. Users may send an URL that contains an active session ID to their friends by email or users may save an URL that contains a session ID to their bookmarks and access your site with the same session ID always, for example.

url_rewriter.tags string

url_rewriter.tags specifies which html tags are rewritten to include session id if transparent sid support is enabled. Defaults to a=href,area=href,frame=src,input=src,form=fakeentry

The track_vars and register_globals configuration settings influence how the session variables get stored and restored.

註: As of PHP 4.0.3, track_vars is always turned on.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

SID (string)

Constant containing the session name and session ID in the form of "name=ID".

範例

註: As of PHP 4.1.0, $_SESSION is available as global variable just like $_POST, $_GET, $_REQUEST and so on. Unlike $HTTP_SESSION_VARS, $_SESSION is always global. Therefore, you do not need to use the global keyword for $_SESSION. Please note that this documentation has been changed to use $_SESSION everywhere. You can substitute $HTTP_SESSION_VARS for $_SESSION, if you prefer the former.

The keys in the $_SESSION associative array are subject to the same limitations as regular variable names in PHP, i.e. they cannot start with a number and must start with a letter or underscore. For more details see the section on variables in this manual.

If register_globals is disabled, only members of the global associative array $_SESSION can be registered as session variables. The restored session variables will only be available in the array $_SESSION.

Use of $_SESSION (or $HTTP_SESSION_VARS with PHP 4.0.6 or less) is recommended for improved security and code readablity. With $_SESSION, there is no need to use the session_register(), session_unregister(), session_is_registered() functions. Session variables are accessible like any other variables.

例子 1. Registering a variable with $_SESSION.

<?php
session_start();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
} else {
    $_SESSION['count']++;
}
?>

例子 2. Unregistering a variable with $_SESSION and register_globals disabled.

<?php
session_start();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
unset($_SESSION['count']);
?>

例子 3. Unregistering a variable with register_globals enabled, after registering it using $_SESSION.

<?php
session_start();
// With PHP 4.3 and later, you can also simply use the prior example.
session_unregister('count');
?>

If register_globals is enabled, then each global variable can be registered as session variable. Upon a restart of a session, these variables will be restored to corresponding global variables. Since PHP must know which global variables are registered as session variables, users need to register variables with session_register() function. You can avoid this by simply setting entries in $_SESSION.

注意

If you are using $_SESSION and disable register_globals, do not use session_register(), session_is_registered() and session_unregister(), if your scripts shall work in PHP 4.2 and earlier. You can use these functions in 4.3 and later.

If you enable register_globals, session_unregister() should be used since session variables are registered as global variables when session data is deserialized. Disabling register_globals is recommended for both security and performance reasons.

例子 4. Registering a variable with register_globals enabled

<?php
if (!session_is_registered('count')) {
    session_register("count");
    $count = 0;
}
else {
    $count++;
}
?>

If register_globals is enabled, then the global variables and the $_SESSION entries will automatically reference the same value for session variables which were registered in prior session instances.

Additionally, if you register a new session variable by using session_register(), the entry in the global scope and the $_SESSION entry will not reference the same value until the next session_start() (this applies to PHP 4.2 and before only). I.e. a modification to the global variable will not be reflected by the $_SESSION entry. This is unlikely to matter in practice and has been corrected in PHP 4.3.

Passing the Session ID

There are two methods to propagate a session id:

  • Cookies

  • URL parameter

The session module supports both methods. Cookies are optimal, but since they are not reliable (clients are not bound to accept them), we cannot rely on them. The second method embeds the session id directly into URLs.

PHP is capable of doing this transparently if compiled with --enable-trans-sid. This option is always enabled in PHP 4.2 and later. If you enable this option, relative URIs will be changed to contain the session id automatically. Alternatively, you can use the constant SID which is defined, if the client did not send the appropriate cookie. SID is either of the form session_name=session_id or is an empty string.

註: The arg_separator.output php.ini directive allows to customize the argument seperator.

The following example demonstrates how to register a variable, and how to link correctly to another page using SID.

例子 5. Counting the number of hits of a single user

<?php
if (!session_is_registered('count')) {
    session_register('count');
    $count = 1;
}
else {
    $count++;
}
?>

Hello visitor, you have seen this page <?php echo $count; ?> times.<p>

To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>

The <?php echo SID?> (<?=SID?> can be used if short_open_tag is enabled) is necessary to preserve the session id in the case that the user has disabled cookies. The <?=SID?> is not necessary, if --enable-trans-sid was used to compile PHP.

註: Non-relative URLs are assumed to point to external sites and hence don't append the SID, as it would be a security risk to leak the SID to a different server.

Custom Session Handlers

To implement database storage, or any other storage method, you will need to use session_set_save_handler() to create a set of user-level storage functions.

目錄
session_cache_expire -- Return current cache expire
session_cache_limiter -- Get and/or set the current cache limiter
session_decode -- Decodes session data from a string
session_destroy -- Destroys all data registered to a session
session_encode -- 將當前會話資料編碼為一個字串
session_get_cookie_params -- Get the session cookie parameters
session_id -- Get and/or set the current session id
session_is_registered -- Find out if a variable is registered in a session
session_module_name -- Get and/or set the current session module
session_name -- Get and/or set the current session name
session_readonly -- Begin session - reinitializes frozen variables, but no writeback on request end
session_register -- Register one or more variables with the current session
session_save_path -- Get and/or set the current session save path
session_set_cookie_params -- Set the session cookie parameters
session_set_save_handler -- Sets user-level session storage functions
session_start -- Initialize session data
session_unregister -- Unregister a variable from the current session
session_unset -- Free all session variables
session_write_close -- Write session data and end session
上一頁 | 首頁 | 下一頁
sesam_settransaction | 上一層 | session_cache_expire


Shared Memory Functions

PHP 手冊
上一頁 下一頁

XCIV. Shared Memory Functions

介紹

Shmop is an easy to use set of functions that allows PHP to read, write, create and delete UNIX shared memory segments. These functions will not typically work on Windows, as it does not support shared memory. As of Windows 2000 though, enabling the php_shmop.dll in your php.ini will enable this functionality though.

註: In PHP 4.0.3, these functions were prefixed by shm rather than shmop.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

To use shmop you will need to compile php with the --enable-shmop parameter in your configure line.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

該擴展模塊未定義任何常數。

範例

例子 1. Shared Memory Operations Overview

<?php

// Create 100 byte shared memory block with system id if 0xff3
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if(!$shm_id) {
    echo "Couldn't create shared memory segment\n";
}

// Get shared memory block's size
$shm_size = shmop_size($shm_id);
echo "SHM Block Size: ".$shm_size. " has been created.\n";

// Lets write a test string into shared memory
$shm_bytes_written = shmop_write($shm_id, "my shared memory block", 0);
if($shm_bytes_written != strlen("my shared memory block")) {
    echo "Couldn't write the entire length of data\n";
}

// Now lets read the string back
$my_string = shmop_read($shm_id, 0, $shm_size);
if(!$my_string) {
    echo "Couldn't read from shared memory block\n";
}
echo "The data inside shared memory was: ".$my_string."\n";

//Now lets delete the block and close the shared memory segment
if(!shmop_delete($shm_id)) {
    echo "Couldn't mark shared memory block for deletion.";
}
shmop_close($shm_id);

?>

目錄
shmop_close -- Close shared memory block
shmop_delete -- Delete shared memory block
shmop_open -- Create or open shared memory block
shmop_read -- Read data from shared memory block
shmop_size -- Get size of shared memory block
shmop_write -- Write data into shared memory block
上一頁 | 首頁 | 下一頁
session_write_close | 上一層 | shmop_close


SNMP functions

PHP 手冊
上一頁 下一頁

XCVI. SNMP functions

介紹

需求

In order to use the SNMP functions on Unix you need to install the UCD SNMP package. On Windows these functions are only available on NT and not on Win95/98.

安裝

Important: In order to use the UCD SNMP package, you need to define NO_ZEROLENGTH_COMMUNITY to 1 before compiling it. After configuring UCD SNMP, edit config.h and search for NO_ZEROLENGTH_COMMUNITY. Uncomment the #define line. It should look like this afterwards:
#define NO_ZEROLENGTH_COMMUNITY 1
Now compile PHP --with-snmp[=DIR].

If you see strange segmentation faults in combination with SNMP commands, you did not follow the above instructions. If you do not want to recompile UCD SNMP, you can compile PHP with the --enable-ucd-snmp-hack switch which will work around the misfeature.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

預定義常數

該擴展模塊未定義任何常數。

目錄
snmp_get_quick_print -- Fetch the current value of the UCD library's quick_print setting
snmp_set_quick_print -- Set the value of quick_print within the UCD SNMP library
snmpget -- Fetch an SNMP object
snmprealwalk -- Return all objects including their respective object ID within the specified one
snmpset -- Set an SNMP object
snmpwalk -- Fetch all the SNMP objects from an agent
snmpwalkoid -- Query for a tree of information about a network entity
上一頁 | 首頁 | 下一頁
swf_viewport | 上一層 | snmp_get_quick_print


Socket functions

PHP 手冊
上一頁 下一頁

XCVII. Socket functions

介紹

The socket extension implements a low-level interface to the socket communication functions based on the popular BSD sockets, providing the possibility to act as a socket server as well as a client.

For a more generic client-side socket interface, see fsockopen() and pfsockopen().

When using these functions, it is important to remember that while many of them have identical names to their C counterparts, they often have different declarations. Please be sure to read the descriptions to avoid confusion.

Those unfamiliar with socket programming can find a lot of useful material in the appropriate Unix man pages, and there is a great deal of tutorial information on socket programming in C on the web, much of which can be applied, with slight modifications, to socket programming in PHP. The UNIX Socket FAQ might be a good start.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

The socket functions described here are part of an extension to PHP which must be enabled at compile time by giving the --enable-sockets option to configure.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

AF_UNIX (integer)

AF_INET (integer)

SOCK_STREAM (integer)

SOCK_DGRAM (integer)

SOCK_RAW (integer)

SOCK_SEQPACKET (integer)

SOCK_RDM (integer)

MSG_OOB (integer)

MSG_WAITALL (integer)

MSG_PEEK (integer)

MSG_DONTROUTE (integer)

SO_DEBUG (integer)

SO_REUSEADDR (integer)

SO_KEEPALIVE (integer)

SO_DONTROUTE (integer)

SO_LINGER (integer)

SO_BROADCAST (integer)

SO_OOBINLINE (integer)

SO_SNDBUF (integer)

SO_RCVBUF (integer)

SO_SNDLOWAT (integer)

SO_RCVLOWAT (integer)

SO_SNDTIMEO (integer)

SO_RCVTIMEO (integer)

SO_TYPE (integer)

SO_ERROR (integer)

SOL_SOCKET (integer)

PHP_NORMAL_READ (integer)

PHP_BINARY_READ (integer)

SOL_TCP (integer)

SOL_UDP (integer)

Socket Errors

The socket extension was written to provide a useable interface to the powerful BSD sockets. Care has been taken that the functions work equally well on Win32 and Unix implementations. Almost all of the sockets functions may fail under certain conditions and therefore emit an E_WARNING message describing the error. Sometimes this doesn't happen to the desire of the developer. For example the function socket_read() may suddenly emit an E_WARNING message because the connection broke unexpectedly. It's common to suppress the warning with the @-operator and catch the error code within the application with the socket_last_error() function. You may call the socket_strerror() function with this error code to retrieve a string describing the error. See their description for more information.

註: The E_WARNING messages generated by the socket extension are in english though the retrieved error message will appear depending on the current locale (LC_MESSAGES):
Warning - socket_bind() unable to bind address [98]: Die Adresse wird bereits verwendet

範例

例子 1. Socket example: Simple TCP/IP server

This example shows a simple talkback server. Change the address and port variables to suit your setup and execute. You may then connect to the server with a command similar to: telnet 192.168.1.53 10000 (where the address and port match your setup). Anything you type will then be output on the server side, and echoed back to you. To disconnect, enter 'quit'.

#!/usr/local/bin/php -q
<?php
error_reporting (E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit (0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush ();

$address = '192.168.1.53';
$port = 10000;

if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}

if (($ret = socket_bind ($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}

if (($ret = socket_listen ($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));

    do {
        if (FALSE === ($buf = socket_read ($msgsock, 2048))) {
            echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
            break 2;
        }
        if (!$buf = trim ($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close ($msgsock);
            break 2;
        }
        $talkback = "PHP: You said '$buf'.\n";
        socket_write ($msgsock, $talkback, strlen ($talkback));
        echo "$buf\n";
    } while (true);
    socket_close ($msgsock);
} while (true);

socket_close ($sock);
?>

例子 2. Socket example: Simple TCP/IP client

This example shows a simple, one-shot HTTP client. It simply connects to a page, submits a HEAD request, echoes the reply, and exits.

<?php
error_reporting (E_ALL);

echo "<h2>TCP/IP Connection</h2>\n";

/* Get the port for the WWW service. */
$service_port = getservbyname ('www', 'tcp');

/* Get the IP address for the target host. */
$address = gethostbyname ('www.example.com');

/* Create a TCP/IP socket. */
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
} else {
    echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
    echo "OK.\n";
}

$in = "HEAD / HTTP/1.0\r\n\r\n";
$out = '';

echo "Sending HTTP HEAD request...";
socket_write ($socket, $in, strlen ($in));
echo "OK.\n";

echo "Reading response:\n\n";
while ($out = socket_read ($socket, 2048)) {
    echo $out;
}

echo "Closing socket...";
socket_close ($socket);
echo "OK.\n\n";
?>

目錄
socket_accept -- Accepts a connection on a socket
socket_bind -- Binds a name to a socket
socket_clear_error -- Clears the error on the socket or the last error code
socket_close -- Closes a socket resource
socket_connect -- Initiates a connection on a socket
socket_create_listen -- Opens a socket on port to accept connections
socket_create_pair -- Creates a pair of indistinguishable sockets and stores them in fds.
socket_create -- Create a socket (endpoint for communication)
socket_get_option -- Gets socket options for the socket
socket_getpeername -- Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.
socket_getsockname -- Queries the local side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.
socket_iovec_add -- Adds a new vector to the scatter/gather array
socket_iovec_alloc -- ...]) Builds a 'struct iovec' for use with sendmsg, recvmsg, writev, and readv
socket_iovec_delete -- Deletes a vector from an array of vectors
socket_iovec_fetch -- Returns the data held in the iovec specified by iovec_id[iovec_position]
socket_iovec_free -- Frees the iovec specified by iovec_id
socket_iovec_set -- Sets the data held in iovec_id[iovec_position] to new_val
socket_last_error -- Returns the last error on the socket
socket_listen -- Listens for a connection on a socket
socket_read -- Reads a maximum of length bytes from a socket
socket_readv -- Reads from an fd, using the scatter-gather array defined by iovec_id
socket_recv -- Receives data from a connected socket
socket_recvfrom -- Receives data from a socket, connected or not
socket_recvmsg -- Used to receive messages on a socket, whether connection-oriented or not
socket_select -- Runs the select() system call on the given arrays of sockets with a timeout specified by tv_sec and tv_usec
socket_send -- Sends data to a connected socket
socket_sendmsg -- Sends a message to a socket, regardless of whether it is connection-oriented or not
socket_sendto -- Sends a message to a socket, whether it is connected or not
socket_set_nonblock -- Sets nonblocking mode for file descriptor fd
socket_set_option -- Sets socket options for the socket
socket_shutdown -- Shuts down a socket for receiving, sending, or both.
socket_strerror -- Return a string describing a socket error
socket_write -- Write to a socket
socket_writev -- Writes to a file descriptor, fd, using the scatter-gather array defined by iovec_id
上一頁 | 首頁 | 下一頁
snmpwalkoid | 上一層 | socket_accept


String functions

PHP 手冊
上一頁 下一頁

XCVIII. String functions

介紹

These functions all manipulate strings in various ways. Some more specialized sections can be found in the regular expression and URL handling sections.

For information on how strings behave, especially with regard to usage of single quotes, double quotes, and escape sequences, see the Strings entry in the Types section of the manual.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

預定義常數

該擴展模塊未定義任何常數。

相關參考

For even more powerful string handling and manipulating functions take a look at the POSIX regular expression functions and the Perl compatible regular expression functions.

目錄
addcslashes -- Quote string with slashes in a C style
addslashes -- Quote string with slashes
bin2hex -- Convert binary data into hexadecimal representation
chop -- Alias of rtrim()
chr -- Return a specific character
chunk_split -- Split a string into smaller chunks
convert_cyr_string -- Convert from one Cyrillic character set to another
count_chars -- Return information about characters used in a string
crc32 -- Calculates the crc32 polynomial of a string
crypt -- One-way string encryption (hashing)
echo -- Output one or more strings
explode -- Split a string by string
get_html_translation_table -- Returns the translation table used by htmlspecialchars() and htmlentities()
get_meta_tags -- Extracts all meta tag content attributes from a file and returns an array
hebrev -- Convert logical Hebrew text to visual text
hebrevc -- Convert logical Hebrew text to visual text with newline conversion
htmlentities -- Convert all applicable characters to HTML entities
htmlspecialchars -- Convert special characters to HTML entities
implode -- Join array elements with a string
join -- Join array elements with a string
levenshtein -- Calculate Levenshtein distance between two strings
localeconv -- Get numeric formatting information
ltrim -- Strip whitespace from the beginning of a string
md5_file -- Calculates the md5 hash of a given filename
md5 -- Calculate the md5 hash of a string
metaphone -- Calculate the metaphone key of a string
nl_langinfo -- Query language and locale information
nl2br -- Inserts HTML line breaks before all newlines in a string
number_format -- Format a number with grouped thousands
ord -- Return ASCII value of character
parse_str -- Parses the string into variables
print -- Output a string
printf -- Output a formatted string
quoted_printable_decode -- Convert a quoted-printable string to an 8 bit string
quotemeta -- Quote meta characters
rtrim -- Strip whitespace from the end of a string
setlocale -- Set locale information
similar_text -- Calculate the similarity between two strings
soundex -- Calculate the soundex key of a string
sprintf -- Return a formatted string
sscanf -- Parses input from a string according to a format
str_pad -- Pad a string to a certain length with another string
str_repeat -- Repeat a string
str_replace -- Replace all occurrences of the search string with the replacement string
str_rot13 -- Perform the rot13 transform on a string
str_word_count -- Return information about words used in a string
strcasecmp -- Binary safe case-insensitive string comparison
strchr -- Find the first occurrence of a character
strcmp -- Binary safe string comparison
strcoll -- Locale based string comparison
strcspn -- Find length of initial segment not matching mask
strip_tags -- Strip HTML and PHP tags from a string
stripcslashes -- Un-quote string quoted with addcslashes()
stripslashes -- Un-quote string quoted with addslashes()
stristr -- Case-insensitive strstr()
strlen -- Get string length
strnatcasecmp -- Case insensitive string comparisons using a "natural order" algorithm
strnatcmp -- String comparisons using a "natural order" algorithm
strncasecmp -- Binary safe case-insensitive string comparison of the first n characters
strncmp -- Binary safe string comparison of the first n characters
strpos -- Find position of first occurrence of a string
strrchr -- Find the last occurrence of a character in a string
strrev -- Reverse a string
strrpos -- Find position of last occurrence of a char in a string
strspn -- Find length of initial segment matching mask
strstr -- Find first occurrence of a string
strtok -- Tokenize string
strtolower -- Make a string lowercase
strtoupper -- Make a string uppercase
strtr -- Translate certain characters
substr_count -- Count the number of substring occurrences
substr_replace -- Replace text within a portion of a string
substr -- Return part of a string
trim -- Strip whitespace from the beginning and end of a string
ucfirst -- Make a string's first character uppercase
ucwords -- Uppercase the first character of each word in a string
vprintf -- Output a formatted string
vsprintf -- Return a formatted string
wordwrap -- Wraps a string to a given number of characters using a string break character.
上一頁 | 首頁 | 下一頁
socket_writev | 上一層 | addcslashes


Shockwave Flash functions

PHP 手冊
上一頁 下一頁

XCV. Shockwave Flash functions

介紹

PHP offers the ability to create Shockwave Flash files via Paul Haeberli's libswf module.

註: SWF support was added in PHP 4 RC2.

The libswf does not have support for Windows. The development of that library has been stopped, and the source is not available to port it to another systems.

For up to date SWF support take a look at the MING functions.

需求

You need the libswf library to compile PHP with support for this extension. You can download libswf at ftp://ftp.sgi.com/sgi/graphics/grafica/flash.

安裝

Once you have libswf all you need to do is to configure --with-swf[=DIR] where DIR is a location containing the directories include and lib. The include directory has to contain the swf.h file and the lib directory has to contain the libswf.a file. If you unpack the libswf distribution the two files will be in one directory. Consequently you will have to copy the files to the proper location manually.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

MOD_COLOR (integer)

MOD_MATRIX (integer)

TYPE_PUSHBUTTON (integer)

TYPE_MENUBUTTON (integer)

BSHitTest (float)

BSDown (float)

BSOver (float)

BSUp (float)

OverDowntoIdle (integer)

IdletoOverDown (integer)

OutDowntoIdle (integer)

OutDowntoOverDown (integer)

OverDowntoOutDown (integer)

OverUptoOverDown (integer)

OverUptoIdle (integer)

IdletoOverUp (integer)

ButtonEnter (integer)

ButtonExit (integer)

MenuEnter (integer)

MenuExit (integer)

範例

Once you've successfully installed PHP with Shockwave Flash support you can then go about creating Shockwave files from PHP. You would be surprised at what you can do, take the following code:

例子 1. SWF example

<?php
swf_openfile ("test.swf", 256, 256, 30, 1, 1, 1);
swf_ortho2 (-100, 100, -100, 100);
swf_defineline (1, -70, 0, 70, 0, .2);
swf_definerect (4, 60, -10, 70, 0, 0);
swf_definerect (5, -60, 0, -70, 10, 0);
swf_addcolor (0, 0, 0, 0);

swf_definefont (10, "Mod");
swf_fontsize (5);
swf_fontslant (10);
swf_definetext (11, "This be Flash wit PHP!", 1);

swf_pushmatrix ();
swf_translate (-50, 80, 0);
swf_placeobject (11, 60);
swf_popmatrix ();

for ($i = 0; $i < 30; $i++) {
    $p = $i/(30-1);
    swf_pushmatrix ();
    swf_scale (1-($p*.9), 1, 1);
    swf_rotate (60*$p,  'z');
    swf_translate (20+20*$p, $p/1.5, 0);
    swf_rotate (270*$p,  'z');
    swf_addcolor ($p, 0, $p/1.2, -$p);
    swf_placeobject (1, 50);
    swf_placeobject (4, 50);
    swf_placeobject (5, 50);
    swf_popmatrix ();
    swf_showframe ();
}

for ($i = 0; $i < 30; $i++) {
    swf_removeobject (50);
    if (($i%4) == 0) {
        swf_showframe ();
    }
}

swf_startdoaction ();
swf_actionstop ();
swf_enddoaction ();

swf_closefile ();
?>

目錄
swf_actiongeturl -- Get a URL from a Shockwave Flash movie
swf_actiongotoframe -- Play a frame and then stop
swf_actiongotolabel -- Display a frame with the specified label
swf_actionnextframe -- Go foward one frame
swf_actionplay -- Start playing the flash movie from the current frame
swf_actionprevframe -- Go backwards one frame
swf_actionsettarget -- Set the context for actions
swf_actionstop -- Stop playing the flash movie at the current frame
swf_actiontogglequality -- Toggle between low and high quality
swf_actionwaitforframe -- Skip actions if a frame has not been loaded
swf_addbuttonrecord -- Controls location, appearance and active area of the current button
swf_addcolor -- Set the global add color to the rgba value specified
swf_closefile -- Close the current Shockwave Flash file
swf_definebitmap -- Define a bitmap
swf_definefont -- Defines a font
swf_defineline -- Define a line
swf_definepoly -- Define a polygon
swf_definerect -- Define a rectangle
swf_definetext -- Define a text string
swf_endbutton -- End the definition of the current button
swf_enddoaction -- End the current action
swf_endshape -- Completes the definition of the current shape
swf_endsymbol -- End the definition of a symbol
swf_fontsize -- Change the font size
swf_fontslant -- Set the font slant
swf_fonttracking -- Set the current font tracking
swf_getbitmapinfo -- Get information about a bitmap
swf_getfontinfo -- The height in pixels of a capital A and a lowercase x
swf_getframe -- Get the frame number of the current frame
swf_labelframe -- Label the current frame
swf_lookat -- Define a viewing transformation
swf_modifyobject -- Modify an object
swf_mulcolor -- Sets the global multiply color to the rgba value specified
swf_nextid -- Returns the next free object id
swf_oncondition -- Describe a transition used to trigger an action list
swf_openfile -- Open a new Shockwave Flash file
swf_ortho2 -- Defines 2D orthographic mapping of user coordinates onto the current viewport
swf_ortho -- Defines an orthographic mapping of user coordinates onto the current viewport
swf_perspective -- Define a perspective projection transformation
swf_placeobject -- Place an object onto the screen
swf_polarview -- Define the viewer's position with polar coordinates
swf_popmatrix -- Restore a previous transformation matrix
swf_posround -- Enables or Disables the rounding of the translation when objects are placed or moved
swf_pushmatrix -- Push the current transformation matrix back unto the stack
swf_removeobject -- Remove an object
swf_rotate -- Rotate the current transformation
swf_scale -- Scale the current transformation
swf_setfont -- Change the current font
swf_setframe -- Switch to a specified frame
swf_shapearc -- Draw a circular arc
swf_shapecurveto3 -- Draw a cubic bezier curve
swf_shapecurveto -- Draw a quadratic bezier curve between two points
swf_shapefillbitmapclip -- Set current fill mode to clipped bitmap
swf_shapefillbitmaptile -- Set current fill mode to tiled bitmap
swf_shapefilloff -- Turns off filling
swf_shapefillsolid -- Set the current fill style to the specified color
swf_shapelinesolid -- Set the current line style
swf_shapelineto -- Draw a line
swf_shapemoveto -- Move the current position
swf_showframe -- Display the current frame
swf_startbutton -- Start the definition of a button
swf_startdoaction -- Start a description of an action list for the current frame
swf_startshape -- Start a complex shape
swf_startsymbol -- Define a symbol
swf_textwidth -- Get the width of a string
swf_translate -- Translate the current transformations
swf_viewport -- Select an area for future drawing
上一頁 | 首頁 | 下一頁
shmop_write | 上一層 | swf_actiongeturl


Sybase functions

PHP 手冊
上一頁 下一頁

XCIX. Sybase functions

介紹

需求

安裝

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Sybase configuration options

Name | Default | Changeable
sybase.allow_persistent | "On" | PHP_INI_SYSTEM
sybase.max_persistent | "-1" | PHP_INI_SYSTEM
sybase.max_links | "-1" | PHP_INI_SYSTEM
sybase.interface_file | "/usr/sybase/interfaces" | PHP_INI_SYSTEM
sybase.min_error_severity | "10" | PHP_INI_ALL
sybase.min_message_severity | "10" | PHP_INI_ALL
sybase.compatability_mode | "Off" | PHP_INI_SYSTEM
magic_quotes_sybase | "Off" | PHP_INI_ALL

Here is a short explanation of the configuration directives.

sybase.allow_persistent boolean

Whether to allow persistent Sybase connections.

sybase.max_persistent integer

The maximum number of persistent Sybase connections per process. -1 means no limit.

sybase.max_links integer

The maximum number of Sybase connections per process, including persistent connections. -1 means no limit.

sybase.min_error_severity integer

Minimum error severity to display.

sybase.min_message_severity integer

Minimum message severity to display.

sybase.compatability_mode boolean

Compatability mode with old versions of PHP 3.0. If on, this will cause PHP to automatically assign types to results according to their Sybase type, instead of treating them all as strings. This compatability mode will probably not stay around forever, so try applying whatever necessary changes to your code, and turn it off.

magic_quotes_sybase boolean

If magic_quotes_sybase is also on, a single-quote is escaped with a single-quote instead of a backslash if magic_quotes_gpc or magic_quotes_runtime is enabled.

表格 2. Sybase-CT configuration options

Name | Default | Changeable
sybct.allow_persistent | "On" | PHP_INI_SYSTEM
sybct.max_persistent | "-1" | PHP_INI_SYSTEM
sybct.max_links | "-1" | PHP_INI_SYSTEM
sybct.min_server_severity | "10" | PHP_INI_ALL
sybct.min_client_severity | "10" | PHP_INI_ALL
sybct.hostname | NULL | PHP_INI_ALL

Here is a short explanation of the configuration directives.

sybct.allow_persistent boolean

Whether to allow persistent Sybase-CT connections. The default is on.

sybct.max_persistent integer

The maximum number of persistent Sybase-CT connections per process. The default is -1 meaning unlimited.

sybct.max_links integer

The maximum number of Sybase-CT connections per process, including persistent connections. The default is -1 meaning unlimited.

sybct.min_server_severity integer

Server messages with severity greater than or equal to sybct.min_server_severity will be reported as warnings. This value can also be set from a script by calling sybase_min_server_severity(). The default is 10 which reports errors of information severity or greater.

sybct.min_client_severity integer

Client library messages with severity greater than or equal to sybct.min_client_severity will be reported as warnings. This value can also be set from a script by calling sybase_min_client_severity(). The default is 10 which effectively disables reporting.

sybct.hostname string

The name of the host you claim to be connecting from, for display by sp_who. The default is none.

For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

預定義常數

該擴展模塊未定義任何常數。

目錄
sybase_affected_rows -- get number of affected rows in last query
sybase_close -- close Sybase connection
sybase_connect -- open Sybase server connection
sybase_data_seek -- move internal row pointer
sybase_fetch_array -- fetch row as array
sybase_fetch_field -- get field information
sybase_fetch_object -- fetch row as object
sybase_fetch_row -- get row as enumerated array
sybase_field_seek -- set field offset
sybase_free_result -- free result memory
sybase_get_last_message -- Returns the last message from the server
sybase_min_client_severity -- Sets minimum client severity
sybase_min_error_severity -- Sets minimum error severity
sybase_min_message_severity -- Sets minimum message severity
sybase_min_server_severity -- Sets minimum server severity
sybase_num_fields -- get number of fields in result
sybase_num_rows -- get number of rows in result
sybase_pconnect -- open persistent Sybase connection
sybase_query -- send Sybase query
sybase_result -- get result data
sybase_select_db -- select Sybase database
上一頁 | 首頁 | 下一頁
wordwrap | 上一層 | sybase_affected_rows


Tokenizer functions

PHP 手冊
上一頁 下一頁

C. Tokenizer functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

See also the appendix about tokens.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Tokenizer Configuration Options

Name | Default | Changeable
tokenizer.global_value | "42" | PHP_INI_ALL
tokenizer.global_string | "foobar" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

T_INCLUDE (integer)

T_INCLUDE_ONCE (integer)

T_EVAL (integer)

T_REQUIRE (integer)

T_REQUIRE_ONCE (integer)

T_LOGICAL_OR (integer)

T_LOGICAL_XOR (integer)

T_LOGICAL_AND (integer)

T_PRINT (integer)

T_PLUS_EQUAL (integer)

T_MINUS_EQUAL (integer)

T_MUL_EQUAL (integer)

T_DIV_EQUAL (integer)

T_CONCAT_EQUAL (integer)

T_MOD_EQUAL (integer)

T_AND_EQUAL (integer)

T_OR_EQUAL (integer)

T_XOR_EQUAL (integer)

T_SL_EQUAL (integer)

T_SR_EQUAL (integer)

T_BOOLEAN_OR (integer)

T_BOOLEAN_AND (integer)

T_IS_EQUAL (integer)

T_IS_NOT_EQUAL (integer)

T_IS_IDENTICAL (integer)

T_IS_NOT_IDENTICAL (integer)

T_IS_SMALLER_OR_EQUAL (integer)

T_IS_GREATER_OR_EQUAL (integer)

T_SL (integer)

T_SR (integer)

T_INC (integer)

T_DEC (integer)

T_INT_CAST (integer)

T_DOUBLE_CAST (integer)

T_STRING_CAST (integer)

T_ARRAY_CAST (integer)

T_OBJECT_CAST (integer)

T_BOOL_CAST (integer)

T_UNSET_CAST (integer)

T_NEW (integer)

T_EXIT (integer)

T_IF (integer)

T_ELSEIF (integer)

T_ELSE (integer)

T_ENDIF (integer)

T_LNUMBER (integer)

T_DNUMBER (integer)

T_STRING (integer)

T_STRING_VARNAME (integer)

T_VARIABLE (integer)

T_NUM_STRING (integer)

T_INLINE_HTML (integer)

T_CHARACTER (integer)

T_BAD_CHARACTER (integer)

T_ENCAPSED_AND_WHITESPACE (integer)

T_CONSTANT_ENCAPSED_STRING (integer)

T_ECHO (integer)

T_DO (integer)

T_WHILE (integer)

T_ENDWHILE (integer)

T_FOR (integer)

T_ENDFOR (integer)

T_FOREACH (integer)

T_ENDFOREACH (integer)

T_DECLARE (integer)

T_ENDDECLARE (integer)

T_AS (integer)

T_SWITCH (integer)

T_ENDSWITCH (integer)

T_CASE (integer)

T_DEFAULT (integer)

T_BREAK (integer)

T_CONTINUE (integer)

T_OLD_FUNCTION (integer)

T_FUNCTION (integer)

T_CONST (integer)

T_RETURN (integer)

T_USE (integer)

T_GLOBAL (integer)

T_STATIC (integer)

T_VAR (integer)

T_UNSET (integer)

T_ISSET (integer)

T_EMPTY (integer)

T_CLASS (integer)

T_EXTENDS (integer)

T_OBJECT_OPERATOR (integer)

T_DOUBLE_ARROW (integer)

T_LIST (integer)

T_ARRAY (integer)

T_LINE (integer)

T_FILE (integer)

T_COMMENT (integer)

T_ML_COMMENT (integer)

T_OPEN_TAG (integer)

T_OPEN_TAG_WITH_ECHO (integer)

T_CLOSE_TAG (integer)

T_WHITESPACE (integer)

T_START_HEREDOC (integer)

T_END_HEREDOC (integer)

T_DOLLAR_OPEN_CURLY_BRACES (integer)

T_CURLY_OPEN (integer)

T_PAAMAYIM_NEKUDOTAYIM (integer)

T_DOUBLE_COLON (integer)

目錄
token_get_all -- Split given source in tokens
token_name -- Get the name of a given token
上一頁 | 首頁 | 下一頁
sybase_select_db | 上一層 | token_get_all


URL Functions

PHP 手冊
上一頁 下一頁

CI. URL Functions

介紹

Dealing with URL strings: encoding, decoding and parsing.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
base64_decode -- Decodes data encoded with MIME base64
base64_encode -- Encodes data with MIME base64
parse_url -- Parse a URL and return its components
rawurldecode -- Decode URL-encoded strings
rawurlencode -- URL-encode according to RFC 1738
urldecode -- Decodes URL-encoded string
urlencode -- URL-encodes string
上一頁 | 首頁 | 下一頁
token_name | 上一層 | base64_decode


Variable Functions

PHP 手冊
上一頁 下一頁

CII. Variable Functions

介紹

For information on how variables behave, see the Variables entry in the Language Reference section of the manual.

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. Variables Configuration Options

Name | Default | Changeable
unserialize_callback_func | "" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

unserialize_callback_func string

The unserialize callback function will called (with the undefind class' name as parameter), if the unserializer finds an undefined class which should be instanciated. A warning appears if the specified function is not defined, or if the function doesn't include/implement the missing class. So only set this entry, if you really want to implement such a callback-function.

See also unserialize().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
doubleval -- Alias of floatval()
empty -- Determine whether a variable is set
floatval -- Get float value of a variable
get_defined_vars -- Returns an array of all defined variables
get_resource_type -- Returns the resource type
gettype -- Get the type of a variable
import_request_variables -- Import GET/POST/Cookie variables into the global scope
intval -- Get integer value of a variable
is_array -- Finds whether a variable is an array
is_bool -- Finds out whether a variable is a boolean
is_callable -- Find out whether the argument is a valid callable construct
is_double -- Alias of is_float()
is_float -- Finds whether a variable is a float
is_int -- Find whether a variable is an integer
is_integer -- Alias of is_int()
is_long -- Alias of is_int()
is_null -- Finds whether a variable is NULL
is_numeric -- Finds whether a variable is a number or a numeric string
is_object -- Finds whether a variable is an object
is_real -- Alias of is_float()
is_resource -- Finds whether a variable is a resource
is_scalar -- Finds whether a variable is a scalar
is_string -- Finds whether a variable is a string
isset -- Determine whether a variable is set
print_r -- Prints human-readable information about a variable
serialize -- Generates a storable representation of a value
settype -- Set the type of a variable
strval -- Get string value of a variable
unserialize -- Creates a PHP value from a stored representation
unset -- Unset a given variable
var_dump -- Dumps information about a variable
var_export -- Outputs or returns a string representation of a variable
上一頁 | 首頁 | 下一頁
urlencode | 上一層 | doubleval


vpopmail functions

PHP 手冊
上一頁 下一頁

CIII. vpopmail functions

介紹

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

目錄
vpopmail_add_alias_domain_ex -- Add alias to an existing virtual domain
vpopmail_add_alias_domain -- Add an alias for a virtual domain
vpopmail_add_domain_ex -- Add a new virtual domain
vpopmail_add_domain -- Add a new virtual domain
vpopmail_add_user -- Add a new user to the specified virtual domain
vpopmail_alias_add -- insert a virtual alias
vpopmail_alias_del_domain -- deletes all virtual aliases of a domain
vpopmail_alias_del -- deletes all virtual aliases of a user
vpopmail_alias_get_all -- get all lines of an alias for a domain
vpopmail_alias_get -- get all lines of an alias for a domain
vpopmail_auth_user -- Attempt to validate a username/domain/password. Returns true/false
vpopmail_del_domain_ex -- Delete a virtual domain
vpopmail_del_domain -- Delete a virtual domain
vpopmail_del_user -- Delete a user from a virtual domain
vpopmail_error -- Get text message for last vpopmail error. Returns string
vpopmail_passwd -- Change a virtual user's password
vpopmail_set_user_quota -- Sets a virtual user's quota
上一頁 | 首頁 | 下一頁
var_export | 上一層 | vpopmail_add_alias_domain_ex


W32api functions

PHP 手冊
上一頁 下一頁

CIV. W32api functions

介紹

This extension is a generic extension API to DLLs. This was originally written to allow access to the Win32 API from PHP, although you can also access other functions exported via other DLLs.

Currently supported types are generic PHP types (strings, booleans, floats, integers and nulls) and types you define with w32api_deftype().

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

This extension will only work on Windows systems.

安裝

這些函式作為 PHP 核心的一部分，無需被安裝即可使用。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

This extension defines one resource type, used for user defined types. The name of this resource is "dynaparm".

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

DC_MICROSOFT (integer)

DC_BORLAND (integer)

DC_CALL_CDECL (integer)

DC_CALL_STD (integer)

DC_RETVAL_MATH4 (integer)

DC_RETVAL_MATH8 (integer)

DC_CALL_STD_BO (integer)

DC_CALL_STD_MS (integer)

DC_CALL_STD_M8 (integer)

DC_FLAG_ARGPTR (integer)

範例

This example gets the amount of time the system has been running and displays it in a message box.

例子 1. Get the uptime and display it in a message box

<?php
// Define constants needed, taken from
// Visual Studio/Tools/Winapi/WIN32API.txt
define("MB_OK", 0);

// Load the extension in
dl("php_w32api.dll");

// Register the GetTickCount function from kernel32.dll
w32api_register_function("kernel32.dll",
                         "GetTickCount",
                         "long");

// Register the MessageBoxA function from User32.dll
w32api_register_function("User32.dll",
                         "MessageBoxA",
                         "long");

// Get uptime information
$ticks = GetTickCount();

// Convert it to a nicely displayable text
$secs  = floor($ticks / 1000);
$mins  = floor($secs / 60);
$hours = floor($mins / 60);

$str = sprintf("You have been using your computer for:".
                "\r\n %d Milliseconds, or \r\n %d Seconds".
                "or \r\n %d mins or\r\n %d hours %d mins.",
                $ticks,
                $secs,
                $mins,
                $hours,
                $mins - ($hours*60));

// Display a message box with only an OK button and the uptime text
MessageBoxA(NULL,
            $str,
            "Uptime Information",
            MB_OK);
?>
目錄
w32api_deftype -- Defines a type for use with other w32api_functions
w32api_init_dtype -- Creates an instance of the data type typename and fills it with the values passed
w32api_invoke_function -- Invokes function funcname with the arguments passed after the function name
w32api_register_function -- Registers function function_name from library with PHP
w32api_set_call_method -- Sets the calling method used
上一頁 | 首頁 | 下一頁
vpopmail_set_user_quota | 上一層 | w32api_deftype


WDDX Functions

PHP 手冊
上一頁 下一頁

CV. WDDX Functions

介紹

These functions are intended for work with WDDX.

需求

In order to use WDDX, you will need to install the expat library (which comes with Apache 1.3.7 or higher).

安裝

After installing expat compile PHP with --with-xml and --enable-wddx.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

All the functions that serialize variables use the first element of an array to determine whether the array is to be serialized into an array or structure. If the first element has string key, then it is serialized into a structure, otherwise, into an array.

例子 1. Serializing a single value

<?php
print wddx_serialize_value("PHP to WDDX packet example", "PHP packet");
?>

This example will produce:

<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>PHP to WDDX packet example</string></data></wddxPacket>

例子 2. Using incremental packets

<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");

/* Suppose $cities came from database */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");

$packet = wddx_packet_end($packet_id);
print $packet;
?>

This example will produce:

<wddxPacket version='1.0'><header comment='PHP'/><data><struct>
<var name='pi'><number>3.1415926</number></var><var name='cities'>
<array length='3'><string>Austin</string><string>Novato</string>
<string>Seattle</string></array></var></struct></data></wddxPacket>

註: If you want to serialize non-ASCII characters you have to set the appropriate locale before doing so (see setlocale()).

目錄
wddx_add_vars -- Add variables to a WDDX packet with the specified ID
wddx_deserialize -- Deserializes a WDDX packet
wddx_packet_end -- Ends a WDDX packet with the specified ID
wddx_packet_start -- Starts a new WDDX packet with structure inside it
wddx_serialize_value -- Serialize a single value into a WDDX packet
wddx_serialize_vars -- Serialize variables into a WDDX packet
上一頁 | 首頁 | 下一頁
w32api_set_call_method | 上一層 | wddx_add_vars


XML 語法解析函式

PHP 手冊
上一頁 下一頁

CVI. XML 語法解析函式

介紹

XML（eXtensible Markup Language，可擴展標記語言）是一種在 WEB 上進行文檔交換的資料格式。該語言是由 W3C（World Wide Web Concortium，世界萬維網組織）定義的一種標準。您可以連接 http://www.w3.org/XML/ 以獲取關於 XML 及其相關技術的更多訊息。

本擴展模塊可為 James Clark 的 expat 提供支援。該工具包幫助您解析 XML 文檔（而非 XML 文檔的有效化）。它支援三種原始碼的編碼方式，這三種編碼方式也被 PHP 本身所支援，它們分別是：US-ASCII、ISO-8859-1 和 UTF-8。 該系統尚不支援 UTF-16。

該擴展模塊使您能夠建立 XML 語法解析器，並對不同的 XML 事件定義對應的處理器。每個 XML 語法解析器都有若幹個您可以根據需要調整的參數。

需求

該擴展模塊需要使用 expat，您可以連接 http://www.jclark.com/xml/ 來獲取。expat 自帶的 Makefile 文件不會產生預定的擴展庫，您可以使用以下的產生規則來實現：
libexpat.a: $(OBJS)
    ar -rc $@ $(OBJS)
    ranlib $@

請連接 http://sourceforge.net/projects/expat/ 以獲取 expat 源文件的 RPM 包。

安裝

如果您使用 Apache-1.3.7 或者更高版本，那麼您已經具備了 expat 擴展庫。您只需簡單地用 --with-xml（無需加任何其它的路徑）來配置 PHP，expat 擴展庫將會被自動地嵌入到 Apache 系統中。

在 Unix 上，帶 --with-xml 參數執行 configure 命令。expat 擴展庫應該被安裝到您編譯器能夠找到的地方。如果您將 PHP 編譯為 Apache 1.3.9 和更高版本的一個模塊，PHP 會自動將 expat 庫集成到 Apache 中。如果您將 expat 安裝在了 Apache 之外，那麼在您執行 configure 命令之前，您可能需要設置 CPPFLAGS 和 LDFLAGS 這兩個環境變數。

最後編譯 PHP，該擴展模塊應該就可以使用了。

【譯者注】在 Win32 環境下，XML Parser 模塊已經被集成到 PHP 內核中，您可以在用函式 phpinfo() 產生的頁面中看到有關訊息的表格。

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

XML_ERROR_NONE (integer)

XML_ERROR_NO_MEMORY (integer)

XML_ERROR_SYNTAX (integer)

XML_ERROR_NO_ELEMENTS (integer)

XML_ERROR_INVALID_TOKEN (integer)

XML_ERROR_UNCLOSED_TOKEN (integer)

XML_ERROR_PARTIAL_CHAR (integer)

XML_ERROR_TAG_MISMATCH (integer)

XML_ERROR_DUPLICATE_ATTRIBUTE (integer)

XML_ERROR_JUNK_AFTER_DOC_ELEMENT (integer)

XML_ERROR_PARAM_ENTITY_REF (integer)

XML_ERROR_UNDEFINED_ENTITY (integer)

XML_ERROR_RECURSIVE_ENTITY_REF (integer)

XML_ERROR_ASYNC_ENTITY (integer)

XML_ERROR_BAD_CHAR_REF (integer)

XML_ERROR_BINARY_ENTITY_REF (integer)

XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (integer)

XML_ERROR_MISPLACED_XML_PI (integer)

XML_ERROR_UNKNOWN_ENCODING (integer)

XML_ERROR_INCORRECT_ENCODING (integer)

XML_ERROR_UNCLOSED_CDATA_SECTION (integer)

XML_ERROR_EXTERNAL_ENTITY_HANDLING (integer)

XML_OPTION_CASE_FOLDING (integer)

XML_OPTION_TARGET_ENCODING (integer)

XML_OPTION_SKIP_TAGSTART (integer)

XML_OPTION_SKIP_WHITE (integer)

事件處理器

XML 事件處理器定義如下：

表格 1. 已支援的 XML 事件處理器

用來設置處理器的 PHP 函式 | 事件描述
xml_set_element_handler() | 元素事件（Element events）將在 XML 解析器遇到標記符的起始符或者終止符時發生。另外，對於起始符和終止符也有獨立的處理器。
xml_set_character_data_handler() | 粗略的說，字元資料（Character data）是指 XML 文檔中所有標記符以外的內容，包括標記符之間的空格。需要注意的是 XML 語法解析器不會加上或者去掉任何空格。空格的取舍將由應用程序（也就是您自己）來決定。
xml_set_processing_instruction_handler() | PHP 程序員對“處理指令”（Processing Instructions，PIs）應該已經很熟悉了。<?php ?> 就是一個處理指令，其中 php 被稱為“PI target”。除了以“XML”開頭的 PI target 已被保留以外，對這些 PIs 的處理將由應用程序來完成。
xml_set_default_handler() | 所有無法被其它處理器處理的事件將由預定處理器來處理。這些事件包括諸如 XML 和文檔型別聲明等內容。
xml_set_unparsed_entity_decl_handler() | 該處理器將在遇到無法解析的實體名稱（NDATA）聲明時被呼叫。
xml_set_notation_decl_handler() | 該處理器將在聲明一個註釋時被呼叫。
xml_set_external_entity_ref_handler() | 當 XML 解析器遇到指向外部解析的一般實體名時，該處理器將被呼叫。該指向的目標可以是一個文件，也可以是 URL。請參閱“外部實體名範例”。

大小寫折疊（Case Folding）

元素處理函式可能會導致元素名稱“大小寫折疊”（case-folded）。“大小寫折疊”被 XML 標準定義為“一個應用於一系列字元的過程，在該過程中，這些字元中的所有的非大寫字元將被替換成它們對應大寫等價字元”。換句話說，對於 XML，“大小寫折疊”就是指將字串轉換成大寫字元。

所有被傳遞給處理器函式的元素名稱將預定的發生“大小寫折疊”。該過程可以分別被 xml_parser_get_option() 和 xml_parser_set_option() 函式查詢和控制。

錯誤代碼

以下常數被定義為 XML 的錯誤代碼，將由 xml_parse() 傳回：

XML_ERROR_NONE
XML_ERROR_NO_MEMORY
XML_ERROR_SYNTAX
XML_ERROR_NO_ELEMENTS
XML_ERROR_INVALID_TOKEN
XML_ERROR_UNCLOSED_TOKEN
XML_ERROR_PARTIAL_CHAR
XML_ERROR_TAG_MISMATCH
XML_ERROR_DUPLICATE_ATTRIBUTE
XML_ERROR_JUNK_AFTER_DOC_ELEMENT
XML_ERROR_PARAM_ENTITY_REF
XML_ERROR_UNDEFINED_ENTITY
XML_ERROR_RECURSIVE_ENTITY_REF
XML_ERROR_ASYNC_ENTITY
XML_ERROR_BAD_CHAR_REF
XML_ERROR_BINARY_ENTITY_REF
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF
XML_ERROR_MISPLACED_XML_PI
XML_ERROR_UNKNOWN_ENCODING
XML_ERROR_INCORRECT_ENCODING
XML_ERROR_UNCLOSED_CDATA_SECTION
XML_ERROR_EXTERNAL_ENTITY_HANDLING

字元編碼

PHP 的 XML 擴展庫支援不同字元編碼（character encoding）的 Unicode 字元集。字元編碼有兩種形式，它們分別是“源編碼”（source encoding）和“目標編碼”（target encoding）。PHP 對文檔內部表示的編碼方式是 UTF-8。

源編碼將在 XML 文檔被解析後完成。源編碼可在建立一個 XML 解析器時指明（該編碼方式在 XML 解析器的生命周期中不能被再次改變）。支援的編碼方式包括 ISO-8859-1，US-ASCII 和 UTF-8。前兩種為單字節編碼，即每個字元被一個單一的字節表示。 UTF-8 支援 1 至 4 個字節的多 bit（最多 12）字元編碼。PHP 預定使用 ISO-8859-1 作為源編碼方式。

目標編碼將在 PHP 向 XML 處理器函式傳送資料時被完成。當 XML 解析器被建立後，目標編碼將被設置成與源編碼相同的編碼方式，但該方式可在任何時候被更改。目標編碼將影響字元資料、標記符名稱以及處理指令目標（PI target）。

如果 XML 解析器遇到其源編碼方式表示能力之外的字元，它將傳回一個錯誤。

當 PHP 在被解析的 XML 文檔中遇到當前目標編碼無法表示的字元時，這些字元將被“降級”。簡單的說，這些字元將被問號替換。

範例

以下是 PHP 腳本解析 XML 文檔的一些範例。

XML 元素結構範例

第一個範例用縮進格式顯示一個文檔中起始元素的結構。

例子 1. 顯示 XML 元素結構

$file = "data.xml";
$depth = array();

function startElement($parser, $name, $attrs) {
    global $depth;
    for ($i = 0; $i < $depth[$parser]; $i++) {
        print "  ";
    }
    print "$name\n";
    $depth[$parser]++;
}

function endElement($parser, $name) {
    global $depth;
    $depth[$parser]--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

XML 標記符映射範例

例子 2. 將 XML 映射為 HTML

以下範例將 XML 文檔中的標記符直接映射成 HTML 標記符。在“映射陣列”中不存在的元素將被忽略。當然，該範例將只對一個特定的 XML 文檔有效。
$file = "data.xml";
$map_array = array(
    "BOLD"     => "B",
    "EMPHASIS" => "I",
    "LITERAL"  => "TT"
);

function startElement($parser, $name, $attrs) {
    global $map_array;
    if ($htmltag = $map_array[$name]) {
        print "<$htmltag>";
    }
}

function endElement($parser, $name) {
    global $map_array;
    if ($htmltag = $map_array[$name]) {
        print "</$htmltag>";
    }
}

function characterData($parser, $data) {
    print $data;
}

$xml_parser = xml_parser_create();
// 使用大小寫折疊來保証我們能在元素陣列中找到這些元素名稱
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

XML 外部實體範例

該範例能夠高亮顯示 XML 原始碼。它將說明如何外部實體指向處理器來包含和解析其它文檔，如何處理 PIs，以及一種確定包含有 PIs 的代碼的可信度。

能被該範例使用的的 XML 文檔（xmltest.xml 和 xmltest2.xml）被列在該範例之後。

例子 3. 外部實體範例

<?php
$file = "xmltest.xml";

function trustedFile($file) {
    // only trust local files owned by ourselves
    if (!eregi("^([a-z]+)://", $file)
        && fileowner($file) == getmyuid()) {
            return true;
    }
    return false;
}

function startElement($parser, $name, $attribs) {
    print "&lt;<font color=\"#0000cc\">$name</font>";
    if (sizeof($attribs)) {
        while (list($k, $v) = each($attribs)) {
            print " <font color=\"#009900\">$k</font>=\"<font
                   color=\"#990000\">$v</font>\"";
        }
    }
    print "&gt;";
}

function endElement($parser, $name) {
    print "&lt;/<font color=\"#0000cc\">$name</font>&gt;";
}

function characterData($parser, $data) {
    print "<b>$data</b>";
}

function PIHandler($parser, $target, $data) {
    switch (strtolower($target)) {
        case "php":
            global $parser_file;
            // If the parsed document is "trusted", we say it is safe
            // to execute PHP code inside it.  If not, display the code
            // instead.
            if (trustedFile($parser_file[$parser])) {
                eval($data);
            } else {
                printf("Untrusted PHP code: <i>%s</i>",
                        htmlspecialchars($data));
            }
            break;
    }
}

function defaultHandler($parser, $data) {
    if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
        printf('<font color="#aa00aa">%s</font>',
                htmlspecialchars($data));
    } else {
        printf('<font size="-1">%s</font>',
                htmlspecialchars($data));
    }
}

function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                  $publicId) {
    if ($systemId) {
        if (!list($parser, $fp) = new_xml_parser($systemId)) {
            printf("Could not open entity %s at %s\n", $openEntityNames,
                   $systemId);
            return false;
        }
        while ($data = fread($fp, 4096)) {
            if (!xml_parse($parser, $data, feof($fp))) {
                printf("XML error: %s at line %d while parsing entity %s\n",
                       xml_error_string(xml_get_error_code($parser)),
                       xml_get_current_line_number($parser), $openEntityNames);
                xml_parser_free($parser);
                return false;
            }
        }
        xml_parser_free($parser);
        return true;
    }
    return false;
}

function new_xml_parser($file) {
    global $parser_file;

    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    xml_set_default_handler($xml_parser, "defaultHandler");
    xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");

    if (!($fp = @fopen($file, "r"))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, "array");
    }
    $parser_file[$xml_parser] = $file;
    return array($xml_parser, $fp);
}

if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die("could not open XML input");
}

print "<pre>";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d\n",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
print "</pre>";
print "parse complete\n";
xml_parser_free($xml_parser);

?>

例子 4. xmltest.xml

<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
 <TITLE>Title &plainEntity;</TITLE>
 <para>
  <informaltable>
   <tgroup cols="3">
    <tbody>
     <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
     <row><entry>a2</entry><entry>c2</entry></row>
     <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
 &systemEntity;
 <section id="about">
  <title>About this Document</title>
  <para>
   <!-- this is a comment -->
   <?php print 'Hi!  This is PHP version '.phpversion(); ?>
  </para>
 </section>
</chapter>

以下文檔將被 xmltest.xml 文件呼叫：

例子 5. xmltest2.xml

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY testEnt "test entity">
]>
<foo>
   <element attrib="value"/>
   &testEnt;
   <?php print "This is some more PHP code being executed."; ?>
</foo>

目錄
utf8_decode -- 將用 UTF-8 方式編碼的 ISO-8859-1 字串轉換成單字節的 ISO-8859-1 字串。
utf8_encode -- 將 ISO-8859-1 編碼的字串轉換為 UTF-8 編碼
xml_error_string -- 獲取 XML 解析器的錯誤字串
xml_get_current_byte_index -- 獲取 XML 解析器的當前字節索引（current byte index）。
xml_get_current_column_number -- 獲取 XML 解析器的當前列號
xml_get_current_line_number -- 獲取 XML 解析器的當前行號
xml_get_error_code -- 獲取 XML 解析器錯誤代碼
xml_parse_into_struct -- 將 XML 資料解析到陣列中
xml_parse -- 開始解析一個 XML 文檔
xml_parser_create_ns -- 產生一個 XML 解析器
xml_parser_create -- 建立一個 XML 解析器
xml_parser_free -- 釋放指定的 XML 解析器
xml_parser_get_option -- 從 XML 解析器獲取選項設置訊息
xml_parser_set_option -- 為指定 XML 解析進行選項設置
xml_set_character_data_handler -- 建立字元資料處理器
xml_set_default_handler -- 建立預定處理器
xml_set_element_handler -- 建立起始和終止元素處理器
xml_set_end_namespace_decl_handler -- 建立終止命名空間聲明處理器
xml_set_external_entity_ref_handler -- 建立外部實體指向處理器
xml_set_notation_decl_handler -- 建立註釋聲明處理器
xml_set_object -- 在對象中使用 XML 解析器
xml_set_processing_instruction_handler -- 建立處理指令（PI）處理器
xml_set_start_namespace_decl_handler -- 建立起始命名空間聲明處理器
xml_set_unparsed_entity_decl_handler -- 建立未解析實體定義聲明處理器
上一頁 | 首頁 | 下一頁
wddx_serialize_vars | 上一層 | utf8_decode


XML-RPC functions

PHP 手冊
上一頁 下一頁

CVII. XML-RPC functions

介紹

These functions can be used to write XML-RPC servers and clients. You can find more information about XML-RPC at http://www.xmlrpc.com/, and more documentation on this extension and it's functions at http://xmlrpc-epi.sourceforge.net/.

警告

本擴展模塊是實驗性的。該模塊的行為，包括其函式的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨 PHP 以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。

需求

無需外部庫文件就可以加入本擴展模塊的支援。

安裝

XML-RPC support in PHP is not enabled by default. You will need to use the --with-xmlrpc configuration option when compiling PHP to enable XML-RPC support. This extension is bundled into PHP as of 4.1.0.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. XML-RPC configuration options

Name | Default | Changeable
xmlrpc_errors | "0" | PHP_INI_SYSTEM
xmlrpc_error_number | "0" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

目錄
xmlrpc_decode_request -- Decodes XML into native PHP types
xmlrpc_decode -- Decodes XML into native PHP types
xmlrpc_encode_request -- Generates XML for a method request
xmlrpc_encode -- Generates XML for a PHP value
xmlrpc_get_type -- Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings
xmlrpc_parse_method_descriptions -- Decodes XML into a list of method descriptions
xmlrpc_server_add_introspection_data -- Adds introspection documentation
xmlrpc_server_call_method -- Parses XML requests and call methods
xmlrpc_server_create -- Creates an xmlrpc server
xmlrpc_server_destroy -- Destroys server resources
xmlrpc_server_register_introspection_callback -- Register a PHP function to generate documentation
xmlrpc_server_register_method -- Register a PHP function to resource method matching method_name
xmlrpc_set_type -- Sets xmlrpc type, base64 or datetime, for a PHP string value
上一頁 | 首頁 | 下一頁
xml_set_unparsed_entity_decl_handler | 上一層 | xmlrpc_decode_request


XSLT functions

PHP 手冊
上一頁 下一頁

CVIII. XSLT functions

介紹

This PHP extension provides a processor independent API to XSLT transformations. Currently this extension only supports the Sablotron library from the Ginger Alliance. Support is planned for other libraries, such as the Xalan library or the libxslt library.

XSLT (Extensible Stylesheet Language (XSL) Transformations) is a language for transforming XML documents into other XML documents. It is a standard defined by The World Wide Web Consortium (W3C). Information about XSLT and related technologies can be found at http://www.w3.org/TR/xslt.

註: This extension is different than the sablotron extension distributed with versions of PHP prior to PHP 4.1, currently only the new XSLT extension in PHP 4.1 is supported. If you need support for the old extension, please ask your questions on the PHP mailing lists.

需求

This extension uses Sablotron and expat, which can both be found at http://www.gingerall.com/. Binaries are provided as well as source.

安裝

On UNIX, run configure with the --enable-xslt --with-xslt-sablot options. The Sablotron library should be installed somewhere your compiler can find it.

Make sure you have the same libraries linked to the Sablotron library as those, which are linked with php. The configuration options: --with-expat-dir --with-iconv-dir are there to help you specify them. When asking for support, always mention these directives, and whether there are other versions of those libraries installed on your system somewhere. Naturally, provide all the version numbers.

JavaScript E-XSLT support: If you compiled Sablotron with JavaScript support, you must specify the option: --with-sablot-js.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

XSLT_OPT_SILENT (integer)

Drop all logging and error reporting. This is a generic option for all backends that may be added in the future.

XSLT_SABOPT_PARSE_PUBLIC_ENTITIES (integer)

Tell Sablotron to parse public entities. By default this has been turned off.

XSLT_SABOPT_DISABLE_ADDING_META (integer)

Do not add the meta tag "Content-Type" for HTML output. The default is set during compilation of Sablotron.

XSLT_SABOPT_DISABLE_STRIPPING (integer)

Suppress the whitespace stripping (on data files only).

XSLT_SABOPT_IGNORE_DOC_NOT_FOUND (integer)

Consider unresolved documents (the document() function) non-lethal.

XSLT_ERR_UNSUPPORTED_SCHEME (integer)

Error return code, for scheme handlers.

目錄
xslt_create -- Create a new XSLT processor
xslt_errno -- Return a error number
xslt_error -- Return a error string
xslt_free -- Free XSLT processor
xslt_process -- Perform an XSLT transformation
xslt_set_base -- Set the base URI for all XSLT transformations
xslt_set_encoding -- Set the encoding for the parsing of XML documents
xslt_set_error_handler -- Set an error handler for a XSLT processor
xslt_set_log -- Set the log file to write log messages to
xslt_set_sax_handler -- Set SAX handlers for a XSLT processor
xslt_set_sax_handlers -- Set the SAX handlers to be called when the XML document gets processed
xslt_set_scheme_handler -- Set Scheme handlers for a XSLT processor
xslt_set_scheme_handlers -- Set the scheme handlers for the XSLT processor
上一頁 | 首頁 | 下一頁
xmlrpc_set_type | 上一層 | xslt_create


YAZ functions

PHP 手冊
上一頁 下一頁

CIX. YAZ functions

介紹

This extension offers a PHP interface to the YAZ toolkit that implements the Z39.50 protocol for information retrieval. With this extension you can easily implement a Z39.50 origin (client) that searches or scans Z39.50 targets (servers) in parallel.

The module hides most of the complexity of Z39.50 so it should be fairly easy to use. It supports persistent stateless connections very similar to those offered by the various SQL APIs that are available for PHP. This means that sessions are stateless but shared amongst users, thus saving the connect and initialize phase steps in most cases.

YAZ is available at http://www.indexdata.dk/yaz/. You can find news information, example scripts, etc. for this extension at http://www.indexdata.dk/phpyaz/.

安裝

Compile YAZ and install it. Build PHP with your favourite modules and add option --with-yaz. Your task is roughly the following:

gunzip -c yaz-1.6.tar.gz|tar xf -
gunzip -c php-4.0.X.tar.gz|tar xf -
cd yaz-1.6
./configure --prefix=/usr
make
make install
cd ../php-4.0.X
./configure --with-yaz=/usr/bin
make
make install

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

表格 1. YAZ configuration options

Name | Default | Changeable
yaz.max_links | "100" | PHP_INI_ALL
yaz.log_file | "" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

PHP/YAZ keeps track of connections with targets (Z-Associations). A positive integer represents the ID of a particular association.

例子 1. Parallel searching using YAZ()

The script below demonstrates the parallel searching feature of the API. When invoked with no arguments it prints a query form; else (arguments are supplied) it searches the targets as given in in array host.

$num_hosts = count ($host);
if (empty($term) || count($host) == 0) {
    echo '<form method="get">
    <input type="checkbox"
    name="host[]" value="bagel.indexdata.dk/gils">
        GILS test
    <input type="checkbox"
    name="host[]" value="localhost:9999/Default">
        local test
    <input type="checkbox" checked="1"
    name="host[]" value="z3950.bell-labs.com/books">
        BELL Labs Library
    <br>
    RPN Query:
    <input type="text" size="30" name="term">
    <input type="submit" name="action" value="Search">
    ';
} else {
    echo 'You searced for ' . htmlspecialchars($term) . '<br>';
    for ($i = 0; $i < $num_hosts; $i++) {
        $id[] = yaz_connect($host[$i]);
        yaz_syntax($id[$i],"sutrs");
        yaz_search($id[$i],"rpn",$term);
    }
    yaz_wait();
    for ($i = 0; $i < $num_hosts; $i++) {
        echo '<hr>' . $host[$i] . ":";
        $error = yaz_error($id[$i]);
        if (!empty($error)) {
            echo "Error: $error";
        } else {
            $hits = yaz_hits($id[$i]);
            echo "Result Count $hits";
        }
        echo '<dl>';
        for ($p = 1; $p <= 10; $p++) {
            $rec = yaz_record($id[$i],$p,"string");
            if (empty($rec)) continue;
            echo "<dt><b>$p</b></dt><dd>";
            echo ereg_replace("\n", "<br>\n",$rec);
            echo "</dd>";
        }
        echo '</dl>';
    }
}

目錄
yaz_addinfo -- Returns additional error information
yaz_ccl_conf -- Configure CCL parser
yaz_ccl_parse -- Invoke CCL Parser
yaz_close -- Closes a YAZ connection
yaz_connect -- Prepares for a connection and Z-association to a Z39.50 target.
yaz_database -- Specifies the databases within a session
yaz_element -- Specifies Element-Set Name for retrieval
yaz_errno -- Returns error number
yaz_error -- Returns error description
yaz_hits -- Returns number of hits for last search
yaz_itemorder -- Prepares for Z39.50 Item Order with an ILL-Request package
yaz_present -- Prepares for retrieval (Z39.50 present).
yaz_range -- Specifies the maximum number of records to retrieve
yaz_record -- Returns a record
yaz_scan_result -- Returns Scan Response result
yaz_scan -- Prepares for a scan
yaz_search -- Prepares for a search
yaz_sort -- Sets sorting criteria
yaz_syntax -- Specifies the preferred record syntax for retrieval.
yaz_wait -- Wait for Z39.50 requests to complete
上一頁 | 首頁 | 下一頁
xslt_set_scheme_handlers | 上一層 | yaz_addinfo


Zip File Functions (Read Only Access)

PHP 手冊
上一頁 下一頁

CXI. Zip File Functions (Read Only Access)

介紹

This module enables you to transparently read ZIP compressed archives and the files inside them.

需求

This module uses the functions of the ZZIPlib library by Guido Draheim. You need ZZIPlib version >= 0.10.6.

Note that ZZIPlib only provides a subset of functions provided in a full implementation of the ZIP compression algorithm and can only read ZIP file archives. A normal ZIP utility is needed to create the ZIP file archives read by this library.

安裝

Zip support in PHP is not enabled by default. You will need to use the --with-zip configuration option when compiling PHP to enable zip support.

註: Zip support before PHP 4.1.0 is experimental. This section reflects the Zip extension as it exists in PHP 4.1.0 and later.

執行時配置

該擴展模塊未定義任何設置指令。

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

該擴展模塊未定義任何常數。

範例

This example opens a ZIP file archive, reads each file in the archive and prints out its contents. The test2.zip archive used in this example is one of the test archives in the ZZIPlib source distribution.

例子 1. Zip Usage Example

<?php

$zip = zip_open("/tmp/test2.zip");

if ($zip) {

    while ($zip_entry = zip_read($zip)) {
        echo "Name:               " . zip_entry_name($zip_entry) . "\n";
        echo "Actual Filesize:    " . zip_entry_filesize($zip_entry) . "\n";
        echo "Compressed Size:    " . zip_entry_compressedsize($zip_entry) . "\n";
        echo "Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";

        if (zip_entry_open($zip, $zip_entry, "r")) {
            echo "File Contents:\n";
            $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            echo "$buf\n";

            zip_entry_close($zip_entry);
        }
        echo "\n";

    }

    zip_close($zip);

}

?>
目錄
zip_close -- Close a Zip File Archive
zip_entry_close -- Close a Directory Entry
zip_entry_compressedsize -- Retrieve the Compressed Size of a Directory Entry
zip_entry_compressionmethod -- Retrieve the Compression Method of a Directory Entry
zip_entry_filesize -- Retrieve the Actual File Size of a Directory Entry
zip_entry_name -- Retrieve the Name of a Directory Entry
zip_entry_open -- Open a Directory Entry for Reading
zip_entry_read -- Read From an Open Directory Entry
zip_open -- Open a Zip File Archive
zip_read -- Read Next Entry in a Zip File Archive
上一頁 | 首頁 | 下一頁
yp_order | 上一層 | zip_close


Zlib Compression Functions

PHP 手冊
上一頁 下一頁

CXII. Zlib Compression Functions

介紹

This module enables you to transparently read and write gzip (.gz) compressed files, through versions of most of the filesystem functions which work with gzip-compressed files (and uncompressed files, too, but not with sockets).

註: Version 4.0.4 introduced a fopen-wrapper for .gz-files, so that you can use a special 'zlib:' URL to access compressed files transparently using the normal f*() file access functions if you prepend the filename or path with a 'zlib:' prefix when calling fopen().

In version 4.3.0, this special prefix has been changed to 'zlib://' to prevent ambiguities with filenames containing ':'.

This feature requires a C runtime library that provides the fopencookie() function. To my current knowledge the GNU libc is the only library that provides this feature.

需求

This module uses the functions of zlib by Jean-loup Gailly and Mark Adler. You have to use a zlib version >= 1.0.9 with this module.

執行時配置

這些函式的行為受到全域配置文件 php.ini 的影響。

The zlib extension offers the option to transparently compress your pages on-the-fly, if the requesting browser supports this. Therefore there are three options in the configuration file php.ini.

表格 1. Zlib Configuration Options

Name | Default | Changeable
zlib.output_compression | "Off" | PHP_INI_ALL
zlib.output_compression_level | "-1" | PHP_INI_ALL
zlib.output_handler | "" | PHP_INI_ALL
For further details and definition of the PHP_INI_* constants see ini_set().

Here is a short explanation of the configuration directives.

zlib.output_compression boolean/integer

Whether to transparently compress pages. If this option is set to "On" in php.ini or the Apache configuration, pages are compressed if the browser sends an "Accept-Encoding: gzip" or "deflate" header. "Content-Encoding: gzip" (respectively "deflate") and "Vary: Accept-Encoding" headers are added to the output.

You can use ini_set() to disable this in your script if the headers aren't already sent. If you output a "Content-Type: image/" header the compression is disabled, too (in order to circumvent a Netscape bug). You can reenable it, if you add "ini_set('zlib.output_compression', 'On')" after the header call which added the image content-type.

This option also accepts integer values instead of boolean "On"/"Off", using this you can set the output buffer size (default is 4KB).

註: output_handler must be empty if this is set 'On' ! Instead you must use zlib.output_handler.

zlib.output_compression_level integer

Compression level used for transparent output compression.

zlib.output_handler string

You cannot specify additional output handlers if zlib.output_compression is activated here. This setting does the same as output_handler but in a different order.

資源型別

該擴展模塊未定義任何資源型別。

預定義常數

由於這些常數是由該擴展模塊定義的，因此只有在該擴展模塊被編譯到 PHP 中，或者在執行時被動態加載後，這些常數才有效。

FORCE_GZIP (integer)

FORCE_DEFLATE (integer)

範例

This example opens a temporary file and writes a test string to it, then it prints out the content of this file twice.

例子 1. Small Zlib Example

<?php

$filename = tempnam ('/tmp', 'zlibtest').'.gz';
print "<html>\n<head></head>\n<body>\n<pre>\n";
$s = "Only a test, test, test, test, test, test, test, test!\n";

// open file for writing with maximum compression
$zp = gzopen($filename, "w9");

// write string to file
gzwrite($zp, $s);

// close file
gzclose($zp);

// open file for reading
$zp = gzopen($filename, "r");

// read 3 char
print gzread($zp, 3);

// output until end of the file and close it.
gzpassthru($zp);

print "\n";

// open file and print content (the 2nd time).
if (readgzfile($filename) != strlen($s)) {
        echo "Error with zlib functions!";
}
unlink($filename);
print "</pre>\n</h1></body>\n</html>\n";

?>
目錄
gzclose -- Close an open gz-file pointer
gzcompress -- Compress a string
gzdeflate -- Deflate a string
gzencode -- Create a gzip compressed string
gzeof -- Test for end-of-file on a gz-file pointer
gzfile -- Read entire gz-file into an array
gzgetc -- Get character from gz-file pointer
gzgets -- Get line from file pointer
gzgetss -- Get line from gz-file pointer and strip HTML tags
gzinflate -- Inflate a deflated string
gzopen -- Open gz-file
gzpassthru -- Output all remaining data on a gz-file pointer
gzputs -- Write to a gz-file pointer
gzread -- Binary-safe gz-file read
gzrewind -- Rewind the position of a gz-file pointer
gzseek -- Seek on a gz-file pointer
gztell -- Tell gz-file pointer read/write position
gzuncompress -- Uncompress a deflated string
gzwrite -- Binary-safe gz-file write
readgzfile -- Output a gz-file
上一頁 | 首頁 | 下一頁
zip_read | 上一層 | gzclose


保留字列表

PHP 手冊
上一頁 下一頁

附錄 G. 保留字列表

目錄
關鍵詞列表
預定義變數
預定義類
預定義常數

下面是 PHP 中預定義標籤的列表。沒有列在後面的標籤可以在您的腳本中作為自定義標籤使用。這些列表包括關鍵字和預定義變數、常數和類名。這些列表可能有遺漏，它是不完整的。

關鍵詞列表

這些詞語在 PHP 中有著特殊的意義。它們中有些像是函式，有些像是常數……但是它們不是的，它們只是語言結構的一部分。您不能使用它們的任何一個作為常數、函式名或是類名。但是可以將它們作為變數名使用，不過這樣會導致混淆。

表格 G-1. PHP 關鍵詞

and | or | xor | __FILE__
__LINE__ | array() | as | break | case
cfunction | class | const | continue | declare
default | die() | do | echo() | else
elseif | empty() | enddeclare | endfor | endforeach
endif | endswitch | endwhile | eval | exit()
extends | for | foreach | function | global
if | include() | include_once() | isset() | list()
new | old_function | print() | require() | require_once()
return() | static | switch | unset() | use
var | while | __FUNCTION__ | __CLASS__
上一頁 | 首頁 | 下一頁
函式別名列表 | 上一層 | 預定義變數


預定義變數

伺服器變數：$_SERVER

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_SERVER_VARS。

$_SERVER 是一個包含諸如頭部(headers)、路徑(paths)和腳本位置(script locations)的陣列。陣列的實體由 web 伺服器創建。不能保証所有的伺服器都能產生所有的訊息；伺服器可能忽略了一些訊息，或者產生了一些未在下面列出的新的訊息。這意味著，大量的這些變數在 CGI 1.1 specification 中說明，所以您應該仔細研究它。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_SERVER; 連接它，就如同使用 $HTTP_SERVER_VARS 一樣。

$HTTP_SERVER_VARS 包含著同樣的訊息，但是不是一個自動全域變數。（注意： $HTTP_SERVER_VARS 和 $_SERVER 是不同的變數，PHP 處理它們的方式不同。）

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_SERVER 和 $HTTP_SERVER_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

您或許會發現下面列出的某些 $_SERVER 元素並不可用。注意，如果以命令行方式執行 PHP，下面列出的元素幾乎沒有有效的（或是沒有任何實際意義的）。

“PHP_SELF”

當前正在執行腳本的文件名，與 document root相關。舉例來說，在URL位址為 http://example.com/test.php/foo.bar 的腳本中使用 $_SERVER['PHP_SELF'] 將會得到 /test.php/foo.bar 這個結果。

如果 PHP 以命令行方式執行，該變數無效。

“argv”

傳遞給該腳本的參數。當腳本執行在命令行方式時，argv 變數傳遞給程序 C 語言樣式的命令行參數。當呼叫 GET 方法時，該變數包含請求的資料。

“argc”

包含傳遞給程序的命令行參數的個數（如果執行在命令行模式）。

“GATEWAY_INTERFACE”

伺服器使用的 CGI 規範的版本。例如，“CGI/1.1”。

'SERVER_NAME'

當前執行腳本所在伺服器主機的名稱。如果該腳本執行在一個虛擬主機上，該名稱是由那個虛擬主機所設置的值決定。

'SERVER_SOFTWARE'

伺服器標識的字串，在響應請求時的頭部中給出。

“SERVER_PROTOCOL”

請求頁面時通信協議的名稱和版本。例如，“HTTP/1.0”。

“REQUEST_METHOD”

連接頁面時的請求方法。例如：“GET”、“HEAD”，“POST”，“PUT”。

“QUERY_STRING”

查詢(query)的字串。

“DOCUMENT_ROOT”

當前執行腳本所在的文檔根目錄。在伺服器配置文件中定義。

“HTTP_ACCEPT”

當前請求的 Accept: 頭部的內容。

“HTTP_ACCEPT_CHARSET”

當前請求的 Accept-Charset: 頭部的內容。例如：“iso-8859-1,*,utf-8”。

“HTTP_ACCEPT_ENCODING”

當前請求的 Accept-Encoding: 頭部的內容。例如：“gzip”。

“HTTP_ACCEPT_LANGUAGE”

當前請求的 Accept-Language: 頭部的內容。例如：“en”。

“HTTP_CONNECTION”

當前請求的 Connection: 頭部的內容。例如：“Keep-Alive”。

“HTTP_HOST”

當前請求的 Host: 頭部的內容。

“HTTP_REFERER”

鏈接到當前頁面的前一頁面的 URL 位址。不是所有的用戶代理（瀏覽器）都會設置這個變數，而且有的還可以手工修改 HTTP_REFERER。因此，這個變數不總是正確真實的。

“HTTP_USER_AGENT”

當前請求的 User_Agent: 頭部的內容。該字串表明了連接該頁面的用戶代理的訊息。一個典型的例子是：Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。您也可以使用 get_browser() 得到這個訊息。

“REMOTE_ADDR”

正在瀏覽當前頁面用戶的 IP 位址。

“REMOTE_PORT”

用戶連接到伺服器時所使用的端口。

“SCRIPT_FILENAME”

當前執行腳本的絕對路徑名。

“SERVER_ADMIN”

該值指明了 Apache 伺服器配置文件中的 SERVER_ADMIN 參數。如果腳本執行在一個虛擬主機上，則該值是那個虛擬主機的值。

“SERVER_PORT”

伺服器所使用的端口。預定為“80”。如果你使用 SSL 安全連接，則這個值為您所設置的 HTTP 端口。

“SERVER_SIGNATURE”

包含伺服器版本和虛擬主機名的字串。

“PATH_TRANSLATED”

當前腳本所在文件系統（不是文檔根目錄）的基本路徑。這是在伺服器進行虛擬到真實路徑的映像後的結果。

“SCRIPT_NAME”

包含當前腳本的路徑。這在頁面需要指向自己時非常有用。

“REQUEST_URI”

連接此頁面所需的 URI。例如，“/index.html”。

“PHP_AUTH_USER”

當 PHP 執行在 Apache 模塊方式下，並且正在使用 HTTP 認証功能，這個變數便是用戶輸入的用戶名。

“PHP_AUTH_PW”

當 PHP 執行在 Apache 模塊方式下，並且正在使用 HTTP 認証功能，這個變數便是用戶輸入的密碼。

“PHP_AUTH_TYPE”

當 PHP 執行在 Apache 模塊方式下，並且正在使用 HTTP 認証功能，這個變數便是認証的型別。

環境變數：$_ENV

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_ENV_VARS。

在解析器執行時，這些變數從環境變數轉變為 PHP 全域變數名稱空間(namespace)。它們中的許多都是由 PHP 所執行的系統決定。完整的列表是不可能的。請查看您系統的文檔以確定其特定的環境變數。

其它環境變數（包括 CGI 變數），無論 PHP 是以伺服器模塊或是以 CGI 處理方式執行，都在這裡列出了。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_ENV; 來連接它，就如同使用 $HTTP_ENV_VARS 一樣。

$HTTP_ENV_VARS 包含著同樣的訊息，但是不是一個自動全域變數。（注意： HTTP_ENV_VARS 和 $_ENV 是不同的變數，PHP 處理它們的方式不同。）

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_ENV 和 $HTTP_ENV_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

HTTP Cookies：$_COOKIE

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_COOKIE_VARS。

通過 HTTP cookies 傳遞的變陣列成的陣列。是自動全域變數。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_COOKIE; 來連接它，就如同使用 $HTTP_COOKIE_VARS 一樣。

$HTTP_COOKIE_VARS 包含著同樣的訊息，但是不是一個自動全域變數。（注意： HTTP_COOKIE_VARS 和 $_COOKIE 是不同的變數，PHP 處理它們的方式不同。）

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_COOKIE 和 $HTTP_COOKIE_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

HTTP GET 變數：$_GET

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_GET_VARS。

通過 HTTP GET 方法傳遞的變陣列成的陣列。是自動全域變數。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_GET; 來連接它，就如同使用 $HTTP_GET_VARS 一樣。

$HTTP_GET_VARS 包含著同樣的訊息，但是不是一個自動全域變數。（注意： HTTP_GET_VARS 和 $_GET 是不同的變數，PHP 處理它們的方式不同。）

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_GET 和 $HTTP_GET_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

HTTP POST 變數：$_POST

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_POST_VARS。

通過 HTTP POST 方法傳遞的變陣列成的陣列。是自動全域變數。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_POST; 來連接它，就如同使用 $HTTP_POST_VARS 一樣。

$HTTP_POST_VARS 包含著同樣的訊息，但是不是一個自動全域變數。（注意： HTTP_POST_VARS 和 $_POST 是不同的變數，PHP 處理它們的方式不同。）

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_POST 和 $HTTP_POST_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

HTTP 文件上傳變數：$_FILES

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_POST_FILES。

通過 HTTP POST 方法傳遞的已上傳文件項目組成的陣列。是自動全域變數。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_FILES; 來連接它，就如同使用 $HTTP_POST_FILES 一樣。

$HTTP_POST_FILES 包含著同樣的訊息，但是不是一個自動全域變數。

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_FILES 和 $HTTP_POST_FILES 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

Request 變數：$_REQUEST

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，沒有等價的陣列。

由 $_GET，$_POST，$_COOKIE, 和 $_FILES 內容的全部組成的陣列。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_REQUEST; 來連接它。

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_REQUEST 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

Session 變數：$_SESSION

註: 在 PHP 4.1.0 及以後版本使用。之前的版本，使用 $HTTP_SESSION_VARS。

包含當前腳本中 session 變數的陣列。參閱 Session 函式 文檔以獲得更多訊息。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $_SESSION; 來連接它，就如同使用 $HTTP_SESSION_VARS 一樣。

$HTTP_SESSION_VARS 包含著同樣的訊息，但是不是一個自動全域變數。

如果設置了 register_globals 指令，這些變數也在所有腳本中可用；也就是，分離了 $_SESSION 和 $HTTP_SESSION_VARS 陣列。相關訊息，請參閱安全的相關章節 使用 Register Globals。這些單獨的全域變數不是自動全域變數。

Global 變數：$GLOBALS

註: $GLOBALS 在 PHP 3.0.0 及以後版本中適用。

由所有已定義全域變陣列成的陣列。變數名就是該陣列的索引。

這是一個“superglobal”，或者可以描述為自動全域變數。這只不過意味這它在所有的腳本中都有效。在函式或方法中您不需要使用 global $GLOBALS; 來連接它。

前一個錯誤消息：$php_errormsg

$php_errormsg 是包含 PHP 產生的上一錯誤消息內容的變數。該變數在發生錯誤並且track_errors 選項打開（預定為關閉）後才有效。

上一頁 | 首頁 | 下一頁
保留字列表 | 上一層 | 預定義類


資源型別列表

PHP 手冊
上一頁 下一頁

附錄 H. 資源型別列表

以下是一個建立，使用和銷毀資源的函式列表。可以用 is_resource() 函式測定一個變數是否是資源，函式 get_resource_type() 則傳回該資源的型別。

表格 H-1. 資源型別

資源型別名稱 | 建立者 | 使用者 | 銷毀者 | 定義
aspell | aspell_new() | aspell_check(), aspell_check_raw(), aspell_suggest() | None | Aspell dictionary
bzip2 | bzopen() | bzerrno(), bzerror(), bzerrstr(), bzflush(), bzread(), bzwrite() | bzclose() | Bzip2 file
COM | com_load() | com_invoke(), com_propget(), com_get(), com_propput(), com_set(), com_propput() | None | COM object reference
VARIANT
cpdf | cpdf_open() | cpdf_page_init(), cpdf_finalize_page(), cpdf_finalize(), cpdf_output_buffer(), cpdf_save_to_file(), cpdf_set_current_page(), cpdf_begin_text(), cpdf_end_text(), cpdf_show(), cpdf_show_xy(), cpdf_text(), cpdf_set_font(), cpdf_set_leading(), cpdf_set_text_rendering(), cpdf_set_horiz_scaling(), cpdf_set_text_rise(), cpdf_set_text_matrix(), cpdf_set_text_pos(), cpdf_set_text_pos(), cpdf_set_word_spacing(), cpdf_continue_text(), cpdf_stringwidth(), cpdf_save(), cpdf_translate(), cpdf_restore(), cpdf_scale(), cpdf_rotate(), cpdf_setflat(), cpdf_setlinejoin(), cpdf_setlinecap(), cpdf_setmiterlimit(), cpdf_setlinewidth(), cpdf_setdash(), cpdf_moveto(), cpdf_rmoveto(), cpdf_curveto(), cpdf_lineto(), cpdf_rlineto(), cpdf_circle(), cpdf_arc(), cpdf_rect(), cpdf_closepath(), cpdf_stroke(), cpdf_closepath_fill_stroke(), cpdf_fill_stroke(), cpdf_clip(), cpdf_fill(), cpdf_setgray_fill(), cpdf_setgray_stroke(), cpdf_setgray(), cpdf_setrgbcolor_fill(), cpdf_setrgbcolor_stroke(), cpdf_setrgbcolor(), cpdf_add_outline(), cpdf_set_page_animation(), cpdf_import_jpeg(), cpdf_place_inline_image(), cpdf_add_annotation() | cpdf_close() | PDF document with CPDF lib
cpdf outline
curl | curl_init() | curl_init(), curl_exec() | curl_close() | Curl session
dbm | dbmopen() | dbmexists(), dbmfetch(), dbminsert(), dbmreplace(), dbmdelete(), dbmfirstkey(), dbmnextkey() | dbmclose() | Link to DBM database
dba | dba_open() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | dba_close() | Link to DBA base
dba persistent | dba_popen() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | None | Persistent link to DBA base
dbase | dbase_open() | dbase_pack(), dbase_add_record(), dbase_replace_record(), dbase_delete_record(), dbase_get_record(), dbase_get_record_with_names(), dbase_numfields(), dbase_numrecords() | dbase_close() | Link to Dbase base
dbx_link_object | dbx_connect() | dbx_query() | dbx_close() | dbx connection
dbx_result_object dbx_query() () None dbx result
domxml attribute
domxml document
domxml node
xpath context
xpath object
fbsql database fbsql_select_db() () None fbsql database
fbsql link | fbsql_change_user(), fbsql_connect() | fbsql_autocommit(), fbsql_change_user(), fbsql_create_db(), fbsql_data_seek(), fbsql_db_query(), fbsql_drop_db(), (), fbsql_select_db(), fbsql_errno(), fbsql_error(), fbsql_insert_id(), fbsql_list_dbs() | fbsql_close() | Link to fbsql database
fbsql plink | fbsql_change_user(), fbsql_pconnect() | fbsql_autocommit(), fbsql_change_user(), fbsql_create_db(), fbsql_data_seek(), fbsql_db_query(), fbsql_drop_db(), (), fbsql_select_db(), fbsql_errno(), fbsql_error(), fbsql_insert_id(), fbsql_list_dbs() | None | Persistent link to fbsql database
fbsql result | fbsql_db_query(), fbsql_list_dbs(), fbsql_query(), fbsql_list_fields(), fbsql_list_tables(), fbsql_tablename() | fbsql_affected_rows(), fbsql_fetch_array(), fbsql_fetch_assoc(), fbsql_fetch_field(), fbsql_fetch_lengths(), fbsql_fetch_object(), fbsql_fetch_row(), fbsql_field_flags(), fbsql_field_name(), fbsql_field_len(), fbsql_field_seek(), fbsql_field_table(), fbsql_field_type(), fbsql_next_result(), fbsql_num_fields(), fbsql_num_rows(), fbsql_result(), fbsql_num_rows() | fbsql_free_result() | fbsql result
fdf | fdf_open() | fdf_create(), fdf_save(), fdf_get_value(), fdf_set_value(), fdf_next_field_name(), fdf_set_ap(), fdf_set_status(), fdf_get_status(), fdf_set_file(), fdf_get_file(), fdf_set_flags(), fdf_set_opt(), fdf_set_submit_form_action(), fdf_set_javascript_action() | fdf_close() | FDF File
ftp | ftp_connect() | ftp_login(), ftp_pwd(), ftp_cdup(), ftp_chdir(), ftp_mkdir(), ftp_rmdir(), ftp_nlist(), ftp_rawlist(), ftp_systype(), ftp_pasv(), ftp_get(), ftp_fget(), ftp_put(), ftp_fput(), ftp_size(), ftp_mdtm(), ftp_rename(), ftp_delete(), ftp_site() | ftp_quit() | FTP stream
gd | imagecreate(), imagecreatefromgif(), imagecreatefromjpeg(), imagecreatefrompng(), imagecreatefromwbmp(), imagecreatefromstring(), imagecreatetruecolor() | imagearc(), imagechar(), imagecharup(), imagecolorallocate(), imagecolorat(), imagecolorclosest(), imagecolorexact(), imagecolorresolve(), imagegammacorrect(), imagegammacorrect(), imagecolorset(), imagecolorsforindex(), imagecolorstotal(), imagecolortransparent(), imagecopy(), imagecopyresized(), imagedashedline(), imagefill(), imagefilledpolygon(), imagefilledrectangle(), imagefilltoborder(), imagegif(), imagepng(), imagejpeg(), imagewbmp(), imageinterlace(), imageline(), imagepolygon(), imagepstext(), imagerectangle(), imagesetpixel(), imagestring(), imagestringup(), imagesx(), imagesy(), imagettftext(), imagefilledarc(), imageellipse(), imagefilledellipse(), imagecolorclosestalpha(), imagecolorexactalpha(), imagecolorresolvealpha(), imagecopymerge(), imagecopymergegray(), imagecopyresampled(), imagetruecolortopalette(), imagesetbrush(), imagesettile(), imagesetthickness() | imagedestroy() | GD Image
gd font | imageloadfont() | imagechar(), imagecharup(), imagefontheight() | None | Font for GD
gd PS encoding
gd PS font | imagepsloadfont() | imagepstext(), imagepsslantfont(), imagepsextendfont(), imagepsencodefont(), imagepsbbox() | imagepsfreefont() | PS font for GD
GMP integer | gmp_init() | gmp_intval(), gmp_strval(), gmp_add(), gmp_sub(), gmp_mul(), gmp_div_q(), gmp_div_r(), gmp_div_qr(), gmp_div(), gmp_mod(), gmp_divexact(), gmp_cmp(), gmp_neg(), gmp_abs(), gmp_sign(), gmp_fact(), gmp_sqrt(), gmp_sqrtrm(), gmp_perfect_square(), gmp_pow(), gmp_powm(), gmp_prob_prime(), gmp_gcd(), gmp_gcdext(), gmp_invert(), gmp_legendre(), gmp_jacobi(), gmp_random(), gmp_and(), gmp_or(), gmp_xor(), gmp_setbit(), gmp_clrbit(), gmp_scan0(), gmp_scan1(), gmp_popcount(), gmp_hamdist() | None | GMP Number
hyperwave document | hw_cp(), hw_docbyanchor(), hw_getremote(), hw_getremotechildren() | hw_children(), hw_childrenobj(), hw_getparents(), hw_getparentsobj(), hw_getchildcoll(), hw_getchildcollobj(), hw_getremote(), hw_getsrcbydestobj(), hw_getandlock(), hw_gettext(), hw_getobjectbyquerycoll(), hw_getobjectbyquerycollobj(), hw_getchilddoccoll(), hw_getchilddoccollobj(), hw_getanchors(), hw_getanchorsobj(), hw_inscoll(), hw_pipedocument(), hw_unlock() | hw_deleteobject() | Hyperwave object
hyperwave link | hw_connect() | hw_children(), hw_childrenobj(), hw_cp(), hw_deleteobject(), hw_docbyanchor(), hw_docbyanchorobj(), hw_errormsg(), hw_edittext(), hw_error(), hw_getparents(), hw_getparentsobj(), hw_getchildcoll(), hw_getchildcollobj(), hw_getremote(), hw_getremotechildren(), hw_getsrcbydestobj(), hw_getobject(), hw_getandlock(), hw_gettext(), hw_getobjectbyquery(), hw_getobjectbyqueryobj(), hw_getobjectbyquerycoll(), hw_getobjectbyquerycollobj(), hw_getchilddoccoll(), hw_getchilddoccollobj(), hw_getanchors(), hw_getanchorsobj(), hw_mv(), hw_incollections(), hw_info(), hw_inscoll(), hw_insdoc(), hw_insertdocument(), hw_insertobject(), hw_mapid(), hw_modifyobject(), hw_pipedocument(), hw_unlock(), hw_who(), hw_getusername() | hw_close(), hw_free_document() | Link to Hyperwave server
hyperwave link persistent | hw_pconnect() | hw_children(), hw_childrenobj(), hw_cp(), hw_deleteobject(), hw_docbyanchor(), hw_docbyanchorobj(), hw_errormsg(), hw_edittext(), hw_error(), hw_getparents(), hw_getparentsobj(), hw_getchildcoll(), hw_getchildcollobj(), hw_getremote(), hw_getremotechildren(), hw_getsrcbydestobj(), hw_getobject(), hw_getandlock(), hw_gettext(), hw_getobjectbyquery(), hw_getobjectbyqueryobj(), hw_getobjectbyquerycoll(), hw_getobjectbyquerycollobj(), hw_getchilddoccoll(), hw_getchilddoccollobj(), hw_getanchors(), hw_getanchorsobj(), hw_mv(), hw_incollections(), hw_info(), hw_inscoll(), hw_insdoc(), hw_insertdocument(), hw_insertobject(), hw_mapid(), hw_modifyobject(), hw_pipedocument(), hw_unlock(), hw_who(), hw_getusername() | None | Persistent link to Hyperwave server
icap | icap_open() | icap_fetch_event(), icap_list_events(), icap_store_event(), icap_snooze(), icap_list_alarms(), icap_delete_event() | icap_close() | Link to icap server
imap | imap_open() | imap_append(), imap_body(), imap_check(), imap_createmailbox(), imap_delete(), imap_deletemailbox(), imap_expunge(), imap_fetchbody(), imap_fetchstructure(), imap_headerinfo(), imap_header(), imap_headers(), imap_listmailbox(), imap_getmailboxes(), imap_get_quota(), imap_status(), imap_listsubscribed(), imap_set_quota(), imap_set_quota(), imap_getsubscribed(), imap_mail_copy(), imap_mail_move(), imap_num_msg(), imap_num_recent(), imap_ping(), imap_renamemailbox(), imap_reopen(), imap_subscribe(), imap_undelete(), imap_unsubscribe(), imap_scanmailbox(), imap_mailboxmsginfo(), imap_fetchheader(), imap_uid(), imap_msgno(), imap_search(), imap_fetch_overview() | imap_close() | Link to IMAP, POP3 server
imap chain persistent
imap persistent
ingres | ingres_connect() | ingres_query(), ingres_num_rows(), ingres_num_fields(), ingres_field_name(), ingres_field_type(), ingres_field_nullable(), ingres_field_length(), ingres_field_precision(), ingres_field_scale(), ingres_fetch_array(), ingres_fetch_row(), ingres_fetch_object(), ingres_rollback(), ingres_commit(), ingres_autocommit() | ingres_close() | Link to ingresII base
ingres persistent | ingres_pconnect() | ingres_query(), ingres_num_rows(), ingres_num_fields(), ingres_field_name(), ingres_field_type(), ingres_field_nullable(), ingres_field_length(), ingres_field_precision(), ingres_field_scale(), ingres_fetch_array(), ingres_fetch_row(), ingres_fetch_object(), ingres_rollback(), ingres_commit(), ingres_autocommit() | None | Persistent link to ingresII base
interbase blob
interbase link | ibase_connect() | ibase_query(), ibase_prepare(), ibase_trans() | ibase_close() | Link to Interbase database
interbase link persistent | ibase_pconnect() | ibase_query(), ibase_prepare(), ibase_trans() | None | Persistent link to Interbase database
interbase query | ibase_prepare() | ibase_execute() | ibase_free_query() | Interbase query
interbase result | ibase_query() | ibase_fetch_row(), ibase_fetch_object(), ibase_field_info(), ibase_num_fields() | ibase_free_result() | Interbase Result
interbase transaction | ibase_trans() | ibase_commit() | ibase_rollback() | Interbase transaction
java
ldap link | ldap_connect(), ldap_search() | ldap_count_entries(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_next_attribute(), ldap_next_entry() | ldap_close() | ldap connection
ldap result | ldap_read() | ldap_add(), ldap_compare(), ldap_bind(), ldap_count_entries(), ldap_delete(), ldap_errno(), ldap_error(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_get_option(), ldap_list(), ldap_modify(), ldap_mod_add(), ldap_mod_replace(), ldap_next_attribute(), ldap_next_entry(), ldap_mod_del(), ldap_set_option(), ldap_unbind() | ldap_free_result() | ldap search result
ldap result entry
mcal | mcal_open(), mcal_popen() | mcal_create_calendar(), mcal_rename_calendar(), mcal_rename_calendar(), mcal_delete_calendar(), mcal_fetch_event(), mcal_list_events(), mcal_append_event(), mcal_store_event(), mcal_delete_event(), mcal_list_alarms(), mcal_event_init(), mcal_event_set_category(), mcal_event_set_title(), mcal_event_set_description(), mcal_event_set_start(), mcal_event_set_end(), mcal_event_set_alarm(), mcal_event_set_class(), mcal_next_recurrence(), mcal_event_set_recur_none(), mcal_event_set_recur_daily(), mcal_event_set_recur_weekly(), mcal_event_set_recur_monthly_mday(), mcal_event_set_recur_monthly_wday(), mcal_event_set_recur_yearly(), mcal_fetch_current_stream_event(), mcal_event_add_attribute(), mcal_expunge() | mcal_close() | Link to calendar server
SWFAction
SWFBitmap
SWFButton
SWFDisplayItem
SWFFill
SWFFont
SWFGradient
SWFMorph
SWFMovie
SWFShape
SWFSprite
SWFText
SWFTextField
mnogosearch agent
mnogosearch result
msql link | msql_connect() | msql(), msql_create_db(), msql_createdb(), msql_drop_db(), msql_drop_db(), msql_select_db(), msql_select_db() | msql_close() | Link to mSQL database
msql link persistent | msql_pconnect() | msql(), msql_create_db(), msql_createdb(), msql_drop_db(), msql_drop_db(), msql_select_db(), msql_select_db() | None | Persistent link to mSQL
msql query | msql_query() | msql(), msql_affected_rows(), msql_data_seek(), msql_dbname(), msql_fetch_array(), msql_fetch_field(), msql_fetch_object(), msql_fetch_row(), msql_fieldname(), msql_field_seek(), msql_fieldtable(), msql_fieldtype(), msql_fieldflags(), msql_fieldlen(), msql_num_fields(), msql_num_rows(), msql_numfields(), msql_numrows(), msql_result() | msql_free_result(), msql_free_result() | mSQL result
mssql link | mssql_connect() | mssql_query(), mssql_select_db() | mssql_close() | Link to Microsft SQL Server database
mssql link persistent | mssql_pconnect() | mssql_query(), mssql_select_db() | None | Persistent link to Microsft SQL Server
mssql result | mssql_query() | mssql_data_seek(), mssql_fetch_array(), mssql_fetch_field(), mssql_fetch_object(), mssql_fetch_row(), mssql_field_length(), mssql_field_name(), mssql_field_seek(), mssql_field_type(), mssql_num_fields(), mssql_num_rows(), mssql_result() | mssql_free_result() | Microsft SQL Server result
mysql link | mysql_connect() | mysql_affected_rows(), mysql_change_user(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | mysql_close() | Link to MySQL database
mysql link persistent | mysql_pconnect() | mysql_affected_rows(), mysql_change_user(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | None | Persistent link to MySQL database
mysql result | mysql_db_query(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query() | mysql_data_seek(), mysql_db_name(), mysql_fetch_array(), mysql_fetch_assoc(), mysql_fetch_field(), mysql_fetch_lengths(), mysql_fetch_object(), mysql_fetch_row(), mysql_fetch_row(), mysql_field_flags(), mysql_field_name(), mysql_field_len(), mysql_field_seek(), mysql_field_table(), mysql_field_type(), mysql_num_fields(), mysql_num_rows(), mysql_result(), mysql_tablename() | mysql_free_result() | MySQL result
oci8 collection
oci8 connection | ocilogon(), ociplogon(), ocinlogon() | ocicommit(), ociserverversion(), ocinewcursor(), ociparse(), ocierror() | ocilogoff() | Link to Oracle database
oci8 descriptor
oci8 server
oci8 session
oci8 statement | ocinewdescriptor() | ocirollback(), ocinewdescriptor(), ocirowcount(), ocidefinebyname(), ocibindbyname(), ociexecute(), ocinumcols(), ociresult(), ocifetch(), ocifetchinto(), ocifetchstatement(), ocicolumnisnull(), ocicolumnname(), ocicolumnsize(), ocicolumntype(), ocistatementtype(), ocierror() | ocifreestatement() | Oracle Cursor
odbc link | odbc_connect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | odbc_close() | Link to ODBC database
odbc link persistent | odbc_connect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | None | Persistent link to ODBC database
odbc result | odbc_prepare() | odbc_binmode(), odbc_cursor(), odbc_execute(), odbc_fetch_into(), odbc_fetch_row(), odbc_field_name(), odbc_field_num(), odbc_field_type(), odbc_field_len(), odbc_field_precision(), odbc_field_scale(), odbc_longreadlen(), odbc_num_fields(), odbc_num_rows(), odbc_result(), odbc_result_all(), odbc_setoption() | odbc_free_result() | ODBC result
birdstep link
birdstep result
OpenSSL key | openssl_get_privatekey(), openssl_get_publickey() | openssl_sign(), openssl_seal(), openssl_open(), openssl_verify() | openssl_free_key() | OpenSSL key
OpenSSL X.509 | openssl_x509_read() | openssl_x509_parse(), openssl_x509_checkpurpose() | openssl_x509_free() | Public Key
oracle Cursor | ora_open() | ora_bind(), ora_columnname(), ora_columnsize(), ora_columntype(), ora_error(), ora_errorcode(), ora_exec(), ora_fetch(), ora_fetch_into(), ora_getcolumn(), ora_numcols(), ora_numrows(), ora_parse() | ora_close() | Oracle cursor
oracle link | ora_logon() | ora_do(), ora_error(), ora_errorcode(), ora_rollback(), ora_commitoff(), ora_commiton(), ora_open(), ora_commit() | ora_logoff() | Link to oracle database
oracle link persistent | ora_plogon() | ora_do(), ora_error(), ora_errorcode(), ora_rollback(), ora_commitoff(), ora_commiton(), ora_open(), ora_commit() | None | Persistent link to oracle database
pdf document | pdf_new() | pdf_add_bookmark(), pdf_add_launchlink(), pdf_add_locallink(), pdf_add_note(), pdf_add_pdflink(), pdf_add_weblink(), pdf_arc(), pdf_attach_file(), pdf_begin_page(), pdf_circle(), pdf_clip(), pdf_closepath(), pdf_closepath_fill_stroke(), pdf_closepath_stroke(), pdf_concat(), pdf_continue_text(), pdf_curveto(), pdf_end_page(), pdf_endpath(), pdf_fill(), pdf_fill_stroke(), pdf_findfont(), pdf_get_buffer(), pdf_get_image_height(), pdf_get_image_width(), pdf_get_parameter(), pdf_get_value(), pdf_lineto(), pdf_moveto(), pdf_open_ccitt(), pdf_open_file(), pdf_open_image_file(), pdf_place_image(), pdf_rect(), pdf_restore(), pdf_rotate(), pdf_save(), pdf_scale(), pdf_setdash(), pdf_setflat(), pdf_setfont(), pdf_setgray(), pdf_setgray_fill(), pdf_setgray_stroke(), pdf_setlinecap(), pdf_setlinejoin(), pdf_setlinewidth(), pdf_setmiterlimit(), pdf_setpolydash(), pdf_setrgbcolor(), pdf_setrgbcolor_fill(), pdf_setrgbcolor_stroke(), pdf_set_border_color(), pdf_set_border_dash(), pdf_set_border_style(), pdf_set_char_spacing(), pdf_set_duration(), pdf_set_font(), pdf_set_horiz_scaling(), pdf_set_parameter(), pdf_set_text_pos(), pdf_set_text_rendering(), pdf_set_value(), pdf_set_word_spacing(), pdf_show(), pdf_show_boxed(), pdf_show_xy(), pdf_skew(), pdf_stringwidth(), pdf_stroke(), pdf_translate(), pdf_open_memory_image() | pdf_close(), pdf_delete() | PDF document
pdf image | pdf_open_image(), pdf_open_image_file(), pdf_open_memory_image() | pdf_get_image_height(), pdf_get_image_width(), pdf_open_CCITT(), pdf_place_image() | pdf_close_image() | Image in PDF file
pdf object
pdf outline
pgsql large object | pg_lo_open() | pg_lo_open(), pg_lo_create(), pg_lo_read(), pg_lo_read_all(), pg_lo_seek(), pg_lo_tell(), pg_lo_unlink(), pg_lo_write() | pg_lo_close() | PostgreSQL Large Object
pgsql link | pg_connect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_metadata(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | pg_close() | Link to PostgreSQL database
pgsql link persistent | pg_pconnect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_metadata(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | None | Persistent link to PostgreSQL database
pgsql result | pg_query(), pg_get_result() | pg_fetch_array(), pg_fetch_object(), pg_fetch_result(), pg_fetch_row(), pg_field_is_null(), pg_field_name(), pg_field_num(), pg_field_prtlen(), pg_field_size(), pg_field_type(), pg_last_oid(), pg_num_fields(), pg_num_rows(), pg_result_error(), pg_result_status() | pg_free_result() | PostgreSQL result
pgsql string
printer
printer brush
printer font
printer pen
pspell | pspell_new(), pspell_new_config(), pspell_new_personal() | pspell_add_to_personal(), pspell_add_to_session(), pspell_check(), pspell_clear_session(), pspell_config_ignore(), pspell_config_mode(), pspell_config_personal(), pspell_config_repl(), pspell_config_runtogether(), pspell_config_save_repl(), pspell_save_wordlist(), pspell_store_replacement(), pspell_suggest() | None | pspell dictionary
pspell config | pspell_config_create() | pspell_new_config() | None | pspell configuration
Sablotron XSLT | xslt_create() | xslt_closelog(), xslt_openlog(), xslt_run(), xslt_set_sax_handler(), xslt_errno(), xslt_error(), xslt_fetch_result(), xslt_free() | xslt_free() | XSLT parser
shmop | shmop_open() | shmop_read(), shmop_write(), shmop_size(), shmop_delete() | shmop_close()
sockets file descriptor set | socket() | accept_connect(), bind(), connect(), listen(), read(), write() | close() | Socket
sockets i/o vector
dir | dir() | readdir(), rewinddir() | closedir() | Dir handle
file | fopen() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), flock(), fpassthru(), fputs(), fwrite(), fread(), fseek(), ftell(), fstat(), ftruncate(), set_file_buffer(), rewind() | fclose() | File handle
pipe | popen() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | pclose() | Process handle
socket | fsockopen() | fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | fclose() | Socket handle
stream
sybase-db link | sybase_connect() | sybase_query(), sybase_select_db() | sybase_close() | Link to Sybase database using DB library
sybase-db link persistent | sybase_pconnect() | sybase_query(), sybase_select_db() | None | Persistent link to Sybase database using DB library
sybase-db result | sybase_query() | sybase_data_seek(), sybase_fetch_array(), sybase_fetch_field(), sybase_fetch_object(), sybase_fetch_row(), sybase_field_seek(), sybase_num_fields(), sybase_num_rows(), sybase_result() | sybase_free_result() | Sybase result using DB library
sybase-ct link | sybase_connect() | sybase_affected_rows(), sybase_query(), sybase_select_db() | sybase_close() | Link to Sybase database using CT library
sybase-ct link persistent | sybase_pconnect() | sybase_affected_rows(), sybase_query(), sybase_select_db() | None | Persistent link to Sybase database using CT library
sybase-ct result | sybase_query() | sybase_data_seek(), sybase_fetch_array(), sybase_fetch_field(), sybase_fetch_object(), sybase_fetch_row(), sybase_field_seek(), sybase_num_fields(), sybase_num_rows(), sybase_result() | sybase_free_result() | Sybase result using CT library
sysvsem | sem_get() | sem_acquire() | sem_release() | System V Semaphore
sysvshm | shm_attach() | shm_remove(), shm_put_var(), shm_get_var(), shm_remove_var() | shm_detach() | System V Shared Memory
wddx | wddx_packet_start() | wddx_add_vars() | wddx_packet_end() | WDDX packet
xml | xml_parser_create() | xml_set_object(), xml_set_element_handler(), xml_set_character_data_handler(), xml_set_processing_instruction_handler(), xml_set_default_handler(), xml_set_unparsed_entity_decl_handler(), xml_set_notation_decl_handler(), xml_set_external_entity_ref_handler(), xml_parse(), xml_get_error_code(), xml_error_string(), xml_get_current_line_number(), xml_get_current_column_number(), xml_get_current_byte_index(), xml_parse_into_struct(), xml_parser_set_option(), xml_parser_get_option() | xml_parser_free() | XML parser
zlib | gzopen() | gzeof(), gzgetc(), gzgets(), gzgetss(), gzpassthru(), gzputs(), gzread(), gzrewind(), gzseek(), gztell(), gzwrite() | gzclose() | gz-compressed file

上一頁 | 首頁 | 下一頁
標準預定義常數 | 上一層 | 支援的協議／封裝協議列表


Keeping Current

PHP, like any other large system, is under constant scrutiny and improvement. Each new version will often include both major and minor changes to enhance and repair security flaws, configuration mishaps, and other issues that will affect the overall security and stability of your system.

Like other system-level scripting languages and programs, the best approach is to update often, and maintain awareness of the latest versions and their changes.

上一頁 | 首頁 | 下一頁
Hiding PHP | 上一層 | 語言參考


Streams Common API Reference

目錄
php_stream_stat_path -- Gets the status for a file or URL
php_stream_stat -- Gets the status for the underlying storage associated with a stream
php_stream_open_wrapper -- Opens a stream on a file or URL
php_stream_read -- Read a number of bytes from a stream into a buffer
php_stream_write -- Write a number of bytes from a buffer to a stream
php_stream_eof -- Check for an end-of-file condition on a stream
php_stream_getc -- Read a single byte from a stream
php_stream_gets -- Read a line of data from a stream into a buffer
php_stream_close -- Close a stream
php_stream_flush -- Flush stream buffers to storage
php_stream_seek -- Reposition a stream
php_stream_tell -- Determine the position of a stream
php_stream_copy_to_stream -- Copy data from one stream to another
php_stream_copy_to_mem -- Copy data from stream and into an allocated buffer
php_stream_make_seekable -- Convert a stream into a stream is seekable
php_stream_cast -- Convert a stream into another form, such as a FILE* or socket
php_stream_can_cast -- Determines if a stream can be converted into another form, such as a FILE* or socket
php_stream_is_persistent -- Determines if a stream is a persistent stream
php_stream_is -- Determines if a stream is of a particular type
php_stream_passthru -- Outputs all remaining data from a stream
php_register_url_stream_wrapper -- Registers a wrapper with the Streams API
php_unregister_url_stream_wrapper -- Un-registers a wrapper from the Streams API
php_stream_open_wrapper_ex -- Opens a stream on a file or URL, specifying context
php_stream_open_wrapper_as_file -- Opens a stream on a file or URL, and converts to a FILE*
上一頁 | 首頁 | 下一頁
Streams Basics | 上一層 | php_stream_stat_path


Streams API for PHP Extension Authors

PHP 手冊
上一頁 下一頁

章 43. Streams API for PHP Extension Authors

目錄
Overview
Streams Basics
Streams Common API Reference
Streams Dir API Reference
Streams File API Reference
Streams Socket API Reference
Streams Structures
Streams Constants

Overview

The PHP Streams API introduces a unified approach to the handling of files and sockets in PHP extension. Using a single API with standard functions for common operations, the streams API allows your extension to access files, sockets, URLs, memory and script-defined objects. Streams is a run-time extensible API that allows dynamically loaded modules (and scripts!) to register new streams.

The aim of the Streams API is to make it comfortable for developers to open files, urls and other streamable data sources with a unified API that is easy to understand. The API is more or less based on the ANSI C stdio family of functions (with identical semantics for most of the main functions), so C programmers will have a feeling of familiarity with streams.

The streams API operates on a couple of different levels: at the base level, the API defines php_stream objects to represent streamable data sources. On a slightly higher level, the API defines php_stream_wrapper objects which "wrap" around the lower level API to provide support for retrieving data and meta-data from URLs.

Streams can be cast (converted) into other types of file-handles, so that they can be used with third-party libraries without a great deal of trouble. This allows those libraries to access data directly from URL sources. If your system has the fopencookie() function, you can even pass any PHP stream to any library that uses ANSI stdio!

上一頁 | 首頁 | 下一頁
API Macros |  | Streams Basics


Streams Basics

Using streams is very much like using ANSI stdio functions. The main difference is in how you obtain the stream handle to begin with. In most cases, you will use php_stream_open_wrapper() to obtain the stream handle. This function works very much like fopen, as can be seen from the example below:

例子 43-1. simple stream example that displays the PHP home page

php_stream * stream = php_stream_open_wrapper("http://www.php.net", "rb", REPORT_ERRORS, NULL);
if (stream) {
    while(!php_stream_eof(stream)) {
        char buf[1024];

        if (php_stream_gets(stream, buf, sizeof(buf))) {
            printf(buf);
        } else {
            break;
        }
    }
    php_stream_close(stream);
}

The table below shows the Streams equivalents of the more common ANSI stdio functions. Unless noted otherwise, the semantics of the functions are identical.

表格 43-1. ANSI stdio equivalent functions in the Streams API

ANSI Stdio Function | PHP Streams Function | Notes
fopen | php_stream_open_wrapper | Streams includes additional parameters
fclose | php_stream_close |
fgets | php_stream_gets |
fread | php_stream_read | The nmemb parameter is assumed to have a value of 1, so the prototype looks more like read(2)
fwrite | php_stream_write | The nmemb parameter is assumed to have a value of 1, so the prototype looks more like write(2)
fseek | php_stream_seek |
ftell | php_stream_tell |
rewind | php_stream_rewind |
feof | php_stream_eof |
fgetc | php_stream_getc |
fputc | php_stream_putc |
fflush | php_stream_flush |
puts | php_stream_puts | Same semantics as puts, NOT fputs
fstat | php_stream_stat | Streams has a richer stat structure

上一頁 | 首頁 | 下一頁
Streams API for PHP Extension Authors | 上一層 | Streams Common API Reference


Streams Constants

目錄
Stream open options -- Affects the operation of stream factory functions
上一頁 | 首頁 | 下一頁
struct php_stream_dirent | 上一層 | Stream open options


Streams Dir API Reference

目錄
php_stream_opendir -- Open a directory for file enumeration
php_stream_readdir -- Fetch the next directory entry from an opened dir
php_stream_rewinddir -- Rewind a directory stream to the first entry
php_stream_closedir -- Close a directory stream and release resources

The functions listed in this section work on local files, as well as remote files (provided that the wrapper supports this functionality!).

上一頁 | 首頁 | 下一頁
php_stream_open_wrapper_as_file | 上一層 | php_stream_opendir


Streams File API Reference

目錄
php_stream_fopen_from_file -- Convert an ANSI FILE* into a stream
php_stream_fopen_tmpfile -- Open a FILE* with tmpfile() and convert into a stream
php_stream_fopen_temporary_file -- Generate a temporary file name and open a stream on it
上一頁 | 首頁 | 下一頁
php_stream_closedir | 上一層 | php_stream_fopen_from_file


Stream open options

Stream open options -- Affects the operation of stream factory functions

Description

One or more of these values can be combined using the OR operator.

IGNORE_PATH

This is the default option for streams; it requests that the include_path is not to be searched for the requested file.

USE_PATH

Requests that the include_path is to be searched for the requested file.

IGNORE_URL

Requests that registered URL wrappers are to be ignored when opening the stream. Other non-URL wrappers will be taken into consideration when decoding the path. There is no opposite form for this flag; the streams API will use all registered wrappers by default.

IGNORE_URL_WIN

On Windows systems, this is equivalent to IGNORE_URL. On all other systems, this flag has no effect.

ENFORCE_SAFE_MODE

Requests that the underlying stream implementation perform safe_mode checks on the file before opening the file. Omitting this flag will skip safe_mode checks and allow opening of any file that the PHP process has rights to access.

REPORT_ERRORS

If this flag is set, and there was an error during the opening of the file or URL, the streams API will call the php_error function for you. This is useful because the path may contain username/password information that should not be displayed in the browser output (it would be a security risk to do so). When the streams API raises the error, it first strips username/password information from the path, making the error message safe to display in the browser.

STREAM_MUST_SEEK

This flag is useful when your extension really must be able to randomly seek around in a stream. Some streams may not be seekable in their native form, so this flag asks the streams API to check to see if the stream does support seeking. If it does not, it will copy the stream into temporary storage (which may be a temporary file or a memory stream) which does support seeking. Please note that this flag is not useful when you want to seek the stream and write to it, because the stream you are accessing might not be bound to the actual resource you requested.

註: If the requested resource is network based, this flag will cause the opener to block until the whole contents have been downloaded.

STREAM_WILL_CAST

If your extension is using a third-party library that expects a FILE* or file descriptor, you can use this flag to request the streams API to open the resource but avoid buffering. You can then use php_stream_cast() to retrieve the FILE* or file descriptor that the library requires.

The is particularly useful when accessing HTTP URLs where the start of the actual stream data is found after an indeterminate offset into the stream.

Since this option disables buffering at the streams API level, you may experience lower performance when using streams functions on the stream; this is deemed acceptable because you have told streams that you will be using the functions to match the underlying stream implementation. Only use this option when you are sure you need it.

上一頁 | 首頁 | 下一頁
Streams Constants | 上一層 | FAQ: 常見問題


Streams Socket API Reference

目錄
php_stream_sock_open_from_socket -- Convert a socket descriptor into a stream
php_stream_sock_open_host -- Open a connection to a host and return a stream
php_stream_sock_open_unix -- Open a UNIX domain socket and convert into a stream
上一頁 | 首頁 | 下一頁
php_stream_fopen_temporary_file | 上一層 | php_stream_sock_open_from_socket


Streams Structures

目錄
struct php_stream_statbuf -- Holds information about a file or URL
struct php_stream_dirent -- Holds information about a single file during dir scanning
上一頁 | 首頁 | 下一頁
php_stream_sock_open_unix | 上一層 | struct php_stream_statbuf


解析器代號列表

PHP 手冊
上一頁 下一頁

附錄 J. 解析器代號列表

PHP 語言的不同部分在內部被表示為類似 T_SR 的型別。PHP 在解析錯誤時輸出這樣的標籤，例如 "Parse error: unexpected T_SR, expecting ',' or ';' in script.php on line 10."。

你應該知道 T_SR 的含義。對於所有不知道的人，這裡有一張表列出了這些標籤，PHP 語法和在手冊中適當位置的參考。

表格 J-1. 代號

代號 | 語法 | 參考
T_AND_EQUAL | &= | assignment operators
T_ARRAY | array() | array(), array syntax
T_ARRAY_CAST | (array) | type-casting
T_AS | as | foreach
T_BAD_CHARACTER |  | anything below ASCII 32 except \t (0x09), \n (0x0a) and \r (0x0d)
T_BOOLEAN_AND | && | logical operators
T_BOOLEAN_OR | || | logical operators
T_BOOL_CAST | (bool) or (boolean) | type-casting
T_BREAK | break | break
T_CASE | case | switch
T_CHARACTER |  |
T_CLASS | class | classes and objects
T_CLOSE_TAG | ?> or %> |
T_COMMENT | // or # | comments
T_CONCAT_EQUAL | .= | assignment operators
T_CONST | const |
T_CONSTANT_ENCAPSED_STRING | "foo" or 'bar' | string syntax
T_CONTINUE | continue |
T_CURLY_OPEN |  |
T_DEC | -- | incrementing/decrementing operators
T_DECLARE | declare | declare
T_DEFAULT | default | switch
T_DIV_EQUAL | /= | assignment operators
T_DNUMBER | 0.12, etc | floating point numbers
T_DO | do | do..while
T_DOLLAR_OPEN_CURLY_BRACES | ${ | complex variable parsed syntax
T_DOUBLE_ARROW | => | array syntax
T_DOUBLE_CAST | (real), (double) or (float) | type-casting
T_ECHO | echo | echo()
T_ELSE | else | else
T_ELSEIF | elseif | elseif
T_EMPTY | empty | empty()
T_ENCAPSED_AND_WHITESPACE |  |
T_ENDDECLARE | enddeclare | declare, alternative syntax
T_ENDFOR | endfor | for, alternative syntax
T_ENDFOREACH | endforeach | foreach, alternative syntax
T_ENDIF | endif | if, alternative syntax
T_ENDSWITCH | endswitch | switch, alternative syntax
T_ENDWHILE | endwhile | while, alternative syntax
T_END_HEREDOC |  | heredoc syntax
T_EVAL | eval() | eval()
T_EXIT | exit or die | exit(), die()
T_EXTENDS | extends | extends, classes and objects
T_FILE | __FILE__ | constants
T_FOR | for | for
T_FOREACH | foreach | foreach
T_FUNCTION | function or cfunction | functions
T_GLOBAL | global | variable scope
T_IF | if | if
T_INC | ++ | incrementing/decrementing operators
T_INCLUDE | include() | include()
T_INCLUDE_ONCE | include_once() | include_once()
T_INLINE_HTML |  |
T_INT_CAST | (int) or (integer) | type-casting
T_ISSET | isset() | isset()
T_IS_EQUAL | == | comparison operators
T_IS_GREATER_OR_EQUAL | >= | comparison operators
T_IS_IDENTICAL | === | comparison operators
T_IS_NOT_EQUAL | != or <> | comparison operators
T_IS_NOT_IDENTICAL | !== | comparison operators
T_SMALLER_OR_EQUAL | <= | comparison operators
T_LINE | __LINE__ | constants
T_LIST | list() | list()
T_LNUMBER | 123, 012, 0x1ac, etc | integers
T_LOGICAL_AND | and | logical operators
T_LOGICAL_OR | or | logical operators
T_LOGICAL_XOR | xor | logical operators
T_MINUS_EQUAL | -= | assignment operators
T_ML_COMMENT | /* and */ | comments
T_MOD_EQUAL | %= | assignment operators
T_MUL_EQUAL | *= | assignment operators
T_NEW | new | classes and objects
T_NUM_STRING |  |
T_OBJECT_CAST | (object) | type-casting
T_OBJECT_OPERATOR | -> | classes and objects
T_OLD_FUNCTION | old_function | old_function
T_OPEN_TAG | <?php, <? or <% | escaping from HTML
T_OPEN_TAG_WITH_ECHO | <?= or <%= | escaping from HTML
T_OR_EQUAL | |= | assignment operators
T_PAAMAYIM_NEKUDOTAYIM | :: | ::
T_PLUS_EQUAL | += | assignment operators
T_PRINT | print() | print()
T_REQUIRE | require() | require()
T_REQUIRE_ONCE | require_once() | require_once()
T_RETURN | return | returning values
T_SL | << | bitwise operators
T_SL_EQUAL | <<= | assignment operators
T_SR | >> | bitwise operators
T_SR_EQUAL | >>= | assignment operators
T_START_HEREDOC | <<< | heredoc syntax
T_STATIC | static | variable scope
T_STRING |  |
T_STRING_CAST | (string) | type-casting
T_STRING_VARNAME |  |
T_SWITCH | switch | switch
T_UNSET | unset() | unset()
T_UNSET_CAST | (unset) | (not documented; casts to NULL)
T_USE | use | (not implemented)
T_VAR | var | classes and objects
T_VARIABLE | $foo | variables
T_WHILE | while | while, do..while
T_WHITESPACE |  |
T_XOR_EQUAL | ^= | assignment operators
T_FUNC_C | __FUNCTION__ | constants, since PHP 4.3.0
T_CLASS_C | __CLASS__ | constants, since PHP 4.3.0
上一頁 | 首頁 | 下一頁
壓縮流 | 上一層 | 關於本手冊


如何閱讀函式的定義（函式原型）

文檔中的每個函式都有快速參考，學會如何閱讀和理解文檔將使得 PHP 的使用更加簡單。和依賴賴於複制/粘貼範例比起來，您一定更希望知道如何閱讀函式的定義（函式原型）：

先決條件：對“變數型別”的基本理解: 儘管 PHP 是亞型別語言，但對“變數型別”有一個基本的理解也是非常重要的，因為它們有重要的意義。

函式定義告訴我們函式傳回什麼型別的值，讓我們用函式 strlen() 的定義作為我們的第一個範例：

strlen

  (PHP 3, PHP 4 >= 4.0.0)
  strlen -- Get string length

  Description
  int strlen ( string str )

  Returns the length of string.

表格 K-1. 函式定義

組成部分 | 說明
strlen | 函式名稱
(PHP 3, PHP 4 >= 4.0.0) | strlen() 在 PHP 3 和 PHP 4 中都存在
int | 該函式傳回的值的型別，這裡為整型。（例如，字串的長度是以數字來衡量的）
( string str ) | 第一個（本例中是唯一的）參數，在該函式中名為 str，且型別為 string。

我們可以將以上函式的定義寫成一般形式：

傳回型別    函式名    ( 參數型別   參數名 )

很多函式都有多個變數，例如 in_array()。其函式原型如下：

bool in_array ( mixed needle, array haystack [, bool strict])

這是什麼意思？in_array() 傳回一個“布爾”值，成功（即在參數 haystack 中能找到參數 needle）則傳回 TRUE 或者失敗（即在參數 haystack 中找不到參數 needle）則傳回 FALSE。第一個參數被命名為 needle 且其型別不定，因此我們將其稱為“混和”型別。該混和型別的 needle 參數（我們要找的對象）可以適一個純量的值（字串、整數、或者浮點），或者一個陣列。haystack （我們尋找的範圍）是第二個參數。第三個可選參數被命名為 strict。所有的可選參數都用 [ 方括號 ] 引用。手冊表明 strict 參數預設值為布爾值 FALSE。需要了解函式工作的細節，請參閱手冊中和該函式相關的頁面。

上一頁 | 首頁 | 下一頁
關於用戶註釋 | 上一層 | 本手冊中所涉及的 PHP 版本


下一步做什麼？

用您現在掌握的知識，您應該能夠理解本手冊中的大部分內容以及其中各式各樣的腳本範例。在 php.net 網站的連接區 http://www.php.net/links.php 您能夠獲得其它更多的範例。

上一頁 | 首頁 | 下一頁
在新版本的 PHP 中使用舊的 PHP 代碼 | 上一層 | 安裝


支援的協議／封裝協議列表

PHP 手冊
上一頁 下一頁

附錄 I. 支援的協議／封裝協議列表

目錄
HTTP 和 HTTPS
FTP 和 FTPS
PHP 輸入／輸出流
壓縮流

以下是 PHP 內置用於文件系統函式例如 fopen() 和 copy() 的 URL 風格協議列表。除了這些封裝協議之外，從 PHP 4.3 起，你還可以用 PHP 腳本和 stream_register_wrapper() 寫自己的封裝協議。

HTTP 和 HTTPS

PHP 3，PHP 4。自 PHP 4.3 起支援 https://

  • http://example.com

  • http://user:password@example.com

  • https://example.com

  • https://user:password@example.com

允許通過 HTTP 1.0 使用 HTTP GET 方法對文件／資源進行只讀連接。Host: 報頭也會通過請求發送出去以支援基於域名的虛擬主機。如果你在 ini 文件或者流上下文配置了 user_agent 字串，也會被包括在請求報頭中。

自 PHP 4.0.5 起支援重定向。如果使用較早版本的 PHP 則需要在 URL 末尾包括一個斜線。

流允許連接資源的正文，報頭部分保存在 $http_response_header 變數中。自 PHP 4.3 起，可以用 stream_get_meta_data() 得到報頭。

HTTP 連接是只讀的，不能將資料寫入或者拷貝文件到 HTTP 資源。

註: 自 PHP 4.3 起開始支援 HTTPS，需要在編譯時加入 OpenSSL 的支援。

上一頁 | 首頁 | 下一頁
資源型別列表 | 上一層 | FTP 和 FTPS


Extending PHP 4.0

PHP 手冊
上一頁 下一頁

V. Extending PHP 4.0

Hacking the Core of PHP

Those who know don't talk.

Those who talk don't know.

Sometimes, PHP "as is" simply isn't enough. Although these cases are rare for the average user, professional applications will soon lead PHP to the edge of its capabilities, in terms of either speed or functionality. New functionality cannot always be implemented natively due to language restrictions and inconveniences that arise when having to carry around a huge library of default code appended to every single script, so another method needs to be found for overcoming these eventual lacks in PHP.

As soon as this point is reached, it's time to touch the heart of PHP and take a look at its core, the C code that makes PHP go.

目錄
24. Overview
25. Extension Possibilities
26. Source Layout
27. PHP's Automatic Build System
28. Creating Extensions
29. Using Extensions
30. Troubleshooting
31. Source Discussion
32. Accepting Arguments
33. Creating Variables
34. Duplicating Variable Contents: The Copy Constructor
35. Returning Values
36. Printing Information
37. Startup and Shutdown Functions
38. Calling User Functions
39. Initialization File Support
40. Where to Go from Here
41. Reference: Some Configuration Macros
42. API Macros
Hacking the Core of PHP
上一頁 | 首頁 | 下一頁
readgzfile |  | Overview


API Macros

PHP 手冊
上一頁 下一頁

章 42. API Macros

A set of macros was introduced into Zend's API that simplify access to zval containers (see 表格 42-1).

表格 42-1. API Macros for Accessing zval Containers

Macro | Refers to
Z_LVAL(zval) | (zval).value.lval
Z_DVAL(zval) | (zval).value.dval
Z_STRVAL(zval) | (zval).value.str.val
Z_STRLEN(zval) | (zval).value.str.len
Z_ARRVAL(zval) | (zval).value.ht
Z_LVAL_P(zval) | (*zval).value.lval
Z_DVAL_P(zval) | (*zval).value.dval
Z_STRVAL_P(zval_p) | (*zval).value.str.val
Z_STRLEN_P(zval_p) | (*zval).value.str.len
Z_ARRVAL_P(zval_p) | (*zval).value.ht
Z_LVAL_PP(zval_pp) | (**zval).value.lval
Z_DVAL_PP(zval_pp) | (**zval).value.dval
Z_STRVAL_PP(zval_pp) | (**zval).value.str.val
Z_STRLEN_PP(zval_pp) | (**zval).value.str.len
Z_ARRVAL_PP(zval_pp) | (**zval).value.ht
上一頁 | 首頁 | 下一頁
Reference: Some Configuration Macros | 上一層 | Streams API for PHP Extension Authors


Accepting Arguments

PHP 手冊
上一頁 下一頁

章 32. Accepting Arguments

目錄
Determining the Number of Arguments
Retrieving Arguments
Old way of retrieving arguments (deprecated)
Dealing with a Variable Number of Arguments/Optional Parameters
Accessing Arguments
Dealing with Arguments Passed by Reference
Assuring Write Safety for Other Parameters

One of the most important issues for language extensions is accepting and dealing with data passed via arguments. Most extensions are built to deal with specific input data (or require parameters to perform their specific actions), and function arguments are the only real way to exchange data between the PHP level and the C level. Of course, there's also the possibility of exchanging data using predefined global values (which is also discussed later), but this should be avoided by all means, as it's extremely bad practice.

PHP doesn't make use of any formal function declarations; this is why call syntax is always completely dynamic and never checked for errors. Checking for correct call syntax is left to the user code. For example, it's possible to call a function using only one argument at one time and four arguments the next time - both invocations are syntactically absolutely correct.

Determining the Number of Arguments

Since PHP doesn't have formal function definitions with support for call syntax checking, and since PHP features variable arguments, sometimes you need to find out with how many arguments your function has been called. You can use the ZEND_NUM_ARGS macro in this case. In previous versions of PHP, this macro retrieved the number of arguments with which the function has been called based on the function's hash table entry, ht, which is passed in the INTERNAL_FUNCTION_PARAMETERS list. As ht itself now contains the number of arguments that have been passed to the function, ZEND_NUM_ARGS has been stripped down to a dummy macro (see its definition in zend_API.h). But it's still good practice to use it, to remain compatible with future changes in the call interface. Note: The old PHP equivalent of this macro is ARG_COUNT.

The following code checks for the correct number of arguments:
if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;
If the function is not called with two arguments, it exits with an error message. The code snippet above makes use of the tool macro WRONG_PARAM_COUNT, which can be used to generate a standard error message (see 圖形 32-1).

圖形 32-1. WRONG_PARAM_COUNT in action.

This macro prints a default error message and then returns to the caller. Its definition can also be found in zend_API.h and looks like this:
ZEND_API void wrong_param_count(void);

#define WRONG_PARAM_COUNT { wrong_param_count(); return; }
As you can see, it calls an internal function named wrong_param_count() that's responsible for printing the warning. For details on generating customized error messages, see the later section "Printing Information."

上一頁 | 首頁 | 下一頁
Summary | 上一層 | Retrieving Arguments


PHP's Automatic Build System

PHP 手冊
上一頁 下一頁

章 27. PHP's Automatic Build System

PHP 4 features an automatic build system that's very flexible. All modules reside in a subdirectory of the ext directory. In addition to its own sources, each module consists of a config.m4 file, for extension configuration. (for example, see http://www.gnu.org/manual/m4/html_mono/m4.html)

All these stub files are generated automatically, along with .cvsignore, by a little shell script named ext_skel that resides in the ext directory. As argument it takes the name of the module that you want to create. The shell script then creates a directory of the same name, along with the appropriate stub files.

Step by step, the process looks like this:
:~/cvs/php4/ext:> ./ext_skel --extname=my_module
Creating directory my_module
Creating basic files: config.m4 .cvsignore my_module.c php_my_module.h CREDITS EXPERIMENTAL tests/001.phpt my_module.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/my_module/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-my_module
5.  $ make
6.  $ ./php -f ext/my_module/my_module.php
7.  $ vi ext/my_module/my_module.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/my_module/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
This instruction creates the aforementioned files. To include the new module in the automatic configuration and build process, you have to run buildconf, which regenerates the configure script by searching through the ext directory and including all found config.m4 files.

The default config.m4 shown in 例子 27-1 is a bit more complex:

例子 27-1. The default config.m4.

dnl $Id: Extending_Zend_Build.xml,v 1.8 2002/10/10 18:13:11 imajes Exp $
dnl config.m4 for extension my_module

dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(my_module, for my_module support,
dnl Make sure that the comment is aligned:
dnl [  --with-my_module             Include my_module support])

dnl Otherwise use enable:

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,
dnl Make sure that the comment is aligned:
dnl [  --enable-my_module           Enable my_module support])

if test "$PHP_MY_MODULE" != "no"; then
  dnl Write more examples of tests here...

  dnl # --with-my_module -> check with-path
  dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this
  dnl SEARCH_FOR="/include/my_module.h"  # you most likely want to change this
  dnl if test -r $PHP_MY_MODULE/; then # path given as parameter
  dnl   MY_MODULE_DIR=$PHP_MY_MODULE
  dnl else # search default path list
  dnl   AC_MSG_CHECKING([for my_module files in default path])
  dnl   for i in $SEARCH_PATH ; do
  dnl     if test -r $i/$SEARCH_FOR; then
  dnl       MY_MODULE_DIR=$i
  dnl       AC_MSG_RESULT(found in $i)
  dnl     fi
  dnl   done
  dnl fi
  dnl
  dnl if test -z "$MY_MODULE_DIR"; then
  dnl   AC_MSG_RESULT([not found])
  dnl   AC_MSG_ERROR([Please reinstall the my_module distribution])
  dnl fi

  dnl # --with-my_module -> add include path
  dnl PHP_ADD_INCLUDE($MY_MODULE_DIR/include)

  dnl # --with-my_module -> chech for lib and symbol presence
  dnl LIBNAME=my_module # you may want to change this
  dnl LIBSYMBOL=my_module # you most likely want to change this

  dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
  dnl [
  dnl   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MY_MODULE_DIR/lib, MY_MODULE_SHARED_LIBADD)
  dnl   AC_DEFINE(HAVE_MY_MODULELIB,1,[ ])
  dnl ],[
  dnl   AC_MSG_ERROR([wrong my_module lib version or lib not found])
  dnl ],[
  dnl   -L$MY_MODULE_DIR/lib -lm -ldl
  dnl ])
  dnl
  dnl PHP_SUBST(MY_MODULE_SHARED_LIBADD)

  PHP_NEW_EXTENSION(my_module, my_module.c, $ext_shared)
fi

If you're unfamiliar with M4 files (now is certainly a good time to get familiar), this might be a bit confusing at first; but it's actually quite easy.

Note: Everything prefixed with dnl is treated as a comment and is not parsed.

The config.m4 file is responsible for parsing the command-line options passed to configure at configuration time. This means that it has to check for required external files and do similar configuration and setup tasks.

The default file creates two configuration directives in the configure script: --with-my_module and --enable-my_module. Use the first option when referring external files (such as the --with-apache directive that refers to the Apache directory). Use the second option when the user simply has to decide whether to enable your extension. Regardless of which option you use, you should uncomment the other, unnecessary one; that is, if you're using --enable-my_module, you should remove support for --with-my_module, and vice versa.

By default, the config.m4 file created by ext_skel accepts both directives and automatically enables your extension. Enabling the extension is done by using the PHP_EXTENSION macro. To change the default behavior to include your module into the PHP binary when desired by the user (by explicitly specifying --enable-my_module or --with-my_module), change the test for $PHP_MY_MODULE to == "yes":
if test "$PHP_MY_MODULE" == "yes"; then dnl
    Action.. PHP_EXTENSION(my_module, $ext_shared)
    fi
This would require you to use --enable-my_module each time when reconfiguring and recompiling PHP.

Note: Be sure to run buildconf every time you change config.m4!

We'll go into more details on the M4 macros available to your configuration scripts later in this chapter. For now, we'll simply use the default files.

上一頁 | 首頁 | 下一頁
Complex Types | 上一層 | Creating Extensions


Calling User Functions

PHP 手冊
上一頁 下一頁

章 38. Calling User Functions

You can call user functions from your own modules, which is very handy when implementing callbacks; for example, for array walking, searching, or simply for event-based programs.

User functions can be called with the function call_user_function_ex(). It requires a hash value for the function table you want to access, a pointer to an object (if you want to call a method), the function name, return value, number of arguments, argument array, and a flag indicating whether you want to perform zval separation.

ZEND_API int call_user_function_ex(HashTable *function_table, zval *object,
zval *function_name, zval **retval_ptr_ptr,
int param_count, zval **params[],
int no_separation);

Note that you don't have to specify both function_table and object; either will do. If you want to call a method, you have to supply the object that contains this method, in which case call_user_function()automatically sets the function table to this object's function table. Otherwise, you only need to specify function_table and can set object to NULL.

Usually, the default function table is the "root" function table containing all function entries. This function table is part of the compiler globals and can be accessed using the macro CG. To introduce the compiler globals to your function, call the macro TSRMLS_FETCH once.

The function name is specified in a zval container. This might be a bit surprising at first, but is quite a logical step, since most of the time you'll accept function names as parameters from calling functions within your script, which in turn are contained in zval containers again. Thus, you only have to pass your arguments through to this function. This zval must be of type IS_STRING.

The next argument consists of a pointer to the return value. You don't have to allocate memory for this container; the function will do so by itself. However, you have to destroy this container (using zval_dtor()) afterward!

Next is the parameter count as integer and an array containing all necessary parameters. The last argument specifies whether the function should perform zval separation - this should always be set to 0. If set to 1, the function consumes less memory but fails if any of the parameters need separation.

例子 38-1 shows a small demonstration of calling a user function. The code calls a function that's supplied to it as argument and directly passes this function's return value through as its own return value. Note the use of the constructor and destructor calls at the end - it might not be necessary to do it this way here (since they should be separate values, the assignment might be safe), but this is bulletproof.

例子 38-1. Calling user functions.

zval **function_name;
zval *retval;

if((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, &function_name) != SUCCESS))
{
    WRONG_PARAM_COUNT;
}

if((*function_name)->type != IS_STRING)
{
    zend_error(E_ERROR, "Function requires string argument");
}

TSRMSLS_FETCH();

if(call_user_function_ex(CG(function_table), NULL, *function_name, &retval, 0, NULL, 0) != SUCCESS)
{
    zend_error(E_ERROR, "Function call failed");
}

zend_printf("We have %i as type<br>", retval->type);

*return_value = *retval;
zval_copy_ctor(return_value);
zval_ptr_dtor(&retval);

<?php

dl("call_userland.so");

function test_function()
{

    print("We are in the test function!<br>");

    return("hello");

}

$return_value = call_userland("test_function");

print("Return value: \"$return_value\"<br>");
?>

上一頁 | 首頁 | 下一頁
Startup and Shutdown Functions | 上一層 | Initialization File Support


Reference: Some Configuration Macros

PHP 手冊
上一頁 下一頁

章 41. Reference: Some Configuration Macros

目錄
config.m4

config.m4

The file config.m4 is processed by buildconf and must contain all the instructions to be executed during configuration. For example, these can include tests for required external files, such as header files, libraries, and so on. PHP defines a set of macros that can be used in this process, the most useful of which are described in 表格 41-1.

表格 41-1. M4 Macros for config.m4

Macro | Description
AC_MSG_CHECKING(message) | Prints a "checking <message>" text during configure.
AC_MSG_RESULT(value) | Gives the result to AC_MSG_CHECKING; should specify either yes or no as value.
AC_MSG_ERROR(message) | Prints message as error message during configure and aborts the script.
AC_DEFINE(name,value,description) | Adds #define to php_config.h with the value of value and a comment that says description (this is useful for conditional compilation of your module).
AC_ADD_INCLUDE(path) | Adds a compiler include path; for example, used if the module needs to add search paths for header files.
AC_ADD_LIBRARY_WITH_PATH(libraryname,librarypath) | Specifies an additional library to link.
AC_ARG_WITH(modulename,description,unconditionaltest,conditionaltest) | Quite a powerful macro, adding the module with description to the configure --help output. PHP checks whether the option --with-<modulename> is given to the configure script. If so, it runs the script unconditionaltest (for example, --with-myext=yes), in which case the value of the option is contained in the variable $withval. Otherwise, it executes conditionaltest.
PHP_EXTENSION(modulename, [shared]) | This macro is a must to call for PHP to configure your extension. You can supply a second argument in addition to your module name, indicating whether you intend compilation as a shared module. This will result in a definition at compile time for your source as COMPILE_DL_<modulename>.
上一頁 | 首頁 | 下一頁
Where to Go from Here | 上一層 | API Macros


Duplicating Variable Contents: The Copy Constructor

PHP 手冊
上一頁 下一頁

章 34. Duplicating Variable Contents: The Copy Constructor

Sooner or later, you may need to assign the contents of one zval container to another. This is easier said than done, since the zval container doesn't contain only type information, but also references to places in Zend's internal data. For example, depending on their size, arrays and objects may be nested with lots of hash table entries. By assigning one zval to another, you avoid duplicating the hash table entries, using only a reference to them (at most).

To copy this complex kind of data, use the copy constructor. Copy constructors are typically defined in languages that support operator overloading, with the express purpose of copying complex types. If you define an object in such a language, you have the possibility of overloading the "=" operator, which is usually responsible for assigning the contents of the lvalue (result of the evaluation of the left side of the operator) to the rvalue (same for the right side).

Overloading means assigning a different meaning to this operator, and is usually used to assign a function call to an operator. Whenever this operator would be used on such an object in a program, this function would be called with the lvalue and rvalue as parameters. Equipped with that information, it can perform the operation it intends the "=" operator to have (usually an extended form of copying).

This same form of "extended copying" is also necessary for PHP's zval containers. Again, in the case of an array, this extended copying would imply re-creation of all hash table entries relating to this array. For strings, proper memory allocation would have to be assured, and so on.

Zend ships with such a function, called zend_copy_ctor() (the previous PHP equivalent was pval_copy_constructor()).

A most useful demonstration is a function that accepts a complex type as argument, modifies it, and then returns the argument:

zval *parameter;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &parameter) == FAILURE)
   return;
}

// do modifications to the parameter here

// now we want to return the modified container:
*return_value == *parameter;
zval_copy_ctor(return_value);

The first part of the function is plain-vanilla argument retrieval. After the (left out) modifications, however, it gets interesting: The container of parameter is assigned to the (predefined) return_value container. Now, in order to effectively duplicate its contents, the copy constructor is called. The copy constructor works directly with the supplied argument, and the standard return values are FAILURE on failure and SUCCESS on success.

If you omit the call to the copy constructor in this example, both parameter and return_value would point to the same internal data, meaning that return_value would be an illegal additional reference to the same data structures. Whenever changes occurred in the data that parameter points to, return_value might be affected. Thus, in order to create separate copies, the copy constructor must be used.

The copy constructor's counterpart in the Zend API, the destructor zval_dtor(), does the opposite of the constructor.

上一頁 | 首頁 | 下一頁
Creating Constants | 上一層 | Returning Values


Creating Extensions

PHP 手冊
上一頁 下一頁

章 28. Creating Extensions

目錄
Compiling Modules

We'll start with the creation of a very simple extension at first, which basically does nothing more than implement a function that returns the integer it receives as parameter. 例子 28-1 shows the source.

例子 28-1. A simple extension.

/* include standard header */
#include "php.h"

/* declaration of functions to be exported */
ZEND_FUNCTION(first_module);

/* compiled function list so Zend knows what's in this module */
zend_function_entry firstmod_functions[] =
{
    ZEND_FE(first_module, NULL)
    {NULL, NULL, NULL}
};

/* compiled module information */
zend_module_entry firstmod_module_entry =
{
    STANDARD_MODULE_HEADER,
    "First Module",
    firstmod_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NO_VERSION_YET,
    STANDARD_MODULE_PROPERTIES
};

/* implement standard "stub" routine to introduce ourselves to Zend */
#if COMPILE_DL_FIRST_MODULE
ZEND_GET_MODULE(firstmod)
#endif

/* implement function that is meant to be made available to PHP */
ZEND_FUNCTION(first_module)
{
    long parameter;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &parameter) == FAILURE) {
        return;
    }

    RETURN_LONG(parameter);
}

This code contains a complete PHP module. We'll explain the source code in detail shortly, but first we'd like to discuss the build process. (This will allow the impatient to experiment before we dive into API discussions.)

註: The example source makes use of some features introduced with the Zend version used in PHP 4.1.0 and above, it won't compile with older PHP 4.0.x versions.

Compiling Modules

There are basically two ways to compile modules:

  • Use the provided "make" mechanism in the ext directory, which also allows building of dynamic loadable modules.

  • Compile the sources manually.

The first method should definitely be favored, since, as of PHP 4.0, this has been standardized into a sophisticated build process. The fact that it is so sophisticated is also its drawback, unfortunately - it's hard to understand at first. We'll provide a more detailed introduction to this later in the chapter, but first let's work with the default files.

The second method is good for those who (for some reason) don't have the full PHP source tree available, don't have access to all files, or just like to juggle with their keyboard. These cases should be extremely rare, but for the sake of completeness we'll also describe this method.

Compiling Using Make. To compile the sample sources using the standard mechanism, copy all their subdirectories to the ext directory of your PHP source tree. Then run buildconf, which will create an updated configure script containing appropriate options for the new extension. By default, all the sample sources are disabled, so you don't have to fear breaking your build process.

After you run buildconf, configure --help shows the following additional modules:

--enable-array_experiments   BOOK: Enables array experiments
  --enable-call_userland       BOOK: Enables userland module
  --enable-cross_conversion    BOOK: Enables cross-conversion module
  --enable-first_module        BOOK: Enables first module
  --enable-infoprint           BOOK: Enables infoprint module
  --enable-reference_test      BOOK: Enables reference test module
  --enable-resource_test       BOOK: Enables resource test module
  --enable-variable_creation   BOOK: Enables variable-creation module

The module shown earlier in 例子 28-1 can be enabled with --enable-first_module or --enable-first_module=yes.

Compiling Manually. To compile your modules manually, you need the following commands:

Action | Command
Compiling | cc -fpic -DCOMPILE_DL=1 -I/usr/local/include -I. -I.. -I../Zend -c -o <your_object_file> <your_c_file>
Linking | cc -shared -L/usr/local/lib -rdynamic -o <your_module_file> <your_object_file(s)>

The command to compile the module simply instructs the compiler to generate position-independent code (-fpic shouldn't be omitted) and additionally defines the constant COMPILE_DL to tell the module code that it's compiled as a dynamically loadable module (the test module above checks for this; we'll discuss it shortly). After these options, it specifies a number of standard include paths that should be used as the minimal set to compile the source files.

Note: All include paths in the example are relative to the directory ext. If you're compiling from another directory, change the pathnames accordingly. Required items are the PHP directory, the Zend directory, and (if necessary), the directory in which your module resides.

The link command is also a plain vanilla command instructing linkage as a dynamic module.

You can include optimization options in the compilation command, although these have been omitted in this example (but some are included in the makefile template described in an earlier section).

Note: Compiling and linking manually as a static module into the PHP binary involves very long instructions and thus is not discussed here. (It's not very efficient to type all those commands.)

上一頁 | 首頁 | 下一頁
PHP's Automatic Build System | 上一層 | Using Extensions


Initialization File Support

PHP 手冊
上一頁 下一頁

章 39. Initialization File Support

PHP 4 features a redesigned initialization file support. It's now possible to specify default initialization entries directly in your code, read and change these values at runtime, and create message handlers for change notifications.

To create an .ini section in your own module, use the macros PHP_INI_BEGIN() to mark the beginning of such a section and PHP_INI_END() to mark its end. In between you can use PHP_INI_ENTRY() to create entries.
PHP_INI_BEGIN()
PHP_INI_ENTRY("first_ini_entry",  "has_string_value", PHP_INI_ALL, NULL)
PHP_INI_ENTRY("second_ini_entry", "2",                PHP_INI_SYSTEM, OnChangeSecond)
PHP_INI_ENTRY("third_ini_entry",  "xyz",              PHP_INI_USER, NULL)
PHP_INI_END()
The PHP_INI_ENTRY() macro accepts four parameters: the entry name, the entry value, its change permissions, and a pointer to a change-notification handler. Both entry name and value must be specified as strings, regardless of whether they really are strings or integers.

The permissions are grouped into three sections:PHP_INI_SYSTEM allows a change only directly in the php.ini file; PHP_INI_USER allows a change to be overridden by a user at runtime using additional configuration files, such as .htaccess; and PHP_INI_ALL allows changes to be made without restrictions. There's also a fourth level, PHP_INI_PERDIR, for which we couldn't verify its behavior yet.

The fourth parameter consists of a pointer to a change-notification handler. Whenever one of these initialization entries is changed, this handler is called. Such a handler can be declared using the PHP_INI_MH macro:
PHP_INI_MH(OnChangeSecond);             // handler for ini-entry "second_ini_entry"

// specify ini-entries here

PHP_INI_MH(OnChangeSecond)
{

    zend_printf("Message caught, our ini entry has been changed to %s<br>", new_value);

    return(SUCCESS);

}
The new value is given to the change handler as string in the variable new_value. When looking at the definition of PHP_INI_MH, you actually have a few parameters to use:
#define PHP_INI_MH(name) int name(php_ini_entry *entry, char *new_value,
                                  uint new_value_length, void *mh_arg1,
                                  void *mh_arg2, void *mh_arg3)
All these definitions can be found in php_ini.h. Your message handler will have access to a structure that contains the full entry, the new value, its length, and three optional arguments. These optional arguments can be specified with the additional macros PHP_INI_ENTRY1 (allowing one additional argument), PHP_INI_ENTRY2 (allowing two additional arguments), and PHP_INI_ENTRY3 (allowing three additional arguments).

The change-notification handlers should be used to cache initialization entries locally for faster access or to perform certain tasks that are required if a value changes. For example, if a constant connection to a certain host is required by a module and someone changes the hostname, automatically terminate the old connection and attempt a new one.

Access to initialization entries can also be handled with the macros shown in 表格 39-1.

表格 39-1. Macros to Access Initialization Entries in PHP

Macro | Description
INI_INT(name) | Returns the current value of entry name as integer (long).
INI_FLT(name) | Returns the current value of entry name as float (double).
INI_STR(name) | Returns the current value of entry name as string. Note: This string is not duplicated, but instead points to internal data. Further access requires duplication to local memory.
INI_BOOL(name) | Returns the current value of entry name as Boolean (defined as zend_bool, which currently means unsigned char).
INI_ORIG_INT(name) | Returns the original value of entry name as integer (long).
INI_ORIG_FLT(name) | Returns the original value of entry name as float (double).
INI_ORIG_STR(name) | Returns the original value of entry name as string. Note: This string is not duplicated, but instead points to internal data. Further access requires duplication to local memory.
INI_ORIG_BOOL(name) | Returns the original value of entry name as Boolean (defined as zend_bool, which currently means unsigned char).

Finally, you have to introduce your initialization entries to PHP. This can be done in the module startup and shutdown functions, using the macros REGISTER_INI_ENTRIES() and UNREGISTER_INI_ENTRIES():
ZEND_MINIT_FUNCTION(mymodule)
{

    REGISTER_INI_ENTRIES();

}

ZEND_MSHUTDOWN_FUNCTION(mymodule)
{

    UNREGISTER_INI_ENTRIES();

}

上一頁 | 首頁 | 下一頁
Calling User Functions | 上一層 | Where to Go from Here


Source Layout

PHP 手冊
上一頁 下一頁

章 26. Source Layout

目錄
Extension Conventions
Macros
Memory Management
Directory and File Functions
String Handling
Complex Types

註: Prior to working through the rest of this chapter, you should retrieve clean, unmodified source trees of your favorite Web server. We're working with Apache (available at http://www.apache.org/) and, of course, with PHP (available at http://www.php.net/ - does it need to be said?).

Make sure that you can compile a working PHP environment by yourself! We won't go into this issue here, however, as you should already have this most basic ability when studying this chapter.

Before we start discussing code issues, you should familiarize yourself with the source tree to be able to quickly navigate through PHP's files. This is a must-have ability to implement and debug extensions.

The following table describes the contents of the major directories.

Directory | Contents
php4 | Main PHP source files and main header files; here you'll find all of PHP's API definitions, macros, etc. (important). Everything else is below this directory.
php4/ext | Repository for dynamic and built-in modules; by default, these are the "official" PHP modules that have been integrated into the main source tree. From PHP 4.0, it's possible to compile these standard extensions as dynamic loadable modules (at least, those that support it).
php4/main | This directory contains the main php macros and definitions. (important)
php4/pear | Directory for the PHP Extension and Application Repository. This directory contains core PEAR files.
php4/sapi | Contains the code for the different server abstraction layers.
php4/TSRM | Location of the "Thread Safe Resource Manager" (TSRM) for Zend and PHP.
php4/Zend | Location of the Zend Engine files; here you'll find all of Zend's API definitions, macros, etc. (important).

Discussing all the files included in the PHP package is beyond the scope of this chapter. However, you should take a close look at the following files:

  • php4/main/php.h, located in the main PHP directory. This file contains most of PHP's macro and API definitions.

  • php4/Zend/zend.h, located in the main Zend directory. This file contains most of Zend's macros and definitions.

  • php4/Zend/zend_API.h, also located in the Zend directory, which defines Zend's API.

You should also follow some sub-inclusions from these files; for example, the ones relating to the Zend executor, the PHP initialization file support, and such. After reading these files, take the time to navigate around the package a little to see the interdependencies of all files and modules - how they relate to each other and especially how they make use of each other. This also helps you to adapt to the coding style in which PHP is authored. To extend PHP, you should quickly adapt to this style.

Extension Conventions

Zend is built using certain conventions; to avoid breaking its standards, you should follow the rules described in the following sections.

上一頁 | 首頁 | 下一頁
The Zend Engine | 上一層 | Macros


Overview

PHP 手冊
上一頁 下一頁

章 24. Overview

目錄
What Is Zend? and What Is PHP?

"Extending PHP" is easier said than done. PHP has evolved to a full-fledged tool consisting of a few megabytes of source code, and to hack a system like this quite a few things have to be learned and considered. When structuring this chapter, we finally decided on the "learn by doing" approach. This is not the most scientific and professional approach, but the method that's the most fun and gives the best end results. In the following sections, you'll learn quickly how to get the most basic extensions to work almost instantly. After that, you'll learn about Zend's advanced API functionality. The alternative would have been to try to impart the functionality, design, tips, tricks, etc. as a whole, all at once, thus giving a complete look at the big picture before doing anything practical. Although this is the "better" method, as no dirty hacks have to be made, it can be very frustrating as well as energy- and time-consuming, which is why we've decided on the direct approach.

Note that even though this chapter tries to impart as much knowledge as possible about the inner workings of PHP, it's impossible to really give a complete guide to extending PHP that works 100% of the time in all cases. PHP is such a huge and complex package that its inner workings can only be understood if you make yourself familiar with it by practicing, so we encourage you to work with the source.

What Is Zend? and What Is PHP?

The name Zend refers to the language engine, PHP's core. The term PHP refers to the complete system as it appears from the outside. This might sound a bit confusing at first, but it's not that complicated (see 圖形 24-1). To implement a Web script interpreter, you need three parts:

  1. The interpreter part analyzes the input code, translates it, and executes it.

  2. The functionality part implements the functionality of the language (its functions, etc.).

  3. The interface part talks to the Web server, etc.

Zend takes part 1 completely and a bit of part 2; PHP takes parts 2 and 3. Together they form the complete PHP package. Zend itself really forms only the language core, implementing PHP at its very basics with some predefined functions. PHP contains all the modules that actually create the language's outstanding capabilities.

圖形 24-1. The internal structure of PHP.

The following sections discuss where PHP can be extended and how it's done.

上一頁 | 首頁 | 下一頁
Extending PHP 4.0 | 上一層 | Extension Possibilities


Extension Possibilities

PHP 手冊
上一頁 下一頁

章 25. Extension Possibilities

目錄
External Modules
Built-in Modules
The Zend Engine

As shown in 圖形 24-1 above, PHP can be extended primarily at three points: external modules, built-in modules, and the Zend engine. The following sections discuss these options.

External Modules

External modules can be loaded at script runtime using the function dl(). This function loads a shared object from disk and makes its functionality available to the script to which it's being bound. After the script is terminated, the external module is discarded from memory. This method has both advantages and disadvantages, as described in the following table:

Advantages | Disadvantages
External modules don't require recompiling of PHP. | The shared objects need to be loaded every time a script is being executed (every hit), which is very slow.
The size of PHP remains small by "outsourcing" certain functionality. | External additional files clutter up the disk.
 | Every script that wants to use an external module's functionality has to specifically include a call to dl(), or the extension tag in php.ini needs to be modified (which is not always a suitable solution).

To sum up, external modules are great for third-party products, small additions to PHP that are rarely used, or just for testing purposes. To develop additional functionality quickly, external modules provide the best results. For frequent usage, larger implementations, and complex code, the disadvantages outweigh the advantages.

Third parties might consider using the extension tag in php.ini to create additional external modules to PHP. These external modules are completely detached from the main package, which is a very handy feature in commercial environments. Commercial distributors can simply ship disks or archives containing only their additional modules, without the need to create fixed and solid PHP binaries that don't allow other modules to be bound to them.

上一頁 | 首頁 | 下一頁
Overview | 上一層 | Built-in Modules


Printing Information

PHP 手冊
上一頁 下一頁

章 36. Printing Information

目錄
zend_printf()
zend_error()
Including Output in phpinfo()
Execution Information

Often it's necessary to print messages to the output stream from your module, just as print() would be used within a script. PHP offers functions for most generic tasks, such as printing warning messages, generating output for phpinfo(), and so on. The following sections provide more details. Examples of these functions can be found on the CD-ROM.

zend_printf()

zend_printf() works like the standard printf(), except that it prints to Zend's output stream.

上一頁 | 首頁 | 下一頁
Returning Values | 上一層 | zend_error()


Returning Values

PHP 手冊
上一頁 下一頁

章 35. Returning Values

Returning values from your functions to PHP was described briefly in an earlier section; this section gives the details. Return values are passed via the return_value variable, which is passed to your functions as argument. The return_value argument consists of a zval container (see the earlier discussion of the call interface) that you can freely modify. The container itself is already allocated, so you don't have to run MAKE_STD_ZVAL on it. Instead, you can access its members directly.

To make returning values from functions easier and to prevent hassles with accessing the internal structures of the zval container, a set of predefined macros is available (as usual). These macros automatically set the correspondent type and value, as described in 表格 35-1 and 表格 35-2.

註: The macros in 表格 35-1 automatically return from your function, those in 表格 35-2 only set the return value; they don't return from your function.

表格 35-1. Predefined Macros for Returning Values from a Function

Macro | Description
RETURN_RESOURCE(resource) | Returns a resource.
RETURN_BOOL(bool) | Returns a Boolean.
RETURN_NULL() | Returns nothing (a NULL value).
RETURN_LONG(long) | Returns a long.
RETURN_DOUBLE(double) | Returns a double.
RETURN_STRING(string, duplicate) | Returns a string. The duplicate flag indicates whether the string should be duplicated using estrdup().
RETURN_STRINGL(string, length, duplicate) | Returns a string of the specified length; otherwise, behaves like RETURN_STRING. This macro is faster and binary-safe, however.
RETURN_EMPTY_STRING() | Returns an empty string.
RETURN_FALSE | Returns Boolean false.
RETURN_TRUE | Returns Boolean true.

表格 35-2. Predefined Macros for Setting the Return Value of a Function

Macro | Description
RETVAL_RESOURCE(resource) | Sets the return value to the specified resource.
RETVAL_BOOL(bool) | Sets the return value to the specified Boolean value.
RETVAL_NULL | Sets the return value to NULL.
RETVAL_LONG(long) | Sets the return value to the specified long.
RETVAL_DOUBLE(double) | Sets the return value to the specified double.
RETVAL_STRING(string, duplicate) | Sets the return value to the specified string and duplicates it to Zend internal memory if desired (see also RETURN_STRING).
RETVAL_STRINGL(string, length, duplicate) | Sets the return value to the specified string and forces the length to become length (see also RETVAL_STRING). This macro is faster and binary-safe, and should be used whenever the string length is known.
RETVAL_EMPTY_STRING | Sets the return value to an empty string.
RETVAL_FALSE | Sets the return value to Boolean false.
RETVAL_TRUE | Sets the return value to Boolean true.

Complex types such as arrays and objects can be returned by using array_init() and object_init(), as well as the corresponding hash functions on return_value. Since these types cannot be constructed of trivial information, there are no predefined macros for them.

上一頁 | 首頁 | 下一頁
Duplicating Variable Contents: The Copy Constructor | 上一層 | Printing Information


Startup and Shutdown Functions

PHP 手冊
上一頁 下一頁

章 37. Startup and Shutdown Functions

Startup and shutdown functions can be used for one-time initialization and deinitialization of your modules. As discussed earlier in this chapter (see the description of the Zend module descriptor block), there are global, module, and request startup and shutdown events.

The global startup functions are called once when PHP starts up; similarly, the global shutdown functions are called once when PHP shuts down. Please note that they're really only called once, not when a new Apache process is being created!

The module startup and shutdown functions are called whenever a module is loaded and needs initialization; the request startup and shutdown functions are called every time a request is processed (meaning that a file is being executed).

For dynamic extensions, module and request startup/shutdown events happen at the same time.

Declaration and implementation of these functions can be done with macros; see the earlier section "Declaration of the Zend Module Block" for details.

上一頁 | 首頁 | 下一頁
Execution Information | 上一層 | Calling User Functions


Source Discussion

PHP 手冊
上一頁 下一頁

章 31. Source Discussion

目錄
Module Structure
Header File Inclusions
Declaring Exported Functions
Declaration of the Zend Function Block
Declaration of the Zend Module Block
Creation of get_module()
Implementation of All Exported Functions
Summary

Now that you've got a safe build environment and you're able to include the modules into PHP files, it's time to discuss how everything works.

Module Structure

All PHP modules follow a common structure:

  • Header file inclusions (to include all required macros, API definitions, etc.)

  • C declaration of exported functions (required to declare the Zend function block)

  • Declaration of the Zend function block

  • Declaration of the Zend module block

  • Implementation of get_module()

  • Implementation of all exported functions

上一頁 | 首頁 | 下一頁
Troubleshooting | 上一層 | Header File Inclusions


Troubleshooting

PHP 手冊
上一頁 下一頁

章 30. Troubleshooting

Actually, not much troubleshooting can be done when compiling static or dynamic modules. The only problem that could arise is that the compiler will complain about missing definitions or something similar. In this case, make sure that all header files are available and that you specified their path correctly in the compilation command. To be sure that everything is located correctly, extract a clean PHP source tree and use the automatic build in the ext directory with the fresh files; this will guarantee a safe compilation environment. If this fails, try manual compilation.

PHP might also complain about missing functions in your module. (This shouldn't happen with the sample sources if you didn't modify them.) If the names of external functions you're trying to access from your module are misspelled, they'll remain as "unlinked symbols" in the symbol table. During dynamic loading and linkage by PHP, they won't resolve because of the typing errors - there are no corresponding symbols in the main binary. Look for incorrect declarations in your module file or incorrectly written external references. Note that this problem is specific to dynamic loadable modules; it doesn't occur with static modules. Errors in static modules show up at compile time.

上一頁 | 首頁 | 下一頁
Using Extensions | 上一層 | Source Discussion


Using Extensions

PHP 手冊
上一頁 下一頁

章 29. Using Extensions

Depending on the build process you selected, you should either end up with a new PHP binary to be linked into your Web server (or run as CGI), or with an .so (shared object) file. If you compiled the example file first_module.c as a shared object, your result file should be first_module.so. To use it, you first have to copy it to a place from which it's accessible to PHP. For a simple test procedure, you can copy it to your htdocs directory and try it with the source in 例子 29-1. If you compiled it into the PHP binary, omit the call to dl(), as the module's functionality is instantly available to your scripts.

警告

For security reasons, you should not put your dynamic modules into publicly accessible directories. Even though it can be done and it simplifies testing, you should put them into a separate directory in production environments.

例子 29-1. A test file for first_module.so.

<?php

// remove next comment if necessary
// dl("first_module.so");

$param = 2;
$return = first_module($param);

print("We sent '$param' and got '$return'");

?>

Calling this PHP file in your Web browser should give you the output shown in 圖形 29-1.

圖形 29-1. Output of first_module.php.

If required, the dynamic loadable module is loaded by calling the dl() function. This function looks for the specified shared object, loads it, and makes its functions available to PHP. The module exports the function first_module(), which accepts a single parameter, converts it to an integer, and returns the result of the conversion.

If you've gotten this far, congratulations! You just built your first extension to PHP.

上一頁 | 首頁 | 下一頁
Creating Extensions | 上一層 | Troubleshooting


Creating Variables

PHP 手冊
上一頁 下一頁

章 33. Creating Variables

目錄
Overview
Longs (Integers)
Doubles (Floats)
Strings
Booleans
Arrays
Objects
Resources
Macros for Automatic Global Variable Creation
Creating Constants

When exchanging data from your own extensions with PHP scripts, one of the most important issues is the creation of variables. This section shows you how to deal with the variable types that PHP supports.

Overview

To create new variables that can be seen "from the outside" by the executing script, you need to allocate a new zval container, fill this container with meaningful values, and then introduce it to Zend's internal symbol table. This basic process is common to all variable creations:

zval *new_variable;

/* allocate and initialize new container */
MAKE_STD_ZVAL(new_variable);

/* set type and variable contents here, see the following sections */

/* introduce this variable by the name "new_variable_name" into the symbol table */
ZEND_SET_SYMBOL(EG(active_symbol_table), "new_variable_name", new_variable);

/* the variable is now accessible to the script by using $new_variable_name */

The macro MAKE_STD_ZVAL allocates a new zval container using ALLOC_ZVAL and initializes it using INIT_ZVAL. As implemented in Zend at the time of this writing, initializing means setting the reference count to 1 and clearing the is_ref flag, but this process could be extended later - this is why it's a good idea to keep using MAKE_STD_ZVAL instead of only using ALLOC_ZVAL. If you want to optimize for speed (and you don't have to explicitly initialize the zval container here), you can use ALLOC_ZVAL, but this isn't recommended because it doesn't ensure data integrity.

ZEND_SET_SYMBOL takes care of introducing the new variable to Zend's symbol table. This macro checks whether the value already exists in the symbol table and converts the new symbol to a reference if so (with automatic deallocation of the old zval container). This is the preferred method if speed is not a crucial issue and you'd like to keep memory usage low.

Note that ZEND_SET_SYMBOL makes use of the Zend executor globals via the macro EG. By specifying EG(active_symbol_table), you get access to the currently active symbol table, dealing with the active, local scope. The local scope may differ depending on whether the function was invoked from within a function.

If you need to optimize for speed and don't care about optimal memory usage, you can omit the check for an existing variable with the same value and instead force insertion into the symbol table by using zend_hash_update():
zval *new_variable;

/* allocate and initialize new container */
MAKE_STD_ZVAL(new_variable);

/* set type and variable contents here, see the following sections */

/* introduce this variable by the name "new_variable_name" into the symbol table */
zend_hash_update(
    EG(active_symbol_table),
    "new_variable_name",
    strlen("new_variable_name") + 1,
    &new_variable,
    sizeof(zval *),
    NULL
);
This is actually the standard method used in most modules.

The variables generated with the snippet above will always be of local scope, so they reside in the context in which the function has been called. To create new variables in the global scope, use the same method but refer to another symbol table:
zval *new_variable;

// allocate and initialize new container
MAKE_STD_ZVAL(new_variable);

//
// set type and variable contents here
//

// introduce this variable by the name "new_variable_name" into the global symbol table
ZEND_SET_SYMBOL(&EG(symbol_table), "new_variable_name", new_variable);
The macro ZEND_SET_SYMBOL is now being called with a reference to the main, global symbol table by referring EG(symbol_table).

Note: The active_symbol_table variable is a pointer, but symbol_table is not. This is why you have to use EG(active_symbol_table) and &EG(symbol_table) as parameters to ZEND_SET_SYMBOL - it requires a pointer.

Similarly, to get a more efficient version, you can hardcode the symbol table update:
zval *new_variable;

// allocate and initialize new container
MAKE_STD_ZVAL(new_variable);

//
// set type and variable contents here
//

// introduce this variable by the name "new_variable_name" into the global symbol table
zend_hash_update(
    &EG(symbol_table),
    "new_variable_name",
    strlen("new_variable_name") + 1,
    &new_variable,
    sizeof(zval *),
    NULL
);
例子 33-1 shows a sample source that creates two variables - local_variable with a local scope and global_variable with a global scope (see Figure 9.7). The full example can be found on the CD-ROM.

Note: You can see that the global variable is actually not accessible from within the function. This is because it's not imported into the local scope using global $global_variable; in the PHP source.

例子 33-1. Creating variables with different scopes.

ZEND_FUNCTION(variable_creation)
{
    zval *new_var1, *new_var2;

    MAKE_STD_ZVAL(new_var1);
    MAKE_STD_ZVAL(new_var2);

    ZVAL_LONG(new_var1, 10);
    ZVAL_LONG(new_var2, 5);

    ZEND_SET_SYMBOL(EG(active_symbol_table), "local_variable", new_var1);
    ZEND_SET_SYMBOL(&EG(symbol_table), "global_variable", new_var2);

    RETURN_NULL();

}

上一頁 | 首頁 | 下一頁
Assuring Write Safety for Other Parameters | 上一層 | Longs (Integers)


Where to Go from Here

PHP 手冊
上一頁 下一頁

章 40. Where to Go from Here

You've learned a lot about PHP. You now know how to create dynamic loadable modules and statically linked extensions. You've learned how PHP and Zend deal with internal storage of variables and how you can create and access these variables. You know quite a set of tool functions that do a lot of routine tasks such as printing informational texts, automatically introducing variables to the symbol table, and so on.

Even though this chapter often had a mostly "referential" character, we hope that it gave you insight on how to start writing your own extensions. For the sake of space, we had to leave out a lot; we suggest that you take the time to study the header files and some modules (especially the ones in the ext/standard directory and the MySQL module, as these implement commonly known functionality). This will give you an idea of how other people have used the API functions - particularly those that didn't make it into this chapter.

上一頁 | 首頁 | 下一頁
Initialization File Support | 上一層 | Reference: Some Configuration Macros


進階SQL - 1Keydata SQL 語法教學

進階SQL
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源
﻿

在這一部分，我們將介紹以下的 SQL 概念及關鍵字：

  • SQL UNION
  • SQL UNION ALL
  • SQL INTERSECT
  • SQL MINUS
  • SQL Subquery
  • SQL EXISTS
  • SQL CASE

我們並介紹如何用 SQL 來做出以下的運算：

  • 排名 (Rank)
  • 中位數 (Median)
  • 累積總計 (Running Total)
  • 總合百分比 (Percent to Total)
  • 累積總合百分比 (Cumulative Percent to Total)

下一頁：SQL UNION

Copyright © 2013 1keydata.com 版權所有


SQL ALTER TABLE - 1Keydata SQL 語法教學

SQL Alter Table
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

在表格被建立在資料庫中後，我們常常會發現，這個表格的結構需要有所改變。常見的改變如下：

  • 加一個欄位
  • 刪去一個欄位
  • 改變欄位名稱
  • 改變欄位的資料種類

以上列出的改變並不是所有可能的改變。ALTER TABLE 也可以被用來作其他的改變，例如改變主鍵定義。

ALTER TABLE 的語法如下：

ALTER TABLE "table_name"
[改變方式];

[改變方式] 的詳細寫法會依我們想要達到的目標而有所不同。再以上列出的改變中，[改變方式] 如下：

  • 加一個欄位: ADD "欄位 1" "欄位 1 資料種類"
  • 刪去一個欄位: DROP "欄位 1"
  • 改變欄位名稱: CHANGE "原本欄位名" "新欄位名" "新欄位名資料種類"
  • 改變欄位的資料種類: MODIFY "欄位 1" "新資料種類"

以下我們用在CREATE TABLE 一頁建出的 Customer 表格來當作例子：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Address | char(50)
City | char(50)
Country | char(25)
Birth_Date | datetime

第一，我們要加入一個叫做 "Gender" 的欄位。這可以用以下的指令達成：

ALTER TABLE Customer ADD Gender char(1);

這個指令執行後的表格架構是：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Address | char(50)
City | char(50)
Country | char(25)
Birth_Date | datetime
Gender | char(1)

接下來，我們要把 "Address" 欄位改名為 "Addr"。這可以用以下的指令達成：

ALTER TABLE Customer CHANGE Address Addr char(50);

這個指令執行後的表格架構是：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Addr | char(50)
City | char(50)
Country | char(25)
Birth_Date | datetime
Gender | char(1)

再來，我們要將 "Addr" 欄位的資料種類改為 char(30)。這可以用以下的指令達成：

ALTER TABLE Customer MODIFY Addr char(30);

這個指令執行後的表格架構是：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Addr | char(30)
City | char(50)
Country | char(25)
Birth_Date | datetime
Gender | char(1)

最後，我們要刪除 "Gender" 欄位。這可以用以下的指令達成：

ALTER TABLE Customer DROP Gender;

這個指令執行後的表格架構是：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Addr | char(30)
City | char(50)
Country | char(25)
Birth_Date | datetime

下一頁：SQL DROP TABLE

Copyright © 2013 1keydata.com 版權所有


SQL AS - 1Keydata SQL 語法教學

SQL AS
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

在 SQL 別名那一頁，我們介紹了表格別名和欄位別名的語法如下：

SELECT "表格別名"."欄位1" "欄位別名"
FROM "表格名" "表格別名";

AS 關鍵字是用來指定欄位別名或是表格別名的。它是被放在欄位名和欄位別名之間，或是放在表格名和表格別名之間。AS 的語法如下：

SELECT "表格別名"."欄位1" AS "欄位別名"
FROM "表格名" AS "表格別名";

我們來用跟在 SQL 別名那一頁同樣的例子。假設我們有以下的表格，Store_Information,

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們可以運用 AS 這個關鍵字來找出每一間店的營業額總值：

SELECT A1.Store_Name Store, SUM(A1.Sales) AS 'Total Sales'
FROM Store_Information AS A1
GROUP BY A1.Store_Name;

結果：

Store | Total Sales
Los Angeles | 1800
San Diego | 250
Boston | 700

下一頁：SQL 表格連接

Copyright © 2013 1keydata.com 版權所有


SQL平均值 - 1Keydata SQL 語法教學

SQL平均值
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

SQL 用 AVG( ) 函數來計算平均值。計算平均值的語法是：

SELECT AVG("欄位名")
FROM "表格名";

舉例來說，若我們要由我們的範例表格中求出 Sales 欄位的平均值，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT AVG(Sales) FROM Store_Information;

結果:

AVG(Sales)
687.5

687.5 代表所有 Sales 欄位的平均值： (1500 + 250 + 300 + 700) / 4。

下一頁：SQL COUNT

Copyright © 2013 1keydata.com 版權所有


SQL CASE - 1Keydata SQL 語法教學

SQL CASE
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
﻿
﻿

CASE 是 SQL 用來做為 IF-THEN-ELSE 之類邏輯的關鍵字。 CASE 的語法如下：

SELECT CASE ("欄位名")
WHEN "條件1" THEN "結果1"
WHEN "條件2" THEN "結果2"
...
[ELSE "結果N"]
END
FROM "表格名";

"條件" 可以是一個數值或是公式。 ELSE 子句則並不是必須的。

在我們的 Store_Information 中

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
San Francisco | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

若我們要將 'Los Angeles' 的 Sales 數值乘以 2，以及將 'San Diego' 的 Sales 數值乘以 1.5，我們就鍵入以下的 SQL：

SELECT Store_Name, CASE Store_Name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Txn_Date
FROM Store_Information;

"New Sales" 是用到 CASE 那個欄位的欄位名。

結果:

Store_Name | New Sales | Txn_Date
Los Angeles | 3000 | Jan-05-1999
San Diego | 375 | Jan-07-1999
San Francisco | 300 | Jan-08-1999
Boston | 700 | Jan-08-1999

下一頁：SQL 排名

Copyright © 2013 1keydata.com 版權所有


SQL Concatenate 函数 - 1Keydata SQL 語法教學

SQL Concatenate 函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

有的時候，我們有需要將由不同欄位獲得的資料串連在一起。每一種資料庫都有提供方法來達到這個目的：

  • MySQL: CONCAT( )
  • Oracle: CONCAT( ), ||
  • SQL Server: +

CONCAT( ) 的語法如下：

CONCAT(字串1, 字串2, 字串3, ...)

以上語法能將字串1、字串2、字串3，等字串連在一起。請注意，Oracle 的 CONCAT( ) 只允許兩個參數；換言之，一次只能將兩個字串串連起來。不過，在 Oracle 中，我們可以用 '||' 來一次串連多個字串。

來看幾個例子。假設我們有以下的表格：

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

例子1

MySQL/Oracle:

SELECT CONCAT(Region_Name, Store_Name) FROM Geography
WHERE Store_Name = 'Boston';

結果：

'EastBoston'

例子2

Oracle:

SELECT Region_Name || ' ' || Store_Name FROM Geography
WHERE Store_Name = 'Boston';

結果：

'East Boston'

例子3

SQL Server:

SELECT Region_Name + ' ' + Store_Name FROM Geography
WHERE Store_Name = 'Boston';

結果：

'East Boston'

下一頁：SQL Substring 函數

Copyright © 2013 1keydata.com 版權所有


SQL CONSTRAINT - 1Keydata SQL 語法教學

SQL Constraint
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
﻿
﻿

我們可以限制哪一些資料可以存入表格中。這些限制可以在表格初創時藉由 CREATE TABLE 語句來指定，或是之後藉由 ALTER TABLE 語句來指定。

常見的限制有以下幾種：

  • NOT NULL
  • UNIQUE
  • CHECK
  • 主鑑 (Primary Key)
  • 外來鑑 (Foreign Key)

以下對這幾種限制分別做個介紹：

NOT NULL

在沒有做出任何限制的情況下，一個欄位是允許有 NULL 值得。如果我們不允許一個欄位含有 NULL 值，我們就需要對那個欄位做出 NOT NULL 的指定。

舉例來說，在以下的語句中，

CREATE TABLE Customer
(SID integer NOT NULL,
Last_Name varchar (30) NOT NULL,
First_Name varchar(30));

"SID" 和 "Last_Name" 這兩個欄位是不允許有 NULL 值，而 "First_Name" 這個欄位是可以有 NULL 值得。

UNIQUE

UNIQUE 限制是保證一個欄位中的所有資料都是有不一樣的值。

舉例來說，在以下的語句中，

CREATE TABLE Customer
(SID integer UNIQUE,
Last_Name varchar (30),
First_Name varchar(30));

"SID" 欄位不能有重複值存在，而 "Last_Name" 及 "First_Name" 這兩個欄位則是允許有重複值存在。

請注意，一個被指定為主鑑的欄位也一定會含有 UNIQUE 的特性。相對來說，一個 UNIQUE 的欄位並不一定會是一個主鍵。

CHECK

CHECK 限制是保證一個欄位中的所有資料都是符合某些條件。

舉例來說，在以下的語句中，

CREATE TABLE Customer
(SID integer CHECK (SID > 0),
Last_Name varchar (30),
First_Name varchar(30));

"SID" 攔只能包含大於 0 的整數。

請注意，CHECK 限制目前尚未被執行於 MySQL 資料庫上。

主鍵 and 外來鍵 將於下兩頁中討論。

下一頁：SQL 主鍵

Copyright © 2013 1keydata.com 版權所有


SQL CREATE INDEX - 1Keydata SQL 語法教學

SQL Create Index
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

索引 (Index) 可以幫助我們從表格中快速地找到需要的資料。舉例來說，假設我們要在一本園藝書中找如何種植青椒的訊息。若這本書沒有索引的話，那我們是必須要從頭開始讀，直到我們找到有關種直青椒的地方為止。若這本書有索引的話，我們就可以先去索引找出種植青椒的資訊是在哪一頁，然後直接到那一頁去閱讀。很明顯地，運用索引是一種有效且省時的方式。

從資料庫表格中尋找資料也是同樣的原理。如果一個表格沒有索引的話，資料庫系統就需要將整個表格的資料讀出 (這個過程叫做 Table Scan)。若有適當的索引存在，資料庫系統就可以先由這個索引去找出需要的資料是在表格的什麼地方，然後直接去那些地方抓資料。這樣子速度就快多了。

因此，在表格上建立索引是一件有利於系統效率的事。一個索引可以涵蓋一或多個欄位。建立索引的語法如下：

CREATE INDEX "索引名" ON "表格名" (欄位名);

現在假設我們有以下這個表格，

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Address | char(50)
City | char(50)
Country | char(25)
Birth_Date | datetime

若我們要在 Last_Name 這個欄位上建一個索引，我們就打入以下的指令，

CREATE INDEX IDX_CUSTOMER_LAST_NAME
ON Customer (Last_Name);

我們要在 City 及 Country 這兩個欄位上建一個索引，我們就打入以下的指令，

CREATE INDEX IDX_CUSTOMER_LOCATION
ON Customer (City, Country);

索引的命名並沒有一個固定的方式。通常會用的方式是在名稱前加一個字首，例如 "IDX_" ，來避免與資料庫中的其他物件混淆。另外，在索引名之內包括表格名及欄位名也是一個好的方式。

請讀者注意，每個資料庫會有它本身的 CREATE INDEX 語法，而不同資料庫的語法會有不同。因此，在下指令前，請先由資料庫使用手冊中確認正確的語法。

下一頁：SQL ALTER TABLE

Copyright © 2013 1keydata.com 版權所有


SQL CREATE VIEW - 1Keydata SQL 語法教學

SQL Create View
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

視觀表 (View) 可以被當作是虛擬表格。它跟表格的不同是，表格中有實際儲存資料，而視觀表是建立在表格之上的一個架構，它本身並不實際儲存資料。

建立一個視觀表的語法如下：

CREATE VIEW "視觀表名"
AS "SQL SELECT 語句";

"SQL SELECT 語句" 可以是任何一個由 SELECT 開頭的語句。

來看一個例子。假設我們有以下的表格：

Customer 表格
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Address | char(50)
City | char(50)
Country | char(25)
Birth_Date | datetime

若要在這個表格上建立一個包括 First_Name， Last_Name， 和 Country 這三個欄位的視觀表，我們就打入，

CREATE VIEW V_Customer
AS SELECT First_Name, Last_Name, Country
FROM Customer;

現在，我們就有一個叫做 V_Customer 的視觀表：

V_Customer 視觀表
欄位名稱 | 資料種類
First_Name | char(50)
Last_Name | char(50)
Country | char(25)

我們也可以用視觀表來連接兩個表格。在這個情況下，使用者就可以直接由一個視觀表中找出她要的資訊，而不需要由兩個不同的表格中去做一次連接的動作。假設有以下的兩個表格：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

我們就可以用以下的指令來建一個包括每個地區 (Region_Name) 銷售額 (Sales) 的視觀表：

CREATE VIEW V_REGION_SALES
AS SELECT A1.Region_Name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;

這就給我們有一個名為 V_REGION_SALES 的視觀表。這個視觀表包含不同地區的銷售哦。如果我們要從這個視觀表中獲取資料，我們就打入，

SELECT * FROM V_REGION_SALES;

結果：

REGION | SALES
East | 700
West | 2050

下一頁：SQL CREATE INDEX

Copyright © 2013 1keydata.com 版權所有


SQL 累積總合百分比 (Cumulative Percent to Total) - 1Keydata SQL 語法教學

SQL 累積總合百分比
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
﻿
﻿

要用 SQL 累積總合百分比算出，我們運用類似總合百分比的概念。兩者的不同處在於在這個情況下，我們要算出到目前為止的累積總合是所有總合的百分之幾，而不是光看每一筆資料是所有總合的百分之幾。讓我們來看看以下的例子：

Total_Sales 表格
Name | Sales
John | 10
Jennifer | 15
Stella | 20
Sophia | 40
Greg | 50
Jeff | 20

要算出累積總合百分比，我們鍵入：

SELECT a1.Name, a1.Sales, SUM(a2.Sales)/(SELECT SUM(Sales) FROM Total_Sales) Pct_To_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;

結果:

Name | Sales | Pct_To_Total
Greg | 50 | 0.3226
Sophia | 40 | 0.5806
Stella | 20 | 0.7097
Jeff | 20 | 0.8387
Jennifer | 15 | 0.9355
John | 10 | 1.0000

SELECT SUM(Sales) FROM Total_Sales 這一段子查詢是用來算出總合。我們接下來用累積總計 SUM(a2.Sales) 除以總合來求出每一行的累積總合百分比。

Copyright © 2013 1keydata.com 版權所有


SQL EXISTS - 1Keydata SQL 語法教學

SQL EXISTS
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
﻿
﻿

在上一頁中，我們用 IN 來連接內查詢和外查詢。另外有數個方式，例如 >， <， 及 =，都可以用來連接內查詢和外查詢。 EXISTS 也是其中一種方式。這一頁我們將討論 EXISTS 的用法。

基本上， EXISTS 是用來測試內查詢有沒有產生任何結果。如果有的話，系統就會執行外查詢中的 SQL。若是沒有的話，那整個 SQL 語句就不會產生任何結果。

EXISTS 的語法是：

SELECT "欄位1"
FROM "表格1"
WHERE EXISTS
(SELECT *
FROM "表格2"
WHERE "條件");

在內查詢中，我們並不一定要用 * 來選出所有的欄位。我們也可以選擇表格 2 中的任何欄位。這兩種做法最後的結果是一樣的。

來看一個例子。假設我們有以下的兩個表格：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

而我們打入的 SQL 是:

SELECT SUM(Sales) FROM Store_Information
WHERE EXISTS
(SELECT * FROM Geography
WHERE Region_Name = 'West');

我們會得到以下的答案：

SUM(Sales)
2750

乍看之下，這個答案似乎不太正確，因為內查詢有包含一個 [Region_Name = 'West'] 的條件，可是最後的答案並沒有包含這個條件。實際上，這並沒有問題。在這個例子中，內查詢產生了超過一筆的資料，所以 EXISTS 的條件成立，所以外查詢被執行。而外查詢本身並沒有包含 [Region_Name = 'West'] 這個條件。

下一頁：SQL CASE

Copyright © 2013 1keydata.com 版權所有


SQL 外來鍵 - 1Keydata SQL 語法教學

SQL 外來鍵
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

外來鍵是一個(或數個)指向另外一個表格主鍵的欄位。外來鍵的目的是確定資料的參考完整性 (Referential Integrity)。換言之，只有被准許的資料值才會被存入資料庫內。

舉例來說，假設我們有兩個表格：一個 CUSTOMER 表格，裡面記錄了所有顧客的資料；另一個 ORDERS 表格，裡面記錄了所有顧客訂購的資料。在這裡的一個限制，就是所有的訂購資料中的顧客，都一定是要跟在 CUSTOMER 表格中存在。在這裡，我們就會在 ORDERS 表格中設定一個外來鍵，而這個外來鍵是指向 CUSTOMER 表格中的主鍵。這樣一來，我們就可以確定所有在 ORDERS 表格中的顧客都存在 CUSTOMER 表格中。換句話說，ORDERS 表格之中，不能有任何顧客是不存在於 CUSTOMER 表格中的資料。

這兩個表格的結構將會是如下：

CUSTOMER 表格
欄位名 | 性質
SID | 主鍵
Last_Name |
First_Name |

ORDERS 表格
欄位名 | 性質
Order_ID | 主鍵
Order_Date |
Customer_SID | 外來鍵
Amount |

在以上的例子中，ORDERS 表格中的 Customer_SID 欄位是一個指向 CUSTOMER 表格中 SID 欄位的外來鍵。

以下列出幾個在建置 ORDERS 表格時指定外來鍵的方式：

MySQL:

CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
PRIMARY KEY (Order_ID),
FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID));

Oracle:

CREATE TABLE ORDERS
(Order_ID integer PRIMARY KEY,
Order_Date date,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);

SQL Server:

CREATE TABLE ORDERS
(Order_ID integer PRIMARY KEY,
Order_Date datetime,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);

以下的例子則是藉著改變表格架構來指定外來鍵。這裡假設 ORDERS 表格已經被建置，而外來鍵尚未被指定：

MySQL:

ALTER TABLE ORDERS
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);

Oracle:

ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);

SQL Server:

ALTER TABLE ORDERS
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);

下一頁：SQL CREATE VIEW

Copyright © 2013 1keydata.com 版權所有


SQL INTERSECT - 1Keydata SQL 語法教學

SQL INTERSECT
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

和 UNION 指令類似，INTERSECT 也是對兩個 SQL 語句所產生的結果做處理的。不同的地方是， UNION 基本上是一個 OR (如果這個值存在於第一句或是第二句，它就會被選出)，而 INTERSECT 則 比較像 AND (這個值要存在於第一句和第二句才會被選出)。UNION 是聯集，而 INTERSECT 是交集。

INTERSECT 的語法如下：

[SQL 語句 1]
INTERSECT
[SQL 語句 2];

假設我們有以下的兩個表格，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Internet_Sales 表格
Txn_Date | Sales
07-Jan-1999 | 250
10-Jan-1999 | 535
11-Jan-1999 | 320
12-Jan-1999 | 750

而我們要找出哪幾天有店面交易和網路交易。要達到這個目的，我們用以下的 SQL 語句：

SELECT Txn_Date FROM Store_Information
INTERSECT
SELECT Txn_Date FROM Internet_Sales;

結果:

Txn_Date
Jan-07-1999

請注意，在 INTERSECT 指令下，不同的值只會被列出一次。

下一頁：SQL MINUS

Copyright © 2013 1keydata.com 版權所有


SQL Length 函數 - 1Keydata SQL 語法教學

SQL Length 函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
葡萄牙文
義大利文
荷蘭文
﻿
﻿

在 SQL 中，長度函數是用來找出一個字串的長度。這個函數的名稱在不同的資料庫中不完全一樣：

  • MySQL: LENGTH( )
  • Oracle: LENGTH( )
  • SQL Server: LEN( )

長度函數的語法如下：

Length (str)

str 是我們要找出長度的字串。

來看看幾個例子。假設我們有以下的表格：

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

例子1

SELECT Length (Store_Name)
FROM Geography
WHERE Store_Name = 'Los Angeles';

結果:

11

例子2

SELECT Region_Name, Length (Region_Name)
FROM Geography;

結果:

Region_Name | Length(Region_Name)
East | 4
East | 4
West | 4
West | 4

下一頁：SQL Replace 函數

Copyright © 2013 1keydata.com 版權所有


SQL最大值 - 1Keydata SQL 語法教學

SQL最大值
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

SQL 用 MAX( ) 函數來計算一個欄位的最大值。計算最大值的語法是：

SELECT MAX ("欄位名")
FROM "表格名";

舉例來說，若要由我們的範例表格中求出 Sales 欄位的最大值，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們鍵入，

SELECT MAX (Sales) FROM Store_Information;

結果:

MAX (Sales)
1500

1500 代表所有 Sales 欄位 (1500 、250 、300 、700) 內的最大值。

下一頁：SQL 最小值

Copyright © 2013 1keydata.com 版權所有


SQL 中位數 (Median) - 1Keydata SQL 語法教學

SQL 中位數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
法文
﻿
﻿

要算出中位數，我們必須要能夠達成以下幾個目標：

  • 將資料依序排出，並找出每一行資料的排名。
  • 找出『中間』的排名為何。舉例來說，如果總共有 9 筆資料，那中間排名就是 5 (有 4 筆資料比第 5 筆資料大，有 4 筆資料比第 5 筆資料小)。
  • 找出中間排名資料的值。

來看看以下的例子。假設我們有以下的表格：

Total_Sales 表格
Name | Sales
John | 10
Jennifer | 15
Stella | 20
Sophia | 40
Greg | 50
Jeff | 20

要找出中位數，我們就鍵入：

SELECT Sales Median FROM
(SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales desc) a3
WHERE Rank = (SELECT (COUNT(*)+1) DIV 2 FROM Total_Sales);

結果:

Median
20

讀者將會發現，第 2 行到第 6 行是跟產生 排名 的語句完全一樣。第 7 行則是算出中間的排名。DIV 是在 MySQL 中算出商的方式。在不同的資料庫中會有不同的方式求商。第 1 行則是列出排名中間的資料值。

下一頁：SQL 累積總計

Copyright © 2013 1keydata.com 版權所有


SQL最小值 - 1Keydata SQL 語法教學

SQL最小值
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

SQL 用 MIN( ) 函數來計算一個欄位的最小值。計算最大值的語法是：

SELECT MIN ("欄位名")
FROM "表格名";

舉例來說，若我們要由我們的範例表格中求出 Sales 欄位的最小值，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們鍵入，

SELECT MIN (Sales) FROM Store_Information;

結果:

MIN (Sales)
250

250 代表所有 Sales 欄位 (1500 、250 、300 、700) 內的最小值。

下一頁：SQL 總合

Copyright © 2013 1keydata.com 版權所有


SQL MINUS - 1Keydata SQL 語法教學

SQL MINUS
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

MINUS 指令是運用在兩個 SQL 語句上。它先找出第一個 SQL 語句所產生的結果，然後看這些結果有沒有在第二個 SQL 語句的結果中。如果有的話，那這一筆資料就被去除，而不會在最後的結果中出現。如果第二個 SQL 語句所產生的結果並沒有存在於第一個 SQL 語句所產生的結果內，那這筆資料就被拋棄。

MINUS 的語法如下：

[SQL 語句 1]
MINUS
[SQL 語句 2];

我們繼續使用一樣的例子：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Internet_Sales 表格
Txn_Date | Sales
07-Jan-1999 | 250
10-Jan-1999 | 535
11-Jan-1999 | 320
12-Jan-1999 | 750

而我們要知道有哪幾天是有店面營業額而沒有網路營業額的。要達到這個目的，我們用以下的 SQL 語句：

SELECT Txn_Date FROM Store_Information
MINUS
SELECT Txn_Date FROM Internet_Sales;

結果:

Txn_Date
Jan-05-1999
Jan-08-1999

'Jan-05-1999', 'Jan-07-1999', 和 'Jan-08-1999' 是 SELECT Txn_Date FROM Store_Information 所 產生的結果。在這裡面， 'Jan-07-1999' 是存在於 SELECT Txn_Date FROM Internet_Sales 所產生的 結果中。因此 'Jan-07-1999' 並不在最後的結果中。

請注意，在 MINUS 指令下，不同的值只會被列出一次。

下一頁：子查詢

Copyright © 2013 1keydata.com 版權所有


SQL 總合百分比 (Percent to Total) - 1Keydata SQL 語法教學

SQL 總合百分比
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
法文
﻿
﻿

要用 SQL 算出總合百分比，我們需要用到算排名和累積總計的概念，以及運用子查詢的做法。在這裡，我們把子查詢放在外部查詢的 SELECT 子句中。讓我們來看以下的例子：

Total_Sales 表格
Name | Sales
John | 10
Jennifer | 15
Stella | 20
Sophia | 40
Greg | 50
Jeff | 20

要算出總合百分比，我們鍵入以下的 SQL 語句：

SELECT a1.Name, a1.Sales, a1.Sales/(SELECT SUM(Sales) FROM Total_Sales) Pct_To_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales OR (a1.Sales=a2.Sales AND a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;

結果:

Name | Sales | Pct_To_Total
Greg | 50 | 0.3226
Sophia | 40 | 0.2581
Stella | 20 | 0.1290
Jeff | 20 | 0.1290
Jennifer | 15 | 0.0968
John | 10 | 0.0645

SELECT SUM(Sales) FROM Total_Sales 這一段子查詢是用來算出總合。總合算出後，我們就能夠將每一行一一除以總合來求出每一行的總合百分比。

下一頁：SQL 累積總合百分比

Copyright © 2013 1keydata.com 版權所有


SQL 主鍵 - 1Keydata SQL 語法教學

SQL 主鍵
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

主鍵 (Primary Key) 中的每一筆資料都是表格中的唯一值。換言之，它是用來獨一無二地確認一個表格中的每一行資料。主鍵可以是原本資料內的一個欄位，或是一個人造欄位 (與原本資料沒有關係的欄位)。主鍵可以包含一或多個欄位。當主鍵包含多個欄位時，稱為組合鍵 (Composite Key)。

主鍵可以在建置新表格時設定 (運用 CREATE TABLE 語句)，或是以改變現有的表格架構方式設定 (運用 ALTER TABLE 語句)。

以下舉幾個在建置新表格時設定主鍵的方式：

MySQL:

CREATE TABLE Customer
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));

Oracle:

CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));

SQL Server:

CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));

以下則是以改變現有表格架構來設定主鍵的方式：

MySQL:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

Oracle:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

SQL Server:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

請注意，在用 ALTER TABLE 語句來添加主鍵之前，我們需要確認被用來當做主鍵的欄位是設定為 『NOT NULL』 ；也就是說，那個欄位一定不能沒有資料。

下一頁：SQL 外來鍵

Copyright © 2013 1keydata.com 版權所有


SQL 排名 (Rank) - 1Keydata SQL 語法教學

SQL 排名
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

列出每一行的排名是一個常見的需求，可惜 SQL 並沒有一個很直接的方式達到這個需求。要以 SQL 列出排名，基本的概念是要做一個表格自我連結 (Self Join)，將結果依序列出，然後算出每一行之前 (包含那一行本身) 有多少行數。這樣講讀者聽得可能有點困惑，所以最好的方式是用一個實例來介紹。假設我們有以下的表格：

Total_Sales 表格
Name | Sales
John | 10
Jennifer | 15
Stella | 20
Sophia | 40
Greg | 50
Jeff | 20

要找出每一行的排名，我們就打入以下的 SQL 語句：

SELECT a1.Name, a1.Sales, COUNT(a2.Sales) Sales_Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales OR (a1.Sales=a2.Sales AND a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;

結果:

Name | Sales | Sales_Rank
Greg | 50 | 1
Sophia | 40 | 2
Stella | 20 | 3
Jeff | 20 | 3
Jennifer | 15 | 5
John | 10 | 6

我們先來看 WHERE 子句。在字句的第一部分 (a1.Sales <= a2.Sales)，我們算出有多少筆資料 Sales 欄位的值是比自己本身的值小或是相等。如果在 Sales 欄位中沒有同樣大小的資料，那這部分的 WHERE 子句本身就可以產生出正確的排名。

子句的第二部分，(a1.Sales=a2.Sales AND a1.Name = a2.Name)，則是讓我們在 Sales 欄位中有同樣大小的資料時 (像 Stella 及 Jeff 這兩筆資料)，仍然能夠產生正確的排名。

下一頁：SQL 中位數

Copyright © 2013 1keydata.com 版權所有


SQL Replace 函數 - 1Keydata SQL 語法教學

SQL Replace 函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
葡萄牙文
義大利文
荷蘭文
﻿
﻿

在 SQL 中，Replace函數是用來改變一個字串的內容。這個函數在 MySQL、Oracle、及 SQL Server 上都是 Replace( )。這個函數的語法如下：

Replace (str1, str2, str3)

以上語法的意思是，在字串 str1 中，當 str2 出現時，將其以 str3 替代。

舉個例子。假設我們有以下的表格：

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

以下的 Replace 函數，

SELECT REPLACE (Region_Name, 'ast', 'astern')
FROM Geography;

會產生如下的結果：

Region_Name
Eastern
Eastern
West
West

下一頁：SQL CREATE TABLE

Copyright © 2013 1keydata.com 版權所有


SQL 累積總計 (Running Total) - 1Keydata SQL 語法教學

SQL 累積總計
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
法文
﻿
﻿

算出累積總計是一個常見的需求，可惜以 SQL 並沒有一個很直接的方式達到這個需求。要以 SQL 算出累積總計，基本上的概念與列出排名類似：第一是先做個表格自我連結 (Self Join)，然後將結果依序列出。在做列出排名時，我們算出每一行之前 (包含那一行本身) 有多少行數；而在做累積總計時，我們則是算出每一行之前 (包含那一行本身) 的總合。

來看看以下的例子。假設我們有以下的表格：

Total_Sales 表格
Name | Sales
John | 10
Jennifer | 15
Stella | 20
Sophia | 40
Greg | 50
Jeff | 20

要算出累積總計，我們就鍵入以下的 SQL 語句：

SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales OR (a1.Sales=a2.Sales AND a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;

結果:

Name | Sales | Running_Total
Greg | 50 | 50
Sophia | 40 | 90
Stella | 20 | 110
Jeff | 20 | 130
Jennifer | 15 | 145
John | 10 | 155

在以上的 SQL 語句中， WHERE 子句和 ORDER BY 子句讓我們能夠在有重複值時能夠算出正確的累積總計。

下一頁：SQL 總合百分比

Copyright © 2013 1keydata.com 版權所有


SQL網站指引 - 1Keydata SQL 語法教學

SQL語法入門網站指引
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

﻿
﻿

SQL語法入門首頁

SQL 指令

  • SQL SELECT
  • SQL DISTINCT
  • SQL WHERE
  • SQL AND OR
  • SQL IN
  • SQL BETWEEN
  • SQL 萬用字元
  • SQL LIKE
  • SQL ORDER BY
  • SQL 函數
  • SQL 平均值
  • SQL COUNT
  • SQL 最大值
  • SQL 最小值
  • SQL 總合
  • SQL GROUP BY
  • SQL HAVING
  • SQL 別名
  • SQL AS
  • SQL 表格連接
  • SQL OUTER JOIN
  • SQL CONCATENATE
  • SQL SUBSTRING
  • SQL TRIM
  • SQL 長度
  • SQL REPLACE

表格處理

  • SQL CREATE TABLE
  • SQL Constraint
  • SQL 主鍵
  • SQL 外來鍵
  • SQL CREATE VIEW
  • SQL CREATE INDEX
  • SQL ALTER TABLE
  • SQL DROP TABLE
  • SQL TRUNCATE TABLE
  • SQL INSERT INTO
  • SQL UPDATE
  • SQL DELETE FROM

進階 SQL

  • SQL UNION
  • SQL UNION ALL
  • SQL INTERSECT
  • SQL MINUS
  • SQL 子查詢
  • SQL EXISTS
  • SQL CASE
  • 排名 (Rank)
  • 中位數 (Median)
  • 累積總計 (Running Total)
  • 總合百分比 (Percent to Total)
  • 累積總合百分比 (Cumulative Percent to Total)

SQL 語法

其他資源

網站導引

Copyright © 2013 1keydata.com 版權所有


SQL 子查詢 - 1Keydata SQL 語法教學

SQL 子查詢
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

我們可以在一個 SQL 語句中放入另一個 SQL 語句。當我們在 WHERE 子句或 HAVING 子句中插入另一個 SQL 語句時，我們就有一個子查詢 (Subquery) 的架構。 子查詢的作用是什麼呢？第一，它可以被用來連接表格。另外，有的時候子查詢是唯一能夠連接兩個表格的方式。

子查詢的語法如下：

SELECT "欄位1"
FROM "表格"
WHERE "欄位2" [比較運算素]
(SELECT "欄位1"
FROM "表格"
WHERE "條件");

[比較運算素] 可以是相等的運算素，例如 =, >, <, >=, <=. 這也可以是一個對文字的運算素，例如 "LIKE"。綠色的部分代表外查詢，紅色的部分代表內查詢。

我們就用剛剛在闡述 SQL 連接時用過的例子：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

我們可以用以下的 Subquery 語句來找出所有在西部的店的營業額。

SELECT SUM(Sales) FROM Store_Information
WHERE Store_Name IN
(SELECT Store_Name FROM Geography
WHERE Region_Name = 'West');

結果:

SUM(Sales)
2050

在這個例子中，我們並沒有直接將兩個表格連接起來，然後由此直接算出每一間西區店面的營業額。我們做的是先找出哪些店是在西區的，然後再算出這些店的營業額總共是多少。

在以上的例子，內部查詢本身與外部查詢沒有關係。這一類的子查詢稱為『簡單子查詢』 (Simple Subquery)。如果內部查詢是要利用到外部查詢提到的表格中的欄位，那這個字查詢就被稱為『相關子查詢』 (Correlated Subquery)。以下是一個相關子查詢的例子：

SELECT SUM(a1.Sales) FROM Store_Information a1
WHERE a1.Store_Name IN
(SELECT Store_Name FROM Geography a2
WHERE a2.Store_Name = a1.Store_Name);

紅色部分即是外部查詢提到的表格中的欄位。

下一頁：SQL EXISTS

Copyright © 2013 1keydata.com 版權所有


SQL SUBSTRING 函數 - 1Keydata SQL語法教學

SQL SUBSTRING 函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

SQL 中的 SUBSTRING 函數是用來抓出一個欄位資料中的其中一部分。這個函數的名稱在不同的資料庫中不完全一樣：

  • MySQL: SUBSTR( ), SUBSTRING( )
  • Oracle: SUBSTR( )
  • SQL Server: SUBSTRING( )

最常用到的方式如下 (在這裡我們用SUBSTR( )為例)：

SUBSTR (str, pos)

以上語法的意思是，由 <str> 中，選出所有從第 <pos> 位置開始的字元。請注意，這個語法不適用於SQL Server上。

SUBSTR (str, pos, len)

以上語法的意思是，由 <str> 中的第 <pos> 位置開始，選出接下去的 <len> 個字元。

假設我們有以下的表格：

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

例子1

SELECT SUBSTR(Store_Name, 3)
FROM Geography
WHERE Store_Name = 'Los Angeles';

結果:

's Angeles'

例子2

SELECT SUBSTR(Store_Name,2,4)
FROM Geography
WHERE Store_Name = 'San Diego';

結果:

'an D'

下一頁：SQL Trim 函數

Copyright © 2013 1keydata.com 版權所有


SQL總合 - 1Keydata SQL 語法教學

SQL總合
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

SQL 用 SUM( ) 函數來計算一個欄位的總合。計算總合的語法是：

SELECT SUM ("欄位名")
FROM "表格名";

舉例來說，若我們要由我們的範例表格中求出 Sales 欄位的總合，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們鍵入，

SELECT SUM (Sales) FROM Store_Information;

結果:

SUM (Sales)
2750

2750 代表所有 Sales 欄位 (1500 、250 、300 、700) 的總合。

下一頁：SQL GROUP BY

Copyright © 2013 1keydata.com 版權所有


SQL語法 - 1Keydata SQL 語法教學

SQL語法
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL LIKE
SQL ORDER BY
SQL 函數
SQL COUNT
SQL GROUP BY
SQL HAVING
SQL 別名
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

在這一頁中，我們列出所有在這個網站有列出 SQL 指令的語法。若要更詳盡的說明，請點選 指令名稱。

這一頁的目的是提供一個簡潔的 SQL 語法做為讀者參考之用。我們建議您現在就按 Control-D 將本 頁加入您的『我的最愛』。

Select
SELECT "欄位" FROM "表格名";

Distinct
SELECT DISTINCT "欄位"
FROM "表格名";

Where
SELECT "欄位"
FROM "表格名"
WHERE "condition";

And/Or
SELECT "欄位"
FROM "表格名"
WHERE "簡單條件"
{[AND|OR] "簡單條件"}+ ;

In
SELECT "欄位"
FROM "表格名"
WHERE "欄位" IN ('值1', '值2', ...);

Between
SELECT "欄位"
FROM "表格名"
WHERE "欄位" BETWEEN '值1' AND '值2';

Like
SELECT "欄位"
FROM "表格名"
WHERE "欄位" LIKE {模式};

Order By
SELECT "欄位"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位" [ASC, DESC];

Count
SELECT COUNT("欄位")
FROM "表格名";

Group By
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1";

Having
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件);

Create Table
CREATE TABLE "表格名"
("欄位 1" "欄位 1 資料種類",
"欄位 2" "欄位 2 資料種類"",
... );

Drop Table
DROP TABLE "表格名";

Truncate Table
TRUNCATE TABLE "表格名";

Insert Into
INSERT INTO "表格名" ("欄位1", "欄位2", ...)
VALUES ("值1", "值2", ...);

Update
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";

Delete From
DELETE FROM "表格名"
WHERE "條件";

Copyright © 2013 1keydata.com 版權所有


SQL TRIM 函數 - 1Keydata SQL 語法教學

SQL Trim 函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

SQL 中的 TRIM 函數是用來移除掉一個字串中的字頭或字尾。最常見的用途是移除字首或字尾的空白。這個函數在不同的資料庫中有不同的名稱：

  • MySQL: TRIM( ), RTRIM( ), LTRIM( )
  • Oracle: RTRIM( ), LTRIM( )
  • SQL Server: RTRIM( ), LTRIM( )

各種 trim 函數的語法如下：

TRIM ( [ [位置] [要移除的字串] FROM ] 字串): [位置] 的可能值為 LEADING (起頭), TRAILING (結尾), or BOTH (起頭及結尾)。 這個函數將把 [要移除的字串] 從字串的起頭、結尾，或是起頭及結尾移除。如果我們沒有列出 [要移除的字串] 是什麼的話，那空白就會被移除。

LTRIM (字串): 將所有字串起頭的空白移除。

RTRIM (字串): 將所有字串結尾的空白移除。

例子1

SELECT TRIM (' Sample ');

結果:

'Sample'

例子2

SELECT LTRIM (' Sample ');

結果:

'Sample '

例子3

SELECT RTRIM (' Sample ');

結果:

' Sample'

下一頁：SQL 長度函數

Copyright © 2013 1keydata.com 版權所有


SQL 萬用字元 - 1Keydata SQL 語法教學

SQL 萬用字元
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
﻿
﻿

有的時候，我們需要依照由字串模式中找出相符的資料。要滿足這個需求，我們就需要用到萬用字元 (wildcard) 的做法。SQL 中有兩個萬用字元：

% (百分比符號)：代表零個、一個、或數個字母。

_ (底線)：代表剛好一個字母。

萬用字元是與 LIKE 關鍵字一起使用的。

以下是幾個萬用字元的例子：

  • 'A_Z': 所有以 'A' 起頭，另一個任何值的字原，且以 'Z' 為結尾的字串。 'ABZ' 和 'A2Z' 都符合這一個模式，而 'AKKZ' 並不符合 (因為在 A 和 Z 之間有兩個字元，而不是一個字元)。

  • 'ABC%': 所有以 'ABC' 起頭的字串。舉例來說，'ABCD' 和 'ABCABC' 都符合這個模式。

  • '%XYZ': 所有以 'XYZ' 結尾的字串。舉例來說，'WXYZ' 和 'ZZXYZ' 都符合這個模式。

  • '%AN%': 所有含有 'AN'這個模式的字串。舉例來說， 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合這個模式。

  • '_AN%'： 所有第二個字母為 'A' 和第三個字母為 'N' 的字串。舉例來說，'SAN FRANCISCO' 符合這個模式，而 'LOS ANGELES' 則不符合這個模式。

    下一頁：SQL LIKE

    Copyright © 2013 1keydata.com 版權所有

            •


SQL Alias - 1Keydata SQL 語法教學

SQL Alias
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

接下來，我們討論 alias (別名) 在 SQL 上的用處。最常用到的別名有兩種：欄位別名及表格別名。

簡單地來說，欄位別名的目的是為了讓 SQL 產生的結果易讀。在之前的例子中，每當我們有營業額總合時，欄位名都是 SUM(Sales)。雖然在這個情況下沒有什麼問題，可是如果這個欄位不是一個簡單的總合，而是一個複雜的計算，那欄位名就沒有這麼易懂了。若我們用欄位別名的話，就可以確認結果中的欄位名是簡單易懂的。

第二種別名是表格別名。要給一個表格取一個別名，只要在 FROM 子句中的表格名後空一格，然後再列出要用的表格別名就可以了。這在我們要用 SQL 由數個不同的表格中獲取資料時是很方便的。這一點我們在之後談到連接 (join) 時會看到。

我們先來看一下欄位別名和表格別名的語法：

SELECT "表格別名"."欄位1" "欄位別名"
FROM "表格名" "表格別名";

基本上，這兩種別名都是放在它們要替代的物件後面，而它們中間由一個空白分開。我們繼續使用 Store_Information 這個表格來做例子：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們用跟 GROUP BY 那一頁 一樣的例子。這裡的不同處是我們加上了欄位別名以及表格別名：

SELECT A1.Store_Name Store, SUM(A1.Sales) "Total Sales"
FROM Store_Information A1
GROUP BY A1.Store_Name;

結果:

Store | Total Sales
Los Angeles | 1800
San Diego | 250
Boston | 700

在結果中，資料本身沒有不同。不同的是欄位的標題。這是運用欄位別名的結果。在第二個欄位上，原本我們的標題是 "Sum(Sales)"，而現在我們有一個很清楚的 "Total Sales"。很明顯地， "Total Sales" 能夠比 "Sum(Sales)" 更精確地闡述這個欄位的含意。用表格別名的好處在這裡並沒有顯現出來，不過這在 SQL 表格連接時就會很清楚了。

下一頁：SQL AS

Copyright © 2013 1keydata.com 版權所有


SQL AND OR - 1Keydata SQL 語法教學

SQL And Or
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

在上一頁中，我們看到 WHERE 指令可以被用來由表格中有條件地選取資料。 這個條件可能是簡單的 (像上一頁的例子)，也可能是複雜的。複雜條件是由二或多個簡單條件透過 AND 或是 OR 的連接而成。一個 SQL 語句中可以有無限多個簡單條件的存在。

複雜條件的語法如下：

SELECT "欄位名"
FROM "表格名"
WHERE "簡單條件"
{[AND|OR] "簡單條件"}+;

{ }+ 代表{ }之內的情況會發生一或多次。在這裡的意思就是 AND 加 簡單條件及 OR 加簡單條件的情況可以發生一或多次。另外，我們可以用 ( ) 來代表條件的先後次序。

舉例來說，我們若要在 Store_Information 表格中選出所有 Sales 高於 $1,000 或是 Sales 在 $500 及 $275 之間的資料的話，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
San Francisco | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT Store_Name
FROM Store_Information
WHERE Sales > 1000
OR (Sales < 500 AND Sales > 275);

結果:

Store_Name
Los Angeles
San Francisco

下一頁：SQL IN

Copyright © 2013 1keydata.com 版權所有


SQL BETWEEN - 1Keydata SQL 語法教學

SQL Between
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

IN 這個指令可以讓我們依照一或數個不連續 (discrete) 的值的限制之內抓出資料庫中的值，而 BETWEEN 則是讓我們可以運用一個範圍 (range) 內抓出資料庫中的值。BETWEEN 這個子句的語法如下：

SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" BETWEEN '值一' AND '值二';

這將選出欄位值包含在值一及值二之間的每一筆資料。

舉例來說，若我們要由 Store_Information 表格中找出所有介於 January 6, 1999 及 January 10, 1999 中的資料，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
San Francisco | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT *
FROM Store_Information
WHERE Txn_Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999';

請讀者注意：在不同的資料庫中，日期的儲存法可能會有所不同。在這裡我們選擇了其中一種儲存法。

結果:

Store_Name | Sales | Txn_Date
San Diego | 250 | Jan-07-1999
San Francisco | 300 | Jan-08-1999
Boston | 700 | Jan-08-1999

下一頁：SQL 萬用字元

Copyright © 2013 1keydata.com 版權所有


SQL COUNT - 1Keydata SQL 語法教學

SQL Count
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

在上一頁有提到，COUNT 是函數之一。由於它的使用廣泛，我們在這裡特別提出來討論。基本上， COUNT 讓我們能夠數出在表格中有多少筆資料被選出來。它的語法是：

SELECT COUNT("欄位名")
FROM "表格名";

舉例來說，若我們要找出我們的範例表格中有幾筆 Store_Name 欄不是空白的資料時，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT COUNT (Store_Name)
FROM Store_Information
WHERE Store_Name IS NOT NULL;

結果:

COUNT (Store_Name)
4

"IS NOT NULL" 是 "這個欄位不是空白" 的意思。

COUNT 和 DISTINCT 經常被合起來使用，目的是找出表格中有多少筆不同的資料 (至於這些資料實際上是什麼並不重要)。舉例來說，如果我們要找出我們的表格中有多少個不同的 Store_Name，我們就鍵入，

SELECT COUNT (DISTINCT Store_Name)
FROM Store_Information;

結果:

COUNT (DISTINCT Store_Name)
3

下一頁：SQL 最大值

Copyright © 2013 1keydata.com 版權所有


SQL CREATE TABLE - 1Keydata SQL 語法教學

SQL Create Table
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

表格是資料庫中儲存資料的基本架構。在絕大部份的情況下，資料庫廠商不可能知道您需要如何儲存您的 資料，所以通常您會需要自己在資料庫中建立表格。雖然許多資料庫工具可以讓您在不需用到 SQL 的情況下 建立表格，不過由於表格是一個最基本的架構，我們決定包括 CREATE TABLE 的語法在這個網站中。

在我們跳入 CREATE TABLE 的語法之前，我們最好先對表格這個東西 有些多一點的瞭解。表格被分為欄位 (column) 及列位 (row)。每一列代表一筆資料，而每一欄代表一筆資料的 一部份。舉例來說，如果我們有一個記載顧客資料的表格，那欄位就有可能包括姓、名、地址、城市、國家、 生日‧‧‧等等。當我們對表格下定義時，我們需要註明欄位的標題，以及那個欄位的資料種類。

那，資料種類是什麼呢？資料可能是以許多不同的形式存在的。它可能是一個整數 (例如 1)，、一個實數 (例如 0.55)、一個字串 (例如 'sql')、一個日期/時間 (例如 '2000-JAN-25 03:22:22')、或甚至是 以二進法 (binary) 的狀態存在。當我們在對一個表格下定義時，我們需要對每一個欄位的資料種類下定義。 (例如 '姓' 這個欄位的資料種類是 char(50)──代表這是一個 50 個字元的字串)。我們需要注意的一點是 不同的資料庫有不同的資料種類，所以在對表格做出定義之前最好先參考一下資料庫本身的說明。

CREATE TABLE 的語法是：

CREATE TABLE "表格名"
("欄位 1" "欄位 1 資料種類",
"欄位 2" "欄位 2 資料種類",
... );

若我們要建立我們上面提過的顧客表格，我們就鍵入以下的 SQL：

CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);

下一頁：SQL Constraint

Copyright © 2013 1keydata.com 版權所有


SQL DISTINCT - 1Keydata SQL 語法教學

SQL Distinct
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

SELECT 指令讓我們能夠讀取表格中一個或數個欄位的所有資料。 這將把所有的資料都抓出，無論資料值有無重複。在資料處理中，我們會經常碰到需要找出表格內的不同 資料值的情況。換句話說，我們需要知道這個表格/欄位內有哪些不同的值，而每個值出現的次數並不重要。 這要如何達成呢？在 SQL 中， 這是很容易做到的。我們只要在 SELECT 後加上一個 DISTINCT 就可以了。DISTINCT 的 語法如下：

SELECT DISTINCT "欄位名"
FROM "表格名";

舉例來說，若要在以下的表格，Store_Information，找出所有不同的店名時，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT DISTINCT Store_Name FROM Store_Information;

結果:

Store_Name
Los Angeles
San Diego
Boston

下一頁：SQL WHERE

Copyright © 2013 1keydata.com 版權所有


SQL DROP TABLE - 1Keydata SQL 語法教學

SQL Drop Table
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

有時候我們會決定我們需要從資料庫中清除一個表格。事實上，如果我們不能這樣做的話，那將會是一個 很大的問題，因為資料庫管理師 (Database Administrator - DBA) 勢必無法對資料庫做有效率的管理。 還好，SQL 有提供一個 DROP TABLE 的語法來讓我們清除表格。 DROP TABLE 的語法是：

DROP TABLE "表格名";

我們如果要清除在上一頁中建立的顧客表格，我們就鍵入：

DROP TABLE Customer;

下一頁：SQL TRUNCATE TABLE

Copyright © 2013 1keydata.com 版權所有


SQL函數 - 1Keydata SQL 語法教學

SQL函數
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

既然資料庫中有許多資料都是已數字的型態存在，一個很重要的用途就是要能夠對這些數字做一些運算， 例如將它們總合起來，或是找出它們的平均值。SQL 有提供一些這一類的函數。它們是：

  • AVG (平均)
  • COUNT (計數)
  • MAX (最大值)
  • MIN (最小值)
  • SUM (總合)

運用函數的語法是：

SELECT "函數名"("欄位名")
FROM "表格名";

這些函數的運用實例將在以下幾頁中舉出。

除了使用函數外，我們也可以運用 SQL 來做簡單的數學運算，如加或減。對於字串類的資料，SQL 也提供了好幾個字串函數，如 Concatenate、Trim、和 Substring 函數。字串函數的名稱在不同的資料庫會可能會有所不同，因此您最好參考該資料庫的工具書來確認。

下一頁：SQL 平均值

Copyright © 2013 1keydata.com 版權所有


SQL GROUP BY - 1Keydata SQL 語法教學

SQL Group By
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

我們現在回到函數上。記得我們用 SUM 這個指令來算出所有的 Sales (營業額) 吧！如果我們的需求變成是要算出每一間店 (Store_Name) 的營業額 (Sales)，那怎麼辦呢？在這個情況下，我們要做到兩件事：第一，我們對於 Store_Name 及 Sales 這兩個欄位都要選出。第二，我們需要確認所有的 Sales 都要依照各個 Store_Name 來分開算。這個語法為：

SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1";

在我們的範例上，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們鍵入，

SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name;

結果:

Store_Name | SUM(Sales)
Los Angeles | 1800
San Diego | 250
Boston | 700

當我們選不只一個欄位，且其中至少一個欄位有包含函數的運用時，我們就需要用到 GROUP BY 這個指令。在這個情況下，我們需要確定我們有 GROUP BY 所有其他的欄位。換句話說，除了有包括函數的欄位外，我 們都需要將其放在 GROUP BY 的子句中。

下一頁：SQL HAVING

Copyright © 2013 1keydata.com 版權所有


SQL HAVING - 1Keydata SQL 語法教學

SQL Having
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

那我們如何對函數產生的值來設定條件呢？舉例來說，我們可能只需要知道哪些店的營業額有超過 $1,500。在這個情況下，我們不能使用 WHERE 的指令。那要怎麼辦呢？很幸運地，SQL 有提供一個 HAVING 的指令，而我們就可以用這個指令來達到這個目標。 HAVING 子句通常是在一個 SQL 句子的最後。一個含有 HAVING 子句的 SQL 並不一定要包含 GROUP BY 子句。HAVING 的語法如下：

SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件);

請讀者注意： 如果被 SELECT 的只有函數欄， 那就不需要 GROUP BY 子句。

在我們 Store_Information 表格這個例子中,

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

若我們要找出 Sales 大於 1,500 的 Store_Name，我們就鍵入，

SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name
HAVING SUM(Sales) > 1500;

結果:

Store_Name | SUM(Sales)
Los Angeles | 1800

下一頁：SQL 別名

Copyright © 2013 1keydata.com 版權所有


SQL IN - 1Keydata SQL 語法教學

SQL In
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

在 SQL 中，在兩個情況下會用到 IN 這個指令；這一頁將介紹其中之一：與 WHERE 有關的那一個情況。在這個用法下，我們事先已知道至少一個我們需要的值，而我們將這些知道的值都放入IN 這個子句。 IN 指令的語法為下：

SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" IN ('值一', '值二', ...);

在括弧內可以有一或多個值，而不同值之間由逗點分開。值可以是數目或是文字。若在括弧內只有一個值，那這個子句就等於

WHERE "欄位名" = '值一'

舉例來說，若我們要在以下的 Store_Information 表格中找出所有含蓋 Los Angeles 或 San Diego 的資料，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
San Francisco | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT *
FROM Store_Information
WHERE Store_Name IN ('Los Angeles', 'San Diego');

結果:

Store_Name | Sales | Txn_Date
Los Angeles | 1500 | Jan-05-1999
San Diego | 250 | Jan-07-1999

下一頁：SQL BETWEEN

Copyright © 2013 1keydata.com 版權所有


SQL INSERT INTO - 1Keydata SQL 語法教學

SQL Insert Into
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

到目前為止，我們學到了將如何把資料由表格中取出。但是這些資料是如果進入這些表格的呢？ 這就是這一頁 (INSERT INTO) 和下一頁 (UPDATE) 要討論的。

基本上，我們有兩種作法可以將資料輸入表格中內。一種是一次輸入一筆，另一種是一次輸入好幾筆。我們先來看一次輸入一筆的方式。

依照慣例，我們先介紹語法。一次輸入一筆資料的語法如下：

INSERT INTO "表格名" ("欄位1", "欄位2", ...)
VALUES ("值1", "值2", ...);

假設我們有一個架構如下的表格：

Store_Information 表格
欄位名稱 | 資料種類
Store_Name | char(50)
Sales | float
Txn_Date | datetime

而我們要加以下的這一筆資料進去這個表格：在 January 10, 1999，Los Angeles 店有 $900 的營業額。我們就打入以下的 SQL 語句：

INSERT INTO Store_Information (Store_Name, Sales, Txn_Date)
VALUES ('Los Angeles', 900, 'Jan-10-1999');

第二種 INSERT INTO 能夠讓我們一次輸入多筆的資料。跟上面剛的例子不同的是，現在我們要用 SELECT 指令來指明要輸入表格的資料。如果您想說，這是不是說資料是從另一個表格來的，那您就想對了。

一次輸入多筆的資料的語法是：

INSERT INTO "表格1" ("欄位1", "欄位2", ...)
SELECT "欄位3", "欄位4", ...
FROM "表格2";

以上的語法是最基本的。這整句 SQL 也可以含有 WHERE、 GROUP BY、及 HAVING 等子句，以及表格連接及別名等等。

舉例來說，若我們想要將 1998 年的營業額資料放入 Sales_Information 表格，而我們知道資料的來源是可以由 Sales_Information 表格取得的話，那我們就可以鍵入以下的 SQL：

INSERT INTO Store_Information (Store_Name, Sales, Txn_Date)
SELECT Store_Name, Sales, Txn_Date
FROM Sales_Information
WHERE Year(Txn_Date) = 1998;

在這裡，我用了 SQL Server 中的函數來由日期中找出年。不同的資料庫會有不同的語法。舉個例來說，在 Oracle 上，您將會使用 WHERE TO_CHAR (Txn_Date,'yyyy') = 1998。

下一頁：SQL UPDATE

Copyright © 2013 1keydata.com 版權所有


SQL表格連接 (Join) - 1Keydata SQL 語法教學

SQL表格連接 (Join)
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

現在我們介紹連接 (join) 的概念。要瞭解連接，我們需要用到許多我們之前已介紹過的指令。我們先假設我們有以下的兩個表格，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

而我們要知道每一區 (Region_Name) 的營業額 (Sales)。 Geography 這個表格告訴我們每一區有哪些店，而 Store_Information 告訴我們每一個店的營業額。若我們要知道每一區的營業額，我們需要將這兩個不同表格中的資料串聯起來。當我們仔細瞭解這兩個表格後，我們會發現它們可經由一個相同的欄位，Store_Name，連接起來。我們先將 SQL 句列出，之後再討論每一個子句的意義：

SELECT A1.Region_Name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;

結果:

REGION | SALES
East | 700
West | 2050

在第一行中，我們告訴 SQL 去選出兩個欄位：第一個欄位是 Geography 表格中的 Region_Name 欄位 (我們取了一個別名叫做 REGION)；第二個欄位是 Store_Information 表格中的 Sales 欄位 (別名為 SALES)。請注意在這裡我們有用到表格別名：Geography 表格的別名是 A1，Store_Information 表格的別名是 A2。若我們沒有用表格別名的話，第一行就會變成

SELECT Geography.Region_Name REGION, SUM(Store_Information.Sales) SALES

很明顯地，這就複雜多了。在這裡我們可以看到表格別名的功用：它能讓 SQL 句容易被瞭解，尤其是這個 SQL 句含蓋好幾個不同的表格時。

接下來我們看第三行，就是 WHERE 子句。這是我們闡述連接條件的地方。在這裡，我們要確認 Geography 表格中 Store_Name 欄位的值與 Store_Information 表格中 Store_Name 欄位的值是相等的。這個 WHERE 子句是一個連接的靈魂人物，因為它的角色是確定兩個表格之間的連接是正確的。如果 WHERE 子句是錯誤的，我們就極可能得到一個笛卡兒連接 (Cartesian join)。笛卡兒連接會造成我們得到所有兩個表格每兩行之間所有可能的組合。在這個例子中，笛卡兒連接會讓我們得到 4 x 4 = 16 行的結果。

下一頁：SQL 外部連接

Copyright © 2013 1keydata.com 版權所有


SQL LIKE - 1Keydata SQL 語法教學

SQL Like
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

LIKE 是另一個在 WHERE 子句中會用到的指令。基本上， LIKE 能讓我們依據一個模式 (pattern) 來找出我們要的資料。相對來說，在運用 IN 的時候，我們完全地知道我們需要的條件；在運用 BETWEEN 的時候，我們則是列出一個範圍。 LIKE 的語法如下：

SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" LIKE {模式};

{模式} 經常包括萬用字元 (wildcard)。在上一頁中，我們看到了好幾個萬用字元的例子。 以下我們用一個實例來看萬用字元和 LIKE 是如何被運用的：

Store_Information 表格
Store_Name | Sales | Txn_Date
LOS ANGELES | 1500 | 05-Jan-1999
SAN DIEGO | 250 | 07-Jan-1999
SAN FRANCISCO | 300 | 08-Jan-1999
BOSTON | 700 | 08-Jan-1999

要找出所有名稱內包含 AN 這兩個字串的資訊，我們就鍵入，

SELECT *
FROM Store_Information
WHERE store_name LIKE '%AN%';

結果:

Store_Name | Sales | Txn_Date
LOS ANGELES | 1500 | Jan-05-1999
SAN FRANCISCO | 300 | Jan-08-1999
SAN DIEGO | 250 | Jan-07-1999

下一頁：SQL ORDER BY

Copyright © 2013 1keydata.com 版權所有


SQL資源 - 1Keydata SQL 語法教學

網上SQL資源
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL LIKE
SQL ORDER BY
SQL 函數
SQL COUNT
SQL GROUP BY
SQL HAVING
SQL 別名
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源
﻿
﻿

SQL 輔助網站:

  • SQL Tutorial (英): 本站的英文版。
  • A Gentle Introduction to SQL (英): 一個很好的 SQL 入門網站。

電腦語言參考站：

  • CSS語法教學: 介紹常見的 CSS 語法，並有豐富的實例以促進了解。
  • Programmers Heaven (英): 提供硬體及軟體的連接、新聞、以及文章。

其他資訊：

  • BMI值計算: 計算你的身高體重標準。
  • 試管嬰兒資訊網: 提供有關不孕症、人工受孕、以及試管嬰兒的資訊。
  • 防毒程式: 諾頓防毒程式網站。

Copyright © 2013 1keydata.com 版權所有


SQL ORDER BY - 1Keydata SQL 語法教學

SQL Order By
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

到目前為止，我們已學到如何藉由 SELECT 及 WHERE 這兩個指令將資料由表格中抓出。不過我們尚未提到這些資料要如何排列。這其實是一個很重要的問題。事實上，我們經常需要能夠將抓出的資料做一個有系統的顯示。這可能是由小往大 (ascending) 或是由大往小 (descending)。在這種情況下，我們就可以運用 ORDER BY 這個指令來達到我們的目的。

ORDER BY 的語法如下:

SELECT "欄位名"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位名" [ASC, DESC];

[] 代表 WHERE 子句不是一定需要的。 不過，如果 WHERE 子句存在的話，它是在 ORDER BY 子句之前。 ASC 代表結果會以由小往大的順序列出，而 DESC 代表結果會以由大往小的順序列出。 如果兩者皆沒有被寫出的話，那我們就會用 ASC。

我們可以照好幾個不同的欄位來排順序。在這個情況下， ORDER BY 子句的語法如下(假設有兩個欄位)：

ORDER BY "欄位一" [ASC, DESC], "欄位二" [ASC, DESC]

若我們對這兩個欄位都選擇由小往大的話，那這個子句就會造成結果是依據 "欄位一" 由小往大排。 若有好幾筆資料 "欄位一" 的值相等，那這幾筆資料就依據 "欄位二" 由小往大排。

舉例來說，若我們要依照 Sales 欄位的由大往小列出 Store_Information 表格中的資料，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
San Francisco | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入，

SELECT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC;

結果:

Store_Name | Sales | Txn_Date
Los Angeles | 1500 | Jan-05-1999
Boston | 700 | Jan-08-1999
San Francisco | 300 | Jan-08-1999
San Diego | 250 | Jan-07-1999

在以上的例子中，我們用欄位名來指定排列順序的依據。除了欄位名外，我們也可以用欄位的順序 (依據 SQL 句中的順序)。在 SELECT 後的第一個欄位為 1，第二個欄位為 2，以此類推。在上面這個例子中，我們用以下這句 SQL 可以達到完全一樣的效果：

SELECT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY 2 DESC;

下一頁：SQL 函數

Copyright © 2013 1keydata.com 版權所有


SQL 外部連接 - 1Keydata SQL 語法教學

SQL 外部連接
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

之前我們看到的左連接 (left join)，又稱內部連接 (inner join)。在這個情況下，要兩個表格內都有同樣的值，那一筆資料才會被選出。那如果我們想要列出一個表格中每一筆的資料，無論它的值在另一個表格中有沒有出現，那該怎麼辦呢？在這個時候，我們就需要用到 SQL OUTER JOIN (外部連接) 的指令。

外部連接的語法是依資料庫的不同而有所不同的。舉例來說，在 Oracle 上，我們會在 WHERE 子句中要選出所有資料的那個表格之後加上一個 "(+)" 來代表說這個表格中的所有資料我們都要。

假設我們有以下的兩個表格：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Geography 表格
Region_Name | Store_Name
East | Boston
East | New York
West | Los Angeles
West | San Diego

我們需要知道每一間店的營業額。如果我們用一個普通的連接，我們將會漏失掉 'New York' 這個店，因為它並不存在於 Store_Information 這個表格。所以，在這個情況下，我們需要用外部連接來串聯這兩個表格：

SELECT A1.Store_Name, SUM(A2.Sales) SALES
FROM Georgraphy A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name (+)
GROUP BY A1.Store_Name;

我們在這裡是使用了 Oracle 的外部連接語法。

結果:

Store_Name | SALES
Boston | 700
New York |
Los Angeles | 1800
San Diego | 250

請注意： 當第二個表格沒有相對的資料時， SQL 會傳回 NULL 值。在這一個例子中，'New York' 並不存在於 Store_Information 表格，所以它的 "SALES" 欄位是 NULL。

下一頁：SQL Concatenate

Copyright © 2013 1keydata.com 版權所有


SQL Select - 1Keydata SQL 語法教學

SQL Select
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

SQL 是用來做什麼的呢？一個最常用的方式是將資料從資料庫中的表格內選出。從這一句回答中，我們馬上可以看到兩個關鍵字： 從 (FROM)資料庫中的表格內選出 (SELECT)。(表格是一個資料庫內的結構，它的目的是儲存資料。在表格處理這一部分中，我們會提到如何使用 SQL 來設定表格。) 我們由這裡可以看到最基本的 SQL 架構：

SELECT "欄位名" FROM "表格名";

我們用以下的例子來看看實際上是怎麼用的。假設我們有以下這個表格：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

若要選出所有的店名 (Store_Name)，我們就鍵入：

SELECT Store_Name FROM Store_Information;

結果:

Store_Name
Los Angeles
San Diego
Los Angeles
Boston

我們一次可以讀取好幾個欄位，也可以同時由好幾個表格中選資料。

下一頁：SQL DISTINCT

Copyright © 2013 1keydata.com 版權所有


SQL TRUNCATE TABLE - 1Keydata SQL 語法教學

SQL Truncate Table
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

有時候我們會需要清除一個表格中的所有資料。要達到者個目的，一種方式是我們在 上一頁看到 的 DROP TABLE 指令。不過這樣整個表格就消失，而無法再被用了。另一種方式就是運 用 TRUNCATE TABLE 的指令。在這個指令之下，表格中的資料會完全消失， 可是表格本身會繼續存在。 TRUNCATE TABLE 的語法為下：

TRUNCATE TABLE "表格名";

所以，我們如果要清除在 SQL Create Table 那一頁建立的顧客表格之內的資料，我們就鍵入：

TRUNCATE TABLE Customer;

下一頁：SQL INSERT INTO

Copyright © 2013 1keydata.com 版權所有


SQL UNION - 1Keydata SQL 語法教學

SQL UNION
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

UNION 指令的目的是將兩個 SQL 語句的結果合併起來。從這個角度來看， UNION 跟 JOIN 有些許類似，因為這兩個指令都可以由多個表格中擷取資料。 UNION 的一個限制是兩個 SQL 語句所產生的欄位需要是同樣的資料種類。另外，當我們用 UNION 這個指令時，我們只會看到不同的資料值 (類似 SELECT DISTINCT)。

UNION 的語法如下：

[SQL 語句 1]
UNION
[SQL 語句 2];

假設我們有以下的兩個表格，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Internet_Sales 表格
Txn_Date | Sales
07-Jan-1999 | 250
10-Jan-1999 | 535
11-Jan-1999 | 320
12-Jan-1999 | 750

而我們要找出來所有有營業額 (Sales) 的日子。要達到這個目的，我們用以下的 SQL 語句：

SELECT Txn_Date FROM Store_Information
UNION
SELECT Txn_Date FROM Internet_Sales;

結果:

Txn_Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

有一點值得注意的是，如果我們在任何一個 SQL 語句 (或是兩句都一起) 用 "SELECT DISTINCT Txn_Date" 的話，那我們會得到完全一樣的結果。

下一頁：SQL UNION ALL

Copyright © 2013 1keydata.com 版權所有


SQL UNION ALL - 1Keydata SQL 語法教學

SQL UNION ALL
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL 子查詢
SQL EXISTS
SQL CASE
SQL 算排名
SQL 算中位數
SQL 算累積總計
SQL 算總合百分比
SQL 算累積總合百分比

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

UNION ALL 這個指令的目的也是要將兩個 SQL 語句的結果 合併在一起。 UNION ALL 和 UNION 不同 之處在於 UNION ALL 會將每一筆符合條件的資料都列出來，無論資料值 有無重複。

UNION ALL 的語法如下：

[SQL 語句 1]
UNION ALL
[SQL 語句 2];

我們用和上一頁同樣的例子來顯示出 UNION ALL 和 UNION 的不同。同樣假設我們有以下兩個表格，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

Internet_Sales 表格
Txn_Date | Sales
07-Jan-1999 | 250
10-Jan-1999 | 535
11-Jan-1999 | 320
12-Jan-1999 | 750

而我們要找出有店面營業額以及網路營業額的日子。要達到這個目的，我們用以下的 SQL 語句：

SELECT Txn_Date FROM Store_Information
UNION ALL
SELECT Txn_Date FROM Internet_Sales;

結果:

Txn_Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

下一頁：SQL INTERSECT

Copyright © 2013 1keydata.com 版權所有


SQL UPDATE - 1Keydata SQL 語法教學

SQL UPDATE
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL CREATE TABLE
SQL Constraint
SQL 主鍵
 SQL 外來鍵
 SQL CREATE VIEW
 SQL CREATE INDEX
 SQL ALTER TABLE
 SQL DROP TABLE
SQL TRUNCATE TABLE
SQL INSERT INTO
SQL UPDATE
SQL DELETE FROM

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

我們有時候可能會需要修改表格中的資料。在這個時候，我們就需要用到UPDATE 指令。這個指令的語法是：

UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";

最容易瞭解這個語法的方式是透過一個例子。假設我們有以下的表格：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們發現說 Los Angeles 在 1999 年 1 月 8 號的營業額實際上是 $500，而不是表格中所儲存的 $300，因此我們用以下的 SQL 來修改那一筆資料：

UPDATE Store_Information
SET Sales = 500
WHERE Store_Name = 'Los Angeles'
AND Txn_Date = 'Jan-08-1999';

現在表格的內容變成：

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 500 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

在這個例子中，只有一筆資料符合 WHERE 子句中的條件。如果有多筆資料符合條件的話，每一筆符合條件的資料都會被修改的。

我們也可以同時修改好幾個欄位。這語法如下：

UPDATE "表格"
SET "欄位1" = [值1], "欄位2" = [值2]
WHERE "條件";

下一頁：SQL DELETE FROM

Copyright © 2013 1keydata.com 版權所有


SQL WHERE - 1Keydata SQL 語法教學

SQL WHERE
  • 首頁
  • SQL指令
  • 表格處理
  • 進階SQL
  • SQL語法

SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL 萬用字元
SQL LIKE
SQL ORDER BY
SQL 函數
SQL 平均值
SQL COUNT
SQL 最大值
SQL 最小值
SQL 總合
SQL GROUP BY
SQL HAVING
SQL 別名
SQL AS
SQL 表格連接
SQL 外部連接
SQL CONCATENATE
SQL SUBSTRING
SQL TRIM
SQL 長度
SQL REPLACE

網站導引
其他資源

其他語言:
英文
德文
法文
西班牙文
葡萄牙文
義大利文
荷蘭文
日文
韓文
簡體中文
﻿
﻿

我們並不一定每一次都要將表格內的資料都完全抓出。在許多時候，我們會需要選擇性地抓資料。 就我們的例子來說，我們可能只要抓出營業額超過 $1,000 的資料。要做到這一點，我們就需要用到 WHERE 這個指令。這個指令的語法如下：

SELECT "欄位名"
FROM "表格名"
WHERE "條件";

若我們要由以下的表格抓出營業額超過 $1,000 的資料，

Store_Information 表格
Store_Name | Sales | Txn_Date
Los Angeles | 1500 | 05-Jan-1999
San Diego | 250 | 07-Jan-1999
Los Angeles | 300 | 08-Jan-1999
Boston | 700 | 08-Jan-1999

我們就鍵入,

SELECT Store_Name
FROM Store_Information
WHERE Sales > 1000;

結果:

Store_Name
Los Angeles

下一頁：SQL AND OR

Copyright © 2013 1keydata.com 版權所有