php錯誤提示:Call-time pass-by-reference has been deprecated 。PHP升級到5.5+後MySQL函式及其Mysqli函式代替用法
php錯誤提示:Call-time pass-by-reference has been deprecated
在函式呼叫時引數被按照引用傳遞時是否發出警告。此方法已不被贊成並在 PHP/Zend 未來的版本中很可能不再支援。鼓勵使用的方法是在函式定義中指定哪些引數應該用引用傳遞。鼓勵大家嘗試關閉此選項並確保指令碼能夠正常執行,以確保該指令碼也能在未來的版本中執行(每次使用此特性都會收到一條警告)。
在函式呼叫時通過引用傳遞引數是不推薦的,因為它影響到了程式碼的整潔。如果函式的引數沒有宣告作為引用傳遞,函式可以通過未寫入文件的方法修改其引數。要避免其副作用,最好僅在函式宣告時指定那個引數需要通過引用傳遞。
參見引用的解釋。
版本 | 說明 |
---|---|
5.4.0 | 從 PHP 中移除。 |
5.3.0 | Emits an E_DEPRECATED level error. |
5.0.0 | Deprecated, and generates an E_COMPILE_WARNING level error. |
************************************************************************************************************************************************************************************
PHP在升級到5.4版本的php可能會出現這種錯誤:
如果這樣使用函式(或者類)的話,會產生一個 PHP Fatal error:
foo(&$var);
實際上,這樣用法在php5.3中就會有提示,只是之前的僅僅會提示Deprecated而已。
[html] view plain copy
- // 正確寫法
- function myFunc(&$arg) { do something... }
- myFunc($var);//Call myFunc
- //錯誤寫法
- function myFunc($arg) { do something... }
- myFunc(&$arg);//Call myFunc
************************************************************************************************************************************************************************************
意思是呼叫時引用傳參已經被移除了,就是不能通過function(&$a)這種方式傳參呼叫函式. 解決方案: 檢視你的php.ini配置檔案,把其中的 allow_call_time_pass_reference引數調整為true,並重啟伺服器試試。 ====================================== 此外,以前的php程式碼在升級到5.4版本的php可能會出現這種錯誤: 當我們這樣使用函式(或者類)的話,會產生一個error: foo(&$var); 實際上,這樣用本來就是錯的,只是之前的錯誤級別僅僅是Deprecated而已。 而正確的使用方法應該是在函式定義時: function foo(& $var) { //other code } 而在呼叫時直接傳參就行了: foo($var);
今天在寫引用時突然出現了Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer錯誤,後來才知道原因是此方法已不被贊成並在 PHP/Zend 未來的版本中很可能不再支援了
解決辦法
第一種方法、 把php.ini的display_errors = on改成display_errors = off (不顯示錯誤)
第二種方法、allow_call_time_pass_reference = Off 變成 allow_call_time_pass_reference = On
出錯行:
- $errorCode = $action->login($uid, $pass, &$user);
login方法的定義:
- class XXXXXXX {
- public function login($userName, $userPass, &$user = NULL){
- //......
- }
- }
按引用傳參,其實只用在定義時指定“&”即可,呼叫時不用寫,只不過一直以來都這麼寫也沒報過錯,看來是5.4版增強了檢查,不允許這種呼叫了。
呼叫時去掉“&”,只保留方法定義中的“&”,這次一切OK了。
===============================================================================
PHP升級到5.5+後MySQL函式及其Mysqli函式代替用法
由於MySQL擴充套件從php 5.5開始棄用,所以以後不推薦大家再用MySQL擴充套件,請用MySQLi或PDO代替,以下是MySQL對應的MySQLi函式(綠色字型)供大家參考。(注:PHP手冊上的有誤,這裡是最準的)
MySQL>>(從PHP 5.5開始棄用)
mysql_affected_rows — (mysqli_affected_rows())取得前一次 MySQL 操作所影響的記錄行數
mysql_client_encoding — (mysqli_character_set_name())返回字符集的名稱(返回當前連線的預設字符集名稱。)
mysql_close — (mysqli_close())關閉 MySQL 連線
mysql_connect — (mysqli_connect())開啟一個到 MySQL 伺服器的連線
mysql_create_db — (mysqli_query() then CREATE DATABASE)新建一個 MySQL 資料庫(廢棄)(用 mysql_query() 來提交一條 SQL 的 CREATE DATABASE 語句來代替)
mysql_data_seek — (mysqli_data_seek())移動內部結果的指標
mysql_db_name — (Query: SELECT DATABASE()非全等)取得 mysql_list_dbs() 呼叫所返回的資料庫名
mysql_db_query — (mysqli_select_db() then the mysqli_query())選擇一個數據庫並在它上面執行一個查詢 從 PHP 5.3.0 起棄用 用 mysql_select_db() 和 mysql_query() 代替
mysql_drop_db — (Execute a DROP DATABASE query)丟棄(刪除)一個 MySQL 資料庫(廢棄)(用 mysql_query() 提交一條 SQL DROP DATABASE 語句來替代)
mysql_errno — (mysqli_errno())返回上一個 MySQL 操作中的錯誤資訊的數字編碼
mysql_error — (mysqli_error())返回上一個 MySQL 操作產生的文字錯誤資訊
mysql_escape_string — (mysqli_escape_string())轉義一個字串用於mysql_query從PHP 5.3.0起棄用用 mysql_real_escape_string() 代替
mysql_fetch_array — (mysqli_fetch_array())從結果集中取得一行作為關聯陣列,或數字陣列,或二者兼有
mysql_fetch_assoc — (mysqli_fetch_assoc())從結果集中取得一行作為關聯陣列
mysql_fetch_field — (mysqli_fetch_field())從結果集中取得列資訊並作為物件返回
mysql_fetch_lengths — (mysqli_fetch_lengths())取得結果集中每個輸出的長度
mysql_fetch_object — (mysqli_fetch_object())從結果集中取得一行作為物件
mysql_fetch_row — (mysqli_fetch_row())從結果集中取得一行作為列舉陣列
mysql_field_flags — (mysqli_fetch_fields() [flags]?)從結果中取得和指定欄位關聯的標誌
mysql_field_len — (mysqli_fetch_field_direct() [length])返回指定欄位的長度
mysql_field_name — (mysqli_fetch_field_direct() [name] or [orgname])取得結果中指定欄位的欄位名
mysql_field_seek — (mysqli_field_seek())將結果集中的指標設定為指定的欄位偏移量
mysql_field_table — (mysqli_fetch_field_direct() [table] or [orgtable])取得指定欄位所在的表名
mysql_field_type — (mysqli_fetch_field_direct() [type])取得結果集中指定欄位的型別
mysql_free_result — (mysqli_free_result())釋放結果記憶體
mysql_get_client_info — (mysqli_get_client_info())取得 MySQL 客戶端資訊
mysql_get_host_info — (mysqli_get_host_info())取得 MySQL 主機資訊
mysql_get_proto_info — (mysqli_get_proto_info())取得 MySQL 協議資訊
mysql_get_server_info — (mysqli_get_server_info())取得 MySQL 伺服器資訊
mysql_info — (mysqli_info())取得最近一條查詢的資訊
mysql_insert_id — (mysqli_insert_id())取得上一步 INSERT 操作產生的 ID(得到在最後一次查詢生成的id)
mysql_list_dbs — (SQL Query: SHOW DATABASES)列出 MySQL 伺服器中所有可用的資料庫(從php5.4.0棄用)(用SQL 查詢: SHOW DATABASES代替)
mysql_list_fields — (SQL Query: SHOW COLUMNS FROM sometable)列出 MySQL 表字段(取得給定表名的資訊)(棄用)(已過時。最好用 mysql_query() 來發出一條 SHOW COLUMNS FROM table [LIKE 'name'] 的 SQL 語句來代替。)
mysql_list_processes — (mysqli_thread_id()不全等)列出 MySQL 程序
mysql_list_tables —(SQL Query: SHOW TABLES FROM db_name) 列出 MySQL 資料庫中的表(棄用)(已棄用。 使用 mysql_query() 發出一個SQL SHOW TABLES [FROM db_name] [LIKE 'pattern']語句代替. )
mysql_num_fields — (mysqli_field_count())取得結果集中欄位的數目
mysql_num_rows — (mysqli_num_rows(),mysqli_stmt_num_rows())取得結果集中行的數目
mysql_pconnect — (mysqli_connect() with p: host prefix)開啟一個到 MySQL 伺服器的持久連線
mysql_ping — (mysqli_ping())Ping 一個伺服器連線,如果沒有連線則重新連線
mysql_query — (mysqli_query())傳送一條 MySQL 查詢
mysql_real_escape_string — (mysqli_real_escape_string())轉義 SQL 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集
mysql_result — (mysqli_data_seek() 聯合 mysqli_field_seek() and mysqli_fetch_field())取得結果資料
mysql_select_db — (mysqli_select_db())選擇 MySQL 資料庫
mysql_set_charset — (mysqli_set_charset())設定客戶端字符集
mysql_stat — (mysqli_stat())取得當前系統狀態
mysql_tablename — (SQL Query: SHOW TABLES)取得表名(取得欄位的表名)(棄用)(已棄用。 使用 mysql_query() 發出一個 SQL SHOW TABLES [FROM db_name] [LIKE 'pattern'] 語句代替. )
mysql_thread_id — (mysqli_thread_id())返回當前執行緒的 ID
mysql_unbuffered_query — (mysqli_query(“SQL語句”, MYSQLI_USE_RESULT); )向 MySQL 傳送一條 SQL 查詢,並不獲取和快取結果的行