2017-05-05 49 views
1

我有这个PHP的声明,如果正在“精”:插入PHP NULL变量值到MSSQL查询

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

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

的问题时,我传递变量的sqlsrv_query开始

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

如果我试图把周围IF语句中的NULL值的报价,我得到以下错误:

Notice: Array to string conversion in C:\xampp\htdocs\project\edit.php on line 30

如果NULL被直接插入查询,它执行,因为它应该。

目标表中的列属性具有启用允许空值且默认值设置为(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); 

返回:字符串(2) “36”

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

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

+0

已有一个类似的线程与此答案的答案:http://stackoverflow.com/questions/17784390/mysql-how-to-insert-null-dates –

+0

可能重复的[MySQL,如何插入空日期](http://stackoverflow.com/questions/17784390/mysql-how-to-insert-null-dates) –

+1

该列是否有默认值,如当前日期,或可以接受NULL值?检查是否有触发事件。 –

回答

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); 

通过使用查询参数,你可以没有任何问题转移此空值。

总是使用参数!

+0

已更改代码以包含参数,并且正在传输NULL值。 非常感谢@ Bernd-Ott 我意识到SQL注入,但希望首先获得功能。感谢您指出它。 – kristapmon

0

分配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()); 

使用PHP的VAR在SQL代码中,你可以SQL注入攻击

+0

这段代码也有sql注入漏洞! –

+0

@BerndOtt correct .. alert added to the answer – scaisEdge

0

这是因为每当有缺失值,将其作为NULL而不是空字符串的受害者要小心。空字符串将被默认为1900-01-01

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

结果

1900-01-01 00:00:00