php - 更新相互链接的三个表时出现问题
问题描述
我正在尝试更新我的数据库中相互链接的三个表。
我的表是这样设置的:
模板
id
title
id_company
提问猫
id
title
ordering
tid (id of templates)
问题
id
question
catid (id of questioncat)
ordering
templates
包含我的问题列表的名称,questioncat
包含我的列表中的所有类别,并questions
包含属于某个类别的所有问题。
插入该数据工作正常,我这样做是这样的:
首先,我的 PHP 脚本得到一个数组,例如如下所示:
Array
(
[0] => Array
(
[name] => lijsttitle
[value] => Lijst nieuw
)
[1] => Array
(
[name] => category[]
[value] => cat1
)
[2] => Array
(
[name] => sortorder
[value] => 1
)
[3] => Array
(
[name] => question[]
[value] => q1
)
[4] => Array
(
[name] => category[]
[value] => cat2
)
[5] => Array
(
[name] => sortorder
[value] => 2
)
[6] => Array
(
[name] => question[]
[value] => q1
)
)
我检查列表是否已经存在,如下所示:
$check = '
SELECT *
FROM templates
WHERE title = "'.$conn->real_escape_string($title["value"]).'"';
$checkcon = $conn->query($check);
$check = $checkcon->fetch_assoc();
// If there is more than 1 result, update data instead of inserting
if($checkcon->num_rows > 0){
// Else insert data as new list
}else{
// Insert template title and companyid
$inserttemplate = '
INSERT INTO templates (title, id_company) VALUES ("'.$conn->real_escape_string($title["value"]).'","'.$conn->real_escape_string($companyid).'")';
$inserttemplatecon = $conn->query($inserttemplate);
$lastinserted = $conn->inserted_id();
$currCat = '';
$sortorder = '';
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
// init questions array
$store[$currCat] = [];
}else if($a['name'] == 'sortorder') {
$sortorder = $val;
$store[$currCat]['sortorder'] = $val;
}else {
// add question to question array
$store[$currCat]['question'][] = $val;
}
}
array_shift($store);
// $key is de waarde van de categorie, $lijst is een array met alles onder de categorie
foreach($store as $keycat => $lijst){
$sortorder = $lijst['sortorder'];
$insertcats = '
INSERT INTO questioncat (title, tid, ordering) VALUES ("'.$conn->real_escape_string($keycat).'", "'.$conn->real_escape_string($lastinserted).'", "'.$conn->real_escape_string($sortorder).'")';
$insertcatscon = $conn->query($insertcats);
$lastinserted1 = $conn->inserted_id();
$questionarr = $lijst['question'];
foreach($questionarr as $q){
$insertquestions = '
INSERT INTO questions (question, catid) VALUES ("'.$conn->real_escape_string($q).'", "'.$conn->real_escape_string($lastinserted1).'")';
$insertquestionscon = $conn->query($insertquestions);
}
}
echo 'Uw lijst is toegevoegd';
}
如果有 0 个结果,则该列表不存在并添加到我的数据库中,这可以正常工作,但如果有超过 1 个结果,则表示该列表确实存在并且需要更新。
这是我开始遇到问题的地方。
我可以在一个查询中更新所有三个表吗?
我首先尝试在 if 语句中使用以下代码仅更新类别名称(我在其中检查模板列表是否已存在):
foreach($arr as $a) {
$val = $a['value'];
// handle category
if($a['name'] == 'category[]') {
// save cat name
$currCat = $val;
// init questions array
$store[$currCat] = [];
}else if($a['name'] == 'sortorder') {
$sortorder = $val;
$store[$currCat]['sortorder'] = $val;
}else {
// add question to question array
$store[$currCat]['question'][] = $val;
}
$updatetemplate = '
UPDATE questioncat c
INNER JOIN templates t
ON c.tid = t.id
SET t.title = "'.$conn->real_escape_string($title["value"]).'",
c.title = "'.$conn->real_escape_string($currCat).'",
c.ordering = "'.$conn->real_escape_string($sortorder).'"
WHERE t.title = "'.$conn->real_escape_string($getcats['title']).'"
AND c.id = "'.$conn->real_escape_string($getcats["id"]).'"';
$updatetemplatecon = $conn->query($updatetemplate);
echo 'Uw lijst is gewijzigd.';
}
但是所有类别的标题都是一样的,顺序也是一样的。
是否可以在一个查询中更新三个表?它们基本上是三个级别,模板 - 模板下的类别 - 一个类别下的问题是否可能,如果可以,如何?
解决方案
您可能想开始寻找 PL/SQL 过程,它们可以节省您的编码并且非常安全。
简报:
当第一个表中发生事件时,它可以在数据库上执行多个事件,该事件可以是(ON DELETE、ON UPDATE 或 ON INSERT),带有 AFTER 和 BEFORE 条件。
PL/SQL 触发器:来源
定义
触发器是存储的程序,当某些事件发生时会自动执行或触发。
至于语法,它会根据您使用的 DBMS 有所不同。我希望我的解释是好的。
推荐阅读
- python - Post 方法没有更新数据库 Django
- ios - UICollectionViewDragDelegate 不工作
- c# - 将数字转换为其他类型的数字并在信息丢失时出现错误
- flutter - 容器中的颤振盒装饰
- python-3.x - 如何将 x.numpy() 的形状转换为矩阵 (n,m)
- html - Angular 10:如何创建动态组件/html?
- php - Symfony 5 - 多重保护认证 - 主页认证用户
- google-cloud-platform - 在 Google API 控制台中更改项目名称而不使用 CLI 工具
- mysql - MySQL - 选择排名前 5 名
- php - PHP - 使用三元运算符时出现语法错误