PHP 的 SQLSRV 间歇性失败
SQLSRV with PHP fail intermittently
我在 Apache 上有一个 运行ning 系统 PHP 5.5 和一个数据库 SQLSERVER 2012 Express。
安装扩展 "php_sqlsrv_55_ts" 并在 php.ini 中添加扩展后,我为我的 SO (Windows 8.1) 安装了 ODBC 控制器。
好吧,我很确定我安装的一切都是正确的。
当我运行一个php脚本时,它return输出变量O.K(最后的例子)。但是过了一段时间,这个脚本 "fail" 和 return 什么都没有了。不是错误消息,不是 var 输出,任何东西。这间歇性地发生。有时工作 O.K,有时失败。
如您所见,我将默认变量 $outputVar 设置为 -1。
在脚本执行程序后,我预计这会覆盖我的 $outputVar,并且这项工作 O.K。问题是,有时脚本 运行 没有错误,但没有 return 任何东西,因此 $outputVar 永远不会被覆盖,默认值仍然是 -1.
这发生在我所有的程序中,即使是最简单的程序。
这是随机发生的。
我的 PHP 脚本。
$serverName = "xx.xx.xx.xx\SQLEXPRESS, 1433";
$connectionInfo = array(
"Database" => "xxxxx",
"UID" => "xxxxx",
"PWD" => "xxxxx",
'CharacterSet' => 'UTF-8',
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn) {
echo "ok.";
} else {
echo "error";
}
$outputVar = 'ANDRONICO'; // this is default value.
$parameters = array(
array($outputVar, SQLSRV_PARAM_OUT),
);
$query = '{CALL TEST_SP(?)}';
$stmt = sqlsrv_query($conn, $query, $parameters);
sqlsrv_next_result($stmt);
if ($stmt === false) {
$errors = sqlsrv_errors();
var_dump($errors);
}
var_dump($outputVar); // this var is overwrite by SQLSRV library.
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
我的存储过程return一个1到1000的随机数
CREATE PROCEDURE [dbo].[test_1]
(
@ret_cod int OUTPUT
)
As
BEGIN TRY
SET NOCOUNT On
SET @ret_cod = (SELECT ROUND(((999) * RAND() + 1), 0));
END TRY
BEGIN CATCH
SET @ret_cod = (SELECT ERROR_NUMBER() AS ErrorNumber)
END CATCH
正如 sofl 所说,
问题已解决,将选项添加到我的程序 "SET NOCOUNT ON" 并注意程序,除了我需要的结果外,不要输出任何内容。
我在 Apache 上有一个 运行ning 系统 PHP 5.5 和一个数据库 SQLSERVER 2012 Express。
安装扩展 "php_sqlsrv_55_ts" 并在 php.ini 中添加扩展后,我为我的 SO (Windows 8.1) 安装了 ODBC 控制器。
好吧,我很确定我安装的一切都是正确的。
当我运行一个php脚本时,它return输出变量O.K(最后的例子)。但是过了一段时间,这个脚本 "fail" 和 return 什么都没有了。不是错误消息,不是 var 输出,任何东西。这间歇性地发生。有时工作 O.K,有时失败。
如您所见,我将默认变量 $outputVar 设置为 -1。
在脚本执行程序后,我预计这会覆盖我的 $outputVar,并且这项工作 O.K。问题是,有时脚本 运行 没有错误,但没有 return 任何东西,因此 $outputVar 永远不会被覆盖,默认值仍然是 -1.
这发生在我所有的程序中,即使是最简单的程序。
这是随机发生的。
我的 PHP 脚本。
$serverName = "xx.xx.xx.xx\SQLEXPRESS, 1433";
$connectionInfo = array(
"Database" => "xxxxx",
"UID" => "xxxxx",
"PWD" => "xxxxx",
'CharacterSet' => 'UTF-8',
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn) {
echo "ok.";
} else {
echo "error";
}
$outputVar = 'ANDRONICO'; // this is default value.
$parameters = array(
array($outputVar, SQLSRV_PARAM_OUT),
);
$query = '{CALL TEST_SP(?)}';
$stmt = sqlsrv_query($conn, $query, $parameters);
sqlsrv_next_result($stmt);
if ($stmt === false) {
$errors = sqlsrv_errors();
var_dump($errors);
}
var_dump($outputVar); // this var is overwrite by SQLSRV library.
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
我的存储过程return一个1到1000的随机数
CREATE PROCEDURE [dbo].[test_1]
(
@ret_cod int OUTPUT
)
As
BEGIN TRY
SET NOCOUNT On
SET @ret_cod = (SELECT ROUND(((999) * RAND() + 1), 0));
END TRY
BEGIN CATCH
SET @ret_cod = (SELECT ERROR_NUMBER() AS ErrorNumber)
END CATCH
正如 sofl 所说,
问题已解决,将选项添加到我的程序 "SET NOCOUNT ON" 并注意程序,除了我需要的结果外,不要输出任何内容。