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

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

解決済みの質問

php mysqlについて

初心者です宜しくお願いします。
phpからデータベースを使いたいのですが(mysql)、mysql_query()関数のところで1366エラーが出ます。
半角英数ならエラーは出ません。
プログラムを貼り付けます。どなたかお願いします、説明をもっと書きたいのですが私もあまりわかってないのでどうもすみません。
今やっていることは全てローカルですwindowsを使ってます、文字コードもshift_jisです。phpもmysqlも一台のコンピュータでやっています。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>MySQLへデータを登録</title>
</head>
<body>
DBとの連携テスト結果<br>

<?php

// DBに接続
if(!$con=mysql_connect("localhost","root","y3kwyuba")){
echo"connect_error";
exit;
}

// DBを選択
if(!mysql_select_db("test",$con)){
echo"select_db_error";
exit;
}

//MySQL4.1への対応
//mysql_query("SET NAMES SJIS");
この上の行のコメントをはずすとうまく動くのですが色々調べましたら、この書き方は推奨されないと書いてありました、他に対策はあるのでしょうか?


$name = $_POST['nm'];
$age = $_POST['age'];


// フォームで送られてきたデータでINSERT文を作成
$sql = "insert into t_touroku(name,age)
values('$name',$age)";

// SQLを実行
if(!$res=mysql_query($sql,$con)){
echo"query_error";
echo "エラー番号:".mysql_errno(),#エラー番号
"メッセージ:".mysql_error();#エラーメッセージ
exit;
}

// DBから切断
mysql_close($con);

// メッセージ出力
echo"登録完了";
?>
</body>
</html>
宜しくお願いします。

投稿日時 - 2012-02-03 21:21:09

QNo.7283570

すぐに回答ほしいです

質問者が選んだベストアンサー

全部最新バージョン
全部utf-8
という方針に決定したなら、それを徹底しましょう。
MySQLのバージョンアップとその中身の文字コード変換も必要です。
中身の文字コードの変換は、mysqldumpでバックアップを取得し、新DBにインポートします。
その過程でutf8を使用するようにします。

投稿日時 - 2012-02-06 14:25:22

お礼

有難うございます。
utf-8で統一します。

投稿日時 - 2012-02-06 16:17:19

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

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

回答(6)

ANo.5

MySQL4.1とかSJISとか、古いですね。
古いものを使わねばならない強烈な理由でもあるのでしょうか。
OS、PHP、MySQL、Apache等なるべく最新のバージョンを使い、文字コードもUTF-8にするのがよいでしょう。
今回を乗り越えたとしても、今後も何かと機会を見つけては亡霊のように文字コード攻撃やバージョン廃れ攻撃にさらされるでしょう。
この回答にBESTはつけないでしょうが、将来も含めて考えれば、BESTの方策はUTF-8にしちゃうことです。
それこそがあなたがあなたを救う道です。

投稿日時 - 2012-02-05 11:30:03

補足

php.iniをいじっていたらエラーは出なくなりました。
ただデータベースのテーブルの中身が文字化けするようになりました。
たぶん設定の問題と思います。
どうか助けてください。

投稿日時 - 2012-02-05 14:10:08

お礼

どうも有難うございます。
全てutf-8環境にしたのですが、insert 命令を打つと1366エラーが出ます。

ご指導の方宜しくお願いします。

投稿日時 - 2012-02-05 13:35:03

ANo.4

こんばんは。

>character_systemだけがutf8
まぁ、普通はそうですね。
これは今回の問題とは関係ないです・・・はい。

character_set_client = sjis
character_set_connection = utf8
character_set_results = sjis
こうなっていれば、とりあえずは大丈夫かと・・・。

skip-character-set-client-handshake
念のため・・・。

本来は、すべての文字コードを合わせるべきです。
これは強く主張します。

投稿日時 - 2012-02-04 21:33:48

お礼

お礼が遅くなってすみません、有難うございます。
character_set_client = sjis
character_set_connection = utf8
character_set_results = sjis
skip-character-set-client-handshake

my.iniに書くと思うんですがどの位置にそれぞれ書けば良いのでしょうか?
そして書くときはdefault_character_set_client = sjisなど先頭に加えないといけないのでしょうか?
もう少しヒントください。
宜しくお願いします。

投稿日時 - 2012-02-05 10:50:47

ANo.3

phpMyAdminなどのツールを使っている場合は、DBやテーブル、各カラムの照合順序をSJISにする。
コマンドプロンプトから、コマンドラインで操作している場合は下記SQLを実行して文字コードを確認。

mysql> show variables like 'character\_set\_%';
mysql> show table status from t_touroku;

SJISになってない場合は、文字コード変更用のSQLを実行
mysql> alter table t_touroku CHARSET=SJIS;


恐らく、デフォルト文字コードだとlatin1とかになっていたと思います。
もし、my.ini 変更後 MySQL を再起動していないなら、変更した内容が反映されていないので、一度再起動してみてください。

投稿日時 - 2012-02-04 11:55:31

お礼

有難うございます。
mysql> show variables like 'character\_set\_%';これを打つとcharacter_systemだけがutf8で後はsjisになっています。これがだめなのでしょうか。これがだめならsjisにするにはどうしたら良いのでしょうか?

投稿日時 - 2012-02-04 16:39:26

ANo.2

・ソースファイル自体はすべてSJISになっていますか?
・1366の内容は? Incorrect string value?(Integerじゃないですよね?)
・MYSQL側の文字コードはまちがいなくSJISですか?
 my.iniの中でdefault charsetなどの定義があればそれです。
 phpmyadminなどが使えればGUIでも確認できます。

投稿日時 - 2012-02-04 02:01:16

お礼

有難うございました

投稿日時 - 2012-02-04 08:48:10

ANo.1

1366エラーは、MySQLで使おうとしている文字コードとPHPから書き込もうとしている文字コードが一致しないということです。
mysql_query("SET NAMES SJIS"); で一時的にMySQLで使用する文字コードをSJISにしているので、PHPから書き込む文字コードと同じになりエラーが出なくなるわけです。
あくまで一時的なものなので、明示的にmysql_close($con); するかPHPの処理が終わった時に効果が切れます。
推奨されないのは、上記理由からだと思います。
一時的ではなく、MySQLでずっと同じ文字コードを使用したい場合はMySQLの設定ファイル(my.ini)のdefault-character-setを指定するか、テーブル作成時に文字コードの照合順序を指定してやればいいと思います。

投稿日時 - 2012-02-04 01:40:46

お礼

my.iniの設定はdefault-character-setはSJISにしています。
申し訳ありませんがもう少しヒントください。どうもすみません。
宜しくお願いします。

投稿日時 - 2012-02-04 08:58:39

あなたにオススメの質問