Лучший способ сохранить данные массива PHP в таблицу mysql

мой вопрос в том, что является лучшим и наиболее эффективным способом сохранения большого массива php в таблицу mysql. Я знаю, что есть много методов, чтобы сделать это, и я попробовал несколько из них, но я все еще не нашел метод, который я действительно чувствую себя комфортно использовать. Основной метод, который большинство людей рекомендуют, - это функции PHP serialize() и unserialize (). По какой-то причине это не работает для меня, и я, кажется, пробовал все способы исправить это, но idk.

вот мой код:

    // unserialize songs, add new song to end of array, and then re-serialize to add to db
    $cereal = unserialize($dbsongs);
    $pushed = array_push($cereal, $_GET['song']);
    $songs = serialize($pushed);

    //update playlists table
    $stmt = $dbh->prepare("UPDATE playlists SET songs=:songs WHERE title=:title AND user=:user");
    $stmt->bindParam(':user', $_SESSION['username'], PDO::PARAM_STR);
    $stmt->bindParam(':title', $_GET['title'], PDO::PARAM_STR);
    $stmt->bindParam(':songs', $songs, PDO::PARAM_STR);
    $stmt->execute();

поэтому сначала я unserialize $dbsongs который является пустым списком сериализованных данных из таблицы mysql. Тогда я толкаю $_GET ['song'] к массиву с array_push (). Затем я сериализую это и сохраняю его в db. По какой-то причине это не работает, но я хотел бы знать, если есть лучший путь.

должен ли я попытаться разбить массив php и сохранить каждый элемент в таблицу и разделить элементы запятыми и они ломают эту строку, когда я получаю ее из БД?

или я должен просто исправить этот метод, который я использую? Или даже добавить base64_decode () и base64_encode ()? Эти методы кажутся старыми из-за некоторых вещей, которые я читал... http://www.evolt.org/node/60222

Я видел метод, использующий .implode но я не могу понять, как его использовать...ссылка 1 Ссылка 2. Этот взгляд как самый современный подход, который я видел. Это то, что я должен искать?

Не уверен, что это за метод, но он упоминает Cakephp, который, я полагаю, является библиотекой php. Это хороший метод?ссылка 1

Я собираюсь хранить много элементов в этих списках (например, более 1k элементов регулярно), поэтому я даже не уверен, будет ли уместно сохранить эти элементы в одном поле таблицы. Было бы просто сделать таблицу для этих элементов лучшим методом, так как список будет песней большой (создание новой записи db для каждого добавленного нового элемента и создание поля "title", чтобы связать их все вместе)? Я никогда не экспериментировал с чем-то подобным, потому что я никогда не мог найти достаточно информации о том, сколько данных mysql может содержать без проблем.

Я знаю, что здесь много вопросов, но любые ответы будут очень признательны! Заранее спасибо!

-БА

1 ответов


во-первых, позвольте мне сказать, что serialize() - это путь, если вы хотите сохранить массивы PHP в БД.

ваша проблема в том, что ты неправильно array_push(). Если вы используете его правильно, метод serialize () будет работать. Через минуту я расскажу, как исправить ваш код для этой цели.

использование сериализации и сохранение сериализованных имен песен в одном текстовом поле на самом деле идеально здесь, потому что это делает поиск полнотекстового индекса очень простым (Я предполагаю MySQL). Вы можете легко найти, например, все списки с названиями песен, содержащими слово "awesome", когда вы храните сериализованный массив в одном поле.

альтернативой было бы создать три таблицы: одну для списков, одну для песен и одну для ссылок между песнями и списками. Затем вы можете использовать запрос LEFT JOIN для сопоставления песен со списками. В твоем случае, я бы выбрал первый вариант.

способ хранения зависит от того, как вы планируете открыть данные. Если вам нужно быстро и часто сопоставлять определенные названия песен в списке, нормализованная форма базы данных, упомянутая второй, может быть лучше.

ПОЧЕМУ СЕРИАЛИЗАЦИЯ НЕ РАБОТАЕТ ДЛЯ ВАС ПРЯМО СЕЙЧАС ...

array_push() возвращает целое число, и первый полученный параметр передается по ссылке. Это означает, что строка:

$pushed = array_push($cereal, $_GET['song']);

на самом деле параметр $pushed равно количеству элементов в $cereal массив плюс один.

вы можете исправить свою проблему так:

$serial = unserialize($dbsongs);
$song_count_in_pushed_array = array_push($serial, $_GET['song']);
$songs = serialize($serial);

обновление

в ответ на ваш комментарий о кодировке base64 сериализованных данных, вот как вы это сделаете, чтобы предотвратить повреждение данных с данными, которые не являются 8-битными чистыми:

// For safe serializing
$encoded_and_serialized = base64_encode(serialize($array));

// For unserializing
$restored = unserialize(base64_decode($encoded_and_serialized));