使用PDO_DBLIB和sql server数据库执行带有多个命名参数的存储过程

问题描述 投票:0回答:1

我试图用PDO_DBLIB驱动程序和PHP更新存储在我的SQL数据库中的数据。要更新数据,我只需要将几个命名参数传递给存储过程,它就完成了,但是当我尝试使用下面的代码时,它没有给我任何错误,但在数据库中没有任何更新。我正在json响应track中记录语句executiong。这是我的代码:

$conn = new PDO("dblib:$dsn","$uname", "$pwd");

$sth = $conn->prepare("EXECUTE SP_Web_Contact_Update :Person_ID, :ContactType_Code_ID, :Contact_Info, :Contact_ClassID"); 

$sth->bindValue(':Person_ID', $syntonicID, PDO::PARAM_INT);
$sth->bindValue(':ContactType_Code_ID', $codeid, PDO::PARAM_STR );
$sth->bindValue(':Contact_Info', $contactinfo, PDO::PARAM_STR );

$truefalse = $sth->execute();
echo json_encode($trufalse);

上面的代码总是打印true,它没有给我任何信息进一步排除故障。你能跟我一起帮忙吗?

php sql-server pdo
1个回答
0
投票

如果你的$sth->execute()调用返回true,那么你的存储过程执行没有错误。您有四个占位符,但只有三个bindValue()调用,这可能意味着您的存储过程使用第四个参数的默认值执行。这是数据库中缺少更新的一个可能原因。

作为一个选项,您可以尝试使用UPDATE获取存储过程中受PDOStatement::rowCount()语句影响的行数。

您还可以考虑包含一些异常处理。尝试使用下一个基本方法(使用您的代码):

<?php
...

# PDO Connection
try {
    $conn = new PDO("dblib:$dsn","$uname", "$pwd");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

# Statement
try {
    $result = 0;
    $sth = $conn->prepare("EXECUTE :Result = SP_Web_Contact_Update :Person_ID, :ContactType_Code_ID, :Contact_Info, :Contact_ClassID");
    $sth->bindParam(':Result', $result, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE); 
    $sth->bindParam(':Person_ID', $syntonicID, PDO::PARAM_INT);
    $sth->bindParam(':ContactType_Code_ID', $codeid, PDO::PARAM_STR);
    $sth->bindParam(':Contact_Info', $contactinfo, PDO::PARAM_STR);
    #$sth->bindParam(':Contact_ClassID', $??????, PDO::PARAM_STR);
    $truefalse = $sth->execute();
    $rowcount = $sth->rowCount();
    echo json_encode($result); 
    echo json_encode($trufalse);
    echo json_encode($rowcount);
} catch( PDOException $e ) {
    die("Error executing query: ".$e->getMessage() );
}

...

# 
$sth = null;
$conn = null;
?>
© www.soinside.com 2019 - 2024. All rights reserved.