2012-02-27 38 views
10

Tôi đang viết một mô-đun cho Joomla, tại thời điểm này tôi thực sự cần để có thể kết nối với cơ sở dữ liệu bằng cách sử dụng Jfactory. Thông thường người ta chỉ có thể sử dụng $db = JFactory::getDBO();, nhưng lỗi PHP cho tôi biết lớp JFactory không được bao gồm. Vì vậy, bây giờ tôi cần biết cách bao gồm lớp JFactory này. Tôi đã thử một vài gợi ý tìm thấy trên internet, thành công vắng mặt. Đây là mã (nó hoạt động hoàn hảo trên độc lập)bao gồm lớp Jfactory trong một tệp php bên ngoài, 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'; 
} 

} 

?> 

Tôi hy vọng vấn đề của tôi rõ ràng với bạn. giúp đỡ của bạn sẽ được nhiều đánh giá cao.

Cố gắng 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'; 
} 

} 
?> 

nhưng điều này không làm việc một trong hai.

nỗ lực 2 (thành công)

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

Bây giờ nó là tất cả làm việc như tôi muốn. Điều duy nhất bây giờ là: an toàn. Tôi không quá chắc chắn về việc này là bằng chứng của hacker. Ai đó có thể xem lại điều này? thanks :)

+0

Viết mô-đun ..? Vào thời điểm Joomla gọi mô-đun của bạn, JFactory phải được đưa vào. Bạn có chắc đó là một mô-đun Joomla bạn đang viết (có thể là một thành phần hoặc plugin cũng). Xem [Tạo một mô-đun đơn giản] (http://docs.joomla.org/Creating_a_simple_module). –

+0

Xin chào, vâng tôi đang viết một mô-đun. Tôi mong đợi chính xác những gì bạn đang nói, JFactory phải được bao gồm rồi. Nhưng bằng cách nào đó nó không phải. Mã trên được gọi là AJAX. Khi sử dụng mã trên, mọi thứ đều hoạt động như tôi muốn. Nếu tôi loại bỏ các kết nối DB độc lập, không có kết nối .. Tôi đã chỉnh sửa và thêm vào mã sou trên, bạn có thể thấy nỗ lực của tôi. cảm ơn :) –

+1

Bạn nói mã ở trên được gọi là AJAX. Bạn đang sử dụng chính xác URL nào để gọi nó? Điều này sẽ xác định xem bạn đang viết một mô-đun 'thực' (với tất cả khung công tác joomla đã được bao gồm) hay một tập lệnh độc lập cần phải tự thiết lập khung công tác. Nếu AJAX của bạn đang yêu cầu một URL như 'index.php? Option = com_yourcomponent & view = ....', nó sẽ là URL cũ. Nếu bạn đang yêu cầu một URL như '/ modules/mod_yourmodule/...', nó sẽ là URL sau. Tôi đoán nó có lẽ * là * sau này, vì bạn đề cập đến từ 'mô-đun'. Nhưng hãy xác nhận. –

Trả lời

27

Tôi chắc chắn rằng bạn con nó ra, nhưng có lẽ nó sẽ có ích cho người khác

Để sử dụng lớp cơ sở dữ liệu joomla (ngay cả khi bạn biết rằng không được khuyến khích :)) bạn cần, trước hết phải xác định ba hằng số, như:

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

Sau đó, bạn cần phải bao gồm ba tác phẩm, như:

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

Bạn có thể chỉ bao gồm hai tập tin như:

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 

Cuối cùng sử dụng joomla lớp, như:

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

một năm sau đó tôi cần điều này một lần nữa, giải pháp của bạn là tốt hơn so với tôi, cảm ơn :) –

+0

heh, cảm ơn :), tôi cần nó quá – flatronka

+0

Cảm ơn! Tôi cũng cần nó! – arniotaki

1

Để truy cập thông tin cơ sở dữ liệu của Joomla, bạn nên bao gồm ("configuration.php") .Tệp joomla configuaraion này chứa tất cả thông tin về truy cập cơ sở dữ liệu.

lớp JFactory định nghĩa trong thư mục này "joomlaRootFolder/thư viện/joomla/factory.php"

+0

Xin chào, cảm ơn câu trả lời của bạn. Tôi đã thêm tệp này vào tệp của mình: include ('../../../../ configuration.php'); bao gồm ('../../../../ libraries/joomla/factory.php'); $ db = & JFactory :: getDBO(); các tệp được bao gồm chính xác nhưng vẫn không có kết nối. –

1

Gần đây, libraries/joomla/factory.php đã được gỡ bỏ, nhưng lại gây tất cả các tập lệnh sử dụng require_once (JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php'); không thành công. Vì đây vẫn được sử dụng trong nhận & upvoted nhất câu trả lời ở đây, đó là thời gian để cập nhật ...

Bạn không cần lớp JDatabaseFactory nữa để sử dụng chức năng cơ sở dữ liệu Joomla qua JFactory::getDBO(); như lớp JFactory cung cấp cho họ và đã được bao gồm.

Những năm dòng là đủ:

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ạn sẽ có thể để làm ví dụ điều này một lần nữa:

$db =& JFactory::getDBO(); 
$query = "SELECT ..."; 
$db->setQuery($query); 
$db->query(); 
Các vấn đề liên quan