【发布时间】:2021-04-04 02:19:23
【问题描述】:
我有两个带有列的 SQL 表:
菜单:
- id [AI]
- 姓名
- 说明
子类别:
- id [AI]
- 姓名
- pid(子类别父 ID)
- 中(菜单 ID)
在我的网站的新版本中,不再有菜单,“子类别”现在更改为“类别”:
- 身份证
- 姓名
- 说明
- parent_id
旧数据库仍在使用中,所以我正在制作我的迁移脚本,这里是包含类别的部分:
$new_db->query("TRUNCATE TABLE `categories`");
$ids = [];
$menu_list = $old_db->fetch("SELECT * FROM `menu` ORDER BY `id`");
foreach($menu_list as $menu)
{
$id = $new_db->insert("categories", [
"name" => $menu["name"],
"description" => $menu["description"],
"parent_id" => "0"
]);
$ids[$menu["id"]] = $id;
}
$subcategories = $old_db->fetch("SELECT * FROM `subcategories` ORDER BY `id`");
foreach($subcategories as $subcategory)
{
$pid = 0;
$desc = "";
if($subcategory["mid"] > 0)
{
$menu = $old_db->fetch_first("SELECT `id`, `description` FROM `menu` WHERE `id` = '".$subcategory["mid"]."' LIMIT 1");
$pid = $ids[$menu["id"]];
$desc = $menu["description"];
}
else
{
$pid = $subcategory["pid"];
}
$new_db->insert("categories", [
"name" => $subcategory["name"],
"description" => $desc,
"parent_id" => $pid
]);
}
它有效,但我很确定它可以以更低的成本做得更好。 我可以编写一条 SQL 语句,将菜单和子类别绑定到一个结果列表中,然后将它们全部插入吗?
【问题讨论】:
-
警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough!
-
你可以做很多事情来改进你的代码,但我想最好使用SQL Stored Procedures或创建你自己的ORM,或者只使用Doctrine之类的东西
-
或者只是了解连接,因为那是你的 for 循环所模仿的。