2007年5月13日 星期日

如何在 joomla 找錯2 --- 常見錯誤

  1. 路徑錯誤 (什麼圖都看不到,版面也怪怪的)

  ------------------------------------------------------------------

  ------------------------------------------------------------------

檢查 joomla安裝目錄\configuration.php 中
註:你的路徑肯定跟我的不一樣,所以你要找出你的正確的路徑

$mosConfig_absolute_path = 'C:/webroot/joomla';
//joomla 安裝目錄的絕對路徑

$mosConfig_cachepath = 'C:/webroot/joomla/cache';
//joomla cache 的絕對路徑

$mosConfig_live_site = 'http://localhost/joomla'; 
//joomla 網站的網址 

另一種常見的路徑錯誤 (安裝元件時)

failed to open stream: No such file or directory

就去找找看那一個檔或是資料夾跑那裏去了,修正路徑後,應該就可以了




  2. 中文顯示亂碼 (但把編碼改成 unicode 後又正常)



檢查 joomla安裝目錄\templates\你的_template\index.php
找尋

<meta http-equiv="Content-Type" content="text/html; <?php
echo _ISO; ?>" />

   
把上面這一行移到 <head> 的下面後存檔

註:這個問題主要是瀏覽器誤用 <title> 的編碼,只要先告訴瀏覽器正確的編碼 _ISO 就好



-------------------------------------------------------------------

另外也有可能是 Apache Default Charset 的問題,虛擬主機比較常會出現這種狀況

你可以在 joomla安裝目錄下,用記事本 (notepad) 寫一個 .htaccess
打入
   
AddDefaultCharset utf-8  

存檔時,記得要在 "存檔類型" 選 "所有檔案"
註:如果你已經有 .htaccess 這個檔,那就直接加在最前面就好


  3. Joomla! RG_EMULATION 設定目前是 `ON` 建議修改 ...



或是



修改 joomla安裝目錄\globals.php
line 24
define( 'RG_EMULATION', 1 );

改成

define( 'RG_EMULATION', 0 );



  4. PHP register_globals 設定目前是 `ON` 建議更改為 `OFF`



如果是自架主機,那修改 php.ini 中的 register_globals 就好

register_globals = Off

如果是虛擬主機 (自架主機也適用),可以修改 .htaccess 檔
在 joomla安裝目錄下,用記事本 (notepad) 寫一個 .htaccess
打入
   
php_value register_globals 0   

存檔時,記得要在 "存檔類型" 選 "所有檔案"



註1:如果你已經有 .htaccess 這個檔,那就直接加在最前面就好
註2:如果你的 PHP 版本 <= 4.2.3,你可以用 ini_set 的方法來解決    註3:如果你的虛擬主機不能用 .htaccess 而且 PHP 版本 > 4.2.3,那就沒辨法




  5. 打錯字、漏打括號、漏打分號

Parse error: syntax error, unexpected T_STRING

這通常都是 PHP 字串多打了一個雙引號或單引號,而又沒有用反斜線 \ 來跳脫


$mosConfig_MetaDesc = 'Joomla - 即時入口網站引擎與內容管理系統, I'm using joomla';

正確應為

$mosConfig_MetaDesc = 'Joomla - 即時入口網站引擎與內容管理系統, I\'m using joomla';

   --------------------------------------

Parse error: syntax error, unexpected T_STRING, expecting ')'

最後的 expecting 可以為 expecting ';', expecting '}'
表示你少打了一個分號 ';' 或括號 ')' 或大括號 '}'
  


6. PHP memory limit 的問題

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 393216 bytes)

如果是自架主機,那修改 php.ini 中的 memory_limit 就好

memory_limit = 16M  

註:memory_limit 的預設值通常為 8M,你可以改高一點

如果是虛擬主機 (自架主機也適用),可以修改 .htaccess 檔
在 joomla安裝目錄下,用記事本 (notepad) 寫一個 .htaccess
打入
   
php_value memory_limit 16M   

存檔時,記得要在 "存檔類型" 選 "所有檔案"
註1:如果你已經有 .htaccess 這個檔,那就直接加在最前面就好
註2:如果你的虛擬主機不能用 .htaccess,可以用 ini_set 的方法來解決


joomla安裝目錄\administrator\index.php
joomla安裝目錄\administrator\index2.php
joomla安裝目錄\administrator\index3.php

每個檔案的
line 23

require_once( '../configuration.php' );

下面加上

ini_set("memory_limit", "16M");  // 20M, 32M, 40M ...

如何在 joomla 找錯1 --- 設定錯誤顯示

我自己還是 joomla 的初學者,才剛接觸 joomla 兩個多月,實在有很多地方還不太明白,不過本著開源軟體的精神,把我的 joomla 找錯經驗分享出來,希望大家多多指教

1. 檢查系統的 display_errors 是否有開



  display_errors 如果沒開,根本不能找錯,因為什麼 bug 都不會看到
 
  在 joomla 資料夾下寫一個小程式 test.php
  
<?php
phpinfo(4);
?>

  執行 test.php 後搜尋 dispay_errors



  如何修改 display_errors 的參數值?

  a. 自架主機

    搜尋 php.ini 中的 display_errors
    修改 display_errors = On 後重新啟動 Web Server

  b. 虛擬主機及自架主機

    在 joomla安裝目錄下,用記事本 (notepad) 寫一個 .htaccess
    打入
   
    php_value display_errors 1   

    存檔時,記得要在 "存檔類型" 選 "所有檔案"
    註:如果你已經有 .htaccess 這個檔,那就直接加在最前面就好



    再次執行剛才的 test.php,應該就會看到結果


   
  c. 如果 display_errors 還是沒有 on,就表示你的 Apache 不允許修改 .htaccess
    也就是 Apache 目錄設定中的 AllowOverride 是 None

    如果你是自己架站的,你可以修改 Apache 目錄的設定
    註:下面的 /webroot/joomla_directory 是你的 joomla 安裝目錄 

<Directory "/webroot/joomla_directory">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

    重新啟動 Apache 就可以了

    ===============================================

    如果你是使用虛擬主機
   
    那只好修改
   
   joomla安裝目錄\administrator\index.php
   joomla安裝目錄\administrator\index2.php
   joomla安裝目錄\administrator\index3.php

    在每個檔案的
    line 23

    require_once( '../configuration.php' );

    下面加上

    ini_set('display_errors', 1);

2. 修改 joomla安裝目錄\configuration.php 中

$mosConfig_debug = '1';
$mosConfig_error_reporting = '2047';
// 如果你的 PHP 版本 > 5.2,你可以用 $mosConfig_error_reporting = '6143';

 ========================================
  如果做到上面這兩步驟,那你就能清楚的來找錯 (debug)
 ========================================

2007年5月12日 星期六

修正 joomla 資料庫中文亂碼 (phpmyadmin)

安裝 joomla 1.0.12 正式版後,從 phpmyadmin 來看都是中文亂碼,無法從 phpmyadmin 中修改 joomla 內容
Export 出來的中文 sql 資料也是中文亂碼

建議修改

includes/database.php
line 101-106

$this->_table_prefix = $table_prefix;
//@mysql_query("SET NAMES 'utf8'", $this->_resource);
$this->_ticker = 0;
$this->_log = array();
}



$this->_table_prefix = $table_prefix;
if ($this->isSupportUtf8()) {
mysql_query("SET NAMES 'utf8'", $this->_resource);
}
$this->_ticker = 0;
$this->_log = array();
}

/**
* @return bool check if mysql support utf8 or not
*/

function isSupportUtf8() { //from dotproject 2.1 rc1 Chinese Mark Wu
// Version lower than 4.1.1 doesn't support utf8
if (mysql_get_server_info($this->_resource) < '4.1.1') return false;

// check if utf8 support was compiled in
$result = mysql_query("SHOW CHARACTER SET like 'utf8'", $this->_resource);
if (mysql_num_rows($result) > 0) {
return true;
}
return false;
}

-------------------------------------------

修改

installation/install2.php
line 67

$sql = "CREATE DATABASE `$DBname`";



if ($database->isSupportUtf8()) {
$sql = "CREATE DATABASE `$DBname` CHARACTER SET utf8 COLLATE utf8_general_ci";
} else {
$sql = "CREATE DATABASE `$DBname`";

}


這樣 "新安裝 joomla" 的人就不會有中文亂碼的問題,以上的程式主要是檢查 mysql 是否為 4.1.1 或是更新的版本,因為在 mysql 4.1.1 以後有支援 utf8,下面的方法主要是針對已經安裝過 joomla 的人,而且資料庫已經有不少資料的情況

===========================================================

如何轉換舊的 joomla 資料 latin1 成 utf8

註:如果你的 mysql 版本比 4.1.1 還要舊,以下的內容你就不需要看

(1) 修改 phpmyadmin

註:如果你使用虛擬主機,你需要自己上傳一個 phpmyadmin,然後設定
 (設定可以參考 http://www.chweng.idv.tw/serverguide/phpmyadmin.php)

修改 phpmyadmin_安裝目錄\libraries\select_lang.lib.php (大約是在 line 350 -370 之間)

$mysql_charset_map = array(
'big5' => 'big5',
'cp-866' => 'cp866',
'euc-jp' => 'ujis',
'euc-kr' => 'euckr',
'gb2312' => 'gb2312',
'gbk' => 'gbk',
'iso-8859-1' => 'latin1',
'iso-8859-2' => 'latin2',
'iso-8859-7' => 'greek',
'iso-8859-8' => 'hebrew',
'iso-8859-8-i' => 'hebrew',
'iso-8859-9' => 'latin5',
'iso-8859-13' => 'latin7',
'iso-8859-15' => 'latin1',
'koi8-r' => 'koi8r',
'shift_jis' => 'sjis',
'tis-620' => 'tis620',
'utf-8' => 'utf8',
'windows-1250' => 'cp1250',
'windows-1251' => 'cp1251',
'windows-1252' => 'latin1',
'windows-1256' => 'cp1256',
'windows-1257' => 'cp1257',
);

成 

$mysql_charset_map = array(
'big5' => 'latin1',
'cp-866' => 'cp866',
'euc-jp' => 'ujis',
'euc-kr' => 'euckr',
'gb2312' => 'latin1',
'gbk' => 'latin1',
'iso-8859-1' => 'latin1',
'iso-8859-2' => 'latin2',
'iso-8859-7' => 'greek',
'iso-8859-8' => 'hebrew',
'iso-8859-8-i' => 'hebrew',
'iso-8859-9' => 'latin5',
'iso-8859-13' => 'latin7',
'iso-8859-15' => 'latin1',
'koi8-r' => 'koi8r',
'shift_jis' => 'sjis',
'tis-620' => 'tis620',
'utf-8' => 'latin1',
'windows-1250' => 'cp1250',
'windows-1251' => 'cp1251',
'windows-1252' => 'latin1',
'windows-1256' => 'cp1256',
'windows-1257' => 'cp1257',
);

註:如果你只希望在 phpmyadmin 中看到正常的中文,那下一步你就不需要做,因為下一步的方法會把整個資料改成 utf8



(2) 匯出整個資料庫的資料

用 phpmyadmin 匯出整個資料庫的資料 (如:你匯出成 joomla-bk.sql)

用 notepad++ 打開 joomla-bk.sql (你之前匯出的資料庫資料)
註:notepad++ 下載 (http://sourceforge.net/projects/notepad-plus/)

a. 使用 utf-8 編碼 (檔首無 BOM)



按 utf-8 編碼 (檔首無 BOM)



b. 取代 latin1 成 utf8

把所有的 DEFAULT CHARSET=latin1 換成 DEFAULT CHARSET=utf8 (按 ctrl+H --> 全部取代)


c. 搜尋 core_acl_aro

按 ctrl+F 來搜尋 core_acl_aro,只有這個 Table 的 DEFAULT CHARSET 不能改為 utf8,所以要改回來 latin1

CREATE TABLE `jos_core_acl_aro` (
`aro_id` int(11) NOT NULL auto_increment,
`section_value` varchar(240) NOT NULL default '0',
`value` varchar(240) NOT NULL default '',
`order_value` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`hidden` int(11) NOT NULL default '0',
PRIMARY KEY (`aro_id`),
UNIQUE KEY `section_value_value_aro` (`section_value`,`value`),
UNIQUE KEY `jos_gacl_section_value_value_aro` (`section_value`,`value`),
KEY `hidden_aro` (`hidden`),
KEY `jos_gacl_hidden_aro` (`hidden`)
) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=latin1;

d. 將 joomla-bk.sql 存檔

e. 把 phpmyadmin 改回原來的設定

把 (1) phpmyadmin\libraries\select_lang.lib.php 的設定改回來
'big5' => 'big5',
'gb2312' => 'gb2312',
'gbk' => 'gbk',
'utf-8' => 'utf8',   

f. 建立一個測試資料庫

建立一個測試資料庫 testjoomla (連線校對使用 utf8_general_ci)


g. 匯入 joomla-bk.sql




h. 修改 joomla_安裝目錄\includes\database.php
  line 102
//@mysql_query("SET NAMES 'utf8'", $this->_resource);



@mysql_query("SET NAMES 'utf8'", $this->_resource);

i. 修改 joomla_安裝目錄\configuration.php 中的 $mosConfig_db, $mosConfig_user, $mosConfig_password

$mosConfig_db = 'testjoomla';
// 修改成 testjoomla

$mosConfig_user = 'testjoomla_databae_user';
// 你的 testjoomla 資料庫 user

$mosConfig_password = 'testjoomla_database_password';
// 你的 testjoomla 資料庫 user password

如果回到首頁,看到的都是你我熟悉的中文字,那就恭喜你沒做白工

再測試新增內容,然後從前後台及 phpmyadmin 去看,如果又是你我熟悉的中文字,那再次恭喜你解決了中文亂碼

最後測試從 phpmyadmin 修改中文字,如果修改的結果會在網站看到,那就恭喜你終於告別了 phpmyadmin 中文亂碼

=================================================

.... 如果還是中文亂碼一堆 ....

....

......


撱???撱???蝞∠?
  ??窗', 'o
   ??窗蝞∠?'
  ??窗??', '',
  擐?
  ?餃
  ??
  憭折??萎辣

撱???撱???蝞∠?
  ??窗', 'o
   ??窗蝞∠?'
  ??窗??', '',
  擐?
  ?餃
  ??
  憭折??萎辣

......

....




那恭喜你還是可以回復原來的 database,直接修改步驟 i 就好...
就當做什麼事情都沒有發生過 :)