Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Serialize una cadena escapada

Estas en el tema de Serialize una cadena escapada en el foro de PHP en Foros del Web. Hola y gracias de antemano por la atención, 1) La idea de una aplicación es guardar unas opciones generales en un array. Para eso es ...
  #1 (permalink)  
Antiguo 07/03/2013, 17:01
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Pregunta Serialize una cadena escapada

Hola y gracias de antemano por la atención,

1) La idea de una aplicación es guardar unas opciones generales en un array. Para eso es necesario serializar los datos...

Código PHP:
$arrayOpciones = array(
                    
'activo'=>1,
                    
'id_canal'=> $id_canal_autor,
                    
'titulo'=> $titulo,                    
                    
'autor' => $autor,
                    
'descripcion_autor' => $descripcion_autor,
                    
'url' => $url,
                    
'iframe' => $iframe,
                    
'descripcion_evento'=> $descripcion,
                    
'localizacion'=> $localizacion    
                    
);
$arrayOpciones serialize($arrayOpciones); 
Lo guarda en la bbdd sin problemas y lo recupero sin problemas con unserialize.

Código PHP:
$arrayDatosPantalla $mi_selector->getterConsultaSimple();
$arrayDatosPantalla unserialize($arrayDatosPantalla['datosDirecto']); 
2) El problema viene por esto. Este es el tratamiento que reciben las variables antes de insertarlas.

Código PHP:
if ( isset($_REQUEST['canal_iframe']) ) {
    
$iframe strip_tags($_REQUEST['canal_iframe'],'<iframe><embed>');
    
$iframe $link_id->real_escape_string($iframe); 
Una de ellas debe almacenar la típica etiqueta <iframe...>, que tiene muchas comillas...

Código HTML:
<iframe width="560" height="315"
3) Al "unserializar", o como se diga el aplicar unserialize, genera un error...

Código PHP:
Noticeunserialize() [function.unserialize]: Error at offset 397 of 1018 bytes in 
que no da si no real_escapeo, la variable.

********

¿Alguien ha tenido alguna vez un problema semejante o sabe cómo solucionarlo?

GRACIAS!
  #2 (permalink)  
Antiguo 07/03/2013, 17:33
 
Fecha de Ingreso: diciembre-2010
Mensajes: 788
Antigüedad: 11 años
Puntos: 50
Respuesta: Serialize una cadena escapada

Podes usar la función stripslashes antes de aplicar el unserialize
  #3 (permalink)  
Antiguo 07/03/2013, 18:27
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Respuesta: Serialize una cadena escapada

Pues la idea es brillante, pero no funciona.

El problema por lo que intuyo va por aquí:

Cuando serializa, un dígito guarda el valor de la cadena. Por ejemplo: s:6:"activo" (de string 6).

En la base de datos, el dato iframe que uso para las pruebas está así:

s:135:"<iframe width="420" height="315" src="http://www.youtube.com/embed/DwYPG6vreJg?rel=0" frameborder="0" allowfullscreen></iframe>

peeeero, si cuento los caracteres, con o sin pasar por el stripslashes, salen 127.

Es decir, se ve que al guardar los datos serializados, cuenta las comillas y su carácter de escape. Así, luego, como no le cuadra con la cadena se vuelve tarumba...

gracias en cualquier caso : )
  #4 (permalink)  
Antiguo 07/03/2013, 18:38
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 10 años, 4 meses
Puntos: 793
Respuesta: Serialize una cadena escapada

usa base64_encode y base64_decode antes de serializar y des-serializar.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 07/03/2013, 19:02
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Respuesta: Serialize una cadena escapada

Gracias.

Sí, había leído en el manual que alguien lo resolvió así, pero a mí no me ha funcionado, ya que no me deja base64ear un array.

Es decir, esto,

Código PHP:
Ver original
  1. $arrayOpciones = array(
  2.                     'activo'=>1,
  3.                     'id_canal'=> $id_canal_autor,
  4.                     'titulo'=> $titulo,                
  5.                     'autor' => $autor,
  6.                     'descripcion_autor' => $descripcion_autor,
  7.                     'url' => $url,
  8.                     'iframe' => $iframe,
  9.                     'descripcion_evento'=> $descripcion,
  10.                     'localizacion'=> $localizacion 
  11.                     );
  12. $arrayOpciones =  base64_encode($arrayOpciones);

me dice que nanay :P

Warning: base64_encode() expects parameter 1 to be string, array given in C:\xampp\htdocs\tanhhauser\recoge.php on line 185
  #6 (permalink)  
Antiguo 07/03/2013, 19:09
 
Fecha de Ingreso: diciembre-2010
Mensajes: 788
Antigüedad: 11 años
Puntos: 50
Respuesta: Serialize una cadena escapada

Tal vez no sea la mejor solución, pero podría probar usando json_encode / json_decode ( en vez de serializar )

Última edición por walterdevel; 07/03/2013 a las 19:27
  #7 (permalink)  
Antiguo 07/03/2013, 21:02
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 10 años, 4 meses
Puntos: 793
Respuesta: Serialize una cadena escapada

Tienes que usar base64_encode encima del serialize, tambien prueba lo que propone @walterdevel
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #8 (permalink)  
Antiguo 07/03/2013, 22:30
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.026
Antigüedad: 17 años, 6 meses
Puntos: 832
Respuesta: Serialize una cadena escapada

Cita:
Iniciado por mmfilesi Ver Mensaje
Gracias.

Sí, había leído en el manual que alguien lo resolvió así, pero a mí no me ha funcionado, ya que no me deja base64ear un array.

Es decir, esto,

Código PHP:
Ver original
  1. $arrayOpciones = array(
  2.                     'activo'=>1,
  3.                     'id_canal'=> $id_canal_autor,
  4.                     'titulo'=> $titulo,                
  5.                     'autor' => $autor,
  6.                     'descripcion_autor' => $descripcion_autor,
  7.                     'url' => $url,
  8.                     'iframe' => $iframe,
  9.                     'descripcion_evento'=> $descripcion,
  10.                     'localizacion'=> $localizacion 
  11.                     );
  12. $arrayOpciones =  base64_encode($arrayOpciones);

me dice que nanay :P

Warning: base64_encode() expects parameter 1 to be string, array given in C:\xampp\htdocs\tanhhauser\recoge.php on line 185
Eso es porque no lo estás haciendo como te lo indican:

Código PHP:
Ver original
  1. $ser   = base64_encode( serialize($arrayOpciones) );
  2.  
  3. $unser = base64_encode( unserialize($arrayDatosPantalla['datosDirecto']) );
  #9 (permalink)  
Antiguo 08/03/2013, 02:02
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Respuesta: Serialize una cadena escapada

Hola amigos, muchas gracias por el seguimiento.

a) Sí, probé con el Json también, pero no funcionó. Lo que no he hecho ha sido experimentar con las distintas opciones de la función. En cuanto pueda, probaré hoy si alguna funciona.

b) andresdzphp, metacortex, sí, probé también invirtiendo el orden. Pero no funciona. El problema es el mismo: al serializar cuenta las barras del escape como carácter, la cuales desaparecen en algún momento entre el ingreso en la base de datos y su recuperación, generando así el desfase en el número de caracteres que espera encontrar al unserializar y los que realmente hay.

Para entendernos, tendría que existir esta opción:

serialize($cadena, OPTION_CUENTA_LAS_BARRAS_DE_ESCAPE)

Un abrazo.
  #10 (permalink)  
Antiguo 08/03/2013, 04:24
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Respuesta: Serialize una cadena escapada

OK, funciona con Json si al recibir ponemos true en el parámetro assoc.

Al enviar:

Código PHP:
$arrayOpciones = array('activo'=>1,
                    
'id_canal'=> $id_canal_autor,
                    
'titulo'=> $titulo,                    
                    
'autor' => $autor,
                    
'descripcion_autor' => $descripcion_autor,
                    
'url' => $url,
                    
'iframe' => $iframe,
                    
'descripcion_evento'=> $descripcion,
                    
'localizacion'=> $localizacion    
                    
);
$arrayOpciones json_encode($arrayOpciones); 
al recibir

Código PHP:
$arrayDatosPantalla json_decode($arrayDatosPantalla['datosDirecto'], true); 
Voy a ver si descubro ahora que no se me escojoncien acentos y eñes :P
  #11 (permalink)  
Antiguo 08/03/2013, 04:55
 
Fecha de Ingreso: noviembre-2010
Mensajes: 36
Antigüedad: 11 años
Puntos: 1
Respuesta: Serialize una cadena escapada

Bueno, pues aunque hay alguna posibilidad con el json_encode, lo mejor creo que es emplear htmlentities / html_entity_decode, para quitarse de líos.

Problema solucionado, aunque me queda el gusanillo de saber cómo serializar un array con caracteres escapados usando el serialize normal : )

gracias a todos.
  #12 (permalink)  
Antiguo 08/03/2013, 10:14
Avatar de miguec04  
Fecha de Ingreso: agosto-2008
Ubicación: Cimitarra, Santander
Mensajes: 378
Antigüedad: 13 años, 3 meses
Puntos: 15
Respuesta: Serialize una cadena escapada

<?php
//Una ultima opción podria ser:
//recorrer todo el vector y codificar con urlencode y despues serializarlo
// y cuando lo necesites aplicar el caso de devuelta urldecode($str)
urlencode($str);
urldecode($str);
?>
__________________
Desoftc Technology - Miguel Carmona
Creaciones Inteligentes - Cimitarra Colombia
[email protected]
http://www.desoftc.com.co

Etiquetas: serialize
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:20.