• 締切済み

phpプログラムが思うように動作しません

php初心者です。 とある製品のオーダーメイドサイトを作っています。 製品リストのcsvを読み込み、行分だけデータを表示させる様なプログラムを組みたいのですが 繰り返し処理が動作しないのでアドバイスをお願いします。 サーバーはhetemlです。 プログラムとcsvを編集しているOSがmacXなので、 csvの改行コードのせいで繰り返しができてないのかもとも思っています。 ソースは以下の通りです。 <? #csvファイルをオープン $file = fopen("itemlist.csv","r"); while(!feof($file)) { //カウンターを設置、初期化 $cnt=0; #fgetcsv関数がfalseを返却するまで実行 $data = fgetcsv($file);// $itemid = $data[$cnt]; $cnt++; $filename = $data[$cnt]; $cnt++; $itemname = $data[$cnt]; $cnt++; $price = $data[$cnt]; $cnt++; $detail = $data[$cnt]; $cnt++; print $data; print "<li>"; print "<p><img src='../store/item//".$filename."'></p>"; print "<p><input type='radio' class='required' name='".$itemname."' value='".$price."'>".$itemname."</p>"; print "<p><span class='form_price'>".$price."</span>円</p>"; print "</li>"; } fclose($file); ?> csvの中身です。(テキストエディタで編集) 一番右は在庫数です。 itemid01,01.jpg,itemname001,"800,000",説明1,1 itemid02,02.jpg,itemname002,"900,000",説明2,0 itemid03,03.jpg,itemname003,"1,000,000",説明3,10 itemid04,04.jpg,itemname004,"1,200,000",説明4,4

  • liath
  • お礼率20% (1/5)
  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • cheese014
  • ベストアンサー率85% (12/14)
回答No.2

> csvの改行コードのせいで繰り返しができてないのかも そう考えたのであれば、まずは改行コードを変更してテストしてみるのが先決ですね。 Macで定番の↓のようなテキストエディタを使えば簡単に変更できます。 http://www.mimikaki.net/ 改行コードすら確認・変更できない環境で開発されているなら、まずは開発環境から見なおした方が良いと思いますよ。 私の環境で試したところ、改行コード LF(\n) と CR+LF(\r\n) では問題なく動作しますが、CR(\r) では1行目しか取れませんでした。 改行コード? ⇒ http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89 ・fgetcsv() は setlocale() とセットで使うようにします。 ・feof() をループで回すと無限ループの原因になる事があるので、個人的には下記のようなループの書き方を推奨します。 ・list() を使うとコードがスッキリするでしょう。 // エラー表示ON error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1); var_dump(setlocale(LC_ALL, NULL)); // 変更前のロケール設定 setlocale(LC_ALL, 'ja_JP.UTF-8'); // csvファイルがUTF-8の場合 $fp = fopen('itemlist.csv', 'r'); while (($data = fgetcsv($fp)) !== FALSE) { if (count($data) !== 5) { continue; } list($itemid, $filename, $itemname, $price, $detail) = $data; var_dump($itemid, $filename, $itemname, $price, $detail); } fclose($fp);

参考URL:
https://www.google.co.jp/search?q=fgetcsv+setlocale
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

手許でローカルで実行したら、ちゃんとループされていました。 細かい問題はありますが、ループしない、ということは無いと思われます。 > csvの改行コードのせいで繰り返しができてないのかもとも思っています。 OSXはUNIXベースのOSです。 テキストエディタでも特に設定を変えなければ改行コードはLFです。Linuxと同じです。 この理由はあまり考えられません。

関連するQ&A

  • PHPのCSVファイル読み込みについて

    現在、PHPでCSVファイルを読み込み、広告をランキングしてランダムで出力しています。 今後例えばCSVファイルの中に10行の広告があるとしたら、5行をランダムで出力したいのですが、方法がわかりません。 現在はCSVファイルの中に5行広告があり、出力している広告も5行です。 ソースはこちらになります。 <? $h = file_get_contents("http://ドメイン/csv/koukoku.csv"); $h = trim($h); $h = explode("\n",$h); shuffle($h); $i = 0; $ii = 1; $star[] = "★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; $star[] = "★★★★★"; while($ii<6){ $v = explode(",",$h[$i]); if(isset($img)){ foreach($img as $val){ if($val==$v[2]){ ++$i; continue; } } }else{ $img[] = $v[2]; } shuffle($star); print '<p class="jyunni"><mark>第'.$ii.'位</mark>'.$v[1].'</p>'; print '<div class="box clearfix"><p class="s_img"><a href="'.$v[0].'"><img src="'.$v[3].'" /></a><p>'; print '<ul><li>人気度:'.$star[0].'</li><li>人気ポイント:<br /><span class="mini">'.$v[2].'</span></li><li class="btn"><a href="'.$v[0].'" class="btn1">詳細を見る</a></li></ul></div>'; ++$i; ++$ii; } ?> 分かる方教えてください。

    • 締切済み
    • PHP
  • PHPで、CSVファイルを、指定した行数だけ出力するには?

    同じようなトピックは、いくつかありましたが、あと一歩、わからないので質問させてください。 CSVファイルをPHPを使って読み込み、出力させる場合で、 CSVファイル data.csv --------------------------- データ1,説明,詳細 データ2,説明,詳細 データ3,説明,詳細 データ4,説明,詳細 データ5,説明,詳細   … データ100,説明,詳細 --------------------------- 上記のように100行あったとします。 この時、 PHPファイルを、 --------------------------- <?php $fp = fopen("data.csv", "r"); while ($data = fgetcsv($fp, 10000)) { $num = count ($data); print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; } fclose ($fp) ?> --------------------------- と書くと、100行目まで普通に出力してしまいます。 もし、10行目までを出したい場合は、どう記述すればよいのでしょうか? 上記のPHPソースに少し書き加える形で解決できればと思うのですが・・・ 色々試しましたが、私の力だけでは無理でした。

    • ベストアンサー
    • PHP
  • phpでのサーバー負荷について

    お世話になります。 phpで外部テキストファイルを読み込ませる場合、 requireとforeachではどちらがサーバー負荷が大きいのでしょうか。 $log = "./logfile.txt";(せいぜい、マックス5行程度です) <内容> 1,タイトル1,コメント1, 2,タイトル2,コメント2, 3,タイトル3,コメント3, 4,タイトル4,コメント4, 上記のものを、そのままforeachで1行ずつループさせて表示させる方法と foreach($log as $data){ $data = split("\,", $log); print "<li>$data[0]<span>$data[1]</span></li>"; } これを数時間に1回程度、バックグランドで稼動させて、 別のファイル(hoge.txt)に以下の形で保存させておいて <hoge.txtの内容> <li>タイトル1<span>コメント1</span></li> <li>タイトル2<span>コメント2</span></li> <li>タイトル3<span>コメント3</span></li> <li>タイトル4<span>コメント4</span></li> require("./hoge.txt"); で読み込ませた方が負荷は少ないのでしょうか。 現在、foreachでやっているのですが、 あまり頻繁に変更される部分ではない為に、 ページを開くたびに毎回foreachでループさせるよりも 後者の形で読み込ませた方がサーバー負荷が多少でも少なくなるようでしたら 後者に変更しようと思うのですが、どうでしょうか。 お手数をおかけしますがもし宜しければご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • PHP 全角文字が文字化けまたは表示されない

    PHPでエクセルで作成したcsvファイルから商品一覧を表示させたいのですが。 一覧ページで日本語や大文字英数が含まれるデータが表示されません。 エンコードはいろいろ試してみたのですが、utf-8だと文字化け、EUC_JPやSJISだと表示されなくなってしまいます。 csvから呼び出す際に mb_convert_variables('utf-8', 'sjis-win', $tmp); としても文字化けします。 ちなみに、$dataでprintすると問題なく表示されます。 $data1では上手く表示されません。 なので、for($i=$start;$i<$end;$i++){ 以降でおかしいんだろうなとは思うのですが。 1ページに数件ずつで、次へ次へで移りたいので、ここの部分が必要です。 商品詳細ページで、同じcsvファイルを読みだしてますが、 while ($data = fgetcsv($fp, 10000)) { if($atai==$data[0]){ ・・・・ と書いてこちらは問題なく表示できています。 何が原因か見つけられずに困っています。 お分かりになる方、教えてください。 初心者レベルですので、なるべく具体的に書いていただけると助かります。 よろしくお願いします。 //ファイルからデータを読み込む処理 function inst_view($page=0) { //読み込むファイル名 $filename = FILE_PATH; //データ数をカウントする $row = 0; $data = array(); //CSVファイルの中身をすべて読み込む $handle = fopen($filename, "r"); while (($tmp = fgetcsv($handle, 1000, ",")) !== FALSE) {    if (!empty($choice1) && $choice1 == "4") { $num = count($tmp); if( $tmp[0] == "" ){ }else{ $data[$row]["no"] = $tmp[0]; $data[$row]["hito"] = $tmp[1]; $data[$row]["kuni"] = $tmp[2]; $data[$row]["tochi"] = $tmp[3]; $data[$row]["nen"] = $tmp[4]; $data[$row]["size"] = $tmp[5]; $data[$row]["cm"] = $tmp[6]; $row++; } } } fclose($handle); //降順にする rsort($data); //1ページに表示するデータ数を読み込む $page_length = PAGE_LENGTH; //全ページ数を求める処理 $maxpage = $row/$page_length; $tmp = (int)$maxpage; if($maxpage>$tmp){$maxpage=$tmp+1;} $maxpage--; //現在のページ数からデータ開始と終わりを求める $start = $page * $page_length; $end = ($page * $page_length) + $page_length; //データを格納する配列と、その指標 $cnt=0; $data1 = array(); //データ格納処理(スタートからエンドまで繰り返す。 for($i=$start;$i<$end;$i++){ //最大データ数を超えたら取得終了する。 if($i >= $row){break;} $data1[$cnt]["no"] = $data[$i]["no"]; $data1[$cnt]["hito"] = $data[$i]["hito"]; $data1[$cnt]["kuni"] = $data[$i]["kuni"]; $data1[$cnt]["tochi"] = $data[$i]["tochi"]; $data1[$cnt]["nen"] = $data[$i]["nen"]; $data1[$cnt]["size"] = $data[$i]["size"]; $data1[$cnt]["cm"] = $data[$i]["cm"]; $cnt++; } return $data1; } 別のファイルからinst_viewを呼び出しています。

    • 締切済み
    • PHP
  • csvファイルを配列へ格納しブラウザへ出力

    <?php #CAT csvファイルを開く $fp_c = fopen("test.csv","r"); #domain csvファイルを開く $fp_domain = fopen("test.csv","r"); print "<table border='1'>"; #fgetcsv関数がfalseを返却するまで実行 while($c_data = fgetcsv($fp_c)){ print "<tr>"; #csvファイルの列数だけ実行 for($i=0;$i<count($c_data);$i++){ print "<td>".$c_data[$i]."</td>"; } print "</tr>"; } print "</table>"; var_dump($c_data); fclose($fp); ?> このようなプログラムをつくってcsvファイルの各セルを配列$c_data[$i]へ格納している(つもり) なのですが、var_dump($c_data);を入れると bool(false)と表示されてしまいます。 このプログラムではcsvファイルの中身を表示できても配列に格納されていないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVデータの項目名からファイル名を付ける

    CSVデータからHTML拡張子で書きだすCGIを作成してます。 参考になるサブルーチンをネットで見つけたのですが、行の上から順に001.html・・・・のファイル名になり、CSVデータの項目にあるデータでファイル名を付けたいと思いますが、どのように処理したらよいかわかりません。アドバイス願います。 -------------------------------------------------------------- サンプルのCSVデータ(2行目のファイル名をファイル名につけたいです。) タイトル,ファイル名,会社名,担当者,URL 山ちゃん,yamadaya,山田屋,山田,http://www.oooxxx.oo 最上ちゃん,mogami,最上商店,最上,http://www.oooxxx.oo 南ちゃん,minami,南喫茶,南,http://www.oooxxx.oo -------------------------------------------------------------- コード: $list = join('',@csv); @list = split(/\n/, $list); for($count=1;$count<@list;$count++){ $html = $template; $filename = sprintf("%03d.html",$count); @listinfo = split(/\,/,$list[$count]); for($cnt=0;$cnt<@listinfo;$cnt++){ $no = sprintf("<!--%02d-->",$cnt); $html =~ s/$no/$listinfo[${cnt}]/g; } flock(FH, LOCK_EX); open(FH,">$filename"); print FH $html; close(FH); flock(FH, LOCK_NB); }

  • PHP+csv+リストボックスで文字化け

    お世話になっています。 現在PHPからcsvファイルを読み込み、リストボックスに表示するという、 単純なプログラムを組んでいます。 しかし、文字化けが発生してしまいます。 csvファイル、phpファイル共に、utf8での保存を確認しています。 csvファイルはイレギュラーですが、#区切りで記入されています。 csvファイル 1#商社マン 2#プロ野球選手 phpファイル --省略-- <HEAD> <META http-equiv=content-type content="text/html; charset=UTF-8"> </HEAD> --省略-- <?php function GyousyuList(){ $listFile = fopen('./conf/gyousyu.csv','r'); ?> <SELECT><?php while($itemLine = fgets($listFile)){ $itemList = explode('#',$itemLine); $itemId = mb_convert_encoding($itemLine[0],'UTF-8'); $itemName = mb_convert_encoding($itemLine[1],'UTF-8'); ?> <OPTION value=<?php echo $itemId;?>><?php echo $itemName;?></OPTION> <?php }?> </SELECT> <?php return; } ?> <?php GyousyuList();?> --省略-- 実行結果は日本語・英語にかかわらず文字化けします。 実行結果 抜粋 <SELECT> <OPTION value="ï">»</OPTION> <OPTION value="2">#</OPTION> </SELECT> どうにも解決できません。 ちなみにmb_convertは外しても結果は変わりませんでした よろしくお願いします!

    • ベストアンサー
    • PHP
  • 複数の要素へ appendchild できません

    以下のような html があり、それぞれの画像リンクの後ろに <span>文章4</span>を追加したいのですが、できません。 元の html <ol> <li>文章1 <a href="a.jpg" ><img src="a_small.jpg" /></a></li> <li>文章2 <a href="b.jpg"><img src="b_small.jpg" /></a></li> </ol> <p>文章3 <a href="c.jpg"><img src="c_small.jpg" /></a></p> 作りたい html <ol> <li>文章1 <a href="a.jpg" ><img src="a_small.jpg" /></a><span>文章4</span></li> <li>文章2 <a href="b.jpg"><img src="b_small.jpg" /></a><span>文章4</span></li> </ol> <p>文章3 <a href="c.jpg"><img src="c_small.jpg" /></a><span>文章4</span></p> 以下のようなスクリプトを書いてみたのですが、どうしても最後の要素(この場合は3番目の画像)へしか <span>文章4</span> が追加されません。全ての a タグの要素へ追加するにはどうしたらいいのでしょうか。 window.onload = function() { var addedSpan = document.createElement("span"); var addedTxt = document.createTextNode("文章4"); addedSpan.appendChild(addedTxt); var imgs = document.getElementsByTagName ("a"); for (var i=0; i<imgs.length; i++) { imgs[i].appendChild (addedSpan); } } 初歩的な質問でお恥ずかしいのですが、是非ご教授ください。どうぞよろしくお願いします。

  • fgetsを使ってcsvからcsvに

    csvファイルからfgetsを使い任意の文字列を取り出して新たなcsvファイルに出力したいのですがなかなかうまくいきません。ご指摘の方よろしくお願いします。 csvデータ 社名,住所,番号,設立年,従業員数,分類 山川商事,東京,123,8,60,証券 谷運輸,,578,20,400,運送 空海コンピュータ,,456,,300,ソフトウェア          ・          ・          ・ データの3,5,6番目を取り出したい。(データが入ってない箇所もある) #include <stdio.h> int main(void) { FILE *fp1,*fp2; char data[256]; char *data_p = data; int cnt = 0; char ch[256]; char *ch_p = ch; //ファイルオープン(fp1)// //ファイルクローズ(fp2)// while (fgets(data, 255, fp1) != NULL) { if (*data_p != ',') { if(cnt == 2) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 4) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 5) { *ch_p = *data_p; data_p++; ch_p++; } } else { if (cnt == 2) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 4) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 5) { *ch_p = *data_p; data_p++; ch_p++; } cnt++; x++; } } y = '\0'; fprintf(fp2, "%s", ch); fclose(fp1); fclose(fp2); }

  • 外部のCSVファイルをPHPで読み込み、出力させたい

    下記の質問を参考に外部のCSVファイルをPHPで読み込み、出力させるphpを書きました。 http://oshiete1.goo.ne.jp/qa1615206.html data.csvは "データ01" "データ02" "データ03" ・・・ といったように100行書いてあります。 <1ページ目に記述したphp> <?php $fp = fopen("data.csv", "r"); $repeat = 10; $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0] EOD; $count++ ; } fclose ($fp) ?> 2ページ目には11行目からのデータを出力したいと思い、 $data[0]の部分を$data[11]に変えたり、 $repeat = 20; $count = 11;にしたりしたのですが、 両方ともうまくいきませんでした。 2ページ目にcsvの11行目からのデータを出力するにはどうすればいいのでしょうか? 私がしたいことは、1ページ目にcsvの1~10行目を、2ページ目にcsvの11~20行目を出力したいとおもっております。 上記のphp以外の記述でも構いませんので、どなたかお分かりになる方がいらっしゃいましたら是非教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう