将数据数组保存到单个mysql字段的好方法是什么?
一旦我在mysql表中查询该数组,有什么方法可以将它恢复为数组形式?
序列化和反序列化答案吗?
答案 0 :(得分:82)
没有良好的方法将数组存储到单个字段中。
您需要检查关系数据并对架构进行适当的更改。有关此方法的参考,请参见下面的示例。
如果必须将数组保存到单个字段中,那么serialize()
和unserialize()
函数就可以完成。但是您无法对实际内容执行查询。
作为序列化功能的替代方案,还有json_encode()
和json_decode()
。
考虑以下数组
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
要将其保存在数据库中,您需要创建一个这样的表
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
'DROP TABLE IF EXISTS test');
$r = mysql_query(
'CREATE TABLE test (
id INTEGER UNSIGNED NOT NULL,
a INTEGER UNSIGNED NOT NULL,
b INTEGER UNSIGNED NOT NULL,
c INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
)');
要处理记录,您可以执行这些查询(是的,这是一个示例,请注意!)
function getTest() {
$ret = array();
$c = connect();
$query = 'SELECT * FROM test';
$r = mysql_query($query,$c);
while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
$ret[array_shift($o)] = $o;
}
mysql_close($c);
return $ret;
}
function putTest($t) {
$c = connect();
foreach ($t as $k => $v) {
$query = "INSERT INTO test (id,".
implode(',',array_keys($v)).
") VALUES ($k,".
implode(',',$v).
")";
$r = mysql_query($query,$c);
}
mysql_close($c);
}
putTest($a);
$b = getTest();
connect()
函数返回一个mysql连接资源
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
答案 1 :(得分:26)
通常,是的,序列化和反序列化是可行的方法。
如果您的数据很简单,那么保存为逗号分隔的字符串可能会更好地存储空间。例如,如果你知道你的数组只是一个数字列表,那么你应该使用implode / explode。这是1,2,3
和a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
之间的差异。
如果没有,则为所有情况序列化和反序列化工作。
答案 2 :(得分:8)
只需使用序列化PHP函数:
<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>
但是,如果你使用这样的简单数组,你也可以使用implode和explode。使用空白数组而不是新数组。
答案 3 :(得分:8)
我发现自己最好的方法是将数组保存为带分隔符的数据字符串
$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);
$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";
然后,您可以使用简单查询
搜索存储在数组中的数据$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
使用explode()函数将“array_data”字符串转换为数组
$array = explode("array_separator", $array_data);
请注意,这不适用于多维数组,并确保“array_separator”是唯一的,并且在数组值中不存在。
小心!!!如果您只是将表单数据放入数据库,那么您将处于陷阱状态,因为表单数据不是SQL安全的!你必须处理你的表格价值 使用mysql_real_escape_string或使用MySQLi mysqli::real_escape_string 或者如果value是整数或boolean cast(int)(布尔值)
$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];
$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);
答案 4 :(得分:8)
序列化/反序列化数组以便在数据库中存储
访问http://php.net/manual/en/function.serialize.php
从PHP手册:
查看页面上的“返回”
返回一个字符串,其中包含可以存储在任何位置的值的字节流表示。
请注意,这是一个二进制字符串,可能包含空字节,需要像这样存储和处理。例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是存储在CHAR或TEXT字段中。
注意:如果要将html存储到blob中,请确保对其进行base64编码,否则可能会破坏序列化功能。
编码示例:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
现已准备好存储在blob中。
从blob获取数据后,您需要base64_decode然后反序列化 解码示例:
$theHTML = unserialize(base64_decode($YourSerializedData));
答案 5 :(得分:5)
序列化和反序列化非常常见。您还可以通过json_encode和json_decode使用JSON,以获得更少PHP特定的格式。
答案 6 :(得分:4)
如前所述 - 如果您不需要在数组中搜索数据,可以使用序列化 - 但这只是“仅限php”。所以我建议使用 json_decode / json_encode - 不仅是为了性能而且是为了便携性!
答案 7 :(得分:3)
呃,我不知道为什么每个人都建议序列化数组。
我说,最好的方法是将其真正适合您的数据库架构。我不知道(并且你没有提供线索)关于数组中数据的实际语义含义,但通常有两种方法来存储这样的序列
create table mydata (
id int not null auto_increment primary key,
field1 int not null,
field2 int not null,
...
fieldN int not null
)
这样您就可以将数组存储在一行中。
create table mydata (
id int not null auto_increment primary key,
...
)
create table myotherdata (
id int not null auto_increment primary key,
mydata_id int not null,
sequence int not null,
data int not null
)
第一种方法的缺点显然是,如果你的数组中有很多项,那么使用该表将不是最优雅的。它也是不切实际的(可能,但也非常不优雅 - 只需使列可以为空)使用可变长度的序列。
对于第二种方法,您可以使用任何长度的序列,但只能使用一种类型。当然,您可以创建一个类型的varchar或类似的序列化数组的项目。不是最好的事情,但肯定比串行化整个阵列更好,对吗?
无论哪种方式,任何一种方法都能明显地获得能够访问序列中任意元素的优点,而且您不必担心序列化数组和类似丑陋的事情。
至于取回它。好吧,用查询得到适当的行/行序列,好吧,使用循环 ..对吗?
答案 8 :(得分:2)
您可以将数组保存为json
有json数据类型的文档:https://dev.mysql.com/doc/refman/5.7/en/json.html
我认为这是最好的解决方案,并且可以通过避免疯狂的功能来帮助您保持代码的可读性
我希望这对你有所帮助。
答案 9 :(得分:1)
检查implode函数,因为值在数组中,您希望将数组的值放入一个将值插入表中的mysql查询。
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
如果数组中的值是文本值,则需要添加引号
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";
mysql_query($query);
此外,如果您不想要重复值,请将“INto”切换为“IGNORE”,并且只会将唯一值插入表格中。
答案 10 :(得分:1)
我建议将implode / explode与您知道不会包含在任何单个数组项中的字符一起使用。然后将其作为字符串存储在SQL中。
答案 11 :(得分:0)
是的,序列化/反序列化是我在许多开源项目中看到的最多。
答案 12 :(得分:0)
您可以将序列化的对象(数组)插入mysql,例如serialize($object)
,还可以取消序列化对象的实例unserialize($object)
答案 13 :(得分:-4)
不是将其保存到数据库,而是将其保存到文件中,然后再调用它。
许多php应用程序(如sugarcrm)只是使用var_export将数组的所有数据回显到文件中。 这是我用来保存配置数据的内容:
private function saveConfig() {
file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');
}
我认为这是保存数据的更好方法!