Qual é uma boa maneira de salvar um array de dados em um único campo mysql?
Além disso, depois de consultar esse array na tabela mysql, qual é uma boa maneira de colocá-lo de volta na forma de array?
É serializar e desserializar a resposta?
Qual é uma boa maneira de salvar um array de dados em um único campo mysql?
Além disso, depois de consultar esse array na tabela mysql, qual é uma boa maneira de colocá-lo de volta na forma de array?
É serializar e desserializar a resposta?
Respostas:
Não é bom maneira de armazenar um array em um único campo.
Você precisa examinar seus dados relacionais e fazer as alterações apropriadas em seu esquema. Veja o exemplo abaixo para uma referência a esta abordagem.
Se você deve salvar a matriz em um único campo, o serialize()
eunserialize()
funções resolverão o problema. Mas você não pode realizar consultas no conteúdo real.
Como alternativa à função de serialização, existe também json_encode()
e json_decode()
.
Considere a seguinte matriz
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
Para salvá-lo no banco de dados você precisa criar uma tabela como esta
$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)
)');
Para trabalhar com os registros você pode realizar consultas como essas (e sim, este é um exemplo, cuidado!)
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();
A connect()
função retorna um recurso de conexão mysql
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Geralmente, sim, serializar e desserializar são o caminho a percorrer.
Porém, se seus dados forem simples, salvar como uma string delimitada por vírgulas provavelmente seria melhor para o espaço de armazenamento. Se você sabe que seu array será apenas uma lista de números, por exemplo, você deve usar implodir / explodir. É a diferença entre 1,2,3
e a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
.
Caso contrário, serialize e desserialize o trabalho para todos os casos.
Serializar / desserializar array para armazenamento em um banco de dados
Visite http://php.net/manual/en/function.serialize.php
Do Manual do PHP:
Procure em "Devolução" na página
Retorna uma string contendo uma representação de fluxo de bytes de valor que pode ser armazenada em qualquer lugar.
Observe que esta é uma string binária que pode incluir bytes nulos e precisa ser armazenada e tratada como tal. Por exemplo, a saída serialize () geralmente deve ser armazenada em um campo BLOB em um banco de dados, ao invés de um campo CHAR ou TEXT.
Nota: Se você quiser armazenar html em um blob, certifique-se de codificá-lo em base64 ou pode interromper a função de serialização.
Codificação de exemplo:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
agora está pronto para ser armazenado no blob.
Depois de obter os dados do blob, você precisa usar base64_decode e desserializar a decodificação de exemplo:
$theHTML = unserialize(base64_decode($YourSerializedData));
A melhor maneira que descobri para mim mesmo é salvar array como string de dados com caracteres separadores
$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 . "');";
Você pode então pesquisar dados, armazenados em sua matriz com uma consulta simples
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
use a função explode () para converter a string "array_data" em array
$array = explode("array_separator", $array_data);
observe que isso não está funcionando com arrays multidimensionais e certifique-se de que seu "array_separator" é único e não existia em valores de array.
Seja cuidadoso !!! se você apenas pegar os dados do formulário e colocá-los no banco de dados, estará em uma armadilha, porque os dados do formulário não são seguros para SQL! você deve lidar com o valor do seu formulário com mysql_real_escape_string ou se você usar MySQLi mysqli :: real_escape_string ou se os valores forem inteiros ou boolean cast (int) (boolean) neles
$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']);
Como mencionado antes - se você não precisa pesquisar dados dentro do array, você pode usar serializar - mas isso é "somente php". Portanto, eu recomendaria usar json_decode / json_encode - não apenas para desempenho, mas também para legibilidade e portabilidade (outras linguagens como javascript podem lidar com dados json_encoded).
Uhh, não sei por que todo mundo sugere serializar o array.
Eu digo, a melhor maneira é realmente encaixá-lo em seu esquema de banco de dados. Não tenho ideia (e você não deu pistas) sobre o significado semântico real dos dados em sua matriz, mas geralmente há duas maneiras de armazenar sequências como essa
create table mydata (
id int not null auto_increment primary key,
field1 int not null,
field2 int not null,
...
fieldN int not null
)
Dessa forma, você está armazenando seu array em uma única linha.
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
)
A desvantagem do primeiro método é, obviamente, que se você tiver muitos itens em seu array, trabalhar com aquela tabela não será a coisa mais elegante. Também é impraticável (possível, mas também deselegante - apenas tornar as colunas anuláveis) trabalhar com sequências de comprimento variável.
Para o segundo método, você pode ter sequências de qualquer comprimento, mas de apenas um tipo. Você pode, é claro, fazer aquele tipo varchar ou algo assim e serializar os itens de seu array. Não é a melhor coisa a fazer, mas certamente é melhor do que serializar todo o array, certo?
De qualquer forma, qualquer um desses métodos obtém uma vantagem clara de ser capaz de acessar um elemento arbitrário da sequência e você não precisa se preocupar com a serialização de matrizes e coisas feias como essa.
Quanto a recuperá-lo. Bem, pegue a linha / sequência de linhas apropriada com uma consulta e, bem, use um loop .. certo?
Você pode salvar seu array como um json.
há documentação para o tipo de dados json: https://dev.mysql.com/doc/refman/5.7/en/json.html
Acho que esta é a melhor solução e ajudará você a manter seu código mais legível, evitando funções malucas .
Espero que isso seja útil para você.
Eu sugeriria o uso de implodir / explodir com um caractere que você sabe que não estará contido em nenhum dos itens individuais da matriz. Em seguida, armazene-o no SQL como uma string.
verifique a função implodir, uma vez que os valores estão em uma matriz, você deseja colocar os valores da matriz em uma consulta mysql que insere os valores em uma tabela.
$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";
Se os valores na matriz forem valores de texto, você precisará adicionar aspas
$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";
mysql_query($query);
Além disso, se você não quiser valores duplicados, mude "INto" para "IGNORE" e apenas valores únicos serão inseridos na tabela.
você pode inserir o objeto serializado (array) no mysql, example serialize($object)
e você pode desserizar o objeto exampleunserialize($object)
Em vez de salvá-lo no banco de dados, salve-o em um arquivo e chame-o mais tarde.
O que muitos aplicativos php fazem (como o sugarcrm) é apenas usar var_export para ecoar todos os dados do array para um arquivo. Isso é o que eu uso para salvar meus dados de configuração:
private function saveConfig() {
file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');
}
Acho que essa é a melhor maneira de salvar seus dados!