ODBC経由で接続されたMSSQLデータベースを使用しています。ネストされたSELECTを使用したクエリでPDO :: bindValue()が失敗する
ネストされた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ネイティブクライアント11.0] [SQL Serverの]オペランドタイプ衝突:テキストはint型と互換性がありません(/builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254でのSQLExecute [206])
":locationid"の場合はbindValue()
を省略し、 '1011'を直接クエリに挿入すると、呼び出しはエラーなしで正しい結果で完了します。
これはPDOのバグですか、あるいはbindValue()を別の方法で呼び出す必要がありますか?
は、int型またはあなたのテキストになるように設定LocationIDされていますデータベース? – aynber
'$ stmt-> bindValue(" locationid "、1011、PDO :: PARAM_INT);'エラーが示すように、intをテキストでキャストします。 PDOなしのbindValue:PARAM_は文字列になります。テキスト。 – JustOnUnderMillions
LocationIDはintとして定義されています。 – Dandorid