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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

582閲覧

削除、編集完了ページのみforbidden You don't have permission to access this resourceと表示されてしまう。

arichanstudy

総合スコア8

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2023/02/22 08:21

実現したいこと

Forbidden
You don't have permission to access this resourceを解決して編集や削除完了ページに移動したいです。

前提

ここに質問の内容を詳しく書いてください。
phpでtodoリストを作成しています。
編集ページ→確認ページ→編集完了ページと移動していきたいのですが、なぜか編集確認ページ→編集完了ページ、削除確認ページから削除完了ページに移動しようとするとForbidden
You don't have permission to access this resource. Apache/2.4.54 (Win64) OpenSSL/1.1.1p PHP/8.2.0 Server at localhost Port 80というような表示が出てしまい、urlはhttp://localhost/todoapp/newtask_delete_done.php%3E%3Cinput%20type=というようなものに変わってしまいます。なぜか編集ページ、削除ページからそれぞれ編集完了、削除完了ページには確認ページを挟まない場合は移動できます。

特に設定をいじったりはしていません。また、これまでに同じような確認ページから完了ページへといったようなサイトを作成しましたが、forbiddenされてしまうことはありませんでした。
解決方法や解決するために読むべきサイトなどがありましたら教えて頂けると嬉しいです。

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

エラーメッセージはなし 編集ページ→確認ページ→編集完了ページと移動していきたいのですが、なぜか編集確認ページ→編集完了ページ、削除確認ページから削除完了ページに移動しようとするとForbidden You don't have permission to access this resource. Apache/2.4.54 (Win64) OpenSSL/1.1.1p PHP/8.2.0 Server at localhost Port 80というような表示が出てしまい、urlはhttp://localhost/todoapp/newtask_delete_done.php%3E%3Cinput%20type=というようなものに変わってしまう。

該当のソースコード

php

1newtask_delete.php 2<!doctype html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" 7 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 8 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 9 <title>Delete Page</title> 10</head> 11<body> 12<?php 13try { 14 require_once('putTogether.php'); 15 //$newtask_title = filter_input(INPUT_POST, 'title'); 16 $NewTaskNum = filter_input(INPUT_GET, 'ID'); 17 18 require_once('db_connect.php'); 19 db_connect(); 20 $dbh = db_connect(); 21 22 $sql = 'SELECT title, content FROM posts WHERE ID= :ID'; 23 $stmt = $dbh->prepare($sql); 24 $stmt->bindParam(":ID", $NewTaskNum, PDO::PARAM_STR); 25 $stmt->execute(); 26 27 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 28 $NewTaskTitle = $rec['title']; 29 $NewTaskContents = $rec['content']; 30} catch (Exception $e) { 31 $e->getMessage(); 32 exit(); 33} 34 35 36?> 37<h1> 38 ToDo Delete Page 39</h1> 40<form action="newtask_delete_check.php" method="post"> 41<input type="hidden" name="newtask_code" value="<?php echo $NewTaskNum;?>"> 42<div style="margin: 10px"> 43 <label for="title">タイトル:</label> 44 <input type="text" name="title" value="<?php echo $NewTaskTitle;?>"> 45 </div> 46 <div style="margin: 10px"> 47 <label for="content">内容:</label> 48 <input type="text" name="content" value="<?php echo $NewTaskContents;?>"> 49 50 </div> 51 <button type="submit" name="post">削除する</button> 52 <button type="button" onclick="history.back()">戻る</button> 53</form> 54 55</body> 56</html>

php

1newtask_delete_check.php 2<!doctype html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" 7 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 8 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 9 <title>check Page</title> 10</head> 11<body> 12<?php 13require_once('putTogether.php'); 14require_once('check.php'); 15 16try { 17 TitleCheck($NewTaskTitle); 18 ContentCheck($NewTaskContents); 19 LengthCheck($NewTaskTitle); 20 //titleとcontentがあってタイトル<20 21 if ($NewTaskTitle != '' && $NewTaskContents != '' && mb_strlen($NewTaskTitle) < $limit) { 22 echo '<form method="post" action="newtask_delete_done.php>'; 23 echo '<input type="hidden" name="newtask_code" value="'.$NewTaskNum.'">'; 24 echo '<input type="hidden" name="title" value="'.$NewTaskTitle.'">'; 25 echo '<input type="hidden" name="contents" value="'.$NewTaskContents.'">'; 26 echo '<input type="button" onclick="history.back()" value="戻る">'; 27 echo '<input type="submit" value="OK">'; 28 echo '</form>'; 29 } else { 30 echo '<form>'; 31 echo '<input type="button" onclick="history.back()" value="戻る">'; 32 echo '</form>'; 33 } 34} catch (Exception $e) { 35 exit($e->getMessage()); 36} 37?> 38</body> 39</html>

php

1newtask_delete_done.php 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <title>Delete done page</title> 9</head> 10<body> 11<?php 12try { 13 require_once('putTOgether.php'); 14 require_once('db_connect.php'); 15 $NewTaskNum = filter_input(INPUT_POST, 'newtask_code'); 16 17 db_connect(); 18 $dbh = db_connect(); 19 20 $sql = 'DELETE FROM posts WHERE ID= :ID'; 21 $stmt = $dbh->prepare($sql); 22 $stmt->bindParam(":ID", $newtasknum, PDO::PARAM_STR); 23 $stmt->execute(); 24} catch (Exception $e) { 25 exit($e->getMessage()); 26} 27?> 28<?php echo $NewTaskTitle; ?> 29<p>を削除しました</p> 30<br> 31<a href="list.php">戻る</a> 32</body> 33</html>

試したこと

teratailで同じような質問があるか調べる。
書籍と削除、編集確認ページのコードを確認する。
削除ページと確認ページのページの移動の仕方を確認して違いがないかを考える。

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答

echo '<form method="post" action="newtask_delete_done.php>';

echo '<form method="post" action="newtask_delete_done.php">';

回答にたどり着いた経路

  1. まず、直接アクセスすればアクセス出来るのに、フォーム経由だとhttp://localhost/todoapp/newtask_delete_done.php%3E%3Cinput%20type=というようなものに変わってしまいます。というところに注目
  2. フォームでPOST先を指定するのはaction=xxxxの部分なので、恐らくここに何か問題があるのだろうと予測
  3. ``http://localhost/todoapp/newtask_delete_done.php%3E%3Cinput%20type=`の`newtask_delete_done.php%3E%3Cinput%20type=`は知らないと気づけないですが、URLエンコードされている文字列です。デコードすると(URLデコードとかで検索してみてください)
  4. URLデコードしてみるとnewtask_delete_done.php><input type=になっている
  5. もう一度、action=xxxxのところを見てみると、ダブルクオートから次の行のダブルクォートの文字列だと気づく
  6. ダブルクォートが閉じられていないのできちんと閉じる

という感じです。

投稿2023/02/22 09:10

編集2023/02/22 09:20
tanat

総合スコア18713

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

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

arichanstudy

2023/02/22 09:15

すみません。本当に初歩的なミスでした。tanatさん、教えてくださって本当にありがとうございました!
tanat

2023/02/22 09:25

このミス自体はあるあるだと思うので、エラーに%が含まれる文字列があったら、URLデコードをしてみるといいかなと思います。 回答の経路を追記しましたので、参考になれば幸いです。 あとは、PHPのコードだけでは無く、各画面で生成されたHTML(ブラウザ右クリック→ソースの表示)でも確認するようにすると、原因に気づきやすくなりますね。
arichanstudy

2023/02/28 01:50

返信が遅くなってしまって申し訳ございません。承知しました!エラーに%が含まれる文字列があった際には試してみようと思います。また、解答の経路も教えてくださってありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問