PHP getdate()在代码中的两个不同位置使用时不返回同一天/月
我有一个函数调用另一个函数将一些值写入MSSQL数据库。它将字符串请求作为第一个参数,如果这些值包含在变量中且无法在查询中显式写入,则它将接受一个数组,该数组包含要在查询中输入的值(在查询中有?)。以下是所讨论的功能:PHP getdate()在代码中的两个不同位置使用时不返回同一天/月,php,sql-server,date,datetime,web,Php,Sql Server,Date,Datetime,Web,我有一个函数调用另一个函数将一些值写入MSSQL数据库。它将字符串请求作为第一个参数,如果这些值包含在变量中且无法在查询中显式写入,则它将接受一个数组,该数组包含要在查询中输入的值(在查询中有?)。以下是所讨论的功能: public function dbInsert(){ $curr_date = date('Y-m-d H:i:s'); $this->db->query("INSERT INTO DAI_REQ.META_REQUEST ". "
public function dbInsert(){
$curr_date = date('Y-m-d H:i:s');
$this->db->query("INSERT INTO DAI_REQ.META_REQUEST ".
"(DATE_RECU, DATE_TERMINEE, USER_ID, STATUS) ".
"VALUES(?, '', ?, 'R');", array($curr_date, $this->userId));
$mr_select = $this->db->query("SELECT TOP 1 ID FROM DAI_REQ.META_REQUEST WHERE USER_ID = ? ORDER BY ID DESC;",
array($this->userId));
$mr_result = $mr_select->result_array();
$mr_id = $mr_result[0]['ID'];
$sim = 'N/A';
if(isset($this->recurrenceType))
$sim = 'Recurrent';
$this->db->query("INSERT INTO DAI_REQ.REQUEST ".
"(USER_ID, ASSIGNED_DATE, REQUEST_END_DATE, MODEL, EXPERIMENT, VARIABLE, START_DATE, END_DATE, ".
"LON_FROM, LAT_FROM, LON_TO, LAT_TO, RESOLUTION, FORMAT, SIMULATION, STATUS, ".
"CANCELLED_YN, PROJECT, MR_ID, URL_ORIGIN, DATE_EMAIL) ".
"VALUES(?, ?, '', ?, 'N/A', 'N/A', ?, ?, ?, ?, ?, ?, ?, ?, ?, 'R', 0, 'N/A', ?, ?, ?);",
array($this->userId, $curr_date, $this->model, $this->startDate, $this->endDate,
$this->lonFrom, $this->latFrom, $this->lonTo, $this->latTo,
$this->resolution, $this->format, $sim, $mr_id, $this->url_origin, $this->date_email));
$r_select = $this->db->query("SELECT TOP 1 ID FROM DAI_REQ.REQUEST WHERE USER_ID = ? ORDER BY ID DESC;",
array($this->userId));
$r_result = $r_select->result_array();
$this->id = $r_result[0]['ID'];
}
如您所见,我调用了两次query
函数,在这两次查询中,我使用了包含今天日期的变量$curr\u date
。不幸的是,运行此代码后,当我使用sql server查看数据库时,我在DAI_REQ.META_请求
表中看到的日期与DAI_REQ.REQUEST
表中看到的日期不同。后者包含一个好的日期,而前者包含一个随机的日期(尽管我每天都在尝试这个日期)。例如,后者将2014-06-30 14:08:40.427
,前者将2014-02-19 00:00:00.000
我还必须提到,我们有两个服务器(也就是两个数据库),一个用于开发,一个用于公共部署。我所描述的问题发生在公共部署服务器上,而不是在开发服务器上
我还尝试通过直接调用query
函数中的getdate()
函数来删除$curr\u date
变量的使用,如下所示:
$this->db->query("INSERT INTO DAI_REQ.META_REQUEST ".
"(DATE_RECU, DATE_TERMINEE, USER_ID, STATUS) ".
"VALUES(GETDATE(), '', ?, 'R');", array($this->userId));
...
$this->db->query("INSERT INTO DAI_REQ.REQUEST ".
"(USER_ID, ASSIGNED_DATE, REQUEST_END_DATE, MODEL, EXPERIMENT, VARIABLE, START_DATE, END_DATE, ".
"LON_FROM, LAT_FROM, LON_TO, LAT_TO, RESOLUTION, FORMAT, SIMULATION, STATUS, ".
"CANCELLED_YN, PROJECT, MR_ID, URL_ORIGIN, DATE_EMAIL) ".
"VALUES(?, GETDATE(), '', ?, 'N/A', 'N/A', ?, ?, ?, ?, ?, ?, ?, ?, ?, 'R', 0, 'N/A', ?, ?, ?);",
array($this->userId, $this->model, $this->startDate, $this->endDate,
$this->lonFrom, $this->latFrom, $this->lonTo, $this->latTo,
$this->resolution, $this->format, $sim, $mr_id, $this->url_origin, $this->date_email));
导致此行为的原因是什么?getdate()
返回一个关联数组,其中包含时间戳的日期信息,如果没有给出时间戳,则返回当前本地时间。。您需要的是:
getdate()
返回一个关联数组,该数组包含时间戳的日期信息,如果没有给出时间戳,则返回当前本地时间。。您需要的是:
有关详细信息,请参阅
我有这种行为的原因是,在第一次INSERT
查询中,行实际上没有被插入到DAI_REQ.META_请求中。这是由于部署服务器的DAI_REQ.META_请求
表未设置为自动递增ID
属性。有关详细信息,请参阅
我有这种行为的原因是,在第一次INSERT
查询中,行实际上没有被插入到DAI_REQ.META_请求中。这是由于部署服务器的DAI_REQ.META_请求
表未设置为自动递增ID
属性。是否可以发布架构?这两个表的数据类型可能不同。@BA_Webimax我现在手头上没有架构,但我可以确认DAI_REQ.REQUEST
和DAI_REQ.META_REQUEST
中的两个字段都属于(日期时间,非空)
您的代码自然会受到竞争条件的影响。您只是假设在执行插入操作和选择操作之间,不可能为同一用户将其他记录插入数据库。这是一个错误的假设。您应该使用@@IDENTITY或类似工具来获取刚才插入的记录的id。@MarcB SCOPE_IDENTITY()更好,但无论哪种情况,它都必须是同一批的一部分(当前代码发送两个不同的批)。@MarcB@AaronBertrand所以不要编写$mr_select=$this->db->query(“从AI_REQ.META_请求中选择前1个ID,其中USER_ID=?ORDER BY ID DESC;”,数组($this->userId))
从该查询中获取ID,我应该编写$mr_ID=$this->db->query(“选择当前标识('DAI_REQ.META_请求'))
直接发布?能否发布架构?这两个表的数据类型可能不同。@BA_Webimax我现在手头没有架构,但我可以确认DAI_REQ.REQUEST
和DAI_REQ.META_REQUEST
中的两个字段都是类型(日期时间,非空)
您的代码自然会受到竞争条件的影响。您只是假设在执行插入操作和选择操作之间,同一用户的其他记录不可能被插入数据库。这是一个错误的假设。您应该使用@IDENTITY或类似工具来获取刚插入的记录的id。@MarcB SCOPE_IDENTITY()更好,但无论哪种情况,它都必须是同一批的一部分(当前代码发送两个不同的批)。@MarcB@AaronBertrand因此,不要编写$mr_select=$this->db->query(“从AI_REQ.META_请求中选择前1个ID,其中USER_ID=?ORDER BY ID DESC;”,数组($this->userId))
从该查询中获取ID,我应该编写$mr_ID=$this->db->query(“直接选择当前标识('DAI_REQ.META_REQUEST')”);
?我已经尝试过了,但没有解决问题。我已经用$curr_date=getdate();
替换为$curr_date=date('Y-m-d H:I:s'))
和我有相同的行为。我尝试过这个方法,但没有解决问题。我将行$curr\u date=getdate();
替换为$curr\u date=date('Y-m-d H:I:s');
和我有相同的行为。
$curr_date = date('Y-m-d H:i:s');