我最近清理了网络应用程序的代码。我的网络应用程序是一个简单的社交网络,具有添加、删除等程序。我有一个 php 文件,当用户想从他的 friend 列表中删除联系人时,我会调用该文件。
我在我的应用程序中发现了一个奇怪的错误,我没有估计我编写它的时间。
错误
假设我们的列表中有两个 friend 电子邮件。
- georgeMARK@email.com
- 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
的所有实例,这太糟糕了。我在我的应用程序中多次使用相同的方法,我知道这会导致我的相同错误也出现在其他地方。
我的问题是如何在不影响其他“实例”的情况下删除用户的电子邮件?我必须改变我的观点吗?我需要怎么做?
最佳答案
快速肮脏方法是在所有联系人字段前加上一个分号,这样条目如下:
;georgeMARK@email.com;MARK@email.com;
那么可以这样替换:
$emailToDelete = ";$emailToDelete;"
... REPLACE(`Contacts`, :email, ';') ...
更好的方法是以更合适的格式(如 JSON)存储联系人数据。
最好的解决方案是创建一个关系表并删除所有与要删除的联系人相关的条目。
关于php - 更改 PHP 中的 REPLACE SQL 函数以删除联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35652978/