Guardar array PHP en MySQL?


¿Cuál es una buena manera de guardar una matriz de datos en un solo campo mysql?

También una vez que solicito esa matriz en la tabla mysql, ¿cuál es una buena manera de volver a la forma de matriz?

Es serializar y no serializar la respuesta?

Author: JasonDavis, 2009-12-30

13 answers

No existe una buena manera de almacenar un array en un solo campo.

Debe examinar sus datos relacionales y realizar los cambios apropiados en su esquema. Vea el ejemplo a continuación para una referencia a este enfoque.

Si debe guardar la matriz en un solo campo, a continuación, el serialize() y unserialize() funciones hará el truco. Pero no puede realizar consultas sobre el contenido real.

Como alternativa a la función de serialización también hay json_encode() y json_decode().

Considere la siguiente matriz

$a = array(
    1 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    2 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
);

Para guardarlo en la base de datos necesita crear una tabla 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 trabajar con los registros puede realizar consultas como estas (y sí, este es un ejemplo, ¡tenga 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();

La función connect() devuelve un recurso de conexión mysql

function connect() {
    $c = mysql_connect($server, $username, $password);
    mysql_select_db('test');
    return $c;
}
 78
Author: Peter Lindqvist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 09:44:02

Generalmente, sí, serializar y no serializar son el camino a seguir.

Si sus datos son algo simple, sin embargo, guardar como una cadena delimitada por comas probablemente sería mejor para el espacio de almacenamiento. Si sabe que su matriz será solo una lista de números, por ejemplo, entonces debería usar implode / explode. Es la diferencia entre 1,2,3 y a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}.

Si no, entonces serializar y no serializar el trabajo para todos los casos.

 24
Author: Matchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-30 04:37:35

La mejor manera, que me encontré a mí mismo es guardar matriz como cadena de datos con 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 . "');";

Luego puede buscar datos, almacenados en su matriz con simple query

$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";

Use la función explode () para convertir la cadena "array_data" a array

$array = explode("array_separator", $array_data);

Tenga en cuenta que esto no funciona con matrices multidimensionales y asegúrese de que su "array_separator" sea único y no haya existido en los valores de la matriz.

¡ten cuidado !!! si solo va a tomar un formulario de datos y poner en base de datos, estará en trap, porque los datos del formulario no son seguros para SQL. debe manejar el valor de su formulario con mysql_real_escape_string o si usa MySQLi mysqli::real_escape_string o si el valor es entero o booleano cast (int) (booleano) en ellos

$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']);
 8
Author: Harry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-23 01:37:36

Simplemente use la función serializar PHP:

<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>

Sin embargo, si está utilizando matrices simples como esa, también podría usar implode y explode.Utilice una matriz en blanco en lugar de nueva.

 8
Author: KramerC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-06 10:54:01

Serializar / Unserializar matriz para almacenamiento en una DB

Visita http://php.net/manual/en/function.serialize.php

Del Manual de PHP:

Busque en" Retorno " en la página

Devuelve una cadena que contiene una representación de flujo de bytes de valor que se puede almacenar en cualquier lugar.

Tenga en cuenta que esta es una cadena binaria que puede incluir bytes nulos, y debe almacenarse y manejarse como tal. Por ejemplo, la salida serialize() generalmente debe ser almacenada en un BLOB campo en una base de datos, en lugar de un campo CHAR o de TEXTO.

Nota: Si desea almacenar html en un blob, asegúrese de codificarlo base64 o podría romper la función serialize.

Ejemplo de codificación:

$YourSerializedData = base64_encode(serialize($theHTML));

$YourSerializedData ahora está listo para ser almacenado en blob.

Después de obtener datos de blob, debe base64_decode y luego dejar de serializar Ejemplo de decodificación:

$theHTML = unserialize(base64_decode($YourSerializedData));
 7
Author: seaBass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 06:49:53

Serializar y no serializar son bastante comunes para eso. También puede usar JSON a través de json_encode y json_decode para un formato menos específico de PHP.

 5
Author: ceejayoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-30 04:35:45

Como se mencionó anteriormente, si no necesita buscar datos dentro del array, puede usar serialize, pero esto es "solo php". Así que recomendaría usar json_decode / json_encode - no solo para el rendimiento, sino también para la portabilidad !

 4
Author: Sebastian Lasse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-29 18:03:29

Uhh, no se por qué todo el mundo sugiere serializar la matriz.

Digo, la mejor manera es realmente encajarlo en su esquema de base de datos. No tengo idea (y usted no dio pistas) sobre el significado semántico real de los datos en su matriz, pero generalmente hay dos formas de almacenar secuencias como esa

create table mydata (
  id int not null auto_increment primary key,
  field1 int not null,
  field2 int not null,
  ...
  fieldN int not null
)

De esta manera usted está almacenando su matriz en una sola fila.

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
)

La desventaja del primer método es, obviamente, que si tiene muchos elementos en su matriz, trabajar con esa mesa no será lo más elegante. También es poco práctico (posible, pero también bastante poco elegante - simplemente haga que las columnas sean nullables) trabajar con secuencias de longitud variable.

Para el segundo método, puede tener secuencias de cualquier longitud, pero de un solo tipo. Usted puede, por supuesto, hacer que un tipo varchar o algo y serializar los elementos de su matriz. No es lo mejor que se puede hacer, pero ciertamente mejor, que serializar toda la matriz, ¿verdad?

Bien manera, cualquiera de estos métodos obtiene una clara ventaja de ser capaz de acceder a un elemento arbitrario de la secuencia y usted no tiene que preocuparse de serializar matrices y cosas feas como eso.

En cuanto a recuperarlo. Bueno, obtenga la fila/secuencia de filas apropiada con una consulta y, bueno, use un bucle .. ¿verdad?

 3
Author: shylent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-30 04:56:20

Sugeriría usar implode/explode con un carácter que usted sabe que no estará contenido en ninguno de los elementos individuales de la matriz. Luego guárdelo en SQL como una cadena.

 1
Author: user1478500,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-24 18:36:33

Echa un vistazo a la función implode, ya que los valores están en una matriz, desea poner los valores de la matriz en una consulta mysql que inserta los valores en una tabla.

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

Si los valores de la matriz son valores de texto, deberá agregar comillas

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

Además, si no desea valores duplicados, cambie el "En" a "IGNORAR" y solo se insertarán valores únicos en la tabla.

 1
Author: j0k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-12 06:18:14

Puede guardar su matriz como un json.
hay documentación para el tipo de datos json: https://dev.mysql.com/doc/refman/5.7/en/json.html
Creo que esta es la mejor solución, y le ayudará a mantener su código más legible evitando funciones locas.
Espero que esto sea útil para usted.

 1
Author: Roberto Murguia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-04 20:51:25

Sí, serializar/unserializar es lo que más he visto en muchos proyectos de código abierto.

 0
Author: Eduardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-30 04:38:45

En lugar de guardarlo en la base de datos, guárdelo en un archivo y luego llámelo más tarde.

Lo que hacen muchas aplicaciones php (como sugarcrm) es simplemente usar var_export para hacer eco de todos los datos de la matriz en un archivo. Esto es lo que uso para guardar mis datos de configuración:

private function saveConfig() {
    file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');        
}

Creo que esta es una mejor manera de guardar sus datos!

 -3
Author: AntonioCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-30 08:00:26