Ver Mensaje Individual
  #8 (permalink)  
Antiguo 09/06/2014, 18:10
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Recuperar consulta y aplicar variables, después

Se me ocurre otra variante que hace laburar un poco mas a la base de datos pero que no altera tanto tu código original y emula el efecto que quieres lograr:

Código PHP:
Ver original
  1. <?php
  2.     //Cargo variables
  3.     $nombre = 'Juan';
  4.     $telf = 1234567890;
  5.  
  6.     echo recuperarMensajedesdeBD(get_defined_vars());
  7.  
  8.     function recuperarMensajedesdeBD($vars)
  9.     {
  10.         global $conexion;
  11.  
  12.         $field = "mensaje";
  13.         foreach($vars as $key => $val)
  14.             $field = 'REPLACE('.$field.', \'{$'.$key.'}\', \''.str_replace('\'', '\\\'', $val).'\')';
  15.  
  16.         $consulta = mysql_query("SELECT $field FROM mensajes WHERE id=1", $conexion);
  17.         $mensaje = mysql_fetch_array($consulta);
  18.         return $mensaje[0];
  19.     }

Lo que a efectos practicos seria como si se estubiera interpolando, pero si tienes muchas variables en el ambito en que se llama a la funcion (en este caso global) el rendimiento bajaria en picada innesesariamente, por lo tanto podriamos optar por llamarla de forma optimizada asi:
Código PHP:
Ver original
  1. echo recuperarMensajedesdeBD(array("nombre" => $nombre, "telf"=> $telf));

En el caso anterior, es la base de datos la que realiza el trabajo pesado, y php igual esta haciendo un loop (el foreach), un reemplazo (el de sanear las comillas) y 3 concatenaciones, asi que es razonable pensar en sacarle el trabajo a la bd y pasarselo a php ya que no se va a perder mucho, mas bien se va a ganar en rendimiento.
Código PHP:
Ver original
  1. function recuperarMensajedesdeBD($vars)
  2.     {
  3.         global $conexion;
  4.  
  5.         $consulta = mysql_query("SELECT mensaje FROM mensajes WHERE id=1", $conexion);
  6.         $mensaje = mysql_fetch_array($consulta, MYSQL_NUM);        
  7.        
  8.         foreach($vars as $key => $val)
  9.             $mensaje[0] = str_replace('{$'.$key.'}', $val, $mensaje[0]);
  10.  
  11.         return $mensaje[0];
  12.     }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios