我的问题是将大型 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();
所以首先我反序列化 $dbsongs 这是来自 mysql 表的序列化数据的空白列表。然后我使用 array_push() 将 $_GET['song'] 推送到数组。然后我将其序列化并将其存储到数据库中。出于某种原因,这不起作用,但我也想知道是否有更好的方法。
我是否应该尝试分解 php 数组并将每个项目保存到一个表中并用逗号分隔这些项目,然后当我从数据库中检索它时它们会破坏该字符串?
或者我应该只修复我正在使用的这个方法吗?或者甚至添加 base64_decode() 和 base64_encode()?从我读过的一些东西来看,这些方法似乎有点陈旧... http://www.evolt.org/node/60222
我见过一个使用.implode 的方法,但我不知道如何使用它... Link 1 Link 2 .这看起来是我见过的最现代的方法。这是我应该进一步研究的吗?
不确定这个方法是什么,但它提到了 Cakephp,我认为它是一个 php 库。这是一个好方法吗? Link 1
我将在这些列表中存储很多项目(例如经常超过 1k 个项目),所以我什至不确定将这些项目保存到一个表字段是否合适。简单地为这些项目制作一个表格是否是最好的方法,因为列表将会很大(为每个添加的新项目制作一个新的数据库条目并制作一个“标题”字段将它们链接在一起)?我从来没有尝试过这样的事情,因为我永远找不到足够的信息来说明 mysql 实际可以容纳多少数据而不会出现问题。
我知道这里有很多问题,但我们将不胜感激!提前致谢!
-呸
最佳答案
首先,如果您想将 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));
关于php - 将 PHP 数组数据保存到 mysql 表的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686432/