【问题标题】:SqlServer stored procedure called from php doesn't return integer output correctly从 php 调用的 SqlServer 存储过程未正确返回整数输出
【发布时间】:2014-10-28 13:55:06
【问题描述】:

我正在尝试使用 php mssql 函数从 SQL Server 2008 数据库上的存储过程中捕获输出。代码运行 iwthout 错误,但我的一个输出参数返回了一个奇怪的值。

存储过程代码:

CREATE PROCEDURE [dbo].[check_barcode_and_return]
    @Barcode nvarchar(20),
    @IsInDatabase int OUTPUT,
    @Product_Info nvarchar(100) OUTPUT

AS
  SELECT @IsInDatabase = COUNT(*) FROM dbo.product_info WHERE barcode = @Barcode

  DECLARE @Brand varchar(45)
  SET @Brand = (SELECT brand FROM dbo.product_info WHERE barcode = @Barcode)
  DECLARE @Description varchar(50)
  SET @Description = (SELECT product_desc FROM dbo.product_info WHERE barcode = @Barcode) 
  SELECT @Product_Info = @Brand + '_' + @Description
RETURN 

GO

这是调用它的 php 代码:

<?php
  // use a barcode known to be present in database
  $barcode_yes = '11335577';
  // use a sbarcode known NOT to be in database
  $barcode_no = '0011223344';
  $host = '00.000.000.000';
  $db = 'dbName';
  $user = 'username';
  $password = 'password';
  $barcodeInDB = 0;
  $productInfo = "";
  try {
    $conn = mssql_connect($host, $user, $password);
    mssql_select_db($db, $conn);
    $stmt = mssql_init('check_barcode_and_return', $conn);
    mssql_bind($stmt, '@Barcode', $barcode_yes, SQLVARCHAR, false, false, 20);
    mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT1, true, false, 1);
    mssql_bind($stmt, '@Product_Info', $productInfo, SQLVARCHAR, true, false, 100);
    mssql_execute($stmt, true);
    echo 'positive test results:'."\n";
    echo 'output $barcodeInDB = '.$barcodeInDB."\n";
    echo '$productInfo = '.$sampleInfo."\n";

    //reset for next call
    mssql_free_statement($stmt);
    $barcodeInDB = 0;
    $productInfo = "";

    $stmt = mssql_init('check_barcode_and_return', $conn);
    mssql_bind($stmt, '@Barcode', $barcode_no, SQLVARCHAR, false, false, 20);
    mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT1, true, false, 1);
    mssql_bind($stmt, '@Product_Info', $productInfo, SQLVARCHAR, true, false, 100);
    mssql_execute($stmt, true);
    echo 'negative test results:'."\n";
    echo 'output $barcodeInTable = '.$barcodeInDB."\n";
    echo '$productInfo = '.$productInfo."\n";

    mssql_close($conn);
  } 
  catch (Exception $e) {
    echo $e->getMessage();
  }
?>

当我从命令行运行时,结果如下:

positive test results:
output $barcodeInDB = 968529665
$productInfo = Heinz_tomato ketchup
negative test results:
output $barcodeInTable = 968529664
$productInfo = _

如果我直接使用 SQL Server Management Studio 运行存储过程,输入上面使用的条形码,我得到 @BarcodeInDB = 1 表示阳性测试和 @BarcodeInDB = 0 为负数。

代码位于运行 Ubuntu 和 php5.3.10 的 Linux 服务器上。

我需要更改什么才能获得整数输出参数的正确值?

【问题讨论】:

  • 有没有机会在网页上运行它并检查结果?如果网页显示正确的输出,可能与您的 php5/cli 文件夹中的 php.ini 文件有关。
  • 感谢您的建议。刚刚尝试过,仍然得到相同的结果

标签: php sql-server sql-server-2008 stored-procedures output


【解决方案1】:

我需要将输出参​​数绑定为 SQLINT4 中的整数数据类型,因为显然,T-SQL 整数变量是 4 字节整数。试图将它们强制转换为容量较小的数据类型(即 SQLINT1、SQLINT2 或 SQLBIT)会导致不可预测的输出。

所以,我改成……

...
mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT4, true);
...

效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2017-12-06
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多