【问题标题】:Change REPLACE SQL function in PHP to remove a contact更改 PHP 中的 REPLACE SQL 函数以删除联系人
【发布时间】:2016-06-09 17:49:56
【问题描述】:

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

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

虫子

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

  1. georgeMARK@email.com
  2. MARK@email.com

联系人电子邮件存储在名为Contacts 的MYSQL DB 列中,每封电子邮件都用分号(;)分隔。所以我们示例的列将如下所示(取决于最后添加的用户,反之亦然):

georgeMARK@email.com;MARK@email.com;

假设我们的用户想要从他的联系人中删除MARK。他按下按钮,然后……两封电子邮件都不见了。!

查看我的 PHPMyAdmin 面板,我发现该列中剩下的内容是:

george

问题出在我用来从列中删除帐户的 PDO SQL 语句中。

$STH = $DHB->prepare("UPDATE `Users` SET `Contacts` = REPLACE(`Contacts`, :email, '') WHERE `UserEmail` = :my_email");

REPLACE 函数只是替换了:email 的所有实例,这太糟糕了。我在我的应用程序中多次使用相同的方法,我知道这会导致我的相同错误也出现在其他地方。

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

【问题讨论】:

  • 为什么不为每个电子邮件地址创建一个单独的表格?
  • @Ties 好点,但我必须再次将用户与电子邮件联系起来,所以最后我会得到相同的结果。
  • 如果你有一个单独的表格,你可以使用DELETE WHERE email=:email,因为每封电子邮件都在另一行,它只会在真正匹配时删除
  • @Ties 是的,我知道,但可以说我必须阅读用户的联系人。我需要另一列将用户彼此联系起来,如果一个人有很多朋友,我需要多少列?

标签: php mysql email pdo


【解决方案1】:

结构

也许创建一个这样的结构:

表用户

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

【讨论】:

  • 邮件域都一样。
  • 没关系,你喜欢什么都可以
  • @GeorgeGkas 你明白我的例子吗?
  • 我不是数据库管理员。 (至少现在还没有)如果你能从你的结构网络中提供例子,那么你对我的帮助就足够了。
  • 您可以访问数据库吗?你可以创建表格吗?
【解决方案2】:

dirty 的快速方法是在所有联系人字段前添加一个分号,以便条目如下所示:

;georgeMARK@email.com;MARK@email.com;

那么你可以这样替换它:

$emailToDelete = ";$emailToDelete;"
... REPLACE(`Contacts`, :email, ';') ...

更好的方法是以更合适的格式(如 JSON)存储联系人数据。

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

【讨论】:

  • 谢谢你的懒惰!!!! :) - 我将在即将到来的修订中更新我的数据库结构。
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2018-10-14
  • 2014-12-28
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多