我可以帮您翻译成中文:我能将一个 PHP 数组插入到单个 MySQL 记录字段中吗?

3
假设我们有一个MySQL表格"table",它包含字段"user"和"siblings",我们想要为每个用户存储这些家庭信息。
那么问题来了:是否可以实现这一点?
$user=35;
$sibs=array("george","christina");

mysql_query("insert into table (user,siblings) values ('$user','$sibs')");

这样 "siblings" 字段就包含了一个数组?


请在发布问题之前先搜索。http://stackoverflow.com/questions/2880276/php-mysql-array-insert-array-info-into-mysql - Jon Gauthier
5个回答

3
你想要使用PHP的serialize()函数来实现这个功能。要反转这个过程,使用unserialize()
PHP.net上的代码片段:
<?php
// $session_data contains a multi-dimensional array with session
// information for the current user.  We use serialize() to store
// it in a database at the end of the request.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
      "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
    $stmt = odbc_prepare($conn,
     "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, $sqldata)) {
        /* Something went wrong.. */
    }
}
?>

我会尝试这个,说实话我对序列化不太熟悉。 - gianniskpf

3
为了进一步完善@David Houde所提到的答案,如果对您有用的话,还可以使用压缩来节省空间:
<?php
mySerialize( $obj ) {
   return base64_encode(gzcompress(serialize($obj)));
}

myUnserialize( $txt ) {
   return unserialize(gzuncompress(base64_decode($txt)));
}
?>

2
您可以使用implode()函数在值之间添加分隔符。例如,您可以使用竖线“|”作为分隔符。
例如:
$user=35;
$sibs=array("george","christina");

$sibs1 = ''.implode('|',$sibs).'|';

mysql_query("insert into table (user,siblings) values ('$user','$sibs1')");

从数据库中提取信息时,在查询中使用 LIKE '%|$var|%' 来提取精确值。例如:|Christina|。

2

我通常更喜欢使用implode函数,但在这种比我给出的示例要复杂得多的情况下,它不起作用。 - gianniskpf
你能说一下为什么“序列化”是不好的实践吗? - pavium
3
因为1)如果您需要存储键值对,那么MySQL不是最佳选择;2)如果将来您想要选择具有列表中一个或多个属性的所有项目,则会遇到很大问题。 - Emmerman

0

是的,您可以在插入之前对数组进行serialize(),或者使用您选择的某种分隔符implode()它,但我建议您为每个用户-兄弟关系插入单独的行。


我考虑了implode,通常我会使用它。但实际上,我在这里给出的示例比我要遇到的实际问题要复杂得多。我不知道序列化,我会尝试一下。 - gianniskpf
我相信如果您发布您正在尝试解决的问题,您会得到比现在更好的解决方案。 :) - Narf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接