您需要考虑以下几点:
- 您需要使用参数化语句来防止可能的 SQL 注入问题。正如documentation 中提到的,
sqlsrv_query() 函数非常适合一次性查询,除非有特殊情况,否则应该是执行查询的默认选择。此函数提供了一种简化的方法,可以用最少的代码执行查询。 sqlsrv_query 函数同时进行语句准备和语句执行,可用于执行参数化查询。
- 默认情况下,
smalldatetime、datetime、date、time、datetime2 和 datetimeoffset 类型将作为 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);
}
?>