php - mysql_fetch_all - mysql_fetch_array foreach
Guardar matriz de PHP a MySQL? (13)
¿Cuál es una buena manera de guardar una matriz de datos en un único campo mysql?
Además, una vez que consulto esa matriz en la tabla mysql, ¿cuál es una buena forma de volver a ponerla en forma de matriz?
¿Serializar y deserializar la respuesta?
Como se mencionó anteriormente: si no necesita buscar datos dentro de la matriz, puede usar serializar, pero esto es solo "php". Así que recomendaría usar json_decode / json_encode , ¡no solo por el rendimiento sino también por la portabilidad!
En general, sí, serializar y deserializar son el camino a seguir.
Sin embargo, si sus datos son algo simples, guardarlos como una cadena delimitada por comas probablemente sería mejor para el espacio de almacenamiento. Si sabes que tu matriz será solo una lista de números, por ejemplo, deberías usar implode / explosionar. 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, serializar y deserializar el trabajo para todos los casos.
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 de 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 configuraciones:
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 tus datos!
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 . "'');";
A continuación, puede buscar datos, almacenados en su matriz con consulta simple
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE ''%value3%''";
use la función de explosión () para convertir la cadena "array_data" a 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 exista en los valores de la 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 boolean cast (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'']);
No hay una buena manera de almacenar una matriz en un solo campo.
Debe examinar sus datos relacionales y realizar los cambios apropiados en su esquema. Vea el siguiente ejemplo para 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 puedes 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í, esto 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 función connect()
devuelve un recurso de conexión mysql
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db(''test'');
return $c;
}
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 te ayudará a mantener tu código más legible evitando las funciones locas.
Espero que esto sea útil para ti.
Sí, serializar / deserializar es lo que más he visto en muchos proyectos de código abierto.
Serializar / Deserializar matriz para almacenamiento en una base de datos
Visita serialize()
Del manual de PHP:
Mire debajo de "Volver" en la página
Devuelve una cadena que contiene una representación de valor de flujo de bytes que se puede almacenar en cualquier lugar.
Tenga en cuenta que esta es una cadena binaria que puede incluir bytes nulos, y necesita ser almacenada y manejada como tal. Por ejemplo, la salida serialize () generalmente se debe almacenar en un campo BLOB en una base de datos, en lugar de en un campo CHAR o TEXT.
Nota: Si desea almacenar html en un blob, asegúrese de base64 codificarlo o podría romper la función serializar.
Codificación de ejemplo:
$YourSerializedData = base64_encode(serialize($theHTML));
$YourSerializedData
ahora está listo para ser almacenado en blob.
Después de obtener los datos del blob, necesita base64_decode y luego desserializar la descodificación de ejemplo:
$theHTML = unserialize(base64_decode($YourSerializedData));
Serializar y deserializar 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.
Solo usa 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 implosión y explotar. Utilice una matriz en blanco en lugar de nueva.
Sugeriría usar implosión / explosión con un personaje que sabes que no estará contenido en ninguno de los elementos de la matriz individual. Luego guárdelo en SQL como una cadena.
Uhh, no sé por qué todos sugieren serializar la matriz.
Digo, la mejor manera es realmente encajarlo en su esquema de base de datos. No tengo idea (y no me diste ninguna pista) sobre el significado semántico real de los datos en tu 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 bastante poco elegante también, simplemente hacer que las columnas sean nulables) para 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 ese tipo varchar o algo y serializar los elementos de su matriz. No es lo mejor que se puede hacer, pero ciertamente es mejor que serializar todo el conjunto, ¿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 tiene que preocuparse por serializar matrices y cosas tan feas como esa.
En cuanto a recuperarlo. Bueno, obtenga la fila / secuencia de filas apropiada con una consulta y, bueno, use un bucle ... ¿verdad?
compruebe la función de implosión, ya que los valores están en una matriz, quiere 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 en la matriz son valores de texto, deberá agregar citas
$query = "INSERT INto hardware (specifications) VALUES ("''.implode("'',''",$specifications)."'')";
mysql_query($query);
Además, si no desea valores duplicados, cambie "IN" a "IGNORE" y solo se insertarán valores únicos en la tabla.