Ir para conteúdo

Arquivado

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

daniele bianca

exibir conteudo do mysql em loop

Recommended Posts

gente

 

estou com uma duvida que tem me consumido a semanas.

 

em uma string existem varios registros. sao dois tipos: (eu)(/eu) e (vc)(/vc). esses (eu)(/eu) e (vc)(/vc) se repetem varias vezes na string (não existe uma ordem certa).

vou tentar explicar melhor com exemplo. supondo que na string registro q venha do mysql tenha:

(eu)
(hora)12:51(/hora)
(log)entrou no sistema(/log)
(/eu)
(vc)
(hora)12:52(/hora)
(log)entrou no sistema(/log)
(/vc)
(vc)
(hora)12:53(/hora)
(log)entrou no sistema(/log)
(/vc)
(eu)
(hora)12:54(/hora)
(log)entrou no sistema(/log)
(/eu)

preciso pegar o conteudo de registro e organizar da seguinte forma no php/html:

<div class="classe-para-eu">
<p>*conteudo do (log) de eu*</p>
<p>*conteudo de (hora) de eu*</p>
</div>
<div class="classe-para-vc">
<p>*conteudo do (log) de vc*</p>
<p>*conteudo de (hora) de vc*</p>
</div>
<div class="classe-para-vc">
<p>*conteudo do (log) de vc*</p>
<p>*conteudo de (hora) de vc*</p>
</div>
<div class="classe-para-eu">
<p>*conteudo do (log) de eu*</p>
<p>*conteudo de (hora) de eu*</p>
</div>

preciso de uma função que imprima como no exemplo acima como se estivessemos falando de tags.

 

tentei de muitas formas e nao consigo. estou a semanas tentando. me ajudem!!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Modo adequado: expressão regular;

Modo gambiarra: explode.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ESerra

obrigado por responder

 

como eu faria isso pela expressão regular? pode dar o exemplo do codigo de acordo com o exemplo q citei, pra q eu possa entender?

pq eu ja tentei de todos os jeitos q eu consegui pensar e nao consegui

 

 

muito obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao foi falta de tentativa. to a semana nisso. e tambem tentei nessa função, mas devo ter feito algo errado.

 

o q eu to pedindo é uma exemplificação, nao q faça meu trabalho.

 

se nao for com um exemplo, nao sei como continuar.

 

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não intendi! e se tiver mais registros? nao vai exibir eu, voce, voce, eu....

não pode exibir todos os "eu" e depois todos os 'voce' ? ou então exibir na ordem que está no banco de dados:?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele tem q exibir todos os registros que existirem, e na ordem do banco de dados. como se fosse uma conversa, tudo tem q ser na ordem. a diferença é q no meu caso são "logs".

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso ja é feito. só q eu não posso separar essa string em varios campos no mysql, tem q ser em um so mesmo, e apenas um so registro no mysql. pois cada registro no mysql se refere a uma categoria/periodo.

tem q ser assim mesmo, do jeito q to apresentando.

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Modo gambi easy extreme HU3

<?php
   $cont = 1;
   $sql = mysql_query(SELECT campos FROM tabela);
   while($linha = mysql_fetch_array($sql)){
      if($cont == 1){$class = 'classe-para-mim';}
      if($cont == 2){$class = 'classe-para-voce'; $cont = 0;}
      echo "<div class='".$class."'>CONTEUDOS</div>";
      $cont++; 
   }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas como ele faria a diferenciação de um pra outro tiago?

eu imaginei soluções do tipo explode, afinal ele tem q pegar o conteudo q ta dentro dessas "tags" e organizar de acordo, como no exemplo q citei na pergunta.

 

obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o conteúdo todo da DIV corresponde à uma linha do BD, a variável CONT será responsável pela mudança da classe cada vez que o while montar um registro.

 

Quando o cont for igual a 1, ele terá o valor da classe x, quando o cont for 2, ele terá o valor da classe y, e após ele exibir a classe y eu reseto ele para que comece do x novamente na próxima montagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

(eu)

(hora)12:51(/hora)

(log)entrou no sistema(/log)

(/eu)

(você)

(hora)12:52(/hora)

(log)entrou no sistema(/log)

(/você)

(você)

(hora)12:53(/hora)

(log)entrou no sistema(/log)

(/você)

(eu)

(hora)12:54(/hora)

(log)entrou no sistema(/log)

(/eu)

 

 

Se o conteúdo estiver todo em uma única string pode ser feito usando str_replace mais seria um modo gambiarra

$str = (text)12:51(/text);
$str = str_replace('(text)','<div class="text">',$str);
$str = str_replace('(/text)','</div>',$str);
echo $str;

http://php.net/manual/en/function.str-replace.php

 

Te aconselho a estudar o conteúdo que o ESerra passou sobre expressões regulares pois é possível ser feito o mesmo processo com preg_replace

 

http://php.net/manual/en/function.preg-replace.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

gente o str_replace só parece fazer a troca no primeiro registro (na primeira vez q aparece (eu) ). preciso de alguma outra função pra usar junto q faça um loop para fazer a troca em todos os registros.

me ajudem! obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que está utilizando a mesma lógica do XML, você pode salvar em no formato XML (só trocar ( por <) e no PHP obter a string, converter em objeto do tipo SimpleXMLElement e depois transforma-lo em um array.

Veja:

<?php
$string = <<<XML
<?xml version='1.0'?> 
<logs>
	<log>
		<eu></eu>
		<hora>21:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>
		<voce></voce>
		<hora>22:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>
	<eu></eu>
		<hora>23:10</hora>
		<log>entrou no sistema</log>
	</log>
	<log>	
	<eu></eu>
		<hora>23:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>	
	<voce></voce>
		<hora>09:15</hora>
		<log>entrou no sistema</log>
	</log>
</logs>
XML;

$xml = simplexml_load_string($string);

$xml = get_object_vars($xml);
$logs = $xml['log'];

foreach ($logs as $log)
{
	if (array_key_exists('eu', $log))
	{
		$eu = $log['eu'];
		echo "(eu)<br>";
			echo "(hora)".$eu['hora']."(/hora)<br>";
			echo "(log)".$eu['log']."(/log)<br>";
		echo "(/eu)<br>";
	}
	else
	{
		$eu = $log['voce'];
		echo "(voce)<br>";
			echo "(hora)".$eu['hora']."(/hora)<br>";
			echo "(log)".$eu['log']."(/log)<br>";
		echo "(/voce)<br>";		
	}
}

?>

Adicionei entre as tags <log></log> só pra ficar tudo em um único array e ordenado pela ordem que foi salvo.

Se você salvar assim:

<eu>
<hora>09:10</hora>
<log>entrou no sistema</log>
</eu>

<voce>
<hora>09:15</hora>
<log>entrou no sistema</log>
</voce>

Quando for converter em objeto do tipo SimpleXMLElement você terá dois arrays internos, "eu" com todos os valores de todas as tags "eu" e "voce" com todos os valores de todas as tags "voce" e desordenado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cl4ng,

 

fiz alguns testes. nao sei pq mas o foreach nao funcionou. ele nao imprimia nada. entao dei print_r em $logs e olha o resultado:

Array
(
    [0] => SimpleXMLElement Object
        (
            [eu] => SimpleXMLElement Object
                (
                    [hora] => 11:44
                    [log] => informações do log
                )

        )

    [1] => SimpleXMLElement Object
        (
            [voce] => SimpleXMLElement Object
                (
                    [hora] => 11:45
                    [log] => informações do log
                )

        )

    [2] => SimpleXMLElement Object
        (
            [voce] => SimpleXMLElement Object
                (
                    [hora] => 11:46
                    [log] => informações do log
                )

        )

    [3] => SimpleXMLElement Object
        (
            [eu] => SimpleXMLElement Object
                (
                    [hora] => 11:47
                    [log] => informações do log
                )

        )

)

saiu na ordem do registro mesmo. ate essa parte ta tudo ok, mas la no foreach nao funciona de maneira alguma.

 

o q faço?

 

obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah! Uma correção: Converter $log também em array.

foreach ($logs as $log)
{
	$log = get_object_vars($log);

	if (array_key_exists('eu', $log))
	{
		echo "(eu)<br>";
			echo "(hora)".$log['hora']."(/hora)<br>";
			echo "(log)".$log['log']."(/log)<br>";
		echo "(/eu)<br>";
	}
	else
	{
		echo "(voce)<br>";
			echo "(hora)".$log['hora']."(/hora)<br>";
			echo "(log)".$log['log']."(/log)<br>";
		echo "(/voce)<br>";		
	}
}

E não precisa de obter $eu = $log['voce'];.
É que eu postei o código de quando eu tinha feito sem as tags <log></log>, por isso estava obtendo eu/voce de $log.

Se você não quiser fazer a conversão (
$log = get_object_vars($log);) para array, você pode acessar os valores da seguinte forma:

echo $log->hora;
echo $log->log;

Compartilhar este post


Link para o post
Compartilhar em outros sites

oii, testei hoje.

 

isso q vc falou funcionou.

 

mas me deparei com outro problema: quando ha quebra de linha no $log['log'] ele nao exibe o xml. como me salvo desse problema?

 

 

obrigado!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que o HTML não passa de um XML... Então se tiver tags HTML a função simplexml_load_string vai tentar interpreta-los e como não consegue é retornado um aviso.

Para evitar esse problema você precisa converte todos os caracteres aplicáveis (Tags html) em entidades html antes de salva-los no banco de dados.

<?php

$log = "Linha 1<br>Linha 2<br>Linha 3";
//Aqui estou convertendo as tags para entidades
//Isso tem que ser feito antes de salvar os dados no banco de dados
//Ou seja, ao montar o xml que será salvo.
$log = htmlentities($log);

$string = "<?xml version='1.0'?> 
<logs>
	<log>
		<eu></eu>
		<hora>21:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>
		<voce></voce>
		<hora>22:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>
	<eu></eu>
		<hora>23:10</hora>
		<log>entrou no sistema</log>
	</log>
	<log>	
	<eu></eu>
		<hora>23:50</hora>
		<log>entrou no sistema</log>
	</log>
	<log>	
	<voce></voce>
		<hora>09:15</hora>
		<log>".$log."</log>
	</log>
</logs>
";

$xml = simplexml_load_string($string);
$xml = get_object_vars($xml);
$logs = $xml['log'];

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.