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

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

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

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

Q&A

解決済

2回答

5518閲覧

headerとrequireの違い。

dialbird

総合スコア379

PHP

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

0グッド

0クリップ

投稿2016/01/17 01:46

おはようございます。

PHPでログイン処理の勉強をしているものです。仕組みは、
「ログイン画面で名前とemailを入力し、login.phpへPOSTする」
「login.phpで受け取り、名前とemailがデータベースにあるか確認、なければログイン画面へ戻り、あれば次のページに名前をPOSTしつつ移行」
というものを考えています。

そこで以下のコードを打ってみたのですが、次のページまでPOSTが飛んでくれませんでした。

php

1<?php 2if(empty($_POST['name']) || empty($_POST['email'])){ //もし名前、もしくはemail欄が空っぽだったら 3 header('Location: index.php'); //ログインページに戻る 4 exit; 5}else{ 6 $pdo = new PDO('mysql:dbname=Accumile;host=localhost;charset=utf8','root',''); 7 $sql = "SELECT * FROM login_datas WHERE name = :name AND email = :email"; 8 $stmt = $pdo->prepare($sql); 9 $stmt->bindValue(':name',$_POST['name']); 10 $stmt->bindValue(':email',$_POST['email']); 11 $stmt->execute(); 12 if(!$re = $stmt->fetch(PDO::FETCH_ASSOC)){ //もし登録されていない名前だったら 13 header('Location: index.php'); //ログインページに戻る 14 exit; 15 }else{ 16 header('Location: main.php');//先のページに移動 (ここが問題の箇所です) 17 exit; 18 } 19} 20?> 21 22<!DOCTYPE html> 23<html lang="ja"> 24<head> 25</head> 26<body> 27<form action="main.php" method="post"> 28 <input type="hidden" name="name" value="<?php echo $_POST['name']?>"> 29 <input type="hidden" name="email" value="<?php echo $_POST['email']?>"> 30</form> 31</body> 32</html>

しかし、上記のコードの「問題の箇所」をheaderからrequireにすると上手くいきました!
嬉しいのですがどういうことやら理解していません。

そこでお伺いしたいのはheaderとrequireの仕組みの違いと、このような処理は果たして妥当なのか、ということです。

よろしくお願いいたします。

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

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

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

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

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

dialbird

2016/01/18 00:51

ご返答ありがとうございます! そして返答が遅れて申し訳ありません。 一回読んでみたのですが、requireの本来の使い方とはやはり違う使い方をしていたようなので、requireは使わないことにして、test_hfさんの言う通り仕組みを変えることにしました。 ご返答いただき、誠にありがとうございました!
guest

回答2

0

$stmt->execute(); if(!$re = $stmt->fetch(PDO::FETCH_ASSOC)){ //もし登録されていない名前だったら

$stmt->fetch();
の実行結果はこのコードの場合、arrayが返ります。

if(!hogehage){

は、hogehageがfalseまたはnullまたは0または"0"または""または空の配列の時、という意味(PHPはややこしいです)なので、空の配列が返ってきてるため、該当してしまいます。

というわけで、

$stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if(count($result) === 0){ //もし登録されていない名前だったら

としてください。

結果、配列が空なら、という処理です。

投稿2016/01/17 02:49

編集2016/01/17 03:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/01/17 03:11 編集

まちがい。元レスを修正しました。
退会済みユーザー

退会済みユーザー

2016/01/17 02:55

>そこでお伺いしたいのはheaderとrequireの仕組みの違いと、このような処理は果たして妥当なのか、ということです。 もう、用途が全く違います。 requireにしたら動いた、というコードはheaderをrequireにしただけではないのではないですか?
退会済みユーザー

退会済みユーザー

2016/01/17 02:55

だから、妥当ではありません。
退会済みユーザー

退会済みユーザー

2016/01/17 03:18 編集

どういうことかというと、requireはPHPプログラムの実行に先立って読み込みが実行されます。 つまり、上記のPHPコードが実行される前にmain.phpが読み込まれています。 main.phpに条件を伴わない出力があれば、それが必ず出力されます。 ですから、メールアドレス・パスワードに関係なくmain.phpの出力内容が出力されている、ということのはずです。 似たメソッドにincludeがありますが、こちらはコード該当箇所の実行時に読み込みが行われます。 ですが、この場合にはrequireもincludeも間違いで、headerが正しいコードです。 ちなみに、 >「ログイン画面で名前とemailを入力し、login.phpへPOSTする」 という仕様ですが、 header()メソッドではPOSTできません。header()ではGETメソッドで遷移します。これは仕様で、POSTメソッドでの遷移はかなりハックしないと出来ません。
退会済みユーザー

退会済みユーザー

2016/01/17 03:18

元レスを修正しました。
退会済みユーザー

退会済みユーザー

2016/01/17 03:26

根本的な間違いを修正しました。すみません。
退会済みユーザー

退会済みユーザー

2016/01/17 03:29

より完成度を上げるなら、 $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if($result === false){ echo "データベース接続エラー"; exit; } if(count($result) === 0){ //もし登録されていない名前だったら のような感じになります。
退会済みユーザー

退会済みユーザー

2016/01/17 03:34

というか、そもそもデータベースにちゃんと接続できていないのかも… 回答していていて僕自身混乱してきたんだけど、質問内容読み直すと、おかしいことだらけのような…
dialbird

2016/01/18 00:47

luckerさん!丁寧なご返答ありがとうございます! おっしゃる通りrequireの本来の使用法とかけ離れた使い方をしていたので、自分でも正しいのかなと疑問に思っていたのです。ただそれで一応自分の考えていた通りに動いてしまったので........。 headerでもGETならば送信可能なのですね。色々と試行錯誤してみます。 PDOの綺麗な書き方までご指導いただき、誠に勉強になります。 是非とも参考にさせていただきます!本当にありがとうございました!
guest

0

ベストアンサー

質問の意図とは少し違ってしまうのですが、そもそも

「ログイン画面で名前とemailを入力し、login.phpへPOSTする」
「login.phpで受け取り、名前とemailがデータベースにあるか確認、なければログイン画面へ戻り
あれば次のページに名前をPOSTしつつ移行」

これが普通の作りとしては間違っているように思います。
結果的にmain.phpに渡したいならlogin.phpの処理をmain.phpに書いてしまえば、

}else{
header('Location: main.php');//先のページに移動 (ここが問題の箇所です

exit;

}

ここの処理は不要になります。
あと、スーパーグローバル変数($_POSTなど)は変更可能なので直接参照はしないほうが良いですよ。
filter_input(INPUT_POST, 'name');こんな感じで取得したほうがいいです。

投稿2016/01/17 17:48

編集2016/01/17 17:50
test_hf

総合スコア80

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

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

退会済みユーザー

退会済みユーザー

2016/01/17 18:01

横レス失礼します。 そもそもでいうと、「名前とemailで」というところからおかしくて、普通は「email(ID)とパスワード」ではないかと思ってみたり…
test_hf

2016/01/17 18:14

あ、確かにそうですね。。
dialbird

2016/01/18 00:41

test_hfさん Kosuke_Shibuyaさん ご返答ありがとうございます! そして返信が遅れて申し訳ありません! 確かにtest_hfさんのおっしゃる通り、仕組みからしてlogin.phpを挟む必要はないように思えてきました。 であればおっしゃる通りrequire云々よりも仕組みを変えたほうが早いのかもしれません。 そしてKosukeさんのおっしゃる通り、ログイン情報としてはそのほうが妥当でしたね........。ただ練習だったもので判定できるものであればなんでもいいかなと。 参考になります。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問