【问题标题】:PHP ODBC PDO bindParam causing "Must Declare Scalar variable @P1"PHP ODBC PDO bindParam 导致“必须声明标量变量@P1”
【发布时间】:2021-06-28 20:42:05
【问题描述】:

长话短说,我需要使用 PHP、PDO 和 ODBC 连接到 Micrsoft Azure 数据库。但是我无法在查询中使用参数而不会出现以下错误(我已经删除了一些信息)。

[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Must declare the scalar variable "@P1".
RequestId: TDS;;7
Time: (SQLExecute[40000] at /ext/pdo_odbc/odbc_stmt.c:259)'

这是我的代码:

    // Establish connection
    $db = new \PDO($dsn, $user, $password);

    $lastName = '%{Bank2}%';

    // Option 1 - Does not work
    $query = "SELECT * FROM contact WHERE lastName LIKE ?";
    $prep = $db->prepare($query);
    $prep->execute([$lastName]);
    $results1 = $prep->fetchAll(PDO::FETCH_ASSOC);
    $error1 = $prep->errorInfo();

    // Option 2 - Does not work
    $query = "SELECT * FROM contact WHERE lastName LIKE ?";
    $prep = $db->prepare($query);
    $prep->bindParam(1, $lastName);
    $prep->execute();
    $results2 = $prep->fetchAll(PDO::FETCH_ASSOC);
    $error2 = $prep->errorInfo();

    // Option 3 - Does not work
    $query = "SELECT * FROM contact WHERE lastName LIKE :lastName";
    $prep = $db->prepare($query);
    $prep->bindValue(':lastName', $lastName);
    $prep->execute();
    $results3 = $prep->fetchAll(PDO::FETCH_ASSOC);
    $error3 = $prep->errorInfo();

我已尝试将参数类型添加到绑定 $prep->bindValue(':lastName', $lastName, PDO::PARAM_STR) 中,但没有解决任何问题

我知道我的连接很好,因为以下查询可以正常工作并返回结果:

    $query = "SELECT * FROM contact WHERE lastName LIKE '%Bank2%'";
    $prep = $db->prepare($query);
    $prep->execute();
    $results = $prep->fetchAll(PDO::FETCH_ASSOC);

关于为什么这不起作用的任何想法?

这是使用 PHP 安装说明在 PHP 7.4.5 上运行的:https://www.php.net/manual/en/ref.pdo-odbc.php

./configure --with-pdo-odbc=unixODBC,/usr/local

【问题讨论】:

  • 似乎您对参数设置有一些语句错误。请参考教程:docs.microsoft.com/en-us/azure/postgresql/…。给出了带参数查询/更新的例子。
  • 感谢您的文章,但似乎没有帮助。这是一个 SQL Server 数据库,而不是 PostgreSQL。它不会连接。 @LeonYue
  • 嗨@aceithamer,很抱歉发布了错误的链接,请参考这个例子:c-sharpcorner.com/article/…
  • 嗨@sceithamer,希望你做得很好,你有任何进展吗?
  • 如果回答对你有帮助,希望你能采纳。这对其他社区成员可能是有益的。如果您已经解决了这个问题,欢迎与我们分享细节,我们可以向您学习。谢谢。

标签: php pdo odbc azure-sql-database


【解决方案1】:

也许你可以参考这个例子:Execute a prepared statement with question mark placeholders:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

您也可以参考这个问题的答案:Add parameters to a PHP mssql query,其他人为我们提供了更多指导。

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多