Ir para conteúdo

POWERED BY:

Arquivado

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

allex_carvalho

[Resolvido] Não entra no else

Recommended Posts

Boa noite pessoal.

 

Tenho um script para bloquear mais de um download por vez. Ao clicar em baixar cadastro dados no banco de dados certinho, só que na hora de listar filtrar um download por vez não acontece nada, sempre libera o download.

 

Vejam o código para ver se alguém pode ajudar:

 

<?php

require_once 'php/mysql_connect.php';

set_time_limit(0);

// Caminho do arquivo que está sendo requisitado
$caminho = mysql_real_escape_string($_SERVER['REQUEST_URI']);

// IP do indivíduo que está requisitando o arquivo
$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);

// Está baixando?
$baixando = false;

// Seleciona o último acesso em formato UNIX, equivalente ao mktime()
$sql = "SELECT UNIX_TIMESTAMP(ultimoacesso) AS ultimavez FROM baixando WHERE ip = '$ip'";

$rs = mysql_query($sql);

if (mysql_num_rows($rs)) {
   $ultimaVez = mysql_result($rs, 0, 'ultimoacesso') + 300;
   if ($ultimaVez < time()) {
       mysql_query("REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()");
       $baixando = true;
   }
} else {
   $sql = "REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()";
   mysql_query($sql);
   $baixando = true;
}

if ($baixando) {
   $id_arquivo = base64_decode($_GET['id_arquivo']);
   $sql = "SELECT * FROM arquivos WHERE id=" . $id_arquivo;
   $qr = mysql_query($sql);
   $rs = mysql_fetch_object($qr);
   $diretorio = "deposit/uploads/" . $rs->id_usuario . "/";
   $path = $rs->arquivo;
   $caminhoCompleto = $_SERVER['DOCUMENT_ROOT'] . $diretorio . $path;
   if (is_file($caminhoCompleto)) {
       $data = date("Y-m-d H:i:s");
       $inserir = "INSERT INTO baixando VALUES (NULL, '$path', '$ip', '$data')";
       mysql_query($inserir);
       header('Pragma: public');
       header('Expires: 0');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($caminhoCompleto)) . ' GMT');
       header('Cache-Control: private', false);
       header('Content-Type: application/force-download');
       header('Content-Disposition: attachment; filename="' . basename($caminhoCompleto) . '"');
       header('Content-Transfer-Encoding: binary');
       header('Content-Length: ' . filesize($caminhoCompleto));
       header('Connection: close');
       readfile($caminhoCompleto);
       exit;
   }
} else {
   header('HTTP/1.0 503 Service Unavailable');
   print '<h1>503 Service Unavailable</h1><p>Você só pode fazer outro download em 5 minutos</p>';
   exit;
}
?>

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

em qualquer das hipoteses seu baixando é true então ele vai continuar executando de qualquer jeito

 

if (mysql_num_rows($rs)) {
   $ultimaVez = mysql_result($rs, 0, 'ultimoacesso') + 300;
   if ($ultimaVez < time()) {
       mysql_query("REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()");
       $baixando = true;
   }
} else {
   $sql = "REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()";
   mysql_query($sql);
   $baixando = true;
}

 

1 desses 2 precisa retornar false.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Vinicius...

 

Fiz conforme indicado (testei com else nos dois, um de cada vez) e não deu certo também. No if ele sempre vai bloquear o download, no else ele nunca bloqueia o download.

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que você quer amigo.

 

No caso tem duas true.

 

Quem e o falso ? então?

 

$baixando = false;

 

if(!$baixando == false){

// Aqui o valor deu false

}else{

// Aqui o valor e true.

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este sistema verifica se o ip em uso já fez um download em menos de 5 minutos ou está com um download em andamento. Se sim, ele bloqueia o outro download. Se eu alterar qualquer valor dos true, o download vem corrompido no final.

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi por cima do script, adicione o seguinte else:

 

 

    if ($ultimaVez < time()) {
       mysql_query("REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()");
       $baixando = true;
   }
   else
       $baixando = false;

 

@edit, e tem mais um errinho ali:

$ultimaVez = mysql_result($rs, 0, 'ultimoacesso') + 300;

deixe assim:

$ultimaVez = mysql_result($rs, 0, 'ultimavez') + 300;

pois você dá um "apelido" pro campo:

$sql = "SELECT UNIX_TIMESTAMP(ultimoacesso) AS ultimavez FROM baixando WHERE ip = '$ip'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que comemorei demais antes da hora, rss

 

Depois que ele bloqueia o download é só limpando o banco de dados para iniciar outro donwload, e não respeitando os 5 min, como está aqui:

 

$ultimaVez = mysql_result($rs, 0, 'ultimoacesso') + 300;

 

Imprimi separadamente esses dois valores:

 

if ($ultimaVez < time()) {

 

E estão corretos. Porque será que não libera o download?

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opaw Vinicius, ficou assim:

 

<?php

require_once 'php/mysql_connect.php';

set_time_limit(0);

// Caminho do arquivo que está sendo requisitado
$caminho = mysql_real_escape_string($_SERVER['REQUEST_URI']);

// IP do indivíduo que está requisitando o arquivo
$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);

// Está baixando?
$baixando = false;

// Seleciona o último acesso em formato UNIX, equivalente ao mktime()
$sql = "SELECT UNIX_TIMESTAMP(ultimoacesso) AS ultimavez FROM baixando WHERE ip = '$ip'";

$rs = mysql_query($sql);

if (mysql_num_rows($rs)) {
   $ultimaVez = mysql_result($rs, 0, 'ultimavez') + 300;
   if ($ultimaVez < time()) {
       mysql_query("REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()");
       $baixando = true;
   }
   else {
       $baixando = false;
   }
} else {
   $sql = "REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()";
   mysql_query($sql);
   $baixando = true;
}

if ($baixando) {
   $id_arquivo = base64_decode($_GET['id_arquivo']);
   $sql = "SELECT * FROM arquivos WHERE id=" . $id_arquivo;
   $qr = mysql_query($sql);
   $rs = mysql_fetch_object($qr);
   $diretorio = "deposit/uploads/" . $rs->id_usuario . "/";
   $path = $rs->arquivo;
   $caminhoCompleto = $_SERVER['DOCUMENT_ROOT'] . $diretorio . $path;
   if (is_file($caminhoCompleto)) {
       $data = date("Y-m-d H:i:s");
       $inserir = "INSERT INTO baixando VALUES (NULL, '$path', '$ip', '$data')";
       mysql_query($inserir);
       header('Pragma: public');
       header('Expires: 0');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($caminhoCompleto)) . ' GMT');
       header('Cache-Control: private', false);
       header('Content-Type: application/force-download');
       header('Content-Disposition: attachment; filename="' . basename($caminhoCompleto) . '"');
       header('Content-Transfer-Encoding: binary');
       header('Content-Length: ' . filesize($caminhoCompleto));
       header('Connection: close');
       readfile($caminhoCompleto);
       exit;
   }
} else {
   header('HTTP/1.0 503 Service Unavailable');
   print '<h1>503 Service Unavailable</h1><p>Você só pode fazer outro download em 5 minutos</p>';
   exit;
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara realmente ta complicado estou estudando isso faz tempo e o primeiro que peço é que você coloque assim

 

if (mysql_num_rows($rs) > 0) {

 

é meio que um chute pra ver se funciona pois pensa comigo o mysql_num_rows vai executar de todo jeito e vai retornar

mais quando não tiver nada a contagem será 0.

 

é muito chutado pois não sei se é falta de atenção mais também não conseguir achar o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Vinicius.

 

Este processo não funcionou. Algo estranho que percebi foi o seguinte. Veja o código abaixo:

 

else {
   require_once 'cabecalho.php';
   require_once 'topo.php';

   $sql_tempo = "SELECT ultimoacesso FROM baixando WHERE ip = '$ip' ORDER BY id DESC LIMIT 1";
   $qr_tempo = mysql_query($sql_tempo);
   $rs_tempo = mysql_fetch_object($qr_tempo);
   $tempo_banco = date("i", strtotime($rs_tempo->ultimoacesso));
   $minutos_aumentar = 300 / 60;
   $tempo_total = $tempo_banco + $minutos_aumentar;
   $minuto_atual = date("i");
   $tempo_final = $tempo_total - $minuto_atual;

   header('HTTP/1.0 503 Service Unavailable');
   print '
           <h1 class="titulo_erro">503 Service Unavailable</h1>
           <p class="texto_erro">Você só pode fazer outro download em '.$tempo_final.' minutos</p>
       ';
   require_once 'rodape.php';
   exit;
}

 

Ao entrar na tela de bloqueio (logo após o termino do download) ele diz que só posso fazer outro download em 5 minutos. Até ai está certo. Corre os minutos até o 1. Ai começa do 60 e volta até zerar de novo.

 

Estranho demais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tempo é setado aqui:

 

if (mysql_num_rows($rs)) {
   $ultimaVez = mysql_result($rs, 0, 'ultimavez') + 300;
   if ($ultimaVez < time()) {

 

Imprimindo a $ultimaVez e time, retorna isso:

 

1340398838

1340390500

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imprimindo a $ultimaVez e time, retorna isso:

 

1340398838

1340390500

esses valores estão muito longe um do outro.. e isso é bem esquisito..

 

coloca um

date_default_timezone_set('America/Sao_Paulo');

no início do script php.

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.