Intereting Posts
Laravel 5: как перенаправить данные с внешнего контроллера формы ресурса Как получить сумму времени из базы данных? Можем ли мы перезагрузить один из пулов PHP-FPM, не беспокоя других zend_navigation и атрибут onclick Передача URL-адреса URL-адреса в форму symfony2 с методом get Ошибка PHP Codeigniter: вызов неопределенного метода ci_db_mysql_driver :: result () Окончательный парсер PHP-url Как создать субдомены с помощью Cake PHP? Почему Ajax дает мне ошибку перекрестного происхождения, когда я могу сделать запрос с PHP? PHP, если существует несколько переменных С отключенными «магическими кавычками» почему PHP / WordPress продолжает автоматически избегать моих данных POST? Как сломать строку заглавными буквами с помощью PHP? Использование API Google Directory для извлечения всех пользователей в домене Каким образом сеансовая система codeigniter разделяется с PHP, встроенным в $ _SESSION? Как добавить дочернюю вкладку onclick кнопки в Yii framework?

Как сохранить массив в mysql?

Есть ли способ сохранить массив в поле mysql? Я создаю систему оценки комментариев, поэтому я хочу хранить массивы идентификаторов пользователей для предотвращения множественных голосований. Я собираюсь создать новую таблицу, содержащую идентификатор комментария и массив идентификаторов пользователей, которые проголосовали за этот комментарий. Затем я присоединяюсь к таблице комментариев и этой таблице и проверяю, существует ли текущий идентификатор пользователя в массиве избирателей или заметке. Если это произойдет, то значки голосования будут отключены. Я думаю, что я буду препятствовать использованию запроса mysql в цикле таким образом.

Знаете ли вы, что знаете лучше?

Related of "Как сохранить массив в 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) ); 

(comment_id, user_id) первичный ключ (comment_id, user_id) в таблице пересечений 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 в комментариях 1 и 2.

Если один и тот же пользователь попытается снова проголосовать по одному из этих комментариев, база данных отклонит его:

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

Если вы будете использовать движок хранения InnoDB , будет также разумно использовать ограничения внешнего ключа user_id полей 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 никогда не будет иметь значение comment_id или user_id которое не существует в comments и таблицах users , соответственно. Внешним ключам не требуется иметь рабочую реляционную базу данных, но они, безусловно, необходимы, чтобы избежать нарушенных связей и сиротских строк (т. Е. Ссылочной целостности ).

На самом деле, ссылочная целостность – это то, что было бы очень сложно обеспечить, если бы вы хранили сериализованные массивы в одно поле базы данных.

Рассмотрим нормализацию структуры таблицы в комментариях и отдельную таблицу голосов.

Таблица «комментарии»:

 id comment user ... 

Таблица «голосов»:

 user_id comment_id vote (downvote/upvote) 

это позволило бы неограниченное количество голосов без необходимости иметь дело с пределами поля базы данных.

Кроме того, у вас могут быть будущие потребности в таких операциях, как «показать все голоса, которые пользователь произнес», удаление конкретных голосов или ограничение максимального количества голосов в день. Эти операции мертвы легко и быстро реализуются с нормализованной структурой и ужасно медленны и сложны в сериализованном массиве.

у вас должно быть три таблицы: пользователи, комментарии и комментаторы.

comment_users имеет только два поля: fk_user_id и fk_comment_id

Таким образом, вы можете максимально увеличить свою производительность 🙂

Я бы предпочел более нормализовать структуру вашей таблицы, что-то вроде;

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

Теперь его легче поддерживать! И MySQL принимает только один голос за пользователя и комментарий.

создайте таблицу, как это,

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

Таким образом, вы можете проверить, не размещены ли пользователи комментариев. Кроме этого, должны быть таблицы для Comments и Users с соответствующими идентификаторами

Если вы просто храните данные в базе данных так же, как если бы вы вручную помещали ее в массив

 "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 для хранения массива в 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";} 

И затем вы можете использовать функцию unserialize php для декодирования данных.

Я думаю, вам стоит посетить эту страницу для хранения массива в mysql .

Хранение с помощью json или сериализованного массива – лучшее решение на данный момент. В некоторых ситуациях (обрезка «символов») json может получить проблемы, но сериализация должна быть отличным выбором.

Примечание. Если вы изменяете сериализованные данные вручную, вам нужно быть осторожным в отношении количества символов.

Вы можете сохранить свой массив как json.
есть документация для типа данных json: https://dev.mysql.com/doc/refman/5.7/en/json.html