首页 > 解决方案 > 单个 MySQL 列中的首选项列表

问题描述

我目前正在为用户登录脚本编写代码。该脚本还具有启用“IP 识别”的选项,以检查登录者的 IP 是否与存储在 MySQL 数据库中的 IP 匹配。我还希望人们能够添加多个 IP 地址。我目前正在使用一个简单的 PHP 数组,如下所示:

$IP_array = array("xxx.xxx.xxx.xx1", "xxx.xxx.xxx.xx2", "xxx.xxx.xxx.xx3");

因此它可以检查其中一个数组值是否与数据库中的给定 IP 地址之一匹配。问题是;它不是最有效的选择,也不支持 CRUD。我还尝试为每个 IP 提供它自己的列,但这意味着我必须为每个 IP 地址创建一个新列,但它应该是无限的,所以这就是我希望它位于单个列中的原因。

如何编写一种更有效的方法来将多个值存储在仅一列(如数组)中,它还支持:添加值和删除值?

标签: phpmysql

解决方案


只是为了扩展我上面的评论,现在你有这样的东西:

╔══════════╗
║   User   ║
╠══════════╣
║ ID       ║
╠══════════╣
║ Name     ║
╠══════════╣
║ Address  ║
╚══════════╝

这适用于单个地址。但是你想添加更多。你可以这样做:

╔══════════╗
║   User   ║
╠══════════╣
║ ID       ║
╠══════════╣
║ Name     ║
╠══════════╣
║ Address1 ║
╠══════════╣
║ Address2 ║
╚══════════╝

但正如您正确指出的那样,您将“必须为每个 IP 地址创建一个新列”。

相反,你应该创建一个新表,所以你有这个:

╔══════════╗        ╔═══════════╗                  
║   User   ║        ║ Addresses ║                  
╠══════════╣        ╠═══════════╣                  
║ ID       ║        ║ UserID    ║                  
╠══════════╣        ╠═══════════╣                  
║ Name     ║        ║ Address   ║                  
╚══════════╝        ╚═══════════╝                  

用户的ID表示两者之间的关系,应该指定为Address表上的外键。查询时,您会执行以下操作:

SELECT Name, Address FROM User U LEFT JOIN Addresses A ON (U.ID = A.UserID) WHERE ID = ?

每个地址都会有一行。


推荐阅读