Ir para conteúdo

POWERED BY:

Arquivado

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

TenshiNet

Acessar item de array para deletar do BD

Recommended Posts

Pessoal, Boa Noite.

 

Estou criando uma rifa online e o método de pagamento para a mesma é nosso querido sistema PAGSeguro. Como grande parte de programadores como eu, iniciantes, tive meus problemas com a implantação do retorno automático. Garimpando a net afora e aqui neste Fórum, consegui fazer funcionar ao menos o log, e concluí que estou recebendo o post normalmente do PagSeguro. O problema que estou tendo é o seguinte: preciso acessar um item de dentro do array $produtos ( ProdID ) para que possa excluí-lo do BD. Logo, minha dúvida é a seguinte: Como faço para verificar o valor do item dentro do array e atribuí-lo em uma variável?

 

Por exemplo:

 

$produtos[] = array (
         'ProdID'          => $post["ProdID_{$i}"],
         'ProdDescricao'   => $post["ProdDescricao_{$i}"],
         'ProdValor'       => (double) (str_replace(',', '.', $post["ProdValor_{$i}"])),
         'ProdQuantidade'  => $post["ProdQuantidade_{$i}"],
         'ProdFrete'       => (double) (str_replace(',', '.', $post["ProdFrete_{$i}"])),
         'ProdExtras'      => (double) (str_replace(',', '.', $post["ProdExtras_{$i}"])),
       );

 

Acima está o array $produtos. Como faço para verificar qual o valor do ProdID?

 

Desde já agradeço a atenção dispensada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O ideal é na hora de enviar para o PagSeguro o pedido, gravar o mesmo no banco de dados, para quando os posts de retorno chegar, você usa o campo referencia ( informado no formulário na hora do envio para tela do checkout ) e altera apenas o status daquele pedido gravado anteriormente...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente caro amigo senartes. Obrigado pela atenção.

 

 

O ideal seria gravar em BD o pedido, mas isso para o caso de eu vender produtos físicos.

Neste caso, especificamente, quero apenas retirar o número do BD para que ninguém possa comprar igual, afinal é só um campo na tabela.

Consegui alguma coisa com while list, mas ainda não consegui apagar do BD. Provavelmente é a sintaxe ou lógica que ainda estou me embaraçando.

 

Segue parte do código:

 

	function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, 	$ValorFrete,
$Anotacao, $DataTransacao, $TipoPagamento, 	$StatusTransacao, $CliNome,
$CliEmail, $CliEndereco, 	$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens 
 ) {
	 if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){
		 while (list($chave, $valor) = each ($produtos)) {
			 for($i=0;$chave=="ProdID_{$i}";$i++){
				mysql_query("DELETE * FROM tabela WHERE campo = $valor");
			 }
		 }
	 }
	 elseif ($StatusTransacao == "Cancelado"){
		while (list($chave, $valor) = each ($produtos)) {
			for($i=0;$chave=="ProdID_{$i}";$i++){
				$tab = mysql_query("SELECT * FROM tabela WHERE campo = $valor");
				$tab = mysql_affected_rows();
					if($tab==0){
						mysql_query("INSERT INTO tabela (campo) VALUES ('$valor')");
					} 
			}
		}
	}
} 

 

 

Gostaria de saber onde estou me equivocando.

 

Desde já agradeço a atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, modifiquei meu código de forma a ficar mais segura a inserção e remoção do BD.

 

Mas ainda tem alguma coisa falhando, e tenho certeza absoluta que é na parte de recuperar o valor do ProdID no array $produtos, pois testei todas as outras sintaxes em separado e funcionaram.

 

Só não consegui ainda puxar este maldito valor do ProdID depois do POST. Segue o código:

 


function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
	require_once('conecta.php');
	if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){
		$deleta = $produtos['ProdID'];
		$pergunta = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"');
		$pergunta = mysql_affected_rows();
		if ($pergunta <> 0){
			mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"');				
		}
	}
	if ($StatusTransacao == "Cancelado"){
		$insere = $produtos['ProdID'];
		$tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
		$tab = mysql_affected_rows();
		if($tab==0){
			mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');
		}
	}
}

 

Recebo o log de retorno completo. Mas na opção do array, ele imprime a chave assim:

 

ProdID_x = 12345

 

Alguem teria alguma forma de puxar este valor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){

$deleta = $produtos['ProdID'];

$pergunta = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"');

$pergunta = mysql_affected_rows();

if ($pergunta <> 0){

mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"');

}

}

1 -

Nesse trecho do codigo pude notar o

$StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo"

Sempre que for completo é porque já foi aprovado 14 dias antes.

Ou seja não utilize os dois, utilize somente o aprovado, quando quiser verificar se o cliente pagou utilize apenas o Aprovado

 

 

 

 

2 -

$StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"

 

Esses dois status sempre são os iniciais, toda compra passa por eles, claro que pode acontecer de cair um Aprovado também no caso de cartão de credito ( dependendo da situação do cliente com o banco ).

Resumindo se você está utilizando "Aguardando Pagto", "Em Análise" e "Aprovado", Logo toda transação irá cair nessa etapa, no minimo uma vez...

 

Sendo assim, eu aconselho você utilizar essa linha

mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"');

Na pagina onde você envia a transação para o PagSeguro, porque? se sempre ele irá executar isso na primeira etapa, é melhor que seja executado quando envia para o PagSeguroa opinião )

 

 

 

 

3 -

if ($StatusTransacao == "Cancelado"){
                       $insere = $produtos['ProdID'];
                       $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
                       $tab = mysql_affected_rows();
                       if($tab==0){
                               mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');
                       }
               }

Se eu não me engano, dentro de

$produtos

deverá ter um array com varios "ProdID", logo acho que você deveria percorrer esse array e eliminar cada "ProdID".

 

Exemplo

if ($StatusTransacao == "Cancelado"){

foreach ($produtos as $produto) {	
$insere = $produto['ProdID'];
                       $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
                       $tab = mysql_affected_rows();
                       if($tab==0) mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');


}
}

 

 

Verifique se com isso funciona o que você precisa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo Senartes. happy.gif

 

Fico agradecido pela atenção dispensada. Tem sido de muita ajuda.

 

1 -

Nesse trecho do codigo pude notar o

$StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo"

Sempre que for completo é porque já foi aprovado 14 dias antes.

Ou seja não utilize os dois, utilize somente o aprovado, quando quiser verificar se o cliente pagou utilize apenas o Aprovado

 

2 -

$StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"

 

Esses dois status sempre são os iniciais, toda compra passa por eles, claro que pode acontecer de cair um Aprovado também no caso de cartão de credito ( dependendo da situação do cliente com o banco ).

Resumindo se você está utilizando "Aguardando Pagto", "Em Análise" e "Aprovado", Logo toda transação irá cair nessa etapa, no minimo uma vez...

 

Sendo assim, eu aconselho você utilizar essa linha

mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"');

Na pagina onde você envia a transação para o PagSeguro, porque? se sempre ele irá executar isso na primeira etapa, é melhor que seja executado quando envia para o PagSeguroa opinião )

 

Referente a esta parte, realmente não tinha parado pra analisar. Faz todo o sentido. tongue.gif

 

3 -

if ($StatusTransacao == "Cancelado"){
                       $insere = $produtos['ProdID'];
                       $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
                       $tab = mysql_affected_rows();
                       if($tab==0){
                               mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');
                       }
               }

 

Se eu não me engano, dentro de

$produtos

deverá ter um array com varios "ProdID", logo acho que você deveria percorrer esse array e eliminar cada "ProdID".

 

Exemplo

if ($StatusTransacao == "Cancelado"){

foreach ($produtos as $produto) {	
$insere = $produto['ProdID'];
                       $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
                       $tab = mysql_affected_rows();
                       if($tab==0) mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');


}
}

 

 

smile.gif Quanto a esta outra parte, analisei com calma sua sugestão e terminei por deixar da seguinte forma:

 


<?php
if (isset($_POST)) {
	$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
	fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
	fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
	fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
	fclose($f);  
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
	require_once('conexao.php');
	if ($StatusTransacao == "Cancelado"){
		foreach ($produtos as $produto){
			$insere = $produto['ProdID'];
			$intab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"');
			$intab = mysql_affected_rows();
			if($intab==0){
				mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")');
			}
		}
	}
	else
	{
		foreach ($produtos as $produto){
			$deleta = $produto['ProdID'];
			$outtab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"');
			$outtab = mysql_affected_rows();
			if ($outtab <> 0){
				mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"');
			}
		}
	}
}
	require_once("retorno.php");	
?>

 

Como todo tipo de transação faria com que eu retirasse o valor do BD, o único que deveria verificar é o Status de Cancelado, para que eu pudesse retornar meu produto para o BD. Sendo assim, qualquer status diferente de cancelado retira meu produto do estoque. Assim, o código ficou menor, mais limpo e mais objetivo.

 

Agradeço a força e as dicas passadas. clap.gif

 

Um grande abraço. joia.gif

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.