我有两张桌子:
people:
peopleID (PK)
name
peopleaddress:
addressID (PK)
peopleID (fK)
address
addresstype
...other fields...
一个人可以拥有更多地址。 我有一个表单来添加一个新人(和地址)和另一个表单来编辑信息。当我加载编辑表单时,它会从DB获取有关该人的信息并将它们放在字段value =“”中。
现在,当我提交编辑表单时,我使用了2个sql命令:
$stmt = $conn->prepare("DELETE from peopleaddress WHERE peopleID=?");
和
$stmt = $conn->prepare("INSERT INTO peopleaddress (peopleID, addresstype, active, street.....) VALUES (?, ?, ?, ....)");
它运作良好,唯一的缺点是addressID会更改每次更新,并且它会快速增长。 我是以正确的方式做到这一点还是有一种方式在PHP或更好的SQL中说:
如果存在新地址»更新
如果不存在的话»插入
如果现有地址的所有字段都为空»删除
感谢您的帮助!
答案 0 :(得分:2)
以下是您正在寻找的内容:" INSERT ... ON DUPLICATE KEY UPDATE"
INSERT INTO peopleaddress (peopleID, addresstype, active, ...) VALUES (1,2,3, ...)
ON DUPLICATE KEY UPDATE addresstype=2, active=3, ...;
如果地址已经在数据库中并且如果可以的话,它将更新它。否则,它会插入。
您可能需要重新开始工作?'取代。
答案 1 :(得分:1)
如果有人在现有帐户中添加新地址,可以使用新行(例如ID),保留旧地址不一定是好事或坏事,并将其作为单独的表格很好(有些人可能有一个家庭和一个商业地址)。
如果缺少所有字段,那么代码的逻辑(PHP?)甚至不应该达到任何SQL查询的程度。
function admin_members_address_update()
{
// 1. Create $required array.
// 2. Check foreach $_POST[array_here].
// 3. If any of the required $_POST variables aren't set HTTP 403 and end the function.
//if something wrong, HTTP 403
else
{
///Normal code here.
}
}
您应始终检查您希望设置的变量,就像始终转义(例如不信任)客户端数据并将错误报告设置为最大值。黑客将使用任何开发工具轻松省略表单字段,并尝试根据服务器生成的错误消息查找漏洞。
在之前始终检查失败,您认为是成功。
//if () {}
//else if () {}
//else if () {}
//else {}
应该以类似的方式处理SQL:
$query1 = 'SELECT * from table;';
$result1 = mysqli_query($db,$query1);
if ($result1) {}
else {/*SQL error reporting, send __magic_function__ as param with well named functions*/}
这是非常粗糙的(不能访问我的实际代码)虽然它应该给你一些东西继续。当我稍后访问我的代码时,您是否希望我更新我的答案时收到评论。
答案 2 :(得分:1)
MySQL无符号INT(最大4294967295)将支持平均每秒13次插入,每秒24x7,持续10年。这可能已经和地球上的地址一样多了。如果你以某种方式推动极限,BIGINT将会大大增加,并且可能永远不会耗尽一百万年。
基本上,不要担心使用自动增量的ID,决定是否删除 - > INSERT或UPDATE / DELETE / INSERT应基于您是否需要为各个地址维护持久性ID。删除然后插入会分配一个新ID,即使它实际上是相同的地址,如果要创建引用地址ID的外键,这是不合需要的。如果你不需要它,你不需要担心它,虽然作为个人喜好,我可能会加入UPDATE。