- 締切済み
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']."');";
- みんなの回答 (4)
- 専門家の回答
みんなの回答
すいません、filter_structureの中でコールされているfilter_requestもfilter_structureに変えてください。 以前はfilter_requestで紹介していて、何となく名前がこっちの方が合ってる気がしたので今回から変更してみたのですが、うっかり再帰させる部分だけ変更し忘れていました。
- agunuz
- ベストアンサー率65% (288/438)
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などに慣れておくべきです。
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>
お礼
解答ありがとうございました。 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>
補足
>解答ありがとうございました。 >PDOの利点は少しは理解しましたが、 >今回は、MySQLiでやってみようと思います。 やっぱまだまだ理解できていなかったので この質問ではPDOにします。 $ret[$key] = filter_request($var[$key], $value); の箇所の訂正??(間違え?) お願いします。