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

标签 php mysql arrays cakephp serialization

我的问题是将大型 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/

相关文章:

php - 在属于和不属于的 3 个表中选择 mysql 数据?

使用 AJAX 检索表单时,Javascript 表单提交 PreventDefault 不起作用

php - 保护必须写入数据库的输入的步骤?

php - PDO 回显重复结果

sql - 如何绑定(bind)由不同 MySQL 查询产生的行?

php - 这是长轮询( cometd 编程)的正确方法吗

MYSQL/JSON : compare an array with the list of a column in JSON format and count the number of terms that match

c - 当我在函数的数组中赋值时出现段错误

ios - Collection View 数组与索引绑定(bind)

c - (C 编程)将 2 个一维数组合并为 1 个多维数组时出现段错误