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

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

ただいまの
回答率

90.34%

  • PHP

    21286questions

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

  • Laravel

    707questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

データベースで検索した値をCSVファイルでダウンロードしたい。

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 266

takanori2018

score 2

Laravel5.6を使って名刺管理アプリを作成しています。

名刺情報はMYSQLのデータベースに入れ、検索する機能を付けました。
そこで検索した名刺のリストをCSVファイルにダウンロードしたいのですが、うまくいきません。

ダミーのデータを使い、CSVファイル自体のダウンロードはできます。
変数$meishilistにデータベースの検索値を入れ、それをCSVファイルでダウンロードしようとすると、空のCSVファイルがダウンロードされます。
変数$meishilistの値を参照できないのが問題なのではないかと思います。

変数のスコープの問題かと思い、検索の各メソッドで、$meishilistのグローバル宣言をしましたが、
それでもうまくダウンロードできません。

コントローラ側のソースコードは以下の通りです。

//最初のリスト画面を表示する
    public function list()
    {
        global $meishilist;
        $query = Meishi::query();
        $meishilist = $query->orderBy('id')->simplePaginate(50);

        return view('list')->with('meishilist', $meishilist);
    }

    //list画面にて各ボタンが押された時の機能分け
    public function postlist(Request $request)
    {

        if (Input::get('namesearch'))
        {
            return $this->namesearch($request);
        } elseif (Input::get('companysearch')) {
            return $this->companysearch($request);
        } elseif (Input::get('othersearch')) {
            return $this->othersearch($request);
        } elseif (Input::get('csvdownload')) {
            return $this->csvdownload($meishilist);
        } elseif (Input::get('newregister')) {
            return $this->form();
        }
    }

    //list画面での名前検索欄の機能・名刺情報「お名前」での検索を行う。
    public function namesearch(Request $request)
    {
        global $meishilist;
        $param = "$request->namesearch";
        $nameresult = Meishi::where('name', 'like', "%{$param}%")->simplePaginate(50);
        $meishilist = $nameresult;
        return view('list')->with('meishilist', $meishilist);
    }

    //list画面での会社名検索欄の機能・名刺情報「会社名」での検索を行う。
    public function companysearch(Request $request)
    {
        global $meishilist;
        $param = "$request->companysearch";
        $companyresult = Meishi::where('company', 'like', "%{$param}%")->simplePaginate(50);
        $meishilist = $companyresult;
        return view('list')->with('meishilist', $meishilist);
    }

    //名刺情報のうち「お名前」「会社情報」以外で検索を行う「その他検索」を行う。
    public function othersearch(Request $request)
    {
        global $meishilist;
        $param = "$request->othersearch";
        $otherresult = Meishi::where(DB::raw("concat(tel,address,email)"), 'LIKE', "%{$param}%")->simplePaginate(50);
        $meishilist = $otherresult;
        return view('list')->with('meishilist', $meishilist);
    }

    //CSVダウンロードボタンが押された場合
    public function csvdownload($meishilist)
    {
        $array = $meishilist;

        /*$array = array(
            array(
                'id' => 1,
                'name' => '山田太郎',
                'furigana' => 'やまだたろう',
                'email' => 'taroyamada@sample.com'
            ),
            array(
                'id' => 3,
                'name' => '加藤明美',
                'furigana' => 'かとうあけみ',
                'email' => 'akemikato@sample.com'
            ),
            array(
                'id' => 5,
                'name' => '佐藤健夫',
                'furigana' => 'さとうたけお',
                'email' => 'takeosato@sample.com'
            )
        );
        var_dump($array);*/

        $file = new SplFileObject('test.csv','w');
            foreach ((array)$array as $line) {
                $file->fputcsv($line);
            }

            $filepath = 'test.csv';
        header('Content-Type: application/octet-stream');
        header('Content-Length: '.filesize($filepath));
        header('Content-Disposition: attachment; filename=test.csv');

        readfile($filepath);

        return response()->download('test.csv');

    }

ビュー側のソースコードは以下の通りです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>名刺管理システム</title>
    <style>
    .search-box{
        text-align:right;
        position:relative;bottom:180px;
        width:50px;
        padding:50px;
    }
    .csv-download{
        position:relative;bottom:50px;left:170px;
    }
    .pegenation{
        text-align:center;
    }

    </style>

</head>
<body>
<h1>名刺管理システム</h1>
<p>この画面から新規の名刺情報登録、名刺情報のCSVファイルダウンロード、名刺情報の検索ができます。</p>
<dev >
<form action="list" method = "post">
    {{ csrf_field() }}
    <label for="new field">名刺情報の新規登録 </label><br>
    <input type="submit" name = "newregister" value="新規登録">
</form>
</dev >
<dev class="csv-download">
    <form action="list" method ="post">
        {{ csrf_field() }}
    <label for="new field">名刺情報のCSVダウンロード </label><br>
    <input type="submit" name = "csvdownload" value="CSVダウンロード">
    </form>
</dev>
<dev class="search-box">
    <p>名刺情報検索</p>

    <form action="list" method="post">
        {{csrf_field()}}
        <input type="text" name = "namesearch" value="{{old('namesearch')}}">
        <input type="submit" value="名前検索">
    </form>
  <form action="list" method="post">
        {{csrf_field()}}
        <input type="text" name = "companysearch" value="{{old('companysearch')}}">
        <input type="submit" value="会社検索">
    </form>
  <form action="list" method="post">
        {{csrf_field()}}
        <input type="text" name = "othersearch" value="{{old('othersearch')}}">
        <input type="submit" value="その他検索">
    </form>
</dev>

<dev class="meishitable">
<table   border="1" align="center" style="position:relative;bottom:100px;">
    <caption>名刺情報リスト</caption>
    <tr>
        <th width="300">お名前</th>
        <th width="300">会社名</th>
        <th width="300">電話番号</th>
        <th width="300">住所</th>
        <th width="300">email</th>
    </tr>
    @foreach($meishilist as $meishihyouzi)
        <tr>
            <td>{{$meishihyouzi->name}}</td>
            <td>{{$meishihyouzi->company}}</td>
            <td>{{$meishihyouzi->tel}}</td>
            <td>{{$meishihyouzi->address}}</td>
            <td>{{$meishihyouzi->email}}</td>
        </tr>
        @endforeach
</table>

</dev>
<dev class="pegenation">
    {{$meishilist->links()}}
</dev>
</body>
</html

どうすればいいのかご教授いただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2018/06/26 09:49

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • mts10806

    2018/06/26 10:38 編集

    Laravel(というかフレームワーク)の書き方無視して自分で書くなら、もうLaravelで無理にやろうとしなくていいんじゃないかな・・・。フレームワークのメリットほとんど活かせてないので(むしろメリットを積極的に封殺している感すらあります)。公式リファレンスも読む気なさそうですし。”最低限”「オブジェクト指向」きちんと抑えてから利用されたほうが良いです。

    キャンセル

  • takanori2018

    2018/06/26 12:05

    現在会社の研修にてほぼ一人で、このアプリを作っています。公式リファレンスも読んでいますが、わからないことだらけです。おっしゃる通りオブジェクト指向の理解が足りてないのだと思います。

    キャンセル

  • mts10806

    2018/06/26 12:14

    分からないことだらけなのはなぜか?そもそもPHPへの理解が希薄だからです。急がば回れ。まずはPHPをしっかり押さえてください。

    キャンセル

回答 1

+1

csvdownload() が呼ばれる前に $meishilist に値を代入しているいずれかのメソッドを呼んでいますか?

また、この場合は global を使うよりプロパティを使った方が良いです。
少し難しくなりますが、もっと良いのは、引数と返り値のみを使って値をやり取りするやり方です。
その方が値がどこからどこに渡り、どこで書き換わったかが把握しやすくなります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    21286questions

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

  • Laravel

    707questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。