首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对PDO中的不同表使用相同的准备语句?

如何对PDO中的不同表使用相同的准备语句?
EN

Stack Overflow用户
提问于 2011-11-11 22:41:09
回答 2查看 378关注 0票数 0

我经常需要提交一些非常类似的SQL查询,例如删除表中的一行,在其中我知道ID。

代码语言:javascript
复制
$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();

我想做这样的事情:

代码语言:javascript
复制
$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();

如果我尝试这个,什么都不会发生。因此,我使用了以下代码片段来分析错误:

代码语言:javascript
复制
print_r($conn->errorInfo());
var_dump($stmt);
$stmt->debugDumpParams();

我得到了:

代码语言:javascript
复制
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

我刚刚读到,我不能将准备好的语句用于表名或列名(来源)。所以我想我得另找个解决办法了。

EN

回答 2

Stack Overflow用户

发布于 2011-11-20 13:37:52

我认为(我不能百分之百地肯定这一点),您正在尝试查询一个名为

代码语言:javascript
复制
`'TableName'`

代码语言:javascript
复制
`"TableName"`

取决于PDO如何尝试引用您的参数。我一直在研究如何不引用PDO中的字符串(我也遇到了同样的问题),但很久以前我放弃了,并编写了自己的实现。

也许您可以预先处理查询,并用表名替换一个参数,在替换表param名称时小心可能发生的问题(这就是我要说的)。

票数 1
EN

Stack Overflow用户

发布于 2011-11-20 15:41:29

我可以提出另一种方法吗?

代码语言:javascript
复制
# 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数组进行循环。你能试试这个吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8100844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档