簡體   English   中英

如何從外部php文件連接joomla3 DB?

[英]How to connect joomla3 DB from external php file?

我已經在我的模塊中創建了外部php文件,並且我已經使用了一些sql查詢,首先我嘗試使用php / mysql並且它有效,然后我嘗試將其轉換為joomla樣式。 但是當我使用joomla框架進行數據庫連接時會出錯

舊代碼:FROM PHP

mysql_connect("localhost","root","");
mysql_select_db("1234");

 $searchp=$_GET["term"];
 $query=mysql_query("SELECT * FROM sltdb_cddir_content where title like '%".$searchp."%'AND categories_id=82 order by title ASC ");
 $json=array();
    while($display=mysql_fetch_array($query)){
         $json[]=array(
                    'value'=> $display["title"],
                    'label'=>$display["title"]
                        );
    }

 echo json_encode($json);

新規范:JOOMLA3

    define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);

define('JPATH_BASE', $_SERVER['DOCUMENT_ROOT'] . DS . '');

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

//create application
$mainframe = &JFactory::getApplication('site');
$db = JFactory::getDBO();

// Create a new query object.
$query = $db -> getQuery(true);
$searchp = $_GET["term"];
$query -> select($db -> quoteName(array('title')));
$query -> from($db -> quoteName('sltdb_cddir_content'));
$query -> where($db -> quoteName('title') . ' LIKE ' . $db -> quote('\'$searchp.%\''));
$query -> order('ordering ASC');

$db -> setQuery($query);
$json = array();
while ($display = mysql_fetch_array($query)) {
    $json[] = array('value' => $display["title"], 'label' => $display["title"]);
}

echo json_encode($json);

轉換為joomla中的代碼后,它給出了一個錯誤

*“mysql_fetch_array()期望參數1是資源,對象在”*中給出

請告訴我我做錯了什么。

編輯01

    define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);

define('JPATH_BASE', $_SERVER['DOCUMENT_ROOT'] . DS . '');

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

//create application
$mainframe = &JFactory::getApplication('site');
$searchp = $_GET["term"];
$db = JFactory::getDBO();

// Create a new query object.
$query = $db -> getQuery(true);

$query -> select($db -> quoteName(array('title')));
$query -> from($db -> quoteName('sltdb_cddir_content'));
$query -> where($db -> quoteName('title') . ' LIKE ' . $db -> quote('\'$searchp.%\''));
$query->where($db->quoteName('categories_id')." = ".$db->quote(82));
$query -> order('ordering ASC');

$db->setQuery($query);

$results = $db-> loadAssocList();
$json = array();
foreach($results as $json_result) {
  $json[] = array('value' => $json_result["title"], 'label' => $json_result["title"]) ;
}

echo json_encode($json);

你正在使用Joomla的“SDK”與純PHP方法混合進行數據訪問,所以我建議遠離這種混合:

1)mysql_fetch_array它將被刪除,實際上它期望第一個參數是用mysql_connect調用創建的mysql連接,這就是為什么錯誤說第一個參數應該是一個資源,你可以在這里查看文檔http ://www.php.net/mysql_fetch_array

2)由於您使用joomla的數據訪問類來獲取連接並構建查詢,這很好,我建議繼續使用它來獲取結果並循環遍歷它們,就像這樣。

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of associated arrays.
$results = $db-> loadAssocList();
$json = array();
foreach($results as $json_result) {
  $json[] = array('value' => $json_result["title"], 'label' => $json_result["title"]) 
}

有關Joomla數據庫訪問的更多信息,請訪問: http//docs.joomla.org/Selecting_data_using_JDatabase

對您的數據庫查詢進行了一些調整,並使用正確的Joomla方法替換了$_GET

define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);
define('JPATH_BASE', $_SERVER['DOCUMENT_ROOT'] . DS . '');
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');

$app    = JFactory::getApplication();
$jinput = $app->input;
$db     = JFactory::getDbo();

$searchp = $jinput->get('term', null, null);
$id = 82;

$query = $db->getQuery(true);
$query->select($db->quoteName('title'))
      ->from($db->quoteName('sltdb_cddir_content'))
      ->where($db->quoteName('title') . ' LIKE ' . $db->quote($searchp))
      ->where($db->quoteName('categories_id') . ' = ' . $db->quote((int) $id))
      ->order('ordering ASC');
$db->setQuery($query);

如果有效,請告訴我

  1. 采用

    echo $ query-> dump();

要查看生成的查詢的外觀,您可以直接測試查詢。

  1. 您需要連接到數據庫......它是相同還是不同? 如果它是相同的你可以做

    //創建數據庫連接。 $ this-> db = JDatabase :: getInstance(array('driver'=> $ config-> dbtype,'host'=> $ config-> host,'user'=> $ config-> user,'password'= > $ config-> password,'database'=> $ config-> db,'prefix'=> $ config-> dbprefix,));

但如果它是不同的數據庫,則需要以其他方式提供連接數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM