使用mysqldump选择性地转储数据

使用mysqldump选择性地转储数据,mysql,yii2,Mysql,Yii2,我需要使用WHERE从数据库中导出一个表。只有在有条件的情况下才有结果。 我使用yii2: $mysql_file = Yii::getAlias('@app/mysqldump.sql'); preg_match('#mysql:host=([^;]+);dbname=(.*)#', Yii::$app->components['db']['dsn'], $dbmatch); $db = [ 'host' =>

我需要使用WHERE从数据库中导出一个表。只有在有条件的情况下才有结果。 我使用yii2:

        $mysql_file = Yii::getAlias('@app/mysqldump.sql');
        preg_match('#mysql:host=([^;]+);dbname=(.*)#', Yii::$app->components['db']['dsn'], $dbmatch);
        $db = [
            'host' => $dbmatch[1],
            'user' => Yii::$app->components['db']['username'],
            'pass' => Yii::$app->components['db']['password'],
            'base' => $dbmatch[2]
        ];
        
        $command = "mysqldump --user={$db['user']} --password={$db['pass']} --host={$db['host']} {$db['base']} verification --where='program = ".$request->post('course')."' --result-file={$mysql_file} 2>&1";

        exec($command, $output);

        Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;

        header('Content-Type: application/sql');
        header('Content-Disposition: attachment; filename=dump-'.$dbmatch[2].'_'.date('YmdHis').'.sql');
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($mysql_file)).' GMT', true, 200);
        header('Content-Length: '.filesize($mysql_file));

        readfile($mysql_file);
这里的问题是:

--where='program = ".$request->post('course')."'
产生如下转储文件:

--
-- Dumping data for table `verification`

--
-- WHERE:  program = a1n2

没有WHERE工作正常。

为什么不以这种方式拆分命令?我不是一个yii开发人员,但这是我在java/php或其他任何东西中所做的

'mysqldump --user='.{$db['user']}.' --password='.{$db['pass']}.' --host='.{$db['host']}.' '.{$db['base']}.' verification --where=program = "'.$request->post('course').'".....

为什么不以这种方式拆分命令?我不是一个yii开发人员,但这是我在java/php或其他任何东西中所做的

'mysqldump --user='.{$db['user']}.' --password='.{$db['pass']}.' --host='.{$db['host']}.' '.{$db['base']}.' verification --where=program = "'.$request->post('course').'".....

你需要用
\“

这将避免双重引用


你需要用
\“

这将避免双重引用


这很棘手,你的变量必须用引号括起来,但你已经用光了两个变量,像这样吗--where=“program='myvalue'”这很棘手,您的变量必须用引号括起来,但您已经用光了这两个变量,像这样吗--where=“program='myvalue'”太棒了!非常感谢你。我完全忘记了“太棒了!非常感谢。我完全忘记了”