Php7適應:修訂版本之間的差異
出自六年制學程
(未顯示2位用戶所作出之21次版本) | |||
第 1 行: | 第 1 行: | ||
[[分類:Etable]] | [[分類:Etable]] | ||
+ | ===資料庫=== | ||
#$conn = mysqli_connect($DBHOST, $DBUSER, $DBPASSWD):建立資料庫連線,如果$conn=false代表連結不成功 | #$conn = mysqli_connect($DBHOST, $DBUSER, $DBPASSWD):建立資料庫連線,如果$conn=false代表連結不成功 | ||
#mysqli_select_db($conn, $DBNAME):選取資料庫 | #mysqli_select_db($conn, $DBNAME):選取資料庫 | ||
第 5 行: | 第 6 行: | ||
#*SELECT, SHOW, DESCRIBE, EXPLAIN 等如果成功則取回 resultset ,否則為 false | #*SELECT, SHOW, DESCRIBE, EXPLAIN 等如果成功則取回 resultset ,否則為 false | ||
#*INSERT, UPDATE, DELETE, DROP 等成功則傳回 true,否則為 false | #*INSERT, UPDATE, DELETE, DROP 等成功則傳回 true,否則為 false | ||
− | #mysqli_connect_errno($conn) | + | #mysqli_connect_errno($conn):傳回連結資料庫的錯誤碼。如果沒有錯誤發生則返回 0。 |
− | #mysqli_connect_error():傳回連結錯誤的原因,如「Access denied for user 'root'@'localhost' (using password: YES) | + | #mysqli_connect_error():傳回連結錯誤的原因,如「Access denied for user 'root'@'localhost' (using password: YES)」。注意:因連結沒有成功,所以引數中不是連結,而是無引數。 |
− | #mysqli_errno($conn) | + | #mysqli_errno($conn):傳回查詢指令的錯誤碼。如果沒有錯誤發生則返回 0。 |
+ | #mysqli_error($conn):傳回查詢指令的錯誤訊息。 | ||
#*[https://www.fromdual.com/mysql-error-codes-and-messages 錯誤碼列表],進一步點進去可以看錯誤碼與錯誤訊息列表。 | #*[https://www.fromdual.com/mysql-error-codes-and-messages 錯誤碼列表],進一步點進去可以看錯誤碼與錯誤訊息列表。 | ||
#mysqli_num_rows($result):取回結果中的筆數 | #mysqli_num_rows($result):取回結果中的筆數 | ||
#mysqli_num_fields($result):獲取結果中的欄數 | #mysqli_num_fields($result):獲取結果中的欄數 | ||
#mysqli_fetch_assoc($result):同mysqli_fetch_array(result,MYSQLI_ASSOC) | #mysqli_fetch_assoc($result):同mysqli_fetch_array(result,MYSQLI_ASSOC) | ||
+ | #mysqli_fetch_row($result):同mysqli_fetch_array(result,MYSQLI_NUM) | ||
#mysqli_fetch_array(result[,resulttype]):取代 mysql_fetch_array 。resulttype預設為 MYSQLI_BOTH ,另二值為 MYSQLI_ASSOC,MYSQLI_NUM 。 | #mysqli_fetch_array(result[,resulttype]):取代 mysql_fetch_array 。resulttype預設為 MYSQLI_BOTH ,另二值為 MYSQLI_ASSOC,MYSQLI_NUM 。 | ||
#$obj = mysqli_fetch_object($result):取回物件形態資料 | #$obj = mysqli_fetch_object($result):取回物件形態資料 | ||
第 24 行: | 第 27 行: | ||
#*table 此欄所屬的表的名稱(如果非演算欄) | #*table 此欄所屬的表的名稱(如果非演算欄) | ||
#*orgtable 原始表名(如果已指定別名) | #*orgtable 原始表名(如果已指定別名) | ||
− | #*def | + | #*def 文件說可以取回此欄的預設值(以字串表示),實測結果什麼都取不到,應為 PHP 文件上的錯誤或 PHP7 的 bug |
#*max_length 結果集欄的最大寬度。 | #*max_length 結果集欄的最大寬度。 | ||
#*length 在表定義中指定的欄寬度。 | #*length 在表定義中指定的欄寬度。 | ||
#*charsetnr 欄的字符集編號。 | #*charsetnr 欄的字符集編號。 | ||
#*flags 一個整數,表示該欄的位標誌。 | #*flags 一個整數,表示該欄的位標誌。 | ||
+ | #*# NOT_NULL_FLAG 為 1 ,常數表示為 MYSQLI_NOT_NULL_FLAG | ||
+ | #*# PRI_KEY_FLAG 為 2 ,常數表示為 MYSQLI_PRI_KEY_FLAG | ||
+ | #*# UNIQUE_KEY_FLAG 為 4 ,常數表示為 MYSQLI_UNIQUE_KEY_FLAG | ||
+ | #*# MULTIPLE_KEY_FLAG 為 8 ,常數表示為 MYSQLI_MULTIPLE_KEY_FLAG | ||
+ | #*# BLOB_FLAG 為 16 ,常數表示為 MYSQLI_BLOB_FLAG | ||
+ | #*# UNSIGNED_FLAG 為 32 ,常數表示為 MYSQLI_UNSIGNED_FLAG | ||
+ | #*# ZEROFILL_FLAG 為 64 ,常數表示為 MYSQLI_ZEROFILL_FLAG | ||
+ | #*# BINARY_FLAG 為 128 ,PHP7有此全域常數,表示為 MYSQLI_BINARY_FLAG | ||
+ | #*# ENUM_FLAG 為 256 ,PHP7有此全域常數,表示為 MYSQLI_ENUM_FLAG | ||
+ | #*# AUTO_INCREMENT_FLAG 為 512 ,常數表示為 MYSQLI_AUTO_INCREMENT_FLAG | ||
+ | #*# TIMESTAMP_FLAG 為 1024 ,常數表示為 MYSQLI_TIMESTAMP_FLAG | ||
+ | #*# SET_FLAG 為 2048 ,常數表示為 MYSQLI_SET_FLAG | ||
+ | #*# NO_DEFAULT_VALUE_FLAG 為 4096 ,PHP7有此全域常數,表示為 MYSQLI_NO_DEFAULT_VALUE_FLAG | ||
+ | #*# ON_UPDATE_NOW 為 8192 ,PHP7有此全域常數,表示為 MYSQLI_ON_UPDATE_NOW_FLAG | ||
+ | #*# PART_KEY_FLAG 為 16384 ,常數表示為 MYSQLI_PART_KEY_FLAG | ||
+ | #*# GROUP_FLAG 與 NUM_FLAG 均為 32768 ,常數表示為 MYSQLI_GROUP_FLAG 、 MYSQLI_NUM_FLAG | ||
+ | #*:要閱讀其含義,可以二進制顯示它,如:decbin(49967);顯示出'1100001100101111'(從右向左讀共 16 bits)。 | ||
+ | #*:要測是否具有某種 flag ,可以用 if($fieldFlags & 代表常數){…} 測試它,成立就有此 flag 。 | ||
#*type 用於此欄的數據類型 | #*type 用於此欄的數據類型 | ||
+ | #*# 1=>'tinyint' | ||
+ | #*# 2=>'smallint' | ||
+ | #*# 3=>'int' | ||
+ | #*# 4=>'float' | ||
+ | #*# 5=>'double' | ||
+ | #*# 7=>'timestamp' | ||
+ | #*# 8=>'bigint' | ||
+ | #*# 9=>'mediumint' | ||
+ | #*# 10=>'date' | ||
+ | #*# 11=>'time' | ||
+ | #*# 12=>'datetime' | ||
+ | #*# 13=>'year' | ||
+ | #*# 16=>'bit' | ||
+ | #*# 252 MySQL 5.0.51a 之後被對應到所有的 text 與 blob 欄 | ||
+ | #*# 253=>'varchar' | ||
+ | #*# 254=>'char' | ||
+ | #*# 246=>'decimal' | ||
#*decimals 使用的小數位數(用於數字欄) | #*decimals 使用的小數位數(用於數字欄) | ||
#mysqli_fetch_field() - 返回結果集中的下一個欄 | #mysqli_fetch_field() - 返回結果集中的下一個欄 | ||
#mysqli_fetch_fields() - 返回表示結果集中欄的物件陣列 | #mysqli_fetch_fields() - 返回表示結果集中欄的物件陣列 | ||
#mysqli_data_seek($result,跳過幾筆):調整結果指針到結果集中的一個任意行 | #mysqli_data_seek($result,跳過幾筆):調整結果指針到結果集中的一個任意行 | ||
+ | |||
+ | ===etable 對 mysqli_query 引數中連結在前的適應=== | ||
+ | ====(一)新增 login 類別兩個屬性==== | ||
+ | :$dsn | ||
+ | :$sqlConnection | ||
+ | ====(二)提供可用的資料庫連線帳密==== | ||
+ | #由域名決定:在 constant.php 中一個域名對應一個 DSN 常數 | ||
+ | #在 site 中決定:在 siteConstant.php 中指定 $themeDsn 與 $loginDsn | ||
+ | #在工作程式中指定,直接使用字串 | ||
+ | |||
+ | ====(三)連結時機==== | ||
+ | #siteConstant.php:同 site 皆使用相同的資料庫連結,不管有 theme 還是沒 theme | ||
+ | #theme.php ,由於各工作程式和 index.php 會載入 theme.php ,所以就不用再進行連結。 | ||
+ | |||
+ | ====(四)DB::queryF==== | ||
+ | |||
+ | ====(五)site專一==== | ||
+ | 在 siteConstant.php 中有 signInTable 常數指定認證資料表 | ||
+ | |||
+ | ===ereg_replace被preg_replace取代=== | ||
+ | ereg_replace("正規表示式", 取代字串, 被蒐尋字串) | ||
+ | // 修改後應為: | ||
+ | preg_replace("/正規表示式/",取代字串,被蒐尋字串) | ||
+ | 「/」代表樣式開始及樣式結束 | ||
+ | ===preg_replace的e修飾=== | ||
+ | /et/class/wiki/Sanitizer.php 的 565 行 | ||
+ | |||
+ | 原:<pre>$stripped = preg_replace( '!\\\\([0-9A-Fa-f]{1,6})[ \\n\\r\\t\\f]?!e', | ||
+ | 'codepointToUtf8(hexdec("$1"))', $stripped );</pre> | ||
+ | 先註解掉,以後再改。 |
2022年2月15日 (二) 22:09的最新修訂版本
目錄
資料庫
- $conn = mysqli_connect($DBHOST, $DBUSER, $DBPASSWD):建立資料庫連線,如果$conn=false代表連結不成功
- mysqli_select_db($conn, $DBNAME):選取資料庫
- $result = mysqli_query($conn, $sql):查詢
- SELECT, SHOW, DESCRIBE, EXPLAIN 等如果成功則取回 resultset ,否則為 false
- INSERT, UPDATE, DELETE, DROP 等成功則傳回 true,否則為 false
- mysqli_connect_errno($conn):傳回連結資料庫的錯誤碼。如果沒有錯誤發生則返回 0。
- mysqli_connect_error():傳回連結錯誤的原因,如「Access denied for user 'root'@'localhost' (using password: YES)」。注意:因連結沒有成功,所以引數中不是連結,而是無引數。
- mysqli_errno($conn):傳回查詢指令的錯誤碼。如果沒有錯誤發生則返回 0。
- mysqli_error($conn):傳回查詢指令的錯誤訊息。
- 錯誤碼列表,進一步點進去可以看錯誤碼與錯誤訊息列表。
- mysqli_num_rows($result):取回結果中的筆數
- mysqli_num_fields($result):獲取結果中的欄數
- mysqli_fetch_assoc($result):同mysqli_fetch_array(result,MYSQLI_ASSOC)
- mysqli_fetch_row($result):同mysqli_fetch_array(result,MYSQLI_NUM)
- mysqli_fetch_array(result[,resulttype]):取代 mysql_fetch_array 。resulttype預設為 MYSQLI_BOTH ,另二值為 MYSQLI_ASSOC,MYSQLI_NUM 。
- $obj = mysqli_fetch_object($result):取回物件形態資料
- mysqli_insert_id($conn):取回最後一筆異動的索引
- 一定要有一個欄位有 auto_increment 屬性,否則回傳0
- 一定之前要有insert或update操作,否則回傳0
- mysqli_free_result($result):釋放結果集
- mysqli_close($con):關閉連線,繳回連結
- mysqli_fetch_field_direct($result,第幾欄):返回一個物件,包含來自指定結果集中的欄位定義信息。沒有指定第幾欄,則返回FALSE。諸屬性:
- name 欄代名
- orgname 原始欄名(如果指定了別名)
- table 此欄所屬的表的名稱(如果非演算欄)
- orgtable 原始表名(如果已指定別名)
- def 文件說可以取回此欄的預設值(以字串表示),實測結果什麼都取不到,應為 PHP 文件上的錯誤或 PHP7 的 bug
- max_length 結果集欄的最大寬度。
- length 在表定義中指定的欄寬度。
- charsetnr 欄的字符集編號。
- flags 一個整數,表示該欄的位標誌。
- NOT_NULL_FLAG 為 1 ,常數表示為 MYSQLI_NOT_NULL_FLAG
- PRI_KEY_FLAG 為 2 ,常數表示為 MYSQLI_PRI_KEY_FLAG
- UNIQUE_KEY_FLAG 為 4 ,常數表示為 MYSQLI_UNIQUE_KEY_FLAG
- MULTIPLE_KEY_FLAG 為 8 ,常數表示為 MYSQLI_MULTIPLE_KEY_FLAG
- BLOB_FLAG 為 16 ,常數表示為 MYSQLI_BLOB_FLAG
- UNSIGNED_FLAG 為 32 ,常數表示為 MYSQLI_UNSIGNED_FLAG
- ZEROFILL_FLAG 為 64 ,常數表示為 MYSQLI_ZEROFILL_FLAG
- BINARY_FLAG 為 128 ,PHP7有此全域常數,表示為 MYSQLI_BINARY_FLAG
- ENUM_FLAG 為 256 ,PHP7有此全域常數,表示為 MYSQLI_ENUM_FLAG
- AUTO_INCREMENT_FLAG 為 512 ,常數表示為 MYSQLI_AUTO_INCREMENT_FLAG
- TIMESTAMP_FLAG 為 1024 ,常數表示為 MYSQLI_TIMESTAMP_FLAG
- SET_FLAG 為 2048 ,常數表示為 MYSQLI_SET_FLAG
- NO_DEFAULT_VALUE_FLAG 為 4096 ,PHP7有此全域常數,表示為 MYSQLI_NO_DEFAULT_VALUE_FLAG
- ON_UPDATE_NOW 為 8192 ,PHP7有此全域常數,表示為 MYSQLI_ON_UPDATE_NOW_FLAG
- PART_KEY_FLAG 為 16384 ,常數表示為 MYSQLI_PART_KEY_FLAG
- GROUP_FLAG 與 NUM_FLAG 均為 32768 ,常數表示為 MYSQLI_GROUP_FLAG 、 MYSQLI_NUM_FLAG
- 要閱讀其含義,可以二進制顯示它,如:decbin(49967);顯示出'1100001100101111'(從右向左讀共 16 bits)。
- 要測是否具有某種 flag ,可以用 if($fieldFlags & 代表常數){…} 測試它,成立就有此 flag 。
- type 用於此欄的數據類型
- 1=>'tinyint'
- 2=>'smallint'
- 3=>'int'
- 4=>'float'
- 5=>'double'
- 7=>'timestamp'
- 8=>'bigint'
- 9=>'mediumint'
- 10=>'date'
- 11=>'time'
- 12=>'datetime'
- 13=>'year'
- 16=>'bit'
- 252 MySQL 5.0.51a 之後被對應到所有的 text 與 blob 欄
- 253=>'varchar'
- 254=>'char'
- 246=>'decimal'
- decimals 使用的小數位數(用於數字欄)
- mysqli_fetch_field() - 返回結果集中的下一個欄
- mysqli_fetch_fields() - 返回表示結果集中欄的物件陣列
- mysqli_data_seek($result,跳過幾筆):調整結果指針到結果集中的一個任意行
etable 對 mysqli_query 引數中連結在前的適應
(一)新增 login 類別兩個屬性
- $dsn
- $sqlConnection
(二)提供可用的資料庫連線帳密
- 由域名決定:在 constant.php 中一個域名對應一個 DSN 常數
- 在 site 中決定:在 siteConstant.php 中指定 $themeDsn 與 $loginDsn
- 在工作程式中指定,直接使用字串
(三)連結時機
- siteConstant.php:同 site 皆使用相同的資料庫連結,不管有 theme 還是沒 theme
- theme.php ,由於各工作程式和 index.php 會載入 theme.php ,所以就不用再進行連結。
(四)DB::queryF
(五)site專一
在 siteConstant.php 中有 signInTable 常數指定認證資料表
ereg_replace被preg_replace取代
ereg_replace("正規表示式", 取代字串, 被蒐尋字串) // 修改後應為: preg_replace("/正規表示式/",取代字串,被蒐尋字串)
「/」代表樣式開始及樣式結束
preg_replace的e修飾
/et/class/wiki/Sanitizer.php 的 565 行
原:$stripped = preg_replace( '!\\\\([0-9A-Fa-f]{1,6})[ \\n\\r\\t\\f]?!e', 'codepointToUtf8(hexdec("$1"))', $stripped );
先註解掉,以後再改。