アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< ログイン処理について 質問一覧 MySQLにデータが追加できません。 >>

  • 0P
登録完了とメール送信

登録完了画面にて、入力に問題ない場合、submitで登録ボタンを押したときに、DBで登録済みかのチェック、問題なければDB登録+登録完了メールを送信したとおもってます。
初心者なりにスクリプト書いてみたのですが、間違いや、ご指摘などご教授いただけたらお願いいたします。
  1. <?php
  2.    // データベースに接続する 
  3.    $conn = mysql_connect("xxxxx","xxxx","123456") or die("接続エラー");
  4.    mysql_query("set character set sjis") or die("エラー");
  5.    mysql_select_db("xxxxxxx") or die("接続エラー");
  6.        
  7.    //すでに登録済みかどうか調べる 
  8. $sql = sprintf("SELECT * FROM users where (mail = '%s')AND(No = '%s')",
  9.  mysql_real_escape_string($mail),
  10.  mysql_real_escape_string($No));
  11.    
  12.    $res = mysql_query($sql$conn) or die("データ抽出エラー")
  13.    $count = mysql_num_rows($res)
  14.        
  15.    //データが抽出できたときはすでに登録済みと判断できる 
  16.    if($count > 0) {
  17.     print '<font color="red">既に登録されております</font><br />
  18.   <a href="login.html">こちらからログインしてください</a>';
  19.  
  20.    }
  21.  
  22. Mb_Language("Japanese");
  23. // 宛先
  24. $to = "$mail";
  25. // 差出人
  26. $from ="<xxx@xxxxx.com>";
  27. // 題名
  28. $sbj = "めーるです";
  29. // 本文
  30. $msg = "本文です。";
  31. // ヘッダ作成
  32. $header = "From: {$from}";
  33.  
  34. // 送信
  35. Mb_Send_Mail($to , $sbj , $msg , $header)
  36.  
  37.  
  38.  
  39.  
  40. //DBに接続
  41.   $con = mysql_connect("xxxxxx","xxxxxx","123456")or die(mysql_error());
  42.   mysql_query("set character set sjis") or die("エラー")
  43.   mysql_select_db("xxxxxxx")or die(mysql_error());
  44.   $sql = "INSERT INTO users(name,kana,nick,sex,pass,mail,No,date)VALUES('".$name."','".$kana."','".$nick."','".$sex."','".$pass."','".$mail."','".$No."',NOW())";
  45.   $res = mysql_query($sql) or die(mysql_error())
  46.   mysql_close($con)
  47.   
  48.   
  49. function mysql_insert_string($table_name$values) { 
  50.   $names = '`'.implode('`,`'array_keys($values)).'`'
  51.   $values = implode(','array_map(mysql_escape$values))
  52.   
  53.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});"
  54. } 
  55.   
  56. function mysql_escape($value) { 
  57.   switch (true) { 
  58.   case is_null($value)  : return 'NULL'
  59.   case is_bool($value)  : return $value ? 1 : 0
  60.   case is_numeric($value)  : return $value
  61.   default : return "'".mysql_real_escape_string($value)."'"
  62.   } 
  63. } 
  64. ?>
INSERT文とSELECT文を分けてやるんですか?あとメール送信がmb_send_mailを使うと記載されてたのですが、書き方としてはこんな感じでいいのでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

Q登録完了とメール送信 boo_cat  [06月18日 12時49分] 
┗Re:登録完了とメール送信 shimix  [06月18日 13時03分] 
  ┗Re:Re:登録完了とメール送信 boo_cat  [06月18日 13時19分] 
    ┗Re:Re:Re:登録完了とメール送信 signal  [06月18日 13時43分] 
      ┗Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月18日 14時32分] 
        ┗Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月18日 15時22分] 
          ┗Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月18日 15時38分] 
            ┗Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月18日 16時21分] 
              ┗Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月18日 16時56分] 
                ┣Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月18日 17時36分] 
                ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月19日 23時03分] 
                  ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月19日 23時20分] 
                    ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月20日 00時16分] 
                      ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月20日 01時11分] 
                        ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月20日 01時45分] 
                          ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月20日 02時28分] 
                            ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月20日 17時21分] 
                              ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月20日 19時41分] 
                                ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月21日 00時44分] 
                                  ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月21日 04時00分] 
                                    ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月21日 12時57分] 
                                      ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月21日 20時32分] 
                                        ┣(削除済み)
                                        ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月21日 20時49分] 
                                          ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月22日 02時45分] 
                                            ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月22日 13時00分] 
                                              ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月22日 13時59分] 
                                                ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月22日 14時49分] 
                                                  ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月22日 15時00分] 
                                                    ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月22日 23時59分] 
                                                      ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 shimix  [06月23日 06時57分] 
                                                        ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月23日 12時11分] 
                                                          ┗Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信 boo_cat  [06月23日 22時57分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:登録完了とメール送信

>INSERT文とSELECT文を分けてやるんですか?

それでもいいですし、プライマリキーがmailとNoであれば(selectのwhereからはそう読み取れます)いきなりinsertしてもいいかと思います。エラーになればエラーコード(mysql_errno())から「登録済み」と判断してもいいでしょうから。

  http://dev.mysql.com/doc/refman/5.1/ja/error-messages-server.html


>あとメール送信がmb_send_mailを使うと記載されてたのですが、書き方としてはこんな感じでいいのでしょうか?

mb_internal_encodingも(変換元の文字コードとして)明示しておいた方がいいです。また(selectとinsertを分けるのであれば)データベースへのinsertが確実に終わってからメール送信する方がいいんじゃないでしょうか?


なお、charsetの指定はmysql_set_charsetの方がいいと思います。

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


(追記@蛇足)
過去の質問を放置していると、そのうち回答がもらえなくなりますよ。

  http://www.phppro.jp/qa/2767

Re:Re:登録完了とメール送信

大変失礼しました。過去のスレの返事を書くの忘れてました。
大変申し訳ないです。

>>insertが確実に終わってからメール送信する方がいいんじゃないでしょうか?
終わってから送信ということは、メール送信する時間をcronなどで指定するということでしょうか?

Re:Re:Re:登録完了とメール送信

DBに関してはINSERT失敗の可能性もあるので、処理の順序を逆にしろってことです

Re:Re:Re:Re:登録完了とメール送信

ご回答ありです!
勉強になりました!

がんばってやってみます!
またできたらご一報の連絡をさせていただきます!

Re:Re:Re:Re:Re:登録完了とメール送信

上記のスクリプトですべて正常に動作したのですが、問題が、上記のスクリプトだと、登録済みの判断はいいのですが、主キーに設定したときに表示される
Duplicate entry'xxxxxxxxxxx'for key1
と表示されるのを消したいのですが・・・

Re:Re:Re:Re:Re:Re:登録完了とメール送信

えっと・・。このテーブルのプライマリキーは何ですか?ひょっとしてselectでwhere条件にキー以外のものを入れてます?それだとselectで読んでいる意味がありませんよね。

>主キーに設定したときに表示される
>Duplicate entry'xxxxxxxxxxx'for key1
>と表示されるのを消したいのと
>登録済みのときはsendmailは送らないように設定したいのですが…。 

で、エラーメッセージは自分で↓表示しているんですよね(汗

>$res = mysql_query($sql) or die(mysql_error());

signalさんにも補足していただきましたが、insert文を投げたときはor dieでいきなり止めたりなどせずに、mysql_queryのあとでmysql_errno()を確認してエラーの有無で処理(エラーメッセージを表示する/登録済みメールを送る)を分けるべきです。

登録済みでなくても他の何らかのデータベースエラーで登録できないケースもありますので、先に登録済みメールを送っていたら・・・。insert文を実行してエラーが戻っていないことを確認してからメールを送ってください。

Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>>で、エラーメッセージは自分で↓表示しているんですよね(汗

えっと、エラーメッセージは自分で表示させたい内容は表示されるのですが、その後にDuplicate entry'xxxxxxxxxxx'for key1って内容が記載されるんですよね(汗)

>>selectでwhere条件にキー以外のものを入れてます?
主キーは上記のスクリプトだとmailに主キーをいれております。

>>insert文を実行してエラーが戻っていないことを確認してからメールを送ってください。 
はい!勉強になります!有難うございます

Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>えっと、エラーメッセージは自分で表示させたい内容は表示されるのですが、
>その後に Duplicate entry'xxxxxxxxxxx'for key1って内容が記載されるんですよね(汗)

mysql_error()の内容は「Duplicate entry 'xxx' for key・・」だとは思いますが、それ以外に表示されるのですか?

>主キーは上記のスクリプトだとNoとmailに主キーをいれております。

Noとmailでプライマリキーですか?そうだとすればエラーメッセージのentryのあとの文字列はハイフンで区切って(mailとNoの)両方の値が表示されているハズですが、間違いありませんか?手元で確認した限りでは

  Duplicate entry 'xxxx-yyyy' for key 'PRIMARY'

などといったエラーメッセージのハズなんですが・・。このテーブルに他にuniqueな制約を付与していたりはしませんか?

Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

mysql_error()の内容でした・・・(汗
すみません。
解決しました!
でも本当に助かりました!

Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

Duplicate entry 'xxxx-yyyy' for key 'PRIMARY'についてなんですが
重複になってるからこのメッセージがでると思うのですが、この表示を出さないようにするためにはどうすればいいのでしょうか?

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>この表示を出さないようにするためにはどうすればいいのでしょうか? 

1.重複しないようにする。

今現在のスクリプトは最初に提示されたとおり、あらかじめselectで同一キーのレコードがないことを確認してからinsertされていますでしょうか?そうであればエラーにはならないと思うのですが・・。テーブルのプライマリキーが「mailとNo」ですよね(念のため再確認)。エラーメッセージにinsertしようとしたキーが表示されていると思いますが、意図したmailとNoで間違いないですか?

2.die(mysql_error())でエラーメッセージを表示しない

もしselectを省略してinsertしているのであれば(私がこちらの方法も説明したので)insertのSQL文を投げたときには「or die」を書いてはいけません。mysql_query($sql)のあとでmysql_errno()をチェックして1062(だったかな?Duplicate entryのエラー番号にしてください)であれば「登録済みです」にします。この場合、メール送信はinsertを投げて登録できた(mysql_errno()が0だった)ときだけです(1062以外でも「データベースエラーです」とか何とか表示して止めないといけません)。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>>エラーメッセージにinsertしようとしたキーが表示されていると思いますが、意図したmailとNoで間違いないですか?
昨日の段階まではmailとNOでしたが、知り合いに聞いたら新たにIDという列を作ってINT型にしてそれを主キーにしたほうがいいといわれ、それにしたのですが、やはり同じく、Duplicate entry'0' for key 1とでます。
>>>insertのSQL文を投げたときには「or die」を書いてはいけません。mysql_query($sql)のあとでmysql_errno()をチェックして1062(だったかな?Duplicate entryのエラー番号にしてください)であれば「登録済みです」にします。この場合、メール送信はinsertを投げて登録できた(mysql_errno()が0だった)ときだけです(1062以外でも「データベースエラーです」とか何とか表示して止めないといけません)。 

わかりました!がんばってやってみます!

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>昨日の段階まではmailとNOでしたが、知り合いに聞いたら新たにIDという列を作って
>INT型にしてそれを主キーにしたほうがいいといわれ、それにしたのですが、

intというか、auto_incrementですかね。でも「mailとNo」でuniqueにするのは変わりませんよね。

>やはり同じく、 Duplicate entry'0' for key 1とでます。

どの項目かわかりませんが「0」で挿入しようとされていますよね。intなのに文字列を入れようとしていたり(「No」なんか怪しいですね)、IDがauto_incrementになっていなかったりはしませんか?

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>>> IDがauto_incrementになっていなかったりはしませんか?

確認したところなってないですね!
  1. <?php
  2. // データベースに接続する 
  3.    $conn = mysql_connect("xxxxx","xxxxxx","123456") or die("接続エラー");
  4.    mysql_query("set character set sjis") or die("エラー");
  5.    mysql_select_db("xxxxxxx") or die("接続エラー");
  6.        
  7.    //すでに登録済みかどうか調べる 
  8. $sql = sprintf("SELECT mail,No FROM users where (mail = '%s')AND(No = '%s')",
  9.  mysql_real_escape_string($mail),
  10.  mysql_real_escape_string($No));
  11.    
  12.    $res = mysql_query($sql$conn) or die("データ抽出エラー")
  13.    $count = mysql_num_rows($res)
  14.        
  15.    //データが抽出できたときはすでに登録済みと判断できる 
  16.    if($count > 0) {
  17.     print '<font color="red">既に登録されております</font><br />
  18.   <a href="login.html">こちらからログインしてください</a>';
  19.  
  20.    }
  21. ?>
  22. <?php
  23.  
  24. //DBに接続
  25.   $con = mysql_connect("xxxxx","xxxxxx","123456")or die(mysql_error());
  26.   mysql_query("set character set sjis") or die("エラー")
  27.   mysql_select_db("xxxxxxxx")or die(mysql_error());
  28.   $sql = "INSERT INTO users(name,kana,nick,sex,pass,mail,No,date)VALUES('".$name."','".$kana."','".$nick."','".$sex."','".$pass."','".$mail."','".$No."',NOW())";
  29.   $res = mysql_query($sql) or die(mysql_error());
  30.   mysql_close($con)
  31.   
  32.   
  33. function mysql_insert_string($table_name$values) { 
  34.   $names = '`'.implode('`,`'array_keys($values)).'`'
  35.   $values = implode(','array_map(mysql_escape$values))
  36.   
  37.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});"
  38. } 
  39.   
  40. function mysql_escape($value) { 
  41.   switch (true) { 
  42.   case is_null($value)  : return 'NULL'
  43.   case is_bool($value)  : return $value ? 1 : 0
  44.   case is_numeric($value)  : return $value
  45.   default : return "'".mysql_real_escape_string($value)."'"
  46.   } 
  47. } 
  48. ?>
 

上記のスクリプトの最初のSELECT文は2台の携帯で試してみたのですが、1台はDB登録済みのほうで、もう1台はDBに登録してない携帯で試したのですが、SELECT文は問題なくできてました。一応確認で報告しました(汗)
しかし、INSERT登録がどうやらできてないみたいですね。IDが重複だからだと思いますけど。

>> mailとNo」でuniqueにするのは変わりませんよね

sha1とかで変更するということですか?知識不足で間違ってたらすみません。

set character set 変更しないとだめですね(汗)

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>>>> IDがauto_incrementになっていなかったりはしませんか?
>確認したところなってないですね!

脱力感・・

>IDが重複だからだと思いますけど。

そうですね。auto_incrementにしてください。

>>> mailとNo」でuniqueにするのは変わりませんよね
>sha1とかで変更するということですか?知識不足で間違ってたらすみません。

違います。MySQLのテーブル定義で「mail, No」をUniqueKeyに設定しておきましょうって話です。一応selectでチェックはするわけですが時間差で同じ内容が書き込まれないとも限りません。

#なので(今回は詳しく説明しませんでしたが)selectの有無にかかわらずinsertのあとで
#エラーチェック・・という流れは本来必須です

で、ちょっと思ったのですが「mail」と「No」はselectで「and」でいいんでしょうか?どちらかが既存であれば「登録済み」にする・・というのであれば「or」で繋ぐべきですけど(当然各々個別にUniqueKeyにする)。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

IDはauto_incrementに設定し、mail, NoをUniqueKeyにしました。
DB登録済みの携帯で確認したところ、Duplicate entry'個体識別番号' for key 2とまたエラーがでてしまいますね。
Noは携帯端末番号を取得してます。
mysql_errno()がマニュアルみてもわからなくて…

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>Duplicate entry'個体識別番号' for key 2とまたエラーがでてしまいますね。

ということは個体識別番号「だけ」でUniqueKeyになっているわけですよね?私は「mailとNo(の組み合わせ)でUniqueKeyなんですか」と確認したと思うのですが・・。mail,Noが各々単独でUniqueKeyなのであれば、selectでの事前チェックでmailとNoは「and」ではなく「or」で繋がないと意味がありません(andとorの違いはわかりますよね)。

#どういうチェックを意図しているのかは「仕様」の部分なので言及しませんが・・

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

INSERTすることができました。しかし、Duplicate entry'個体識別番号' for key 2のエラーメッセージがきえない状態です。
mailとNOは別々でUniquekeyでした。すみません。
あとANDをORに変更して、無事にDB登録済みは'ユーザーはDB登録済み'のメッセがでて、DB登録してないユーザーはDBに登録できるようになりましたが
Duplicate entry'個体識別番号' for key 2は相変わらず表示されてます。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>Duplicate entry'個体識別番号' for key 2は相変わらず表示されてます。

テーブルの定義と既存のレコード及びselectとinsertで実行されているSQL文の内容を再確認してください。表示されている個体識別番号が存在しないのに、その番号でDuplicateになるのはヘンです。

というか、その状態で「insert出来ている」というのがもっとヘンです。出来れば現状のソースを再掲してみてください。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

IDがPRIMRAY、mailがUNIQUE、NOがUNIQUE。
現状のソースが

  1. <?php
  2.    // データベースに接続する 
  3.    $conn = mysql_connect("xxxx","xxxxx","123456") or die("接続エラー");
  4.    mysql_query("set character set sjis") or die("エラー");
  5.    mysql_select_db("aaa") or die("接続エラー");
  6.        
  7.    //すでに登録済みかどうか調べる 
  8. $sql = sprintf("SELECT mail,No FROM users where (mail = '%s')or(No = '%s')",
  9.  mysql_real_escape_string($mail),
  10.  mysql_real_escape_string($No));
  11.    
  12.    $res = mysql_query($sql$conn) or die("データ抽出エラー")
  13.    $count = mysql_num_rows($res)
  14.        
  15.    //データが抽出できたときはすでに登録済みと判断できる 
  16.    if($count > 0) {
  17.     print '<font color="red">既に登録されております</font><br />
  18.   <a href="login.html">こちらからログインしてください</a>';
  19.  
  20.    }
  21. ?>
  22. <?php
  23.  
  24. //DBに接続
  25.   $con = mysql_connect("xxxxxxx","xxxxxx","4123456")or die(mysql_error());
  26.   mysql_query("set character set sjis") or die("エラー")
  27.   mysql_select_db("xxxxxxx")or die(mysql_error());
  28.   $sql = "INSERT INTO users(name,kana,nick,sex,pass,mail,No,date)VALUES('".$name."','".$kana."','".$nick."','".$sex."','".$pass."','".$mail."','".$No."',NOW())";
  29.   $res = mysql_query($sql) or die(mysql_error());
  30.   mysql_close($con)
  31.   
  32.   
  33. function mysql_insert_string($table_name$values) { 
  34.   $names = '`'.implode('`,`'array_keys($values)).'`'
  35.   $values = implode(','array_map(mysql_escape$values))
  36.   
  37.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});"
  38. } 
  39.   
  40. function mysql_escape($value) { 
  41.   switch (true) { 
  42.   case is_null($value)  : return 'NULL'
  43.   case is_bool($value)  : return $value ? 1 : 0
  44.   case is_numeric($value)  : return $value
  45.   default : return "'".mysql_real_escape_string($value)."'"
  46.   } 
  47. } 
  48. ?>
さき程はNOのDuplicateがでてましたが、今度はmail=メールアドレスのDuplicateがでてきました…。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

テーブル定義のSQL文を提示してみてください。phpMyAdminでエクスポートすれば取得できると思います(create table文です)。

あと・・。表示させたSQL文などはおかしな部分はないのですよね?使ってもいないfunctionがあるなど「本当にこれだけなのか」がちょっと心配なんですが(汗

(削除済み)

この意見は投稿者によって削除されました。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

これでいいのでしょうか?
  1. INSERT INTO `users` (`name`, `No`, `kana`, `nick`, `sex`, `pass`, `mail`, `date`, `ID`) VALUES
テーブル構造は
  1. CREATE TABLE IF NOT EXISTS `users` (
  2.   `name` varchar(200) collate utf8_unicode_ci NOT NULL,
  3.   `No` varchar(200) collate utf8_unicode_ci NOT NULL,
  4.   `kana` varchar(50) collate utf8_unicode_ci NOT NULL,
  5.   `nick` varchar(50) collate utf8_unicode_ci NOT NULL,
  6.   `sex` varchar(50) collate utf8_unicode_ci NOT NULL,
  7.   `pass` varchar(100) collate utf8_unicode_ci NOT NULL,
  8.   `mail` varchar(200) collate utf8_unicode_ci NOT NULL,
  9.   `date` datetime NOT NULL,
  10.   `ID` int(32) NOT NULL,
  11.   PRIMARY KEY  (`ID`),
  12.   UNIQUE KEY `mail` (`mail`),
  13.   UNIQUE KEY `No` (`No`)
  14. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>これでいいのでしょうか?
>
  1. INSERT INTO `users` (`name`, `No`, `kana`, `nick`, `sex`, `pass`, `mail`, `date`, `ID`) VALUES

どう考えてもいいわけがないのですが、VALUES以降がないのはコピペ時のミスでしょうか?ちょっとこれでは検証出来ませんね。レスするときに、少しは妥当性をチェックしてから書いていただけると無駄なレスを費やさなくていいのですが(汗

#IDにauto_incrementが入ってないのも不思議ですけど・・・。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

失礼しました。IDはauto_incrementにしたはずが・・・・再度設定しました。
  1. CREATE TABLE IF NOT EXISTS `users` (
  2.   `name` varchar(200) collate utf8_unicode_ci NOT NULL,
  3.   `No` varchar(200) collate utf8_unicode_ci NOT NULL,
  4.   `kana` varchar(50) collate utf8_unicode_ci NOT NULL,
  5.   `nick` varchar(50) collate utf8_unicode_ci NOT NULL,
  6.   `sex` varchar(50) collate utf8_unicode_ci NOT NULL,
  7.   `pass` varchar(100) collate utf8_unicode_ci NOT NULL,
  8.   `mail` varchar(200) collate utf8_unicode_ci NOT NULL,
  9.   `date` datetime NOT NULL,
  10.   `ID` int(32) NOT NULL auto_increment,
  11.   PRIMARY KEY  (`ID`),
  12.   UNIQUE KEY `No` (`No`),
  13.   UNIQUE KEY `mail` (`mail`)
  14. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;
  15.  
  16. --
  17. -- テーブルのデータをダンプしています `users`
  18. --
  19.  
  20. INSERT INTO `users` (`name`, `No`, `kana`, `nick`, `sex`, `pass`, `mail`, `date`, `ID`) VALUES
  21. ('テスト', '個体識別番号', 'テスト', 'テスト', '女', '1111', 'xxxxxxxxxxxx@docomo.ne.jp', '2010-06-21 23:46:37', 10);
ご教授お願い致します。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

いや、テーブルのdumpのinsertはどうでもいいです(ということもないですが、まぁ普通にデータがあるんだろうと思います)。

「実際にエラーになったinsert文をprintしてデータと確認してください」とお願いしています。SQL文(insert)とそれがどういうエラーになったのか、No(もしくはmail)がDuplicateなら、本当にデータが存在しないのか・・を逐一確認していくのがデバッグです。正直こちらで「No」が'個体識別番号'なんてデータを見てもわかりませんので(これは実際には端末の実データですよね)、こればかりは実データを見て調べていただくしかありません。printしたSQL文が「間違いない」と思えるのなら、phpMyAdminで投げてみてもいいでしょう。

#ひょっとして「デバッグしたくない」のでしょうか?


で「設定したハズ」などというのが出てくると「ソースを変えたハズ」が出てきそうで怖くて仕方ありません。実際に動いている(エラーになっている)ソースとこちらで見ているソースが本当に同一なのか疑問に思えます。ひとつひとつキチンと確認して作業してください。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

No(もしくはmail)がDuplicateなら、本当にデータが存在しないのか・・

データが競合してるからDuplicateがでるんですよね?
ソースは同一です。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

>データが競合してるからDuplicateがでるんですよね?

そうです。なのでSQL文(insert)とテーブルの既存データを見比べてくださいと言っています。

>ソースは同一です。

じゃぁ、余計なfunctionを消して、$mailや$Noにリテラルで(テーブルに存在しない)値を書いて実行してみてください。そもそも提示されたソースでも$mailや$Noに値を入れる部分は省略されているわけですが「現象が再現できるミニマムソース」を作ってみてください。

#そういうことを地道に繰り返して探っていくしかないんですけど・・。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

ちょっと再確認でお聞きしたいのですが、仮にもしユーザーが新規で登録したとして、それは問題なくDB登録はできるのですが、その同じユーザーが登録したのに、再度登録フォームを入力し登録しようとしたときに、’既に登録済みです’のメッセージを出すのですが(もちろん重複になりますよね)そのときは必ず、Duplicateがでるのは仕方ないことなのでしょうか?
またINSERT IGNORE INTO table_name 構文を使えばエラーにはならないと調べたらありましたけど、それをするとDBに登録はされないのですが、mb_send_mailが送られてきてしまいます…。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

あ・・。そういうことですか・・。Duplicateにならないハズのデータでエラーメッセージになるものだと思ってました。重複データでエラーメッセージなら「ソースどおり」の動きですね。問題ありません。ご自分が書かれた(意図した)とおりに動いてます。

>’既に登録済みです’のメッセージを出すのですが(もちろん重複になりますよね)
>そのときは必ず、Duplicateがでるのは仕方ないことなのでしょうか?

Duplicatreになります。なので、

(その1)
あらかじめ「登録済み」かどうか(select文で)チェックして登録済みだったら「insert(及びメール送信。要するに登録処理)を実行しない」ようにしてください。

(その2)
insert文のSQLを投げたときに「or die」は書かずに(エラーメッセージは表示せずに)直後にmysql_errno()の値をチェックして、1062なら「登録済み」、not 0 なら「登録エラー」にしてください。あらかじめselectでチェックしているかどうかに関わらずこの処理は必要です。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

自分の説明不足ですみません。
SELECT文で、チェックはしてますね。あとはshimixさんが記載してくれた(その2)の項目をやらないとダメですね。
説明不足で貴重なお時間を無駄にさせてしまってすみませんでした。

Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:登録完了とメール送信

無事問題なく自分の理想通りに動くようになりました!本当に有難うございました!!
ログイン処理について 質問一覧 MySQLにデータが追加できません。