我正在使用通過ODBC連接的MSSQL數據庫。PDO :: bindValue()在嵌套SELECT查詢時失敗
在具有嵌套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 [微軟] [SQL Server本機客戶端11.0] [SQL服務器]操作數類型衝突:文本與詮釋不兼容(SQLExecute [206]在/builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)
如果我忽略bindValue()
爲「:locationid」和直接在查詢中插入「1011」,調用完成而沒有錯誤並且結果正確。
這是PDO中的錯誤,還是必須以不同的方式調用bindValue()?
是LocationID設定在int或文字的數據庫? – aynber
'$ stmt-> bindValue(「locationid」,1011,PDO :: PARAM_INT);'如錯誤說的那樣,你使用text來投射int。沒有PDO的bindValue:PARAM_變成一個字符串,例如文本。 – JustOnUnderMillions
LocationID被定義爲一個int。 – Dandorid