• 締切済み

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
  • 回答数3
  • ありがとう数1

みんなの回答

回答No.3

>mb_convert_encoding($data0, 'UTF-8', 'shift-jis'); mb_convert_encoding($data0, 'UTF-8', 'SJIS-win'); で試されてはいかがでしょうか? 私は逆のパターンでしたが上手くいきました

noname#244856
noname#244856
回答No.2

Excelで作ったやつは「shift-jis」じゃなくて「cp932」ですね。改行コードはCRLFでもLFでもちゃんと動いてくれるようなのでそのままにすると… setlocale(LC_ALL, 'ja_JP.UTF-8'); stream_filter_prepend($fp = fopen(FILE_PATH, 'rb'), 'convert.iconv.cp932/utf-8', STREAM_FILTER_READ); while ($tmp = fgetcsv($fp)) { ... } これでどうでしょうか。「...」の部分でechoとかvar_dumpしてるなら最初に header('Content-Type: text/html; charset=utf-8'); もしくは header('Content-Type: text/plain; charset=utf-8'); を実行するのを忘れずに。

noname#244856
noname#244856
回答No.1
serizawapaseri
質問者

補足

ありがとうございます。 教えていただいたページも見て、いろいろ試しているのですが、解決に至りません。 $file = FILE_PATH; $data0 = file_get_contents($file); $data0 = mb_convert_encoding($data0, 'UTF-8', 'shift-jis'); $temp = tmpfile(); $data = array(); fwrite($temp, $data0); rewind($temp); setlocale(LC_ALL, 'ja_JP.UTF-8'); while (($tmp = fgetcsv($temp, 0, ",")) !== FALSE) { としたら、だいぶ表示されるようになったんですが、ひらがな・カタカナ・空白が1文字目にあると1文字目だけ化けてしまいます。 ほとんどの漢字、アルファベットは大丈夫なんですが。 上記のように書き換えたら、1文字目文字化け以外は解決しています。

関連するQ&A

  • 変数の前に付ける(int)の効果は何ですか?

    http://www.phppro.jp/school/phpschool/vol24/1 こちらのサイトのサンプルコードに //全ページ数を求める処理 $maxpage = $row/$page_length; $tmp = (int)$maxpage; if($maxpage>$tmp){$maxpage=$tmp+1;} $maxpage--; とありますが、 (int)とは何でしょうか。

    • ベストアンサー
    • PHP
  • 検索結果($_POST)が2ページ目以降は消える

    PHP+MySQLで分割ページを作っています。 検索結果のページを分割しているのですが、2ページ目以降に検索されたレコードが表示されません。 1).2ページ目以降に続きのレコード(下記では21件目以降)を表示させるには、どうすれば良いのでしょうか。 2).上記には関係ないのですが、「<?= $msg ?>」で検索結果の総数を表示したいのですが、「1」としか表示されません…ついでで良いので、ご指摘いただけたらと思います。 <?php $keyword = $_POST['keyword']//検索ワードになります、下記の例では使用していません ?> <?php //データベース接続 $page = $_REQUEST['page']; if ($page == '') { $page = 1; } $page = max($page, 1); // 最終ページを取得する $sql = 'SELECT COUNT(*) AS cnt FROM table1'; $result = mysql_query($sql); $rows = mysql_fetch_assoc($result); $maxPage = ceil($rows['cnt'] / 20); $page = min($page, $maxPage); $start = ($page - 1) * 20; $result = mysql_query('SELECT * FROM table1 LIMIT ' . $start . ',20'); $rowss = mysql_num_rows($sql); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mail"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = "".count($rowss).""; }else{ $msg = "sorry"; } //結果保持用メモリを開放する mysql_free_result($result); ?> //下記から、HTML部に表示しています <?php $start_a = ($start + 1); print "".$start_a."件~"; $start_b = ($start + 20); print "".$start_b."件を表示しています(".$page."ページ目/全".$maxPage."ページ)<br>"; if ($page > 1) { print "<a href=\"page.php?page=".($page - 1)."\">前のページへ</a>  "; } else { print "前のページへ"; } if ($page < $maxPage) { print "<a href=\"page.php?page=".($page + 1)."\">次のページへ</a>  "; } else { print "次のページへ"; } ?> <?= $msg ?> 何卒、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP 10件表示 "前へ" "次へ"

    現在PHPとMYSQLを使用しております。  SQLでデータベースから$fldが一致したデータだけ抽出したデータを 10件ずつ表示させて”次へ”を押すと11~20件目が表示。 また”次へ”を押すと...といった感じに"次へ"と"前に"を表示させたいのですがどうしてもやり方がおもいつきません。  どなたかご存知の方ご教授お願いできませんでしょうか。 ここに今出来ていますスクリプトを記載させて頂きます。 extract($_REQUEST); if (!isset($page)) { $page = 1; } if(!empty($fld)) { //$fldに検索したい住所が入ってます。 $local = addslashes($fld); $where .= "add1 = '$fld' && "; } if(!empty($where)) { $where = substr($where, 0, -3); $where = "WHERE " . $where; } $sql = "select count(*) as cnt from ○○ ". $where; $rst = mysql_query($sql); $row = mysql_fetch_array($rst); $tcnt = $row["cnt"]; mysql_free_result($rst); $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<B>$tcnt 件みつかりました。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示</B>"; } else { $pagehead .= "$tcnt] を表示</B>"; } $sql = "select * from ○○ ". $where. " order by renban desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>登録データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo "<br />"; echo $row["people"]; echo " "; echo $row["add1"]; echo $row["add2"]; echo "-"; echo $row["sta"]; echo " "; echo $row["tel"]; echo $row["url"]; echo $row["sejitu"]; echo $row["pr"]; echo "</p><hr />"; } } ?> <?= $pagehead ?> <?php mysql_free_result($result); mysql_close; $param_local = rawurlencode($local); if ($page > 1) { $body .= "<A href = '$PHP_SELF?page=" . ($page - 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "前の $PAGESIZE 件</A>"; } if ($totalpage > 1 and $page < $totalpage) { $body .= "<A href = '$PHP_SELF?page=" . ($page + 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "次の $PAGESIZE 件</A>"; } ?> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • CSVデータ読込だら・・・1文字目のみ文字化け

    PHP4.xxでSQLIte3で行っています。 名簿をCSVデータで一気にDBにインサートしたいのですが・・・ なぜか名前の1~2文字目あたりのみ文字化けします。 色々試行錯誤していますが・・・ 糸口が見つからなくて・・・ どなかたかご教授して頂けませんか?! 文字化け具合(というよりアルファベットに変わってる)が画像を参照してください。 CSVデータでは、山崎まさよし、abc、岡田てるお となっています。 ちなみにコードはこのような形です。 -------------------------------------------------------- $updir = "./csv/"; $save_name = "list.csv"; if (is_uploaded_file($_FILES["csv"]["tmp_name"])) { if (move_uploaded_file($_FILES["csv"]["tmp_name"], $updir.$save_name)) { chmod($updir.$save_name, 0644); echo "<br />CSVファイルをアップロードしました。"; // CSVの各内容をインサート $row = 1; $handle = fopen($updir.$save_name, "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); $insert = "insert into list values ("; $insert_row = ""; $row++; for ($c=0; $c < $num; $c++) { $data[$c] = mb_convert_encoding($data[$c], "EUC-JP", "SJIS"); $insert_row .= "'".$data[$c]. "',\n"; } $insert_query = $insert.$insert_row; $insert_query = substr($insert_query, 0, (strlen($insert_query)-2) ); $insert_query .= ")"; if(sqlite_query($insert_query, $conn)){ } else { echo "<br>配信先情報の追加を失敗しました。"; } } } } fclose($handle); --------------------------------------------------------

    • ベストアンサー
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • MYSQL→PHP→10件表示

    現在phpを勉強しているのですがどうしても分からないことがあり、 質問をさせて頂きました。 PHPとMYSQLを使い、プルダウンメニューから検索した結果を 10件表示をしていきたいのですが、どうしてもうまくいかず混乱しております。 どのなたかご存知の方、お伺いしても宜しいでしょうか? $PAGESIZE = 10; //ここにmysqlに接続するスクリプト extract($_REQUEST); if (!isset($page)) { $page = 1; } if(!empty($fld)) { //$fldに検索したい住所が入ってます。 $local = addslashes($fld); $where .= "add1 = '$fld' && "; } if(!empty($where)) { $where = substr($where, 0, -3); $where = "WHERE " . $where; } $sql = "select count(*) as cnt from ○○ ". $where; $rst = mysql_query($sql); $row = mysql_fetch_array($rst); $tcnt = $row["cnt"]; mysql_free_result($rst); $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<B>$tcnt 件みつかりました。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示</B>"; } else { $pagehead .= "$tcnt] を表示</B>"; } $sql = "select * from ○○ ". $where. " order by renban desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>登録データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo "<br />"; echo $row["people"]; echo " "; echo $row["add1"]; echo $row["add2"]; echo "-"; echo $row["sta"]; echo " "; echo $row["tel"]; echo $row["url"]; echo $row["sejitu"]; echo $row["pr"]; echo "</p><hr />"; } } ?> <?= $pagehead ?> <?php mysql_free_result($result); mysql_close; $param_local = rawurlencode($local); if ($page > 1) { $body .= "<A href = '$PHP_SELF?page=" . ($page - 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "前の $PAGESIZE 件</A>"; } if ($totalpage > 1 and $page < $totalpage) { $body .= "<A href = '$PHP_SELF?page=" . ($page + 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "次の $PAGESIZE 件</A>"; } ?> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • mysql>PHPにデータ表示、10件ごとにページ分割

    はじめまして、PHP勉強中の初心者です。。 MYSQLから取り出したデータを件数でページ分割したいのですが、 うまくきません。。 環境:eclipse3.5、mysql5.0、php5.0、xampp (phpで、sql接続、select * from でデータは表示は確認できてます)。。 ソースは↓です。。(初心者なもので不備がればすみません)。。 eclipse上では if (($page_num+1)*10<$cnt) {}でエラーで表示されます。。 どなたかご存知の方いましたら、教えていただけないでしょうか? <!--kensaku.html--> <html> <body> <form action ="kensaku.php" method="post">    名前:<input type="text" name="nm">    年齢:<input type="hidden" name="page_num" value="0">    <input type="submit" name="exec" value="検索"> </form> </body> </html> //kensaku.php ソース <html> <body> <? $nm=$_POST['nm']; $page_num=$_POST['page_num']; //データベースに接続 if (!$conn =mysql_connect("","user","PASS")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("table", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select id,name from table " ; $sql.= "where name like '%$nm% ' order by id " ; $sql.="limit" . $page_num * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr><td>id</td><td>name</td></tr>" ; while($row = mysql_fetch_array($res)){ echo "<tr>" ; echo "<td>" . $row["id"] . "</td>" ; echo "<td>" . $row["name"] . "</td>" ; echo "</tr>" ; } echo "</table>" ; //検索条件に該当する全データの件数取得 $sql = "select count(*) from member " ; $sql.="where name like '% $nm % ' order by id " ; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page_num + 1, "ページ目を表示<br>"; //前の10件 if ($page_num !=0) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num -1..">"; echo "&lt 前の10件"; } //次の10件.--ここからエラー行ですが、、解決策がわかりません。。 if (($page_num+1)*10<$cnt) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num +1..">"; echo " 次の10件 &g</a>t"; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> すみませんが、ご存知の方いましたら、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 限られた数の配列のみ表示させる

    配列の基本的なことを理解していないので、極めて初歩的な質問で申し訳ありませんが、ご教示お願い致します。 csvを読み込み、条件を満たすデータ(ここでは$row[1]がy)だけで配列を作ります。 $handle = fopen("sample.csv", "r"); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {if($row[1]=="y"){ $data[] = array( $row[0] ,$row[1] ,$row[2] ,$row[3]); } } fclose($handle); すべての行のデータ(ここでは$row[2]のみ)は下記で表示されます。 foreach ($data as $key => $row) { print $row[2]."<BR>"."\n"; 最初から例えば4行目までのみ表示したい場合 for($i=0;$i<4;$i++){ print $data[$i]."<BR>"."\n"; } 上記では、arreyの文字が4個しか表示されませんが、先の例のように各行の$row[2]を表示させるには、どのようにすればよいのでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP
  • PHPとMysqlのページ分割表示について

    以前こちらで質問させて頂きまして htmlの検索フォームから入力した情報をデータベースから引っ張ってきて 表示するまでは出来たのですが、表示制限を10個にして、次のページ、前のページと移動させるようなシステムにしたいのですが、うまくいきません(エラーが出てしまいます) どうか、お力をお貸し願えないでしょうか。 search.html <html> <head><title>検索</title></head> <body> <form action="/search/"method="post"> /*page_numを入れた*/ <input type="hidden" name="page_num" value="0"> <li>会社名</li> <li><input type="text"name="name"></li> <li>電話番号</li> <input type="text"name="phone" maxlength="11"> <input type="submit" name="submit" value="検索"> </body> </html> index.php(データベースから情報を引っ張り出す) <?php $host="localhost"; if(!$conn=mysql_connect($host,"usr","passwd")){ die("データベース認証エラー.<br />"); } mysql_select_db("usr",$conn); $condition=""; if(isset($_POST["name"])&&($_POST["name"]!="")){ $name=mysql_real_escape_string($_POST["name"]); $name=str_replace("%","\%",$name); $condition="WHERE name LIKE \"%".$name."%\""; } if(isset($_POST["phone"])&&($_POST['phone']!="")){ $phone=mysql_real_escape_string($_POST["phone"]); $phone=str_replace("%","\%",$phone); if($condition==""){ $condition="WHERE phone LIKE \"%".$phone."%\""; }else{ $condition.="AND phone LIKE \"%".$phone."%\""; } } $tmp=$page_num*10; $sql="SELECT * FROM table".$condition."ORDER BY id limit".$tmp.",10"; while($row=mysql_fetch_array($res)){ print("<table border=\"1\">"); print("<tr><td>会社名</td><td>電話番号</td></tr>"); print("<tr>"); print("<td>".$row['name']."</td>"); print("<td>".$row['phone']."</td>"); print("</tr>"); print("</table>"); } $cnt=$row[0]; //ページ表示 if(!$cnt>10){ echo ceil($cnt/10), "ページの中の",$page_num+1,"ページ目を表示<br>"; } //前の10件 if ($page_num!=0){ echo "<a href=index.php?name=",$name,".$page_num -1.">"; echo "&lt</a>; echo "前の10件"; } //次の10件 if (($page_num+1)*10<$cnt){ echo "<a href=index.php?name=",$name,".$page_num +1.">"; echo "次の10件"; echo "&g</a>t"; } mysql_free_result($res); //データベースから切断 mysql_close($conn); ?> ちなみにエラーが出ている行はここの //前の10件 if ($page_num!=0){ echo "<a href=index.php?name=",$name,".$page_num -1.">"; echo "&lt</a>; echo "前の10件"; } >>echo "&lt</a>; この部分がエラーになっています。

    • ベストアンサー
    • PHP
  • ページング。困っています。

    分かる方はいませんか?? <?PHP $countRe=$num_rows; function pager($id,$countRe){ if($id=="") $id=1; $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$id) return false; if($id>6){ $startPage=$id-5; $startMore="<a href=\"$PHP_SELF?id=".($startPage -1)."\">&lt; PREV</a>"; }else{ $startPage=1; } if($id+5<$maxPage){ $endPage=$id+5; $endMore=" <a href=\"$PHP_SELF?id=".($endPage+1)."\">NEXT &gt;</a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($id==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?id=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } ?> 現在、このようなソースでページングをしています。1ページにつき10件ずつ表示させたいのです。該当データ11件になったら、ちゃんとリンクが[1,2]と出てくれますが、1ページ目に11件、2ページ目でも11件出てしまいます。理想は説明不要だと思いますが、1ページ目に10件、2ページ目で余りの1件表示させたいです。このソースの問題ではなくSELECT文の問題なんでしょうか??LIMIT 0,10としたら11件該当しなければならないのに10件しか該当しないとなり、これはこれでおかしくなります。

    • 締切済み
    • PHP