Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marina limeira

O que esta de errado neste exemplo do EVAL

Recommended Posts

estou tentando ver onde esta o erro no codigo abaixo:

 

<?php
$nome = "ROBINHO";
$email = 'robinho@gmmmail.cooom';
$mensagem = 'Esta selecao esta muito ruim.';

$body = file_get_contents('conteudo.php');

echo $body . "\n <br> <hr>";

eval("\$body = \"$body\";");
echo $body . "\n";

?>

o resultado que imprime apenas 2 vezes o mesmo conteudo do arquivo conteudo.php

que tem um texto em html com as variaveis $nome $email $mensagem

 

na segunda impressao deveria sair substituida nao??

 

obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez o problema esteja em conteudo.php

 

Veja se esta mais ou menos assim

 

conteudo.php

<html>
<head>
</head>
<body>
<h1>Meu nome é $nome $sobrenome</h1>
</body>
</html>

Index.php

<?php
$nome = 'Marina';
$sobrenome = 'Limeira';

$str = file_get_contents("conteudo.php");

echo $str . "<br>";
eval("\$str = \"$str\";");
echo $str;
?>

Se for posta aí

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu exemplo deve ser conteudo no lugar do 403...bem este seu funcionou, o problema que é que quando formato e dou um layout bonito, começa o problema.. da tudo errado, so no seu proprio exemplo eu dei um italico no nome que ja nao funcionou mais. Por que isso? sera que o eval nao aceita HTML ? como resolver isso ou tem outro comando melhor?

 

o meu conteudo é:

<p> $nome 
  <br>
  <br>
  <strong>TESTE de eval e substituicao de campos.</strong><br>
  Modelo preenchido com os dados.
</p>
<table width="200" border="1">
  <tr>
    <td>NOME: </td>
    <td><strong> $nome </strong></td>
  </tr>
  <tr>
    <td>E-MAIL: </td>
    <td>$email </td>
  </tr>
  <tr>
    <td>MENSAGEM:</td>
    <td>$mensagem</td>
  </tr>
  <tr>
    <td> </td>
    <td> </td>
  </tr>
</table>
<p><br>
</p>
</body>

amigos, o que sugerem?

assim possa dar um layout bonito no arquivo conteudo...

 

obrigadaa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troque as aspas duplas por aspas simples

<table width='200' border='1'> 

Tenta aí...

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho qeu entendi

 

você pretende criar um template engine com um simples parse entre variáveis, certo?

 

não vou explicar a parte teórica para nao complicar, portanto, montei dois exemplos práticos, utilziando os seus próprios scripts

 

 

index.php

<?php
$nome = "ROBINHO";
$email = 'robinho@gmmmail.cooom';
$mensagem = 'Esta selecao esta muito ruim.';


$src = '';
if( $fp = fopen( 'conteudo.php', 'r' ) )
{

    $src = '';
    while( !feof( $fp ) )
    {
        $src .= fread( $fp, 65536 ); 
        flush(); // this is essential for large files
    }  
    fclose( $fp ); 

}

echo $src . "\n <br> <hr>";

eval( "?>" . $src );

?>

 

conteudo.php

<p> <?php echo $nome;?>
  <br>
  <br>
  <strong>TESTE de eval e substituicao de campos.</strong><br>
  Modelo preenchido com os dados.
</p>
<table width="200" border="1">
  <tr>
    <td>NOME: </td>
    <td><strong> <?php echo $nome;?> </strong></td>
  </tr>
  <tr>
    <td>E-MAIL: </td>
    <td><?php echo $email;?> </td>
  </tr>
  <tr>
    <td>MENSAGEM:</td>
    <td><?php echo $mensagem;?></td>
  </tr>
  <tr>
    <td> </td>
    <td> </td>
  </tr>
</table>
<p><br>
</p>
</body>

 

 

nesse primeiro exemplo, não há controle do output, portanto, o resultado do eval será jogado no output automaticamente.

 

o exemplo seguinte, mostra como controlar a saída, para que seja posssível, por exemplo, atribuir o resultado do processo dentro de uma variável

Compartilhar este post


Link para o post
Compartilhar em outros sites

index.php

<?php
$nome = "ROBINHO";
$email = 'robinho@gmmmail.cooom';
$mensagem = 'Esta selecao esta muito ruim.';


$src = '';
if( $fp = @fopen( 'eval-conteudo.php', 'r' ) )
{

    $src = '';
    while( !feof( $fp ) )
    {
        $src .= fread( $fp, 65536 ); 
        flush(); // this is essential for large files
    }  
    fclose( $fp ); 

}

echo $src . "\n <br> <hr>";

ob_start();
eval( "?>" . $src );
$body = ob_get_contents();
ob_end_clean(); 
unset( $src );

flush();

echo $body;
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma duvida, o arquivo de template conteudo tem que cada campo ser precedido da abertura do comando php ?

sim, onde possuir php deve estar dentro das tags PHP

 

 

posso trabalhar automaticamente o template conteudo.htm com formatacao livremente?

onde tiver somente HTML, não há necessidade nem mesmo de passar pelo eval()

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinon e amigos

achei muito complexa o modo usando eval ...

 

e é sempre ruim usar um dreamweaver por exemplo para montar o template: conteudo.html e inserir os tags da linguagem <?php ... ?>

 

em vez de usar eval, teria uma outra alternativa mais simples ou esta é a melhor ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é a mais "simples", pois de outro modo, você teria que praticamente criar uma linguagem de programação.

 

se quiser, pode estudar também os sistemas como "Smarty Template Engine" www.smarty.net

Compartilhar este post


Link para o post
Compartilhar em outros sites

em vez de usar eval, teria uma outra alternativa mais simples ou esta é a melhor ?

 

Alternativas sempre existem (e várias) agora, a melhor, está diretamente relacionada a sua necessidade, você que deverá ver o que precisa e então escolher a que melhor lhe atende.

 

Veja, um exemplo bem simples, criamos uma classe Transformer e salvamos em um local acessível, com esse arquivo salvo, você só precisa inclui-lo quando for precisar

 

Transformer.php

class Transformer {
private $content;
private $data = array();

public function __set( $name , $value ){
$this->data[ $name ] = $value;
}

public function __get( $name ){
return $value =& $this->data[ $name ];
}

public function load( $file ){
$ret = false;

if ( is_file( $file ) && is_readable( $file ) ){
$this->content = file_get_contents( $file );
$ret = true;
}

return $ret;
}

public function loadString( $string ){
$this->content = $string;
}

public function transformView(){
if ( isset( $this->content{ 0 } ) ){
$keys = array();

foreach ( array_keys( $this->data ) as $key )
$keys[] = sprintf( '/\\$%s/' , $key );

return preg_replace( $keys , array_values( $this->data ) , $this->content );
}
}
}

 

Supondo que seu html esteja assim:

 

teste.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http-~~-//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http-~~-//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>$title</title>
</head>
<body>
<p>
$nome <br />
<br />
<strong>TESTE de eval e substituicao de campos.</strong>
<br />Modelo preenchido com os dados. 
</p>
<table width="200" border="1">
<tr>
<td>NOME:</td>
<td><strong> $nome </strong></td>
</tr>
<tr>
<td>E-MAIL:</td>
<td>$email</td>
</tr>
<tr>
<td>MENSAGEM:</td>
<td>$mensagem</td>
</tr>
</table>
</body>
</html>

 

Você faria assim no PHP para transformá-lo:

require 'Transformer.php'; //Incluímos a classe

$teste = new Transformer(); //criamos um novo objeto
/**
* Aqui definimos todas as variáveis que são utilizadas no html
*/
$teste->title = 'Página de teste';
$teste->nome = 'Neto';
$teste->email = 'email@dominio.com';
$teste->mensagem = 'Hey !!!';

$teste->load( 'teste.html' ); //Carregamos o html
echo $teste->transformView(); //Damos um echo no html transformado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.