2012-02-27 3 views
10

Я пишу модуль для Joomla, в этот момент мне действительно нужно иметь возможность подключиться к базе данных с помощью Jfactory. Обычно можно просто использовать $db = JFactory::getDBO();, но ошибка PHP говорит мне, что класс JFactory не включен. Теперь мне нужно знать, как включить этот класс JFactory. Я пробовал пару предложений, найденных в Интернете, но пока не был успешным. Это код (он отлично работает на автономном уровне)включают класс Jfactory во внешний php-файл, 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). –

+0

Привет, да, я пишу модуль. Я ожидал точно, что вы говорите, JFactory должен быть включен уже. Но почему-то это не так. Вышеупомянутый код вызывается AJAX. При использовании вышеуказанного кода все работает так, как я хочу. Если я удалю автономное соединение с БД, просто нет соединения. Я отредактировал и добавил выше код, который вы можете увидеть в моей попытке. спасибо :) –

+1

Вы говорите, что приведенный выше код вызывается AJAX. Точно, какой URL-адрес вы используете для его вызова? Это определит, записываете ли вы «настоящий» модуль (со всеми включенными рамками Joomla) или автономный скрипт, который должен сам выполнять настройку фреймворка. Если ваш AJAX запрашивает URL-адрес, например «index.php? Option = com_yourcomponent & view = ....», он будет первым. Если вы запрашиваете URL-адрес, например '/ modules/mod_yourmodule/...', это будет последний. Я предполагаю, что это, вероятно, * * последнее, поскольку вы упоминаете слово «модуль». Но, пожалуйста, подтвердите. –

ответ

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'); 

EDIT

Вы можете включать только два файла, как:

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

через год мне нужно было это снова, ваше решение лучше, чем мое, спасибо :) –

+0

привет, спасибо :), мне тоже нужно – flatronka

+0

Спасибо! Мне тоже нужно! – arniotaki

1

Для доступа к информации о базе данных Joomla, вы должны включить («config.php»). Этот файл конфигурации joomla содержит всю информацию о доступе к базе данных.

класс JFactory определены в этой папке «joomlaRootFolder/библиотеки/Joomla/factory.php»

+0

Здравствуйте, спасибо за ваш ответ. Я добавил это в свой файл: include ('../../../../ configuration.php'); включают ('../../../../ libraries/joomla/factory.php'); $ db = & JFactory :: getDBO(); файлы правильно включены, но соединение по-прежнему отсутствует. –

1

В последнее время libraries/joomla/factory.php был удален, который вызывает все сценарии, которые использовали require_once (JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php');, терпят неудачу. Поскольку это все еще используется в общепринятом & наиболее upvoted ответ здесь, пришло время обновления ...

Вам не нужно больше JDatabaseFactory класса использовать функции базы данных Joomla через JFactory::getDBO(); как 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(); 
Смежные вопросы