您在這裡

drupal架站的warning PHP問題解法

jesselue's 的頭像
jesselue 在 2009-11-28 (週六) 17:41 發表

drupal架站的warning PHP問題解法:2009年11月28日星期六
自從依照"水滴架站全機能攻略",試著在自己的XP上架drupal,裝了非核心模組後,往往出現warning訊息,甚至於無法再執行下去,到水滴台灣(dupal.org)站上看看,似乎不少人遇上了相似的狀況,現在將找到的解法記下。本文分實作篇及理論篇,解問題看實作篇;找不到答案的問題看理論篇,可試著自己找答案。使用本文亦請小心注意版本。

本文是在localhost上run,架站版本為:

xampp為1.7.2版、Drupal 6.14版、zh-hant-6.x-1.5(詳見依"水滴架站全機能攻略"步驟成功架站(上))、。

架好站,查看自己PC的configuration為:

Windows XP Home Edition Service Pack 2) i586、PHP version 5.3.0、 Apache/2/2/12(Win32) 、MySQL server 5.1.37 client 5.1.37。

實作篇

(1) 問題message:

An error occur at

http://localhost/drupal/admin/build/views/ajax/display/user_feed1/row_pl...

何處:依照"水滴架站全機能攻略"8-68~8-70頁,管理/網站建置/Views/Add。

    依8-69頁填完各項,按Next後。
    依8-70頁,拉下左上角選單,做完"選擇Feed",桉Add Display。
    依 8-70頁,點擊Row style: Missing style plugin時出現上message

解決方法:

    到c:/xampp/htdocs/drupal/sites/all/modules/views/includes內,打開admin INC檔案102KB。

    Vim editor用Vim editor。再:set nu來設行數,至1559行 。

    function views_ui_ajax_form($js, $key, &$view, $display_id)

    沒有Vim editor,直接double click "admin INC檔案102KB" 。用搜尋找view_ui_ajax-form。也可找到

    function views_ui_ajax_form($js, $key, &$view, $display_id)

    找到function views_ui_ajax_form($js, $key, &$view, $display_id)後,將&$view改為$view,儲存檔案即可。
    解決方法提供者:http://drupal.org/node/604000#comment-2209756水隆頭

 
(2) 問題message:

warning: call_user_func_array() expects parameter 2 to be array, string given in
C:\xampp\htdocs\drupal\sites\all\modules\captcha\captcha.admin.inc on line 20.
何處:管理/使用者管理/CAPTCHA,立刻出現在頁面上。
解決方法:

    到c:/xampp/htdocs/drupal/sites/all/modules/captcha內,找到"captcha.admin INC檔案 20KB",打開"captcha.admin INC檔案 20KB"。

    Vim editor用Vim editor。再:set nu來設行數,至20行 。

    將'list'改為array('list')。

    沒有vim editor,double click "captcha.admin INC檔案 20KB",用記事本做相同的修改。

    用尋找"call_user_func_array"找到20行,將'list'改為array('list')。

    正確的20行為:

    $result = call_user_func_array($module .'_captcha', array('list'));

    解決方法提供者:阿羯。

    至於說為何我知道這麼改?
    先用"call_user_func_array() expects parameter 2 to be array"做股溝search,找到下link。看下link的20行~23行。是call_user_func_array()的語法,因而猜想應該用array('list'),一試,果然OK。

    http://gcov.php.net/viewer.php?version=PHP_5_3&func=tests&file=Zend%2Fte...

 
(3) 問題message:

warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in C:\xampp\htdocs\drupal\modules\aggregator\aggregator.pages.inc on line 260.
何處:click RSS聯播
解決方法:

    到c:/xampp/htdocs/drupal/sites/all/modules/aggregator內,找到"aggregator.pages INC檔案 18KB",打開"aggregator.pages INC檔案 18KB"。
    Vim或記事本找到260行的----if (date('Ymd', $item->timestamp) == date('Ymd')) {,將其改為:

    if ( date_default_timezone_set('UTC' )){

    解決方法提供者:阿羯。

    至於說為何我知道這麼改?見

    date_default_timezone_set() function

(4) 問題message:

warning: Parameter 1 to admin_menu_admin_menu() expected to be a reference, value given in C:\xampp\htdocs\drupal\includes\module.inc on line 471.
何處: 管理/使用者管理/權限
解決方法:

    用Vim或記事本打開C:\xampp\htdocs\drupal\includes\module.inc,471行為

    $result = call_user_func_array($function, $args);

    將其改為

    $result = call_user_func_array($function, &$args);

    warning消失

解決方法提供者:阿羯,有些其他討論,見下link,有的去改admin_menu_admin_menu() function,覺得不甚妥(原因見:http://drupal.org/node/452384#comment-2097968 )。

http://drupal.org/node/615058

為何如此修改?

因為warning說,admin_menu_admin_menu() 的parameter 1需為 reference。故將 $args改為&$args,傳reference進去。

admin_menu_admin_menu() 的定義詳見Lullabot Drupal API reference

(5) 出問題的message:

warning: syntax error, unexpected $end, expecting TC_DOLLAR_CURLY or TC_QUOTED_STRING or '"' in ./sites/all/modules/views/help/views.help.ini on line 190 in C:\xampp\htdocs\drupal\sites\all\modules\advanced_help\advanced_help.module on line 667.
何處: 管理/內容管理/內容類型,選表列裡"部落格文章"右的"managing field"。其他多處也會出現此"line 190" warning。
解決方法:

Vim或記事本打開C:\xampp\htdocs\drupal/sites/all/modules/views/help/views.help.ini,最好設好line number,該行:

title = What's new in Views 2

將其改為:

title = "What's new in Views 2"

如此,warning就消失了。
要注意的是,warning為"line 190",其實是line 166。 若用"記事本",沒有line number,可用搜尋What's new in Views 2找到該166行。

解決方法提供者:http://drupal.org/node/550560http://drupal.org/files/issues/views.help_.ini_.patch

這是用股溝搜尋syntax error, unexpected $end, expecting TC_DOLLAR_CURLY or TC_QUOTED_STRING找到的。

(6) 出問題的message:

warning: Parameter 3 to views_ui_build_form_state() expected to be a reference, value given in C:\xampp\htdocs\drupal\sites\all\modules\views\includes\admin.inc on line 1591.
何處: 管理/網站建置/views/add/,click 第二 column/Basic settings/Style 右的項目,任選一項後click更新即出現此warning。
解決方法:用Vim或記事本打開C:\xampp\htdocs\drupal\sites\all\modules\views\includes\admin.inc 第1591行,最好設好line number,該行:

$form_state = call_user_func_array('views_ui_build_form_state', $top);
將其改為:

$form_state = call_user_func_array('views_ui_build_form_state', array($top,$key,$view,$display_id,$args));

解決方法提供者:阿羯。原理如下,
先用股溝找 call_user_func_array,在 http://php.net/manual/en/function.call-user-func-array.php中看到其定義為:

mixed call_user_func_array ( callback $function , array $param_arr )

用股溝找 views_ui_build_form_state,在http://api.lullabot.com/views_ui_build_form_state中看到其定義為:

function views_ui_build_form_state($js, $key, $view, $display_id, $args)
因而猜想原來1591行的$form_state = call_user_func_array('views_ui_build_form_state', $top);只傳$top給views_ui_build_form_state 不夠,應該傳整個array過去(見call_user_func_array定義),因而將整個array -- array($top,$key,$view,$display_id,$args) 當成 call_user_func_array 的2nd parameter,傳給 views_ui_build_form_state,正好可以work。
注意:

  1. array($top,$key,$view,$display_id,$args) 內的 $top,$key,$view,$display_id,$args 和 views_ui_build_form_state的五個parameter只有第一個不同,而在C:\xampp\htdocs\drupal\sites\all\modules\views\includes\admin.inc 1591行前幾行已將$js assigned給$top,所以,就是傳$js, $key, $view, $display_id, $args給views_ui_build_form_state
  2. 純粹用猜的,沒理論基礎,可以work,但不一定正確,用時需小心side effect、把其他部份搞down了。

理論篇

Vim editor:要修改.inc file或.ini file,可以用Vim editor。用股溝搜尋Vim,即可下載 gVim 7.2。

下載後,裝好。用gVim7.2(不要用gVim Easy 7.2),gVim7.2有command mode及insert mode,簡單方法如下:

  1. 一進入gVim 7.2,在command mode,先:set nu,即可設定line number。
  2. 設完line number,打i即進入insert mode。可鍵入任何東西。
  3. 鍵入完成,按ESC,即回到command mode。

PHP:

  1. .inc結尾的檔案為PHP檔,PHP是種語言,網址在此
  2. .inc檔一開始即有<?php,表示以下為php程式。
  3. 不用由PHP網址第一行看起,那一個function出問題,直接用該function名稱用股溝搜尋。

Apache

  1. Apache是所謂的server,server倒底是幹嘛的?
    • 依O'reilley Apache (the definition guide)所言:Server在主機上running,一直監聽port 80,當有message送到這部主機時,server收下message,並執行message的要求。
  2. 舉例看在www.butterhtlies.com 主機上的 Apacheserver是如何運作的:
  3. 簡單的說,Apacheserver是將URL轉成檔案並回傳。或者是將URL轉成一個程式名(例:一個PHP程式),再回傳該程式所產生的結果。

注意:

  1. 本文將隨著新發現而update。
  2. 小心使用本文,可能和你的架站版本不同。
  3. 若有錯誤請告知。
  4. 若有新發現,亦請告知,以便加入,大家共享。
  5. 本文同步發佈於水滴台灣阿羯部落格(under Drupal 標籤之下)。

 

我是在XP上裝Wamp, 使用Drupal 從來沒有遇到什麽問題,直到最近update到最新版的Wamp, 也在加裝模組時,遇到很多錯誤訊息, 和您抱怨的情況一模一樣。 我後來才知道原來是因爲最新版的Wamp 的PHP version 是5.3.0造成的。我在Wamp上增加並轉換到PHP 5.2.6, 就又恢復正,一切OK .

Drupal 6.0 必須裝在PHP 5.2.x, 不能在PHP 5.3上面運行。 你們將PHP 版本改一下就可以了 (不需要重裝Xampp)。

我在國外的論壇上發現,很多人抱怨Xampp 不如Wamp 好用。 也許您可以試試看 Wamp + PHP 5.2.6 + Drupal 6.14.

用WAMP的話,只需要增加一個PHP version 就好了。然後就可以隨便選擇要用那個版本來run. 我沒用過Xampp, 不是很了解。但是因爲這兩個server 非常相似, 我估計在運作上可能也差不多。

我在另外一個帖子上看到您目前已經解決這個問題。希望以後您的Drupal 進展可以順利一些。我本身是從Wordpress開始,然後到Joomla, 後來發現Joomla 太簡單上手,很快我就覺得很無聊, 才又轉戰Drupal。

Drupal 確實難度高多了,不過這也是它迷人的地方。呵呵。

@@~我的也有錯誤耶~!!
warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in D:\xampp\htdocs\drupal\sites\all\modules\views\includes\view.inc on line 1232.
warning: mysqli_real_escape_string() expects parameter 2 to be string, object given in D:\xampp\htdocs\drupal\includes\database.mysqli.inc on line 323.
warning: Illegal offset type in D:\xampp\htdocs\drupal\sites\all\modules\views\includes\view.inc on line 1236.
warning: Illegal offset type in D:\xampp\htdocs\drupal\sites\all\modules\views\includes\view.inc on line 1271.
recoverable fatal error: Object of class stdClass could not be converted to string in D:\xampp\htdocs\drupal\sites\all\modules\views\views.module on line 751.
warning: Illegal offset type in isset or empty in D:\xampp\htdocs\drupal\sites\all\modules\views\views.module on line 759.

測試網站:
http://dreamlabnfu.dlinkddns.com/drupal/tracker/1