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' )){
解決方法提供者:阿羯。
至於說為何我知道這麼改?見
(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 )。
為何如此修改?
因為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/550560 的http://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。
注意:
- 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。
- 純粹用猜的,沒理論基礎,可以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,簡單方法如下:
- 一進入gVim 7.2,在command mode,先:set nu,即可設定line number。
- 設完line number,打i即進入insert mode。可鍵入任何東西。
- 鍵入完成,按ESC,即回到command mode。
- .inc結尾的檔案為PHP檔,PHP是種語言,網址在此。
- .inc檔一開始即有<?php,表示以下為php程式。
- 不用由PHP網址第一行看起,那一個function出問題,直接用該function名稱用股溝搜尋。
- Apache是所謂的server,server倒底是幹嘛的?
- 依O'reilley Apache (the definition guide)所言:Server在主機上running,一直監聽port 80,當有message送到這部主機時,server收下message,並執行message的要求。
- 舉例看在www.butterhtlies.com 主機上的 Apacheserver是如何運作的:
- 在阿羯PC的IE上鍵入http://www.butterhtlies.com。
- PC會傳出:
- GET / HTTP/1.1
- Host: www.butterhtlies.com
- 這時在網路上的主機都由port 80 監聽,www.butterhtlies.com 主機上的 Apacheserver看到Host:後的www.butterhtlies.com是自己,因而執行GET / HTTP/1.1指令。
- 簡單的說,Apacheserver是將URL轉成檔案並回傳。或者是將URL轉成一個程式名(例:一個PHP程式),再回傳該程式所產生的結果。
- 本文將隨著新發現而update。
- 小心使用本文,可能和你的架站版本不同。
- 若有錯誤請告知。
- 若有新發現,亦請告知,以便加入,大家共享。
- 本文同步發佈於水滴台灣及阿羯部落格(under Drupal 標籤之下)。
Re: drupal架站的warning PHP問題解法
我是在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.
Re: drupal架站的warning PHP問題解法
我是用xampp,請問如何改xampp內的PHP版本?
Re: drupal架站的warning PHP問題解法
我可以分享一下我做的 Portable APM 快速架站包嗎?
用這個麻煩會少很多~
http://drupaltaiwan.org/forum/20090802/3563
Re: drupal架站的warning PHP問題解法
已裝了xampp,可再加裝APM?
Re: drupal架站的warning PHP問題解法
兩個你只能選一個裝~
Re: drupal架站的warning PHP問題解法
用WAMP的話,只需要增加一個PHP version 就好了。然後就可以隨便選擇要用那個版本來run. 我沒用過Xampp, 不是很了解。但是因爲這兩個server 非常相似, 我估計在運作上可能也差不多。
我在另外一個帖子上看到您目前已經解決這個問題。希望以後您的Drupal 進展可以順利一些。我本身是從Wordpress開始,然後到Joomla, 後來發現Joomla 太簡單上手,很快我就覺得很無聊, 才又轉戰Drupal。
Drupal 確實難度高多了,不過這也是它迷人的地方。呵呵。
Re: drupal架站的warning PHP問題解法
@@~我的也有錯誤耶~!!
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