質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

4回答

5085閲覧

PHPで、セッションに入れた日本語が文字化けする。

rikuta930

総合スコア18

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/06/16 09:43

編集2022/01/12 10:55

PHPを利用して、Twitterのようなウェブアプリケーションを作成しています。
環境はXAMPPを利用していて、PHPのバージョンは7.3.5です。ブラウザはchromeを使っています。
一度、大学のサーバーを利用して、試した際は問題は発生しなかったため、phpの設定に関する問題だと思われます。

今回、inputタグから受け取った情報をセッションに入れて、確認画面で表示するといったことをやりたいと思っています。

その際に困ったことが発生したので、わかる方いらっしゃいましたら、教えていただけると幸いです。

まず、登録フォームのコードがこちらです。

PHP

1<?php 2session_start(); 3if(!empty($_POST)){ 4 if($_POST['name'] === '') { 5 $error['name'] = 'blank'; 6 } 7 8 if($_POST['email'] === '') { 9 $error['email'] = 'blank'; 10 } 11 12 if(strlen($_POST['password']) < 4) { 13 $error['password'] = 'length'; 14 } 15 16 if($_POST['password'] === '') { 17 $error['password'] = 'blank'; 18 } 19 20 $fileName = $_FILES['image']['name']; 21 if (!empty($fileName)) { 22 $ext = substr($fileName, -3); 23 if ($ext != 'jpg' && $ext != 'gig' && $ext != 'png') { 24 $error['image'] = 'type'; 25 } 26 } 27 28 if(empty($error)){ 29 $image = date('YmdHis') . $_files['image']['name']; 30 move_uploaded_file($_FILES['image']['tmp_name'],'../member_picture/' . $image); 31 $_SESSION['join'] = $_POST; 32 $_SESSION['join']['image'] = $image; 33 header("Location: check.php"); 34 exit(); 35 } 36} 37 38if($_REQUEST['action'] == 'rewrite' && isset($_SESSION['join'])) { 39 $_POST = $_SESSION['join']; 40} 41 42?> 43 44 45 46<!DOCTYPE html> 47<html lang="ja"> 48<head> 49 <meta charset="UTF-8"> 50 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 51 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 52 <title>会員登録</title> 53 54 <link rel="stylesheet" href="../style.css" /> 55</head> 56<body> 57<div id="wrap"> 58<div id="head"> 59<h1>会員登録</h1> 60</div> 61 62<div id="content"> 63<p>次のフォームに必要事項をご記入ください。</p> 64<form action="" method="post" enctype="multipart/form-data"> 65 <dl> 66 <dt>ニックネーム<span class="required">必須</span></dt> 67 <dd> 68 <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES))?>" /> 69 <?php if ($error['name'] === 'blank'):?> 70 <p class="error">ニックネームを保存してください</p> 71 <?php endif; ?> 72 </dd> 73 <dt>メールアドレス<span class="required">必須</span></dt> 74 <dd> 75 <input type="text" name="email" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['email'], ENT_QUOTES))?>"> 76 <?php if ($error['email'] === 'balnk'):?> 77 <p class="error">メールアドレスを入力してください</p> 78 <?php endif;?> 79 <dt>パスワード<span class="required">必須</span></dt> 80 <dd> 81 <input type="password" name="password" size="10" maxlength="20" value="<?php print(htmlspecialchars($_POST['password'], ENT_QUOTES))?>" /> 82 <?php if ($error['password'] === 'blank'):?> 83 <p class="error">パスワードを入力してください</p> 84 <?php endif; ?> 85 <?php if ($error['password'] === 'length'):?> 86 <p class="error">パスワードは4文字以上で入力して下さい</p> 87 <?php endif; ?> 88 </dd> 89 <dt>写真など</dt> 90 <dd> 91 <input type="file" name="image" size="35" value="test" /> 92 <?php if ($error['image'] === 'type'):?> 93 <p class="error">* 写真などは「.gif」、「.jpg」、「.png」の画像を指定してください</p> 94 <?php endif; ?> 95 <?php if (!empty($error)): ?> 96 <p class="error">恐れ入りますが、画像を改めて指定してください</p> 97 <?php endif; ?> 98 </dd> 99 </dl> 100 <div><input type="submit" value="入力内容を確認する" /></div> 101</form> 102</div> 103</body> 104</html> 105 106

ここでは、以下の部分で、受け取った情報を、

PHP

1<input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES))?>" />

こちらで、セッションに格納しています。

PHP

1$_SESSION['join'] = $_POST;

たとえば、フォームの名前に、「ああああ」を入れるとします。
この時点で、var_dumpすると、こちらの結果になります。

array(4) { ["name"]=> string(24) "ああああ" ["email"]=> string(4) "aaaa" ["password"]=> string(4) "aaaa" ["image"]=> NULL }

["name"]=> string(24) "ああああ" のように、文字化けが発生しています。

php.iniの設定の問題だとおもったので、https://qiita.com/guzuri/items/643c1311224e8d482278や、
https://techacademy.jp/magazine/2412のサイトを見て、設定を変更したのですが、問題は解決しませんでした。

php.iniの変更部分は以下になります。

;mbstring.language = Japanese ;mbstring.internal_encoding = EUC-JP ;mbstring.http_input = auto ;mbstring.http_output = SJIS ;mbstring.encoding_translation = Off ;mbstring.detect_order = auto ;mbstring.substitute_character = none ;mbstring.func_overload = 0

こちらを

mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = UTF-8 mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none mbstring.func_overload = 0

このように変更しました。

そして、文字コードを以下で設定しました。

; PHP's default character set is set to empty. ; http://php.net/default-charset ;default_charset = "iso-8859-1" default_charset = UTF-8

こちらについて、わかる方がいらっしゃいましたら、教えていただけますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/16 09:52

Apacheは再起動したのでしょうか。 また、PHPファイルの文字コードは何でしょうか。
rikuta930

2019/06/16 09:55

Apacheは再起動いたしました。 文字コードはUTF-8です。
退会済みユーザー

退会済みユーザー

2019/06/17 13:18

文字化けしていることを確認しているwebブラウザ名とバージョン、動作させているphpのバージョン、phpを実行させているサーバー情報(Apache or Nginxらのバージョン情報、OSの名称とバージョン)あたりも添えてあると、先入観や思い込みを省きやすくなるかと。
rikuta930

2019/06/17 19:55

ありがとうございます。 早速、追加します。
guest

回答4

0

未だに、post で化けたのか、session で化けたのか確認できてないようなので、最小限のコードで切り分けてみては?

こんなんで良いかと。

php

1<?php 2session_start(); 3?> 4<html> 5<head> 6<meta charset="utf-8"> 7<title>test</title> 8</head> 9<body> 10<?php 11 if(isset($_POST)){ 12 var_export($_POST); 13 } 14 if(isset($_SESSION['join'])){ 15 var_export($_SESSION['join']); 16 } 17 $_SESSION['join'] = $_POST; 18?> 19<form method="post"> 20 <input type="text" name="test"> 21 <input type="submit" name="submit"> 22</form> 23</body> 24</html>

投稿2019/06/17 11:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

php

1$join = $_SESSION['join']; 2var_dump($join);

ではダメでしょうか?

投稿2019/06/18 10:03

hide0128

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のいずれかでなおると思います。

・php.iniに
default_charset = "UTF-8"
を指定してください。

・PHP5.6以上にバージョンアップしてください。

投稿2019/06/17 11:24

rana_kualu

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikuta930

2019/06/17 20:04

回答ありがとうございます。 ・php.iniに default_charset = "UTF-8" を指定してください。 質問の最後に記述してあるように、変更しています。恐れ入りますが、この部分以外でということでしょうか? ・PHP5.6以上にバージョンアップしてください。 記述漏れ失礼いたしました。バージョンは、7.3.5を利用しております。
rana_kualu

2019/06/18 15:59 編集

> default_charset おっと申し訳ない、完全に見逃していた。 ということで少し調べてみたところ、 ISO-8859-1の"あ"をUTF-8で参照すると"ã ‚"になるようです。 (最初の回答は逆だと勘違いしていた) 従って、以下のあたりを調べればどうにかなると思います。 ・入力フォームのページのcontent-typeがUTF-8になっていることをDevToolsで確認 ・mb_detect_order()でUTF-8より前に変な文字コードが来てないことを確認 ・セッションに入れる前、リクエストの時点での文字コードを確認
guest

0

意図しないエンコーディングの変換が加わらないよう、
mbstring.http_input = pass
にするべきかと。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0

文字化けを確認している、var_dump()しているところで、
例えばmeta要素でエンコーディングをutf-8で明示するなど、
あちこちでダメ押ししないと心配になりますね。

投稿2019/06/17 03:41

編集2019/06/17 03:44
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikuta930

2019/06/17 10:40

回答ありがとうございます。 指定してみましたが、効果はありませんでした。 meta要素での指定は、元々していたのですが、残念ながら、期待通りにはうごきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問