2012-02-27 94 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();