我寫了下面的函數來構造和執行一個帶有鍵值綁定的SQL語句。我使用bindValue()將鍵值對的數組綁定到SQL字符串中的相應標識符。 (echo語句用於調試)。爲什麼在這種情況下PDO :: bindValue()失敗?
public function executeSelect($sql, $bindings = FALSE)
{
$stmt = $this->dbPDO->prepare($sql);
if ($bindings)
{
foreach($bindings as $key => $value)
{
$success = $stmt->bindValue($key, $value);
echo "success = $success, key = $key, value = $value<br />";
if (!$success)
{
throw new Exception("Binding failed for (key = $key) & (value = $value)");
}
}
}
echo "Beginning execution<br />";
if ($stmt->execute())
{
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return FALSE;
}
}
輸入這個功能如下:
$stmt = "SELECT * FROM test WHERE id = :id";
$bindings = array(":id" => "3", ":Foo" => "Bar");
在通過$綁定數組的第二個循環,我期望$成功,以評估爲false,從而引發自定義異常,因爲「Bar」不能綁定到「:Foo
」,因爲「:Foo
」在輸入SQL中不存在。
相反,$成功的計算結果爲真(1)爲$綁定陣列中兩個鍵值對,和一個PDOException被拋出 - >執行()"(HY000)SQLSTATE[HY000]: General error: 25 bind or column index out of range"
爲什麼不bindValue返回false?
此外,我知道沒有語句驗證以確保只有SELECT語句被接受;這是在工作中。 – TeaPow
大概你也只使用'SELECT'權限使用MySQL帳戶? :) –