• ベストアンサー

txtに入っているデータの全件テーブル表示をする場合

下記のdata.txt内のデータをphpでtable表示で全件を表示させたいのですが、最初の一件を表示することはできたのですが、あとのデータを同じように表示させる事を試みましたが、できませんでした。 一件目から縦に全件を表示させるにはどうしたらいいのでしょうか? よろしくお願いします。 data.txt------------ 12345,54321,田中,010,1234,5678,青森,2134,6854,山本,020,3210,5439,長崎,57404,74748,清水,030,5673,2865,岡山 ---------------------------------------------- <?php //ファイルオープン $fp = fopen('data.txt','r'); //データの読み込み $data=fgets($fp); //ファイルクローズ fclose($fp); //分割処理 $hairetu = split(',',$data); //出力処理 print("<table BORDER='1'>\n"); print("<tr><td>ID</td><td>パスワード</td><td>名前</td><td>TEL</td><td>住所</td></tr>\n"); print("<tr>\n"); print("<td>".$hairetu[0]."</td>\n"); print("<td>".$hairetu[1]."</td>\n"); print("<td>".$hairetu[2]."</td>\n"); print("<td>".$hairetu[3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[6]."</td>\n"); print("<tr>\n"); print("</table>\n"); ?>

  • PHP
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.2

まず、素朴な疑問ですが、data.txt においてですね 1件ごとに「改行」で区切るのが普通だと思うのですが つまり 12345,54321,田中,010,1234,5678,青森 2134,6854,山本,020,3210,5439,長崎 57404,74748,清水,030,5673,2865,岡山 のような感じということなんですが、何か理由があって 改行することなく、ずらずらとデータがコンマ区切りで 連なっているんですよね。 # 処理の効率からすると、1件=1行にした方が # よいと思うのですが・・・ > 最後の余白のところにきたら終了するという条件が考えられません。 「最後の余白のところにきたら終了する」→ 「配列の最後にきたら終了する」→ 「配列の最後にくるまで続ける」→ 「$i < count($hairetu)」 for($i = 0; $i < count($hairetu); $i += 7) { # 最後の余白っていうのが気になるんですが # 最後の「余白」ってなんでしょう? > 二件目になるとでません。 anmochi さんのプログラムでも出ないんですか? ほんとに、質問文のような data.txt の形式になっている んでしょうか? 1件のデータを改行で区切って、1行ずつ処理する方が 一般的な CSV 形式であって普通だと思いますが・・・ # う~ん、ファイルのロック問題があって、いっきに # fgets で全体を読み込もうとしてるのかな? 仮に data.txt が改行で区切られていると <?php // ファイルオープン $fp = fopen('data.txt','r'); print("<table BORDER='1'>\n"); print("<tr><td>ID</td><td>パスワード</td><td>名前</td><td>TEL</td><td>住所</td></tr>\n"); // ファイルの末端にくるまで続ける while(!feof($fp)){  // データの読み込み & 分割処理  $hairetu = split(',', fgets($fp));  // 出力処理  print("<tr>\n");  print("<td>".$hairetu[0]."</td>\n");  print("<td>".$hairetu[1]."</td>\n");  print("<td>".$hairetu[2]."</td>\n");  print("<td>".$hairetu[3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n");  print("<td>".$hairetu[6]."</td>\n");  print("<tr>\n"); } print("</table>\n"); fclose($fp); ?> というプログラムになります。(参考に)

hiki_zero_
質問者

お礼

当初は、改行なしのほうで進めたのですが、 後々の事を考えてまして、変えました。 とても参考になりました。 問題が解決できありがとうございました。

その他の回答 (2)

  • tripod_r
  • ベストアンサー率38% (5/13)
回答No.3

No2の方が言うように改行(\n等)で区切らなければ後々しんどいです。 私の場合テーブル等に使用するデータはCSV形式(,区切り)で作成しています。 まず、データのフォーマットを決めます。 例) ID,PASSEORD,NAME,TEL1,TEL2,TEL3,ADDRESS, 次にフォーマットにしたがってデータの入力を行います。 例) 12345,54321,田中,010,1234,5678,青森, 2134,6854,山本,020,3210,5439,長崎, 57404,74748,清水,030,5673,2865,岡山 ※最後の改行を忘れないように!! ------------------------------------------ データは最低この様な形にして下さい。 ------------------------------------------ 次にデータの読み込み&書き出しです。 <? print <<<EOM <table BORDER='1'> <tr> <td>ID</td> <td>パスワード</td> <td>名前</td> <td>TEL</td> <td>住所</td> </tr> EOM; $fp=FOpen("data.txt" , "r"); while(($data = FGetCsv($fp,1024)) !== FALSE){ print <<<EOM <tr> <td>$data[0]</td> <td>$data[1]</td> <td>$data[2]</td> <td>$data[3]-$data[4]-$data[5]-</td> <td>$data[6]</td> <tr> EOM; } print <<<EOM </table> EOM; fclose_sub($fp); ?> となります。 ※デバッグしていないので..... あと、検索エンジン等でCSV形式について調べてみるのもいいかもしれません。 注意:もしも,が入力された場合は,に置き換えるのを忘れずに!! 例)$name=ereg_replace(",", ',', $name);

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

ん~。単純にこれではだめなのかな? for($i = 0; 終了条件(好きに決めてね); $i += 7) { print("<tr>\n"); print("<td>".$hairetu[$i + 0]."</td>\n"); print("<td>".$hairetu[$i + 1]."</td>\n"); print("<td>".$hairetu[$i + 2]."</td>\n"); print("<td>".$hairetu[$i + 3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[$i + 6]."</td>\n"); print("<tr>\n"); }

hiki_zero_
質問者

補足

data.txt内は、今回は3つのデータを表記したのですが、データが次から次へとtxtに書き込まれるため tableには更新するたびに次から次へと件数が増えるという点と上記の終了条件を決める際に、最後の余白のところにきたら終了するという条件が考えられません。 更新する度にdata.txtには次から次へとデータが格納され結果としてtableを使用して全件を表記する。 一件目は確かにでてくるのですが、 二件目になるとでません。

関連するQ&A

  • HTMLのテーブルにデータを流し込む際のレイアウト

    度々、失礼させていただきます。なにぶん見よう見まねです。 「abc.csv」より条件(1)で抽出した後HTMLのテーブルに並べます。 但しこのままですとHTML上、右に伸びていってしまうので4つぐらいで 新しいテーブルに改行したいのですが、お力お貸しください。 <table> <tr> <td> <?php $Data=file("abc.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($line[0]=="0" && $line[1]=="1"){ //条件(1) print "<td><table><tr>\n" ; print "<td>{$line[2]}</td></tr>" ; print "<tr>" ; print "<td>{$line[4]}</td></tr>" ; print "</table></td>\n" ; } } ?> </td> </tr> </table>

    • ベストアンサー
    • PHP
  • テーブルに送信ボタンをつける

    phpで以下のようなテーブルにデータを表示させるプログラムがあるのですが、表示させる各行の最後に送信ボタンを付けたいのですがどうすればよろしいでしょうか?よろしくお願いいたします。 print ("<TABLE border=\"1\"><TBODY>\n") ; for ($i = 0; $i < $numrows; $i++) { $data = pg_fetch_array ($result, $i) ; print ("<TR>") ; print ("<TD>" . $data[" "] . "</TD>"); print ("<TD>" . $data[" "] . "</TD>"); print ("<TD>" . $data[" "]. "</TD>"); print ("</TD>\n"); } print ("</TBODY></TABLE>\n");

    • ベストアンサー
    • PHP
  • csvデータをテーブル表示させる

    再び新規質問で申し訳ありません これしか方法がわからなかったもので; csvデータから最初の項目に5というものが含まれている場合 その列を表示する、というのを先ほど質問させていただいて解決に至りました。 csvデータファイルの内容 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 6,データ4,データ4の説明 ・・・ ↓ open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { print $_. "\n"; } } close(IN); これで最初の欄に5が含まれている列だけ表示されるのですが htmlに出力すると、そのまま下記のように表示されます 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 これでは余りにみずらいので、以下のように変更しました open(IN, "data.csv"); print "<table>"; while (<IN>) { if ((split(/,/))[0] == 5) { print "<tr><td>". $_. "</td></tr>"; } } </table> close(IN); これで少しは見やすくなったのですが・・・ ↓のように。 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 この,で区切られた部分も</td><td>で表示したいのですがうまくいきません。 先ほど質問した時に教えていただいたURLを参照しましたがサッパリでした; 検索で、csvファイルをリストに格納して print "<table><tr>"; print "<td>$data_view[0]</td>"; print "<td>$data_view[1]</td>"; print "<td>$data_view[2]</td>"; print "</tr></table>"; と表示させれば良い、という記事をみつけたのですが これをすると 先ほど成功した最初のデータに5が一致した分だけ表示させる、という部分が機能しませんでした;; まだまだ勉強不足かとは思いますが何卒お願い致します

    • ベストアンサー
    • Perl
  • DBのデータを表示させたい

    こんにちは PHPは今まで他人様の作成したスクリプトをそのまま使用したりちょこっと改造するだけでしたが、 現在必要としているスクリプトが探してもなさそうなので 自分で作成しようと決めて勉強を始めましたが どうしても悩んでいる部分があるのでご教授いただけると助かります。 環境は以下の通りです apache 1.3.37 PHP 5.25 MySQL 5.0 現在の状況なのですが `uid` mediumint(8) NOT NULL auto_increment, `user` varchar(25) NOT NULL, `pass` varchar(32) NOT NULL, `place` varchar(32), `sev` varchar(32), `date` varchar(25) NOT NULL, `regdate` datetime, `gate` varchar(25), `statue` varchar(25), PRIMARY KEY (`uid`), KEY `user` (`user`), KEY `date` (`date`), KEY `gate` (`gate`), KEY `statue` (`statue`) このようなテーブルが作成してありユーザーがフォームから登録したものをDBに保存していき、 1ページに数件分ずつの表示で何ページにもわたって 全件を表示するようなページをです。 フォームからDBへのデータの保存はできるようになりましたが 表示をする際に何件もの表示をするのにどういった手法で行うのがいいのかで悩んでいます。 現在は最新の1件だけ表示されるようなページになっています。 <?php include ("config.php"); $con = mysql_connect($dbhost, $dbuser, $dbpasswd); $selectdb = mysql_select_db($dbname, $con); $sql = "SELECT * FROM testdata ORDER BY regdate DESC"; $rst = mysql_query($sql, $con); $datanum = mysql_num_rows($rst); if ($datanum < 1) { print("データがありません。<br>\n"); print("登録は <a href=\"regist.php\">こちら</a> から"); mysql_close($con); exit; } $data = mysql_fetch_array($rst) ?> <table width="95%" border="0" cellspacing="1"> <tr> <td><table width="100%" border="0"> <tr <td colspan="6">登録情報</td> </tr> <tr> <td width="13%">登録者名</td> <td width="20%"> <?=$data['user']?> </td> <td width="13%">場所</td> <td width="20%"> <?=$data['place']?> </td> <td width="13%">サーバー</td> <td width="20%"> <?=$data['sev']?> </td> </tr> <tr> <td>登録日時</td> <td> <?=$data['regdate']?> </td> <td>日時</td> <td> <?=$data['date']?> </td> <td colspan="2">&nbsp;</td> </tr> </table></td> </tr> <tr> <td><table width="100%" border="0"> <tr> <td colspan="5">状態</td> </tr> <tr> <td width="16%">ゲート</td> <td width="30%"><?=$data['gate']?></td> <td>&nbsp;</td> <td width="16%">statue</td> <td width="30%"><?=$data['statue']?></td> </tr> </table></td> </tr> </table> DBから何件分もの表示をするにはDBのデータを連想配列にするのかなと思っているのですが いまいちどんな手法が良いのかわかりません。よろしければご教授くださいませ。

    • ベストアンサー
    • PHP
  • データが表示されません

    php4とMySQLを使用しています。 select文でデータを取得したあと while($Row2 = mysql_fetch_array($result2, MYSQL_ASSOC)){ $name = $Row2['name']; $contents = $Row2['contents']; ?> <table> <tr> <td><?=$name?></td> </tr> <tr> <td><?=$contents?></td> </tr> </table> <? } ?>で表示しようとしていますが、10件中の10件目しか表示されません。 上書きされているようです。どこがおかしいでしょうか? 教えてください。お願いいたします。

    • ベストアンサー
    • PHP
  • ポーリングとHTMLデータのリロードの方法

    次のことをするcgiを作りたいのですが  1. 起動したらデータを読み込み、その内容を表に表示。(即時)  2. 5秒ごとにデータを読みに行き(ポーリング)、変化があったら表を    リロードして新しいデータの表を表示する。 下記のようにすると、リロードされずに表がいくつも表示されてしまいます。 (リロード処理を入れてないので当たり前なんですが) また、その表示が5秒ごとではなく、かなり長い時間(数十秒?)たってから 1度に数個表示されるというのを繰り返してしまいます。  Q1 リロードさせるには、javascriptを使えばよいのかと思うのですが、    どのようなスクリプトを使えばよいのでしょうか。    また、javascriptでなくても他に方法があれば教えてください。    (Perlのプログラム上では無理でしょうか)  Q2 起動時にまずは最初のデータを表示させたいのですが、sleeを使うと    起動後すぐ表示されないように思いますが、どのようにしたらよい    でしょうか。 なお、下記テストプログラムでは、データを更新して表示する処理は 省いています。 よろしくお願い致します。 ------------------------- $kaisuu = 0; $change = 0; while (1) {   &data;   if($kaisuu == 0 ){     &hyou;     $kaisuu = 1;   }elsif (($kaisuu == 1) && ($change == 1)){     &hyou;   }   sleep 5; } sub data {   #データの読み込み処理   if(データに変化あり){     $change = 1;   } } sub hyou {   print "Content-type: text/html\n";   print "\n";   print "<html>\n";   print "<head>\n";   print "<title>Test</title>\n";   print "</head>\n";   print " <table border=2 frame=border>\n";   print " <tr><td>項目</td>\n";   print " <td>名前</td></tr>\n";   print " <tr><td>1</td>\n";   print " <td>まるまる</td></tr>\n";   print " <tr><td>2</td>\n";   print " <td>ばつばつ</td></tr>\n";   print " </table>\n";   print "</body>\n";   print "</html>\n"; }

    • ベストアンサー
    • Perl
  • テーブルデータ表示後、再表示の方法

    初めて質問させて頂きます。うまく言葉に出来てないかもしれませんがよろしくお願い致します。 現在スケジュール管理をPHPとSqliteで作成しています。 yotei.phpでDBのデータを表示(HTMLのTABLE)し、予定の追加・更新をする場合は該当の日付をクリックするとrequire_onceでtoroku.phpを読込ます。toroku.phpでは更新処理か新規登録かを確認し、<form action="add.php?id='.$id.'&ymd='.$ymd.'" method="POST">にて登録・削除・リセットの各ボタンにあわせてのDB処理を行っています。 <?php session_start(); $link = sqlite_open('yotei.db', 0666, $sqliteerror); ?> ~一部省略~ <TABLE BORDER=1 WIDTH="100%" CELLPADDING="2" CELLSPACING="0"> <TBODY><TR> <TD>日付</TD> <TD>曜日</TD> <TD>予定時間</TD> <TD>作業内容</TD></TR> <?php //データ表示 $ymd = date('Ymd', mktime(0, 0, 0, $mm, $dd, $yy)); $i = 0; while ($ymd <= $to_date) { $sql = "SELECT * FROM timetbl where (id=$sid and ymd=$ymd)"; $result = sqlite_query($link, $sql, SQLITE_BOTH); if ($rows = sqlite_fetch_array($result)) { print('<TR>'); print('<TD WIDTH="5%" ALIGN="center" NOWRAP><A href="yotei.php?ymd='.date('Ymd', mktime(0, 0, 0, $mm, $dd, $yy)).'">'.date('m/d', mktime(0, 0, 0, $mm, $dd, $yy)).'</A></TD>'); print('<TD WIDTH="5%" ALIGN="center" NOWRAP bgcolor="'.$chk['color'].'">'.$chk['youbi_m'].'</TD>'); ~一部省略~ } else { print('<TR>');    print('<TD WIDTH="5%" ALIGN="center" NOWRAP><A href="yotei.php?ymd='.date('Ymd', mktime(0, 0, 0, $mm, $dd, $yy)).'">'.date('m/d', mktime(0, 0, 0, $mm, $dd, $yy)).'</A></TD>'); print('<TD WIDTH="5%" ALIGN="center" NOWRAP bgcolor="'.$chk['color'].'">'.$chk['youbi_m'].'</TD>'); ~一部省略~ print('</TR>'); } $dd = $dd + 1; $ymd = date('Ymd', mktime(0, 0, 0, $mm, $dd, $yy)); $i = $i + 1; if ($i > 30) { break; } } ('<TD WIDTH="5%" ALIGN="center"> </TD>'); ~一部省略~ ?> </TBODY></TABLE></DIV> <?php sqlite_close($link); if (!isset($_GET['ymd'])){   PRINT('</BODY>'); PRINT('</HTML>'); exit; } ?> <?php require_once("toroku.php"); ?> </tbody></table></div> toroku.phpでは、該当の日付のDBのデータを読み退避させてyotei.phpと同じ様に1か月分を再表示させてますが、yotei.phpの表示とtoroku.php再表示の表が重なって表示されてしまいます。 申し訳ありませんが、ご教示頂けませんでしょうか?

    • ベストアンサー
    • PHP
  • PHP+MYSQLで3×5のテーブル表示について

    こんにちは。 PHP+MYSQLでページング処理で画像を出力の勉強をしています。 さっそく質問です。PHP+MYSQLを使って 元テーブルがID番号、名前、性別だとして、 1名分の表示は上記フィールドのデータを縦に3行作った後、 横の列に移るという作業をして、結果縦横に3×5並べる にはどう書けば良いいでしょうか? プログラムのイメージは以下になります。 めくっていく頁のはじめの行($i=$startline)から表示する時、 表示を1列×3行のまとまり□を縦横に3×5出力する場合、 mysqlに接続した後、 $rs = mysql_db_query($db,$sql); while($row=mysql_fetch_array($rs) ){ print("<table><tr>"); print("<td>"); print("<td>"); for($i=0;$i<4;$i++){ print("<tr>"); print("<td>"); print($row[$i]); print("</tr>"); print("</td>"); print("</td>"); } print("</td>"); print("</tr></table>"); こういう形の後、ページングの$pageのurlを作って、$_get[]に 飛ばすというイメージです。 よろしくお願いします。 以上

    • 締切済み
    • PHP
  • データ)表示件数について

    PHPとCSVでデータを表示させる事は出来ました。 希望は、 Pagerを使い1ページに表示する件数を10件としたいのですが、うまくいきませんでした。 よろしければ修正 or ご教授よろしくお願い致します。 <?php require("Pager/Pager.php"); $params = array( 'mode' => 'sliding', 'perPage' => 20, 'delta' => 5, 'urlVar' => 'p', 'separator' => ' |', 'curPageSpanPre' => '', 'curPageSpanPost' => '', 'prevImg' => '&lt;前の20件', 'nextImg' => '次の20件&gt;', 'firstPageText' => '最初', 'firstPagePre' => '[', 'firstPagePost' => ']', 'lastPageText' => '最後', 'lastPagePre' => '[', 'lastPagePost' => ']', 'spacesBeforeSeparator' => 0, 'spacesAfterSeparator' => 1, 'totalItems' => 1000, 'altFirst' => '最初のページへ移動', 'altPrev' => '前のページへ移動', 'altNext' => '次のページへ移動', 'altLast' => '最後のページへ移動', 'altPage' => 'ページ', ); $pager =& Pager::factory($params); $links = $pager->getLinks(); if ($links['pages'] != '') { echo $links['first'], $links['back'], ' | ', $links['pages'], ' | ', $links['next'], ' ', $links['last']; } print<<<eof <table width="550" class="table01"> <tr> <td width="32" height="18"><div align="center"><strong>画像</strong></div></td> <th width="123"><strong>名前</strong></th> <th width="58"><strong>材料</strong></th> <th width="56"><strong>時間</strong></th> <th width="53"><strong>費用</strong></th> <th width="55"><strong>美味しさ</strong></th> <th width="56"><strong>日</strong></th> <th width="81"><strong>詳細ページ</strong></th> </tr> eof; $csv = fopen ("item.csv", "r") or die(print "ファイルを開く事が出来ませんでした"); while ($items = fgetcsv ($csv, 1000,",")) { print "<tr>\n"; print "<td height='40' rowspan='2'><img src='$items[0]'/></td>\n"; print "<td><center>$items[1]<center></td>\n"; print "<td>$items[2]</td>\n"; print "<td>$items[3]</td>\n"; print "<td>$items[4]</td>\n"; print "<td>$items[5]</td>\n"; print "<td>$items[6]</td>\n"; print "<td>$items[7]</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td height='16' colspan='7'><div align='left'><a href="$items[8]"></a></div></td>\n"; print "</tr>\n"; } fclose($csv); ?>

    • ベストアンサー
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP