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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

1911閲覧

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

vpsuser

総合スコア6

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

1クリップ

投稿2020/11/10 03:51

編集2020/11/12 02:32

前提・実現したいこと

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

該当のソースコード

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>仮会員登録画面</title> 7 <link rel="stylesheet" href="css/kari.css"> 8</head> 9<body> 10<?php 11 session_start(); 12 //クロスサイトリクエストフォージェリ(CSRF)対策 13 $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 14 $token = $_SESSION['token']; 15 16 //クリックジャッキング対策 17 header('X-FRAME-OPTIONS: SAMEORIGIN'); 18 19 //DB情報 20 $user = 'vpsuser';//データベースユーザ名 21 $password = "hogehoge";//データベースパスワード 22 $dbName = "hogehoge";//データベース名 23 $host = "hogehogenohoge.vs.sakura.ne.jp";//ホスト 24 25 //エラーメッセージの初期化 26 $errors = array(); 27 28 //DB接続 29 $dsn = "mysql:host=".$host.";dbname=".$dbName.";charser=utf8"; 30 $pdo = new PDO($dsn, $user, $password); 31 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 32 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 33 34 //送信ボタンクリックした時 35 if (isset($_POST['submit'])) { 36 //メールアドレスが空欄の時 37 if (empty($_POST['mail'])) { 38 $errors['mail'] = 'メールアドレスが未入力です。'; 39 } else { 40 //postされたデータを変数に入力 41 $mail = isset($_POST['mail']) ? $_POST['mail'] : null; 42 43 //メールアドレスの構文チェック 44 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)) { 45 $errors['mail_check'] = "正しいメールアドレスを入力してください。"; 46 } 47 //DB確認 48 $sql = "SELECT id FROM user WHERE mail=:mail"; 49 $stm = $pdo->prepare($sql); 50 $stm->bindValue(':mail', $mail, PDO::PARAM_STR); 51 $stm->execute(); 52 $result = $stm->fetch(PDO::FETCH_ASSOC); 53 54 //userテーブルに既に登録されている場合は、エラーを表示させる 55 if (isset($result["id"])) { 56 $errors['user_check'] = "このメールアドレスはすでに利用されております。"; 57 } 58 } 59 60 //エラーが0個の時、pre_userに入れる。 61 if (count($errors) === 0) { 62 $urltoken = hash('sha256', uniqid(rand(), 1)); 63 $url = "http://127.0.0.0/hontouroku.php?urltoken=".$urltoken; 64 //このタイミングでDBに登録 65 try { 66 $sql = "INSERT INTO pre_user (urltoken, mail, date, flag) VALUES (:urltoken, :mail, now(), '0')"; 67 $stm = $pdo->prepare($sql); 68 $stm->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); 69 $stm->bindValue(':mail', $mail, PDO::PARAM_STR); 70 $stm->execute(); 71 $pdo = null; 72 $message = "入力されたメールアドレスにメールを送信しました。メールに記載されたURLからご登録ください。"; 73 } catch (PDOException $e) { 74 print('Error:'.$e->getMessage()); 75 die(); 76 } 77 /* 78 * メール送信処理 79 * 登録されたメールアドレスへメールをお送りする。 80 */ 81 $mailTo = $mail; 82 $body = <<< EOM 83 この度はご登録いただきありがとうございます。 84 24時間以内に下記のURLからご登録下さい。 85 $url 86 EOM; 87 88 mb_language('ja'); 89 mb_internal_encoding('UTF-8'); 90 91 //Fromヘッダを作成 92 $header = 'From: ' . mb_encode_mimeheader($companyname). '<' . $companymail. '>'; 93 94 if (mb_send_mail($mailTo, $registation_subject, $body, $header, '-f'. $companymail)) { 95 $_SESSION = array(); 96 if (isset($_COOKIE["PHPSESSID"])) { 97 setcookie("PHPSESSID", '', time() - 1800, '/'); 98 } 99 session_destroy(); 100 $message = "入力されたメールアドレスにメールを送信しました。メールに記載されたURLからご登録ください。"; 101 } else { 102 $errors['mail_error'] = "メールの送信に失敗しました。"; 103 } 104 } 105 } 106?> 107<div class="container"> 108 <h1>Sign Up!!</h1> 109 <?php if (isset($_POST['submit']) && count($errors) === 0): ?> 110 <!-- 登録完了画面 --> 111 <p><?=$message?></p> 112 <p>↓TEST用(後ほど削除):このURLが記載されたメールが届きます。</p> 113 <a href="<?=$url?>"><?=$url?></a> 114 <?php else: ?> 115 <!-- 登録画面 --> 116 <?php if(count($errors) > 0): ?> 117 <?php 118 foreach($errors as $value) { 119 echo "<p class='error'>".$value."</p>"; 120 } 121 ?> 122 <?php endif; ?> 123 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post"> 124 <p>メールアドレス:<input type="text" name="mail" size="50" value="<?php if( !empty($_POST['mail']) ){ echo $_POST['mail']; } ?>"></p> 125 <input type="hidden" name="token" value="<?=$token?>"> 126 <input type="submit" name="submit" value="送信"> 127 </form> 128 <?php endif; ?> 129</div> 130</body> 131</html>

試したこと

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

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

CentOS7
さくらのVPS
PHP 7.1.33
mysql 5.7.31

質問者は超初心者です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/11/10 04:21

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

回答1

0

ベストアンサー

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

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

警告

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

参照

投稿2020/11/10 03:58

編集2020/11/10 03:59
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2020/11/10 04:54 編集

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

2020/11/12 02:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問