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

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

ただいまの
回答率

90.75%

  • PHP

    19178questions

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

  • MySQL

    5513questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • INSERT

    45questions

    INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PHPとMySQL・テーブルへの全角文字データ入力ができない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 550

metamonsan

score 3

付随する問題点が次々出ているため更新していっています。ご迷惑をおかけします。

前提・実現したいこと

現在、PHPとMySQLを利用して、テーブル作成・入力・データを取得して表示という一連の流れを実行しようと考えています。

発生している問題・エラーメッセージ

テーブルへのデータ入力に関して、全角文字(ひらがななど)が入力・表示されません。

データ入力のプログラムについては以下の通りです。

//接続に必要な情報は省略させていただきます
try{

    $pdo=new PDO($dsn,$user,$password);

    echo "接続成功";
    echo "<br>";

    $sql="INSERT INTO banana(name,comment) VALUES(:name,:comment)";

    $stmt=$pdo->prepare($sql);

    $stmt->bindParam(":name",$name,PDO::PARAM_STR);
    $stmt->bindParam(":comment",$comment,PDO::PARAM_STR);

    $name="テスト";
    $comment="テスト投稿です。";

    $stmt->execute();

}catch (PDOException $e){

    echo '接続失敗'.$e->getMessage();

     exit;

}

これを取得・表示するプログラムは以下の通りです。

try{

    $pdo=new PDO($dsn,$user,$password);

    echo "接続成功";
    echo "<br>";

    $sql="SELECT*FROM banana";

    $result=$pdo->query($sql);

    foreach($result as $row){

        echo $row['id'].',';
        echo $row['name'].',';
        echo $row['comment'].'<br>';

    }

}catch (PDOException $e){

    print('接続失敗:'.$e->getMessage());

    die();

}


これを実行すると、入力した内容のうち半角英数字だけが表示されます。

試したこと

具体的には
・全角文字だけ→表示されない
・半角英数字だけ→表示される
・全角文字と半角文字を混ぜる→全角文字以前の文字列は表示されるが、それ以降は表示されない

恥ずかしながら情報を十分に集めきることができず、煮詰まっている状態です。
初歩的な質問かもしれませんが、よろしくお願いいたします。

追記

テーブルの中身ですが、以下のように作成しています。

'CREATE TABLE banana(

        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

        name VARCHAR(50),

        comment VARCHAR(50)

        )';


SHOW TABLESで見たところ、正しく作成できていることは確認できました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

とりあえず

$pdo=new PDO($dsn,$user,$password);

の直後に、以下を追加しないと例外を処理してくれません
また、全角文字が表示されないのはキャラクターコードの問題です
$dsn内でcharsetを宣言するところから始め、setAttributeやqueryの発行で対処します

  $dsn = 'mysql:host=localhost; dbname=mydb;charset=utf8;';
  $pdo=new PDO($dsn,$user,$password); 
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');
  $stmt = $pdo->query("SET NAMES utf8"); /*お勧めしませんが最後の手段*/

 追記

上記処理を行った上でエラーがでないようなら
データ抽出については、以下のように取り出して下さい

  $sql="SELECT id,name,comment FROM banana";
  $stmt = $pdo->query($sql);
  while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
    echo $row['id'].','.$row['name'].','.$row['comment'].'<br>';
  };

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 15:56

    ありがとうございます。
    何かの例外ではじかれているということでしょうか…?

    どちらのプログラムにも追加しましたが、やはりうまくいきませんでした…。

    キャンセル

  • 2017/11/14 16:19

    抽出側の方についても注記しておきました

    キャンセル

  • 2017/11/14 16:22

    ありがとうございます。
    変数の部分がうまくいっていなかったようでした。表示はうまくいきました。

    whileを使ったものも学んでおきたいと思います。

    キャンセル

  • 2017/11/14 16:24

    全角文字についても補足してあります

    キャンセル

  • 2017/11/14 16:40

    ありがとうございます。
    上記の内容に関して、コピペして試してみましたが、やはり半角英数字のみ表示される状態が続いてしまいます。

    キャンセル

  • 2017/11/14 16:52

    SHOW FULL COLUMNS FROM banana
    で、各col毎の状況を確認して下さい
    Collationはちゃんとutf8xxx(xxxの部分は照合順序の設定による)

    キャンセル

  • 2017/11/14 17:01

    確認してみたところ、 utf8_general_ci となっておりました!

    キャンセル

  • 2017/11/14 17:21

    そうなるともうファイル保存の際にちゃんとutf8で保存されているか確認するのと
    phpファイル内で
    mb_internal_encoding("UTF8");
    を宣言するくらいしかないでしょうか

    キャンセル

  • 2017/11/14 17:30

    テーブルの作成は
    CREATE TABLE banana(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
    comment VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci
    ) engine=innodb,charset=utf8

    キャンセル

  • 2017/11/14 17:36

    ありがとうございます。
    別のテーブルを作成して、以上の内容を記入してみます。

    キャンセル

  • 2017/11/14 17:55

    別のテーブルを作成し実行してみました。

    結果としては、改善することができませんでした。
    やはり、日本語の文字以降が全く入力されないようです。

    動作環境そのものがおかしいのかもしれません…

    キャンセル

  • 2017/11/14 18:07

    別解でも指摘がありますが、ファイルを保存するときにエンコードを間違えている
    可能性については調べましたか?

    キャンセル

  • 2017/11/14 18:21

    確認してみたところ、プログラムを書き込むのに使用していたソフトの文字コードのデフォルトがutf8ではありませんでした…。
    再度設定しなおしたところ、うまくいきました。

    初歩的なところで詰まってしまっていたのですね。解決いたしました。
    本当にありがとうございました。

    キャンセル

  • 2017/11/14 18:26

    あるあるなオチでしたね

    キャンセル

+2

おかしな原因は

    foreach($result as $re){

        echo $row['id'].',';
        echo $row['name'].',';
        echo $row['comment'].'<br>';

    }


ですね。foreach($result as $re){(多分、$reがタイポ)になっていますがループ内では$rowをアクセスしています。

    foreach($result as $row){

        echo $row['id'].',';
        echo $row['name'].',';
        echo $row['comment'].'<br>';

    }


でうまくいくはず。

追記(データベースの文字コード確認方法)
この場合は、'name'と'comment'がutf8mb4_unicode_ciになっていることが分かります。

MariaDB [test]> show create table banana
    -> ;
+--------+-------------------------------------------------------------
| Table  | Create Table                                                 
+--------+-------------------------------------------------------------
| banana | CREATE TABLE `banana` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `comment` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
+--------+-------------------------------------------------------------
1 row in set (0.00 sec)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 16:11

    ありがとうございます。
    $reを$rowに直したところ、確かに表示されました。

    ところが、全角文字部分が表示されません。
    具体的には
    ・全角文字(ひらがななど)が入力されず、半角英数字は入力される
    ・全角と半角を混ぜると、全角文字以降の部分が入力されない
    という状況なのですが…

    キャンセル

  • 2017/11/14 16:15

    $dsn = 'mysql:host=localhost;dbname=test;charset=utf8;';という感じで文字コードを設定してみては?
    MySQL側の文字コードもUTF8になっているか、確認してみてください。

    キャンセル

  • 2017/11/14 16:20

    $dsnには charset=utf8; が追加してあります!
    MySQL側の文字コード、とはどう確認すればよいでしょうか

    キャンセル

  • 2017/11/14 16:31

    回答に追記しました。show create bananaを使ってみてください。

    キャンセル

  • 2017/11/14 16:37

    ありがとうございます。
    DEFAULT CHARSETの部分でしょうか、それならutf8になっています。

    キャンセル

  • 2017/11/14 16:42

    DEFAULT CHARSETだけでなく、nameやcommentoのカラムも全てut8になっていますか?

    キャンセル

  • 2017/11/14 16:48

    そもそも記載がなくDefaultとなっています
    その部分だけ見ると

    `name` varchar(50) DEFAULT NULL, `comment` varchar(50) DEFAULT NULL,

    となっています!

    キャンセル

  • 2017/11/14 17:00

    では明示的に指定してください。SHOW FULL COLUMNS FROM BANANA;のCollationも確認してみてください。

    キャンセル

  • 2017/11/14 17:03

    指定してみます。
    SHOW FULL COLUMNSの方は、 utf8_general_ci となっていました!

    キャンセル

  • 2017/11/14 17:08

    連続での質問で申し訳ありません。
    明示する、というのは各フィールド内で、ということなのでしょうか。全体の文字コードをはじめに設定するのとなにが変わってくるのでしょうか…?

    キャンセル

  • 2017/11/14 17:11

    SHOW FULL COLUMNSの方が utf8_general_ciなのであれば、原因は別にある気がします。
    接続に必要な情報を除いて、HTMLも含めた全体のソースを見せてもらえませんか?

    キャンセル

  • 2017/11/14 17:21

    実は課題の一貫でこれを行っているものでして、質問に記載した以上のコードは存在しないんです。
    具体的には、
    ・データベースへの接続
    ・テーブルの作成
    をこなし、
    ・テーブル内への入力と表示
    へ進んだところで止まっている状態です。
    道中に書いたコードの中でもしどこかに原因がありそうであれば、確認していただきたいのですが…。

    キャンセル

  • 2017/11/14 17:24

    提示されたプログラムを私の環境で実行する限りでは上記の事象は発生しません。
    後は、まさかとは思いますがファイルをSJISで保存しているとか…

    ここまでくるとお手上げです。課題を出した方に、環境を含めて確認頂いた方が良いかもしれません。

    キャンセル

  • 2017/11/14 17:34

    もしかしたらPCとの相性が悪い…とかなのかもしれません。

    確認してみたいと思います。至らぬばかりで申し訳ありません。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19178questions

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

  • MySQL

    5513questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • INSERT

    45questions

    INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである