php - 如何使用 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));
感谢您的任何建议
解决方案
您收到的错误是因为您将其: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()
通常是更好的选择。
推荐阅读
- linux - 在 Ubuntu 16.04 中启动 kdevelop 时出错
- javascript - 使用 for 循环减少相似值
- javascript - 如何在javascript中对嵌套对象中的键顺序进行排序?
- python - python - 在与seaborn的同一图表上并排绘制条形图
- php - 如何搜索经常随 Cloudsearch 变化的值?
- c# - C# 代码运行速度太慢。需要多线程
- ios - 如何使用 SwiftyDropbox 下载文件?路径错误
- java - 将 JFXButton 添加到 JFXTreeTableView
- elasticsearch - ELK 和 Filebeat 配置
- markdown - 如何更改语言插件“搜索”?