【问题标题】:Inserting PHP NULL variable value into MSSQL query将 PHP NULL 变量值插入 MSSQL 查询
【发布时间】:2017-05-05 11:45:07
【问题描述】:

我有这个运行良好的 PHP IF 语句:

if(EMPTY($_POST['review_date'])){
    $review_date = NULL;
}
else {
    $review_date = $_POST['review_date'];
}

当我将变量传递给 sqlsrv_query 时,问题就开始了:

sqlsrv_query($connect,"UPDATE goals SET review_date='$review_date' WHERE id='$department'") or die(sqlsrv_errors());

在 IF 语句为 TRUE 的情况下,review_date 单元格中的值显示为 1900-01-01,而不是 NULL。

如果我尝试在 IF 语句中为 NULL 值加上引号,我会收到以下错误:

注意:数组到字符串的转换 C:\xampp\htdocs\project\edit.php 上 第 30 行

如果 NULL 直接插入到查询中,它会按原样执行。

目标表中的列属性已启用 Allow Nulls 并且默认值设置为 (NULL)。

快速解决了其他问题,但没有真正得到任何结果。

我在这里做错了什么?

更新 1:

根据要求,这里是 HTML 代码:

<form method="POST" action="edit.php">

Review date <i>(optional)</i>: <input type="date" name="review_date" value="" placeholder="dd/mm/yyyy" > 

<p><button type="submit">Save</button></p>

</form>

关于 var_dumps:

var_dump($review_date);

返回: NULL

var_dump($department);

返回: string(2) "36"

var_dump(sqlsrv_query($connect,"UPDATE goals SET review_date='$review_date' WHERE id='$department'"));

返回:资源(7)类型(SQL Server 语句)

【问题讨论】:

  • 已经有一个类似的帖子回答了这个问题:stackoverflow.com/questions/17784390/…
  • 该列是否有默认值,例如当前日期,或者可以接受 NULL 值?还要检查是否有触发事件。
  • 您确实需要检查您的数据库架构。
  • @RenéHoffmann 可能是重复的,但如果我在上面对他们的评论是正在发生的事情,那么该重复将不适用。如果 OP 接受其中一个答案,那么我将使用您标记为的副本关闭它。他们需要发布他们的数据库架构。

标签: php sql sql-server null sqlsrv


【解决方案1】:

你的代码很危险,因为它包含 SQL 注入!

你应该这样做:

if(EMPTY($_POST['review_date'])){
    $review_date = NULL;
}
else {
    $review_date = $_POST['review_date'];
}

$sql = "UPDATE goals SET review_date=? WHERE id=?";
$params = array($review_date, $department);

$stmt = sqlsrv_query( $conn, $sql, $params);

通过在查询中使用参数,您可以毫无问题地传输此空值。

始终使用参数!

【讨论】:

  • 更改了代码以包含参数,现在正在传输 NULL 值。非常感谢@Bernd-Ott 我知道 SQL 注入,但想首先获得功能。感谢您指出这一点。
【解决方案2】:

这是因为每当有缺失值时,将其发送为 NULL 而不是空字符串。空字符串将默认为 1900-01-01

declare @d datetime
set @d=''
select @d as date

结果

1900-01-01 00:00:00

【讨论】:

    【解决方案3】:

    将 NULL 分配给 var 意味着一个空日期而不是一个空日期,所以

    你可以使用不同的条件来动态生成你需要的代码

    if(EMPTY($_POST['review_date'])){
        $code = ' SET review_date = NULL ' ;
    }
    else {
        $code = ' SET review_date = ' $_POST['review_date'];
    }
    
    
    sqlsrv_query($connect,"UPDATE goals ". $code . " WHERE id='$department'") or die(sqlsrv_errors());
    

    小心在 sql 代码中使用 php var,你可能会成为 sqlinjection 的受害者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多