这是我的代码:
// 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实际上可以容纳多少数据而不会出现问题.
我知道这里有很多问题,但任何答案都将不胜感激!提前致谢!
-呸
你的问题是你误用了array_push()
.如果你正确使用它,serialize()方法将起作用.我将在稍后讨论如何为此目的修复代码.
在一个TEXT字段中使用序列化和存储序列化的歌曲名称实际上是理想的,因为它使FULLTEXT索引搜索非常简单(我假设是MysqL).例如,当您将序列化数组存储在单个字段中时,您可以轻松找到包含单词“awesome”的所有列表.
另一种方法是创建三个表:一个用于列表,一个用于歌曲,一个用于歌曲和列表之间的链接.然后,您可以使用LEFT JOIN查询将歌曲与列表进行匹配.在你的情况下,我会选择前一个选项.
存储方法实际上取决于您计划如何访问数据.如果您需要能够快速且经常在列表中匹配特定歌曲标题,则提到的标准化数据库表单可能更好.
为什么SERIALIZE现在不适合你…
array_push()返回一个整数,它接收的第一个参数通过引用传递.这意味着该行:
$pressed = array_push($cereal,$_GET [‘song’]);
实际上将$push设置为等于$cereal数组中的元素数加1.
您可以像这样纠正您的问题:
$serial = unserialize($dbsongs); $song_count_in_pushed_array = array_push($serial,$_GET['song']); $songs = serialize($serial);
UPDATE
为了回应您对base64编码序列化数据的评论,以下是如何使用非8位清理数据来防止数据损坏:
// For safe serializing $encoded_and_serialized = base64_encode(serialize($array)); // For unserializing $restored = unserialize(base64_decode($encoded_and_serialized));