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

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

ただいまの
回答率

90.50%

  • PHP

    20366questions

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

  • MySQL

    5858questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CSV

    636questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • ダウンロード

    33questions

    リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

mysqlに接続し、データベースをcsvダウンロードできるphpが動作しません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 317

uep3vjz9wp

score 10

お世話になります。
phpへリンクを貼った箇所をクリックするとmysqlに接続し、データベースをcsvダウンロードできるものを
作成しておりますが「HTTP ERROR 500」と出て動作しません。ご教示お願いいたします。

<?php
/*
  顧客管理データベース csv出力php
  データベース hikitsugi_db1
  テーブル    table_hikitsugi
*/
//CSVのファイル名・ヘッダー名を定義
$file_path = "customer.csv";
$export_csv_title = ["ID", "月", "日", "内容", "担当", "カテゴリ", "進行状況"];
$export_sql = "SELECT id, month,day,naiyou,tantou,category,shinkou FROM table_hikitsugi";

//データベースに接続する
require_once 'db_config.php';
$dbh = new PDO('mysql:host=localhost;dbname=hikitsugi_db1;charset=utf8', $user, $pass);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 文字コードをSJIS-winにエンコード
foreach ($export_csv_title as $key => $val) {
    $export_header[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}

//CSV書き込み出力
if (touch($file_path)) {
    $file = new SplFileObject($file_path, "w");

    // write csv header
    $file->fputcsv($export_header);

    // query database
    $sql = "SELECT * FROM table_hikitsugi";
    $stmt = $dbh->query($export_sql);

    // create csv sentences
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $file->fputcsv($row);
    }
}

// close database connection
$dbh = null;
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • uep3vjz9wp

    2018/06/27 17:38

    ありがとうございます。「 Warning: touch(): Unable to create file customer.csv because Permission denied in /var/www/html/phptry/backup.php on line 35 」と表示。この辺探ってみます。

    キャンセル

  • mts10806

    2018/06/27 17:41

    ファイルの権限の問題ですね。やはりtouch()通ってなかったですね・・・。

    キャンセル

  • uep3vjz9wp

    2018/06/27 21:46

    お世話になりました。ありがとうございました。

    キャンセル

回答 2

checkベストアンサー

+4

500エラーはサーバー内部エラーです。
ほとんどの場合がプログラムの構文ミスにより起きます。
例えばEclipseのような高機能エディタでも良いですし、Web上で単体実行確認できるサービス()でもいいです。
構文チェックを自動で行ってくれるものを使いましょう。それだけで実行前に半分以上の問題が解決できます(ロジック的なところでのミスは全体の3割あるかないかだと思っていいです)

ということで
上記EclipseとOnlinePHPEditor両方で確認すると同じエラーが出ていますね。

構文エラー, unexpected 'EOF'

EOFは
end of file

要は終端です。
何かきちんと閉じられていないときに起きやすいです。

フォーマッターを利用してきちんと整形してみると分かりやすいです。

//CSV書き込み出力

if(touch($file_path)){
    $file = new SplFileObject($file_path, "w");

    // write csv header
    $file->fputcsv($export_header);

    // query database
    $sql = "SELECT * FROM table_hikitsugi";
    $stmt = $dbh->query($export_sql);

    // create csv sentences
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $file->fputcsv($row);

    }

    // close database connection
    $dbh = null;


    ?>

if(touch($file_path)){  の閉じ } がありません。

もちろんこれで「mysqlに接続し、データベースをcsvダウンロード」が正常に動くかどうかは別問題です。
ひとまずコードは綺麗に書きましょう。
閉じ忘れで動かない 良くあることです。

 追記を受けて

SplFileObjectを$fileという変数で受けていますが、
質問者さんが閉じられた場所では$fileが宣言されずに使われる可能性があります。
せめて$fileを利用しているところも全て囲ってください。
例:

if (touch($file_path)) {
    $file = new SplFileObject($file_path, 'w');

    // write csv header
    $file->fputcsv($export_header);

    // query database
    $sql = 'SELECT * FROM table_hikitsugi';
    $stmt = $dbh->query($export_sql);

    // create csv sentences
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $file->fputcsv($row);
    }
} //←ifここまで


※というかそもそもif(touch($file_path))がtrueじゃなくfalseになっていてSplFileObject()取得できてないということでは?

あと、異常検知したほうがいいかもしれません。
try-catchを利用してみてください。
※未検証 実装イメージのみで捉えてください。

try{
    if (touch($file_path)) {
        $file = new SplFileObject($file_path, 'w');

        // write csv header
        $file->fputcsv($export_header);

        // query database
        $sql = 'SELECT * FROM table_hikitsugi';
        $stmt = $dbh->query($export_sql);

        // create csv sentences
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $file->fputcsv($row);
        }
    }
}catch(RuntimeException $e){
    echo $e->getMessage();
}

エラー / 例外
filename がオープンできない場合、RuntimeException がスローされます。

蛇足:
画面表示を伴わないPHPプログラムであれば最後の?>は必要ありません。
あくまでその後に画面出力を伴うときにのみ利用します。
※今時ほとんどフレームワークにより構築されるので?>を書くことは稀と思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

if(touch($file_path))部分の閉じ括弧が無いような気がします。。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/27 15:49

    早速のご指摘ありがとうございます。
    }  を入れて見ましたが HTTP ERROR 500に変化ありません。他のphpへは問題なく飛んでいます。

    キャンセル

  • 2018/06/27 16:14 編集

    閉じる場所が違いますね。。
    以下でどうですか?
    mts10806さんのアドバイスのようにちゃんと成形すると読みやすくなると思いますよ。

    if(touch($file_path)){
      $file = new SplFileObject($file_path, "w");

      // write csv header
      $file->fputcsv($export_header);

      // query database
      $sql = "SELECT * FROM table_hikitsugi";
      $stmt = $dbh->query($export_sql);

      // create csv sentences
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
       $file->fputcsv($row);
      }
    }
    // close database connection
    $dbh = null;

    キャンセル

  • 2018/06/27 17:23

    ありがとうございます。閉じる箇所を再度変更したところ、エラーが出ずに画面が真っ白になるようになりました。今度はtry-catchを実施してみます。

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20366questions

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

  • MySQL

    5858questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CSV

    636questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • ダウンロード

    33questions

    リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。