我正在开发一个joomla组件来从postgres数据库中读取一些数据。 Joomla安装在mysql上。 在模型中我有
protected function getListQuery()
{
$option = array(); //prevent problems
$option['driver'] = 'postgresql'; // Database driver name
$option['host'] = '192.168.1.0'; // Database host name:port number
$option['port'] = '1111';
$option['user'] = 'user'; // User for database authentication
$option['password'] = 'password'; // Password for database authentication
$option['database'] = 'PGDB'; // Database name
$option['prefix'] = ''; // Database prefix (may be empty)
$dbstock = JDatabaseDriver::getInstance( $option );
$query = $dbstock->getQuery(true);
$query->select('*')->from($dbstock->quoteName('myTable'));
return $query;
}
我从视图中看到错误,因为dabase服务器似乎不喜欢表名中的引号:
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在" myTable"附近使用正确的语法。限制20'在第2行SQL = SELECT * FROM" myTable"限制20
我该怎么办?
为什么这个有用呢?
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
class SLCatalogModelProducts extends JModelList
{
public function __construct($config = array())
{
parent::__construct($config);
$option = array(); //prevent problems
$option['driver'] = 'postgresql'; // Database driver name
$option['host'] = '192.168.1.1'; // Database host name:port number
$option['user'] = 'user'; // User for database authentication
$option['password'] = 'password'; // Password for database authentication
$option['database'] = 'PGSQL'; // Database name
$option['prefix'] = '';
$db = JDatabaseDriver::getInstance( $option );
parent::setDbo($db);
}
/**
* Method to build an SQL query to load the list data.
*
* @return string An SQL query
*/
protected function getListQuery()
{
$option = array(); //prevent problems
$option['driver'] = 'postgresql'; // Database driver name
$option['host'] = '192.168.1.1'; // Database host name:port number
$option['user'] = 'user'; // User for database authentication
$option['password'] = 'password'; // Password for database authentication
$option['database'] = 'PGSQL'; // Database name
$option['prefix'] = ''; // Database prefix (may be empty)
$dbstock = JDatabaseDriver::getInstance($option);
$query = $dbstock->getQuery(true);
$query->select('*')
->from('myTable');
return $query;
}
}
真的不喜欢这段代码......但它有效:-(
答案 0 :(得分:0)
更改
$query->select('*')->from($dbstock->quoteName('myTable'));
到
$query->select('*')->from('myTable');
这可以防止强制引用表名。
如docs中所述,
<强> QUOTENAME 强>
将SQL语句标识符名称(如列,表或数据库名称)用引号括起来,以防止注入风险和保留字冲突。
由于您的表不是保留关键字,并且您没有处理用户输入(因此消除了sql注入),您可以安全地删除它。