48246
PHP初心者の為、説明に不足があるかもしれませんがご了承頂きたく存じます。  
DBから受信したCSVデータをPHPで抽出してHTMLのリストとCSVファイルに反映させたいのですが、PHPにて抽出した結果がHTMLファイル上に結果が表示されず、PHPファイル上に出力されます。色々、ネットで調べたりしたのですが、解決できませんでした。  
PHPにお詳しい方、ご教授頂けますと幸いで御座います。宜しくお願い致します。

> ■動作について  
>  ・DBとの接続動作に問題は御座いません。  
>  ・リストボックスからの抽出動作にも問題御座いません。
>
> ■実現したいこと  
>  ・ブラウザにてsearch.phpに抽出結果が表示されます。  
>  その抽出結果をindex.phpのリストに反映させたいです。

■抽出に使用したcsvファイル（list.csv）

```

        item1,item2
        富士山,テスト１                
        信濃川,テスト２                
        箱根山,テスト３                
        利根川,テスト４ 
    
```

■HTMLファイル（index.php）

```

      <!DOCTYPE html>
      <html lang="ja">
      <head>
      <meta charset="utf-8">
      </head>
      <body>
      <div id="contents">
              <h3>リスト</h3><br>
          <div id="app">
              <sortable-table :columns="columns" :rows="rows">
              </sortable-table>
          </div>
    
      <!-- DBのデータをPHPで処理 -->
      <?php
    
       // PostgreSQLに接続
       $conn = pg_connect('host=localhost dbname=test user=XXXX password=XXXX');
    
       // CSVファイルをセットする。SQL文を実行　ディレクトリはフルパス
       //tmpフォルダには権限を付与すること！変更が必要
       $query = "COPY m_test TO '/Applications/MAMP/htdocs/web4/tmp/list.csv' CSV HEADER";
       //下は、field_aのadd_1のみ
       //$query = "COPY (SELECT * FROM test_json WHERE field_a = 'add_1') TO '/Applications/MAMP/htdocs/web5/tmp/list.csv' CSV HEADER";
    
       $result = pg_query($conn, $query);
    
       // SQL文を実行 リスト用　http://php.net/manual/ja/function.pg-query-params.php
    
       //カテゴリーを抽出して表示する方法
       $result = pg_query("SELECT * FROM m_test");
    
       // 全てのデータを配列で取得
       $data = pg_fetch_all($result);
    
       print "<table id=\"dblist\" summary=\"PostgreSQLのデータベースの一覧\">\n";
    
       //テーブルヘッダとしてフィールド（カラム）名を出力
       print "<thead><tr>\n";
       $flds = pg_num_fields($result);
       for($i=0; $i<$flds; $i++){
           $field = pg_field_name($result, $i);
           printf("<th abbr=\"%s\">%s</th>\n", $field, $field);
       }
       print "</tr></thead>\n";
    
       //データの出力
       foreach($data as $rows){
           print "<tr>\n";
           foreach($rows as $value){
               printf("<td>%s</td>\n", $value);
           }
           print "</tr>\n";
       }
          print "</table>\n";
    
       // PostgreSQLを切断
       $close = pg_close($conn);
    
      ?>
      <!-- リストEND -->
    
      <!-- CSVダウンロード -->
      <div class="csvbutton">
          <a id="download" href="tmp/list.csv" download="tmp/list.csv" onclick="handleDownload()">CSVダウンロード</a>
      </div>
      <!-- CSVダウンロードEND -->
    
          </div><!-- /#main -->
      <!-- 右メニュー -->
          <div id="ham-menu">
                  <form action="search.php" method="post">
              <ul class="submenu">
                  <li>　項目：<select name= "categorysearch">
                      <option value="yama">山</option>
                      <option value="kawa">川</option>
              <option value="all">すべて</option>
                                  </select>
                  </li>
              </ul>
              <p class="button"><input type="submit" value="抽出"onclick="" class="clickBtn()" style="width:100px;height:30px"></p>
          </form>
      </div>
    
      <!-- 右メニューEND -->
      <div id="menu-background"></div>
      </div><!-- /#contents -->
      <footer>
    
      </footer>
      <div class="totop"><a href="#"><img src="images/totop.png" alt="ページのトップへ戻る"></a></div><!-- /.totop -->
      </body>
      </html>
    
```

■抽出実行ファイル（search.php）

```

      <?php
    
       // PostgreSQLに接続
       $conn = pg_connect('host=localhost dbname=test user=XXXX password=XXXX');
    
      $form=$_POST["categorysearch"];
    
       // CSVファイルをセットする。SQL文を実行　ディレクトリはフルパス
       //tmpフォルダには権限を付与すること！
       $query = "COPY m_test TO '/Applications/MAMP/htdocs/web4/tmp/list.csv' CSV";
       $result = pg_query($conn, $query);
    
       switch ($form) {
         case 'yama':
           echo '山';
           $result = pg_query("SELECT * FROM m_test WHERE item1 = '富士山' OR  item1 = '箱根山'");
           break;
         case 'kawa':
           echo '川';
           $result = pg_query("SELECT * FROM m_test WHERE item1 = '信濃川' OR  item1 = '利根川'");
           break;
         case 'all':
           echo 'すべて';
          $result = pg_query("SELECT * FROM m_test");
           break;
       }
    
       // 全てのデータを配列で取得
       $data = pg_fetch_all($result);
       print "<table id=\"dblist\" summary=\"PostgreSQLのデータベースの一覧\">\n";
    
       //テーブルヘッダとしてフィールド（カラム）名を出力
       print "<thead><tr>\n";
       $flds = pg_num_fields($result);
       for($i=0; $i<$flds; $i++){
           $field = pg_field_name($result, $i);
           printf("<th abbr=\"%s\">%s</th>\n", $field, $field);
       }
       print "</tr></thead>\n";
    
       //データの出力
       foreach($data as $rows){
           print "<tr>\n";
           foreach($rows as $value){
               printf("<td>%s</td>\n", $value);
           }
           print "</tr>\n";
       }
          print "</table>\n";
    
       // PostgreSQLを切断
       $close = pg_close($conn);
      ?> 
    
```

> ■補足事項  
>  ・PHPバージョン 5.6.30  
>  ・postgrespsqlバージョン 10.5
>
> ■PHPエラー  
>  search.phpの42行目にエラーが発生しております。  
>  ※42行目の該当コードは以下です。  
>  「 foreach($data as $rows){」
>
> ■PHPエラー内容  
>  PHP Warning: Invalid argument supplied for foreach() in
> /Applications/MAMP/htdocs/web9/search.php on line 42
>
> ■ 「pg_fetch_all($result」をvar_dumpした際の結果(「山に」て検索)  
>  山array(2) { [0]=> array(2) { ["item1"]=> string(16) "富士山 "  
>  ["item2"]=> string(16) "テスト1 " } [1]=> array(2) {  
>  ["item1"]=> string(16) "箱根山 " ["item2"]=> string(16) "テスト3 " } }
CC BY-SA 4.0
2018-09-10T02:30:18.720
48243
2018-09-10T03:55:47.777
2018-09-10T03:01:02.417
29466
29466
question
php html
PHPで抽出した結果をリスト上に反映させたい
PHPのみで現行のコードを最大限利用して実装するのであればindex.phpを以下のように修正する感じでしょうか。  
リクエストをsearch.phpに送信するのではなく、index.phpに送信し、POST送信されたときにのみsearch.phpをインクルードしてあげます。  
検証環境がないので、動作は試せてませんので、細かいシンタックスエラーは調整してください。

```

     <!DOCTYPE html>
      <html lang="ja">
      <head>
      <meta charset="utf-8">
      </head>
      <body>
      <div id="contents">
              <h3>リスト</h3><br>
          <div id="app">
              <sortable-table :columns="columns" :rows="rows">
              </sortable-table>
          </div>
    
      <!-- DBのデータをPHPで処理 -->
      <?php
    
    ////中略////
          </div><!-- /#main -->
      <!-- 右メニュー -->
          <div id="ham-menu">
                  <form action="index.php" method="post"> 
              <ul class="submenu">
                  <li>　項目：<select name= "categorysearch">
                      <option value="yama">山</option>
                      <option value="kawa">川</option>
              <option value="all">すべて</option>
                                  </select>
                  </li>
              </ul>
              <p class="button"><input type="submit" value="抽出"onclick="" class="clickBtn()" style="width:100px;height:30px"></p>
          </form>
      </div>
    <?php 
    if(isset($_POST['categorysearch']))
    {
      include "./search.php";
    }
    ?>
     <!-- 右メニューEND -->
      <div id="menu-background"></div>
      </div><!-- /#contents -->
      <footer>
    
    ////以下略////
    
```

最近の流行で作るとすればajaxを利用してSPAで作ることになると思いますが、そちらはまた別途お調べください。

■追記  
エラーが出ているようであれば、index.phpの最初に

```

    <?php
    ini_set('display_errors',1);
    ?>
    
```

を追記してみてください。  
画面にエラーが出力されると思います。

真っ白はたぶんphpのシンタックスエラーだと思いますので。
CC BY-SA 4.0
2018-09-10T03:02:51.300
48246
2018-09-10T03:55:47.777
2018-09-10T03:55:47.777
17014
17014
48243
answer