Mookさんからコメント頂いていました。

申し訳ありません。

Windows2000Server、PHP Version 5.0.4
SQLiteManagerのバージョン 1.0.4を使用しましたら、HOMEの画面で日本語表示になりました。
を昨日質問した者です。

コメントを無効にしていましたので、再度質問で失礼します。

1つ1つ教えていただければ幸いです。

まずphp.iniからですが、

extension=php_mbstring.dllは有効になっていました。

PHP はSQLiteAdmin を使用し、PHPのスクリプトを使用しています。

頂いたコメントにはprint mb_convert_encoding~とありましたが
念のため"EUC-JP", "UTF-8"の置換もしてみましたが文字化けしてしまいました。

動作させているPHPスクリプトは以下のように"print"という記述がありませんでした。
$disp_meibo_id[$i]=mb_convert_encoding($result[$i]['meibo_id'],"SJIS","EUC-JP");
$disp_user_name[$i]=mb_convert_encoding($result[$i]['user_name'],"SJIS","EUC-JP");
$disp_user_kana[$i]=mb_convert_encoding($result[$i]['user_kana'],"SJIS","EUC-JP");
$disp_postcode[$i]=mb_convert_encoding($result[$i]['postcode'],"SJIS","EUC-JP");
$disp_address[$i]=mb_convert_encoding($result[$i]['address'],"SJIS","EUC-JP");

1つ1つ教えていただければ幸いです。

回答の条件
  • 1人2回まで
  • 登録:2007/10/06 16:26:40
  • 終了:2007/10/13 16:30:05

回答(0件)

回答はまだありません

  • id:KUROX
    たぶんSQLiteのバージョンが2.8x系だと思う。

    http://www.takke.jp/soft/sqliteccj.html
    このあたりで、DB作成してみて、データを作って
    それで、SQLiteManagerとかを試してみればどうかなと
    思います。

    DB登録時に化けてるのか
    DB読み込み時に化けてるのか
    それ以外なのか切り分けしにくいような気がします。
  • id:Mook
    前の質問にコメントしました。


    文字化けとは、データの文字コードと処理系の文字コードの不一致によるものなので、コードを統一するか、それが出来ないなら変換を行う必要があります。

    $disp_meibo_id[$i]=mb_convert_encoding($result[$i]['meibo_id'],"SJIS","EUC-JP");

    は EUC-JP を SJIS へ変換するという記述ですが、SQLite の日本語は UTF-8 のようなので
    http://journal.mycom.co.jp/special/2004/php5/010.html

    $disp_meibo_id[$i]=mb_convert_encoding($result[$i]['meibo_id'],"SJIS","UTF-8");
    のようにしてみてはどうでしょうか。

    PHP の内部設定によっては、このあたりは省略できますが、文字コードの設定を正しく把握しておかないと、他のサーバや、他のアプリケーションで文字化けが発生することになります。
  • id:saiden
    KUROX さん
    SQLite ControlCenter 日本語版 はGUIでわかりやすいですね。
    しかしまだ、文字化けします・・・。

    Mook さん
    解決しました!!
    私のPHP.ini
    ;mbstring.internal_encoding = EUC-JP
    を以下のように変更しましたら、解決しました。

    mbstring.internal_encoding = SJIS

    ※スクリプトは書籍のサンプルスクリプトそのままでOKでした。
    //--------------------------------------------------------------//
    // 登録済み会員情報取得処理 //
    //--------------------------------------------------------------//

    $disp_chiku_id[$i]=mb_convert_encoding($result[$i]['chiku_id'],"SJIS","EUC-JP");

    結論PHP.ini修正対応で解決しました。
    データを取り出す時の文字コードに問題があったのでしょうか?

  • id:Mook
    解決したようで何よりですが、
    直接お役に立てなくてすみませんでした。

    直接検索した情報でなかったので、申し訳なかったのですが、SQLite の内部コードは UTF-8 では無かったということかなぁ。

    かえって混乱させてしまったかもしれませんね。
    あまりお役に立てませんでしたが、多くのポイントありがとうございました。


  • id:saiden
    いつもありがとうございます。

    登録済み会員のCSV出力について

    Windows2000Server、PHP Version 5.0.4
    SQLiteManagerのバージョン 1.0.4を使用

    どうしても
    Warning: Cannot modify header information - headers already sent by (output started at C:\Apache Group\Apache2\htdocs\8\meibo_kanri_8_1.php:1) in C:\Apache Group\Apache2\htdocs\8\meibo_kanri_8_1.php on line 382
    のエラーがでます。

    下記がそのサンプルコードズバリです。(少し削除しました。)
    //--------------------------------------------------------------//
    // 登録済み会員のCSV出力 //
    //--------------------------------------------------------------//
    if(isset($_POST['cmdDownload'])){
    $sql="select * from meibo";
    $dberror_msg="Error:Meiboテーブルからのデータ取得に失敗しました!!";
    $result=getDbSelect($dbcon,$sql,$dberror_msg);
    for($i=0;$i<count($result);$i++){
    $csv_meibo_id[$i]=$result[$i]['meibo_id'];
    $csv_user_name[$i]=$result[$i]['user_name'];
    $csv_user_kana[$i]=$result[$i]['user_kana'];
    $csv_postcode[$i]=$result[$i]['postcode'];
    $csv_chiku_id[$i]=$result[$i]['chiku_id'];
    $csv_todoufuken_id[$i]=$result[$i]['todoufuken_id'];
    $csv_address[$i]=$result[$i]['address'];
    $csv_tel[$i]=$result[$i]['tel'];
    $csv_fax[$i]=$result[$i]['fax'];
    $csv_email[$i]=$result[$i]['email'];
    $csv_kengen_cd[$i]=$result[$i]['kengen_cd'];
    $csv_regdate[$i]=$result[$i]['regdate'];
    $csv_upddate[$i]=$result[$i]['upddate'];
    $csv_sakujyo_fg[$i]=$result[$i]['sakujyo_fg'];
    }

    ob_end_clean();
    $filename="meibo.csv";
    header("Cache-Control: public");
    header("Pragma: public");
    header("Content-disposition: attachment; filename=$filename");
    header("Content-type: application/octet-stream");

    unset($csv);
    $csv='meibo_id,user_name,user_kana,postcode,chiku_id,todoufuken_id,address,tel,fax,';
    $csv=$csv . 'email,kengen_cd,regdate,upddate,sakujyo_fg' . "\n";
    for($i=0;$i<count($csv_meibo_id);$i++){
    $csv=$csv . $csv_meibo_id[$i] . ',' . $csv_user_name[$i] . ',' . $csv_user_kana[$i] . ',';
    $csv=$csv . $csv_postcode[$i] . ',' . $csv_chiku_id[$i] . ',' . $csv_todoufuken_id[$i] . ',';
    $csv=$csv . $csv_address[$i] . ',' . $csv_tel[$i] . ',' . $csv_fax[$i] . ',';
    $csv=$csv . $csv_email[$i] . ',' . $csv_kengen_cd[$i] . ',' . $csv_regdate[$i] . ',';
    $csv=$csv . $csv_upddate[$i] . ',' . $csv_sakujyo_fg[$i] . "\n";
    }
    print mb_convert_encoding($csv,"SJIS","EUC-JP");
    exit;
    }

    getDbClose($dbcon);
    ?>

  • id:Mook
    上記は meibo_kanri_8_1.php だと思いますが、
    382 行目近辺はどのようになっていますか?
  • id:saiden
    言葉少なく申し訳ありません。

    meibo_kanri_8_1.php になります。
    382行は $csv_sakujyo_fg[$i]=$result[$i]['sakujyo_fg'];近辺になります。

    このような回答の表現でよろしいでしょうか?

    この他にインポートでもエラーになっております・・・(泣く)
    あせらず一つ一つ解決できればと思います。お付き合い頂ければ幸いです。


    また、書籍情報としては以下の本になります。
    現在質問していますのは8 ファイルのダウンロードとインポートになります。

    http://www.socym.co.jp/book/4883374297.html
    2005年8月初版発行
    ■著者 豊崎 直也
    目次
    1 インストール
    2 会員管理アプリケーションの作成
    3 入力チェック機能と入力変換機能の設定
    4 登録データを利用した便利な操作の設定
    5 取得件数の制御と改ページ機能の設定
    6 キーワード検索機能の設定
    7 並び替えの設定
    8 ファイルのダウンロードとインポート
    9 認証機能の設定
    10 ユーザートラッキング機能の設定
    Appendix PHP簡易リファレンス

  • id:Mook
    警告ででている行数とは一致しませんが、怪しいのは
    header("Cache-Control: public");
    header("Pragma: public");
    header("Content-disposition: attachment; filename=$filename");
    header("Content-type: application/octet-stream");
    のあたりのような気がします。
    (警告の内容により)

    サンプルで記載されている PHP のバージョンはいくつを元に書かれているでしょうか。
    http://jp2.php.net/header にあるように、
    バージョンにより挙動が異なるようなので、ご確認ください。

    まずは、上記を順番にコメントアウトして、エラーがどう変わるかを確認してみてはどうでしょうか。
  • id:saiden


    PHP のバージョン調査に時間がかかりました。
    簡単なんですね(泣)
    PHP Version 5.0.4でした。
    エラーは相変わらず
    Warning: Cannot modify header information - headers already sent by (output started at C:\Apache Group\Apache2\htdocs\8\meibo_kanri_8_1.php:1) in C:\Apache Group\Apache2\htdocs\8\meibo_kanri_8_1.php on line 385
    meibo_id,user_name,user_kana,postcode,chiku_id,todoufuken_id,address,tel,fax,email,kengen_cd,regdate,upddate,sakujyo_fg 1,和田,わだ,060-9888,1,,岡田氏盛岡軍や羽場町,019-899-1111,,ootest@kougyou.co.jp,0,2007-10-09 15:05:53,,0

    というようなエラーです。1行入っているデータを試しにダウンロードしようとしています。

    また、コメントアウトしてエラー検証しました。
    header("Cache-Control: public");をコメントアウト
    ⇒結果 383.384.385行目がエラー
    header("Pragma: public");をコメントアウト
    ⇒結果 382.384.385行目がエラー
    header("Content-disposition: attachment; filename=$filename");をコメントアウト
    ⇒結果 382.383.385行目がエラー
    header("Content-type: application/octet-stream");をコメントアウト
    ⇒結果 382.383.384行目がエラー
    それぞれエラー内容は違いますが、共通して383行目は必ずエラーになっているようです。
    申し少し踏み込んだ調べ方をするには良い方法などありますでしょうか?



  • id:Mook
    エラーをなくすことが目的ではなく、どこがエラーを起こしているかを見つけるのが目的ですから、今回の手順は役に立っていると思います。

    エラーメッセージを見ればわかるように、既に Header 情報を送信した後で、再度 382~385 でHeader 情報を送信しているのが原因とはなっていないでしょうか。

    全体の流れが見えませんが、この部分が複数回実行されているか、あるいは他の部分でも header 関数が呼ばれていませんか。

    この前後に print 文を入れたり、表示されたブラウザで、ソースコードを表示してみると、どこまで実行されているかがわかる手がかりになります。

    あとは、エラーメッセージには解決のヒントが含まれていますから、億劫がらずにきちんと読むことが何よりだと思います。
  • id:saiden
    ありがとうございます。だんだんやりかたがわかってきました。
    聞いてばかりではなく、しばらく(1日位)自分でやってみます!
  • id:Mook
    自身で解決したことは、何より実力となります。

    がんばってください!!
  • id:saiden
    いつもありがとうございます。

    先日のダウンロードは既に Header 情報を送信しておりましたので解決できました。書籍とにらめっこして判明しました(笑)
    ただ根本原因を”理解”しておりませんので、追って報告したいとおもいます。

    ■今度はインポートでエラー発生です。
    }

    $sql=sprintf("INSERT INTO $table (%s) VALUES (%s)",rtrim($sql_keys,','),rtrim($sql_values,','));
    $result=sqlite_query($sql,$dbcon);
    if(!$result){
    echo $dberror_msg;
    exit;
    }


    エラー内容
    Warning: sqlite_query() [function.sqlite-query]: near ",": syntax error in C:\Apache Group\Apache2\htdocs\inc\common.inc on line 43
    Error:Meiboテーブルへのインポートに失敗しました!!


    syntax errorはいわゆる書き間違いですので実際のプログラムを見てみました。

    ①一般にはエラー行の直前の行に間違いがあることが多い。
     ⇒" "の閉じ忘れとかをチェックしてみました。

    ②基本的な文法ミスのようですが、(%s)⇒%sにしてみました。
     あとインサートの構文をみてみましたが、問題なさそうな・・

    他の箇所を疑うにはWarning: sqlite_queryですのでやはりインサートの所でしょうか?


  • id:Mook
    直感的には $sql が間違っているように見えます。

    $result=sqlite_query($sql,$dbcon);

    $result=sqlite_query($sql,$dbcon) or die( "SQL ERROR:".$sql );
    のようにしてみて、表示される SQL を確認してはどうでしょうか。


    デバッグは、エラーに関連する情報を確認(収集)するのが定石です。
  • id:saiden
    ありがとうございます。インポートできました!!
    うれしいです。

    ひととおり書籍の機能が稼動しました。
    あとはダウンロードのところの調査をします。

    Mookさんからご指導頂いていることは無駄にはしません。

    デバッグは、エラーに関連する情報を確認(収集)するのが定石です。

    アドバイスありがとうございます。
    今後とも宜しくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません