簡體   English   中英

具有Postgres數據庫連接的Joomla 3.4組件

[英]Joomla 3.4 Component with Postgres db 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服務器版本相對應的手冊,以在第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;  
}
}

確實不喜歡此代碼...但是它可以工作:-(

更改

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

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

這樣可以防止在表名上使用引號。

文檔中所述,

QUOTENAME
將SQL語句標識符名稱(例如列,表或數據庫名稱)用引號引起來,以防止注入風險和保留字沖突。

由於您的表不是保留關鍵字,並且您不處理用戶輸入(因此消除了sql注入),因此可以安全地刪除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM