使用explode,split或preg_split来存储和获取多个数据库条目

时间:2011-03-25 18:24:12

标签: php mysql split explode preg-split

我正在试图找出如何以及哪种方法最适合存储和从数据库中获取多个条目。使用爆炸拆分 preg_split 。我需要实现的是用户使用表单中的文本字段向不同用户发送多个消息或通过输入他们的ID(如“101,102,103”)和多个用户共享数据,并且PHP代码足够智能以获取每个ID在“,”之后挑选它们。我知道这很多,但我需要这方面技术娴熟的人帮忙。我需要知道如何使PHP代码获取ID并能够使用它们的函数。就像从数据库单元中抓取“101,102,103”并使用从该字符串中获取的ID一样在数据库中获取不同的存储信息。

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

由于

3 个答案:

答案 0 :(得分: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列表的任何编辑,以及删除。

希望有意义!

答案 1 :(得分:0)

好吧,考虑一下你建议的三个功能:

    如果您的简单模式始终相同,
  • explode()将正常工作。
    • 例如,始终', ',但永远不会','
  • split()使用POSIX正则表达式 - 已弃用 - 不应再使用
  • preg_split()使用正则表达式作为模式;因此,将接受比explode()更多的情况。


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

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

答案 2 :(得分:0)

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

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

什么是嵌套练习,并且规范化,是创建单独的关系表。因此,使用您的消息示例,您可能会有一个“用户”表,一个“消息”表和一个“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)'