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

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

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

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

MySQL

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

PHP

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

Q&A

解決済

2回答

6344閲覧

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

metamonsan

総合スコア11

INSERT

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

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/11/14 06:34

編集2017/11/14 07:15

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

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

###発生している問題・エラーメッセージ
テーブルへのデータ入力に関して、全角文字(ひらがななど)が入力・表示されません。

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

PHP

1//接続に必要な情報は省略させていただきます 2try{ 3 4 $pdo=new PDO($dsn,$user,$password); 5 6 echo "接続成功"; 7 echo "<br>"; 8 9 $sql="INSERT INTO banana(name,comment) VALUES(:name,:comment)"; 10 11 $stmt=$pdo->prepare($sql); 12 13 $stmt->bindParam(":name",$name,PDO::PARAM_STR); 14 $stmt->bindParam(":comment",$comment,PDO::PARAM_STR); 15 16 $name="テスト"; 17 $comment="テスト投稿です。"; 18 19 $stmt->execute(); 20 21}catch (PDOException $e){ 22 23 echo '接続失敗'.$e->getMessage(); 24 25 exit; 26 27}

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

PHP

1try{ 2 3 $pdo=new PDO($dsn,$user,$password); 4 5 echo "接続成功"; 6 echo "<br>"; 7 8 $sql="SELECT*FROM banana"; 9 10 $result=$pdo->query($sql); 11 12 foreach($result as $row){ 13 14 echo $row['id'].','; 15 echo $row['name'].','; 16 echo $row['comment'].'<br>'; 17 18 } 19 20}catch (PDOException $e){ 21 22 print('接続失敗:'.$e->getMessage()); 23 24 die(); 25 26}

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

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

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

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

'CREATE TABLE banana( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), comment VARCHAR(50) )';

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず

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

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

PHP

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

追記

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

$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 06:39

編集2017/11/14 07:25
yambejp

総合スコア114759

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

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

metamonsan

2017/11/14 06:56

ありがとうございます。 何かの例外ではじかれているということでしょうか…? どちらのプログラムにも追加しましたが、やはりうまくいきませんでした…。
yambejp

2017/11/14 07:19

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

2017/11/14 07:22

ありがとうございます。 変数の部分がうまくいっていなかったようでした。表示はうまくいきました。 whileを使ったものも学んでおきたいと思います。
yambejp

2017/11/14 07:24

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

2017/11/14 07:40

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

2017/11/14 07:52

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

2017/11/14 08:01

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

2017/11/14 08:21

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

2017/11/14 08: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
metamonsan

2017/11/14 08:36

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

2017/11/14 08:55

別のテーブルを作成し実行してみました。 結果としては、改善することができませんでした。 やはり、日本語の文字以降が全く入力されないようです。 動作環境そのものがおかしいのかもしれません…
yambejp

2017/11/14 09:07

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

2017/11/14 09:21

確認してみたところ、プログラムを書き込むのに使用していたソフトの文字コードのデフォルトがutf8ではありませんでした…。 再度設定しなおしたところ、うまくいきました。 初歩的なところで詰まってしまっていたのですね。解決いたしました。 本当にありがとうございました。
yambejp

2017/11/14 09:26

あるあるなオチでしたね
guest

0

おかしな原因は

php

1 foreach($result as $re){ 2 3 echo $row['id'].','; 4 echo $row['name'].','; 5 echo $row['comment'].'<br>'; 6 7 }

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

php

1 foreach($result as $row){ 2 3 echo $row['id'].','; 4 echo $row['name'].','; 5 echo $row['comment'].'<br>'; 6 7 }

でうまくいくはず。

追記(データベースの文字コード確認方法)

この場合は、'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 06:59

編集2017/11/14 07:32
motuo

総合スコア3027

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

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

metamonsan

2017/11/14 07:11

ありがとうございます。 $reを$rowに直したところ、確かに表示されました。 ところが、全角文字部分が表示されません。 具体的には ・全角文字(ひらがななど)が入力されず、半角英数字は入力される ・全角と半角を混ぜると、全角文字以降の部分が入力されない という状況なのですが…
motuo

2017/11/14 07:15

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

2017/11/14 07:20

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

2017/11/14 07:31

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

2017/11/14 07:37

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

2017/11/14 07:42

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

2017/11/14 07:48

そもそも記載がなくDefaultとなっています その部分だけ見ると `name` varchar(50) DEFAULT NULL, `comment` varchar(50) DEFAULT NULL, となっています!
motuo

2017/11/14 08:00

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

2017/11/14 08:03

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

2017/11/14 08:08

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

2017/11/14 08:11

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

2017/11/14 08:21

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

2017/11/14 08:24

提示されたプログラムを私の環境で実行する限りでは上記の事象は発生しません。 後は、まさかとは思いますがファイルをSJISで保存しているとか… ここまでくるとお手上げです。課題を出した方に、環境を含めて確認頂いた方が良いかもしれません。
metamonsan

2017/11/14 08:34

もしかしたらPCとの相性が悪い…とかなのかもしれません。 確認してみたいと思います。至らぬばかりで申し訳ありません。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問