前提・実現したいこと
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
質問者は超初心者です。
回答1件
あなたの回答
tips
プレビュー