自分の勉強用です。
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文内に存在する「:」などで囲まれたパラメータープレースホルダーのこと。