【问题标题】:Passing params to stored procedure将参数传递给存储过程
【发布时间】:2016-04-05 13:54:00
【问题描述】:

我收到以下错误

SQLSTATE[42000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]必须将参数号 44 和后续参数作为“@name = value”传递。使用“@name = value”形式后,所有后续参数必须以“@name = value”形式传递。

这是我的代码

$pdowin->beginTransaction();
    try {
        // headers
        $rows = $pdo->query("SELECT * FROM orders WHERE status = 2 AND productId IS NOT NULL GROUP BY id");
        // fetch the rows
        while ($row = $rows->fetch(PDO::FETCH_ASSOC)) {
            $pdowin->query("EXEC sp_salesorderimport
                @salesordernumberid = ".$row['id'].",
                    ... // number of other params here
                ");

            // items
            $items = $pdo->query("SELECT * FROM orders WHERE id = " . $row['id'] . " ORDER BY name ASC");
            while ($item = $items->fetch()) {
                $pdowin->query("EXEC sp_salesorderrowimport
                    @salesordernumberid = ".$row['id'].",
                    @articleid = ".$item['artid'].",
                        ... // number of other params here
                    ");
            }
        }

        $pdowin->commit();
        echo "OK";
    } catch (PDOException $e) {
        $pdowin->rollback();
        echo "ERROR: ".$e;
    }

如果我单独执行这些查询,所有查询都有效。 提前致谢。

【问题讨论】:

  • 你看44号参数了吗?根据缺少参数名称的错误查找
  • @JamesZ,参数号似乎一切正常。 44.
  • 使用分析器,看看你的应用程序正在执行的 sql 语句是什么样的。是使用@name=value 的形式吗?如果此时错误不明显,则发布整个 sql 查询,以便我们无需猜测即可提供帮助。

标签: php sql-server stored-procedures pdo


【解决方案1】:

你应该准备你的陈述:

$pdowin->beginTransaction();
    try {
        // headers
        $rows = $pdo->query("SELECT * FROM orders WHERE status = 2 AND productId IS NOT NULL GROUP BY id");

        $stmt = $pdowin->prepare("EXEC sp_salesorderimport
                @salesordernumberid = :saleId,
                    ... // number of other params here
                ");
        // fetch the rows
        while ($row = $rows->fetch(PDO::FETCH_ASSOC)) {
            $stmt->bindValue(':saleId',$row['id']);
            $stmt->execute();

不仅可以防止sql注入,还可以避免引号和转义字符的错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多