включить класс Jfactory во внешний php-файл, Joomla - PullRequest
12 голосов
/ 27 февраля 2012

Я пишу модуль для Joomla, на данный момент мне действительно нужно иметь возможность подключаться к базе данных с помощью Jfactory.Обычно можно просто использовать $db = JFactory::getDBO();, но ошибка PHP говорит мне, что класс JFactory не включен. Так что теперь мне нужно знать, как включить этот класс JFactory .Я попробовал пару предложений, найденных в интернете, но пока безуспешно.Это код (он отлично работает в автономном режиме)

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

Теперь все работает так, как я хочу.Теперь единственное: безопасность.Я не слишком уверен, что это доказательство хакера.Может кто-нибудь это пересмотреть?спасибо:)

Ответы [ 3 ]

30 голосов
/ 24 апреля 2012

Я уверен, что вы поймете это, но, возможно, это будет полезно для кого-то другого

Чтобы использовать класс базы данных 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();
3 голосов
/ 28 ноября 2017

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

Вам больше не нужен класс 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();
1 голос
/ 27 февраля 2012

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

класс JFactory, определенный в этой папке "joomlaRootFolder / library / joomla/factory.php"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...