Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入带有';现在();间隔';插入000';PDO中带有命名占位符的_Php_Mysql_Datetime_Insert_Pdo - Fatal编程技术网

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执行