在另一个文件中替换完整的PHP行

时间:2014-06-27 21:47:26

标签: php pdo

我想动态更新数据库配置文件。首先,我将主题文件从一个目录复制到另一个目录。这些主题文件包含数据库配置文件。

复制文件后,我想更新数据库配置文件以使用创建的新数据库的名称(使用$ dbname)。

$dbname = "Database 1"; 

$data = file('file.php'); // reads an array of lines
function replace_a_line($data) {
   if (stristr($data, 'dbname=')) {
     return 'dbname=' . $dbname . '';
   }
   return $data;
}
$data = array_map('replace_a_line',$data);
file_put_contents('file.php', implode('', $data));

file.php:

$this->pdo = new PDO('mysql:host=localhost; dbname=', '', '');

我上面这个函数的问题是它只用

替换整行
dbname=

我不知道如何使用正确的语法返回添加完整的PHP行

我需要它看起来像这样:

$this->pdo = new PDO('mysql:host=localhost; dbname=test', '', '');

我可以用什么来保留原来的php行,只需添加到dbname =?

如果我用整个文件替换该行,该文件只包含上面的PHP行,那么我可以插入整个PHP行吗?

2 个答案:

答案 0 :(得分:1)

我认为你正在过度思考这一点。

这是我的建议,创建一个包含数据库设置的配置文件

$config = array(
    // These are the settings for development mode
    'development' => array(

        'db' => array(
            'host'     => 'xxxx',
            'dbname'   => 'yyyy',
            'username' => 'xxx',
            'password' => 'zzzzz',
            ),       
        ),

    // These are the settings for production mode
    'production' => array(

        'db' => array(
            'host'     => 'xzzz',
            'dbname'   => 'fsfs',
            'username' => 'dsdsd',
            'password' => 'xsscsc',
            ),
        ),
    );

您可以通过将不同的配置传递给db类构造函数来动态使用:

class Database{
    include("config.php");   
    private $pdo;
    private $config;

    // constructor
    function __construct($mode) {           
        $this->config = $config[$mode];
    }


    public function get_connection(){
        $this->pdo = new PDO(
            'mysql:host=' . $this->config['db']['host'].';dbname=' . $this->config['db']['dbname'], 
            $this->config['db']['username'], 
            $this->config['db']['password'],
            array());

        // If there is an error executing database queries, we want PDO to
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        return $this->pdo;
    }

   public function __destruct(){
        $this->pdo = null;
   }

}

用法:

$db = new Database('production');
$pdo = $db->get_connection();

答案 1 :(得分:1)

以下是您的代码中的一些更正,以使其按预期运行:

$data = file('file.php'); // reads an array of lines
function replace_a_line($data) {
   $dbname = "Database 1";
   if (stristr($data, 'dbname=')) {
     return str_replace('dbname=', 'dbname=' . $dbname, $data);

   }
   return $data;
}
$data = array_map('replace_a_line',$data);
file_put_contents('file.php', implode('', $data));