【问题标题】:Using explode, split, or preg_split to store and get multiple database entries使用 explode、split 或 preg_split 存储和获取多个数据库条目
【发布时间】:2011-03-25 18:24:11
【问题描述】:

我正在尝试找出最适合在数据库中存储和获取多个条目的方法和方法。使用 explodesplitpreg_split。我需要实现的是用户使用表单中的文本字段向不同的用户发送多条消息或通过输入他们的 ID(如“101,102,103”)和 PHP 代码来与多个用户共享数据,以便足够聪明地通过以下方式获取每个 ID在“,”之后选择它们。我知道这要求很多,但我需要在这方面更熟练的人的帮助。我需要知道如何让 PHP 代码抓取 ID 并能够对它们使用函数。就像从数据库单元格中抓取“101,102,103”并使用从该字符串中抓取的 ID 抓取数据库中不同的存储信息一样。

我怎样才能做到这一点?示例将非常有帮助。

谢谢

【问题讨论】:

  • 不要将逗号分隔的值存储在表列中...标准化您的数据库,以便(例如)您有一个带有 message_id 和接收者用户 ID 列的 message_sent_to 表

标签: php mysql split explode preg-split


【解决方案1】:

如果我正确理解您的问题,如果您正在处理以逗号分隔的 ID 号字符串,那么将它们保持为这种格式可能是最简单的。原因是您可以在查询数据库时在 SQL 语句中使用它。

我假设您要运行 SELECT 查询来获取已输入 ID 的用户,对吗?您可能想使用 SELECT ... WHERE IN ... 类型的语句,如下所示:

// Get the ids the user submitted
$ids = $_POST['ids'];
// perform some sanitizing of $ids here to make sure 
// you're not vulnerable to an SQL injection
$sql = "SELECT * FROM users WHERE ID IN ($ids)";
// execute your SQL statement

或者,您可以使用 explode 创建每个 ID 的数组,然后循环遍历,以便您可以检查每个值以确保其正确,然后再使用 implode 将它们连接在一起可以在 SELECT ... WHERE IN ... 语句中使用的字符串。

编辑:抱歉,忘了补充:就在数据库中存储用户 ID 列表而言,您可以考虑将逗号分隔的列表存储为针对消息 ID 的字符串,但是有缺点(如果需要,很难在其他表上进行 JOINS)。或者,更好的选择是创建一个查找类型表,它基本上由两列组成:messageiduserid。然后,您可以将每个人 userid 存储在 messageid 上,例如

messageid | userid
1 | 1
1 | 3
1 | 5

这种方法的好处是您可以使用此表连接其他表(也许您有一个单独的message 表来存储消息本身的详细信息)。

在此方法下,您将在消息表中创建一个新条目,取回 id,然后将 userids 字符串分解为单独的部分,最后创建您的 INSERT 语句以使用各个 id 插入数据和消息ID。您需要制定其他机制来处理对消息用户 ID 列表的任何编辑以及删除。

希望这是有道理的!

【讨论】:

    【解决方案2】:

    好吧,考虑到您建议的三个功能:

    • 如果您有一个始终相同的简单模式explode() 将可以正常工作。
      • 例如,总是', ',但绝不是','
    • split() 使用 POSIX 正则表达式(已弃用)并且不应再使用
    • preg_split() 使用 regex 作为模式 ;因此,将接受比explode()更多的情况。


    然后:不要在单个数据库列中存储多个值:用它做任何有用的工作都是不可能的!

    创建一个不同的表来存储这些数据,每行有一个值——多行对应于第一个表中的一行。

    【讨论】:

      【解决方案3】:

      我认为你的问题更多是 SQL 而不是 PHP。

      从技术上讲,您可以将 id 存储到单个 MySQL 字段中的“set”字段中,并在您的条件中使用 IN 或 FIND_IN_SET 对其进行查询。查找实际上非常快,但这并不是最佳实践,而是创建了一个非规范化的数据库。

      什么是嵌套实践,并且是规范化的,是创建单独的关系表。因此,使用您的消息示例,您可能会有一个“users”表、一个“messages”表和一个用于在用户之间关联消息的“users_messages”表。 'messages' 表将包含消息信息,并且可能包含原始发件人的 'user_id' 字段(因为只能有一个),而 'users_messages' 表将仅包含一个 'user_id' 和 'message_id' 字段,包含将消息链接到它们所属的各种用户的行。然后您只需要使用 JOIN 查询来检索数据,因此如果您要检索用户的收件箱,查询将如下所示:

      SELECT
          messages.*
      FROM
          messages
          LEFT JOIN users_messages ON users_messages.message_id = messages.message_id
      WHERE
          users_messages.user_id = '(some user id)'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多