phpの質問です。登録完了のメッセージが作動しない理由は?

このQ&Aのポイント
  • PHPの質問です。下記サイトを参考にして、ワンタイムURLの作成と登録確認のメール送信のテストをしています。メール送信とトークンは正常に動作していますが、登録完了のメッセージが表示されません。なぜでしょうか?
  • ドキュメントルートにtokenフォルダを作成しています。参考サイトのソースコードを微調整して実装しました。
  • クリックして「登録完了しました。」が作動しない問題が発生しています。なにか解決策はありますか?
回答を見る
  • ベストアンサー

phpの質問です。

phpの質問です。 下記サイトを参考に http://tenderfeel.xsrv.jp/php/861/ [php] ワンタイムURLの作成と登録確認のメール送信のテストをしています。 index.php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>テスト</title> </head> <body> スタッフ追加<br/> <br/> <form method="post" action="send.php"> メールアドレスを入れてください<br/> <input type="text" name="mail" style="width:200px"><br/> <input type="button" onclick="history.back()" value="戻る"> <input type="submit" value="OK"> </form> </body> </html> send.php <?php $tokendir = dirname( __FILE__ ). DIRECTORY_SEPARATOR ."token" . DIRECTORY_SEPARATOR; if($_POST["mail"]==""){ print "メールアドレスを入力してください"; }elseif(mb_strlen($_POST["mail"])> 0 && !preg_match("/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i",$_POST["mail"])){ print "メールアドレスの書式に誤りがあります。"; }else{ print "確認メールを送信しました"; mail_to_token($_POST["mail"]); } if(isset($_GET["key"])){ if(delete_old_token($_GET["key"])){ print "登録完了しました。"; }else{ print 'もう一度初めからやり直してください。'; } } function mail_to_token($address) { global $tokendir; $limit = (time()+3600); $token= rand(0,100).uniqid();//トークン touch($tokendir.$token.".log");//トークンファイル作成 $url = $_SERVER["HTTP_REFERER"]."?key=".$token; file_put_contents($tokendir.$token.".log", $limit, LOCK_EX);//期限保存 delete_old_token($token);//古いトークン削除 //本文スタイル $message="登録を完了するには、以下のアドレスを開いてください。\n60分以内にアクセスが無かった場合は無効となります。\n"; $message.=$url."\n\n"; my_send_mail($address,'登録確認',$message); } function delete_old_token($token = NULL) { global $tokendir; if (is_dir($tokendir)) { if ($dh = opendir($tokendir)) { while (($file = readdir($dh)) !== false) { if(is_file($tokendir.$file) && is_null($token)){ $data = file_get_contents($tokendir.$file); if(time()> $data) unlink($tokendir.$file); }else if(is_file($tokendir.$file) && !is_null($token)){ if(time() <(filemtime($tokendir.$token.".log")+3600) ){ @unlink($tokendir.$token.".log"); return true; }else{ @unlink($tokendir.$token.".log"); return false; } } } closedir($dh); } } } function my_send_mail($mailto, $subject, $message) { $message = mb_convert_encoding($message, "JIS", "UTF-8"); $subject = mb_convert_encoding($subject, "JIS", "UTF-8"); $header ="From: WebTecNote <info@example.com>\n"; mb_send_mail($mailto, $subject, $message, $header); } ?> ◎参考サイトを微調整して上記ソースを作成。 ◎ドキュメントルートにtokenフォルダを作成。 メール送信とトークンは無事来ましたが、 if(isset($_GET["key"])){ if(delete_old_token($_GET["key"])){ print "登録完了しました。"; }else{ print 'もう一度初めからやり直してください。'; } } 上記の部分のクリックして「登録完了しました。」が作動しません。 なぜでしょうか?

  • PHP
  • 回答数3
  • ありがとう数12

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

REFERERが空だったら(そういうクライアント環境は一定数あり得ます)どうするつもりなのか・・・ >上記でないとするとのような関数を使うのでしょうか? 設置するURLが決まっているなら、直接文字列リテラルで書けばいいのでは?そうでなくても $url = 'http://' . $_SERVER['HTTP_HOST'] . '/xxx.php?key=' . $token; のように書いた方が確実でしょう。

shousen412
質問者

お礼

大変勉強になりました。 ありがとうございます!

その他の回答 (2)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>作動しません、 メールに記載されているURLは、index.phpですか?send.phpですか?で、 >if(isset($_GET["key"])){ >if(delete_old_token($_GET["key"])){ >print "登録完了しました。"; >}else{ >print 'もう一度初めからやり直してください。'; >} >} はどちらに書いているのですか? どちらに書いているにしても(当然メールに記載されているURLのスクリプトでないといけませんが、それは合っているとして)、スクリプトの先頭に書いているのですよね?

shousen412
質問者

補足

何回もすみません、 index.phpのbodyの上部に <?php if(isset($_GET["key"])){ print "登録完了しました。"; }else{ print 'もう一度初めからやり直してください。'; } ?> を配置したところ、成功しました。 ありがとうございます。 蛇足の部分の ◎$_SERVER["HTTP_REFERER"]のようななアテにならないものを使うのはやめましょう。 上記でないとするとのような関数を使うのでしょうか?

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

正しい($tokendirに存在する)tokenファイル名が引き渡されているか、ファイル更新時刻が正しく読み取れているかをチェックしてください。 global $tokendir; のあとに print $token . '<br>'; を、 if(is_file($tokendir.$file) && !is_null($token)){ のあとに print date('Y/m/d H:i:s') . '<br>' print date('Y/m/d H:i:s', filemtime($tokendir.$token.".log")) . '<br>'; を追加してみてください。 (蛇足) $url = $_SERVER["HTTP_REFERER"]."?key=".$token; $_SERVER["HTTP_REFERER"]のようななアテにならないものを使うのはやめましょう。 というか今現在のデバッグでは正しいURLになっているんですよね。リファラはindex.phpだと思うので >if(isset($_GET["key"])){ >if(delete_old_token($_GET["key"])){ >print "登録完了しました。"; > 以下略 の部分もindex.phpに書いていると思いますが・・・ >「登録完了しました。」が作動しません。 ちゃんと「もう一度初めからやり直してください。」が表示jされているんですよね(これがダメだとURLの組み立てから間違っているので)。

shousen412
質問者

補足

◎申し訳ありません、 作動しません、 if(isset($_GET["key"])){ if(delete_old_token($_GET["key"])){ print "登録完了しました。"; }else{ print 'もう一度初めからやり直してください。'; } } 上記を何度見ても、間違いではないとおもうのですが・・・・・・・ ◎$_SERVER["HTTP_REFERER"]のようななアテにならないものを使うのはやめましょう。 上記でないとするとどの様な風に書きますか?

関連するQ&A

  • mb_send_mail()関数のタイトルで特定の文字が入ると送信できません。

    環境:WinXP+Apache2+PHP5 mb_send_mail()でタイトルに ”時間は何時でもokです。” を入力すると、送信に失敗します。 コードは以下の通りです。よろしくお願いします。 <?php $address=$_POST['address']; $subject=$_POST['subject']; $message=$_POST['message']; $header="Content-Type: text/plain;charset=iso-2022-jp"; mb_language("Japanese"); if(mb_send_mail($address,$subject,mb_convert_encoding($message,"JIS","EUC-JP"),$header)){ print("送信完了しました"); }else{ print("エラー:送信に失敗しました"); } ?> ($subject="時間は何時でもokです。"にするとエラーになります。)

    • 締切済み
    • PHP
  • PHPでメールを送信するには

    PHP超初心者です。 参考本をもとにPHPでメールを送信するということにチャレンジしているのですが、次のような文章が出ます。 Warning: mb_send_mail() [function.mb-send-mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in C:\Program Files\Apache Group\Apache2\htdocs\php10\mail.php on line 11 エラー:送信に失敗しました 参考本に書いてあるとおり、 php.iniのSMTP=localhost を自分が使っているoooooo@ocn.ne.jpに書き換え、sendmailには自分の別アドレスを記述したのですが。 11行目のエラーも何を指しているのかわかりません。 ご回答よろしくお願いします。 【mail.php】 <html> <head><title>mail.php</title></head> <body> <?php $address=$_POST['address']; $subject=$_POST['subject']; $message=$_POST['message']; $header="Content-Type:text/plain;charset=iso-2022-jp"; mb_language("Japanese"); if(mb_send_mail($address, $subject, mb_convert_encoding($message,"JIS","EUC-JP"),$header)){ print("送信完了しました。"); }else{ print("エラー:送信に失敗しました"); } ?> </body> </html> 【mail_form.html】 <html> <head><title>メールの送信</title></head> <body> <h2>メールの送信</h2> <form action="mail.php" method="post"> 宛先:<input type="text" name="address"><br /> 件名:<input type="text" name="subject"><br /> 本文:<br /><textarea name="message" rows="5" cols="30"></textarea><br /> <input type="submit" value="送信"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • jsonでn番目から最後までを取得するには?

    phpでアクセストークンを使ったinstagram jsonデータの取得を試みています。 n番目から最後までのデータを取得するにはどのようにすればよいでしょうか? -------------------------------------------------------- <?php //POSTリクエストの場合のみ受付 if($_SERVER['REQUEST_METHOD'] == 'POST'){ //アクセストークン $access_token = "29587...fa062d9"; //JSONデータを取得して出力 echo @file_get_contents("https://api.instagram.com/v1/users/self/media/recent/?access_token={$access_token}"); //終了 exit; } ?> --------------------------------------------------------

    • 締切済み
    • PHP
  • mb_language("Japanese");でエラーが出ます

    PHP初心者です。 少し訂正があるため、それを書き直しました。 回答を頂く方には大変面倒をおかけする事になり、誠に申し訳ありませんが、2つのファイルのソースコードをまず見てもらえますか。 test.php <?php session_start(); ?> <html> <head> <title>test</title> </head> <body> <h2>メールの送信</h2> <?php if ($_SESSION["address"]=="NG") { unset($_SESSION["address"]); print("E-Mailは必須入力です。"."<br>"); } if ($_SESSION["subject"]=="NG") { unset($_SESSION["subject"]); print("タイトルは必須入力です。"."<br>"); } if ($_SESSION["message"]=="NG") { unset($_SESSION["message"]); print("コメントは必須に入力です。"."<br>"); } ?> <form action="./test1.php" method="post"> E-Mail:<br><input type="text" name="address" <?php print("value='".$_SESSION["address"]."'")?> size="50"><br> タイトル:<br><input type="text" name="subject" <?php print("value='".$_SESSION["subject"]."'")?> size="50"><br> コメント:<br><textarea name="message" rows="5" cols="35"> <?php print($_SESSION["message"])?></textarea><br><br> <input type="submit" value="送信"> </form> </body> </html> このページを表示させてどこかを空欄のままにしますが、エラー表示は出ません。 ↑の部分はソースコード抜けや誤字で正常に表示できるようになりました。 では、全ての欄に入力してtest1.phpに移ります。 test1.php <?php session_start(); if(strlen($_POST["address"])==0){ $_SESSION["address"] = "NG"; }else{ $_SESSION["address"] = $_POST["address"]; } if(strlen($_POST["subject"])==0){ $_SESSION["subject"] = "NG"; }else{ $_SESSION["subject"] = $_POST["subject"]; } if(strlen($_POST["message"])==0){ $_SESSION["message"] = "NG"; }else{ $_SESSION["message"] = $_POST["message"]; } if($_SESSION["address"]=="NG" or $_SESSION["subject"]=="NG" or $_SESSION["message"]=="NG"){ header("Location: test.php?".SID); exit; } ?> <html> <head><title>test1.php</title></head> <body> <?php $address=$_POST["address"]; $subject=$_POST["subject"]; $message=$_POST["message"]; $header="From:xxx@xxxxx.xxx\nContent-Type: text/plain;charset=iso-2022-jp"; mb_language("Japanese"); if(mb_send_mail($address,$subject ,mb_convert_encoding($message,"JIS","SJIS"),$header)){ print("送信完了!"); }else{ print("エラー:送信に失敗しました"); } ?> </body> </html> 問題はここです。 移動前にmb_language("Japanese");の部分でエラー表示されます。 この構文がどうしてもエラーになります。 エラー文をここで書きます。 Fatal error: Call to undefined function mb_language() in C:\Apache2\htdocs\sample18_1.php on line 42 それで、構文をググって見ましたが、こういうサイトを見つけました。 http://lib.stwing.jp/archives/2005/12/phpmb_language.html​ ここにも書かれているので構文自体にエラーが出るのはおかしいはずなんですけど。 どこに問題があるのでしょうか。 このソースコードが何故上手く通らないのか教えて頂けると大変助かります。 どうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • WordPressの質問(q10145776)の続

    不正なトークンと表示されるため、single-regist.phpから下記のコードを削除したのですが、そちらは問題ないでしょうか? 送信時にトークンが必要だと思いますので、登録結果画面には必要ないのではないかと考えております。 //確認画面でデータが安全であることが確認された上で$_SESSIONを経由して画面遷移するが、登録結果画面へは不正アクセスできるから必須 if (empty($_SESSION['token']) || empty($_POST['token']) || $_SESSION['token'] !== $_POST['token']) { exit('不正トークン'); } ※single-regist.phpの11行目からトークンのコードになります https://wandbox.org/permlink/vCbUEZFcvQf2n1DK

    • ベストアンサー
    • PHP
  • n番目以降の要素を抽出したい

    アクセストークンを使ったinstagram APIのjsonデータの取得を試みています。 以下のサンプルを見つけてきたのですが、これでは全件取得されてしまいます。 n番目から最後までを取得したい場合は、どのように修正すればよいでしょうか? -------------------------------------------------------- <?php //POSTリクエストの場合のみ受付 if($_SERVER['REQUEST_METHOD'] == 'POST'){ //アクセストークン $access_token = "29587...fa062d9"; //JSONデータを取得して出力 echo @file_get_contents("https://api.instagram.com/v1/users/self/media/recent/?access_token={$access_token}&count=-1"); //終了 exit; } ?> --------------------------------------------------------

    • 締切済み
    • PHP
  • phpについて質問です。

    phgのメールフォームについて ?php $request_param = $_POST; $request_datetime = date("Y年m月d日 H時i分s秒"); $mailto = $request_param['email']; $to = "お問い合わせを受信するメールアドレスを入力"; $mailfrom = "送信が完了したことを自動送信するメールアドレスを入力"; $subject = "お問い合わせ、ありがとうございます。"; $content = ""; $content .= $request_param['name']. "様\r\n"; $content .= "お問い合わせ、ありがとうございます。\r\n"; $content .= "=================================\r\n"; $content .= "お名前 " . htmlspecialchars($request_param['name'])."\r\n"; $content .= "メールアドレス " . htmlspecialchars($request_param['email'])."\r\n"; $content .= "お問い合わせ内容 " . htmlspecialchars($request_param['content'])."\r\n"; $content .= "お問い合わせ日時 " . $request_datetime."\r\n"; $content .= "=================================\r\n"; //管理者確認用メール $subject2 = "お問い合わせがありました。"; $content2 = ""; $content2 .= "お問い合わせがありました。\r\n"; $content2 .= "=================================\r\n"; $content2 .= "お名前 " . htmlspecialchars($request_param['name'])."\r\n"; $content2 .= "メールアドレス " . htmlspecialchars($request_param['email'])."\r\n"; $content2 .= "お問い合わせ内容 " . htmlspecialchars($request_param['content'])."\r\n"; $content2 .= "お問い合わせ日時 " . $request_datetime."\r\n"; $content2 .= "================================="."\r\n"; mb_language("ja"); mb_internal_encoding("UTF-8"); //mail 送信 if($request_param['token'] === '1234567'){ if(mb_send_mail($to, $subject2, $content2, $mailfrom)){ mb_send_mail($mailto,$subject,$content,$mailfrom); ?> <script> window.location = "送信した後に表示されるページのURL"; </script> <?php } else { header('Content-Type: text/html; charset=UTF-8'); echo "メールの送信に失敗しました"; }; } else { echo "メールの送信に失敗しました(トークンエラー)"; } こちらのメールフォームをブラウザで見たときは文字化けしないのですが、あるメールアプリ(bluemail)を使うと文字化けしてしまいます。 なぜでしょうか? また、このプログラムはセキュリティーてきに危ないですか?

    • ベストアンサー
    • PHP
  • htmlとphpのデータ受け渡し???

    いつもお世話になり誠にありがとうございます。 標記の件。 まだ、ボク自身、解っていないようです。 htmlとphpのソースコードを提示します。 どうすればデータの受け渡しができるか? 添削してくださらないでしょうか? html <!--入力画面--> <form action = "./Blog.php" method = "get"> <label class="label" for="name">お名前(ニックネーム)</label> <center><input id="name" type="text" name="name"></center> <label class="label" for="e-mail">メール</label> <input id="e-mail" type="e-mail" name="e-mail"> <label class="label" for="category">カテゴリー</label> <input id="category" type="category" name="categoryl"> <label class="label" for="message">本文</label> <textarea name="area1" style="color:rgb(8, 8, 8); font-size:100%;" cols="50" rows="30"></textarea><br> <input type="submit" name="confiem" value="確認"> </form> CSS <meta charset="utf-8"> <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['e-mail'] = $_POST['e-mail']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['e-mail'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!--確認画面--> <?php if( $mode == 'input' ){ ?> お名前(ニックネーム)<?php echo $_POST['name'] ?><br> Eメール<?php echo $_POST['e-mail'] ?><br> カテゴリー<?php echo $_POST['category'] ?><br> 本文<br> <?php echo nl2br($_POST['message']) ?><br> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> <?php } else { ?> <!--完了画面--> <?php } ?> 上記の通りです。 全然ダメだと思います。 添削のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • php+MYSQL

    打ち込んだ後 var_dunpにてqueryの中身を確認したところ falseになってしまっていて失敗してしまいますどうしたらいいでしょうか? $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); ここがおかしいのかと思ってます <?php $link = mysql_connect('localhost','user','pass','dbname'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; if ( $subject !=='' && $honbun !=='' ) { $query = " INSERT INTO ogawa ( " ."subject," ."honbun," .") VALUES ( " . "'" . mysqli_real_escape_string( $link, $subject ) ."', " . "'" . mysqli_real_escape_string( $link, $honbun ) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysqli_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"><input type="hidden" id="auth_token" name="auth_token" value="04d8fdd9da7e7b2cba8698a7cffda5b427b29b5b"><input type="hidden" id="auth_token" name="auth_token" value="04d8fdd9da7e7b2cba8698a7cffda5b427b29b5b"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8">

  • トークンとCSRF対策

    // 1. トークンの生成 function get_csrf_token(){ // get_random_string()はユーザー定義関数。 $token = get_random_string(30); // set_session()はユーザー定義関数。 // CSRFのトークンを生成してセッションに格納したものを返す set_session('csrf_token', $token); // $_SESSION['csrf_token'] = $token; return $token; } // 2.トークンのチェック function is_valid_csrf_token($token){ if($token === '') { return false; } // 引数に与えられたもの$tokenと$_SESSION[‘csrf_token’]とを比較して // 合っていればtrue、そうでなければfalseを返す return $token === get_session('csrf_token'); // $_SESSION['csrf_token']; } function get_random_string($length = 20){ return substr(base_convert(hash('sha256', uniqid()), 16, 36), 0, $length); } get_csrf_token()とis_valid_csrf_token($token)は修正せずに、「if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['csrf_token'] === $_POST['csrf_token']) {} 」と同じ意味にするには、どのような処理(if文)を追加すればいいですか?

    • ベストアンサー
    • PHP

専門家に質問してみよう