2012-02-27 12 views
10

Piszę moduł dla Joomla, w tym momencie naprawdę muszę być w stanie połączyć się z bazą danych przy użyciu Jfactory. Normalnie można by po prostu użyć $db = JFactory::getDBO();, ale błąd PHP mówi mi, że klasa JFactory nie jest zawarta. Więc teraz muszę wiedzieć, jak dołączyć tę klasę JFactory. Próbowałem już kilku sugestii znalezionych w Internecie, nie mając jeszcze sukcesu. To jest kod (działa idealnie na wolnostojącym)należą klasy Jfactory w zewnętrznym pliku 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'; 
} 

} 

?> 

Mam nadzieję, że mój problem jest dla ciebie jasny. Twoja pomoc będzie bardzo ceniona.

Próba 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'; 
} 

} 
?> 

ale to nie działa albo.

próba 2 (sukces)

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

Teraz to wszystko działa tak, jak chcę. Teraz jest tylko jedno: bezpieczeństwo. Nie jestem pewien, czy to dowód hakerski. Czy ktoś może to sprawdzić? dzięki :)

+0

Pisanie modułu ..? Zanim Joomla zadzwoni do twojego modułu, JFactory musi być już włączony. Czy na pewno jest to moduł Joomla, który piszesz (może to być również komponent lub wtyczka). Zobacz [Tworzenie prostego modułu] (http://docs.joomla.org/Creating_a_simple_module). –

+0

Witam, tak, piszę moduł. Spodziewałem się dokładnie tego, co mówisz, JFactory musi być już włączony. Ale jakoś nie jest. Powyższy kod jest wywoływany przez AJAX. Podczas korzystania z powyższego kodu wszystko działa tak, jak chcę. Jeśli usunę oddzielne połączenie DB, to po prostu nie ma połączenia..Medytowałem i dodałem powyższy kod sou widzisz moją próbę. dzięki :) –

+1

Mówisz, że powyższy kod jest wywoływany przez AJAX. Dokładnie jakiego adresu URL używasz, aby go nazwać? Spowoduje to określenie, czy piszesz "prawdziwy" moduł (z już uwzględnioną strukturą joomla), czy samodzielny skrypt, który musi wykonać samą instalację szkieletu. Jeśli twoja AJAX żąda adresu URL, takiego jak "index.php? Option = com_yourcomponent & view = ....", będzie to pierwsze. Jeśli żądasz adresu URL, takiego jak "/ modules/mod_yourmodule/...", będzie to drugie. Domyślam się, że to * jest * tym ostatnim, ponieważ wspominasz słowo "moduł". Ale proszę potwierdzić. –

Odpowiedz

27

Jestem pewien, że zrozumieć to, ale może warto byłoby dla kogoś innego

Aby wykorzystać Klasa bazie joomla (nawet jeśli wiesz, że nie jest zalecany :)) trzeba najpierw zdefiniować trzy stałe, takie jak:

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

Następnie trzeba podać trzy pliki, takie jak:

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

można zawierać tylko dwa pliki jak:

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 

Wreszcie użyć klasy Joomla, jak:

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

rok później potrzebowałem tego ponownie, twoje rozwiązanie jest lepsze niż moje, dzięki :) –

+0

heh, dzięki :), też tego potrzebuję – flatronka

+0

Dzięki! Ja również tego potrzebuję! – arniotaki

1

Aby uzyskać dostęp do informacji z bazy danych Joomla, powinieneś dołączyć ("configuration.php") .Ten plik konfiguracyjny joomla zawiera wszystkie informacje o dostępie do bazy danych.

klasa JFactory zdefiniowane w tym folderze „joomlaRootFolder/libraries/joomla/factory.php”

+0

Witam, dziękuję za odpowiedź. Dodałem to do mojego pliku: include ("../../../../ configuration.php"); include ("../../../../ bibliotek/joomla/factory.php"); $ db = & JFactory :: getDBO(); pliki są odpowiednio uwzględnione, ale wciąż nie ma połączenia. –

1

niedawna libraries/joomla/factory.php został usunięty, co było przyczyną wszystkie skrypty, które wykorzystywały require_once (JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php');, aby zawiodły. Jak to jest nadal używany w przyjętym & najbardziej upvoted odpowiedzi tutaj, nadszedł czas na aktualizację ...

Nie trzeba już klasę JDatabaseFactory korzystania z funkcji bazy danych Joomla przez JFactory::getDBO(); jako klasa JFactory zapewnia im i zostanie już uwzględnione.

tych pięciu liniach są wystarczająco:

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

Będziesz mógł to zrobić na przykład ponownie:

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