1

我对 joomla 和 sql 的经验很少,非常感谢您的帮助!我正在使用 joomla 2.5,我正在从数据库中查询数据并将其存储在内存中,代码如下:

function getList()
{
    $mainframe = JFactory::getApplication('site');
        $db = JFactory::getDBO();
        $query = "  SELECT 
                    * 
                FROM 
                    #__ListUser 
                WHERE
                    $db->setQuery( $query );"
        $rows = $db->loadObjectList();
        return $rows;
}

我有3个问题,

  1. 当我查询数据库时,会打开一个新的数据库会话,我需要在之后关闭它还是自动关闭它?
  2. 您知道实现此方法的更有效方法吗(用户会话内存大小约为 11MB!)
  3. 使用此方法访问数据库是否存在任何安全问题?

非常感谢你!任何帮助将不胜感激!

4

3 回答 3

1

代码应该是这样的(我现在不明白它是如何工作的):

function getList()
{
   // $mainframe = JFactory::getApplication('site'); // you don't need this line!
        $db = JFactory::getDBO();
        $query = "  SELECT 
                    * 
                FROM 
                    #__ListUser 
                WHERE
                    1=1"; // just some condition to extract selected rows
        $db->setQuery( $query ); // this sets the query and it's joomla, not sql.
        $rows = $db->loadObjectList();
        return $rows;
}

请注意 WHERE .... 需要一个条件(否则,如果您想要所有行,请删除 WHERE 和后面的内容)

  1. 你不需要关闭它
  2. 11Mb 不一定是由于该查询,尝试添加 LIMIT 0,1 (只返回一行)你会发现你的内存没有太大变化。在全局配置中打开调试,然后重新加载组件。在页面的最底部,您会看到哪些扩展正在占用您的内存。尽管在大多数安装中 11Mb 是可以接受的。
  3. 如果您使用输入参数创建 WHERE 条件,只需确保 $db->quote() 任何值以防止 SQL 注入。
于 2013-04-05T23:38:20.533 回答
0

尝试

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quote('*')
      ->from($db->quoteName('#__Listuser') // Do you really have upper case there?
      ->where('your condition with proper quoting');
$db->setQuery($query);
$rows = $db->loadObjectList();
于 2013-04-06T03:42:35.787 回答
0

1.

解冷:

如果要关闭或断开数据库会话,可以使用:

$db->disconnect(); // See: http://api.joomla.org/cms-3/classes/JDatabaseDriver.html#method_disconnect

但我想,想要使用 JFactory::getDBO(); 的所有其他模块、插件或模板的数据库连接;当时也关闭了,需要重新打开。

更好的:

在将查询传输到 PHP 变量后,您应该使用 FREE RESULT:http: //api.joomla.org/cms-3/classes/JDatabaseDriverMysql.html#method_freeResult

$db->freeResult();
于 2014-09-18T13:33:59.750 回答