Joomla 3.4组件与Postgres数据库连接

时间:2016-01-15 19:27:00

标签: php postgresql joomla database-connection

我正在开发一个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;  
}
}

真的不喜欢这段代码......但它有效:-(

1 个答案:

答案 0 :(得分:0)

更改

$query->select('*')->from($dbstock->quoteName('myTable'));

$query->select('*')->from('myTable');

这可以防止强制引用表名。

docs中所述,

  

<强> QUOTENAME
  将SQL语句标识符名称(如列,表或数据库名称)用引号括起来,以防止注入风险和保留字冲突。

由于您的表不是保留关键字,并且您没有处理用户输入(因此消除了sql注入),您可以安全地删除它。