首页 > 解决方案 > 如何使用 pdo 删除多个表中的行

问题描述

我正在尝试使用 pdo INNER JOIN 在 products_TABLE 中删除属于它的类别和产品。如果我只删除类别而不删除产品,它会起作用。这是我的代码:

$catid = filterString($_GET['cat_id']);
$stmt = $pdo->prepare('DELETE FROM categories AS c
                        INNER JOIN products AS p ON c.cat_id = p.catid
                        WHERE cat_id = :cat_id
                        ');
$delete = $stmt->execute(array('cat_id' =>$catid));

这是我遇到的错误:

致命错误:未捕获的 PDOException:SQLSTATE[HY093]:无效参数编号:参数未在 D:\wamp\www\p\employees\DelStore.php:25 中定义 堆栈跟踪:#0 D:\wamp\www\p\ employees\DelStore.php(25): PDOStatement->execute(Array)

1 {main} 在第 2 行的 D:\wamp\www\p\employees\DelStore.php 中抛出

我知道它说给定的参数无效,但无法解决如何给定参数:

$delete = $stmt->execute(array('cat_id' =>$catid));

感谢您的任何建议

标签: phpmysqli

解决方案


您收到的错误是因为您将其:products.catid 更改为products.catid

此外,如果您想从两个表中删除条目,您应该使用别名。

DELETE c,p FROM categories c
INNER JOIN products p ON c.cat_id = p.catid
WHERE cat_id = :cat_id

你也需要改变

$delete = $stmt->execute(array('cat_id' =>$catid));

$delete = $stmt->execute(array(':cat_id' =>$catid));

如果您使用的是 SQL Server,则上述示例不起作用。在这种情况下,您应该使用 2 个单独的删除查询。

此外,当您将执行函数中的参数绑定为数组时,它们将绑定为字符串。根据您的数据库结构,这也可能会导致一些问题。使用$stmt->bindParam()通常是更好的选择。


推荐阅读