PHPフォームからのMYSQL保存がマッチしない
いつもお世話になります。
類似する質問も見つけられず、いろいろ試して悩んだ挙句、アプローチを変えてもう一度投稿することにしました。
発端は、下記のページです。
http://okwave.jp/qa/q8604578.html
問題は、phpmyadminからカラムまたはフィールドに入力したものは重複していればエラー表示されるのですが、PHPのフォームからMYSQLのデータベースに保存したもの(phpmyadmin上ではちゃんと登録されている)は重複とみなされず、エラーとして検出されません。
phpフォームからMYSQLのデータベースを呼び出してカラムまたはフィールド上に同じものがなければ保存、そうでなければエラー表示、といった形で重複させないプログラムを作成するつもりでした。
上記のページでご返信いただいたように、重複させないカラムにユニーク設定してみたのですが、問題は解決されませんでした。
文字コードが違うからと思ったのですが、MYSQL、PHPどちらもUTF-8で統一させています。
フォームからMYSQLへの保存時に問題があるのでは?と思うのですが、どのような形で修正すればうまくいくのか、わかりません。
どうか、知識の足りない私にご教授いただけないでしょうか?
PHPの設定とMYSQLへの登録のプログラムは下記の通りです。
PHP・・・5.4.19
XAMPP・・・1.8.2
phpmyadmin・・・4.0.4.1
データベース文字コード(UTF-8)
phpの文字コード(php.iniのdefault_characterをUTF-8に設定)
<?php
//データベースの接続設定
$DB_HOST = "localhost";
$DB_NAME = "○○";
$DB_USER = "○○";
$DB_PASS = "○○";
//データベースに接続する
$conn = mysql_connect($DB_HOST,$DB_USER,$DB_PASS) or die("接続エラー");
mysql_select_db($DB_NAME) or die("接続エラー");
//データベース登録前にメール送信する
$userID = $_POST['userID'];
$password = $_POST['password'];
$name = $_POST['name'];
$mail1 = $_POST['mail1'];
$userID = htmlspecialchars($userID);
$password = htmlspecialchars($password);
$name = htmlspecialchars($name);
$mail1 = htmlspecialchars($mail1);
$mail_sub = '登録を受け付けました。';
$mail_body = 'ご登録、誠にありがとうございました。';
$mail_body = html_entity_decode($mail_body,ENT_QUOTES,"UTF-8");
$mail_head = 'From:blowin@horae.dti.ne.jp';
mb_language('Japanese');
mb_internal_encoding("UTF-8");
mb_send_mail($mail1, $mail_sub, $mail_body,$mail_head);
?>
<?php
//デフォルトのタイムゾーンを日本に設定
date_default_timezone_set("Japan");
//フォーム情報をすべて受信
extract($_POST);
//そのまま代入する形ではエラーが起きるため、isset関数を使ってエラー回避する
if(isset($_POST['$userID'])){
$userID = cnv_dbstr($_POST['$userID']);
}
if(isset($_POST['$password'])){
$password = cnv_dbstr($_POST['$password']);
}
if(isset($_POST['$name'])){
$name = cnv_dbstr($_POST['$name']);
}
if(isset($_POST['$mail1'])){
$mail1 = cnv_dbstr($_POST['$mail1']);
}
//データを追加する
$sql = "INSERT IGNORE INTO touroku(userID,password,name,email,date)";
$sql .= "VALUES( " ;
$sql .= " ' " .$userID. " ', " ;
$sql .= " ' " .$password. " ', " ;
$sql .= " ' " .$name. " ', " ;
$sql .= " ' " .$mail1. " ', " ;
$sql .= " ' " .date("Y/m/d H:i:s") . " ' " ;
$sql .= " ) " ;
$res = mysql_query($sql,$conn) or die("データ追加エラー");
//SQLコマンド用の文字列に変換する関数
function cnv_dbstr($string){
//タグを無効にする
$string = htmlspecialchars($string);
//magic_quotes_gpcがOnの場合はエスケープを解除する
if(get_magic_quotes_gpc()){
$string = stripslashes($string);
}
//SQLコマンド用の文字列にエスケープする
$string = mysql_real_escape_string($string);
return $string;
}
header('location:./testkanryou.php');
exit;
?>
大変申し訳ありませんが、どうか、よろしくお願い申し上げます。
お礼
お世話になっております。 現在使っているPCのmy.ini[mysqld]ブロックを変更し、再起動したのですが、latin1のまま変わらず。my.cnfはありませんでした。たまたま前に使っていたPCにmy.cnfが残っており、全てutf8で動いていたものですから、これをコピーし、現在のPCに持ってきたら全てutf8に変わりました。SQL文も問題なく動かすことができました。ありがとうございました。(いつも文字コードがらみでハマってしまいます・・・)