我有一个数据库,它包含四个表(为了安全起见,我给他们起了字符名称),名为Huey,Dewey,Lewey和UncleDonald,我希望Huey,Dewey和Lewey表的主键是在UncleDonald表中显示为外键。我已经通过phpMyAdmin链接了它们,它们与用于删除和更新的CASCADE链接在一起(见下图)
在phpMyAdmin中解决之后,我在HTML页面中启动了一个小PHP脚本,将Huey,Dewey和Lewey的数据输入到各自的数据库中。代码(不包括连接信息)如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<head>
<title>The DuckSpeak Text</title>
</head>
<body>
<?php
//Let's see whether the form is submitted
if (isset ($_POST['submit'])) {
$con=mysqli_connect("xxxxxxxxxx","xxxxx","xxxxxx","xxxxxxxxxxxx");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$query= "INSERT INTO dewey (lot_id, deweysays) VALUES (0, '{$_POST['deweyspeak']}');
INSERT INTO huey (cust_id, hueysays) VALUES (0, '{$_POST['hueyspeak']}');
INSERT INTO lewey (personal_id, leweysays) VALUES (0, '{$_POST['leweyspeak']}')";
// Execute multi query
if (mysqli_multi_query($con,$query)){
print '<p> The Ducks Have Spoken.</p>';
} else {
die ('<p>Could not add entry because:<b>' . mysqli_error() . '</b>.</p><p>The query being run was: ' . $query . '</p>');
}
}
mysqli_close($con);
?>
<form action="index.php" method="post">
<div>
<fieldset>
<legend> The Ducks Have Their Say</legend>
<div>
<div><label>Dewey Says</label></div>
<div><textarea name="deweyspeak"></textarea></div>
</div>
<div>
<div><label>Huey Says</label></div>
<div><textarea name="hueyspeak"></textarea></div>
</div>
<div>
<div><label>Lewey Says</label></div>
<div><textarea name="leweyspeak"></textarea></div>
</div>
</fieldset>
<input type="submit" name="submit" value="Let Them Talk!"/>
<input type="reset" name="reset" value="Reset & Rewind"/>
</div>
</form>
</body>
</html>
所以我的问题是我将如何使用PHP将表Huey,Dewey和Lewey的主键ID数据插入指定的外键表UncleDonald?我意识到他们不能被自动生成到外键中但我对如何正确地执行它感到难过。
它必须是脚本中的新查询吗?
我是否必须使用mysql_last_id函数或触发器?
我听说过几种在数据库中使用触发器的技术,但如果可能的话,我希望将它保留在代码端。
答案 0 :(得分:1)
您无法使用multi_query。您依次插入每个侄子记录,并获得其相关的auto_increment值,例如
.. insert huey ...
$huey_id = mysqli_last_insert_id();
... isnert duey
$dewey_id = mysqli_last_insert_id();
... insert lewey ...
$lewey_id = mysqli_last_insert_id();
INSERT INTO uncle (huey, duey, lewel) VALUES ($huey_id, $dewey_id, $lewey_id);
您无法使用multi_insert,因为您将丢失两个插入的ID值 - insert_id()仅报告连接执行的 LAST 插入。它不会返回所有先前插入所生成的所有ID的列表。
请注意,您的代码容易受到sql injection attacks的攻击。</ p>