2017-05-25 47 views
0
function exportToCsv() { 

    $dbh = new PDO('pgsql:' 
      . (env('DB_DATABASE') ? ';dbname='.env('DB_DATABASE') : '') 
      . (env('DB_HOST') ? ';host='.env('DB_HOST') : '') 
      , env('DB_USERNAME') 
      , env('DB_PASSWORD') 
     ); 

    $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    $sth = $dbh->prepare('COPY (select * from ?) TO \'/tmp/report.csv\' DELIMITER \',\' CSV HEADER;'); 
    $sth -> execute(['stats']); 
}; 

我有错误后,执行该代码PDO PostgreSQL的COPY

PDOStatement::execute(): SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" 
LINE 1: COPY (select * from $1) TO '/tmp/report.csv' DELIMITER ',' C... 

我使用laravel,和我尝试执行参数拷贝查询。

回答

1

两个问题:

  1. 与参数一份声明中不能使用COPY

  2. 您不能对表名等标识符使用参数。

您必须将表名写入COPY语句。

+0

1)为什么? 2)好的 我想执行复杂的查询与COPY中的许多条件。这是最好的办法吗? Laravel查询生成器和PDO不适合这种情况? – chmax

+0

广告“为什么”:因为很少有人想要用不同的参数执行相同的“COPY”语句,这是准备语句的主要用例。 Ad Laravel查询生成器:我不知道,它可以用来组成查询字符串吗?如果是的话,你可以构造一个SQL查询并将其与你需要的'COPY'命令的其余部分连接起来。 –