【问题标题】:what is the date format to insert a date using sqlsrv_query?使用 sqlsrv_query 插入日期的日期格式是什么?
【发布时间】:2020-07-23 07:20:09
【问题描述】:

我通过这个 sql 查询得到所有行:

$sql = "SELECT * FROM USERS";
$stmt3 = sqlsrv_query( $conn, $sql3 , $params, $options );

但是当我想插入时:

$sql2 = 
   "INSERT INTO USER (USER_ID, USER_NOM, USER_DATE) 
   VALUES (".$row['USER_ID'].", '".$row['USER_NOM']."','".$row['USER_DATE']->format('Y-m-d h:i:s.v')."')";

我收到此错误:

将 varchar 数据类型转换为 datetime 导致超出范围 价值。

这是我的$sql2

INSERT INTO USER (USER_ID, USER_NOM, USER_DATE) VALUES (1,DANI,'2020-07-22 12:00:00.000')

【问题讨论】:

标签: php sql-server sqlsrv


【解决方案1】:

您需要考虑以下几点:

  • 您需要使用参数化语句来防止可能的 SQL 注入问题。正如documentation 中提到的,sqlsrv_query() 函数非常适合一次性查询,除非有特殊情况,否则应该是执行查询的默认选择。此函数提供了一种简化的方法,可以用最少的代码执行查询。 sqlsrv_query 函数同时进行语句准备和语句执行,可用于执行参数化查询。
  • 默认情况下,smalldatetimedatetimedatetimedatetime2datetimeoffset 类型将作为 PHP DateTime 对象返回,但可以通过设置 'ReturnDatesAsStrings' 来更改此行为连接字符串或语句级别的选项(更多解释可见here)。

如果您确定日期/时间值作为 PHP DateTime 对象返回,您有两个选择:

  • 使用明确的格式(例如2020-07-22T12:00:00.000)将日期时间值作为文本传递
  • 使用 sqlsrv_query() 调用的参数扩展语法将日期时间值作为 PHP DateTime 对象传递。

示例(日期时间值作为文本传递):

<?php
// SELECT statement
$sql3  = "SELECT * FROM USERS";
$stmt3 = sqlsrv_query($conn, $sql3 , $params, $options);
if ($stmt3 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}   

// INSERT statements
while ($row = sqlsrv_fetch_array($stmt3, SQLSRV_FETCH_ASSOC)) { 
    $sql2 = "
        INSERT INTO USER (USER_ID, USER_NOM, USER_DATE) 
        VALUES (?, ?, ?)
    ";
    $params = array(
       $row['USER_ID'], 
       $row['USER_NOM'], 
       $row['USER_DATE']->format('Y-m-d\TH:i:s.v'));
    );
    $stmt2 = sqlsrv_query($conn, $sql2 , $params);

}
?>

示例(日期时间值作为 PHP DateTime 对象传递):

<?php
// SELECT statement
$sql3  = "SELECT * FROM USERS";
$stmt3 = sqlsrv_query($conn, $sql3 , $params, $options);
if ($stmt3 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}   

// INSERT statements
while ($row = sqlsrv_fetch_array($stmt3, SQLSRV_FETCH_ASSOC)) { 
    $sql2 = "
        INSERT INTO USER (USER_ID, USER_NOM, USER_DATE) 
        VALUES (?, ?, ?)
    ";
    $params = array(
        array($row['USER_ID'], SQLSRV_PARAM_IN),
        array($row['USER_NOM'], SQLSRV_PARAM_IN),
        array($row['USER_DATE'], SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_DATETIME, SQLSRV_SQLTYPE_DATETIME)
    );
    $stmt2 = sqlsrv_query($conn, $sql2 , $params);

}
?>

【讨论】:

    【解决方案2】:

    要插入Datetime类型的Datetime值,应该是'YYYY-MM-DD HH:MM:SS'格式。

    支持的范围是“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。

    注意:-更多详情请参考https://dev.mysql.com/doc/refman/8.0/en/datetime.html

    【讨论】:

    • 我试过了,但没用 $row['USER_DATE']->format('Y-m-d h:i:s')
    • 你在 `$row['USER_DATE']' 中有什么?
    • 请将日期从 varchar 数据类型转换为日期时间
    • object(DateTime)[1] public 'date' => string '2020-07-22 12:00:00.000000' (length=26) public 'timezone_type' => int 3 public 'timezone ' => 字符串 'UTC' (长度=3)
    • 这完全忽略了 OP 在这里存在巨大的安全漏洞这一事实。
    猜你喜欢
    • 2012-04-12
    • 2011-10-13
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多