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

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

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

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

Q&A

解決済

1回答

457閲覧

UPDATE ログインしたユーザーのみ

Roo

総合スコア55

PHP

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

0グッド

0クリップ

投稿2019/03/07 10:37

###前提
■会員登録

DB:MYSQL ver5.6.43
php: ver5.4.55

仮会員登録→完了→本会員登録→完了→ログイン画面→マイページ

↓該当ページ

php

1 if (!empty($_POST["mail"]) && !empty($_POST["password"])) { 2 // 入力したユーザIDを格納 3 $mail = $_POST["mail"]; 4 5 6 // 2. ユーザIDとパスワードが入力されていたら認証する 7 $dsn = sprintf('mysql:host=%s; dbname=%s; charset=utf8;unix_socket=/tmp/mysql.sock', $db['host'], $db['dbname']); 8 // 3. エラー処理 9 try { 10 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 11 12 13 $stmt = $pdo->prepare('SELECT * FROM member WHERE mail = ?'); 14 $stmt->execute(array($mail)); 15 16 $password = $_POST["password"]; 17 18 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 19 // if (password_verify($password, $row['password'])) { 20 if ( $password == $row['password']) { 21 22 23 24 session_regenerate_id(true); 25 26 //正常に叩かれた場合、SQL実施 27 $sql = "UPDATE member SET sdate='$date' WHERE id='1'"; 28 $result = $pdo->query($sql); 29 30 31 // 入力したIDのユーザー名を取得 32 $id = $row['id']; 33 $sql = "SELECT * FROM member WHERE id = $id"; //入力したIDからユーザー名を取得 34 $stmt = $pdo->query($sql); 35 foreach ($stmt as $row) { 36 $row['mail']; // ユーザー名 37 } 38 $_SESSION["mail"] = $row['mail']; 39 header("location: my.php"); 40 exit(); // 処理終了 41 } else { 42 // 認証失敗 43 $errorMessage = '※mailまたはPasswordが間違っています。'; 44 } 45 } else { 46 // 4. 認証成功なら、セッションIDを新規に発行する 47 // 該当データなし 48 $errorMessage = '※該当データなしmailまたはPasswordが間違っています。'; 49 } 50 } catch (PDOException $e) { 51 52 $errorMessage = header("Location: 500.php"); 53 54 } 55 } 56 57 } 58 var_dump($errorMessage); 59 } 60 61?>

###起きている事象

UPDATEが一列目のみしか効かない
|id|mail|pass|sdate|
|:--|:--:|--:|
|1|hoge@.co.jp|test1|0000:0000:
|2|hoge2@.co.jp|test2|0000:0000:
###質問点

$sql = "UPDATE member SET sdate='$date' WHERE id='1'";
ここの記載により一行目のみしか更新されないのですが、
ログインしたユーザーのsdateを更新したい場合こちらどのように修正すれば宜しいでしょうか?

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

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

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

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

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

cerfweb

2019/03/07 12:48

SQL文のテーブル名とフィールド名は下記のようにバッククォートで括るようにしましょう。 "SELECT * FROM `member` WHERE `id` = $id"; この方が処理も速くなるようですし、特にフィールド名を括っていないと、サーバによってはエラーを返すこともありますので。 ご参考までに。
Roo

2019/03/07 12:59

ご参考感謝いたします。 しかし、現在、指定したidのみ(ログインユーザー)アップデートが実現できていません。 よければそちらもお答えいただけませんでしょうか?
cerfweb

2019/03/07 13:03

回答が1件ついていますが、そちらに書かれている通りだと思いますよ。
cerfweb

2019/03/07 13:08 編集

つまり、WHERE `id`='1' ではなく、WHERE `id`='$id' です。 ($id = $row['id']; と定義したあとに)
Roo

2019/03/07 14:30

なるほど、、。感謝いたします。 丁寧なご指摘ありがとうございました
guest

回答1

0

ベストアンサー

$rowにselectしたidが格納されていますので、それをwhereの条件にセットできます。

しかしながら、プログラムソースコードからの推測ですが、同一のメールアドレスとパスワードの
組み合わせで会員登録できるようになっているのでしたら、会員を特定できないので危険です。

投稿2019/03/07 10:50

tabuu

総合スコア2449

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

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

tabuu

2019/03/07 10:54

(追記) パスワードも暗号化していないようです。学習のための環境であればいいのですが、 実運用であればお気を付けください。
Roo

2019/03/07 10:54

お忙しい中ご回答ありがとうございます 上記元に修正いたします。 です。重複確認は別のページで実施するので、 このDBには同じアドレスは存在しない想定になります。
tabuu

2019/03/07 11:05

老婆心ながら、別のページで重複確認するとのことですが、万が一重複してしまった場合は情報漏洩につながるので、 selectした結果が2件以上あったらログインせず、エラーにすることをお勧めしておきます。
Roo

2019/03/07 11:09

いえいえ、ご指摘感謝いたします。 $rowにselectしたidが格納されていますので、それをwhereの条件にセットできます。 ↑すみませんこちらの構文コードお教えくださいませ。 WHERE id=''$row";??
tabuu

2019/03/07 11:22

既存の以下のードが参考になるのではないでしょうか? $stmt = $pdo->prepare('SELECT * FROM member WHERE mail = ?'); $stmt->execute(array($mail));
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問