みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MySQL レコード追加と文字コードの変換

MySQLで、照合順序がutf8_general_ciの"db"というデータベースに
"hiragana"というテーブルを作っています。
(MySQLバージョン:5.5.27、 PHP拡張機能 MySQLi)

追加できたりするのですが、日本語が文字化けしたり、コードが古いなどで うまくいきません。

レコードを追加するコードのサンプルを教えていただけませんでしょうか?
使っている関数が古い書籍のサンプルのため
「この拡張モジュールは PHP 5.5.0 で非推奨になりました。将来のバージョンで削除される予定です。」
という関数ばかりで手詰まりな状態です。


//------ 入力するデータ  ------
$hiragana['a'] = 'あいうえお';
$hiragana['k'] = 'かきくけこ';
$hiragana['s'] = 'さしすせそ';
$hiragana['t'] = 'たちつてと';
$hiragana['n'] = 'なにぬねの';


//------ DBの情報  ------
$server = "localhost";
$dbname = "db";
$user = "root";
$password = "************";


//------ INSERT INTO  ------
$sql = "INSERT INTO hiragana( a, k, s, t, n ) VALUES( '".$hiragana['a']."', '".$hiragana['k']."', '".$hiragana['s']."', '".$hiragana['t']."', '".$hiragana['n']."');";

投稿日時 - 2013-08-05 16:39:48

QNo.8206999

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

改良しました。
http://qiita.com/mpyw/items/c39b9ee695a5c2e74627

投稿日時 - 2013-08-06 20:39:02

ANo.3

すいません、filter_structureの中でコールされているfilter_requestもfilter_structureに変えてください。
以前はfilter_requestで紹介していて、何となく名前がこっちの方が合ってる気がしたので今回から変更してみたのですが、うっかり再帰させる部分だけ変更し忘れていました。

投稿日時 - 2013-08-06 19:09:56

ANo.2

MySQL関数にあるものは、そのままMySQLi関数も存在するハズです。ほとんどの部分がmysql→mysqliで良いと思いますが・・・。文字化けはmysqli_set_charset(MySQLならmysql_set_charset)をキチンと実行していればまず起こらないと思いますが、そのあたりはどうですか?

http://www.php.net/manual/ja/mysqli.set-charset.php

いくら古いMySQL関数を使っているといってもmysql_set_chasetもmysql_query('set names utf8')も存在しないほど古い書籍なら(MySQL4.0までのソースと思われる)窓から放り投げた方がいいです。



前の回答者さんも書かれていますが、「手っ取り早く書き替えたいだけ」ならMySQL→MySQLiでいいですが、将来的に「データベースを扱うことを覚える」のが主眼なら、今のうちにPDOなどに慣れておくべきです。

投稿日時 - 2013-08-06 08:37:35

ANo.1

MySQLiでもいいですが個人的にはPDOの方が使いやすくてオススメです。
MySQLiは「エラー型」で、PDOは「例外型」(原則)です。
例外ならばCatchブロックで捕まえるだけでいいのでとてもコーディングがしやすくなります。

http://ideone.com/DbYv7u

<?php

/* HTML特殊文字をスケープ */
function h($input) {
____return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

/* 外部から受け取る変数の配列構造をフィルタリング */
function filter_structure($var, $default_structure) {
____$ret = array();
____foreach ($default_structure as $key => $value) {
________if (!isset($var[$key])) {
____________$ret[$key] = $value;
________} elseif (is_array($value)) {
____________$ret[$key] = filter_request($var[$key], $value);
________} elseif (is_array($var[$key])) {
____________$ret[$key] = $value;
________} else {
____________$ret[$key] = $var[$key];
________}
____}
____return $ret;
}

// デバッグ用データ
$_POST['hiragana'] = array(
____'a' => 'あいうえお',
____'k' => 'かきくけこ',
____'s' => 'さしすせそ',
____'t' => 'たちつてと',
____'n' => 'なにぬねの',
);

try {
____
____// PDOオブジェクト生成
____$pdo = new PDO('mysql:dbname=db;host=localhost;charset=utf8');
____
____// SQL実行失敗時に例外をスローする
____$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
____
____// 入力をフィルタリング
____$post = filter_structure($_POST, array(
________'hiragana' => array(
____________'a' => '',
____________'k' => '',
____________'s' => '',
____________'t' => '',
____________'n' => '',
________),
____));
____
____// プリペアドステートメントを生成
____$stmt = $pdo->prepare('INSERT INTO hiragana(a, k, s, t, n) VALUES(?, ?, ?, ?, ?)');
____
____// 値をバインドして実行
____$stmt->execute($post['hiragana']);
____
____$message = '成功!';
____
} catch (Exception $e) {
____
____$message = $e->getMessage();
____
}

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert Test</title>
</head>
<body>
<p><?=h($message)?></p>
</body>
</html>

投稿日時 - 2013-08-05 17:56:47

補足

>解答ありがとうございました。

>PDOの利点は少しは理解しましたが、
>今回は、MySQLiでやってみようと思います。

やっぱまだまだ理解できていなかったので
この質問ではPDOにします。

$ret[$key] = filter_request($var[$key], $value);

の箇所の訂正??(間違え?) お願いします。

投稿日時 - 2013-08-06 17:53:51

お礼

解答ありがとうございました。

PDOの利点は少しは理解しましたが、
今回は、MySQLiでやってみようと思います。

そこで、MySQLiに書きなおしたのですが
$ret[$key] = filter_request($var[$key], $value);
の行がエラーでCall to undefined function filter_request() と出ます。

合わせて ご教授願えたらと思います。


<?php
____// HTML特殊文字をスケープ
____function h($input) {
________return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
____}

____// 外部から受け取る変数の配列構造をフィルタリング
____function filter_structure($var, $default_structure) {
________$ret = array();
________foreach ($default_structure as $key => $value) {
____________if (!isset($var[$key])) {
________________$ret[$key] = $value;
____________} elseif (is_array($value)) {
________________$ret[$key] = filter_request($var[$key], $value);
____________} elseif (is_array($var[$key])) {
________________$ret[$key] = $value;
____________} else {
________________$ret[$key] = $var[$key];
____________}
____________}
________return $ret;
____}

____// デバッグ用データ
____$_POST['hiragana'] = array(
________'a' => 'あいうえお',
________'k' => 'かきくけこ',
________'s' => 'さしすせそ',
________'t' => 'たちつてと',
________'n' => 'なにぬねの',
____);

____// 接続設定(サーバ/データベース/ユーザ/パスワード)
____$server = "localhost";
____$dbname = "test";
____$user = "root";
____$password = "**********";


____$mysqli = new mysqli($server, $user, $password, $dbname);

____// 接続状況をチェックします
____if ($mysqli->connect_errno) {
________echo 'Failed to connect MySQL:'. $mysqli->connect_errno;
________exit();
____}

____$mysqli->query("CREATE TABLE hiragana");

____// プリペアドステートメントを生成
____$query = 'INSERT INTO hiragana(a, k, s, t, n) VALUES(?, ?, ?, ?, ?)';
____$stmt = $mysqli->prepare($query);

____// 入力をフィルタリング
____$post = filter_structure($_POST, array(
________'hiragana' => array(
____________'a' => '',
____________'k' => '',
____________'s' => '',
____________'t' => '',
____________'n' => '',
________),
____));

____// 値をバインドして実行
____$stmt->execute($post['hiragana']);

____// ステートメントを実行
____$stmt->execute();

____// ステートメントを閉じる
____$stmt->close();

____// 接続を閉じる
____$mysqli->close();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert Test</title>
</head>
<body>
<p><?=h($message)?></p>
</body>
</html>

投稿日時 - 2013-08-06 16:26:06

あなたにオススメの質問