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

时间:2011-12-31 05:11:30

标签: php mysql arrays cakephp serialization

我的问题是将大型php数组保存到mysql表的最佳和最有效的方法是什么。我知道有很多方法可以做到这一点,我尝试过其中的一些,但我还没有找到一种我觉得很舒服的方法。大多数人推荐的主要方法是serialize()和unserialize()php函数。由于某种原因,这对我不起作用,我似乎已经尝试了各种方法来解决这个问题,但是我很高兴。

这是我的代码:

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

首先我反序列化 $ dbsongs ,它是mysql表中序列化数据的空白列表。然后我用 array_push() $ _ GET ['song'] 推送到数组。然后我序列化并将其存储到db。由于某些原因,这不起作用,但我也想知道是否有更好的方法。

我应该尝试分解php数组并将每个项目保存到表中并用逗号分隔项目,当我从数据库中检索它时它们会破坏该字符串吗?

或者我应该修复我正在使用的这种方法?或者甚至添加 base64_decode() base64_encode()?从我读过的一些事情来看,这些方法似乎有点陈旧...... http://www.evolt.org/node/60222

我见过使用 .implode 的方法,但我无法弄清楚如何使用它... Link 1 Link 2。这看起来像我见过的最现代的方法。这是我应该进一步研究的内容吗?

不知道这个方法是什么,但是它提到了Cakephp,我想它是一个php库。这是一个好方法吗?Link 1

我将在这些列表中存储大量项目(例如定期超过1k项目),所以我甚至不确定将这些项目保存到一个表格字段是否合适。简单地为这些项目制作一个表是最好的方法,因为列表将变得很大(为每个新项目添加新的数据库条目并创建一个“标题”字段将它们全部链接在一起)?我从来没有尝试过这样的事情,因为我无法找到足够的信息来了解mysql实际上可以容纳多少数据而不会出现问题。

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

-BAH

1 个答案:

答案 0 :(得分:12)

首先,如果您想将PHP数组存储在数据库中,请告诉我serialize()

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

在单个TEXT字段中使用序列化和存储序列化歌曲名称实际上是理想的,因为它使FULLTEXT索引搜索非常简单(我假设MySQL)。例如,您可以轻松找到包含单词" awesome"将序列化数组存储在单个字段中时。

另一种方法是创建三个表:一个用于列表,一个用于歌曲,一个用于歌曲和列表之间的链接。然后,您可以使用LEFT JOIN查询将歌曲与列表进行匹配。在你的情况下,我选择了以前的选择。

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

为什么SERIALIZE现在不适合你...

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