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

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

ただいまの
回答率

87.92%

phpメール送信処理でのエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 639

score 6

前提・実現したいこと

phpのメール認証(仮登録認証)を完成させたい。

発生している問題・エラーメッセージ

 Parse error: syntax error, unexpected '"', expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /var/www/html/hogehoge.php on line 96


これが96行目付近の文法ミスやスペルミスであるということはわかるのですが、何度探しても見当たりません。痺れを切らしたので、今回質問させていただきました。

該当のソースコード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>仮会員登録画面</title>
    <link rel="stylesheet" href="css/kari.css">
</head>
<body>
<?php
   session_start();
    //クロスサイトリクエストフォージェリ(CSRF)対策
    $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
    $token = $_SESSION['token'];

    //クリックジャッキング対策
    header('X-FRAME-OPTIONS: SAMEORIGIN');

    //DB情報
    $user = 'vpsuser';//データベースユーザ名
    $password = "hogehoge";//データベースパスワード
    $dbName = "hogehoge";//データベース名
    $host = "hogehogenohoge.vs.sakura.ne.jp";//ホスト

    //エラーメッセージの初期化
    $errors = array();

    //DB接続
    $dsn = "mysql:host=".$host.";dbname=".$dbName.";charser=utf8";
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //送信ボタンクリックした時
    if (isset($_POST['submit'])) {
        //メールアドレスが空欄の時
        if (empty($_POST['mail'])) {
            $errors['mail'] = 'メールアドレスが未入力です。';
        } else {
            //postされたデータを変数に入力
            $mail = isset($_POST['mail']) ? $_POST['mail'] : null;

            //メールアドレスの構文チェック
            if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) {
                $errors['mail_check'] = "正しいメールアドレスを入力してください。";
            }
            //DB確認
            $sql = "SELECT id FROM user WHERE mail=:mail";
            $stm = $pdo->prepare($sql);
            $stm->bindValue(':mail', $mail, PDO::PARAM_STR);
            $stm->execute();
            $result = $stm->fetch(PDO::FETCH_ASSOC);

            //userテーブルに既に登録されている場合は、エラーを表示させる
            if (isset($result["id"])) {
                $errors['user_check'] = "このメールアドレスはすでに利用されております。";
            }
        }

        //エラーが0個の時、pre_userに入れる。
        if (count($errors) === 0) {
            $urltoken = hash('sha256', uniqid(rand(), 1));
            $url = "http://127.0.0.0/hontouroku.php?urltoken=".$urltoken;
            //このタイミングでDBに登録
            try {
                $sql = "INSERT INTO pre_user (urltoken, mail, date, flag) VALUES (:urltoken, :mail, now(), '0')";
                $stm = $pdo->prepare($sql);
                $stm->bindValue(':urltoken', $urltoken, PDO::PARAM_STR);
                $stm->bindValue(':mail', $mail, PDO::PARAM_STR);
                $stm->execute();
                $pdo = null;
                $message = "入力されたメールアドレスにメールを送信しました。メールに記載されたURLからご登録ください。";
            } catch (PDOException $e) {
                print('Error:'.$e->getMessage());
                die();
            }
            /*
            * メール送信処理
            * 登録されたメールアドレスへメールをお送りする。
            */
            $mailTo = $mail;
            $body = <<< EOM
            この度はご登録いただきありがとうございます。
            24時間以内に下記のURLからご登録下さい。
            $url
            EOM;

            mb_language('ja');
            mb_internal_encoding('UTF-8');

            //Fromヘッダを作成
            $header = 'From: ' . mb_encode_mimeheader($companyname). '<' . $companymail. '>';

            if (mb_send_mail($mailTo, $registation_subject, $body, $header, '-f'. $companymail)) {
                $_SESSION = array();
                if (isset($_COOKIE["PHPSESSID"])) {
                    setcookie("PHPSESSID", '', time() - 1800, '/');
                }
                session_destroy();
                $message = "入力されたメールアドレスにメールを送信しました。メールに記載されたURLからご登録ください。";
            } else {
                $errors['mail_error'] = "メールの送信に失敗しました。";
            }
        }
    }
?>
<div class="container">
    <h1>Sign Up!!</h1>
    <?php if (isset($_POST['submit']) && count($errors) === 0): ?>
        <!-- 登録完了画面 -->
        <p><?=$message?></p>
        <p>↓TEST用(後ほど削除):このURLが記載されたメールが届きます。</p>
        <a href="<?=$url?>"><?=$url?></a>
    <?php else: ?>
    <!-- 登録画面 -->
        <?php if(count($errors) > 0): ?>
            <?php
            foreach($errors as $value) {
                echo "<p class='error'>".$value."</p>";
            }
            ?>
        <?php endif; ?>
        <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
            <p>メールアドレス:<input type="text" name="mail" size="50" value="<?php if( !empty($_POST['mail']) ){ echo $_POST['mail']; } ?>"></p>
            <input type="hidden" name="token" value="<?=$token?>">
            <input type="submit" name="submit" value="送信">
        </form>
        <?php endif; ?>
</div>
</body>
</html>

試したこと

メール送信処理のとこを消したらエラーが消え、普通に表示されました。そこで、メール送信処理を一行ずつ書いて保存し、リロードしたらEOMの部分でsyntaxerrorが出たので、注意深くスペルミスを確認しましたが、エラーは消えませんでした。有識者の方、どうかご教授お願いいたします。

補足情報(FW/ツールのバージョンなど)

CentOS7
さくらのVPS
PHP 7.1.33
mysql 5.7.31

質問者は超初心者です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/11/10 13:21

    ip出して大丈夫なんでしょうか。
    質問編集では履歴に残るので質問削除依頼するか運営にマスク依頼を。

    キャンセル

回答 1

checkベストアンサー

0

ヒアドキュメントのEOM;の前後には、空白も含めて書いてはダメです。

PHP マニュアルの ヒアドキュメント構文 の

警告
非常に重要なことですが、終端 ID がある行には、セミコロン (;) 以外の他の文字が含まれていてはならないことに注意しましょう。 これは、特に ID はインデントしてはならないということ、 セミコロンの前に空白やタブを付けてはいけないことを意味します。 終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された 改行である必要があることにも注意を要します。

参照

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/10 13:34 編集

    一応追加情報
    https://www.php.net/manual/ja/migration73.new-features.php

    ちゃんと見てないけど、認証系、自前実装してほしくないなぁ。。。

    > CHERRY さん
    ぶら下がりで愚痴すみません^^;

    キャンセル

  • 2020/11/10 13:53 編集

    関連情報のフォローありがとうございます。

    キャンセル

  • 2020/11/12 11:45

    PHPマニュアル、改めて見直したらいけました!
    最後のEOM;
    インデントしてはいけなかったのですね、、、

    キャンセル

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

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

関連した質問

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