gpt4 book ai didi

php - PDO::bindValue() 在使用嵌套 SELECT 查询时失败

转载 作者:可可西里 更新时间:2023-11-01 12:18:17 25 4
gpt4 key购买 nike

我正在使用通过 ODBC 连接的 MSSQL 数据库。

当在具有嵌套 SELECT 语句的查询上使用 PDO::bindValue() 时,它无法在嵌套 SELECT 中绑定(bind)值(在主 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]: Invalid character value for cast specification: 206 [Microsoft][SQL Server Native Client 11.0][SQL Server]Operand type clash: text is incompatible with int (SQLExecute[206] at /builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)

如果我为“:locationid”省略了 bindValue() 并将“1011”直接插入到查询中,调用将无误地完成并获得正确的结果。

这是 PDO 中的错误,还是我必须以不同方式调用 bindValue()?

最佳答案

因为(我从评论中读到)告诉 bindValue 传递的值是一个整数没有解决问题...

$stmt->bindValue( "locationid", 1011, PDO::PARAM_INT );

...我假设出于某种原因 (a bug in pdo_odbc ?),无论您在 bindValue 上指定什么作为第三个参数,参数都会作为字符串输入查询。

然后我会建议通过将值转换为整数就地到查询中来解决这个问题。

最后一行:

"WHERE st2.LocationID = CAST( :locationid, int ) ))"

这不是很优雅,但在您找到 pdo_odbc 的修复/补丁之前可能是合适的


如果这仍然不起作用,还有一个更不优雅的解决方案(当然是作为临时修复)。

你写道:

If I leave out the bindValue() for ":locationid" and insert '1011' directly into the query, the call completes without errors and with the correct results.

所以您可以直接将location id 放入查询中。

假设 location id 存储在 $locationId 中,那么查询的最后一行变为:

"WHERE st2.LocationID = $locationId))");

因为这很容易发生 sql 注入(inject) $locationId 必须事先清理(或验证)。

该值必须是一个正整数,所以我建议使用一种更简单且可靠的方法来代替转义它:检查 $locationId 是否仅由数字组成...

if( ! ctype_digit( (string) $locationId ) ) {
// location id is invalid
// do not proceed !
}

关于php - PDO::bindValue() 在使用嵌套 SELECT 查询时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com