保存PHP数组到MySQL?
将一组数据保存到单个mysql字段的好方法是什么?
另外,一旦我在MySQL表中查询该数组,什么是一个很好的方法,让它回到数组forms?
序列化和反序列化答案?
将数组存储到单个字段中没有好方法。
您需要检查关系数据并对模式进行适当的更改。 请参阅下面的示例以参考此方法。
如果你必须将数组保存到一个单独的字段中,那么serialize()
和unserialize()
函数就可以实现这个function。 但是你不能对实际的内容进行查询。
作为序列化函数的替代,还有json_encode()
和json_decode()
。
考虑下面的数组
$a = array( 1 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), 2 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), );
要将其保存在数据库中,您需要像这样创build一个表
$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) )');
要处理logging,你可以执行这些查询(是的,这是一个例子,小心!)
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; }
一般来说,是的,序列化和反序列化是要走的路。
如果你的数据是简单的,保存为逗号分隔的string可能会更好的存储空间。 如果你知道你的数组只是一个数字列表,那么你应该使用implode / explode。 这是1,2,3
之间的差异a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
。
如果不是,则对所有情况进行序列化和反序列化。
我发现自己最好的方法是将数组保存为带分隔符的数据string
$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 . "');";
然后,您可以用简单的查询search存储在数组中的数据
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
使用explode()函数将“array_data”string转换为数组
$array = explode("array_separator", $array_data);
请注意,这不适用于multidimensional array,并确保您的“array_separator”是唯一的,并且不存在于数组值中。
小心 !!! 如果你只是将表单数据存入数据库,你将陷入陷阱,因为表单数据不是SQL安全的! 你必须用mysql_real_escape_string来处理你的表单值,或者如果你使用MySQLi mysqli :: real_escape_string,或者如果value是整数或者布尔值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']);
只需使用序列化的PHP函数:
<?php $myArray = new array('1', '2'); $seralizedArray = serialize($myArray); ?>
但是,如果你使用这样简单的数组,你可能会使用内爆和爆炸。
序列化/反序列化数组以存储在数据库中
访问http://php.net/manual/en/function.serialize.php
从PHP手册:
查看页面上的“返回”
返回一个string,其中包含可以存储在任何位置的值的字节stream表示forms。
请注意,这是一个可能包含空字节的二进制string,需要像这样存储和处理。 例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是CHAR或TEXT字段。
注意:如果你想把html存储到一个blob中,一定要base64编码,否则可能会破坏序列化function。
编码示例:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
现在准备好存储在blob中。
从blob获取数据后,您需要base64_decode然后unserialize解码示例:
$theHTML = unserialize(base64_decode($YourSerializedData));
序列化和反序列化是相当普遍的。 您也可以通过json_encode和json_decode使用JSON来获得更less的PHP特定格式。
如前所述 – 如果你不需要search数组中的数据,你可以使用序列化 – 但这是“只有PHP”。 所以我会build议使用json_decode / json_encode – 不仅是为了性能,而且是为了便携!
呃,我不知道为什么每个人都build议序列化数组。
我说,最好的方法是真正适合你的数据库模式。 对于数组中的数据的实际语义含义,我不知道(也没有提供任何线索),但通常有两种方式来存储序列
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 )
第一种方法的缺点很明显,如果数组中有许多项目,那么使用该表格将不是最优雅的。 这也是不切实际的(可能,但是也不够好 – 只是使列可以为空)来处理可变长度的序列。
对于第二种方法,您可以有任何长度的序列,但只有一种types。 当然,你可以创build一个types的varchar或者其他东西,然后序列化你的数组的项目。 不是最好的做法,但肯定比序列化整个数组更好,对吧?
无论哪种方式,任何这些方法都可以访问序列的任意元素,并且不必担心序列化数组和丑陋的事情。
至于把它拿回来。 那么,用查询得到合适的行/序列的行,以及,使用循环 ..对吗?
我会build议使用implode /爆炸与你知道的人物不会被包含在任何单独的数组项目。 然后将其作为string存储在SQL中。
检查implode函数,因为值是在一个数组中,所以你想把数组的值放入一个mysql查询中,这个查询将这个值插入到一个表中。
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
如果数组中的值是文本值,则需要添加引号
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')"; mysql_query($query);
此外,如果您不想重复值,请将“INto”切换为“IGNORE”,并且只有唯一值将被插入到表中。
你可以将你的数组保存为json。
有json数据types的文档: https : //dev.mysql.com/doc/refman/5.7/en/json.html
我认为这是最好的解决scheme,并通过避免疯狂的function来帮助你保持代码的可读性。
我希望这对你有帮助。
是的,序列化/反序列化是我在许多开源项目中见过的最多的。
而不是将其保存到数据库,将其保存到一个文件,然后再调用它。
许多php应用程序(比如sugarcrm)只是使用var_export将数组的所有数据回显到文件中。 这是我用来保存我的configuration数据:
private function saveConfig() { file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';'); }
我认为这是一个更好的方式来保存您的数据!