Php 插入带有';现在();间隔';插入000';PDO中带有命名占位符的
我无法将此Php 插入带有';现在();间隔';插入000';PDO中带有命名占位符的,php,mysql,datetime,insert,pdo,Php,Mysql,Datetime,Insert,Pdo,我无法将此now()+INTERVALINSERT语句转换为带有命名占位符的PDO准备语句 当我使用'now()+INTERVAL 3 DAY'或'DATE\u ADD(now(),INTERVAL 3 DAY)绑定值时,它会插入000而不是正确的日期时间(0000-00-00:00:00) 这是我以前使用的: 新的PDO声明: 我也试过: 在几个SO公告中提出的替代方法 一些SO帖子(包括这篇)建议将now()语句放在值中,而不是绑定它,但这会导致错误消息“无效参数编号:绑定变量的数量与令牌的
now()+INTERVAL
INSERT语句转换为带有命名占位符的PDO准备语句
当我使用'now()+INTERVAL 3 DAY'
或'DATE\u ADD(now(),INTERVAL 3 DAY)
绑定值时,它会插入000而不是正确的日期时间(0000-00-00:00:00)
这是我以前使用的:
新的PDO声明:
我也试过:
在几个SO公告中提出的替代方法
一些SO帖子(包括这篇)建议将now()语句放在值中,而不是绑定它,但这会导致错误消息“无效参数编号:绑定变量的数量与令牌的数量不匹配”
在
:now()前面有一个冒号
就这样。只是打字错误
您的第二条错误消息清楚地表明,您实际上并没有删除冒号,而是删除了其他内容—很可能是引用。你需要更加专心地写作。请注意错误消息,它们的信息量很大 在:now()前面有一个冒号
就这样。只是打字错误
您的第二条错误消息清楚地表明,您实际上并没有删除冒号,而是删除了其他内容—很可能是引用。你需要更加专心地写作。请注意错误消息,它们的信息量很大 从:now()+间隔3天删除冒号
$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();
或者,您可以这样做:
$stmt = $conn->prepare('
INSERT INTO
password_reset (user_id, temp_password, expiry_date)
VALUES
(:user_id, :temp_password, now() + INTERVAL 3 DAY)
');
$insertResult = $stmt->execute(array(
":user_id" => $member_user_id,
":temp_password" => $random_password)
);
在使用准备好的语句时,您应该将该语句视为插入数据的模板
如果您有一个具有以下结构的数据库表:
user_id INT
temp_password VARCHAR(128)
expiry_date DATE
您的表中有三列插入这些列中的两个值将来自PHP,另一个将由SQL计算。由于SQL将完成expiry_date列的所有工作,因此它不需要绑定到PHP中的任何内容
因此,检查INSERT
语句:
INSERT INTO password_reset (user_id, temp_password, expiry_date) VALUES (:user_id, :temp_password, now() + INTERVAL 3 DAY)
VALUES()
子句的每个参数都需要与插入表(列…
子句中声明的列名匹配
在准备好的语句中,由于我们正在创建一个模板,所以我们使用占位符
来显示在语句执行时我们将在语句中插入值的位置。占位符可以是您使用的:name
版本,也可以是问号?
PDO::prepare($statement)
告诉SQL server准备语句。此时,SQL已经为您的查询提供了模板,并准备好接收该查询中占位符的值
PDOStatement::execute($placeholderValues)
执行准备好的语句的单个实例,将占位符替换为与bindParam
、bindValue
绑定的值,或作为参数传递给execute()
因此,基本上,每个execute()
上发送到SQL server的所有内容都是要插入占位符的值,而不是整个查询字符串
现在有一部分解释了为什么不能bindValue(“:expiration\u date”,“Now()+INTERVAL 3 DAY”)
当值到达SQL server时,SQL server会对它们进行清理,并用它们的值替换相应的占位符。
当您绑定“now()+INTERVAL 3 DAY”
时,实际上是在绑定字符串。因为它是一个字符串,所以不会作为SQL代码执行。从:now()+INTERVAL 3天中删除冒号
$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();
或者,您可以这样做:
$stmt = $conn->prepare('
INSERT INTO
password_reset (user_id, temp_password, expiry_date)
VALUES
(:user_id, :temp_password, now() + INTERVAL 3 DAY)
');
$insertResult = $stmt->execute(array(
":user_id" => $member_user_id,
":temp_password" => $random_password)
);
在使用准备好的语句时,您应该将该语句视为插入数据的模板
如果您有一个具有以下结构的数据库表:
user_id INT
temp_password VARCHAR(128)
expiry_date DATE
您的表中有三列插入这些列中的两个值将来自PHP,另一个将由SQL计算。由于SQL将完成expiry_date列的所有工作,因此它不需要绑定到PHP中的任何内容
因此,检查INSERT
语句:
INSERT INTO password_reset (user_id, temp_password, expiry_date) VALUES (:user_id, :temp_password, now() + INTERVAL 3 DAY)
VALUES()
子句的每个参数都需要与插入表(列…
子句中声明的列名匹配
在准备好的语句中,由于我们正在创建一个模板,所以我们使用占位符
来显示在语句执行时我们将在语句中插入值的位置。占位符可以是您使用的:name
版本,也可以是问号?
PDO::prepare($statement)
告诉SQL server准备语句。此时,SQL已经为您的查询提供了模板,并准备好接收该查询中占位符的值
PDOStatement::execute($placeholderValues)
执行准备好的语句的单个实例,将占位符替换为与bindParam
、bindValue
绑定的值,或作为参数传递给execute()
因此,基本上,每个execute()
上发送到SQL server的所有内容都是要插入占位符的值,而不是整个查询字符串
现在有一部分解释了为什么不能bindValue(“:expiration\u date”,“Now()+INTERVAL 3 DAY”)
当值到达SQL server时,SQL server会对它们进行清理,并用它们的值替换相应的占位符。
当您绑定“now()+INTERVAL 3 DAY”
时,实际上是在绑定字符串。因为它是一个字符串,所以不会作为SQLCOD执行