执行数据库查询后关闭会话

时间:2013-04-05 21:37:44

标签: php sql joomla security

我对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 个答案:

答案 0 :(得分: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(只返回一行)你会发现你的内存没有太大变化。在全局配置中启用debug,然后重新加载组件。在页面的最底部,您将看到哪些扩展程序正在耗尽您的记忆。在大多数安装中,11Mb是可以接受的。
  3. 如果您使用输入参数创建WHERE条件,只需确保$ db-> quote()任何值以防止SQL注入。

答案 1 :(得分: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();

答案 2 :(得分: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();