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

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

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

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

Q&A

2回答

2751閲覧

php Postされた値のチェック

hello_mate

総合スコア21

PHP

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

0グッド

1クリップ

投稿2019/08/07 12:32

編集2019/08/07 13:03

ログイン機能を作成しようと思っているのですが
エラーメッセージを取得できずに苦戦しています。
empty部分をisesetなどに変えて試しましたがうまく動作しませんでした。


POSTされてきた値が空だった場合に
err_msgに格納していき
html部分でforeachで未入力の情報を書き出す。

と、php部分でerr_msgに配列が渡されていたら
if(count($err_msg) === 0){
エラーメッセージが0であればこの後にSQL実行文
}
以後の処理には行かせないようにしたいと思っています。

ですが、フォーム画面で未入力のままログインボタンを押すと
エラー表示が出ずに次ページへ遷移されてしまいます。


php

1<?php 2 session_start();//セッション開始 3 require_once "./common_function.php";//common_function呼び込み 4 //DBハンドルの取得 5 $pdo = get_dbh(); 6 $err_msg = array(); 7 8 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 9 //メールアドレスとパスワードを取得 10 if(empty($_POST['account_email']) === FALSE){ 11 $account_email = $_POST['account_email']; 12 }else{ 13 $err_msg[] = 'メールアドレスが未入力です。'; 14 } 15 if(empty($_POST['account_password']) === FALSE){ 16 $account_password = $_POST['account_password']; 17 }else{ 18 $err_msg[] = 'パスワードが未入力です。'; 19 } 20 var_dump($err_msg); 21 //var_dump($account_email); 22 //var_dump($account_password); 23 if(count($err_msg) === 0){ 24 try{ 25 //sql実行 26 $sql = 'SELECT * FROM account Where account_email = :account_email and account_password = :account_password'; 27 $stmt = $pdo->prepare($sql); 28 $stmt -> bindValue(':account_email', $account_email, PDO::PARAM_STR); 29 $stmt -> bindValue(':account_password', $account_password, PDO::PARAM_STR); 30 $stmt->execute(); 31 //var_dump($stmt); 32 $count = $stmt -> rowCount(); 33 if($count > 0){ 34 header('Location: ./item_list.php'); 35 } 36 //認証処理 37 }catch(PDOException $e){ 38 echo $e->getMessage(); 39 } 40 } 41 } 42 $pdo = null; 43?> 44<!DOCTYPE html> 45<html> 46<head> 47 <title>ログイン画面</title> 48 <link rel="stylesheet" href="login.css"> 49</head> 50<body> 51 <div class="wrapper"> 52 <H1>ログイン画面</H1> 53 <?php foreach($err_msg as $value) {?> 54 <p><?php print $value ?></p> 55 <?php } ?> 56 <form action="item_list.php" method="POST"> 57 <div class="insert-form"> 58 <p class="email">メールアドレス</p> 59 <input type="email" name="account_email"> 60 <p class="password">パスワード(8文字以上、時半角英数字のみ使用可能)</p> 61 <input type="password" name="account_password"> 62 </div> 63 <input type="submit" name="login" value="ログイン"> 64 </form> 65 <input type ="button" value="新規登録" onclick="location.href='./register.php'"> 66 </div> 67</body> 68</html> 69

php2

1<?php 2 session_start();//セッション開始 3 require_once "./common_function.php";//common_function呼び込み 4 //DBハンドルの取得 5 $pdo = get_dbh(); 6 $err_msg = array(); 7 8 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 9 //メールアドレスとパスワードを取得 10 if(isset($_POST['account_email']) === TRUE){ 11 $account_email = $_POST['account_email']; 12 }else{ 13 $err_msg[] = 'メールアドレスが未入力です。'; 14 } 15 if(isset($_POST['account_password']) === TRUE){ 16 $account_password = $_POST['account_password']; 17 }else{ 18 $err_msg[] = 'パスワードが未入力です。'; 19 } 20 var_dump($err_msg); 21 //var_dump($account_email); 22 //var_dump($account_password); 23 if(count($err_msg) === 0){ 24 try{ 25 //sql実行 26 $sql = 'SELECT * FROM account Where account_email = :account_email and account_password = :account_password'; 27 $stmt = $pdo->prepare($sql); 28 $stmt -> bindValue(':account_email', $account_email, PDO::PARAM_STR); 29 $stmt -> bindValue(':account_password', $account_password, PDO::PARAM_STR); 30 $stmt->execute(); 31 //var_dump($stmt); 32 $count = $stmt -> rowCount(); 33 if($count > 0){ 34 header('Location: ./item_list.php'); 35 } 36 //認証処理 37 }catch(PDOException $e){ 38 echo $e->getMessage(); 39 } 40 } 41 } 42 $pdo = null; 43?> 44<!DOCTYPE html> 45<html> 46<head> 47 <title>ログイン画面</title> 48 <link rel="stylesheet" href="login.css"> 49</head> 50<body> 51 <div class="wrapper"> 52 <H1>ログイン画面</H1> 53 <?php foreach($err_msg as $value) {?> 54 <p><?php print $value ?></p> 55 <?php } ?> 56 <form action="item_list.php" method="POST"> 57 <div class="insert-form"> 58 <p class="email">メールアドレス</p> 59 <input type="email" name="account_email"> 60 <p class="password">パスワード(8文字以上、時半角英数字のみ使用可能)</p> 61 <input type="password" name="account_password"> 62 </div> 63 <input type="submit" name="login" value="ログイン"> 64 </form> 65 <input type ="button" value="新規登録" onclick="location.href='./register.php'"> 66 </div> 67</body> 68</html> 69

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

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

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

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

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

kei344

2019/08/07 12:36

「うまく動作しません」とは「何をしたときに」「どうなると思って」「どうなったのか」を、出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。また、もしPHPのエラー文を出すように設定していない場合は設定してください。https://mawatari.jp/archives/how-to-display-php-errors
kei344

2019/08/07 12:49

「次ページへ遷移」はどのように起こるのでしょうか。提示されたコードだけでは(「ログイン画面」の部分が表示される程度で)その状況にならないと思います。なるべく全体像がわかるコードを提示してみてください。
hello_mate

2019/08/07 12:59

ご回答ありがとうございます。 issetに変えて=== TRUEと変更しましたが’、 何も値を入れずにログインボタンを押しても エラー表記が反映されませんでした。
退会済みユーザー

退会済みユーザー

2019/08/07 13:01

isset()で評価したときのコードも参考までに観たい。
hello_mate

2019/08/07 13:03

追記致しました。
guest

回答2

0

POST受信したときの処理のコードしか示されていないため、
フォーム送信する箇所のコードが適切かどうかを確認するのも念の為必要かも。
POSTじゃなくGETだったりしないかとか、
空欄で送信しているつもりが隠しパラメータで送信していたりしないかとか、
デバッグ用のコードが紛れ込んでいないかとか。
パラメータの名前「account_email」「account_password」のスペルミスがないかなども。

$pdoは間違いないか、
$_SERVER['REQUEST_METHOD']は間違いなくPOSTなのか、
$_POST['account_email']は間違いなく存在するのか、
デバッグ用にechoを仕込んでみると良いかも。

テスト環境にXDebugモジュールを組み込んで、
リモートデバッグできるようにするとデバッグが捗るのですが、
導入方法などは別途ネット検索などしてみてください。

$sql = 'SELECT * FROM account Where account_email = :account_email and account_password = :account_password';

としないで、

$sql = 'SELECT COUNT(*) AS CNT FROM account Where account_email = :account_email and account_password = :account_password';

などとしてCNTの値を取得したほうが確実にヒットする件数を取得できそう。

PHP: PDOStatement::rowCount - Manual

関連する PDOStatement によって実行された直近の SQL ステートメントが SELECT 文の場合、いくつかのデータベースは文によって返された 行数を返すかも知れません。しかしながら、 この振る舞いは全てのデータベースで保証されていません。 さまざまな場所で使用するアプリケーションでは、 これに頼ってはいけません。

老婆心ながら、
メールアドレスは仕方ないとして、
パスワード文字列を平文のままテーブルに保持しておくと、
漏洩したとき辛いなぁ。

パスワードをDBに保存する時の基礎の基礎的なこと - Qiita

あと、せっかくなので、
PHP: filter_input - Manual
を活用する手も有効かもしれない。
とくに
filter_var, filter_input でよく使うもの - Qiita
にある、Emailのフィルタの使い方を応用していけば、
不適切なメールアドレス表現を弾いてくれる。

投稿2019/08/07 13:05

編集2019/08/08 04:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

エラー表示が出ずに次ページへ遷移されてしまいます。

まず、//sql実行~//認証処理をいったん削除して、var_dump($err_msg);の結果を確認してください。

投稿2019/08/07 14:42

kei344

総合スコア69400

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問