使用PDO_DBLIB和SQL Server数据库使用多个命名参数执行存储过程

时间:2019-02-19 14:31:43

标签: php sql-server pdo

我正在尝试使用PDO_DBLIB驱动程序和php更新存储在SQL数据库中的数据。要更新数据,我只需要向存储过程传递几个命名参数即可完成此操作,但是当我尝试使用以下代码时,它没有任何错误,但是数据库中没有任何更新。我在json响应中记录语句executeg以进行跟踪。 这是我的代码:

$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,这没有任何信息可做进一步的故障排除。你们可以帮我吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

<?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;
?>