首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从外部php文件连接joomla3 DB?

如何从外部php文件连接joomla3 DB?
EN

Stack Overflow用户
提问于 2014-03-11 17:26:31
回答 3查看 2.7K关注 0票数 0

我在我的模块中创建了外部php文件,在那里我使用了一些sql查询,首先我尝试使用php/mysql,然后我尝试将它转换成joomla样式。但是,当我使用joomla框架来db时,连接会产生错误。

旧代码:来自PHP

代码语言:javascript
复制
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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-11 17:56:02

您正在使用Joomla的"SDK“和纯PHP方法进行数据访问,所以我建议不要使用这种混合:

1) mysql_fetch_array将被解析,实际上它希望第一个参数是用mysql_connect调用创建的mysql连接,这就是为什么错误说第一个参数希望是一个资源,您可以在这里检查array中的文档。

2)由于您使用来自joomla的数据访问类来获取连接和构建查询,这是很好的,我建议继续使用它来获取结果并遍历它们,如下所示。

代码语言:javascript
复制
// 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的DB access的更多信息,请访问这里:JDatabase

票数 1
EN

Stack Overflow用户

发布于 2014-03-11 19:13:52

对数据库查询做了一些调整,并将$_GET替换为正确的Joomla方法

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-03-11 23:28:10

  1. 使用 echo $query->dump();

要查看生成的查询是什么样子,然后可以直接测试查询。

  1. 你需要连接到数据库..。是一样还是不同?如果这也是你能做的 //创建数据库连接。$this->db = JDatabase::getInstance(数组( 'driver‘=> $config->dbtype,'host’=> $config-> => $config->host,'user‘=> $config->user,'password’=> $config->password,‘=> $config->db,’=>$config->db前缀,‘=>’=>$config->db前缀,);

但是,如果它是一个不同的数据库,则需要以其他方式提供连接数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22332125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档