Ir para conteúdo

POWERED BY:

Arquivado

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

Gabriela Meurer

Função em PHP

Recommended Posts

Olá,

 

Preciso fazer uma função em php que vá acompanhando a acumulação de pontos, para que quando chegar a um certo valor determinado, ela realize uma ação.

Seria mais ou menos o seguinte :

- Cada vez que uma quantidade postada alcançar a quantidade já estabelecida, a função dá um return.

Se a quantidade estabelecida for 5, a quantidade postada de 5 em 5 deve retornar.

 

E não sei se há alguma forma de fazer isso. Alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi bem, mas para se criar uma rotina você pode usar o Event do mysql ou Cronjobs.

 

De mais detalhes! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

se os dados provierem de requisições distintas, uma opção é armazenar em cookies, session, banco de dados, etc..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gabriela, td bem?!

 

Pelo que entendi, você quer uma função que a cada 5 pontos faça alguma ação e monitorar se uma pessoa acumulou 5 pontos, certo?

 

Também, e que seja mostrado de acordo com a o numero solicitado certo?

 

Ok temos DUAS COISAS a serem feitas: uma função que monitore e calcule se uma pessoa está acumulando 5 pontos; outra será mostrar, espécie de paginação, resultados em um intervalo solicitado pelo usuário.

 

Então vamos às codificações

 

primeira missão: monitorar se uma pessoa conseguiu cinco pontos, digo, contar a pontuação de uma pessoa em um intervalo de cinco em cinco pontos.

 

/* vamos considerar, para efeitos didáticos, que foi feita a devida conexão com o banco de dados e, também, a tabela que conterá os pontos chamar-se-a "ptos_usr".

A tabela já citada, conterá, apenas para efeitos didáticos, as seguintes colunas: cod_usr, qtde_pto

*/

function processa_pontos($id_usr){
  //seleção da tabela ptos_usr
  $sel_pto = "select * from ptos_usr where cod_usr = ".$id_usr;
  $exec = mysql_query($sel_pto);
  //agora contar e, de acordo com a condição estabelecida, executar algo
  if(mysql_num_rows($exec) >= 5 ){
    //aqui você escolhe a ação a ser feita
  }
}

 

 

Agora vamos para a paginação

 

/*
como pedido, paginar os resultados de acordo com a solicitação do usuário
*/

function paginar($pags, $id_usr, $comeco){
  $sel_pags = "select count(qtde_pto) from ptos_usr where cod_usr = ".$id_usr;
  $exec_pags = mysql_query($sel_pags);
  $num_pags = ceil($exec_pags / $pags);
  /* 
    feita a contagem e divisão, vamos mostrar
    primeiro, iremos fazer uma query que mostre os resultados listados no intervalo solicitado pelo usuário 
  */
  if (!$comeco){
    $comeco = 0;
  }
  $sel_resultados = "select * from ptos_usr where cod_usr = '".$id_usr."' limit (".$comeco.",".$pags.")";
  $exec_resultados = mysql_query($sel_resultados);
  //agora mostrar
  for($i=0;$i<mysql_num_rows($exec_resultados);$i++){
    $linha_res = mysql_fetch_array($exec_resultados);
    echo "usuário: ".$linha_res['cod_usr']."ptos: ".$linha['qtde_pto']."<br>";
  }
  //agora mostrar a paginação
  for($j=0;$j<$num_pags;$j++){
    echo "<a href='#'>".$j."</a>";
  }
}

Ok, vou dar uma explanada neste trecho.

 

As variáveis (parametros) $pags, $id_usr, $comeco correspondem, respectivamente, a:

 

número de páginas que o usuário necessecita;

identificação numérica do usr;

o número(índice inicial) para começar a varredura na query;

 

Por enquanto é só isso.

 

Eu tenho certeza que a solução que eu postei é bem distante de sua necessidade, logo é interessante que você nos detalhe aqui nesse fórum sua demanda para que nós, usuários, a resolva com maior precisão.

 

Espero ter ajudado Gabriela, caso tenha dúvidas (sim vc terá), por favor, dê um grito. Att :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, é o seguinte..

 

Tenho a tabela Produto no meu BD que contém: (id_produto, nome_produto, quantidade_estabelecida, pontuacao).

E tenho outra tabela chamada UsuarioProduto que contém : (id_usuario, id_produto, quantidade)

 

Toda vez que o Usuário recebe uma nova quantidade de determinado produto, isso é cadastrado na tabela UsuarioProduto.

Exemplo: Usuario=123 recebe quantidade=2 de produto=caixa longa vida.

Em outra ação, o Usuario=123 recebe quantidade=3 de produto=caixa longa vida.

Como o produto e o usuário são os mesmos, na segunda ação é feito somente um UPDATE na coluna referente na tabela UsuarioProduto. Assim vai sendo acumulada essa quantidade desse produto, por usuário.

 

Na tabela Produto, contém que a "caixa longa vida" vale 3 pontos, a cada 5 unidades.

 

Ou seja, o que eu preciso é que eu libere esses 3 pontos para o usuário somente quando ele acumular as 5 unidades.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma mais eficiente de se fazer estes cálculos é utilizar Functions ou Procedures do SGDB

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriela,

 

Tudo bem?

 

Bom se eu entendi direito, para o caso do incremento do produto na tabela do usuário você pode fazer o update da seguinte forma:

 

$sql = "UPDATE tabela_usuario SET quantidade = quantidade + ". $qtd_vinda_do_php;  // Esta seria a variável no php que conteria a qtd recebida
$sql .= " WHERE id_user=".$id_user." AND id_produto=" . $id_produto; // Aqui é a condição para a atualização do campo

 

Com relação a pontuação, caso você não queira fazer uma rotina muito complexa no banco de dados, você pode fazer uma atualização constante no php utilizando a lógica a seguir:

 

1º - Obter e dividir a quantidade de produtos do usuário por 5, e guardar somente o inteiro da divisão;

2º - Multiplicar o resultado acima pelos pontos que o produto vale (que provavelmente virão de cada produto no banco de dados;

3º - Fazer a atualização no banco;

 

Um exemplo de código seria:

 

$qtdProdutos = 12; // Esta informação virá do banco de dados
	$qtdParaPontos = 5; 
	$pontosParaProduto = 3; // Esta informação também virá do banco creio eu
	
	
	// Aqui fazemos o cast do resultado da divisão para inteiro, descartando assim os decimais 
	/*
	 * Por exemplo: 
	 * 5/5 = 1
	 * 10/5 = 2
	 * 12/5 = 2 (elimina-se o  ,4)
	 * 15/5 = 3
	 */
	$resultado = (int)($qtdProdutos / $qtdParaPontos);
	
	// Aqui será feito o recalculo sempre, porém enquanto a divisão acima não retornar um número inteiro teremos o mesmo valor
	$qtdPontosUsuario = $resultado * $pontosParaProduto; 

Depois do código acima seria basicamente atualizar na tabela correspondente a pontuação.

 

 

Qualquer dúvida é só avisar,

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roberto Fagundes pensando pelo lado do relatório você tem razão realmente fica complicado para ter o relatório detalhado.

 

@Gabriela Meurer Talvez seja interessante você fazer a inserção das entradas na tabela de usuários e utilizar a query abaixo para esta variável da lógica que sugeri:

$qtdProdutos = 12; // Esta informação virá do banco de dados (Utilizar o campo retornado pela função SUM() do mysql)

E a query ficaria assim:

SELECT SUM(quantidade) AS totalProdutos FROM tabela_de_usuario WHERE id_user=".$id_user." AND id_produto=" . $id_produto;;

Bom... a função SUM soma todos os registros encontrados no campo selecionado que obedeçam ao WHERE

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • RodriAndreotti,

O código que você apresentou anteriormente deu certo pra mim, porém ele está fazendo um cálculo equivalente a quantidade que o usuário informou.

 

No sistema, a cada 5 unidades, o cliente ganha 3 pontos.

 

Eu só quero que o cliente ganhe três pontos, quando o usuário conseguir completar o valor de 5 quantidade.

Esse valor vai sendo armazenado e acumulado em uma coluna chamada (quantidadeUsuarioProduto) da tabela UsuarioProduto.

Vamos supor que na coluna quantidadeUsuarioProduto tenha 10 unidades.

Aí o usuário vai lá e cadastra mais 5 unidades. Ele teria que ganhar mais 3 pontos, pois ele já teria ganhado os 6 pontos respectivos das 10 unidades anteriormente.

E se o usuário for cadastrar mais 2 unidades, ele não ganharia nenhum ponto, só seria armazenado essas 2 unidades na coluna quantidadeUsuarioProduto.

E quando posteriormente ele cadastrasse mais 3 unidades, aí ele teria que ganhar mais 3 pontos.

 

Eu adaptei o código que você me passou para o meu caso:

 

$resultado = (int)($quantidadePostada / $quantidadeEstabelecida);
$pontuacaoUsuario = $resultado * $pontuacao;
Mas ele está fazendo equivalente a quantidade que o usuário levou, e não de 5 em 5 unidades.

 

Na verdade eu me equivoquei.

Tá sim fazendo de 5 em 5 unidades.

 

O problema é que se o usuário levar 2 unidades, ele não vai ganhar pontos, mas isso teria que ser armazenado (já está sendo) e somado com a proxima unidade que ele levar, para formar 5 unidades, e aí ganhar a pontuação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops, já tinha respondido... mas vamos lá editar a resposta.

 

De qual forma você está armazenando? você está fazendo o update da forma que eu coloquei no primeiro post, ou para cada vez que o usuário leva o produto é inserido um novo registro?

 

No caso da segunda opção, tenta o código que sugeri no meu segundo post.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites
     $consultap = mysql_query("Select * FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");
 
      if (mysql_num_rows($consultap) == 1) {
           
          $consulta7=("UPDATE Usuario_Produto SET Usuario_Produto.quantidadeU_produto 
          = Usuario_Produto.quantidadeU_produto + '".$_POST['quantidade']."' WHERE id_usuario = '".$_POST['id']."' and
          id_produto = '".$_POST['idProduto']."'  ");
          $resultado7 = mysql_query($consulta7, $conexao);
 
      }
				//AQUI FUNÇÃO QUE VERIFICA CONFORME O ID_PRODUTO, A QUANTIDADE_ESTABELECIDA FORMAR
				//ADICIONA A PONTUAÇÃO NA TABELA USUARIO - pontuacao 	
      				
      } else {
          $consulta8 = ("insert into Usuario_Produto (id_usuario, id_produto, quantidadeU_produto)
          values ( '".$_POST['id']."',
          '".$_POST['idProduto']."',
          '".$_POST['quantidade']."')");
          $resultado8 = mysql_query($consulta8, $conexao);
    $id = $_POST['id'];

           
      				//AQUI FUNÇÃO QUE VERIFICA CONFORME O ID_PRODUTO, A QUANTIDADE_ESTABELECIDA FORMAR
      				//ADICIONA A PONTUAÇÃO NA TABELA USUARIO - pontuacao 	
      }

 

O código que está armazenando essas quantidades seria esse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal...

Assim fica melhor, rs

 

 

     $consultap = mysql_query("Select * FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");
 
      if (mysql_num_rows($consultap) == 1) {
           
          $consulta7=("UPDATE Usuario_Produto SET Usuario_Produto.quantidadeU_produto 
          = Usuario_Produto.quantidadeU_produto + '".$_POST['quantidade']."' WHERE id_usuario = '".$_POST['id']."' and
          id_produto = '".$_POST['idProduto']."'  ");
          $resultado7 = mysql_query($consulta7, $conexao);
 
      }
				//AQUI FUNÇÃO QUE VERIFICA CONFORME O ID_PRODUTO, A QUANTIDADE_ESTABELECIDA FORMAR
				//ADICIONA A PONTUAÇÃO NA TABELA USUARIO - pontuacao 	
      				
      } else {
          $consulta8 = ("insert into Usuario_Produto (id_usuario, id_produto, quantidadeU_produto)
          values ( '".$_POST['id']."',
          '".$_POST['idProduto']."',
          '".$_POST['quantidade']."')");
          $resultado8 = mysql_query($consulta8, $conexao);
    $id = $_POST['id'];

           
      				//AQUI FUNÇÃO QUE VERIFICA CONFORME O ID_PRODUTO, A QUANTIDADE_ESTABELECIDA FORMAR
      				//ADICIONA A PONTUAÇÃO NA TABELA USUARIO - pontuacao 	
      }

 $queryQtd= mysql_query("Select quantidadeU_produto FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");

$qtd = mysql_fetch_assoc($queryQtd);

$qtdBanco = $qtd['quantidadeUsuarioProduto'];

// Aqui vem a rotina que você já adaptou 

 

O código que está armazenando essas quantidades seria esse.

 

Tenta testar com esse código que inseri e veja se funciona... rs

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não funciona, não faz o UPDATE da pontuação para o usuário. Abaixo o código..

 

       $consultap = mysql_query("Select * FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");
 
      if (mysql_num_rows($consultap) == 1) {
           
          $consulta7=("UPDATE Usuario_Produto SET Usuario_Produto.quantidadeU_produto 
          = Usuario_Produto.quantidadeU_produto + '".$_POST['quantidade']."' WHERE id_usuario = '".$_POST['id']."' and
          id_produto = '".$_POST['idProduto']."'  ");
          $resultado7 = mysql_query($consulta7, $conexao);
 
      } 
              
       else {
          $consulta8 = ("insert into Usuario_Produto (id_usuario, id_produto, quantidadeU_produto)
          values ( '".$_POST['id']."',
          '".$_POST['idProduto']."',
          '".$_POST['quantidade']."')");
          $resultado8 = mysql_query($consulta8, $conexao);
    $id = $_POST['id'];

           
      }

$queryQtd= mysql_query("Select quantidadeU_produto FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");

$qtd = mysql_fetch_assoc($queryQtd);

$qtdBanco = $qtd['quantidadeU_produto'];

// Aqui vem a rotina que você já adaptou 

$consultaqe = "SELECT quantidade_ocorrer FROM Produto WHERE id_produto = '$id_produto'";
$quantidadeEstabelecida = mysql_query ($consultaqe, $conexao) ;

$consultapon = "SELECT pontuacao FROM Produto WHERE id_produto = '$id_produto'";
$pontuacaoP = mysql_query ($consultapon, $conexao) ;

$resultado = (int)($qtdBanco / $quantidadeEstabelecida);
  
if ($resultado) {
      $quantidade = $_POST['quantidade'];
      $pontuacaoUsuario = $quantidade * $pontuacaoP; 
      $consulta2=("UPDATE Usuario SET pontuacao = pontuacao + '".$pontuacaoUsuario."'' WHERE Usuario.id_usuario = '".$_POST['id']."'");
      $resultado2 = mysql_query($consulta2, $conexao);  
}

Talvez o problema esteja nesse if ($resultado) {}

Não sei se essa é a maneira correta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, bom vamos lá, acho que encontrei um detalhe, rs...

 

Observe a linha em negrito, nela você está chamando somente a query, mas não pegou o resultado

Ainda não funciona, não faz o UPDATE da pontuação para o usuário. Abaixo o código..

 

       $consultap = mysql_query("Select * FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");
 
      if (mysql_num_rows($consultap) == 1) {
           
          $consulta7=("UPDATE Usuario_Produto SET Usuario_Produto.quantidadeU_produto 
          = Usuario_Produto.quantidadeU_produto + '".$_POST['quantidade']."' WHERE id_usuario = '".$_POST['id']."' and
          id_produto = '".$_POST['idProduto']."'  ");
          $resultado7 = mysql_query($consulta7, $conexao);
 
      } 
              
       else {
          $consulta8 = ("insert into Usuario_Produto (id_usuario, id_produto, quantidadeU_produto)
          values ( '".$_POST['id']."',
          '".$_POST['idProduto']."',
          '".$_POST['quantidade']."')");
          $resultado8 = mysql_query($consulta8, $conexao);
    $id = $_POST['id'];

           
      }

$queryQtd= mysql_query("Select quantidadeU_produto FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");

$qtd = mysql_fetch_assoc($queryQtd);

$qtdBanco = $qtd['quantidadeU_produto'];

// Aqui vem a rotina que você já adaptou 

$consultaqe = "SELECT quantidade_ocorrer FROM Produto WHERE id_produto = '$id_produto'";
$quantidadeEstabelecida = mysql_query ($consultaqe, $conexao) ;

$consultapon = "SELECT pontuacao FROM Produto WHERE id_produto = '$id_produto'";
$pontuacaoP = mysql_query ($consultapon, $conexao) ;

$resultado = (int)($qtdBanco / $quantidadeEstabelecida);
  
if ($resultado) {
      $quantidade = $_POST['quantidade'];
      $pontuacaoUsuario = $quantidade * $pontuacaoP; 
      $consulta2=("UPDATE Usuario SET pontuacao = pontuacao + '".$pontuacaoUsuario."'' WHERE Usuario.id_usuario = '".$_POST['id']."'");
      $resultado2 = mysql_query($consulta2, $conexao);  
}

Talvez o problema esteja nesse if ($resultado) {}

Não sei se essa é a maneira correta

 

No caso desta linha, faltou fazer o fetch dela.

 

$pontuacaoP = mysql_fetch_assoc(mysql_query ($consultapon, $conexao) ); // e como ela retorna um array()

$pontuacaoP = $pontuacaoP['pontuacao']; a gente sobrescreve a variável com o valor do campo

Tente incluir o código acima no local que destaquei em negrito.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está dando o seguinte erro:

Warning: Division by zero in /home/ecocidadaobc/www/sistema/respostaResgate.php on line 175

 


       $consultap = mysql_query("Select * FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");
 
      if (mysql_num_rows($consultap) == 1) {
           
          $consulta7=("UPDATE Usuario_Produto SET Usuario_Produto.quantidadeU_produto 
          = Usuario_Produto.quantidadeU_produto + '".$_POST['quantidade']."' WHERE id_usuario = '".$_POST['id']."' and
          id_produto = '".$_POST['idProduto']."'  ");
          $resultado7 = mysql_query($consulta7, $conexao);
 
      } 
              
       else {
          $consulta8 = ("insert into Usuario_Produto (id_usuario, id_produto, quantidadeU_produto)
          values ( '".$_POST['id']."',
          '".$_POST['idProduto']."',
          '".$_POST['quantidade']."')");
          $resultado8 = mysql_query($consulta8, $conexao);
    $id = $_POST['id'];

           
      }

$queryQtd= mysql_query("Select quantidadeU_produto FROM Usuario_Produto WHERE id_produto = '".$_POST['idProduto']."' and id_usuario = '".$_POST['id']."'");

$qtd = mysql_fetch_assoc($queryQtd);

$qtdBanco = $qtd['quantidadeU_produto'];

// Aqui vem a rotina que você já adaptou 

$consultaqe = "SELECT quantidade_ocorrer FROM Produto WHERE id_produto = '$id_produto'";
$quantidadeEstabelecida = mysql_fetch_assoc (mysql_query ($consultaqe, $conexao)) ;
$quantidadeEstabelecida = $quantidadeEstabelecida['quantidade_ocorrer'];

$consultapon = "SELECT pontuacao FROM Produto WHERE id_produto = '$id_produto'";
$pontuacaoP = mysql_fetch_assoc(mysql_query ($consultapon, $conexao) ); // e como ela retorna um array()
$pontuacaoP = $pontuacaoP['pontuacao']; 

$resultado = (int)($qtdBanco / $quantidadeEstabelecida);
  
if ($resultado) {
      $quantidade = $_POST['quantidade'];
            if ($quantidade > $quantidadeEstabelecida) {
                  $pontuacaoUsuario = $quantidade * $pontuacaoP; 
                  $consulta2=("UPDATE Usuario SET pontuacao = pontuacao + '".$pontuacaoUsuario."'' WHERE Usuario.id_usuario = '".$_POST['id']."'");
                  $resultado2 = mysql_query($consulta2, $conexao);  
                }
            else {
                  $pontuacaoUsuario = $pontuacaoP; 
                  $consulta2=("UPDATE Usuario SET pontuacao = pontuacao + '".$pontuacaoUsuario."'' WHERE Usuario.id_usuario = '".$_POST['id']."'");
                  $resultado2 = mysql_query($consulta2, $conexao);  
            }
}
			

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta verificar se a variável $quantidadeEstabelecida está recebendo o valor correto do banco de dados, tenta dar um echo nela e ver qual valor ela está recebendo.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já verifiquei e agora tá funcionando. Só falta uma coisa, ele não está conseguindo verificar se o resultado saiu inteiro ou não. O trecho do código:

 

$verificaInt = (int)($qtdBanco / $quantidadeEstabelecida);
echo $verificaInt;

if ($verificaInt)  {
.........

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Então, na realidade o cast (int) já modifica qualquer valor obtido no cálculo para inteiro, mas caso você queira fazer uma verificação a mais (sempre é válido), você pode utilizar a função is_int.

 

if(is_int($verificaInt)){
...
}

 

Veja se fica tudo OK.

 

Abraços,

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.