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

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

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

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

2回答

307閲覧

header Locationで遷移するページにtest.php/123など設定できるのでしょうか?

TadashiOsanai

総合スコア10

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

2クリップ

投稿2018/08/09 06:35

編集2018/08/09 06:59

ログインして、パスワードが合っているればtest.phpに飛ぶようになっております。
fromはpostです。

//アカウントが一致 if($row = $statement->fetch()){ $password_hash = $row[password]; //パスワードが一致 if (password_verify($password, $password_hash)) { //セッションハイジャック対策 session_regenerate_id(true); $_SESSION['mail'] = $mail; header("Location: test.php"); exit();

下記のようにheader("Location: test.php".$123);などで試しましたが、
ログイン画面亜押せない状態です。

login.php → login_check.php

ここからボタンが押せません。

$_SESSION['mail'] = $mail; $123 = 123; $url = "http://example.com/?123={$123}"; header("Location: test.php". $url); exit();

ご教授いただけないでしょうか?
よろしくお願いします。

login.php

<?php session_start(); header("Content-type: text/html; charset=utf-8"); ?> <!DOCTYPE html> <html> <head> <title>ログイン画面</title> <meta charset="utf-8"> </head> <body> <h1>ログイン画面</h1> <form action="login_check.php" method="post"> <p>アカウント:<input type="text" name="account" size="50"></p> <p>パスワード:<input type="text" name="password" size="50"></p> <input type="hidden" name="token" value="<?=$token?>"> <input type="submit" value="ログインする"> </form> </body> </html>

login_check.php

<?php session_start(); header("Content-type: text/html; charset=utf-8"); //データベース接続 require_once("db.php"); $dbh = db_connect(); //前後にある半角全角スペースを削除する関数 function spaceTrim ($str) { // 行頭 $str = preg_replace('/^[  ]+/u', '', $str); // 末尾 $str = preg_replace('/[  ]+$/u', '', $str); return $str; } //エラーメッセージの初期化 $errors = array(); if(empty($_POST)) { header("Location: index.php"); exit(); }else{ //POSTされたデータを各変数に入れる $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; $password = isset($_POST['password']) ? $_POST['password'] : NULL; //前後にある半角全角スペースを削除 $mail = spaceTrim($mail); $password = spaceTrim($password); //アカウント入力判定 if ($mail == ''): $errors['mail'] = "アカウントが入力されていません。"; elseif(mb_strlen($mail)>50): $errors['mail_length'] = "アカウントは50文字以内で入力して下さい。"; endif; //パスワード入力判定 if ($password == ''): $errors['password'] = "パスワードが入力されていません。"; elseif(!preg_match('/^[0-9a-zA-Z]{5,30}$/', $_POST["password"])): $errors['password_length'] = "パスワードは半角英数字の5文字以上30文字以下で入力して下さい。"; else: $password_hide = str_repeat('*', strlen($password)); endif; } //エラーが無ければ実行する if(count($errors) === 0){ try{ //例外処理を投げる(スロー)ようにする $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //アカウントで検索 $statement = $dbh->prepare("SELECT * FROM member WHERE mail=(:mail) AND flag =1"); $statement->bindValue(':mail', $mail, PDO::PARAM_STR); $statement->execute(); //アカウントが一致 if($row = $statement->fetch()){ $password_hash = $row[password]; //パスワードが一致 if (password_verify($password, $password_hash)) { //セッションハイジャック対策 session_regenerate_id(true); $_SESSION['mail'] = $mail; header("Location: test.php"); exit(); }else{ $errors['password'] = "メールアドレス及びパスワードが一致しません。"; } }else{ $errors['mail'] = "メールアドレス及びパスワードが一致しません。"; } //データベース接続切断 $dbh = null; }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } } ?> <!DOCTYPE html> <html> <head> <title>ログイン確認画面</title> <meta charset="utf-8"> </head> <body> <h1>ログイン確認画面</h1> <?php if(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <input type="button" value="戻る" onClick="history.back()"> <?php endif; ?> </body> </html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/08/09 06:53 編集

login.php のソースコードに問題があるとは思わないの? 回答者側で再現できるよう、ソースコードをなるべく全部掲載しようとは思わないのでしょうか。押せない状況が、スタイルシートなどで無効化されているのか、そもそもボタンすら表示されないのか、「押せません」だけじゃ説明になってないのよ。
退会済みユーザー

退会済みユーザー

2018/08/09 07:17

いや、db.phpが足りなくて再現できてないよ!
guest

回答2

0

header()を使いたいときに、
たとえ1行でも空行などでhtml出力してしまうと、
htmlコンテンツを送信する流れになってしまって
header()が無視されたりするので、
header()でリダイレクトするときは余計なhtml出力しないように
分岐を徹底する方がいい。
ソースコードの冒頭で杓子定規に
header("Content-type: text/html; charset=utf-8");
を書いてしまうとリダイレクトできなくないかな。

それと、再現しようとすると、
$token変数が突然出現しているために
Notice: Undefined variable: token
のエラーになる。
$tokenの初期化をlogin.phpでやってないように見えるけど、
db.phpでやってたりしますか?

もしもまだやっていなければ、
php.iniの設定変更をして、
デバッグしやすいようにする:
PHPのエラー表示設定について - Qiita
のと、
Xdebug対応できるエディタや統合開発環境を使えば、
ステップ実行とかできたりするのでおすすめ。

投稿2018/08/09 07:06

編集2018/08/09 07:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

変数名の1文字目は数字が使えなかったはず。(アンダーバーは使える)
構文ミスですね。それだけで想定通り動くかはまた別として。

投稿2018/08/09 07:00

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/08/09 07:02

$statement = $dbh->prepare("SELECT * FROM member WHERE mail=(:mail) AND flag =1"); なぜ :mail をカッコで括っているのか謎。
m.ts10806

2018/08/09 07:03

ツッコミどころは非常に多いですね。 できれば構文以外のところで悩んでもらいたいですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問