¿Cuál es una buena manera de guardar una matriz de datos en un solo campo mysql?
Además, una vez que consulto esa matriz en la tabla mysql, ¿cuál es una buena manera de recuperarla en forma de matriz?
¿Serializar y no serializar es la respuesta?
No existe una buena forma de almacenar una matriz en un solo campo.
Debe examinar sus datos relacionales y realizar los cambios adecuados en su esquema. Consulte el ejemplo a continuación para obtener una referencia a este enfoque.
Si debe guardar la matriz en un solo campo, las funciones serialize()
y unserialize()
harán el truco. Pero no puede realizar consultas sobre el contenido real.
Como alternativa a la función de serialización, también existe 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 necesitas 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, ¡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 connect()
función devuelve un recurso de conexión mysql
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Generalmente, sí, serializar y anular serializar son el camino a seguir.
Sin embargo, si sus datos son algo simple, guardar como una cadena delimitada por comas probablemente sea mejor para el espacio de almacenamiento. Si sabe que su matriz será solo una lista de números, por ejemplo, entonces debería usar implosionar / explotar. Es la diferencia entre 1,2,3
y a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
.
De lo contrario, serialice y anule la serialización del trabajo para todos los casos.
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 implosionar y explotar. Utilice una matriz en blanco en lugar de una nueva.
fuente
Serializar / Deserializar arreglo para almacenamiento en una base de datos
Visite http://php.net/manual/en/function.serialize.php
Del manual de PHP:
Busque en "Volver" en la página
Devuelve una cadena que contiene una representación de flujo de bytes del 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 almacenarse en un campo BLOB en una base de datos, en lugar de un campo CHAR o TEXT.
Nota: Si desea almacenar html en un blob, asegúrese de codificarlo en base64 o podría romper la función de serialización.
Codificación de ejemplo:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
ahora está listo para almacenarse en blob.Después de obtener datos de blob, necesita base64_decode y luego anular la serialización de la decodificación de ejemplo:
$theHTML = unserialize(base64_decode($YourSerializedData));
fuente
La mejor manera que encontré es guardar la 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 una simple consulta
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
use la función explode () para convertir la cadena "array_data" en una matriz
$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 matriz.
Ten cuidado !!! Si solo toma un formulario de datos y lo coloca en la base de datos, estará en una trampa, ¡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 (int) (boolean) 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']);
fuente
Serializar y unserializar 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.
fuente
Como se mencionó anteriormente, si no necesita buscar datos dentro de la matriz, puede usar serializar, pero esto es "solo php". Por lo tanto, recomendaría usar json_decode / json_encode , no solo por rendimiento, sino también por legibilidad y portabilidad (otros lenguajes como javascript pueden manejar datos json_encoded).
fuente
Uhh, no sé por qué todos sugieren serializar la matriz.
Digo, la mejor manera es encajarlo en el esquema de su base de datos. No tengo idea (y 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, 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 tabla 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 anulables) trabajar con secuencias de longitud variable.
Para el segundo método, puede tener secuencias de cualquier longitud, pero de un solo tipo. Por supuesto, puede hacer que ese tipo varchar o algo así y serializar los elementos de su matriz. No es lo mejor que se puede hacer, pero ciertamente es mejor que serializar toda la matriz, ¿verdad?
De cualquier manera, cualquiera de estos métodos obtiene una clara ventaja de poder acceder a un elemento arbitrario de la secuencia y no tienes que preocuparte por serializar matrices y cosas feas como esas.
En cuanto a recuperarlo. Bueno, obtenga la fila / secuencia de filas apropiada con una consulta y, bueno, use un bucle ... ¿verdad?
fuente
Puede guardar su matriz como 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 lo ayudará a mantener su código más legible al evitar funciones locas .
Espero que esto sea útil para ti.
fuente
Sí, serializar / unserializar es lo que más he visto en muchos proyectos de código abierto.
fuente
Sugeriría usar implosionar / explotar con un carácter que sepa que no estará contenido en ninguno de los elementos individuales de la matriz. Luego guárdelo en SQL como una cadena.
fuente
compruebe la función de implosión, 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 "INto" a "IGNORE" y solo se insertarán valores únicos en la tabla.
fuente
puede insertar un objeto serializado (matriz) en mysql, ejemplo
serialize($object)
y puede unserizar un objeto ejemplounserialize($object)
fuente
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!
fuente