2012-02-27 17 views
10

Estoy escribiendo un módulo para Joomla, en este punto realmente necesito poder conectarme a la base de datos usando Jfactory. Normalmente uno podría simplemente usar $db = JFactory::getDBO();, pero el error de PHP me dice que la clase JFactory no está incluida. Así que ahora necesito saber cómo incluir esta clase de JFactory. He intentado un par de sugerencias encontradas en Internet, sin éxito, aún. Este es el código (funciona perfecto en modo independiente)incluye la clase Jfactory en un archivo php externo, 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'; 
} 

} 

?> 

Espero que mi problema esté claro para usted. Su ayuda será muy apreciada.

Intento 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'; 
} 

} 
?> 

pero esto no está funcionando bien.

intento 2 (con éxito)

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

Ahora todo es trabajar como yo quiero. Lo único es ahora: seguridad. No estoy muy seguro de que esto sea una prueba de hackers. ¿Alguien puede revisar esto? gracias :)

+0

Escribiendo un módulo ...? Para cuando Joomla llame a su módulo, JFactory debe estar incluido. ¿Estás seguro de que es un Módulo de Joomla que estás escribiendo (también podría ser un componente o un complemento)? Consulte [Creación de un módulo simple] (http://docs.joomla.org/Creating_a_simple_module). –

+0

Hola, sí, estoy escribiendo un módulo. Esperaba exactamente lo que estás diciendo, JFactory debe ser incluido ya. Pero de alguna manera no es así. El código anterior está siendo llamado por AJAX. Cuando uso el código anterior, todo está funcionando como quiero. Si elimino la conexión de base de datos independiente, simplemente no hay conexión ... edité y agregué el código anterior para ver mi intento. gracias :) –

+1

Usted dice que el código de arriba es llamado por AJAX. ¿Exactamente qué URL estás usando para llamarlo? Esto definirá si está escribiendo un módulo 'real' (con todo el framework joomla ya incluido) o un script independiente que necesita hacer la configuración del framework. Si su AJAX está solicitando una URL como 'index.php? Option = com_yourcomponent & view = ....', será la primera. Si está solicitando una URL como '/ modules/mod_yourmodule/...' será la última. Supongo que probablemente * es * el último, ya que mencionas la palabra 'módulo'. Pero por favor confirma –

Respuesta

27

Estoy seguro de que te diste cuenta, pero tal vez sería útil para otra persona

Para utilizar clase de base de datos de Joomla (incluso si usted sabe que no es recomendable :)) que necesita, en primer lugar definir tres constantes, como:

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

Luego hay que incluir tres archivos, como:

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

EDITAR

Puede incluir sólo dos tipos de archivos:

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 

utilizan Finalmente clase de Joomla, como:

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

un año después lo necesitaba de nuevo, su solución es mejor que la mía, gracias :) –

+0

heh, gracias :), lo necesito también – flatronka

+0

¡Gracias! ¡Yo lo necesito también! – arniotaki

1

Para acceder a la información de la base de datos de Joomla, debe incluir ("configuration.php"). Este archivo joomla configuaraion contiene toda la información de acceso a la base de datos.

JFactory clase definida en esta carpeta "joomlaRootFolder/bibliotecas/joomla/factory.php"

+0

Hola, gracias por tu respuesta. Agregué esto a mi archivo: include ('../../../../ configuration.php'); include ('../../../../ libraries/joomla/factory.php'); $ db = & JFactory :: getDBO(); los archivos están incluidos correctamente, pero todavía no hay conexión. –

1

Recientemente, el libraries/joomla/factory.php ha sido eliminado, lo que estaba causando todos los scripts que utilizaron require_once (JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php'); para fallar. Como esto todavía se utiliza en la & respuesta más upvoted aceptado aquí, es el momento de una actualización ...

usted no necesita la clase JDatabaseFactory más para utilizar las funciones de base de datos de Joomla a través JFactory::getDBO(); como la clase JFactory les ofrece y ya está incluido.

Estas cinco líneas son lo suficientemente:

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

usted será capaz de hacer, por ejemplo, esto otra vez:

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