🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

PHP

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

Q&A

解決済

3回答

2175閲覧

phpで作る簡単なログインログアウト機能

Nitta

総合スコア96

MySQL

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

PHP

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

0グッド

1クリップ

投稿2019/09/09 00:21

編集2019/09/11 00:50

お世話になっております。
今、あるツールの登録、更新、削除等を
複数人で共有して使用したいと考えています。

以下のようなコードで、パスワード及びアドレスを入力し
ログイン登録したんですが、以下のようなエラーが出ます。
どうすれば改善できますでしょうか?

ご教示下さい。

◎要件内容

①ログイン画面からパスワード・メールアドレスを入力できる。
②DBにメールアドレスを登録する。
③パスワードは管理者のみが変更する。
④登録されたメールアドレスにパスワードを送信し、
送信したら、利用者がログインしあるツールを
使用できるようにする。

尚、MysqlにはuserDetaのDBは作成済み。

エラー内容

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'exits userDeta( id int not null auto_increment primary key, email varchar(25' at line 1 登録済みのメールアドレスです。

Sign/sign.php

<?php require_once('../config.php'); try{ $pdo = new PDO(DSN, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("create table if not exits userDeta( id int not null auto_increment primary key, email varchar(255), password varchar(255), created timestamp not null default current_timestamp )"); }catch(Exception $e){ echo $e->getMessage().PHP_EOL; } if(!$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){ echo '入力された値が不正です。'; return false; } if(preg_match('/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{8,100}+\z/i', $_POST['password'])){ $password = password_hash($_POST['password'], PASSWORD_DEFAULT); }else{ echo 'パスワードは半角英数字をそれぞれ1文字以上含んだ8文字以上で設定してください。'; return false; } try{ $stmt = $pdo->prepare("insert into userDeta(email, password) value(?, ?)"); $stmt->execute([$email, $password]); echo '登録完了'; }catch(\Exception $e){ echo '登録済みのメールアドレスです。'; }

login.php

<?php require_once('config.php'); session_start(); //POSTのvalidate if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { echo '入力された値が不正です。'; return false; } //DB内でPOSTされたメールアドレスを検索 try { $pdo = new PDO(DSN, DB_USER, DB_PASS); $stmt = $pdo->prepare('select * from userDeta where email = ?'); $stmt->execute([$_POST['email']]); $row = $stmt->fetch(PDO::FETCH_ASSOC); } catch (\Exception $e) { echo $e->getMessage() . PHP_EOL; } //emailがDB内に存在しているか確認 if (!isset($row['email'])) { echo 'メールアドレス又はパスワードが間違っています。'; return false; } //パスワード確認後sessionにメールアドレスを渡す if (password_verify($_POST['password'], $row['password'])) { session_regenerate_id(true); //session_idを新しく生成し、置き換える $_SESSION['EMAIL'] = $row['email']; echo 'ログインしました'; } else { echo 'メールアドレス又はパスワードが間違っています。'; return false; }

Sign.php

<?php function h($s){ return htmlspecialchars($s, ENT_QUOTES, utf-8); } //session_id発行 session_start(); if (isset($_SESSION['EMAIL'])){ echo 'ようこそ'. h($_SESSION['EMAIL'])."さん<br>"; echo "<a href='/logout.php'>ログアウトはこちら!</a>"; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Login</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" media="screen"> </head> <body> <div class="container"> <h1>ようこそ、ログインしてください!!</h1> <form action="login.php" method="post"> <label for="email">email</label> <input type="email" name="email" placeholder="○○○○○○@gmail.com"> <label for="password">password</label> <input type="password" name="password" placeholder="nghwr437"><br> <br> <button type="submit">Sign In!</button> </form> <h1>初めての方はこちら</h1>   <form action="Sign/signUp.php" method="post"> <label for="email">email</label> <input type="email" name="email"> <label for="password">password</label> <input type="password" name="password"><br> <br> <button type="submit">Sign Up!</button> <p style="color: #FF0000;">*パスワードは半角英数字をそれぞれ1文字以上含んだ、8文字以上で設定してください!<p> </form> </div> </body> </html>

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

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

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

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

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

m.ts10806

2019/09/09 00:29

まず思ったように作ってみて何かしらつまずいたときに質問してください。 これでは何を答えていいか分かりません。
退会済みユーザー

退会済みユーザー

2019/09/09 00:31

「どのようにすればいいでしょうか?」→データ構造を設計してコーディングしてテストしたらいいと思うよ。一発で想定通りのものが出来なくても、そこから得るものもあるはずだから。よそに迷惑がかからない範囲でなら、何度でも作り直して構造を見直したりアルゴリズムを変更したりできるのだから、まず手を動かそう。
退会済みユーザー

退会済みユーザー

2019/09/11 09:48

exits ってなんだろう、existsのタイプミス?
guest

回答3

1

素人にセキュアなログインシステムは設計すらできないので、要件に近い OSS をノンカスタマイズで使用できないか検討してみてください。

もし学習用途であれば、セキュリティを体系的に学習した上で、要件定義から初めてみることをオススメします。今の要件とは全く別物になるはずです。

参考)
ログインシステムって会員管理の仕組みの一部なんです。まずはそこから理解してください。
PHPでログイン機能を実装するチュートリアル #1

投稿2019/09/09 00:46

退会済みユーザー

退会済みユーザー

総合スコア0

kei344👍を押しています

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

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

退会済みユーザー

退会済みユーザー

2019/09/09 02:42

要件次第だけど、.htaccess/.htpasswdでのBASIC認証でもいいんじゃないの?って思えた。
m.ts10806

2019/09/09 04:53

>.htaccess/.htpasswdでのBASIC認証でもいいんじゃないの? それに一票
退会済みユーザー

退会済みユーザー

2019/09/09 04:59

まぁ、それもセキュリティ設計ができてないと、ちゃんと機能しているか確認すらできないと思うぞ^^;
m.ts10806

2019/09/09 05:02

質問者さんは社内SEさんらしいのできっとそこはできてるんじゃないかな(根拠ナシ) 社内ツールなら「知ってる人だけが知ってればいい」という考え方もできます。
Nitta

2019/09/11 00:42

返信遅れ申し訳ありません。 ある程度、ものを作ってみました。 DBに上手くテーブルが作成できてないんです。 ご回答お願いできないでしょうか? 要件定義を掲載しておきます。
退会済みユーザー

退会済みユーザー

2019/09/11 03:17

人の回答「捨て」て質問を作業依頼に変更するとか^^;
guest

0

ベストアンサー

SQLはいきなりプログラムから実行するのではなく
DBに対して直に実行できて想定通りの結果が得られるか確認してからプログラムに導入しましょう。

PDOのExceptionで得られるのはDBから返されたエラーメッセージ
つまり、ほとんどの場合で同じSQLをDBに対して直に実行したときに同じものが返ってきます。
Syntaxが「構文エラー」であることはPHPをやっていればご存知だとは思います(大抵の言語では構文エラーとしてSyntaxという表現が使われてたはず)

ということは、構文見直せばいいですね。

13.1.17 CREATE TABLE 構文

構文の構成を見れば明らかに違うところがありますよ。
プログラムにとってはただの文字列です。1字でも違えばそれは全く違う意味になりますし、それが用意されていなければ「そんなものない」とエラーになります。
言語や場合によってはaとAすら別物ですからね。

実行するとDBに影響があるのでとりあえず構文チェックしたいというなら構文チェックサービスがWeb上にあるので「{DBの種類} 構文チェック」で検索してみてください。

あとはがんばってください。

エラーメッセージの読み方と対処, 検索や質問の原則

投稿2019/09/11 00:48

編集2019/09/11 00:49
m.ts10806

総合スコア80875

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

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

Nitta

2019/09/11 00:59

お世話になっております。exits⇒existsでした。 登録完了しました。 後、これを今からレンタルサーバーに置き、 Excelツールも同時に乗せ、それを認定したもの(お金を払った人)だけに 使わせるということはできますよね? その際、seleniumuを使いたいんですがどうすればいいでしょうか?
m.ts10806

2019/09/11 01:03

なぜSelenium? > Excelツールも同時に乗せ、それを認定したもの(お金を払った人)だけに 使わせるということはできますよね? そう作ればできるんじゃないでしょうか。 レンタルサーバで商用利用可のところを探す必要はありそうですけど。 質問当初の要件からずいぶんとぶっ飛んでて なんと言ったらいいやら。 このまま作り込んでもセキュリティホールだらけで 速攻で潰されてしまいそうですけど(私は他人なので知ったこっちゃないですが)
Nitta

2019/09/11 01:15

すいません。奇問ばかり申しまして。セキュリティ面で行くとやはりexcelツールを配布するというやり方の方が良いですよね?ダメでしょうか?
m.ts10806

2019/09/11 01:20

どこからどうやってExcelの話がでてきたのか分かりません。 単にExcel共有したいだけならGoogleスプレッドシートでいいのでは。
Nitta

2019/09/11 01:28

説明不足ですいません。VBAベースで作成したスクレイピングツールがあり、Seleniumを使っています。そのため、できるだけ使用者が手間の掛からない方法はないかなと考え質問をしました。
m.ts10806

2019/09/11 01:39

前提や背景があるならそれを明記すべきですね。 解決済みとしてしまっているので去った回答者は多そうです。 正直、上記コメントだけでも不明瞭な点が多すぎますし、 自身でどうにもならない感もあるので、やはり業者に出されたほうが。
Nitta

2019/09/11 01:48 編集

業者なんて出す時間ないですし、出来なくもないんではないでしょうか?再度、質問を上げさせていただきます、より詳細に!!助けたって下さい。作業依頼ではないです。やり方はないでしょうか?という意味です。
m.ts10806

2019/09/11 01:46

意味が分かりませんしそんなの言われても知りません。 作業依頼なら業者へどうぞ。ここは質問サイトです。
Nitta

2019/09/11 01:52

作業依頼ではないです。やり方はないでしょうか?という意味です。
m.ts10806

2019/09/11 01:55 編集

要件が不明瞭すぎます。 やり方も何も提示しようがありません。 赤の他人にこのつまんだだけのようなコメントですべて伝わると思わない方がいいです。 既に本件解決されてるなら別質問とされては。 このままではおおよそ「丸投げ」「問題・課題がない」「業者へどうぞ」といった低評価・コメントはつくと思いますが。
Nitta

2019/09/11 02:11 編集

わかりました。きっちり揃えて別質問いたします。ご回答お待ちしてます。
m.ts10806

2019/09/11 02:09

今のところ「業者に依頼してください」を覆す内容にはなりそうにないですけどね。
Nitta

2019/09/11 04:05

質問するだけ無駄だということでしょうか?
m.ts10806

2019/09/11 04:09

さぁそれは内容次第。
guest

0

ログイン

  • ユーザー名、パスワードをログインページにpostする
  • 照合して合致したらユーザー情報をセッションに保持する
  • 各ページにincludeしたセッション確認処理でログインされているかチェックする

ログアウト

  • 各ページに設置されたログアウトボタンを押す
  • セッションをdestoryする

投稿2019/09/09 00:30

yambejp

総合スコア116694

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

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

Nitta

2019/09/11 00:40

返信遅れすいません。上記の部分に関してはできていると思います。 別にLaravelでの標準である機能でも良いんですが、 何か作りたくて。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問