我经常需要提交一些非常类似的SQL查询,例如删除表中的一行,在其中我知道ID。
$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-Clause
我刚刚读到,我不能将准备好的语句用于表名或列名(来源)。所以我想我得另找个解决办法了。
发布于 2011-11-20 13:37:52
我认为(我不能百分之百地肯定这一点),您正在尝试查询一个名为
`'TableName'`或
`"TableName"`取决于PDO如何尝试引用您的参数。我一直在研究如何不引用PDO中的字符串(我也遇到了同样的问题),但很久以前我放弃了,并编写了自己的实现。
也许您可以预先处理查询,并用表名替换一个参数,在替换表param名称时小心可能发生的问题(这就是我要说的)。
发布于 2011-11-20 15:41:29
我可以提出另一种方法吗?
# I'm hard-coding the values so just handle that first and set $id1 and $id2
$parameterArray = array('MY_FIRST_TABLE' => $id1, 'MY_SECOND_TABLE' => $id2);
$sql = '';
foreach($parameterArray as $tableNameKey => $idValue) {
# build sql
$sql = "DELETE FROM `". $tableNameKey ."` WHERE `id`=". $idValue ." LIMIT 1";
# prepare and execute
$stmt = $conn->prepare($sql);
$stmt->execute();
# processing code after execution goes here
// ...
// ...
// ...
}在这里,您只需使用要构建DELETE sql语句的表和ids数组进行循环。你能试试这个吗?
https://stackoverflow.com/questions/8100844
复制相似问题