【发布时间】:2017-08-29 15:27:50
【问题描述】:
我正在使用通过 ODBC 连接的 MSSQL 数据库。
在具有嵌套 SELECT 语句的查询上使用 PDO::bindValue() 时,它无法在嵌套 SELECT 中绑定值(在主 SELECT 上没有问题)。
这是一段失败的示例代码:
$stmt = $cmdb->prepare("SELECT ci.CI FROM dbo.cmdb_ci AS ci " .
"INNER JOIN dbo.cmdb_model AS m ON m.ModelID = ci.Modelid " .
"INNER JOIN dbo.cmdb_class AS c ON c.ClassID = m.Classid " .
"WHERE (c.ClassID = :classid) " .
"AND (ci.CI IN (SELECT ci2.CI " .
"FROM dbo.cmdb_ci AS ci2 " .
"INNER JOIN dbo.cmdb_ci_status AS st2 ON st2.CI = ci2.CI " .
"WHERE st2.LocationID = :locationid))");
$stmt->bindValue("classid", 13);
$stmt->bindValue("locationid", 1011);
$stmt->execute();
if ($rows = $stmt->fetchAll())
$stmt->closeCursor();
foreach ($rows as $row)
echo $row["CI"];
我得到的错误是:
SQLSTATE[22018]:强制转换规范的字符值无效:206 [Microsoft][SQL Server Native Client 11.0][SQL Server]操作数类型冲突:文本与 int 不兼容(SQLExecute[206] 在 /builddir/build/ BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)
如果我为“:locationid”省略bindValue() 并直接在查询中插入“1011”,则调用完成且没有错误且结果正确。
这是 PDO 中的错误,还是我必须以不同的方式调用 bindValue()?
【问题讨论】:
-
您的数据库中的 LocationID 是否设置为 int 或 text?
-
$stmt->bindValue("locationid", 1011,PDO::PARAM_INT);怎么样,正如错误所说,你用文本转换 int 。没有 PDO:PARAM_ 的 bindValue 变成一个字符串,例如文本。 -
LocationID 被定义为一个整数。
-
不是
$stmt->bindValue("classid", 13);而是$stmt->bindValue(":classid", 13); -
stackoverflow.com/questions/16532694/… 有疑问,我会迁移到最新的稳定版 php