如何将数组存储到MySQL?

有没有办法将数组存储到MySQL字段? 我正在创build一个评论评级系统,所以我想存储用户id的数组,以防止多个投票。 我将创build一个新的表,其中包含评论ID和对此评论投票的用户ID数组。 比我join评论表和这张表,并检查当前的用户ID是否存在在选民数组或注意。 如果它比投票图标将被禁用。 我想我会阻止在这种方式在循环中使用mysql查询。

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

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

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

你可能想要解决这个问题如下:

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) ); 

交集表 comments_votes上的组合主键 (comment_id, user_id)将阻止用户多次投票评论相同的评论。

让我们在上面的模式中插入一些数据:

 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进行了types1的投票。

如果同一用户试图对其中一个评论再次投票,数据库将拒绝它:

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

如果您将使用InnoDB存储引擎,那么在交集表的comment_iduser_id字段上使用外键约束也是明智的做法。 但是请注意, 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中的行不会有commentsusers表中不存在的comment_iduser_id值。 外键不需要有一个工作的关系数据库,但是它们对于避免断开的关系和孤行(即参照完整性 )是绝对必要的。

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

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

表“意见”:

 id comment user ... 

表“投票”:

 user_id comment_id vote (downvote/upvote) 

这将允许无限数量的选票而不必处理数据库字段的限制。

此外,您可能有将来需要的操作,如“显示所有投票用户已投”,取消特定投票或限制每天的最大票数。 这些操作使用标准化的结构很容易和快速地实现,并且在串行化arrays中非常缓慢和复杂。

你应该有三个表:用户,评论和comment_users。

comment_users只有两个字段:fk_user_id和fk_comment_id

这样,你可以保持你的performance最高:)

我宁愿更正规化你的表格结构,就像;

 COMMENTS ------- id (pk) title comment userId USERS ----- id (pk) name email COMMENT_VOTE ------------ commentId (pk) userId (pk) rating (float) 

现在更容易维护! 而MySQL只接受每个用户一个投票和评论。

像这样创build表格,

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

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

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

 "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/>"; } 

像这样!

你可以使用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函数来解码数据。

我想你应该访问这个页面上存储数组在MySQL中 。

使用json或序列化数组存储是目前最好的解决scheme。 在某些情况下(修剪“字符)JSON可能会遇到麻烦,但序列化应该是不错的select。

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

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