Para que no salgan las variables por la URL una solución es enviarlas por POST en vez de GET.  
  
Respecto al 
%20, algunos navegadores sustituyen el espacio en blanco por la cadena 
%20 
 . Lo único que se me ocurre es que o evitas los espacios en blanco o colocas tú un carácter concreto que te permita posteriormente volver a colocar espacios cuando los necesites. No sé si me expliqué.  
  
Antes de enviar la variable sustituyes los espacios en blanco por el carácter 
+, por ejemplo. Cuando vayas a mostrar el valor de esas variables vuelves a sustituir el carácter 
+ por espacios en blanco. 
Más o menos es lo mismo pero al menos limpia un poco más el código los caracteres + en vez de 
%20. Aunque si te decides por el envío mediante el método POST, todo esto no te haría falta ya que lo de colocar la cadena 
%20sólo es de algunos navegadores en la barra de direcciones. 
Suerte!  
  
Un beso 
  
P.D.: Un ejemplo de función en PHP para sustituir caracteres/subcadenas en una cadena  es 
str_replace()