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

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

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

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

PHP

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

Q&A

2回答

1326閲覧

一か所だけ文字化けする原因

fukoma

総合スコア11

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/04/10 07:52

編集2018/04/11 03:36

前提・実現したいこと

MysqlのテーブルにあるデータをフォームのInput textに表示させ、
保存をクリックでデータの上書きをしようとしています。件数が2,3件なので
変更がない場合でもボタンがクリックされるとSQLが実行されます。

その際、Input 表示上は問題ありませんが、SQLに入れると一か所だけ文字化けが起こります。

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

INSERT INTO location (id,name,adddress) VALUES ('1','�','渋谷区'),('2','�','新宿区'),('3','�','練馬区') ON DUPLICATE KEY UPDATE name = VALUES(name),address = VALUES(address)

該当のソースコード

mysql

1テーブル location 2 3id  name   address 4--------------------- 51 渋谷店   渋谷区 62 新宿店   新宿区 73 練馬店   練馬区

php

1 2if (isset($_POST["save"])) { 3 4 $num = count($link->real_escape_string($_POST['id'])); 5 6 for($i = 0;$i < $num ;$i++){ 7 8 $id[$i] = $link->real_escape_string($_POST['id'][$i]); 9 $name[$i] = $link->real_escape_string($_POST['name'][$i]); 10 $address[$i] = $link->real_escape_string($_POST['address'][$i]); 11 12 13 $values_r[$i] = "('".$id[$i]."','". $name[$i]."','" . $address[$i]."')" ; 14 } 15 16 $InsertValues = implode( ",", $values_r); 17 $query = "INSERT INTO location (id,name,address) VALUES ". $InsertValues . " ON DUPLICATE KEY UPDATE name = VALUES(name),address = VALUES(address)"; 18 19 $result = $link->query($query); 20} 21

php

1<?php 2//エスケープ用 3function SetHtmlChars($str){ 4 echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 5} 6?> 7<table> 8 <tr> 9 <th>id</th> 10 <th>名前</th> 11 <th>住所</th> 12 </tr> 13<?php 14 while($row = $result->fetch_assoc()){ 15 $cnt = $result->num_rows; 16?> 17 18 <tr > 19 <td><?php echo SetHtmlChars($row["id"]); ?></td> 20 <td><input type="text" name="name[]" value="<?php echo SetHtmlChars($row['name']); ?>" ></td> 21 <td><input type="text" name="address[]" value="<?php echo SetHtmlChars($row['address']); ?>" ></td> 22 </tr> 23<?php 24} 25?> 26</table> 27

HTMLのソースをみるとValueには文字化けせず「渋谷店」も「渋谷区」も表示されています。
表示も問題ありません。
DBのテーブルも問題ないように思うのですが、どうして1箇所だけこうなるのかわかりません。

なお、通常Webページからデータを更新する場合、このようなやり方はしない、これでは不十分、など
ありましたら、合わせてアドバイスいただけたら大変嬉しいです。
(PDOを使うべき、というのは理解しています)

宜しくお願い致します。

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

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

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

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

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

Lulucom

2018/04/10 08:11

HTMLの「SetHtmlChars$row['name']);」の部分ですが、「(」(カッコ開く)が抜けている気がするのですが。
fukoma

2018/04/10 08:20

ありがとうございます。実際のコードの方は「(」はついていました。こちらにサンプルを書く際抜けていたようです。修正します。
退会済みユーザー

退会済みユーザー

2018/04/10 09:32

あーのねー、なにがどう化けたのかっていうのがわかるとー、解決のヒントになることがあるのー。でも、なにがどうなっているのかー、まぁーったくわからないのー。だからなぁんにも考えるきっかけが、つかめないのぉー。
退会済みユーザー

退会済みユーザー

2018/04/10 09:34

name が � になっちゃうのが “化けてる” って事なのぉ?
退会済みユーザー

退会済みユーザー

2018/04/10 09:47

というか、$link->real_escape_string()このメンバメソッドの実装がわからないのぉ。
退会済みユーザー

退会済みユーザー

2018/04/10 09:48

$name[]とかのイニシャライズ部分もないのぉ。
fukoma

2018/04/11 03:44 編集

lucker 様 コメントありがとうございます。初心者なので質問の仕方も書き方もハッキリせず失礼いたしました。 >name が � になっちゃうのが “化けてる” って事なのぉ?  はい。これを文字化けと思っていましたが勘違いでしょうか。。 >というか、$link->real_escape_string()このメンバメソッドの実装がわからないのぉ。  こちらはマニュアルのオブジェクト指向型を参考にしてみたいのですがコピペに近いのでどうすべきかご指摘いただけると嬉しいです。
退会済みユーザー

退会済みユーザー

2018/04/11 03:58

どう文字化けしたかが重要なんですよ
guest

回答2

0

・文字コードはSJISですか?

・nameだけ文字化けする、というお話ですが、nameから「店」という文字を排除したら、文字化けが解消しませんか?(例:渋谷店⇒渋谷、にしてテストしてみる)

もし、上記2つの質問に対し、いずれもYESになるようでしたら、「5C問題」に引っかかっている可能性があります。

https://www.ilovex.co.jp/Division/SRD/archives/2007/07/5c.html

(「店」以外にも「ソ」「噂」などが該当します)

その場合、対象文字列のエスケープが必要になります。

以下の記事に対処法が詳しく掲載されておりますので、よろしければご覧ください。

http://1jaum.blogspot.jp/2008/09/shift-jis5cphp.html

投稿2018/04/11 04:15

nak

総合スコア696

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

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

fukoma

2018/04/11 05:50

ご丁寧にありがとうございます。このような問題もあるのですね。ちゃんと読んで試してみます。
guest

0

皆様コメントありがとうございます。

var_dumpしたらどこでおかしくなったのか分かった気がしたので下記のように変更したら
文字化けはなおりました。

ただ、エスケープのタイミングがまだよく理解できておらず、これが正しいのか、一般的なのか、実は問題があるのか、最後にアドバイスいただけると有難いです。

宜しくお願い致します。

php

1if (isset($_POST["save"])) { 2 3 $num = count($link->real_escape_string($_POST['id'])); 4 5 $id = $_POST['id']; 6 $name = $_POST['name']; 7 $address = $_POST['address']; 8 9 for($i = 0;$i < $num ;$i++){ 10 11 $id[$i] = $link->real_escape_string($id[$i]); 12 $name[$i] = $link->real_escape_string($name[$i]); 13 $address[$i] = $link->real_escape_string($address[$i]); 14 15 16 $values_r[$i] = "('".$id[$i]."','". $name[$i]."','" . $address[$i]."')" ; 17 } 18 19 $InsertValues = implode( ",", $values_r); 20 $query = "INSERT INTO location (id,name,address) VALUES ". $InsertValues . " ON DUPLICATE KEY UPDATE name = VALUES(name),address = VALUES(address)"; 21 22 $result = $link->query($query); 23}

投稿2018/04/11 06:57

fukoma

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問