在函数内部使用配置变量


Using config variables inside functions

在下面给出的代码中,我试图修改它,以便从配置文件中使用数据库连接变量。这应该会使密码更加安全,因为我可以限制配置文件的权限。

请告诉我是否有一种方法可以修改代码,从另一个文件/config文件中获取数据库变量?

class ActivitycodesCollection {
    var $list, $err, $sql;    
    // --- Private variables for database access
    var $_db_host = "######";
    var $_db_username = "######";
    var $_db_passwd = "######";
    var $_db_name = "######";
    function query ($where="") {
        mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
        mysql_select_db ($this->_db_name);
        $where = "WHERE " . $where;
        $sql = "SELECT * FROM activitycodes $where";
        $result = mysql_query ($sql);
        $this->err = mysql_error();
        $this->sql = $sql;
        if (mysql_num_rows($result) > 0) {
            while (list($id) = mysql_fetch_array ($result)) {
                $this->list[$id] = new activitycodes($id);
            }
        }
    }
}

我尝试在这个类/函数中包含config.ini文件,但它抛出了一个类似的错误

unexpected T_VARIABLE, expecting T_FUNCTION

您的代码已经过时了
1) 属性不要使用var,请使用privateprotected
2) 不要使用mysql_*函数,使用PDO
3) 不要在类中保留连接详细信息。只需要构造函数中的PDO连接
4) 不要信任范围之外的任何数据——不要只允许在SQL查询中写入一些不受信任的文本(通过$where变量)
5) 读书。"PHP对象、模式和实践"现在将对您有所帮助,稍后将对"清理代码"有所帮助。

示例:

class ActivitycodesCollection
{
    private $list;
    private $PDO;
    private $table_name;
    public function __construct('PDO $PDO, $table_name)
    {
        $this->PDO        = $PDO;
        $this->table_name = $table_name;
    }
    public function fetchByParameter($parameter)
    {
        $query = $this->PDO->prepare("SELECT `id` FROM `{$this->table_name}` WHERE "
                ." some_field = :parameter");
        if (!$query)
        {
            return false;
        }
        if (!($query->execute(array(':parameter'=> $parameter))))
        {
            return false;
        }
        $results = $query->fetchAll('PDO::FETCH_ASSOC);
        if (!empty($result))
        {
            foreach ($results as $result)
            {
                $id              = $result['id'];
                $this->list[$id] = new ActivityCodes($id);
            }
        }
    }
}

如果没有看到"config"文件,就无法说明如何为其编写解析器。一个简单的解决方案是编写一些设置变量的php代码,但如果您包含/需要它,则变量将在全局范围内设置,而不在方法内。但是您可以eval(file_get_contents($config_file_path)),这将在本地范围内设置变量,并冒着提供代码注入方法的风险。

顺便说一句,你提供的代码有很多问题。抛开SQL注入的潜在风险不谈,如果方法参数为null/blank,则查询的格式将不正确(请考虑函数查询($where="1")。依赖特定的列排序是不好的做法。

同样很难想象,当唯一可行的方法是通过suphp或baseopendir时,如何限制对该配置文件的访问。

将SQL连接数据放在单独的文件中根本不会增加安全性。实际上,将它们存储在没有.php扩展名的文件中会降低安全性,因为用户可能可以访问它,而PHP文件的代码对任何用户都不可见。您也不能在配置文件上使用比在PHP文件上更严格的权限,因为运行PHP的任何用户(通常是Web服务器用户)都需要访问这些权限。

只需将连接数据存储在PHP文件中即可:

<?php
define('DB_HOST', '...');
define('DB_NAME', '...');
define('DB_USER', '...');
define('DB_PASS', '...');

然后包括这个文件(在类定义之外),并在建立连接时使用常量。

您可以在构造函数中使用parse_ini_file。

class ActivitycodesCollection {
    var $list, $err, $sql;    
    const CONFIG_FILE = 'config.ini';
    // --- Private variables for database access
    var $_db_host = ''
    var $_db_username = '';
    var $_db_passwd = '';
    var $_db_name = '';
    public function ActivitycodesCollection() {
        $config = parse_ini_file(self::CONFIG_FILE);
        $this->_db_host = $config['db']['host'];
        //etc
    }
    public function query ($where="") {
        mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
        mysql_select_db ($this->_db_name);
        $where = "WHERE " . $where;
        $sql = "SELECT * FROM activitycodes $where";
        $result = mysql_query ($sql);
        $this->err = mysql_error();
        $this->sql = $sql;
        if (mysql_num_rows($result) > 0) {
            while (list($id) = mysql_fetch_array ($result)) {
                $this->list[$id] = new activitycodes($id);
            }
        }
    }

ini文件应该是这样的:

[db]
host = localhost
name = foo
user = bar
pass = baz