如何将数组存储到mysql中?

时间:2010-08-05 09:16:23

标签: php mysql database

有没有办法将数组存储到mysql字段?我正在创建一个评论评级系统,所以我想存储用户ID数组以防止多次投票。我将创建一个新表,其中包含注释ID和已对此注释进行投票的用户ID数组。我将加入评论表和此表,并检查当前用户ID是否存在于选民数组或注释中。如果确实如此,则会禁用投票图标。我想我会阻止以这种方式在循环中使用mysql查询。

你碰巧知道更好的方法吗?

10 个答案:

答案 0 :(得分:61)

您可能希望解决此问题,如下所示:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
);

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
);

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id)
);

primary key (comment_id, user_id)上的复合intersection table comments_votes会阻止用户对同一评论多次投票。

让我们在上面的架构中插入一些数据:

INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');

INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');

现在让我们为用户1添加一些投票:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);

以上意味着用户1对评论1和2进行了类型1的投票。

如果同一用户尝试再对其中一条评论进行投票,则数据库将拒绝该评论:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

如果您将使用InnoDB存储引擎,那么在交叉表的comment_iduser_id字段上使用foreign key约束也是明智之举。但请注意,MyISAM是MySQL中的默认存储引擎,不会强制执行外键约束:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
) ENGINE=INNODB;

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id),
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

这些外键可确保comments_votes中的行永远不会有comment_iduser_id中不存在的commentsusers值表格,分别。外键不需要具有工作关系数据库,但它们对于避免破坏关系和孤立行(即referential integrity)绝对必不可少。

事实上,如果要将序列化数组存储到单个数据库字段中,那么参照完整性就很难实施。

答案 1 :(得分:48)

您始终可以序列化数组并将其存储在数据库中 PHP Serialize

然后,您可以在需要时反序列化数组。

答案 2 :(得分:13)

考虑将表结构规范化为注释和单独的投票表。

表“评论”:

id
comment
user
...

表“投票”:

user_id  
comment_id
vote (downvote/upvote)

这将允许无限数量的投票而无需处理数据库字段的限制。

此外,您可能有将来需要的操作,例如“显示用户已投票的所有投票”,删除特定投票或限制每天的最大投票数。使用规范化结构实现这些操作非常简单快速,并且在序列化数组中非常缓慢和复杂。

答案 3 :(得分:4)

你应该有三个表:users,comments和comment_users。

comment_users只有两个字段:fk_user_id和fk_comment_id

这样你可以保持最佳表现:)

答案 4 :(得分:4)

我希望更多地规范化你的表结构,比如;

COMMENTS
-------
id (pk)
title
comment
userId


USERS
-----
id (pk)
name
email


COMMENT_VOTE
------------
commentId (pk)
userId (pk)
rating (float)

现在维护起来更容易! MySQL只接受每个用户一票并发表评论。

答案 5 :(得分:1)

像这样创建表,

CommentId    UserId
---------------------
   1            usr1
   1            usr2

通过这种方式,您可以检查用户是否发布了评论不是.. 除此之外,应该有CommentsUsers的表格,各自的ID为

答案 6 :(得分:1)

如果您只是将数据存储在数据库中,就像手动将数据存入数组一样

"INSERT INTO database_name.database_table (`array`)
    VALUES
    ('One,Two,Three,Four')";

然后当您从数据库中提取时,请使用explode()函数

$sql = mysql_query("SELECT * FROM database_name.database_table");
$numrows = mysql_num_rows($sql);
if($numrows != 0){
    while($rows = mysql_fetch_assoc($sql)){
        $array_from_db = $rows['array'];
    }
}else{
    echo "No rows found!".mysql_error();
}
$array = explode(",",$array_from_db);
foreach($array as $varchar){
    echo $varchar."<br/>";
}

喜欢这样!

答案 7 :(得分:0)

使用jsonserialized数组存储是目前最好的解决方案。 在某些情况下(修剪“'字符),json可能会遇到麻烦,但序列化应该是很好的选择。

注意:如果手动更改序列化数据,则需要注意字符数。

答案 8 :(得分:0)

您可以使用php serialize函数在MySQL中存储数组。

<?php

$array = array("Name"=>"Shubham","Age"=>"17","website"=>"http://mycodingtricks.com");

$string_array = serialize($array);

echo $string_array;

?>

它的输出将是:

a:3{s:4:"Name";s:7:"Shubham";s:3:"Age";s:2:"17";s:7:"website";s:25:"http://mycodingtricks.com";}

然后你可以使用php unserialize函数来解码数据。

我认为你应该访问this page on storing array in mysql

答案 9 :(得分:0)

您可以将数组保存为json 有json数据类型的文档:https://dev.mysql.com/doc/refman/5.7/en/json.html