now() + INTERVAL
このINSERT ステートメントを名前付きプレースホルダーを持つ PDO 準備済みステートメントに変換する際に問題が発生しています。
'now() + INTERVAL 3 DAY'
またはを使用して値をバインドすると、正しい日時(0000-00-00 00:00:00)'DATE_ADD(now(), INTERVAL 3 DAY)'
の代わりに 000 が挿入されます。
これは私が以前に使用していたものです:
$qry = "INSERT INTO password_reset(user_id, temp_password, expiry_date)
VALUES('$member_user_id','$temp_password', now() + INTERVAL 3 DAY)";
新しい PDO ステートメント:
$stmt = $conn->prepare('INSERT INTO password_reset (user_id, temp_password, expiry_date)
VALUES(:user_id, :temp_password, :expiry_date)');
$stmt->bindValue(':user_id', $member_user_id);
$stmt->bindValue(':temp_password', $random_password);
$stmt->bindValue(':expiry_date', 'now() + INTERVAL 3 DAY');
$insertResult = $stmt->execute();
私もこれを試しました:
$stmt->bindValue(':expiry_date', 'DATE_ADD(now(), INTERVAL 3 DAY)');
いくつかのSO投稿で提案された代替方法
いくつかの SO 投稿(このリンクを含む)では、now() ステートメントをバインドする代わりに VALUES に配置することを提案しましたが、これによりエラー メッセージ「無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません」が発生します。
$stmt = $conn->prepare('INSERT INTO password_reset (user_id, temp_password, expiry_date)
VALUES(:user_id, :temp_password, :now() + INTERVAL 3 DAY)');
$stmt->bindValue(':user_id', $member_user_id);
$stmt->bindValue(':temp_password', $random_password);
$insertResult = $stmt->execute();