将PHP数组数据保存到mysql表的最佳方法

将PHP数组数据保存到mysql表的最佳方法,php,mysql,arrays,cakephp,serialization,Php,Mysql,Arrays,Cakephp,Serialization,我的问题是什么是将大型php数组保存到mysql表的最佳和最有效的方法。我知道有很多方法可以做到这一点,我已经尝试了其中的一些方法,但我仍然没有找到一种我真正感到舒服的使用方法。大多数人推荐的主要方法是serialize()和unserialize()php函数。出于某种原因,这对我不起作用,我似乎已经尝试了各种方法来解决这个问题,但idk除外 这是我的密码: // unserialize songs, add new song to end of array, and then re-

我的问题是什么是将大型php数组保存到mysql表的最佳和最有效的方法。我知道有很多方法可以做到这一点,我已经尝试了其中的一些方法,但我仍然没有找到一种我真正感到舒服的使用方法。大多数人推荐的主要方法是serialize()和unserialize()php函数。出于某种原因,这对我不起作用,我似乎已经尝试了各种方法来解决这个问题,但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();

首先,我不序列化$dB歌,它是MySQL表中序列化数据的空白列表。然后我使用array\u push()将$\u GET['song']推送到数组中。然后我序列化它并将其存储到db。出于某种原因,这不起作用,但我也想知道是否有更好的方法

我是否应该尝试拆分php数组并将每个项保存到一个表中,并用逗号分隔这些项,然后在从db检索时将它们拆分为字符串

或者我应该修复我正在使用的这个方法吗?或者甚至添加base64_decode()和base64_encode()?从我读到的一些东西来看,这些方法似乎有点过时

我见过一个使用.infrade的方法,但我不知道如何使用它。这看起来是我见过的最现代的方法。这是我应该进一步研究的吗

不确定这个方法是什么,但它提到了Cakephp,我认为它是一个php库。这是一个好方法吗

我将在这些列表中存储很多项(比如定期存储超过1k项),所以我甚至不确定是否将这些项保存到一个表字段中是合适的。简单地为这些项目创建一个表是最好的方法吗?因为列表将非常大(为添加的每个新项目创建一个新的db条目,并创建一个“title”字段将它们链接在一起)?我从来没有尝试过这样的东西,因为我永远都找不到足够的信息来说明mysql实际上可以容纳多少数据而不会出现问题

我知道这里有很多问题,但如果有任何答案,我们将不胜感激!提前谢谢


-BAH

首先,让我说,如果您想在数据库中存储PHP数组,
serialize()
是一种方法。

你的问题是你误用了。如果使用正确,serialize()方法将起作用。我将在稍后讨论如何修复用于此目的的代码

在这里,使用serialize并将序列化的歌曲名称存储在单个文本字段中实际上是非常理想的,因为它使全文索引搜索变得非常简单(我假设为MySQL)。例如,当您将序列化数组存储在单个字段中时,您可以很容易地找到包含单词“awesome”的歌曲标题的所有列表

另一种方法是创建三个表:一个用于列表,一个用于歌曲,另一个用于歌曲和列表之间的链接。然后可以使用左连接查询将歌曲与列表进行匹配。就你而言,我会选择前者

存储方法实际上取决于您计划如何访问数据。如果您需要能够快速且经常地在列表中匹配特定的歌曲标题,那么第二个提到的规范化数据库表单可能会更好

为什么SERIALIZE现在不适合您…

array\u push()
返回一个整数,它接收的第一个参数通过引用传递。这意味着该行:

$push=array\u push($grane,$\u GET['song'])

实际上是将
$pushed
设置为
$grane
数组中的元素数加上一

您可以这样纠正您的问题:

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

您是否反对将歌曲存储在另一个表中,并创建一个桥接表(playlist_songs)来处理这种关系?这是使用关系数据库(如MySQL)的传统方法。太棒了,感谢您的修复!那么您建议使用unserialize()和serialize()方法来保存列表?base64_decode()和base64_encode()函数如何,我需要它们吗(我想这取决于我保存的数据,通常我会将int变量保存到列表中)?再次感谢你的帮助!是的,serialize/unserialize是专门为传输数据结构(如数组)而创建的。base64函数可防止不可用的数据出现问题。例如,假设您序列化并存储包含UTF-16字符串的数组,但数据库排序规则不支持这些字符。如果不对序列化数据进行base64_编码,将导致数据损坏。我在回答的末尾添加了一个注释来说明这一点。但是,如果您只存储数字数据,那么base64函数将是不必要的。