我最近清理了我的网络应用程序的代码。我的网络应用程序是一个简单的社交网络,具有添加,删除等程序。我有一个php文件,当用户想要从他的朋友列表中删除联系人时,我会调用该文件。
我在我的应用程序中想出了一个奇怪的错误,我没有估计我写它的时间。
假设我们的列表中有两封朋友的电子邮件。
联系人电子邮件存储在名称为Contacts
的MYSQL DB列中,并且每封电子邮件都以分号(;
)符号分隔。因此,我们的示例列将如下所示(取决于最后添加的用户,反之亦然):
georgeMARK@email.com;MARK@email.com;
因此,假设我们的用户想要从其联系人中删除MARK
。他按下按钮......两封电子邮件已经消失了。!
看一下我的PHPMyAdmin Panel,我发现该专栏的内容是:
george
问题出在我的PDO SQL语句中,用于从我的列中删除帐户。
$STH = $DHB->prepare("UPDATE `Users` SET `Contacts` = REPLACE(`Contacts`, :email, '') WHERE `UserEmail` = :my_email");
REPLACE
函数只是替换了:email
的所有实例,这很糟糕。我在我的应用程序中多次使用相同的方法,我知道这会导致我的同样的bug出现在其他地方。
我的问题是如何在不影响其他人“实例”的情况下删除用户的电子邮件?我是否必须改变我的观点以及我该怎么做?
答案 0 :(得分:0)
也许创建这样的结构:
表用户
id | Name | Email
-----------------
1 | John | john@example.com
2 | Jane | jane@example2.com
表友谊
User1_id | User2_id
-------------------
1 | 2
SELECT * FROM Users WHERE name=:name
SELECT
*
FROM
Friendships
LEFT JOIN
Users
ON
Friendships.User1_id = Users.id
WHERE
User1_id=:user_id
DELETE FROM Friendships WHERE User1_id=:current_user_id AND User2_id=:friend_to_remove_id
答案 1 :(得分:0)
快速脏方式是在所有“联系人”字段前加一个分号,以便输入如下:
;georgeMARK@email.com;MARK@email.com;
然后你可以用这种方式替换它:
$emailToDelete = ";$emailToDelete;"
... REPLACE(`Contacts`, :email, ';') ...
更好的方法是以更合适的格式(如JSON)存储联系人数据。
最佳解决方案是创建关系表并删除与要删除的联系人相关的所有条目。