我經常需要提交一些非常相似的SQL查詢,例如刪除我知道ID的表中的一行。這是我與prepared statement一段代碼:如何在PDO中爲不同的表使用相同的預備語句?
$stmt = $conn->prepare("DELETE FROM `".MY_FIRST_TABLE."` WHERE `id` = :id LIMIT 1");
$stmt->bindValue(':id', $id1, PDO::PARAM_INT);
$stmt->execute();
$stmt = $conn->prepare("DELETE FROM `".MY_SECOND_TABLE."` WHERE `id` = :id LIMIT 1");
$stmt->bindValue(':id', $id2, PDO::PARAM_INT);
$stmt->execute();
我願做這樣的事情:
$stmt = $conn->prepare("DELETE FROM `:table` WHERE `id` = :id LIMIT 1");
$stmt->bindValue(':id', $id1, PDO::PARAM_INT);
$stmt->bindValue(':table', MY_FIRST_TABLE);
$stmt->execute();
$stmt->bindValue(':id', $id2, PDO::PARAM_INT);
$stmt->bindValue(':table', MY_SECOND_TABLE);
$stmt->execute();
如果我試試這個,什麼都不會發生。所以我用下面的代碼片段來分析錯誤:
print_r($conn->errorInfo());
var_dump($stmt);
$stmt->debugDumpParams();
我:
Array
(
[0] => 00000
[1] =>
[2] =>
)
object(PDOStatement)#4 (1) {
["queryString"]=>
string(45) "DELETE FROM `:table` WHERE `id` = :id LIMIT 1"
}
SQL: [45] DELETE FROM `:table` WHERE `id` = :id LIMIT 1
Params: 2
Key: Name: [3] :id
paramno=-1
name=[3] ":id"
is_param=1
param_type=1
Key: Name: [6] :table
paramno=-1
name=[6] ":table"
is_param=1
param_type=2
是這樣的可能嗎?
(我目前使用預處理語句只是出於安全考慮,而不是性能的原因。)
預處理語句和IN子句
我剛讀到我不能使用準備表或列名稱的報表(source)。所以我想我必須尋找另一個解決方案。
如果你嘗試運行它,會發生什麼? – NullUserException
什麼都沒有。我已經添加了一些行以顯示給你儘可能多的關於這個「bug」的信息。我認爲這是故意無法替換表名稱,因爲準備好的語句似乎存儲在數據庫中進行優化......據我所知。我想可能很難爲每張桌子同時做到這一點。所以我希望我會爲預先準備好的陳述找到一個替代方案,或者告訴我我對他們的假設是錯誤的。 –