【问题标题】:php sqlsrv insert failedphp sqlsrv 插入失败
【发布时间】:2015-12-17 17:58:12
【问题描述】:

我正在尝试通过 Web 界面将一行插入 Microsoft 动态 RMS 数据库。我可以从 Store Operations Manager(命令行?)运行插入,它工作得很好,但是当我尝试使用 sqlsrv 从我的 PHP 脚本运行它时,它会转储一个 515 错误,说它不能将空值插入 ID 列.

我觉得错误是 sqlsrv 与数据库而不是数据库本身对话,因为我可以直接运行同一行并创建新行。

前几次我用 params 尝试了这个,但为了排除故障,我把它拿出来了。这两种方法我都遇到了同样的错误。

错误信息:

( [0] => 数组 ( [0] => 23000 [SQLSTATE] => 23000 [1] => 515 [代码] => 515 [2] => [Microsoft][SQL Server Native Client 11.0] [SQL Server]无法将值 NULL 插入到列 'ID'、表 'OMGHQ.dbo.Customer';列不允许空值。INSERT 失败。[消息] => [Microsoft][SQL Server Native Client 11.0][SQL服务器]无法将值 NULL 插入到列 'ID'、表 'OMGHQ.dbo.Customer';列不允许空值。插入失败。)[1] => 数组([0] => 01000 [SQLSTATE] => 01000 [1] => 3621 [code] => 3621 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]语句已终止。[message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]语句已终止。))

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

【问题讨论】:

    标签: php html sql-server microsoft-dynamics


    【解决方案1】:

    在不知道您的 php 变量是什么($itemID 和 $newQuantity)的情况下,使用以下参数会更安全。这是一个准备好的语句,并且具有防止某些 SQL 注入的额外好处。

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

    编辑: 虽然以上是正确的,但它不是您问题的答案。您的Customer 表上必须有一个不可为空的ID 列。也许它是主键而不是自动增量。因此,您必须在插入时指定它,或者更改架构以使其可为空或自动递增(如果它不是主键)

    【讨论】:

    • 感谢您的快速回复!我检查了表的架构,并将 ID 列设置为 is_identity = true。同样,当我让 php 回显 SQL 语句并直接运行它时,它应该可以正常工作,所以我对它为什么从 php 内部失败感到非常困惑。
    • 嗯好的,你的 php 环境可能连接到不同的 sql 服务器吗?
    • 干! fml 感谢一百万为我指出正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多