在PHP中更改REPLACE SQL函数以删除联系人

时间:2016-02-26 13:27:16

标签: php mysql email pdo

我最近清理了我的网络应用程序的代码。我的网络应用程序是一个简单的社交网络,具有添加,删除等程序。我有一个php文件,当用户想要从他的朋友列表中删除联系人时,我会调用该文件。

我在我的应用程序中想出了一个奇怪的错误,我没有估计我写它的时间。

The Bug

假设我们的列表中有两封朋友的电子邮件。

  1. georgeMARK@email.com
  2. MARK@email.com
  3. 联系人电子邮件存储在名称为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出现在其他地方。

    我的问题是如何在不影响其他人“实例”的情况下删除用户的电子邮件?我是否必须改变我的观点以及我该怎么做?

2 个答案:

答案 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)存储联系人数据。

最佳解决方案是创建关系表并删除与要删除的联系人相关的所有条目。