Pet*_*ist 84
没有很好的方法将数组存储到单个字段中.
您需要检查关系数据并对架构进行适当的更改.有关此方法的参考,请参见下面的示例.
如果必须将数组保存到单个字段中,则serialize()和unserialize()函数将完成.但是您无法对实际内容执行查询.
作为序列化功能的替代方案,还有 json_encode()和json_decode().
考虑以下数组
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
Run Code Online (Sandbox Code Playgroud)
要将其保存在数据库中,您需要创建一个这样的表
$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)
)');
Run Code Online (Sandbox Code Playgroud)
要处理记录,您可以执行这些查询(是的,这是一个示例,请注意!)
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();
Run Code Online (Sandbox Code Playgroud)
该connect()函数返回一个mysql连接资源
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*chu 26
通常,是的,序列化和反序列化是要走的路.
但是,如果您的数据很简单,那么保存为逗号分隔的字符串可能会更好地存储空间.例如,如果你知道你的数组只是一个数字列表,那么你应该使用implode/explode.这之间的区别1,2,3和a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}.
如果没有,则为所有情况序列化和反序列化工作.
小智 9
只需使用序列化PHP函数:
<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在使用这样的简单数组,那么您也可以使用implode和explode.使用空数组而不是新数组.
序列化/反序列化数组以便在数据库中存储
访问http://php.net/manual/en/function.serialize.php
从PHP手册:
查看页面上的"返回"
返回一个字符串,其中包含可以存储在任何位置的值的字节流表示形式.
请注意,这是一个二进制字符串,可能包含空字节,需要像这样存储和处理.例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是存储在CHAR或TEXT字段中.
注意:如果要将html存储到blob中,请确保对其进行base64编码,否则可能会破坏序列化功能.
编码示例:
$YourSerializedData = base64_encode(serialize($theHTML));
Run Code Online (Sandbox Code Playgroud)
$YourSerializedData 现在已准备好存储在blob中.
从blob获取数据后,您需要base64_decode然后反序列化示例解码:
$theHTML = unserialize(base64_decode($YourSerializedData));
Run Code Online (Sandbox Code Playgroud)
我发现自己最好的方法是将数组保存为带分隔符的数据字符串
$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 . "');";
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用简单查询搜索存储在数组中的数据
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
Run Code Online (Sandbox Code Playgroud)
使用explode()函数将"array_data"字符串转换为数组
$array = explode("array_separator", $array_data);
Run Code Online (Sandbox Code Playgroud)
请注意,这不适用于多维数组,并确保您的"array_separator"是唯一的并且在数组值中不存在.
小心 !!!如果您只是将表单数据放入数据库,那么您将处于陷阱状态,因为表单数据不是SQL安全的!你必须使用mysql_real_escape_string处理你的表单值,或者你使用MySQLi mysqli :: real_escape_string, 或者如果value是整数或boolean cast(int)(boolean)
$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']);
Run Code Online (Sandbox Code Playgroud)
小智 5
如前所述-如果您不需要在数组中搜索数据,则可以使用序列化-但这是“仅PHP”。因此,我建议使用json_decode / json_encode-不仅用于性能,而且还用于可读性和可移植性(其他语言,例如javascript可以处理json_encoded数据)。