エラーがなければ登録+登録完了画面 - PHPプロ!Q&A掲示板

2739

  • 0P

エラーがなければ登録+登録完了画面

質問日時 / 2010年5月31日 03:18 (最終編集:5月31日 10:55)    回答数 / 17件

Questioner:  lsd1192  このエントリーをはてなブックマークに追加 

キーワード / PHP    MYSQL   

フォーム画面でエラーがなければ登録+登録完了画面を作りたいと思ってますが、下記の状態だと、入力が正しく送信しても、エラーメッセージが表示されるだけで、どうしていいかわからなくなりました…。ご指導、ご教授いただけたら幸いです。
流れとしては、フォーム入力画面⇔エラー処理、エラーがなければ→登録+登録完了画面
regist.php
  1. <?PHP echo $message?>
  2. <form action="error_check.php?guid=on" name="form" method="get" utn="utn">
  3. 名前<input type="text" name="name" maxlength="16" size="16" istyle="1" format="16M" mode="hiragana" accesskey="1" value="<?php echo $name?>" /><br />
  4. フリガナ<input type="text" name="kana" maxlength="10" size="10" istyle="2" mode="hankakukana" accesskey="2" value="<?php echo $kana?>" /><br />
  5. ニックネーム<input type="text" name="nick" maxlength="10" size="10" istyle="2" mode="hankakukana" accesskey="3" value="<?php echo $nick?>" /><br />
  6. <input type="radio" name="sex" value="男" checked="checked" accesskey="4" />男
  7. <input type="radio" name="sex" value="女" accesskey="5" />女<br />
  8. パスワード(4文字以上)<br />
  9. <input type="password" name="pass" maxlength="24" size="12" istyle="4" format="12N" mode="numeric" accesskey="6" value="" /><br />
  10. パスワード確認<br />
  11.  
  12. <input type="password" name="pass2" maxlength="24" size="12" istyle="4" format="12N" mode="numeric" accesskey="6" value="" /><br />
  13. メールアドレス (変更不可)<br /><br /><br />
  14. <input type="hidden" name="email" value="" />
  15. <input type="hidden" name="temp_uid" value="" />
  16. <input type="submit" value="送信" name="send" accesskey="7" />
  17. </form>

error_check.php
  1. <?php
  2. $name = $_GET['name'];
  3. if(empty($name)){
  4.        $message ='未入力があります';
  5.        require_once 'regist.php';
  6. exit;
  7. }
  8. $kana = $_GET['kana'];
  9. if(empty($kana)){
  10.   $message ='未入力があります';
  11.          require_once 'regist.php';
  12. exit;
  13. }
  14. $nick = $_GET['nick'];
  15. if(empty($nick)){
  16.     $message ='未入力があります';
  17.            require_once 'regist.php';
  18. exit;
  19. }
  20. $pass = $_GET['pass'];
  21. if (empty($pass)) {
  22.     $message ='未入力があります';
  23.            require_once 'regist.php';
  24. exit;
  25. }
  26. $pass2 = $_GET['pass2'];
  27. if (empty($pass2)) {
  28.     $message ='未入力があります';
  29.            require_once 'regist.php';
  30. exit;
  31. }
  32. if($_GET['pass'] and $_GET['pass2'] and ($_GET['pass'] != $_GET['pass2'])){ 
  33. $message = 'パスワードが一致しません';
  34.        require_once 'regist.php';
  35. exit;
  36. }
  37. if(!ctype_digit($pass) or 4 > strlen($pass) or 16 < strlen($pass) or !preg_match("/^[a-zA-Z0-9]+$/"$pass)){
  38.   $message = 'パスワードは4文字以上半角英数字で入力してください';
  39.          require_once 'regist.php';
  40. exit;
  41. }
  42.  
  43.  
  44.  
  45. //DBに接続
  46. $con = mysql_connect("localhost","test","123456")or die(mysql_error());
  47.   mysql_select_db("test")or die(mysql_error());
  48.   // mysql_query("SET NAMES 'utf8'");
  49.   mysql_set_charset('utf8');
  50.   $sql = mysql_insert_string('users'compact('name''kana''nick''sex''pass''mail'));
  51.   $res = mysql_query($sql) or die(mysql_error());
  52.   mysql_close($con);
  53.  
  54.  
  55. function mysql_insert_string($table_name$values) {
  56.   $names = '`'.implode('`,`'array_keys($values)).'`';
  57.   $values = implode(','array_map(mysql_escape$values));
  58.  
  59.   return "INSERT INTO `{$table_name}` ({$names}) VALUES({$values});";
  60. }
  61. function mysql_escape($value) {
  62.   switch (true) {
  63.     case is_null($value)  : return 'NULL';
  64.   case is_bool($value)  : return $value ? 1 : 0;
  65.   case is_numeric($value)  : return $value;
  66.   default : return "'".mysql_real_escape_string($value)."'";
  67.   }
  68.   }
  69.   ?>

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



ツリー一覧

┗A01shimix>エラーメッセージが表示されるだけで、どうしていい
 ┗A01-1lsd1192早急なご返答大変感謝しております。 エラーメッセー
  ┗A01-1-1shimix>エラーメッセージはフォームの入力が誤っていたとき
   ┗A01-1-1-1lsd1192再度ご返答有難うございます! 失礼いたしました。そ
    ┗A01-1-1-1-1shimixいや、ctype_digitは >text のすべての文字が数字
     ┗A01-1-1-1-1-1lsd1192この意見は質問者によって削除されました。
      ┗A01-1-1-1-1-1-1lsd1192!をはずしたらうまくいったと思ったら今度は正規表現
       ┗A01-1-1-1-1-1-1-1shimix>@マークとか半角英数字以外を入力してもエラーメッ
        ┗A01-1-1-1-1-1-1-1-1lsd1192ありがとうございます! 上記のソースでは問題なかっ
         ┗A01-1-1-1-1-1-1-1-1-1shimixえっと・・。何故最初のifの{}の中身が else if から
          ┣A01-1-1-1-1-1-1-1-1-1-1lsd1192すみません。正規表現おかしいと思い、色々サイトみて
          ┗A01-1-1-1-1-1-1-1-1-1-2lsd1192>>CODE !preg_match("/^[a-zA-Z0-9]+$/", $pass)){
           ┗A01-1-1-1-1-1-1-1-1-1-2-1shimix>数字のみのパスをいれてみたところエラーがでるみた
            ┗A01-1-1-1-1-1-1-1-1-1-2-1-1lsd1192説明不足でした…すみません。 半角英数字=半角英語
             ┗A01-1-1-1-1-1-1-1-1-1-2-1-1-1shimix>半角数字のみでもOKって意味です><; じゃぁ、
              ┗A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1lsd1192>>CODE $sql = "INSERT INTO users(name,kana,nick,
               ┗A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1shimix>時間とかも取得したい場合ってどうすればよろしいの
                ┗A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1lsd1192今日は本当にありがとうございました!!! すごく勉

回答一覧

並び替え:

A01
answerershimix [5月31日 08:30]

>エラーメッセージが表示されるだけで、どうしていいかわからなくなりました…。

どういうエラーメッセージが表示されますか?最低限、そのくらいの情報は書いてください。もし(自分でセットしているエラーメッセージでなく)MySQL関連のエラーであれば

>$sql = mysql_insert_string('users', compact('name', 'kana', 'nick', 'sex', 'pass', 'mail'));

print $sql; でも入れて、SQLが意図した内容になっているかを確認するのが早いと思いますが・・

この意見に回答する

ツリーへ TOPへ

A01-1
replyerlsd1192 [5月31日 10:54]

早急なご返答大変感謝しております。
エラーメッセージはフォームの入力が誤っていたときにでるエラーメッセージです。
簡単にいいますと、エラーチェックはできてるんですが、エラーがない場合に遷移して登録完了画面にいくのと、そのままMYSQLでINSERT(登録)をしたいのですが、なかなかうまくいかないので、間違ってるところや、ここはこうしたほうがいいとかご指摘ご指導があればご教授お願いできればとおもっております。皆様よろしくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [5月31日 13:13]

>エラーメッセージはフォームの入力が誤っていたときにでるエラーメッセージです。

それは、ご自分のスクリプトが返しているエラーですよね?どのメッセージが返りますか?

#それも含めて「書いてください」とお願いしたつもりだったんですが・・

もしパスワードあたりなら「!ctype_digit($pass)」が怪しそうですけど


>簡単にいいますと、エラーチェックはできてるんですが、

いや、でも(ちゃんと入力したのにエラーが返されるのであれば)正しくはチェックされていないわけですよね?(ご自身が書かれた)エラーチェックに引っかからなければどうなるかは「エラーチェックを外してみれば」わかります。

#でもエラーチェックが正しいデータをエラーにする部分を修正するのが先でしょうね。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerlsd1192 [5月31日 13:23]

再度ご返答有難うございます!
失礼いたしました。そうですね。エラーチェックに問題があるみたいです。
返ってくるメッセージはshimixさんの予想通り、「!ctype_digit($pass)」のエラーメッセージが帰ってきますね・・・
ここはどのように修正すればいいのでしょうか?ご教授お願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [5月31日 14:16] (最終編集:5月31日 14:18)

いや、ctype_digit

>text  のすべての文字が数字だった場合に TRUE

なんですが、「!」で否定にしています。なので式としては「すべての文字が数字」じゃないケース(英字が混じっている)でTRUE、つまり「すべての文字が数字」のときだけFLASE(チェックOK)になります。

#ご自分で書かれたのだと思いますけど、何故???

まぁ「!」を外すべきじゃないですかね。やりたかったのは全部が数字ならTRUE→エラーにするですよね?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyerlsd1192 [5月31日 14:26]

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

ツリーへ TOPへ

A01-1-1-1-1-1-1
replyerlsd1192 [5月31日 14:29] (最終編集:5月31日 14:33)

!をはずしたらうまくいったと思ったら今度は正規表現で誤りがあるかもしれないです・・・。
@マークとか半角英数字以外を入力してもエラーメッセージがでない状態になってしまいました・・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1
replyershimix [5月31日 15:00]

>@マークとか半角英数字以外を入力してもエラーメッセージがでない状態になってしまいました・・・。

下記ソースで確認しましたが、提示されたソースで問題ないように思います・・。最初に提示されたソース(で、ctype_digitの前の「!」を消した状態)で間違いありませんか?

  1. <?php
  2. checkstr('123abcABC');
  3. checkstr('1@3abcABC');
  4. checkstr('123abcA-C');
  5.  
  6. function checkstr($str) {
  7.   if (preg_match("/^[a-zA-Z0-9]+$/"$str)) { 
  8.     print $str ." is match <br>";
  9.   } else {
  10.     print $str ." is not match <br>";
  11.   }                                
  12. }
  13. ?>

「誤りがあるかもしれないです」と思ったら、とりあえず上記のようなスクリプトを書いて検証してみてください。

#他のチェック方法もありますけど、自分のソースを検証できないとあとあと困りますので(汗

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1
replyerlsd1192 [5月31日 15:43] (最終編集:5月31日 15:44)

ありがとうございます!
上記のソースでは問題なかったですね^^
パスワードのエラーチェックだけ書き直したのですが、これでもまだダメみたいです・・・
  1. if (preg_match("/^[a-zA-Z0-9]{4,12}$/", $_GET["pass"]) and 
  2.     preg_match("/^[a-zA-Z0-9]{4,12}$/", $_GET["pass2"]) and 
  3.    ($_GET["pass"] === $_GET["pass2"])){
  4.   else if($_GET["pass"] !== $_GET["pass2"]){
  5.     $message = "パスワードと確認用パスワードが一致しません";
  6. }else{  
  7. $message = "パスワードと確認用パスワードは4~12文字の半角英数字のみで入力してください";
  8.            require_once 'regist.php';
  9. exit;
  10. }

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1 満足
replyershimix [5月31日 16:09] (最終編集:5月31日 16:10)

えっと・・。何故最初のifの{}の中身が else if から始まっているんでしょうか?文法エラーで実行できないんですが・・。

#実行できないソースを提示されてもちょっと困ります(汗

というか、最初に提示されたソースと全然違ってますよね。こちらとしては下記のソースで試していると理解していたのですが、何故無意味に書き替えられたのでしょうか?

  1. if($pass and $pass2 and ($pass != $pass2)){ 
  2.     $message = 'パスワードが一致しません';
  3.     require_once 'regist.php';
  4.     exit;
  5. }
  6. if(ctype_digit($pass) or 4 > strlen($pass) or 16 < strlen($pass) or !preg_match("/^[a-zA-Z0-9]+$/", $pass)){
  7.     $message = 'パスワードは4文字以上半角英数字で入力してください';
  8.     require_once 'regist.php';
  9.     exit;
  10. }

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-1
replyerlsd1192 [5月31日 16:26]

すみません。正規表現おかしいと思い、色々サイトみてたら自分のやりたいような内容があったので、試しにやってしまいました・・・PHP初心者でまだ理解が全然できてない状態なので、ソースめちゃくちゃですみません・・・。
でもすごく勉強になりました!本当にありがとうございました!
もっと勉強してがんばりたいと思います!
また解らないことなどあったら教えて頂けたら幸いです^-^

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2
replyerlsd1192 [5月31日 21:27]

  1. !preg_match("/^[a-zA-Z0-9]+$/", $pass)){
この部分なのですが、さっきまで数字のみのパスをいれてみたところエラーがでるみたいです…。
文字化けは解決しましたが、登録した日付も取得したいのですが、NOW()をいれてもうまくいきません。。。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1 満足
replyershimix [5月31日 21:37] (最終編集:5月31日 21:40)

>数字のみのパスをいれてみたところエラーがでるみたいです…。

ctype_digitでチェックしていたのは、そういう意図(数字のみはNG)ではなかったのですか?

  http://jp2.php.net/manual/ja/function.ctype-digit.php


>NOW()をいれてもうまくいきません。。。 

NOW()って何ですか?

  http://jp2.php.net/manual-lookup.php?pattern=now&lang=ja

MySQLなら、CURDATE()だと思います(当然ですがSQL文にCURDATE()という文字列として記述する)。

  http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html



(追記)
文字化けの話は別スレッドの話ですかね?同じ話を複数スレッドにするから、自分でもわからなくなってませんか?

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

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1-1
replyerlsd1192 [5月31日 23:26]

説明不足でした…すみません。
半角英数字=半角英語のみでも、半角数字のみでもOKって意味です><;

SQL文にCURDATE()を記述しても日付取得できませんでした…。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1-1-1 満足
replyershimix [5月31日 23:51]

>半角数字のみでもOKって意味です><;

じゃぁ、何のためにctype_digitを書いたのでしょうか?

  1. if(4 > strlen($pass) or 16 < strlen($pass) or !preg_match("/^[a-zA-Z0-9]+$/", $pass)){
  2.     $message = 'パスワードは4文字以上半角英数字で入力してください';
  3.     require_once 'regist.php';
  4.     exit;
  5. }

にすればいいだけではありませんか?


>SQL文にCURDATE()を記述しても日付取得できませんでした…。 

できあがったSQL文を確認してますか?どういうSQL文になってましたでしょうか。

というか、そういう項目があるなら「mysql_insert_string」という自作関数の部分は書き直してますよね。今現在のソースを出してもらわないと検証不可です。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1
replyerlsd1192 [6月1日 00:34]

  1. $sql = "INSERT INTO users(name,kana,nick,sex,pass,mail,date)VALUES('".$name."','".$kana."','".$nick."','".$sex."','".$pass."','".$mail."',CURDATE())";
にしたらできました!でも日付だけで時間とかも取得したい場合ってどうすればよろしいのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1 満足
replyershimix [6月1日 00:50]

>時間とかも取得したい場合ってどうすればよろしいのでしょうか?

MySQLのマニュアルのURLは書いていたハズですが、読まれていませんか?それこそNOW()で取り出せます('YYYY-MM-DD HH:MM:SS' もしくは YYYYMMDDHHMMSS の形式)。

#ただし列項目のtypeは日付時刻が格納可能な形式ですよね(念のため確認)。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1
replyerlsd1192 [6月1日 01:42]

今日は本当にありがとうございました!!!
すごく勉強できた一日でした!
感謝感謝です!

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)