Ir para conteúdo

POWERED BY:

Arquivado

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

Rodrigo_laguna

[Resolvido] Atualizar cliques usando PDO

Recommended Posts

Olá, estou com problema na hora de atualizar os cliques na notícia lida, da forma como está meu código ela não altera na hora, somente depois de outra visualização ou F5, dae conta duas vezes.

<?php
$id = (int)$_GET['id'];
$sql_select = 'SELECT * FROM tb_materias WHERE idMateria = '. $id;

try{
$query_select = $conecta->prepare($sql_select);
   $query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

$count = $query_select->rowCount(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
  echo 'Erro ao selecionar '.$error_select->getMessage();
}

//if($count == '0'){
 // echo 'Nada encontrado'; 	
//}else{

foreach($resultado_query as $res){
	$idMateria	= $res['idMateria'];
	$titulo1 	= $res['titulo1'];
	$cliquesMateria = $res['cliquesMateria'];
	$texto = $res['texto'];
	}
?>
<table width="50%">
             <tr>
               <td width="100%"> </td>
             </tr>
             <tr>
               <td height="20" align="left" class="titulo_cabecalho"> <?php echo $titulo1; ?> - </td>
             </tr>
             <tr>
               <td height="20" align="center"> </td>
             </tr>

             <tr>
               <td><?php echo $texto; ?></td>
             </tr>
             <tr>
               <td align="center"> </td>
             </tr>
<?php
////////////////////////////////////ATUALIZA CLIQUES //////////////////////////////
$id = (int)$_GET['id'];
$sql_select = "UPDATE tb_teste SET cliquesMateria = cliquesMateria + 1 WHERE idMateria = $id";

try{
$query_select = $conecta->prepare($sql_select);
   $query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

$count = $query_select->rowCount(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
  echo 'Erro ao selecionar '.$error_select->getMessage();
}

//if($count == '0'){
 // echo 'Nada encontrado'; 	
//}else{

foreach($resultado_query as $res){
	$idMateria = $res['idMateria'];
	$titulo1 = $res['titulo1'];
	$cliquesMateria = $res['cliquesMateria'];
	$corpoMateria = $res['corpoMateria'];
}		
?>

             <tr>
               <td align="left">CLIQUES: <?php echo $cliquesMateria; ?> </td>
             </tr>
           </table>

O que necessito é que quando o ID for chamado para mostrar a materia ele automaticamente já me mostre o número da visualização e não da forma como está, onde devo colocar o sql de UPDATE?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi o que você quer fazer, cara... Você quer atualizar assim que o cara clica sem recarregar a página?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu recomendo que você dê uma estudada no manual do PHP sobre como a biblioteca PDO funciona, pois você está utilizando de maneira completamente equivocada.

 

Primeiro você está utilizando os métodos prepare e execute sendo que o parâmetro $id você já está colocando direto no SQL, desta forma apenas o método query é necessário, pois você não está passando nenhum parâmetro no método execute.

 

Também você está usando a função foreach sendo que a sua consulta deve retornar apenas 1 único registro, ou seja, o registro referente ao ID que você forneceu.

 

E ainda você está realizando duas vezes a mesma consulta sendo que o seu objetivo é apenas atualizar o número de visualizações da notícia.

 

Dá uma boa estudada lá :seta: http://br.php.net/ma...BR/book.pdo.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça o UPDATE antes de tudo e depois faça apenas UM SELECT.

 

E quando postar código indente de maneira organizada pra facilitar a compreensão do código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que vi você já tem outro tópico criado sobre o mesmo assunto.

http://forum.imasters.com.br/topic/439154-pdo-buscar-noticia-pelo-id-e-atualizar-visualizacoes/

Leozitho, creio que não são iguais as dúvidas, o outro tópico é relacionado a busca, e também um erro que o mesmo autor foi deparado ao rodar o script.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ver como da pra fazer...

 

<?php
$id = (int)$_GET['id'];
$sql_select = 'SELECT * FROM tb_materias WHERE idMateria = ?';
$sql_update = 'UPDATE tb_materias SET cliquesMateria = cliquesMateria + 1 WHERE idMateria = ?';

try{
 $query_update = $conecta->prepare($sql_update);
 $query_select = $conecta->prepare($sql_select);

 $query_update->execute(array($id));
 $query_select->execute(array($id));

 $resultado_query = $query_select->fetch(PDO::FETCH_ASSOC);
 $count = $query_select->rowCount();
} catch (PDOexception $error_select){
 echo 'Erro ao selecionar '.$error_select->getMessage();
}
$idMateria      = $resultado_query['idMateria'];
$titulo1        = $resultado_query['titulo1'];
$cliquesMateria = $resultado_query['cliquesMateria'];
$texto          = $resultado_query['texto'];
?>
<table width="50%">
 <tr>
   <td width="100%"> </td>
 </tr>
 <tr>
   <td height="20" align="left" class="titulo_cabecalho"> <?php echo $titulo1; ?> - </td>
 </tr>
 <tr>
   <td height="20" align="center"> </td>
 </tr>
 <tr>
   <td><?php echo $texto; ?></td>
 </tr>
 <tr>
   <td align="center"> </td>
 </tr>
 <tr>
   <td align="left">CLIQUES: <?php echo $cliquesMateria; ?> </td>
 </tr>
</table>

 

Veja se consegue rodar com isso ai.

 

Observações pessoais:

- Espero que essa tabela não seja o seu 'Layout'.

- Sempre utilize placeholder(as interrogações) nas consultas, para evitar SQL Injection.

- Veja a diferença de leitura entre um código mal indentado e um devidamente indentado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Artur dessa maneira deu certinho sim, só gostaria de fazer uma pergunta, usar o select dessa maneira para buscar uma nota pelo seu ID é errado ou está certo também?, pois você disse que é melhor usar a '?' devido ao SQL Injection, da maneira abaixo existe o risco?

$id = (int)$_GET['id'];
$sql_select = 'SELECT * FROM tb_materias WHERE idMateria = '. $id;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguindo o exemplo acima que agora está correto estou tentando listar dentro deuma tabela simples uma noticia de cada menu, por exemplo em minha TB_MENU tenho 1 - Brasil e 2 - Colombia, da forma como está me retorna o erro

 

"Erro ao selecionar SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute."

<?php
$sql_select = 'SELECT * FROM tb_materias';
$sql_online = 'SELECT * FROM tb_materias WHERE status = "on" AND idMenuMat = 1 ORDER BY idMateria DESC LIMIT 1';
$sql_extra = 'SELECT * FROM tb_materias WHERE status = "on" AND idMenuMat = 2 ORDER BY idMateria DESC LIMIT 1';

try{
$query_select = $conecta->prepare($sql_select);
$query_brasil = $conecta->prepare($sql_brasil);
$query_colombia  = $conecta->prepare($sql_colombia);

$query_select->execute(array($id));
$query_brasil->execute(array($id));
	$query_colombia->execute(array($id));

$resultado_query = $query_select->fetchALL(PDO::FETCH_ASSOC);
 	$count = $query_select->rowCount();	

} catch (PDOexception $error_select){
 		echo 'Erro ao selecionar '.$error_select->getMessage();
	}
$idMateria      = $resultado_query['idMateria'];
$titulo1        = $resultado_query['titulo1'];
$status		= $resultado_query['status'];
$cliquesMateria = $resultado_query['cliquesMateria'];
$idMenuMat 	= $resultado_query['idMenuMat'];
$texto 	= $resultado_query['texto'];		
?>
<table width="50%" align="center">
 <tr>
   <td width="100%">Categoria - Brasil </td>
   <td width="100%">Categoria - Colombia </td>
 </tr>
 <tr>
   <td height="20" align="left" class="titulo_cabecalho">Título -  <?php echo $titulo1; ?></td>
   <td align="left" class="titulo_cabecalho">Título - <?php echo $titulo1; ?></td>
 </tr>
 <tr>
   <td height="20" align="center"> </td>
   <td align="center"> </td>
 </tr>
 <tr>
   <td>Conteúdo - <?php echo $texto; ?></td>
   <td>Conteúdo - <?php echo $texto; ?></td>
 </tr>
 <tr>
   <td align="center"> </td>
   <td align="center"> </td>
 </tr>
 <tr>
   <td align="left">CLIQUES: <?php echo $cliquesMateria; ?> </td>
   <td align="left">CLIQUES: <?php echo $cliquesMateria; ?> </td>
 </tr>
</table>

Compartilhar este post


Link para o post
Compartilhar em outros sites

só está aceitando números inteiros.

Bem lembrado Leozitho, não prestei atenção nesse detalhe ^_^

 

Rodrigo_laguna:

       $query_select = $conecta->prepare($sql_select);
       $query_brasil = $conecta->prepare($sql_brasil);
       $query_colombia  = $conecta->prepare($sql_colombia);
       $query_select->execute(array($id));
       $query_brasil->execute(array($id));
       $query_colombia->execute(array($id))    

Isso é errado, você não faz dessa maneira, faça assim:

       $query_select = $conecta->prepare($sql_select);
       $query_select->execute(array($id));
       $query_brasil = $conecta->prepare($sql_brasil);
       $query_brasil->execute(array($id));
       $query_colombia  = $conecta->prepare($sql_colombia);
       $query_colombia->execute(array($id));   

 

Caso o erro continue, dê uma procurada sobre o closeCursor.

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Andrey beleza? Segui tua dica e cheguei a essa conclusão, dessa maneira está mostrando como eu queria, só queria saber se dessa forma está correto ou se é errado fazer deste modo, porque tive que usar 1 foreach para cada categoria ser listada, postei o código inteiro abaixo pra ficar melhor o entendimento de que estou falando beleza?

 

<?php
$sql_select = 'SELECT * FROM tb_materias';
$sql_brasil = 'SELECT * FROM tb_materias WHERE status = "on" AND idMenuMat = 3 ORDER BY idMateria DESC LIMIT 1';
$sql_colombia  = 'SELECT * FROM tb_materias WHERE status = "on" AND idMenuMat = 4 ORDER BY idMateria DESC LIMIT 1';

try{
	$query_select = $conecta->prepare($sql_select);
       $query_select->execute(array($id));
	$resultado_query = $query_select->fetchALL(PDO::FETCH_ASSOC);
       $count = $query_select->rowCount();

       $query_brasil = $conecta->prepare($sql_brasil);
       $query_brasil->execute(array($id));
	$resultado_brasil = $query_brasil->fetchALL(PDO::FETCH_ASSOC);

       $query_colombia  = $conecta->prepare($sql_colombia);
       $query_colombia->execute(array($id));		
	$resultado_colombia = $query_colombia->fetchALL(PDO::FETCH_ASSOC);

       } catch (PDOexception $error_select){
               //echo 'Erro ao selecionar '.$error_select->getMessage();
               }

	foreach($resultado_brasil as $brasil){
		$idMateria = $brasil['idMateria'];
		$titulo1 = $brasil['titulo1'];
		$titulo2 = $brasil['titulo2'];
		$corpoMateria = $brasil['corpoMateria'];
	}

	foreach($resultado_colombia as $colombia){
		$idMateria = $colombia['idMateria'];
		$titulo1 = $colombia['titulo1'];
		$titulo2 = $colombia['titulo2'];
		$corpoMateria = $colombia['corpoMateria'];
	}

?>
<table width="90%" align="center">
 <tr>
   <td width="40%" align="center"><strong>Categoria - Brasil </strong></td>
   <td width="60%" align="center"><strong>Categoria - Colombia </strong></td>
 </tr>
 <tr>
   <td height="20" align="center" class="titulo_cabecalho">ID - <?php echo $brasil['idMateria']; ?></td>
   <td align="center" class="titulo_cabecalho">ID - <?php echo $colombia['idMateria']; ?></td>
 </tr>
 <tr>
   <td height="20" align="left" class="titulo_cabecalho">Título 1-  <?php echo $brasil['titulo1']; ?></td>
   <td align="left" class="titulo_cabecalho">Título 1 - <?php echo $a['titulo1']; ?></td>
 </tr>
 <tr>
   <td height="20">Titulo 2 - <?php echo $brasil['titulo2']; ?> </td>
   <td>Título 2 - <?php echo $colombia['titulo2']; ?></td>
 </tr>
 <tr>
   <td>Conteúdo - </td>
   <td>Conteúdo - </td>
 </tr>
 <tr>
   <td align="center"> </td>
   <td align="center"> </td>
 </tr>
 <tr>
   <td align="left">CLIQUES: <?php echo $brasil['cliquesMateria']; ?> </td>
   <td align="left">CLIQUES: <?php echo $colombia['cliquesMateria']; ?></td>
 </tr>
</table>

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.