我正在用MySQL练习PHP,我正在创建一个网页,列出查询中表格的所有细节 - 这部分工作得很好。然后,我希望用户能够单击表中的链接,该链接将用户引导到该特定表条目的CRUD页面。
我拥有的代码与我的原始页面一起工作正常,但是,因为有3个表我正在尝试连接在一起,所以它会让我感到困惑。我现在使用的工作代码只适用于一个表。我正在努力想出如何更改我的代码的想法,以便它可以促进我加入的三个表。
以下是我的表格:
ACT GIG VENUE sname sname sname(这些不包含相同的值。) id(2)id id(1) 动作(2) 场地(1)
现在代码崩溃。
这是允许我更新表格中的条目的代码(虽然我希望它更新3而不是1)
if (!count($errors)) {
// Data is valid and can be committed to database
if ('Update' == $_REQUEST['action']) {
$show = 'table';
// Data for gig can be safely updated
$sql = 'UPDATE gig SET sname=:sname, start=:start
WHERE id=:id';
$res = $db->prepare($sql);
if (!$res->execute(array(':sname' => $details['sname'],
':id' => $details['id'],
':start' => $details['start'],
))) {
$errors['sql'] = sprintf("%s (id %s) could not be updated",htmlentities($_POST['sname']),$_POST['id']);
$show = 'form';
} else {
$status = sprintf("%s updated",htmlentities($details['sname']));
}
现在是从网页创建新条目的代码。同样,此代码仅插入一个表的数据,而不是我想要的3个数据。但我们会在底部找到它。
} else { // Create action
// Data for gig can be safely created
$sql = 'INSERT INTO gig (id,sname,start)
VALUES (:id,:sname,:start)';
$res = $db->prepare($sql);
if (!$res->execute(array(':sname' => $details['sname'],
':id' => $details['id'],
':start' => $details['start'],
))) {
$errors['sql'] = sprintf("%s (id %s) could not be created (Has the id already been used?)",htmlentities($_POST['country']),$_POST['id']);
$show = 'new';
} else {
$status = sprintf("%s created",htmlentities($details['sname']));
}
}
}
所以我试图获得,在我的代码中实现了三个colums(sname),我知道它们都会发生冲突,但当我设法打印3条评论中的所有细节时,我得到了解答。
这是代码。
SELECT g.id AS gig_id, g.sname AS gig_name, v.sname AS venue_name, a.sname AS act_name FROM gig AS g, venue AS v, act AS a WHERE g.venue=v.id AND g.act=a.id
基本上我要问的是,我如何调整上述陈述以适应我的CRUD陈述,我希望我的问题部分得到解决,我只需要朝着正确的方向转向?
提前感谢您的帮助。
答案 0 :(得分:0)
您可以使用类似以下内容的查询来完成此任务:
/* insert */
insert into venue values ();
set @gig_venue := LAST_INSERT_ID();
insert into act values ();
set @gig_act := LAST_INSERT_ID();
insert into gig values(@gig_venue, @gig_act /*, etc */);
/* update */
select venue, act from gig where id = @gig_id into @venue, @act;
update venue set foo=1 where id = @venue;
update act set bar=1 where id = @act;
update gig set baz=1 where id = @gig_id;
/* update in a single statement (no way to do with insert though)*/
update gig
join venue on venue.id = gig.venue
join act on act.id = gig.act
set foo=1,
bar=2;
但是,您需要将它们放在事务中,或者在发生故障时要非常小心地执行手动回滚。