解決したい事
動画を見ながらお問い合わせフォームを作成中なのですが、ブラウザで入力した値がデータベースに
反映されず、アパッチのログにこちらのエラーが出ます。
apache
1[authz_core:error] [pid 13628] [client ::1:54775] AH01630: client denied by server configuration: /Applications/MAMP/htdocs/php_test/.DS_Store
エラーの出るタイミングはlocalhost:8888に繋いだ瞬間です。
試したこと
httpd-vhosts.confに<Directoryが何もなかったのでリンク内容の記事を参考に丸々追加。
</VirtualHost>
<Directory /Applications/MAMP/htdocs/>
Options FollowSymlinks Includes
AllowOverride All
AddType text/html .html
Require all granted
</Directory>
<VirtualHost *:80>
httpd.confの中にRequire all grantedを書きました。
追記
MAMP再インストール後、エラーで止まってるところまでのコードをudemyからダウンロードし、
mysqlにテーブルとユーザーを作り、エラーで止まる前までの動作確認は異常なし。
ローカルホストに繋いだ瞬間にclient denied by server configurationとエラーは出ましたが、
一応ブラウザのinput.phpからフォームに値を入れ、送信するも反映されません。
後は、MAMP起動時に前回のエラーも出でいたので、解決するためこちらのコードをターミナルで実行しました。
cd /Applications/MAMP/Library/pg/lib
rm libpq.5.dylib
rm libpq.dylib
ln -s libpq.5.7.dylib libpq.5.dylib
ln -s libpq.5.7.dylib libpq.dylib
補足情報(FW/ツールのバージョンなど)
Apache/2.4.46 (Unix) OpenSSL/1.0.2u PHP/7.4.9 mod_wsgi/3.5 Python/2.7.13 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.30.1
inputphp
1<?php 2 3session_start(); 4 5require 'validation.php'; 6 7header('X-FRAME-OPTIONS:DENY'); 8 9// スーパーグローバル変数 php 9種類 10// 連想配列 11if(!empty($_POST)){ 12 echo '<pre>'; 13 var_dump($_POST) ; 14 echo '</pre>'; 15} 16 17function h($str) 18{ 19 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 20} 21 22 23// 入力、確認、完了 input.php, confirm.php, thanks.php 24// CSRF 偽物のinput.php->悪意のあるページ 25// input.php 26 27$pageFlag = 0; 28$errors = validation($_POST); 29 30if(!empty($_POST['btn_confirm']) && empty($errors)){ 31 $pageFlag = 1; 32} 33if(!empty($_POST['btn_submit'])){ 34 $pageFlag = 2; 35} 36 37 38?> 39 40<!doctype html> 41<html lang="ja"> 42 <head> 43 <!-- Required meta tags --> 44 <meta charset="utf-8"> 45 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 46 47 <!-- Bootstrap CSS --> 48 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> 49 50 <title>Hello, world!</title> 51 </head> 52<body> 53 54 55<?php if($pageFlag === 1 ) : ?> 56<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 57<form method="POST" action="input.php"> 58氏名 59<?php echo h($_POST['your_name']) ;?> 60<br> 61メールアドレス 62<?php echo h($_POST['email']) ;?> 63<br> 64ホームページ 65<?php echo h($_POST['url']) ;?> 66<br> 67性別 68<?php 69 if($_POST['gender'] === '0'){ echo '男性'; } 70 if($_POST['gender'] === '1'){ echo '女性'; } 71?> 72<br> 73年齢 74<?php 75 if($_POST['age'] === '1'){ echo '〜19歳' ;} 76 if($_POST['age'] === '2'){ echo '20歳〜29歳' ;} 77 if($_POST['age'] === '3'){ echo '30歳〜39歳' ;} 78 if($_POST['age'] === '4'){ echo '40歳〜49歳' ;} 79 if($_POST['age'] === '5'){ echo '50歳〜59歳' ;} 80 if($_POST['age'] === '6'){ echo '60歳〜' ;} 81?> 82 83<br> 84お問い合わせ内容 85<?php echo h($_POST['contact']) ;?> 86<br> 87 88<input type="submit" name="back" value="戻る"> 89<input type="submit" name="btn_submit" value="送信する"> 90<input type="hidden" name="your_name" value="<?php echo h($_POST['your_name']) ;?>"> 91<input type="hidden" name="email" value="<?php echo h($_POST['email']) ;?>"> 92<input type="hidden" name="url" value="<?php echo h($_POST['url']) ;?>"> 93<input type="hidden" name="gender" value="<?php echo h($_POST['gender']) ;?>"> 94<input type="hidden" name="age" value="<?php echo h($_POST['age']) ;?>"> 95<input type="hidden" name="contact" value="<?php echo h($_POST['contact']) ;?>"> 96<input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']) ;?>"> 97</form> 98 99<?php endif; ?> 100 101<?php endif; ?> 102 103<?php if($pageFlag === 2 ) : ?> 104<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 105送信が完了しました。 106 107<?php unset($_SESSION['csrfToken']); ?> 108<?php endif; ?> 109<?php endif; ?> 110 111 112<?php if($pageFlag === 0 ) : ?> 113<?php 114if(!isset($_SESSION['csrfToken'])){ 115 $csrfToken = bin2hex(random_bytes(32)); 116 $_SESSION['csrfToken'] = $csrfToken; 117} 118$token = $_SESSION['csrfToken']; 119?> 120 121<?php if(!empty($errors) && !empty($_POST['btn_confirm']) ) : ?> 122<?php echo '<ul>' ;?> 123<?php 124 foreach($errors as $error){ 125 echo '<li>' . $error . '</li>' ; 126 } 127?> 128<?php echo '</ul>' ; ?> 129 130<?php endif ;?> 131 132<div class="container"> 133 <div class="row"> 134 <div class="col-md-6"> 135 <form method="POST" action="input.php"> 136 <div class="form-group"> 137 <label for="your_name">氏名</label> 138 <input type="text" class="form-control" id="your_name" name="your_name" value="<?php if(!empty($_POST['your_name'])){echo h($_POST['your_name']) ;} ?>" required> 139 </div> 140 141 <div class="form-group"> 142 <label for="email">メールアドレス</label> 143 <input type="email" class="form-control" id="email" name="email" value="<?php if(!empty($_POST['email'])){echo h($_POST['email']) ;} ?>" required> 144 </div> 145 146 <div class="form-group"> 147 <label for="url">ホームページ</label> 148 <input type="url" class="form-control" id="url" name="url" value="<?php if(!empty($_POST['url'])){echo h($_POST['url']) ;} ?>"> 149 </div> 150 151性別 152 <div class="form-check form-check-inline"> 153 <input class="form-check-input" type="radio" name="gender" id="gender1" value="0" 154 <?php if(!empty($_POST['gender']) && $_POST['gender'] === '0' ) 155 { echo 'checked'; } ?>> 156 <label class="form-check-label">男性</label> 157 <input class="form-check-input" type="radio" name="gender" id="gender2" value="1" 158 <?php if(!empty($_POST['gender']) && $_POST['gender'] === '1' ) 159 { echo 'checked'; } ?>> 160 <label class="form-check-label">女性</label> 161 </div> 162 163 <div class="form-group"> 164 <label for="age">年齢</label> 165 <select class="form-control" id="age" name="age"> 166 <option value="">選択してください</option> 167 <option value="1">〜19歳</option> 168 <option value="2">20歳〜29歳</option> 169 <option value="3">30歳〜39歳</option> 170 <option value="4">40歳〜49歳</option> 171 <option value="5">50歳〜59歳</option> 172 <option value="6">60歳〜</option> 173 </select> 174 </div> 175 176 <div class="form-group"> 177 <label for="contact">お問い合わせ内容</label> 178 <textarea class="form-control" id="contact" row="3" name="contact"> 179 <?php if(!empty($_POST['contact'])){echo h($_POST['contact']) ;} ?> 180 </textarea> 181 </div> 182 183 <div class="form-check"> 184 <input class="form-check-input" type="checkbox" id="caution" name="caution" value="1"> 185 <label class="form-check-label" for="caution">注意事項にチェックする</label> 186 </div> 187 188 <input class="btn btn-info" type="submit" name="btn_confirm" value="確認する"> 189 <input type="hidden" name="csrf" value="<?php echo $token; ?>"> 190 </form> 191 192 </div><!-- .col-md-6 --> 193 </div> 194</div> 195 196<?php endif; ?> 197 198 <!-- Optional JavaScript --> 199 <!-- jQuery first, then Popper.js, then Bootstrap JS --> 200 <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> 201 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> 202 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script> 203 </body> 204</html> 205 206
validationphp
1<?php 2 3function validation($request){ //$_POST連想配列 4 5 $errors = []; 6 7 if(empty($request['your_name']) || 20 < mb_strlen($request['your_name']) ){ 8 $errors[] = '「氏名」は必須です。20文字以内で入力してください。'; 9 } 10 11 if(empty($request['email']) || !filter_var($request['email'], FILTER_VALIDATE_EMAIL)){ 12 $errors[] = '「メールアドレス]は必須です。正しい形式で入力してください。'; 13 } 14 15 if(!empty($request['url'])){ 16 if(!filter_var($request['url'], FILTER_VALIDATE_URL)){ 17 $errors[] = '「ホームページ」は正しい形式で入力してください。'; 18 } 19 } 20 21 if(!isset($request['gender'])){ 22 $errors[] = '「性別」は必須です。'; 23 } 24 25 if(empty($request['age']) || 6 < $request['age']){ 26 $errors[] = '「年齢」は必須です。' ; 27 } 28 29 30 if(empty($request['contact']) || 200 < mb_strlen($request['contact']) ){ 31 $errors[] = '「お問い合わせ内容」は必須です。200文字以内で入力してください。'; 32 } 33 34 if(empty($request['caution'])){ 35 $errors[] = '「注意事項」をご確認ください。'; 36 } 37 38 return $errors; 39} 40 41?>
回答1件
あなたの回答
tips
プレビュー