Я пишу модуль для 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'; } } ?>
в<?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'; } } ?>
в<?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);
в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);
Теперь все работает так, как я хочу. Теперь единственное: безопасность. Я не слишком уверен в том, что это хакерское доказательство. Может кто-нибудь это проверить? благодаря 🙂
Я уверен, что вы это поняли, но, возможно, это было бы полезно для кого-то еще
Чтобы использовать класс базы данных 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();
Для доступа к информации о базе данных Joomla необходимо включить («configuration.php»). Этот файл конфигурации joomla содержит всю информацию о доступе к базе данных.
класс JFactory, определенный в этой папке «joomlaRootFolder / libraries / joomla / factory.php»
Недавно 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();