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

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

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

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

Q&A

解決済

1回答

516閲覧

SQL文 「=」ではなく「>=」である理由が知りたいです。

xo_yo

総合スコア54

MySQL

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

0グッド

0クリップ

投稿2022/02/16 11:00

https://www.websec-room.com/2015/03/15/2153#i-4

↑を参考にしながら勉強しているのですが、SQL文についてわからない部分があったので質問させて頂きます。

php

1<?php 2 session_start(); 3 require_once('function.php'); 4 header('Content-type: text/html; charset=utf-8'); 5 //URLからパラメータ取得 PHP_URL_QUERY)->?の後ろを取得している 6 $url_pass = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY); 7 //ユーザー正式登録 8 try { 9 // DB接続 10 $pdo = new PDO(DNS, USER_NAME, PASSWORD, get_pdo_options()); 11 //プレースホルダで SQL 作成 12 $sql = "SELECT * FROM users WHERE temp_pass = ? AND register_time >= ?;"; 13 $stmt = $pdo->prepare($sql); 14 //10分前の時刻を取得 15 $datetime = new DateTime('- 10 min'); 16 $stmt->bindValue(1, $url_pass, PDO::PARAM_STR); 17 $stmt->bindValue(2, $datetime->format('Y-m-d H:i:s'), PDO::PARAM_STR); 18 $stmt->execute(); 19 $row = $stmt->fetch(PDO::FETCH_ASSOC); 20 //URLが不正か期限切れ 21 if (empty($row)) { 22 $_SESSION['error_status'] = 6; 23 redirect_to_register(); 24 exit(); 25 } 26 $id = $row['id']; 27 $sql = "UPDATE users SET is_user = 1 WHERE id = ?;"; 28 $stmt = $pdo->prepare($sql); 29 // トランザクションの開始 30 $pdo->beginTransaction(); 31 try { 32 $stmt->bindValue(1, $id, PDO::PARAM_STR); 33 $stmt->execute(); 34 // コミット 35 $pdo->commit(); 36 } catch (PDOException $e) { 37 // ロールバック 38 $pdo->rollBack(); 39 throw $e; 40 } 41 } catch (PDOException $e) { 42 die($e->getMessage()); 43 } 44?> 45<!DOCTYPE html> 46<html lang="ja"> 47<head> 48 <meta charset="utf-8"> 49</head> 50<body> 51<h1>登録完了</h1> 52ユーザーの登録が終了しました。<br> 53ログイン画面からログインしてください。<br><br> 54<a href="login.php">ログイン画面に戻る</a> 55</body> 56</html> 57

「 $sql = "SELECT * FROM users WHERE temp_pass = ? AND register_time >= ?;";」の部分の、「>=」が「=」ではない理由が知りたいです。

いろいろ調べたのですがわからなくて・・・。よろしく御願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/02/16 11:04

その SELECT 文であなたが何をしたいのか書かないと、そんなことは知り得ない赤の他人には答えられないかと思うのですけど?
m.ts10806

2022/02/16 11:09

「そういうデータを取り出すため」ではないでしょうか。 つまり「要件を満たすためにそういう風にしている」 コードだけ見ても要件が分かるわけではないので(要件を反映した実装とは限らないから) 「どういうデータをもとにどういうデータを出したいか」を説明されたほうが良いと思います。
guest

回答1

0

ベストアンサー

例えば、register_time >= 現在時刻
というSQLを実行すると、現在時刻よりあとの時間にregisterした人が表示されます。
register_time = 現在時刻
だと、現在時刻のこの瞬間にregisterした人しか表示されません。

投稿2022/02/16 11:06

編集2022/02/16 11:09
Sonono

総合スコア85

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

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

xo_yo

2022/02/16 12:20

コメントありがとうございます。 現在時刻よりあとの時間とは、今回のSQL文では、「$datetime = new DateTime('- 10 min');」の10分後という考え合っていますか?
Sonono

2022/02/16 12:42

今回のSQLでは、「$datetime = new DateTime('- 10 min');」より後の時間になります。
xo_yo

2022/02/16 14:14

すいません。理解が出来なくて・・・ もう少し詳しく御願いいたします。要求ばかりですいません。
xo_yo

2022/02/16 14:19

今の所10分前より後に、実行されるという考えなのですが、合っていますか?
Sonono

2022/02/16 14:33

それであっています! $datetime = new DateTime('- 10 min'); は現在時刻より10分前の時間 なので、 $sql = "SELECT * FROM users WHERE temp_pass = ? AND register_time >= $datetime;"; で得られるのは直近10分間(=10分前より後)にregisterした人ということになりますね。
xo_yo

2022/02/16 14:34

ありがとうございます!大変勉強になりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問