ログイン日時をテーブルに更新させたい
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 1,062
ログイン機能を作成しています。
テーブル↓
name | password | sdate |
---|---|---|
~ | ~ | 0000-00-00 00:00:00 |
↑の(~)にはすでに値が入っています。DBにデータがあればログイン(マイページ表示)
なければエラー画面にしています。
sdateのカラムにログインした日時を入れたいです。
どうすれば宜しいでしょうか?
if (isset($_POST["login"])) {
// 1. ユーザIDの入力チェック
if (empty($_POST["userid"])) { // emptyは値が空のとき
$errorMessage = '※UserIDまたはPasswordが間違っています。';
} else if (empty($_POST["password"])) {
$errorMessage = '※UserIDまたはPasswordが間違っています。';
}
if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
// 入力したユーザIDを格納
$userid = $_POST["userid"];
// 2. ユーザIDとパスワードが入力されていたら認証する
$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); //調査
// 3. エラー処理
try {
$pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
$stmt = $pdo->prepare('SELECT * FROM userdata WHERE name = ?');
$stmt->execute(array($userid));
$password = $_POST["password"];
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// if (password_verify($password, $row['password'])) {
if ($userid == $row['name'] || $password == $row['password']) {
session_regenerate_id(true);
// 入力したIDのユーザー名を取得
$id = $row['id'];
$sql = "SELECT * FROM userdata WHERE id = $id"; //入力したIDからユーザー名を取得
$stmt = $pdo->query($sql);
foreach ($stmt as $row) {
$row['name']; // ユーザー名
}
$_SESSION["NAME"] = $row['name'];
header("location: my.php");
exit(); // 処理終了
} else {
$errorMessage = '※UserIDまたはPasswordが間違っています。';
}
} catch (PDOException $e) {
header("Location: 500.php");---
}
}
試したこと
$date = date('Y-m-d H:i:s');
// UPDATEのSQL作成
$sql = "UPDATE gc_granola SETsdate='" . $date . "'
WHERE id = 1";
// SQL実行
$res = $mysqli->query($sql);
上記の文章を
エラー処理の所で試してみましたがうまくいかず。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
テーブル名は正しいですか?gc_granola
ではなくuserdata
では?
SETsdate
になっています。間に空白を入れましょう。
謎の改行。
更新条件はid=1
固定で良いのでしょうか?
以上を踏まえてこんな感じでは。
$sql = "UPDATE userdata SET sdate='$date' WHERE id=$userid";
Now関数を使ってもよいでしょう。
(もしかしたらキャストしないとダメかも)
$sql = "UPDATE userdata SET sdate=Now() WHERE id=$userid";
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/09/05 17:11
入力ミスです、失礼いたしました。
参考にさせていただきます。
$res = $mysqli->query($sql);
上記のSQL実行文で引っかかってしまいます…。
試したことのコードを上のコード(ログイン画面)に組み込む場合は
どこに入れるのが正しいでしょうか?教えていただけると幸いです。
2018/09/06 09:21 編集
$sql = "UPDATE userdata SET sdate='$date' WHERE id='$userid'";
入れる場所は認証が正しく行われたときでは?
つまり、
if ($userid == $row['name'] || $password == $row['password']) {
の中。
ちなみにここで$useridと比較する必要はないと思います。
これでよいはず。
if ($password == $row['password']) {
2018/09/06 10:39
参考に実施させていただきます。
取り急ぎご返礼を
2018/09/06 10:55
$pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
$stmt = $pdo->prepare('SELECT * FROM userdata WHERE name = ?');
$stmt->execute(array($userid));
$password = $_POST["password"];
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// if (password_verify($password, $row['password'])) {
if ($userid == $row['name'] || $password == $row['password']) {
session_regenerate_id(true);
// $date = date('Y-m-d H:i:s');
// UPDATEのSQL作成
// $sql_2 = "UPDATE userdata SET sdate='".$date."' WHERE id='".$userid."';
// SQL実行
// $result = $mysqli->query($sql_2);
//var_dump($res);
// 入力したIDのユーザー名を取得
$id = $row['id'];
$sql = "SELECT * FROM userdata WHERE id = $id"; //入力したIDからユーザー名を取得
$stmt = $pdo->query($sql);
foreach ($stmt as $row) {
$row['name']; // ユーザー名
}
$_SESSION["NAME"] = $row['name'];
header("location: my.php");
exit(); // 処理終了
} else {
// 認証失敗
$errorMessage = '※UserIDまたはPasswordが間違っています。';
}
} else {
// 4. 認証成功なら、セッションIDを新規に発行する
// 該当データなし
// $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
$errorMessage = '※UserIDまたはPasswordが間違っています。';
}
} catch (PDOException $e) {
$errorMessage = 'データベースエラー';
//$errorMessage = $sql;
// $e->getMessage() でエラー内容を参照可能(デバッグ時のみ表示)
// echo $e->getMessage();
}
}
}
?>
このように変更したのですが、その場合以降の文にエラーが出ていまいます
if ($password == $row['password']) {
こちらに関しましても。。
おそらく私の書き方が悪いのですが、どう直せば宜しいでしょうか?
2018/09/06 11:02
$mysqliを使ってるからではないでしょうか?
折角$pdoが用意されているので、それを使ってみては。
>if ($password == $row['password']) {
>こちらに関しましても。。
>おそらく私の書き方が悪いのですが、どう直せば宜しいでしょうか?
それが訂正した内容なんですが…。
2018/09/06 11:20
再度実施してみます。
2018/09/06 12:26
実施したところエラーは吐かないのですが、DBに時間が登録されていません…
$sql = "UPDATE userdata SET sdate='$date' WHERE id='$userid'";
2018/09/06 14:04
WHERE name='$userid'
しかしエラーにならないということはidというカラムもあるのでしょうか?
nameとid、どうなっていますでしょうか。
2018/09/06 14:04
お時間いただき感謝します。
WHEREの部分で自分の指定ミスが原因でした。
2018/09/06 14:05
どうミスったのか書いておいてくださいね。
2018/09/06 14:09
$sql = "UPDATE userdata SET sdate='$date' WHERE id='1'";
指定したい部分が間違っていました。
2018/09/06 16:27
お忙しい中お時間ありがとうございました。
感謝しております。