有没有办法将数组存储到mysql字段?我正在创建一个评论评级系统,所以我想存储用户ID数组以防止多次投票。我将创建一个新表,其中包含注释ID和已对此注释进行投票的用户ID数组。我将加入评论表和此表,并检查当前用户ID是否存在于选民数组或注释中。如果确实如此,则会禁用投票图标。我想我会阻止以这种方式在循环中使用mysql查询。
你碰巧知道更好的方法吗?
答案 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_id
和user_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_id
和user_id
中不存在的comments
或users
值表格,分别。外键不需要具有工作关系数据库,但它们对于避免破坏关系和孤立行(即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
通过这种方式,您可以检查用户是否发布了评论不是..
除此之外,应该有Comments
和Users
的表格,各自的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)
使用json或serialized数组存储是目前最好的解决方案。 在某些情况下(修剪“'字符),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