我已经在我的模块中创建了外部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);
答案 0 :(得分:1)
你正在使用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
答案 1 :(得分:1)
对您的数据库查询进行了一些调整,并使用正确的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);
让我知道它是否有效
答案 2 :(得分:0)
使用
echo $ query-> dump();
要查看生成的查询的外观,您可以直接测试查询。
您需要连接到数据库......它是相同还是不同?如果它是相同的你可以做
//创建数据库连接。 $ this-> db = JDatabase :: getInstance( 阵列( '驱动' =>组$ config-> DBTYPE, '主机' =>组$ config->主机, '用户' =>组$ config->用户, '密码' =>组$ config->的密码, '数据库' =>组$ config->分贝, '前缀' =>组$ config-> dbprefix, ) );
但如果是不同的数据库,则需要以其他方式提供连接数据。