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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

XAMPP

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

Q&A

解決済

2回答

1306閲覧

DBにレコードを挿入する際、1つのテーブルでのみ文字化けしてしまいます。

tetejiro

総合スコア17

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

XAMPP

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

0グッド

1クリップ

投稿2021/02/07 11:24

編集2021/02/07 12:38

初学者です。ご教授をお願い致します。
XAMPPでMySQLとApacheを使用しています。

できないこと

1つのデーベース内に、4つのテーブルを作っているのですが
1つのテーブルでのみ、文字化けしてレコードが挿入されてしまいます。
きちんとしたものを挿入できるようにしたいです。
ちなみにですが、会員登録をしようとしているところです。
コマンドでINSERT文で挿入すると文字化けしませんでした。

具体的には、
(name)tetejiro
'tetejiroa'
(year)1
'1'
(pass)aaa
'47bce5c74f589f4867dbd57e9ca9f808'
※暗号化した上で保存するようにしています。
(mail)aaa@gmail.com
'aaa@gmail.com'
このようにレコードが挿入されます。

※漢字部分はそのままでした。(name)質問 ⇒ '質問'

試したこと

DBへ接続する際は、このように記載しています。
$dsn='mysql:host=localhost;dbname=portfolio;charset=utf8mb4_general_ci';
※最初は、一番最後の文字コードをutf8でしていたのですが、
照合順序がutf8mb4_general_ciとなっていたため、上記へ変更してみましたが、だめでした。

コード

php

1 <form action="reg-done.php" method="post"> 2 <p><input type="hidden" name="name" value="'<?php print $name; ?>'"></p> 3 <p><input type="hidden" name="year" value="'<?php print $year; ?>'"></p> 4 <p><input type="hidden" name="pass" value="'<?php print $pass; ?>'"></p> 5 <p><input type="hidden" name="mail" value="'<?php print $mail; ?>'"></p> 6 <p><input type="submit" value="始める"> 7 </form>

php

1 try 2 { 3 require_once '../hensu.php'; 4 $post=sanitize($_POST); 5 $name=$post['name']; 6 $year=$post['year']; 7 $pass=$post['pass']; 8 $mail=$post['mail']; 9 10 require_once '../db.php'; 11        //$dsn='mysql:host=mysql~省略します~ ;charset=utf8';が含まれています。 12 13 $dbh=new PDO($dsn,$user,$password); 14 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 15 16 $sql='LOCK TABLES member READ'; 17 $sql='INSERT INTO member(name,year,pass,mail) VALUES (?,?,?,?)'; 18 $stmt=$dbh->prepare($sql); 19 $data=array(); 20 $data[]=$name; 21 $data[]=$year; 22 $data[]=$pass; 23 $data[]=$mail; 24 $stmt->execute($data); 25 26 $sql='SELECT LAST_INSERT_ID()'; 27 $stmt=$dbh->prepare($sql); 28 $stmt->execute(); 29 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 30 $code=$rec['LAST_INSERT_ID()']; 31 $sql='UNLOCK TABLES'; 32 33 header('Location:../mypage/mypage.php?code='.$code); 34 } 35 catch (\Exception $e) 36 { 37 var_dump($e); 38 print 'ただいま障害によりご迷惑をおかけしております。'; 39 print '<form action="registration.html" method="post">'; 40 print '<input type="submit" value="戻る">'; 41 print '</form>'; 42 exit(); 43 } 44

MySQL

1-- 2-- テーブルの構造 `member` 3-- 4 5CREATE TABLE IF NOT EXISTS `member` ( 6 `code` int(11) NOT NULL AUTO_INCREMENT, 7 `name` varchar(100) NOT NULL, 8 `year` varchar(100) NOT NULL, 9 `pass` varchar(100) NOT NULL, 10 `mail` varchar(100) NOT NULL, 11 PRIMARY KEY (`code`) 12) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 13 14-- 15-- テーブルのデータのダンプ `member` 16-- 17 18INSERT INTO `member` (`code`, `name`, `year`, `pass`, `mail`) VALUES 19(1, '&#039;tetemalu&#039;', '&#039;1&#039;', '&#039;47bce5c74f589f4867dbd57e9ca9f808&#039;', '&#039;hy1733505@gmail.com&#039;'), 20(2, '&#039;tetemalu&#039;', '&#039;1&#039;', '&#039;47bce5c74f589f4867dbd57e9ca9f808&#039;', '&#039;aaa@gmail.com&#039;'); 21

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

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

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

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

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

68user

2021/02/07 12:23

cahrset を charset になおしたらどうなりますか? mysql コマンドで直接 insert したらどうなりますか?
tetejiro

2021/02/07 12:35

ご回答ありがとうございます。 charset=utf8に修正してみましたが、そのままでした。 insert文で直接挿入すると、文字化けしませんでした。
guest

回答2

0

sanitizeがおかしいのだと思います。
DBへの投入については、なるべく生データを利用するのが原則です
へんなサニタイズは弊害が多いのでやめましょう
(バリデートで引っかかったらfalseを返すくらいが丁度いい)

投稿2021/02/08 01:01

yambejp

総合スコア116724

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

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

yambejp

2021/02/08 01:06

バリデート処理 $name=filter_input(INPUT_POST,'name'); $year=filter_input(INPUT_POST,'year',FILTER_VALIDATE_INT); $pass=filter_input(INPUT_POST,'pass'); $mail=filter_input(INPUT_POST,'mail',FILTER_VALIDATE_EMAIL);
tetejiro

2021/02/08 01:18

ご回答ありがとうございます。 ご指摘の通り、sanitizeが原因のようでした。 DBへ挿入する際は、サニタイズするにもその内容には気を付けなければならないのですね。 今回の件で痛い目を見たので、今後はバリデート処理を使用していきたいと思います。 改めまして、ご回答ありがとうございました。
yambejp

2021/02/08 01:29 編集

回答欄にもかきましたが、DBにはユーザーから受け取ったデータを そのまま保持するのが原則だということだけ覚えておいて下さい エスケープ処理はDBにとっては検索性も落ちる無用の長物ということ ただし、たとえば一定の禁止ワードをサニタイズしたりすることは 運用上必要かもしれません
guest

0

ベストアンサー

文字化けではないです。
&#039;はそのまま検索キーワードとして投入すればわかりますが、アポストロフィ
ちょうどリクエストされたと思わしき文字列を囲うように配置されていることから、
sanitize()で無駄なことやってるのでは。

パラメータでバインドすればSQL的なエスケープと型にあわせたデータのセットはやってくれますので手動でシングルクォートを追加する必要はなく(その効果とも言えるが)、
DBに登録する際に加工してはいけません。

投稿2021/02/07 20:41

編集2021/02/07 20:42
m.ts10806

総合スコア80875

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

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

tetejiro

2021/02/08 01:12

前回に引き続き回答いただいてありがとうございます。 sanitize()では、エスケープ処理をしていました。 その前のpostで送る際にシングルクォーテーションを付けてしまっていたのが、エスケープ処理されていたようです。 >sanitize()で無駄なことをやっているのでは、 というお言葉で気づくことができました。かなり悩んでいたので、本当にうれしいです。 ありがとうございました。 的確なご回答をありがとうございました。
tetejiro

2021/02/08 01:44

わかりました。参考書籍については、再度違うものを検討します。 まずい実装になっているんですね。自分では気付きませんでした。 教えていただいたサイトも見てみます。 重ね重ね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問