2012-02-27 47 views
10

我正在爲Joomla編寫一個模塊,此時我真的需要能夠使用Jfactory連接到數據庫。通常可以簡單地使用$db = JFactory::getDBO();,但PHP錯誤告訴我不包含JFactory類。 所以現在我需要知道如何包含這個JFactory類。我已經嘗試了一些在互聯網上發現的建議,但沒有成功。這是代碼(它可以獨立運行)在外部php文件中包含Jfactory類,Joomla

<?php 
// server info 
$server = 'localhost'; 
$user = 'ss'; 
$pass = 'oo'; 
$db = 'ss'; 

$connection = mysql_connect($server, $user, $pass) or die ("Could not connect to server ... \n" . mysql_error()); 
mysql_select_db($db) or die ("Could not connect to database ... \n" . mysql_error()); 


if(isSet($_POST['username'])) 
{ 
$username = $_POST['username']; 
$username = mysql_real_escape_string($username); 
$sql_check = mysql_query("SELECT Username FROM users WHERE Username='$username'"); 

if(mysql_num_rows($sql_check)) 
{ 
echo '<font color="#cc0000"><STRONG>'.$username.'</STRONG> is already in use.</font>'; 
} 
else 
{ 
echo 'OK'; 
} 

} 

?> 

我希望我的問題對你很清楚。您的幫助將不勝感激。

嘗試1

<?php 

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

include('../../../../libraries/joomla/factory.php'); 

$config =& JFactory::getConfig(); 

// server info 
$server2 = $host; 
$user2 = $user; 
$pass2 = $password; 
$db2 = $db; 

$connection = mysqli_connect($server2, $user2, $pass2) or die ("Could not connect to server ... \n" . mysqli_error()); 
mysqli_select_db($db2) or die ("Could not connect to database ... \n" . mysqli_error()); 


if(isSet($_POST['username'])) 
{ 
$username = $_POST['username']; 
$username = mysql_real_escape_string($username); 
$sql_check = mysql_query("SELECT username FROM #__users WHERE username='$username'"); 

if(mysql_num_rows($sql_check)) 
{ 
echo '<font color="#cc0000"><STRONG>'.$username.'</STRONG> is already in use.</font>'; 
} 
else 
{ 
echo 'OK'; 
} 

} 
?> 

但這不是工作要麼。

嘗試2(成功)

include('../../../../configuration.php'); 
$jc = new JConfig(); 
$table = 'users'; 
$users = $jc->dbprefix . $table; 
// connect to the database 
$mysqli = new mysqli($jc->host, $jc->user, $jc->password, $jc->db); 

現在是所有的工作,我想。現在唯一的事情就是:安全。我不太確定這是黑客的證據。有人可以檢查這個嗎?謝謝:)

+0

寫一個模塊..?當Joomla調用你的模塊時,JFactory已經被包含了。你確定這是一個你正在寫的Joomla模塊(也可能是一個組件或插件)。請參閱[創建簡單模塊](http://docs.joomla.org/Creating_a_simple_module)。 – 2012-02-27 12:09:31

+0

你好,是的,我正在寫一個模塊。我確切地預計你在說什麼,JFactory已經被包括在內了。但不知何故,事實並非如此。上面的代碼被AJAX調用。當使用上面的代碼時,一切都按照我的想法工作。如果我刪除了獨立的數據庫連接,就沒有連接。我編輯並添加了上面的代碼,你可以看到我的嘗試。謝謝:) – 2012-02-27 13:48:21

+1

你說上面的代碼被AJAX調用。但是,具體使用哪個URL來調用它?這將決定你是在編寫一個'真正'的模塊(所有的joomla框架已經包括在內),還是一個需要自己完成框架設置的獨立腳本。如果你的AJAX正在請求一個像'index.php?option = com_yourcomponent&view = ....'的URL,它將會是前者。如果你要求一個像'/ modules/mod_yourmodule/...'這樣的URL,它將成爲後者。我猜測它可能是*後者,因爲你提到了'模塊'這個詞。但請確認。 – 2012-02-27 16:34:19

回答

27

我敢肯定,你看着辦吧,但也許這將是爲別人

要使用有用的Joomla數據庫類(即使你知道這是不推薦:)),你需要先定義三個常量,如:

define('_JEXEC', 1); 
define('DS', DIRECTORY_SEPARATOR); 
define('JPATH_BASE', $_SERVER[ 'DOCUMENT_ROOT' ]); 

然後,你需要包括三個文件,如:

require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php'); 
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php'); 
require_once(JPATH_BASE . DS . 'libraries' . DS . 'joomla' . DS . 'factory.php'); 
$mainframe =& JFactory::getApplication('site'); 

編輯

只能包含兩個文件,如:

define('JPATH_BASE', $_SERVER[ 'DOCUMENT_ROOT' ]); // define JPATH_BASE on the external file 
require_once(JPATH_BASE . DS . 'libraries' . DS . 'import.php'); // framework 
require_once(JPATH_BASE . DS . 'configuration.php'); // config file 

最後使用的Joomla類,如:

$db = JFactory::getDBO(); 
+0

一年後,我再次需要這個,你的解決方案比我的好,謝謝:) – 2013-03-21 09:52:00

+0

嘿,謝謝:),我也需要它 – flatronka 2013-07-27 18:28:54

+0

謝謝!我也需要它! – arniotaki 2016-12-19 08:43:08

1

爲了訪問Joomla的數據庫信息,你應該包括(「configuration.php」)。這個joomla configuaraion文件包含了數據庫訪問的所有信息。此文件夾中定義

類JFactory「joomlaRootFolder /庫/的Joomla/factory.php」

+0

你好,謝謝你的回答。我將它添加到我的文件中:include('../../../../ configuration.php'); include('../../../../ libraries/joomla/factory.php'); $ db =&JFactory :: getDBO();這些文件被正確包含,但仍然沒有連接。 – 2012-02-27 13:24:33

1

近日,libraries/joomla/factory.php已被刪除,這是造成所有使用require_once (JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php');失敗的腳本。 由於這在接受&最upvoted這裏的答案是仍在使用,它的時間來更新...

你不需要JDatabaseFactory類再通過JFactory::getDBO();使用的Joomla數據庫功能作爲JFactory類爲他們提供並已包括在內。

這五行足夠

define('_JEXEC', 1); 
define('JPATH_BASE', dirname(__FILE__)); 
define('DS', DIRECTORY_SEPARATOR); 
require_once JPATH_BASE.DS.'includes'.DS.'defines.php'; 
require_once JPATH_BASE.DS.'includes'.DS.'framework.php'; 

您將能夠例如做這再次:

$db =& JFactory::getDBO(); 
$query = "SELECT ..."; 
$db->setQuery($query); 
$db->query();