php mysql插入,删除或更新

时间:2016-01-19 22:28:21

标签: php mysql sql

我有两张桌子:

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中说:

如果存在新地址»更新

如果不存在的话»插入

如果现有地址的所有字段都为空»删除

感谢您的帮助!

3 个答案:

答案 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。