【问题标题】:Execute stored procedure with multiple named parameter with PDO_DBLIB & sql server database使用 PDO_DBLIB 和 sql server 数据库执行具有多个命名参数的存储过程
【发布时间】:2019-02-19 14:31:43
【问题描述】:

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

$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,这没有给我进一步排除故障的信息。你能帮我解决这个问题吗?

【问题讨论】:

  • 如果没有更多信息或存储过程的代码,这将很难解决。我遇到了类似的问题,我的建议是使用 SQL Profiler 来捕获对数据库的调用,然后在 SQL Management Studio 中手动运行它以观察响应。我已经进行了手动运行工作,但它失败了来自 PHP,然后导致我走上了其他道路。让我知道它在手动运行时是否有效,我们可以从那里获取它。 (我遇到的问题是在不喜欢外部调用的表上同时存在触发器和约束)

标签: php sql-server pdo


【解决方案1】:

如果您的$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;
?>

【讨论】:

  • 好的,我错过了在这里写第四个参数 bindvalue,但我在上面尝试过,它仍然给我 rowcount = -1
  • @VJAmbaliya 在这种情况下,存储过程的代码会有所帮助。谢谢。
  • 这意味着上面的语法是正确的,它只是存储过程代码的组织方式不同!我的意思是采用不同的参数值!遗憾的是我无权访问存储过程代码!
  • @VJAmbaliya 是的,我想是的。我通常使用bindParam()(你可以试试这个),但bindValue() 会起作用,因为你不改变PHP 变量的值。谢谢。
  • 是的,用bindParam()execute(array) 都试过了,没有任何效果
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多