Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-MSSQL从存储过程中获取结果_Php_Sql Server_Stored Procedures - Fatal编程技术网

PHP-MSSQL从存储过程中获取结果

PHP-MSSQL从存储过程中获取结果,php,sql-server,stored-procedures,Php,Sql Server,Stored Procedures,我是一个老派的开发者,刚刚进入WWW编程世界。我正在为与我合作的公司开发一个带有HTML、CSS、PHP和MSSQL Server 2008 R2的应用程序 在我的应用程序中,我使用存储过程在数据库中插入、修改、删除或查询信息。根本不使用TSQL指令,只是从PHP代码执行存储过程 我使用PHP5和SQLSRV驱动程序进行数据库交互 到目前为止一切正常,但现在我被卡在插入件上。。。如果一切正常,SP将插入记录,如果没有,则不会。。。但是,在我再次查询表以查看记录是否存在之前,我不会看到结果 Im使

我是一个老派的开发者,刚刚进入WWW编程世界。我正在为与我合作的公司开发一个带有HTML、CSS、PHP和MSSQL Server 2008 R2的应用程序

在我的应用程序中,我使用存储过程在数据库中插入、修改、删除或查询信息。根本不使用TSQL指令,只是从PHP代码执行存储过程

我使用PHP5和SQLSRV驱动程序进行数据库交互

到目前为止一切正常,但现在我被卡在插入件上。。。如果一切正常,SP将插入记录,如果没有,则不会。。。但是,在我再次查询表以查看记录是否存在之前,我不会看到结果

Im使用PHP中的以下代码运行SP,将记录插入表中:

function spinserta($tabla, $columnas, $valores, $cnct) {

   $stmt = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';         
   $params = array($tabla,$columnas,$valores);

   $result = sqlsrv_query($cnct,$stmt,$params) ;

   return $result;
}
如果事务未成功,则表示我在$result变量中未获得任何信息,并希望从SP获得结果消息,以便向用户显示错误消息

如何从SP获取结果消息(无论是否出错)


提前谢谢

这是我的一个应用程序中的一些代码。看看是否有帮助:

//Query SQL
$tsql = "Exec spinsert @tabla=?,@columnas=?,@valores=?"; 
$params = array($tabla,$columnas,$valores);

//Execute the stored query 
$stmt = sqlsrv_query($conn, $tsql, $params);
if ($stmt === false)
{
    echo "<h3>Error in query preparation or execution.</h3>";
    ListErrors();
    die;
}
else {
    echo "Insert Successful";
}

// this should help for the non-insert/update case
$arr = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
var_dump($arr);
//查询SQL
$tsql=“Exec spinsert@tabla=?,@columns=?,@valores=?”;
$params=数组($tabla、$columnas、$valores);
//执行存储的查询
$stmt=sqlsrv_查询($conn、$tsql、$params);
如果($stmt==false)
{
echo“查询准备或执行中出错。”;
列表错误();
死亡
}
否则{
回显“插入成功”;
}
//这对于非插入/更新的情况应该有帮助
$arr=sqlsrv\u fetch\u数组($stmt,sqlsrv\u fetch\u ASSOC);
var_转储($arr);

经过数小时的研究。。。。终于有了概念!事情是这样的:最初的PHP代码是:

function spinserta($tabla, $columnas, $valores, $cnct) {
   $stmt = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';         
   $params = array($tabla,$columnas,$valores);

   $result = sqlsrv_query($cnct,$stmt,$params) ;

   return $result;
}
而最初的SP是:

ALTER PROCEDURE [dbo].[spinsert] 
    @tabla varchar(50),
    @columnas varchar(8000),
    @valores varchar(8000)
AS
BEGIN
    SET NOCOUNT ON;
    declare @orden varchar(8000)
    declare @return_value int

    set @orden='Insert into ' + @tabla + ' (' + @columnas + ') values (' + @valores + ')';
    execute (@orden);

    return 
END
非常直截了当。。。当执行php代码且SP成功时,变量$result将加载“Resource id#14”,如果SP失败,则$result值为null

事情进展顺利!!!但不是我想要的方式。然后我发现了这篇文章:

基于此,我修改了SP:

ALTER PROCEDURE [dbo].[spinsert] 
    @tabla varchar(50),
    @columnas varchar(8000),
    @valores varchar(8000)
AS
BEGIN
    SET NOCOUNT ON;
    declare @orden varchar(8000)
    declare @return_value int

    begin try
        set @orden='Insert into ' + @tabla + ' (' + @columnas + ') values (' + @valores + ')';
        set @return_value=0;
        execute (@orden);
    end try

    begin catch
        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;

        SELECT @return_value = ERROR_NUMBER()
        SELECT 
            @ErrorMessage = ERROR_MESSAGE(),
            @ErrorSeverity = ERROR_SEVERITY(),
            @ErrorState = ERROR_STATE();

        RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState -- State.
                   );
    end catch

    return @return_value

END
以及PHP代码:

function spinserta($tabla,$columnas,$valores,$cnct) {
    $tsql = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';            
    $params = array($tabla,$columnas,$valores);

    $stmt = sqlsrv_query($cnct,$tsql,$params) ; 
    $errors=sqlsrv_errors();

    if ($stmt === false or $stmt===0) {
        foreach( $errors as $error ) {
            $stmt=str_replace("'","","Error: ". $error['code']. " - " . $error['message']);
            }
    } else {
        $stmt="1";
    }       

    return $stmt;
}
我最初的方法有两个问题,一个是在数据库引擎端,SP并没有真正生成系统错误,即使语句失败了。使用Try-Catch、technology和RAISEERROR概念,SP最终在语句失败时生成系统错误。在此之后,只需对PHP代码进行一些小的调整

使用这种方法,发送到数据库的信息的验证在数据库引擎端完成,无需编写大量代码,只需在提交时验证表单中的字段。所需要的是确保数据库表、关系、约束、完整性和其他都得到了很好的应用,并且数据库将保护自己不受不正确数据的影响。如果提交了表单中提供的信息错误,数据库将拒绝这些错误,代码将向用户显示正确的错误

我想看看类似的东西在MySQL上是否可行…,我想是的


非常感谢Maximus2012!!!干杯

不工作。。。。我添加了IF语句如下,但结果总是“Failure!!!”。当我查询$result变量的值时,它包含“Resource id#14”,无论是否成功函数spinserta($tabla,$columnas,$valores,$cnct){$stmt='Exec spinsert@tabla=?,@columnas=?,@valores=?';$params=array($tabla,$columnas,$valores);$result=sqlsrv_查询($cnct,$stmt,$params);if($result==false){echo“成功!!!”;}否则{echo“失败!!!”;}echo”
$result
“返回$result;”“
函数spinserta($tabla,$columnas,$valores,$cnct){$stmt='Exec spinsert@tabla=?,@columnas=?,@valores=?”;$params=array($tabla,$columnas,$valores);$result=sqlsrv_查询($cnct,$stmt,$params);if($result==false){echo“成功!!!”;}否则{echo“失败!!!”;}echo”
$result
”;return$result;}
您能用这段代码更新您的问题吗,这样更容易阅读?另外,您的存储过程在PHP代码之外是否能够正常工作?经过多次尝试,我找到了一种方法来验证SP的执行是否成功:在语句执行之后,在存储过程中,我正在捕获变量@错误并将其作为SP的结果返回。在php函数端,有以下内容:函数spinserta($tabla,$columnas,$valores,$cnct){$tsql='Exec spinsert@tabla=?,@columnas=?,@valores=?';$params=array($tabla,$columnas,$valores);$stmt=sqlsrv_查询($cnct,$tsql,$params);如果($stmt==false){$stmt=0;}否则{$stmt=1;}echo$stmt;return$stmt;}很抱歉没有格式化注释!!!我找不到在注释中执行段落或标记代码的方法,因为这可以在问题中完成?????