【问题标题】:I can't get records from a stored procedure我无法从存储过程中获取记录
【发布时间】:2013-12-01 22:10:20
【问题描述】:

我无法从存储过程中获取记录。如果我从 SQL Server 运行,我会得到记录。如果我从 .NET 调用它,我会得到记录……但如果我从 PHP 调用它,我不会得到记录。

我在 CentOS 6 上使用 PHP 5.3.3。我使用的是 mssql。其他SP都ok。

我试过了

$provider = 1010;
$array = array();
$stmt2 = mssql_init("[dbo].[PORA_sp_GET_LetterGenerationRecords]");
mssql_bind($stmt2, "@ProviderID", $provider, SQLINT4);
$letters = mssql_execute($stmt2);
while($row = mssql_fetch_assoc($letters)){
    $array[] = $row;
}
mssql_free_statement($stmt2);
echo '<pre>'; print_r($array); echo '</pre>';

我有

Array
(
)

我也试过了

$array = array();
$letters = mssql_query('EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010');
while($row = mssql_fetch_assoc($letters)){
    $array[] = $row;
}
echo '<pre>'; print_r($array); echo '</pre>';

我得到了

Array
(
)

我包括

echo 'MSSQL error: '. mssql_get_last_message();

以及答案:

MSSQL error: 

我很好奇。现在我正在逐步从 PHP 运行 SP。太丢人了。

我试过了:

    $provider = 1010;
    $array = array();
//    $letters = mssql_query('EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010');
    $stmt2 = mssql_init("[dbo].[PORA_sp_GET_LetterGenerationRecords]");
    mssql_bind($stmt2, "@ProviderID", $provider, SQLINT4);
    $letters = mssql_execute($stmt2);
    if($letters){
        echo mssql_num_rows($letters);
        while($row = mssql_fetch_assoc($letters)){
            $array[] = $row;
        }
        mssql_free_statement($stmt2);
        echo '<pre>'; print_r($array); echo '</pre>';
    }
    else{
        echo 'MSSQL error: '. mssql_get_last_message();

        echo error_get_last();
    }

同样的答案。

【问题讨论】:

  • 那么如果你在 PHP 中使用相同的代码执行SELECT * FROM whatever,它会返回一个结果集?
  • 当我在 PHP 中运行所有内容时,运行正常。这个 SP 很复杂,因为它从一些表中获取数据并用这些数据创建一个临时表。
  • 澄清一下,如果您在管理工作室或其他任何地方执行EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010,它可以正常工作吗? (而不是在过程中执行代码)
  • 是的。如果我从 .NET 调用 SP,它也可以正常工作。
  • 为避免混淆,在最后一个示例中(以 $provider = 1010; 开头),您在 if 中缺少一个“s”。 $字母与$字母。我不知道 $letter 是否可以但超出范围。

标签: php sql sql-server stored-procedures


【解决方案1】:

您的代码看起来不错,但由于某种原因,sql 语句被终止了。

所以你需要调试这个,我建议首先尝试让它与硬编码的参数一起工作:

try {
    $array = array();
    $result = mssql_query('EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010');
    while ($row = mssql_fetch_assoc($result))
    {
        $array[] = $row;
    }
    var_dump($array);
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
    error_log($e->getMessage());// or log it to a txt file
    echo 'MSSQL error: '. mssql_get_last_message();
    echo 'Last error: '.error_get_last();

}


您还应该运行 SQL 探查器并过滤异常以获得更好的主意。

【讨论】:

  • 我做到了。答案是 array(0) { }
  • sql语句被终止的原因是什么?
  • @EmilioGort 错误它的意义并不完全,因为它可能是由于不同的事情。
  • 我创建了一个不同的模板,以便使用 SQL Profiler 查找错误。我明白了:sql 错误:515,严重性:16,状态:2 我在列中搜索了 NULL 数据,并修复了它。
【解决方案2】:
<?php
   $query = "EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010";
   $result = mssql_query($query);
   if (!$result) {
       die('Invalid query: ' . mssql_error());
   }

   while ($row = @mssql_fetch_assoc($result)) {
        echo $row['col1']
   }
?>

【讨论】:

  • 我做了 $query = "EXEC [dbo].[PORA_sp_GET_LetterGenerationRecords] @ProviderID = 1010"; $result = mssql_query($query); if (!$result) { die('无效查询:' . mssql_error()); } 回声 mssql_num_rows($result); while ($row = @mssql_fetch_assoc($result)) { echo $row['ID']; } 和结果: 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多