1. 程式人生 > >php錯誤提示:Call-time pass-by-reference has been deprecated 。PHP升級到5.5+後MySQL函式及其Mysqli函式代替用法

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 未來的版本中很可能不再支援。鼓勵使用的方法是在函式定義中指定哪些引數應該用引用傳遞。鼓勵大家嘗試關閉此選項並確保指令碼能夠正常執行,以確保該指令碼也能在未來的版本中執行(每次使用此特性都會收到一條警告)。

在函式呼叫時通過引用傳遞引數是不推薦的,因為它影響到了程式碼的整潔。如果函式的引數沒有宣告作為引用傳遞,函式可以通過未寫入文件的方法修改其引數。要避免其副作用,最好僅在函式宣告時指定那個引數需要通過引用傳遞。

參見引用的解釋

 

Changelog for allow_call_time_pass_reference
版本 說明
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

  1. // 正確寫法  
  2. function myFunc(&$arg) { do something... }  
  3.    
  4. myFunc($var);//Call myFunc  
  5.    
  6. //錯誤寫法  
  7. function myFunc($arg) { do something... }  
  8.    
  9. 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

出錯行:

 
  1. $errorCode = $action->login($uid, $pass, &$user); 

login方法的定義:

 
  1. class XXXXXXX { 
  2.     public function login($userName, $userPass, &$user = NULL){ 
  3.         //...... 
  4.     } 

按引用傳參,其實只用在定義時指定“&”即可,呼叫時不用寫,只不過一直以來都這麼寫也沒報過錯,看來是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 查詢,並不獲取和快取結果的行