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?
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.
Basta usar a função serializar PHP:
No entanto, se você estiver usando matrizes simples como essa, também pode usar implodir e explodir. Use uma matriz em branco em vez de nova.
fonte
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
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:
fonte
A melhor maneira que descobri para mim mesmo é salvar array como string de dados com caracteres separadores
Você pode então pesquisar dados, armazenados em sua matriz com uma consulta simples
use a função explode () para converter a string "array_data" em array
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
fonte
Serializar e desserializar são bastante comuns para isso. Você também pode usar JSON via json_encode e json_decode para um formato menos específico do PHP.
fonte
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).
fonte
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
Dessa forma, você está armazenando seu array em uma única linha.
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?
fonte
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ê.
fonte
Sim, serializar / desserializar é o que eu mais vi em muitos projetos de código aberto.
fonte
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.
fonte
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.
Se os valores na matriz forem valores de texto, você precisará adicionar aspas
Além disso, se você não quiser valores duplicados, mude "INto" para "IGNORE" e apenas valores únicos serão inseridos na tabela.
fonte
você pode inserir o objeto serializado (array) no mysql, example
serialize($object)
e você pode desserizar o objeto exampleunserialize($object)
fonte
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:
Acho que essa é a melhor maneira de salvar seus dados!
fonte