MySQLのNOW関数について[備忘録]

自分の勉強用です。

MySQLの関数とは?

MySQLの関数は、特定のタスクを実行するために使用される、引数を受け取り特定の結果を返す小さなプログラムのことです。

MySQLには様々な種類の関数があり、データの整形、統計、日付と時刻などのタスクを実行するために使用される。

例として、数値を平方根に変換するSQRT関数、文字列の長さを求めるLENGTH関数などがある。

そのうちの一種として、現在の日付と時刻を返すNOW関数がある。

NOW関数とは?

この関数はMySQLDB内の日付と時刻を扱う際に、現在の日時を取得するために使われる。引数を受け取らず、常に現在の日時を返す。

例えば、現在の日時を挿入するSQL文は下記↓

INSERT INTO table_name (column1, column2, date_column) VALUES('value1',
'value2', NOW());

こうすると、date_columnには、デフォルトで’YYYY−MM−DD HH:MM:SS’形式で日付と時刻が挿入される。

 

例えば2023年2月2日12:30:00に実行された場合、次のような値が挿入される。

「2023-02-02 12:30:00」

掲示板などのサイトでユーザーの入力項目の内容をTABLEにINSERTする際、時刻を保存する場合は一般的にNOW関数が使用される。

これによりユーザーが入力した投稿のタイムスタンプを確実に記録することが出来る。

NOW関数をPDOで使用したい場合

date関数を使用して、レコードに現在日時を保存したい場合は下記↓

 
$created_at = date('YYYY-MM-DD HH:MM:SS');
$statement = $connection->prepare('INSERT INTO contents (title, comment, creat
ed_at) VALUE (:title, :comment, :created_at)');
$statement->bindValue(':title', $input_values['title'], PDO::PARAM_STR);
$statement->bindValue(':comment', $input_values['comment'], PDO::PARAM_STR);
$statement->bindValue(':comment', $created_at, PDO::PARAM_STR);
$statement->execute();

変数$created_atにdate関数で現在日時を代入。

bindValueで文字列として、$created_atをバインドする。

 

しかし、MySQLのNOW関数を使用したい場合は、このように書く。

 ⭕️

$statement = $connection->prepare('INSERT INTO contents (title, comment, creat
ed_at) VALUE (:title, :comment, NOW())');
$statement->bindValue(':title', $input_values['title'], PDO::PARAM_STR);
$statement->bindValue(':comment', $input_values['comment'], PDO::PARAM_STR);
$statement->execute();

まず$created_atに日時を代入するコードを削る。

 

PDOでNOW関数を誤った使用方法で実行しエラーが出るパターン

$statement = $connection->prepare('INSERT INTO contents (title, comment, creat
ed_at) VALUE (:title, :comment, NOW())');
$statement->bindValue(':title', $input_values['title'], PDO::PARAM_STR);
$statement->bindValue(':comment', $input_values['comment'], PDO::PARAM_STR);
$statement->bindValue(':comment', NOW(), PDO::PARAM_STR);
$statement->execute();

ここで上記のように書くと、エラーが出る。

Fatal error: Uncaught Error: Call to undefined function NOW() in /var/www/html/bbs/index.php:○

未定義の関数NOWを呼び出していると怒られる。

$created_at = 'NOW()';
$statement = $connection->prepare('INSERT INTO tabele (col1, col2, creat
ed_at) VALUE (:col1, :col2, NOW())');
$statement->bindValue(':col1', $_POST['col1'], PDO::PARAM_STR);
$statement->bindValue(':col2', $_POST['col2'], PDO::PARAM_STR);
$statement->bindValue(':created_at', $created_at, PDO::PARAM_STR);
$statement->execute();

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

バインドされた変数の数がトークンの数と一致しませんと怒られる。

というのは、SQL文内に存在するパラメータープレースホルダーの数と実際にバインドされる値の数が一致していないから。

つまり、$created_atnにはNOW関数がただの文字列で代入されているので、INSERT分の中のNOW()と$created_atは結びついていない。

なのでトークンの数が一致しないとエラーを吐かれる。

NOW関数は変数に代入するのではなく、クエリ文の中に直接書いたらそれで実行されるので、バインドする必要がない。

トークンとは?

SQL文内に存在する「:」などで囲まれたパラメータープレースホルダーのこと。