我试图通过Web界面将行插入Microsoft Dynamics RMS数据库。我可以从Store Operations Manager(命令行?)运行插入并且它运行良好,但是当我尝试使用sqlsrv从我的PHP脚本运行它时,它会转储一个515错误,说它无法在ID列中插入空值
我觉得错误是sqlsrv与数据库而不是数据库本身交谈的原因,因为我可以直接运行同一行并创建新行。
我在前几次用params尝试了这个,但为了解决问题而把它拿出来了。我用这两种方法都得到了同样的错误。
错误消息:
([0] =&gt;数组([0] =&gt; 23000 [SQLSTATE] =&gt; 23000 [1] =&gt; 515 [code] =&gt; 515 [2] =&gt; [Microsoft] [ SQL Server Native Client 11.0] [SQL Server]无法将值NULL插入列&#39; ID&#39;,表&#39; OMGHQ.dbo.Customer&#39 ;;列不允许空值.INSERT失败。[ message] =&gt; [Microsoft] [SQL Server Native Client 11.0] [SQL Server]无法将值NULL插入列&#39; ID&#39;,table&#39; OMGHQ.dbo.Customer&#39 ;;列不允许空值.INSERT失败。)[1] =&gt;数组([0] =&gt; 01000 [SQLSTATE] =&gt; 01000 [1] =&gt; 3621 [code] =&gt; 3621 [2] =&gt; ; [Microsoft] [SQL Server Native Client 11.0] [SQL Server]语句已终止。[message] =&gt; [Microsoft] [SQL Server Native Client 11.0] [SQL Server]语句已终止。))< / p>
$conn = sqlConnection();
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}
$itlquery = "DECLARE @itemID INT
DECLARE @newQuantity INT
SET @itemID = $itemID
SET @newQuantity = $newQuantity
INSERT INTO inventorytransferlog (itemID, quantity, cashierID, type, cost) VALUES (@itemID, @newQuantity - (SELECT TOP 1 quantity FROM item WHERE id = @itemID), 6, 5, (SELECT TOP 1 cost FROM item WHERE id = @itemID));";
echo $itlquery;
$itlstatement = sqlsrv_query($conn,$itlquery);
if($itlstatement === false)
{
die(print_r(sqlsrv_errors(),true));
}
答案 0 :(得分:0)
不知道你的php变量是什么($ itemID和$ newQuantity),使用如下参数更安全。这是一个准备好的语句,并且具有防止一些SQL注入的额外好处。
var prop = "param01";
var val = "value01";
var obj = {};
obj[prop] = val;
修改强>
虽然以上是正确的,但它不是你问题的答案。您的$itlquery = "INSERT INTO inventorytransferlog (itemID, quantity, cashierID, type, cost) VALUES (?, ? - (SELECT TOP 1 quantity FROM item WHERE id = ?), 6, 5, (SELECT TOP 1 cost FROM item WHERE id = ?));";
echo $itlquery;
$itlstatement = sqlsrv_query($conn,$itlquery,array($itemId,$newQuantity,$itemId,$itemId));
表格上必须有一个ID
列,该列不可为空。也许它是主键而不是自动增量。因此,您必须在插入中指定它,或更改架构以使其可为空或自动递增(如果它不是主键)