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

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

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

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

554閲覧

$_POST配列が変数に代入できない?

lnavi.bex810vh

総合スコア12

MySQL

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/28 08:38

編集2020/11/29 03:24

php7.4、mysql8にてユーザ認証を実現したいのですが、
進捗があったので書き換えいたします。$recがbool(false)になる前の行でvar_dump($_POST['user_mail']);を実行するとnullが返ってくることがわかりました。psyshでデバッグすると以下のようになります。簡単に言うと変数に$_POSTの値がどういうわけか代入できないのです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
c:\xampp\htdocs>psysh asobi/mem_login_check.php
Psy Shell v0.10.4 (PHP 7.4.11 — cli) by Justin Hileman
<!DOCTYPE html>

<html> <head><meta charset=UTF-8> <title>ログインチェック</title> </head> <body> array(0) { } PHP Notice: Undefined index: user_mail in C:/xampp/htdocs/asobi/mem_login_check.php on line 9 PHP Notice: Undefined index: user_pass in C:/xampp/htdocs/asobi/mem_login_check.php on line 10 PHP Notice: Trying to access array offset on value of type bool in C:/xampp/htdocs/asobi/mem_login_check.php on line 33 メールアドレスが一致しました。</body> </html>>>> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ``` <!DOCTYPE html> <html> <head><meta charset=UTF-8> <title>ログインチェック</title> </head> <body> <?php var_dump($_POST); $user_mail=$_POST['user_mail']; $user_pass=$_POST['user_pass'];

//var_dump($_POST['user_mail']);
//var_dump($_POST['user_pass']);

$user='root';
$password='';

$dsn='mysql:host=localhost;dbname=idol;charset=utf8';
$dbh= new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

try
{
$sql='SELECT member_mail FROM mst_userdb WHERE member_mail=?';
$stmh=$dbh->prepare($sql);
$data[]=$user_mail;
$stmh->execute($data);

$rec=$stmh->fetch(PDO::FETCH_ASSOC);

//var_dump($rec);//<=DBオブジェクトの結果

$member_mail=$rec['member_mail'];

if($user_mail==$member_mail) { print 'メールアドレスが一致しました。'; } else { print 'メールアドレスが見つかりません。'; }

}
catch(PDOException $e)
{
$e->getMessage();
}
?>

</body> </html> ```

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

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

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

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

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

guest

回答2

0

sanitize()が何やってるのか分かりませんが(DB問い合わせ時は不要かと思います)
PDOStatement::fetch失敗した場合は常に FALSE を返します。 ので、返却値を直接参照する前に「データが取得できたかどうか」を事前に検証すべきかと思います。

例:

php

1$rec=$stmh->fetch(PDO::FETCH_ASSOC); 2 3if($rec){ 4 $member_mail=$rec['member_mail']; 5 //後略 6 7 8} 9

SQLはcount()でとらない限り、何も返ってこないので(nullとかはあるでしょうけど)
'member_mail'を参照しようにもデータがとれてないので、できません。
「バリデーション」という観点ならSELECT count(member_mail) as cnt FROM …などとした上でその結果を検証したほうが明示的かと思います。

投稿2020/11/28 08:48

編集2020/11/28 08:50
m.ts10806

総合スコア80850

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

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

lnavi.bex810vh

2020/11/28 08:58

ご指摘の通りにしましたら、Notice: Undefined variable: member_mail...となりましたので、そもそも$recに値が取得できていないと思います。ちなみにsanitizeは$_POST用のエスケープを行うためのメソッドで、Noticeには無関係かと思います。
m.ts10806

2020/11/28 09:01 編集

無関係ですが、DBでの問い合わせにエスケープは不要です。やってはいけない実装なので指摘として書いています。(htmlspecialchars()とか、画面出力のためです) ひとまず$recをvar_dump()して結果を確認してそれ次第で決めてください。 私のはあくまで「例」なので、返却値によって対応を決める(返却値を直接参照する前に「データが取得できたかどうか」を事前に検証すべき)方針に違いはありません。
lnavi.bex810vh

2020/11/28 09:07

ご回答ありがとうございます。var_dumpの結果はやはり「bool(false)」でした。少し前進しましたのでこのままがんばってみます。
m.ts10806

2020/11/28 23:06

falseでしたら if($rec){ を書いたのなら同じNoticeは出ませんよ。回避できます。elseでなにもせずに参照していればそこでNoticeになります。
lnavi.bex810vh

2020/11/29 03:09

$recはDB配列の文字列のセットで、fetch自体ができないとSELECT文でユーザIDであるメールアドレスを取ってこれないので、仕様上できないことは許されないのです。そして、$recの問題の前に、それ以前に実行した$_POSTの値が変数に格納できてない状況がわかりました。
guest

0

自己解決

自己解決いたしました。まだ初心者でご回答者の方の仰っている意味が理解できず、まるまる2日を要してしまいました。fetchメソッドが値を持たなければfalseになるという意味が1日悩んでやっとわかり、以下のようにソースの最後の部分を訂正して処理することに成功しました。プログラム初心者で大変ご迷惑をお掛けしました。今回は大変勉強になりました。ありがとうございました。

if($rec) { $member_mail=$rec['member_mail']; if($user_mail==$member_mail) { print 'メールアドレスが一致しました。'; } } else { print 'メールアドレスが見つかりません。'; }

投稿2020/11/29 11:26

lnavi.bex810vh

総合スコア12

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

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

m.ts10806

2020/11/29 19:30

>自己解決いたしました えっと、コードがほぼ、私が回答に書いたコードです。 解決したのはいいとして、これで自己解決とするのはいささか疑問が残るということはお伝えしておきます。 分かってなかった部分を聞いてもらえれば良かったのですが、その様子はなかったので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問