質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

str_replaceでパラメータを三つ要求されるetc

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,117

yuus2733

score 109

Notice: Undefined index: username in C:\xampp\htdocs\portfolio\register_submit.php on line 31

Warning: str_replace() expects at least 3 parameters, 1 given in C:\xampp\htdocs\portfolio\register_submit.php on line 82

Warning: mb_send_mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\portfolio\register_submit.php on line 91
というエラーが返されました。

1.31行目のundefinedが出たことで、register.php、register_check.php
という前画面のソースを確認したのですが、inputタグなどの記述にミスはありませんでした。なぜundefinedが出るのかわかりません。

2.str_replaceの使い方が初めてなので、パラメーターを3つ要求されても
「arrayで1つにまとめてるから1つしかわたるわけないじゃないか(???)」となっています。

3.こちらは、ローカルサーバーではダミーのメールサーバーを使えば
ひとまず避けられるエラーだとは読みました。
実際にやって確認した方がいいのでしょうか。

以上の三点についてご教示お願いします。
(その他、自身で書き換えた所があるので不備がありましたらご指摘ください)

<?php
require_once("function.php");
session_start();
header("Content-type: text/html; charset=utf-8");

//CSRFチェック
if($_SESSION['token'] != $_POST['token']){
     $_SESSION = array();
     session_destroy();
     session_start();

     $_SESSION["error_status"] = 2;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

//エラー情報のリセット
$_SESSION["error_status"] = 0;

$username = $_POST["username"];//31行目
$mail = $_POST["mail"];
$password = $_POST["password"];

//ソルト作成
$salt = get_salt();

//一時URLパスワード作成
$url_pass = get_url_password();

//ユーザー仮登録

//ストレッチングパスワード
$hash = stretchedPassword($salt,$password);

//データベース接続
$dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
$sql = "INSERT INTO USERS (ID,SALT,PASSWORD,MAILADDRESS,
          TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)";
          $sql .= "VALUES(?,?,?,?,?,?,?);";

//パラメータの型を指定
$stmt = $dbh->prepare($sql,array('text','text','text','text','text','timestamp','timestamp'));

//パラメータを渡してSQL実行
$res = $stmt->execute(array($username,$salt,$hash,$mail,$url_pass,date('Y-m-d H:i:s'),date('Y-m-d H:i:s')));

//ID重複チェック ※

try{

}catch(PDOException $e){
     die("接続失敗です{$e->getMessage()}");

     $dbh = null;

     $_SESSION['error_status'] = 4;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

$dbh = null;

//ユーザーに確認メール送信
$mail = str_replace(array("\r\n" , "/r" , "/n" , "" , $mail)); //82行目

$url = "http://" . SERVER . "/register_confirm.php?" . $url_pass;

$msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL;
$msg .= "アドレスの有効期限は10分間です。" . PHP_EOL;
$msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL;
$msg .= $url;

mb_send_mail($mail,"ユーザー登録",$msg,"From:" . SENDER_EMAIL); //91行目

?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+5

str_replaceの使い方は下記のページの通りです。
PHP: str_replace - Manual 

3引数の関数です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/09 20:12

    ありがとうございます!

    キャンセル

checkベストアンサー

+2

$mail = str_replace(["/r","/n"],"",$mail);


ですかね\r\nはあえて変換しなくてもいいでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/10 18:42

    array()の記述じゃなく[]だけでも配列になるんですか!ありがとうございます。

    キャンセル

  • 2017/08/10 18:49

    http://php.net/manual/ja/migration54.new-features.php

    PHP5.4から 追加された配列の短縮構文です。
    各バージョンの違いは時間のあるときに確認しておいたほうがいいですね
    たまたま参考にしたネット上の情報が古いと進歩がとまってしまいますので

    キャンセル

  • 2017/08/10 18:58

    わかりました、ありがとうございます~

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る