質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    24066questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • PostgreSQL

    1358questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

【postgreSQL】PHPでDBのデータをCSVに出力したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 663

jam912sh

score 15

 【postgreSQL】PHPでDBのデータをCSVに出力したい

PHPファイル内で、postgreSQLを使いデータベース上のテーブルデータ全てをCSVファイルにしたいのですが、色々調べてはみたものの、解決できませんでした。
postgreSQLにお詳しい方、ご教示頂ければ幸いで御座います。

 該当のソースコード

<?php
    // PostgreSQLに接続
    $conn = pg_connect('host=localhost dbname=test 
    user=XXXXX password=XXXXX');

    // SQL文を実行
    $query = "COPY test_json TO '/tmp/sampletbl1.csv' CSV";
    pg_query($conn, $query);

    // PostgreSQLを切断
    $close = pg_close($conn);
    ?>

 補足情報

・/tmp/sampletbl1.csv が作成されない状態です。
・MAMPを使用しております。
・DB接続は成功しております。
・PHPのエラーは発生致しておりません。
・PHPのバージョン:5.6.30
・PostgreSQLのバージョン:10.5
・MAMPのバージョン:5.0.1

・データベースにつきまして
ホスト名:localhost
DB名:test
取得したいテーブル名:test_json
取得後のCSVファイル名:sampletbl1.csv

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

sql を psql で実行できますか?
当方、

copy テーブル名 to '/パス/ファイル名.csv' with csv;


でないと実行できませんでしたが・・・
パスは postgres ユーザの書き込み権限が必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/24 12:29

    ご回答頂き有難うございます。パスは、ソースコード上のuser=XXXXX password=XXXXXが読み出し、書き込みが可能な状態で御座います。
    psqlを実行できるようにするにはどうしたら良いものでしょうか?

    キャンセル

  • 2018/08/24 12:45

    データベースのホスト名が localhost とのことですので、データベースはそのマシンで起動していますね?
    であれば、起動しているプログラムは pg_ctl のはず。
    psql は pg_ctl と同じディレクトリに存在しているはずですが・・・ありませんか?

    キャンセル

  • 2018/08/24 13:12 編集

    pcはmac環境で御座いますが、/usr/local/var/postgres/の中を確認致しましたが「psql 」も「pg_ctl 」も見当たらないようで御座います。

    「postgres」には格納されているようで御座います。
    PG_VERSION
    pg_logical
    pg_tblspc
    pg_multixact
    pg_twophase
    pg_wal
    global
    pg_replslot
    pg_xact
    pg_serial
    postgresql.auto.conf
    pg_commit_ts
    pg_snapshots
    postgresql.conf
    pg_dynshmem
    pg_stat
    postmaster.opts
    pg_hba.conf
    pg_stat_tmp
    postmaster.pid
    pg_ident.conf pg_subtrans

    キャンセル

  • 2018/08/24 13:36

    コンソール上でpsqlコマンドを叩きます。

    キャンセル

  • 2018/08/24 13:41

    Macユーザーじゃないので外すかもしれないけど、/usr/local/bin の下とか、
    postgresql実行物がごっそり置かれる場所が絶対あるはずです。
    https://qiita.com/_daisuke/items/13996621cf51f835494b
    を参照するに、
    /usr/local/Cellar/postgresql/9.3.4/bin/
    にpsqlコマンドがありそう。

    キャンセル

  • 2018/08/24 13:47

    ご教示頂き有難うございます。
    /usr/local/binの中に、「psql」 と 「pg_ctl 」御座いました!
    失礼致しました。
    また、データベースはmacのMAMPにて起動致しております。

    キャンセル

  • 2018/08/24 13:56

    /usr/local/bin/psql で起動できそうですね。

    キャンセル

  • 2018/08/24 14:01

    はい、以下のコマンドにて、postgresqlが起動できる事を確認致しました。
    brew services start postgresql
    有難うございます。

    キャンセル

  • 2018/08/24 14:21

    パスのご指摘の件で御座いますが、
    ファイルへのアクセス権につきまして、「tem」フォルダ「sampletbl1.csv」ともに、すべてのユーザーに読み書き権限を付与し、再起動をして、今一度動作確認致しましたが、CSVファイルの中身は更新されない状態は続いております。
    アクセス権の設定が必要で有る事、大変勉強になりました。有難うございます。

    キャンセル

  • 2018/08/24 14:35

    psql でその sql を実行したら どうなりますか?

    キャンセル

  • 2018/08/24 14:53

    なるほどで御座います!
    ターミナルよりsql を実行致しましたら、以下のエラー表示されました。
    ERROR: syntax error at or near "psql"
    LINE 1: psql "COPY test_json TO '/tmp/sampletbl1.csv' CSV";

    キャンセル

  • 2018/08/24 14:54

    先程のご指摘にて、エラーがわかり、
    パスに不備がある事が分かりました!
    以下のパスの修正を行い、無事にデータベースの情報がCSVファイルへ反映される事を確認致しました。
    showkit 様のご指摘にて、無事に問題解決致しました。
    お忙しい中、ご教示頂き有りとうございました!
    また大変勉強になりました。

    '/tmp/sampletbl1.csv' CSV";

    '/Applications/MAMP/htdocs/tmp/sampletbl1.csv’;

    キャンセル

+1

'/tmp/sampletbl1.csv'なるファイルへのアクセス権が
webサーバープログラム自身にあるかどうか
確認をお願いします。

それと、
db接続ユーザーの権限でCOPY文が実行される上で、
db接続ユーザーとOS上ユーザーの紐づけがされるクライアント認証を採用していれば、
OSユーザーが誰になっているかの権限も確認したほうが良いです。

MAMPだとApache httpdでしょうか。

コードについて。

    // SQL文を実行
    $query = "COPY test_json TO '/tmp/sampletbl1.csv' CSV";
    $result = pg_query($conn, $query);

    if ($result === FALSE) {
      echo "An error occurred.\n";
      echo pg_last_error($conn) . "\n";
      exit;
    }


とかすればphp上ではなくPostgreSQLアクセスでのエラーなら表示されるかも。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/24 12:26

    ご確認頂き有難うございます。
    ファイルへのアクセス権のアクセス権は、ソースコード上のuser=XXXXX password=XXXXXは設定されております。OSユーザーの権限も、ソースコード上のuser=XXXXX password=XXXXXになっております。こちらでご回答になっておりますでしょうか。

    キャンセル

  • 2018/08/24 13:24

    PostgreSQLアクセスでのエラーのコード有難うございます。
    実行致しましたところ、エラー等は何も表示されませんでした。
    ご指摘頂きました、アクセス権周り、今一度調査致します。
    貴重な情報頂き有難うございます!

    キャンセル

  • 2018/08/24 13:45

    /usr/local/var/postgres/pg_log/ の下に人間が読める形でログが記録されているはずです。
    そこにエラーメッセージなど残っていないでしょうか。

    キャンセル

  • 2018/08/24 13:54 編集

    失礼致しました。
    phpエラーとwebに表示されるエラーのみ確認をおこなっておりました。

    ログの内容は以下で御座います。
    LOG: connection received: host=::1 port=54870
    LOG: connection authorized: user=XXXXXXXX database=test
    LOG: statement: COPY test_json TO '/tmp/sampletbl1.csv' CSV
    LOG: disconnection: session time: 0:00:00.009 user=XXXXXXXX database=test host=::1 port=54870

    キャンセル

  • 2018/08/24 14:16

    ファイルへのアクセス権につきまして、「tem」フォルダ「sampletbl1.csv」ともに、すべてのユーザーに読み書き権限を付与し、今一度動作確認致しましたが、CSVファイルの中身は更新されない状態は続いております。
    アクセス権の設定が必要で有る事、大変勉強になりました。有難うございます。

    キャンセル

  • 2018/08/24 14:58

    m6u様、この度はご教授頂き大変有難うございました。
    こちらの件、無事に問題解決致しました。
    原因は私のボンミスで御座いまして、パスに問題が御座いました。
    '/tmp/sampletbl1.csv' CSV";

    '/Applications/MAMP/htdocs/tmp/sampletbl1.csv’;
    m6u様から頂きました情報も大変参考になりました。
    お忙しい中、お力をお貸し頂き有難うございました!

    キャンセル

+1

直接回答に繋がらないかもしれませんが、if文でpg_queryの戻り値ではなく、$queryを判定してますよ。
クエリー結果が正しいかそれでは判定できてません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/24 12:22

    ご回答頂き有難うございます。$query周りを今一度調査致します。ご指摘頂き有難うございます。

    キャンセル

  • 2018/08/24 15:03

    こちらの件、無事に問題解決致しました。
    お忙しい中、ご教示頂き有りとうございました!

    キャンセル

同じタグがついた質問を見る

  • PHP

    24066questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • PostgreSQL

    1358questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。