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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

MySQL

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

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

0回答

354閲覧

PHP 記事一覧ページから記事表示ページへの遷移 ID 遷移できない

DjangoUser

総合スコア25

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

MySQL

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

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2024/09/08 12:59

編集2024/09/13 06:58

実現したいこと

・ページ遷移をして記事の内容を表示させる。

前提

PHPで記事の一覧ページと閲覧ページを作成していました。
そこで、リンクをクリックしてもページ遷移ができない状態になりました。

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

ページリンクをクリックしても元のページに戻されてしまいます。
Apacheのログを確認したところ、302というステータスコードが確認できました。

::1 - - [08/Sep/2024:21:39:56 +0900] "GET /アプリ名/member/common/article.php?id=1 HTTP/1.1" 302 1699 ::1 - - [08/Sep/2024:21:39:56 +0900] "GET /アプリ名/member/common/articles_list.php HTTP/1.1" 200 1309

該当のソースコード

記事一覧ページ(articles_list.php)

PHP

1<?php 2session_save_path('../session'); 3include('../../php_include/login_check.php'); 4if(empty($_SESSION['username'])){ 5 header("Location:/トップページ"); 6 exit(); 7} 8?> 9<!DOCTYPE html> 10<html lang="ja"> 11<head> 12 <meta charset="UTF-8"> 13 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 14 <link rel="stylesheet" href="../../css/style.css" type="text/css"> 15 <link rel="icon" type="image/png" href="./img/favicon.png"> 16 <link rel="apple-touch-icon" href="../../img/favicon.png"> 17 <meta name="application-name" content="アプリ名"/> 18 <meta name="msapplication-square150x150logo" content="../../img/favicon.png"> 19 <title>記事一覧</title> 20</head> 21<body> 22 <div class="header"> 23 <h1>タイトル</h1> 24 <hr> 25 </div> 26 <div class="articles_list"> 27 <h2>記事一覧</h2> 28 <p>見たい記事を選択してください。</p> 29 <?php 30 //データベース接続 31 $dsn = "mysql:host=localhost;dbname=データベース名"; 32 $username = "root"; 33 $password = ""; 34 $db = new PDO($dsn, $username, $password); 35 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 36 37 //全記事を抽出 38 $statement = $db->prepare("SELECT * FROM articles ORDER BY time ASC"); 39 $statement->execute(); 40 echo "<table>"; 41 echo "<tr><th>ID</th><th>タイトル</th><th>投稿日時</th><th>投稿者</th></tr>"; 42 while ($row = $statement->fetch()){ 43 echo "<tr>"; 44 echo "<td>" . (int)$row['id'] . "</td>"; 45 echo '<td><a href="article.php?id=' . (int)$row['id'] . "\">" . $row['title'] . "</a>"; 46 echo "<td>" . $row['time'] . "</td>"; 47 echo "<td>" . $row['writer'] . "</td>"; 48 echo "</tr>"; 49 } 50 echo "</table>"; 51 $statement = null; 52 ?> 53 </div> 54 <a href="javascript:history.back()">前のページに戻る</a> 55</body> 56</html>

記事表示部分(article.php)

PHP

1<?php 2$id = $_GET['id']; 3session_save_path('../session'); 4include('../../php_include/login_check.php'); 5if(empty($_SESSION['username'])){ 6 header("Location:/アプリ名"); 7 exit(); 8} 9if (isset($id)){ 10 //データベース接続 11 $dsn = "mysql:host=localhost;dbname=データベース名"; 12 $username = "root"; 13 $password = ""; 14 try{ 15 $db = new PDO($dsn, $username, $password); 16 //記事内容を抽出 17 $statement = $db->prepare("SELECT * FROM articles where id=:id"); 18 $statement->bindValue(':id', (int)$id,PDO::PARAM_INT); 19 $statement->execute(); 20 $row = $statement->fetch(PDO::FETCH_ASSOC); 21 if(empty($row)){ 22 exit('記事がありません。'); 23 } 24 $statement = null; 25 } catch (PDOException $e){ 26 echo "接続失敗" . $e->getMessage(); 27 exit(); 28 }; 29} else{ 30 exit('IDがありません。'); 31} 32?> 33<!DOCTYPE html> 34<html lang="ja"> 35<head> 36 <meta charset="UTF-8"> 37 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 38 <link rel="stylesheet" href="../../css/style.css" type="text/css"> 39 <link rel="icon" type="image/png" href="./img/favicon.png"> 40 <link rel="apple-touch-icon" href="../../img/favicon.png"> 41 <meta name="application-name" content="<?php echo $row["title"]; ?>|アプリ名"/> 42 <meta name="msapplication-square150x150logo" content="../../img/favicon.png"> 43 <title><?php echo $row['title']; ?>|アプリ名</title> 44</head> 45<body> 46 <div class="header"> 47 <h1>タイトル</h1> 48 </div> 49<div class="articles"> 50 <article> 51 <h2><?php echo $row['title'] ?></h2> 52 <p>投稿日時:<?php echo $row['time'] ?></p> 53 <p>作成者:<?php echo $row['writer'] ?></p> 54 <p><?php echo $row['text'] ?></p> 55 <?php 56 if(isset($row['addfiles'])){ 57 if (exif_imagetype($row['addfiles'])){ 58 $img = base64_encode($row['addfiles']); 59 echo "<img src=" . "data:" . $row['addfiles_ContentType']; 60 } 61 } 62 ?> 63 </article> 64 <div class="comment_confirmation"> 65 <p class="modal_title">この記事にコメントしますか?</p> 66 <form method="post" action="../../php_include/add_comments.php" enctype="multipart/form-data"> 67 <textarea class="textarea form-control" placeholder="コメントを入力してください" name="comment_text"></textarea> 68 <div class="comment_files"> 69 <input type="file" name="file_name" class="comment_files" multiple> 70 </div> 71 <input type="hidden" name="title" value="<?php $row['title'] ?>"> 72 <div class="post_btn"> 73 <button type="submit" name="comment" value="comment">コメント</button> 74 <button type="button">キャンセル</button> 75 </div> 76 <?php 77 include_once "../../php_include/add_comments.php"; 78 echo $comment_msg; 79 ?> 80 </form> 81 </div> 82 <a href="javascript:history.back()">前のページに戻る</a> 83 </div> 84</body> 85</html>

試したこと

インターネット検索→該当記事なし
Apacheログの確認→上記の結果に
$_GET['id']の存在確認→存在
defineの使用→失敗

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

PHP 8.3.10←質問記入時アップデートを確認したため、回答時には8.3.11になっている可能性大
Apache 2.4.62
Windows 11 23H2
Visual Studio Code 1.93.0
※プライバシー保護のため、アプリ名やデータベース名、タイトルなどは実際のものと異なります。

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

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

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

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

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

yukkuri_55

2024/09/08 23:29

ちょっと自信ありませんが、articles_list.phpの45行目の部分 echo '<td><a href="article.php?id=' . (int)$row['id'] . "\">" . $row['title'] . "</a>"; href=" とありますが、\" とエスケープシーケンスを忘れていませんか?
DjangoUser

2024/09/10 10:46

該当箇所を echo "<td>" . "<a href=" . "article.php?id=" . (int)$row['id'] . ">" . $row['title'] . "</a></td>"; と修正しましたが、リンク先からリダイレクトされて元のページに戻ってきてしまいました。
yukkuri_55

2024/09/10 22:39

echo '<td><a href="article.php?id=' . (int)$row['id'] . "\">" . $row['title'] . "</a>"; を echo '<td><a href="\article.php?id=' . (int)$row['id'] . "\">" . $row['title'] . "</a>"; と変更したらどうなりますか? " と ' の関係がわかってないような・・・
yukkuri_55

2024/09/10 22:48

<a href=\"article.php? ですね、\を反対方向につけてしまいました。
yukkuri_55

2024/09/11 07:47

apache 302 原因 などのキーワードで検索すると https://www.google.com/search?q=%E5%8E%9F%E5%9B%A0+apache+302&rlz=1C1GCEA_enJP1126JP1126&oq=%E5%8E%9F%E5%9B%A0%E3%80%80apache+302&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIICAEQABgIGB4yCAgCEAAYCBgeMgoIAxAAGKIEGIkFMgoIBBAAGIAEGKIEMgoIBRAAGKIEGIkFMgoIBhAAGIAEGKIE0gEINTE3NWowajeoAgCwAgA&sourceid=chrome&ie=UTF-8 Apacheで発生する302エラーの原因として、リダイレクト先のURL設定ミスが考えられます。WordPressや.htaccessファイルなどを開き、リダイレクト先のURLが適切に記載されているか確認しましょう。 302エラーは、HTTPステータスコードの一種で、「302リダイレクト」とも呼ばれます。Webサイトにアクセスしたユーザーを一時的に別のURLへと自動で転送する設定がされた場合に表示されます。 302リダイレクトは、システムメンテナンスやA/Bテストなどの場面で多く用いられます。サイトのリニューアルにおける本番実装やメンテナンス中において、一時的に準備中を説明するページへユーザーを遷移させる際などに使用されます。 とでます。 [調べもの] <?php $row['id'] = 1; $row['title'] = 'テキスト'; echo "<td>" . "<a href=" . "article.php?id=" . (int)$row['id'] . ">" . $row['title'] . "</a></td>"; echo "<td>" . "<a href=\"" . "article.php?id=" . (int)$row['id'] . "\">" . $row['title'] . "</a></td>"; ?> としたところ、結果は同じでした。ごめんなさい。
kirin311

2024/09/11 22:37

>該当箇所を >echo "<td>" . "<a href=" . "article.php?id=" . (int)$row['id'] . ">" . $row['title'] . "</a></td>"; >と修正しましたが、リンク先からリダイレクトされて元のページに戻ってきてしまいました。 リンク先からリダイレクトというのであれば、header関数の処理に問題ありそうですね。
DjangoUser

2024/09/12 07:31 編集

header関数はログインチェック(3行目から8行目まであたり)でしか使っていません。
kirin311

2024/09/12 09:13

セッションは確認できています? 最初empty($_SESSION['username'])でログインされていたらリダイレクトされてないということでエラーが起きないのですが、別ページに飛んだらセッションが切れているということではないでしょうか? また飛んだ先のlocation先の指定も何かおかしい気がしますね。 ワードプレスですか?もしそうならお力になれそうにないです。
DjangoUser

2024/09/13 01:25

試しに同じコードをレンタルサーバーで実行してみたらページ遷移ができていました。 しかし、ローカル環境では、なぜかできないようです。
kirin311

2024/09/13 02:47

そのローカル環境云々は最初から前提に記載すべき情報なのでは? ローカル環境とサーバー環境とでは設定が違うことがあります。 それはそれとして、やはりセッション管理に問題があると思われますね。 大雑把なイメージとしては ①aタグの方で一度ページに飛ぶ ②ログインチェック ③ログインされないからLocationが実行される ④Locationで別ページに飛んだ先に302エラー といったようにログインされてないときにリダイレクト処理が実行されるわけです。 Apacheのセッション関係の設定の問題でしょうね 一度 // if(empty($_SESSION['username'])){ // header("Location:/トップページ"); // exit(); // } と // if(empty($_SESSION['username'])){ // header("Location:/アプリ名"); // exit(); // } をというようにコメントアウトしてみたらどうなりますか?(確認したら戻してください) これでローカル上でも機能するのであれば、やはりApache設定の見直ししてくださいとしか言えないです。
DjangoUser

2024/09/13 06:40 編集

該当箇所をコメントアウトしてみても同じ結果になりました。 参考として、レンタルサーバーの環境を記載しておきます。 PHP 8.3.11 MySQL 8.0.35 phpMyAdmin 5.2.1
DjangoUser

2024/09/13 06:37

WAMPやXAMPPの各最新バージョンでも試しましたが、同じ結果になりました。
tezcello

2024/09/13 14:44 編集

ご提示の Apacheのログでは /アプリ名/member/common/articles_list.php にリダイレクトされているみたいですが、ご提示のスクリプトでは > header("Location:/トップページ"); > header("Location:/アプリ名"); なので、それら(articles_list.php、article.php)以外での処理や記述に問題があるのでは? __articles_list.phpを呼び出している、あるいは、リダイレクトしているとか __mod_rewrite等の書き換えているとか... > 記事表示部分(article,php) 例えばコレみたいに、チョッとした書き間違いとか...
DjangoUser

2024/09/13 15:04

>__articles_list.phpを呼び出している、あるいは、リダイレクトしているとか __mod_rewrite等の書き換えているとか... これはどういうことでしょうか? また、書き間違いについてはほかのファイルも確認してみましたが、正しく記述されていたと思います。 質問に誤字があったようなので修正しておきました。 ほかのファイル含めて提示したほうがよろしいですか?
tezcello

2024/09/13 16:36

> これはどういうことでしょうか? コメントに書いた通り、ご提示のスクリプトは articles_list.php へのリダイレクトではなく、「トップページ」や「アプリ名」へのリダイレクトだけなので、他の場所で articles_list.php へのリダイレクトを返していないかなと思ったのです。 アプリの全体像が見えませんが、.htaccess が存在する(mod_rewriteを使っている)なら、そこでの書き換えも考慮する必要があります。 __他の方が WordPress を使用を尋ねたのはその辺りを気にしたのだろうと __WordPressじゃなくても URLの書き換えはやりますけどね > ほかのファイル含めて提示したほうがよろしいですか? 関係あるファイルであるかをよく吟味してくださいね。 全てのファイルを提示されても読む気が失せるだけですし...
DjangoUser

2024/10/05 13:54

コード下部のコメント機能のスクリプトが原因でこのリダイレクトが発生していたので、それを修正した結果、リダイレクトされなくなりました。お手数おかけして大変申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問