【问题标题】:Joomla 3.4 Component with Postgres db connection具有 Postgres 数据库连接的 Joomla 3.4 组件
【发布时间】:2016-01-15 19:27:00
【问题描述】:

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

我从视图中得到错误,因为数据库服务器似乎不喜欢表名中的引号:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“myTable”LIMIT 20' 附近使用正确的语法 SQL=SELECT * FROM “myTable”LIMIT 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;  
}
}

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

【问题讨论】:

    标签: php postgresql joomla database-connection


    【解决方案1】:

    改变

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

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

    这应该防止在表名上强制使用引号。

    docs中所述,

    quoteName
    将 SQL 语句标识符名称(例如列、表或数据库名称)括在引号中,以防止注入风险和保留字冲突。

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

    【讨论】:

    • 谢谢,但是这样看来 joomla 没有得到正确的数据库。这是错误: SELECT 命令拒绝用户 'artsite358'@'localhost' 用于表 'myTable'
    • 那个用户名正确吗?如果是,您能否验证它确实具有连接到指定数据库的适当权限?您可以通过尝试使用相同的凭据进行连接来轻松验证这一点。找出最简单的方法是用 root 替换(在您的本地设置上)用户
    • 是通过连接 phpPgAdmin 验证的用户/密码
    • ... 并且还通过在该数据库上编写一个带有查询的简单 php 页面
    • 可能是别的东西。“SELECT command denied to user”是一个 mysql 错误文本。不是postgresql。
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多