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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1637閲覧

PHPでボタン押下時のDB登録と画面遷移がうまくいかない

YOHEI_

総合スコア6

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2020/03/17 13:31

編集2020/03/19 13:20

PHPの教本を見ながら勉強をしているのですが
ボタン押下時のDB登録と画面遷移がうまくいきません。

↓以下のエラーが発生する
このページは動作していませんlocalhost では現在このリクエストを処理できません。
HTTP ERROR 500

何が原因でエラーになっているのでしょうか?

【問題のボタン】
check.phpの登録ボタン

【画面遷移の本来の動き】
index.php→check.php(dbconnect.php)→thanks.php

index.php

<?php session_start(); /*フォームが空じゃないか?*/ if(!empty($_POST)){ //エラー項目の確認 if($_POST['name'] == ''){ $error['name'] = 'blank'; } if($_POST['email'] == ''){ $error['email'] = 'blank'; } if(strlen($_POST['password']) < 4){ $error['password'] = 'length'; } if($_POST['password'] == ''){ $error['password'] = 'blank'; } if(empty($error)){ $_SESSION['join'] = $_POST; header('Location: check.php'); exit; } } if($_REQUEST['action'] == 'rewrite') { $_POST = $_SESSION['join']; $error['rewrite'] = true; } ?> <p>次のフォームに必要事項を記入してください</p> <form action="" method="post" enctype="multipart/form-data"> <dl> <dr>ニックネーム<span class="required">必須</span></dr> <dd> <input type="text" name="name" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['name'],ENT_QUOTES); ?>"/> <?php if($error['name'] == 'blank'): ?> <p class="error">ニックネームを入力してください</p> <?php endif ; ?> </dd> <dr>メールアドレス<span class="required">必須</span></dr> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['name'],ENT_QUOTES); ?>"/> <?php if($error['email'] == 'blank'): ?> <p class="error">メールアドレスを入力してください</p> <?php endif ; ?> </dd> <dr>パスワード<span class="required">必須</span></dr> <dd> <input type="password" name="password" size="10" maxlength="20" /> <?php if($error['password'] == 'blank'): ?> <p class="error">パスワードを入力してください</p> <?php endif ; ?> <?php if(empty($_POST) != true and strlen($_POST['password']) < 4): ?> <p class="error">パスワードは4文字以上を入力してください</p> <?php endif ; ?> </dd> <dt>写真など</dt> <dd> <input type="file" name="image" size="35" /> <?php if($error['image'] == 'type'): ?> <p class="error">写真などは[.gif]または[.jpg]の画像を指定してください</p> <?php endif; ?> <?php if(!empty($error)): ?> <p class="error">恐れ入りますが、画像を改めて指定してください</p> <?php endif; ?> </dd> </dl> <div><input type="submit" value="入力内容を確認する" /></div> </form>

check.php

<?php session_start(); require('dbconnect.php'); if(!isset($_SESSION['join'])){ header('Location: index.php'); exit(); } echo $_SESSION['join']['image']; // 教本のdb実行部分をもう一度見直す // $_POSTのようなスーパーグローバル変数は上書きしない // headerはpostではなくgetで飛ぶ if(!empty($_POST)){ var_dump($_POST); echo "<br>"; var_dump($_SESSION); echo "<br>"; var_dump($db); //登録処理をする try{ $statement = $db->prepare('INSERT INTO members (name,email,password,image) VALUES (:name, :email, :password, :image)'); $statement->bindValue(':name',$_SESSION['join']['name']); $statement->bindValue(':email',$_SESSION['join']['email']); $statement->bindValue(':password',$_SESSION['join']['password']); $statement->bindValue(':picture',$_SESSION['join']['image']); $kekka = $statement->execute(); var_dump($kekka); }catch(PDOException $e){ echo "エラー" . $e->getMessage(); }finally{ unset($_SESSION['join']); // header('Location: thanks.php'); exit(); } } ?> <?php var_dump($_POST); echo "<br>"; var_dump($_SESSION); echo "<br>"; ?> <p>次のフォームに必要事項を記入してください</p> <form action="" method="post"> <input type="hidden" name="action" value="submit" /> <dl> <dr>ニックネーム</dr> <dd><?php echo htmlspecialchars($_SESSION['join']['name'],ENT_QUOTES); ?></dd> <dr>メールアドレス</dr> <dd><?php echo htmlspecialchars($_SESSION['join']['email'],ENT_QUOTES); ?></dd> <dr>パスワード</dr> <dd>【パスワードは表示されません】</dd> <dt>写真など</dt> <dd> <img src="../member_picture/<?php echo htmlspecialchars($_SESSION['join']['image'],ENT_QUOTES); ?>" width="100" height="100" alt=""> </dd> </dl> <div> <a href="index.php?action=rewrite">&laquo:&nbsp:書き直す</a> <input type="submit" value="登録する" /> </div> </form>

dbconnect.php

<?php try { $db = new PDO('mysql:dbname=mini_bbs;host=localhost:8889;charset=utf8','root','root'); } catch (PDOException $e){ echo 'DB接続エラー:' . $e->getMessage(); } ?>

thanks.php

<p>ユーザー登録が完了しました</p> <p><a href="../">ログインする</a></p>

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

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

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

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

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

m.ts10806

2020/03/17 13:43 編集

どこから突っ込んだら良いのでしょう。 望ましくない実装もあるし、細かいところなら幾らでも出せますが(全部書き出してるとそれはそもそも質問に対する回答ではなくなるので難しいですね)。
YOHEI_

2020/03/18 14:16

m.ts10806さん ありがとうございます。お言葉に甘えて質問のcheck.phpのif(!empty($_POST))内を修正しました。 var_dumpをSQL実行前と実行後に配置したところ、 実行前はobject(PDO)#1 (0) { } 実行後はbool(false)と出力されたためSQLを設定しているあたりがおかしいと考えているのですが そこで詰まっている状態です。 何か気になる点ありますでしょうか?
m.ts10806

2020/03/18 14:24

回答にコメントつけてください。こちらはあくまで質問への追記修正依頼に関するコメント欄です。
guest

回答1

0

直接の原因ではないですけど簡単に2点だけ。

  • $_POSTのようなスーパーグローバル変数は上書きしてはいけません
  • header()等でリダイレクトしたときのリクエストメソッドはPOSTではなくGETです。

投稿2020/03/17 13:48

m.ts10806

総合スコア80875

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

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

YOHEI_

2020/03/17 14:38

ご回答ありがとうございます。 教えていただいたことを参考にもう少し考えてみます。
m.ts10806

2020/03/17 20:55

えーっと 「考えてみる」だとダメだったときに同じ質問を繰り返すことになります。 できれば、試してからどうだったかフィードバックして、 ここで解決しませんか? 「解決済み」は「受付中」に戻せます。 質問も回答も何度でも編集できます。
YOHEI_

2020/03/18 14:32

m.ts10806さん 失礼しました。こちらに転記させていただきます。 質問のcheck.phpのif(!empty($_POST))内を修正しました。 var_dumpをSQL実行前と実行後に配置したところ、 実行前はobject(PDO)#1 (0) { } 実行後はbool(false)と出力されたためSQLを設定しているあたりがおかしいと考えているのですが そこで詰まっている状態です。 何か気になる点ありますでしょうか?
m.ts10806

2020/03/18 21:02

内・・・・では意味なく、そもそもcheck.phpにはheaderでリダイレクトで飛んできているので $_POSTはemptyであるというのが回答の主旨です。 $_POST自体をvar_dump()してみては? あとは$_SESSIONも念のため。 そしてbindParamよりbindValueのほうが望ましいようです。 https://qiita.com/_dozen_/items/f6239cf1bdab6f8b0026 もう1つ。 try-catchですが、DBコネクションでエラーが出るときって一度確立したらほぼないので、 むしろSQL実行のところに必須です。そちらにも入れてException拾ってください。 var_dump()によるデバッグを試みるのは良いことですが、DBに関してはPHPからすると外部の仕組みなので、もう1つ入れてステップアップしましょう。
YOHEI_

2020/03/19 13:42

m.ts10806さん 丁寧にご説明いただきありがとうございます。 ご指摘いただいたcheck.phpの部分を修正しました。 $_POSTをif外に記述(formの直前)したところおっしゃられた通り$_POSTの中身は空でした。 $_SESSIONに関しては前の画面で入力した項目が正常に送られてきていることが確認できました。
YOHEI_

2020/03/19 13:48

すいません。index.phpのところで画像を設定してなかったのがSQLがうまく動かない原因かもしれないです。ただ、確認するボタン押下時にうまく画像を取得できていないようで index.phpのsession_start();の真下にecho var_dump($_FILES['image']['name']);を記載しても NULLから値が全く変わらないです。 なぜうまく受け取れていないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問