如何将数组存储到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_id
和user_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
中的行不会有comments
和users
表中不存在的comment_id
或user_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
通过这种方式,你可以检查用户是否发布的评论是不是..除此之外,应该有Comments
和Users
与各自的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