【发布时间】:2013-01-13 07:32:41
【问题描述】:
我无法将此now() + INTERVAL INSERT 语句转换为带有命名占位符的 PDO 准备语句。
当我使用'now() + INTERVAL 3 DAY' 或'DATE_ADD(now(), INTERVAL 3 DAY)' 绑定值时,它会插入000 而不是正确的日期时间(0000-00-00 00:00:00)
这是我之前使用的:
$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 帖子(包括这个 link) 建议将 now() 语句放在 VALUES 中而不是绑定它,但这会导致错误消息 'Invalid parameter number: number绑定变量的数量与标记的数量不匹配'
$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();
【问题讨论】:
-
从
:now() + INTERVAL 3 DAY中删除:。您还应该使用bindParam而不是bindValue。 -
如果它清楚地写着
'Invalid parameter number: number of bound variables does not match number of tokens'- 为什么不计算冒号的数量? -
@crush - 在第 42 行的 /home4/clickfi4/public_html/demo/forgotpass-exec.php 中生成错误消息“解析错误:语法错误,意外 ':',期待 ')' "
-
@YourCommonSense - 你能详细说明一下吗?我一直认为 INSERT、VALUE 和 bindValue 语句中的变量数量应该相同,所以我假设这种方法的问题是它们的数量不匹配。
-
@ChayaCooper 这与使用正确的术语无关。
INSERT的VALUES()部分中应该有三个变量,因为那是有多少列。但是,这些列中只有两列是bound使用bindValue方法的列。由于您最初有 3 个绑定列,但只为其中两个绑定列分配值,因此您收到了 Your Common Sense 显示的错误。
标签: php mysql datetime insert pdo