PHP ODBC PDO bindParam 导致"Must Declare Scalar variable @P1"



长话短说我需要使用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();

我已经尝试将param类型添加到绑定$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 7.4.5上运行的,使用PHP安装说明:https://www.php.net/manual/en/ref.pdo-odbc.php

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

也许您可以参考这个例子:执行一个带有问号占位符的准备好的语句:

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

你也可以参考这个问题的答案:向PHP mssql查询添加参数,其他的为我们提供了更多的指导

HTH。

最新更新