Logo Hardware.com.br
Roger_Wolff
Roger_Wolff Membro Senior Registrado
168 Mensagens 1 Curtida

Cabeçalhos swf rotativos em PHP e sem repetir até o final da lista? help

#1 Por Roger_Wolff 27/07/2009 - 20:33
Estava com uma dúvida e ainda não enconteri alguém que podesse me
responder educadamente o porquê este código está falhando.

Necessito que esta função retorne variações semelhantes a cab_01.swf
cujo arquivo deve obrigatoriamente existir. Sendo que não pode haver
repetições do mesmo swf até que termine a lista para poder começar
novamente.

No momento só existem 2 swf aqui comigo, o cab_01.swf e cab_02.swf
portanto o efeito seria de alternação entre um e outro sem repetir
o mesmo consecutivamente. Mas é o que não acontece e estou aqui
para tentar decifrar o que há de errado. Obrigado.

[php]function CabSelector() {
$q = $_COOKIE[query_cab];
$query = explode('-', $q);
$max_cabs = 10;

// Lista os cab_??.swf existentes
for($i=0; $i < $max_cabs; $i++) {
$cab = 'cab_'.(($i<10)?'0'.$i:$i).'.swf';
if(file_exists($cab)) $cabs[] = $cab;
}

// Executa a operação até que não seja mais necessária
while((!$exists || $on_list) && !$exit) {
$on_list = false; // Reinicia a variável on_list se já foi usada no loop anterior
$num++; // Adiciona 1 ao contador
$ncab = ($num<10)?'0'.$num:$num; // Seleciona dois digitos para serem adicionados ao nome do arquivo swf

// Verifica se os dois digitos já estão na lista contando até a primeira ocorrência
for($i=0; $i < sizeof($query); $i++) if(!$on_list && $query[$i] == $ncab) $on_list = true;

// Verifica se os dois digitos não são o último da lista e se a quantideda de cab's na lista é igual ao
// nº de cab's existentes para não necessitar executar novamente esta operação
if(sizeof($query) < sizeof($cabs)) {
// Verifica se os digitos estão na lista como arquivo swf
for($i=0; $i < sizeof($cabs); $i++) if(!$exists && $cabs[$i] == 'cab_'.$ncab.'.swf') $exists = true;
if($exists) $cab = 'cab_'.$ncab.'.swf';
} else {
$ncab = '01';
$cab = 'cab_'.$ncab.'.swf';
$exit = true;
}
}

// Se quantidade de cab's gravados no cookie for a mesma que o nº de cab's existentes então reinicia a lista
// ou adiciona o novo cab ao final da lista
$cc = (sizeof($query) >= sizeof($cabs))?$ncab:$q.'-'.$ncab;

// Atualiza o cookie
setcookie('query_cab', $cc, time()+604800, '/');

return $cab;
}

echo CabSelector();[/php]Outra coisa.. a função funciona perfeitamente se atualizar página em segundos de carregada. Por exemplo, coloco este echo logo antes do return para informar as alterações:[php] echo // echo de apuração de valores
'

. numcab: '.$ncab.'

. end: '.end($query).'

. cabs: '.sizeof($cabs).'

. query: '.sizeof($query).'

. q: '.$q.'

. setcookie: '.$cc.'

. cookie: '.$_COOKIE[query_cab].'
';[/php]..e atualizo de 5 em 5 segundo, com isso funciona legal mas se deixar mais tempo já começa a repetir. Não consigo entender.


esse é o código que tá no meu site e como podem ver ele repete o cabeçalho em flash em cada carregamento. http://www.imoveiscenter.com.br/

Com sessions acontece a mesma coisa, parece que o script não é executado algumas vezes. me_espantei.png
[php]function CabSelector() {
session_start();
if(!isset($_SESSION[qcs])) $_SESSION[qcs] = array();
$max_cabs = 10;

// Lista os cab_??.swf existentes
for($i=0; $i < $max_cabs; $i++) {
$cab = 'cab_'.(($i<10)?'0'.$i:$i).'.swf';
if(file_exists($cab)) $cabs[] = $cab;
}

// Executa a operação até que não seja mais necessária
while((!$exists || $on_list) && !$exit) {
$on_list = false; // Reinicia a variável on_list se já foi usada no loop anterior
$num++; // Adiciona 1 ao contador
$ncab = ($num<10)?'0'.$num:$num; // Seleciona dois digitos para serem adicionados ao nome do arquivo swf

// Verifica se os dois digitos já estão na lista contando até a primeira ocorrência
for($i=0; $i < sizeof($_SESSION[qcs]); $i++) if(!$on_list && $_SESSION[qcs][$i] == $ncab) $on_list = true;

// Verifica se os dois digitos não são o último da lista e se a quantideda de cab's na lista é igual ao
// nº de cab's existentes para não necessitar executar novamente esta operação
if(sizeof($_SESSION[qcs]) < sizeof($cabs)) {
// Verifica se os digitos estão na lista como arquivo swf
for($i=0; $i < sizeof($cabs); $i++) if(!$exists && $cabs[$i] == 'cab_'.$ncab.'.swf') $exists = true;
if($exists) $cab = 'cab_'.$ncab.'.swf';
} else {
$ncab = '01';
$cab = 'cab_'.$ncab.'.swf';
$exit = true;
}
}

// Se quantidade de cab's gravados no cookie for a mesma ou maior que o nº de cab's existentes então reinicia a lista
// ou adiciona o novo cab ao final da lista
if(sizeof($_SESSION[qcs]) >= sizeof($cabs)) {
session_unregister(qcs);
$_SESSION[qcs][] = $ncab;
} else $_SESSION[qcs][] = $ncab;

echo // echo de apuração de valores (Provisório)
'

. numcab: '.$ncab.'

. cabs: '.sizeof($cabs).'

. query: '.sizeof($_SESSION[qcs]).'

';

return $cab;
}[/php]
DigUser
DigUser Super Participante Registrado
592 Mensagens 26 Curtidas
#3 Por DigUser
30/07/2009 - 19:45
Poderia ser mais claro na sua pergunta?
Tipo, você vai ter vários arquivos(cab_01.swf, cab_02.swf, cab_03.swf), o script pega eles em sequência, verificando se ele existe e não pode repetir.
Bem, num script rápido eu penso em:
[php]$max_cab = 10;
for($i=1; $i<=$max_cab; $i++){
$cab = 'cab_'.(($i<10)?'0'.$i:$i).'.swf';
if(!file_exists($cab)) continue;

echo "$cab existe
";

}[/php]
Esse código informa quais arquivos existe, mas...
Roger_Wolff disse:
No momento só existem 2 swf aqui comigo, o cab_01.swf e cab_02.swf
portanto o efeito seria de alternação entre um e outro sem repetir
o mesmo consecutivamente. Mas é o que não acontece e estou aqui
para tentar decifrar o que há de errado. Obrigado.

Porque eles devem se alternar. A, daí pra baixo não deu pra entender mais nada. O código, hehe, não entendi bulhufas, de onde surgiu $exists e $on_list?

-------- EDIT --------
Acho que sei o que você quer, é isso:
[php]$max_cab = 10; //Quantidade máxima de cab_XX.swf

$ext_cab = 0; //Quantidade de cab's que existem
for($i=1; $i<=$max_cab; $i++){ //Inicia loop
$cab = 'cab_'.(($i<10)?'0'.$i:$i).'.swf'; //Determina o nome do cab
if(!file_exists($cab)) continue;//Se arquivo não existir, pula ele e continua o loop
//Se existir:
$ext_cab++; //Adiciona 1 se o arquivo existir
$nam_cabs[$ext_cab] = $cab; //Array com o nome dos cabs que existem
echo "$cab existe
"; //Simples echo que para listar os cabs q existem
} //Fim do loop

$esc_cab = rand (1, $ext_cab); //Randomiza um número de 1 até o máximo de arquivos existentes
$cab = $nam_cabs[$esc_cab]; //Define o nome do cab resultante
echo "
$cab foi o escolhido";//Informa qual cab foi escolhido

// Analisando o código, vê-se que ele armazena o nome dos cabs
// que existem numa array($nam_cabs) de acordo com o índice dado
// por $ext_cab. Assim, ao selecionar um número entre 1 e o máx
// imo dos cab's que existem, informando a array, é retornado o
// nome do cab. Bem, você deve saber melhor.[/php]
Se não for, esclareça-nos.
/* Este programa é protegido por leis internacionais de software
* e pela lei de Deus.
*
* Afinal de contas, só Deus sabe como essa coisa funciona..
* Não altere a partir da linha de baixo. */
Roger_Wolff
Roger_Wolff Membro Senior Registrado
168 Mensagens 1 Curtida
#4 Por Roger_Wolff
31/07/2009 - 17:17
hehehe.. valeu por responder.

Então, o código é um pouco mais complexo que isso. Segue essa lógica (de acordo com o meu último script):

1. Lista os cabeçalhos existentes
2. verifica se o cabeçalho escolhido existe e se não foi mostrado antes.
3. se a lista do session já estiver com todos os cabeçalhos existentes, então é apagada e reiniciada.

Conclusão: A idéia é, cada vez que um visitante acessa o site, é mostrado um banner diferente sem repetir até que não existam mais para começar novamente.

Obs: Como vc deve saber em php não é necessária a declaração de variáveis, elas começam a existir apartir do momento em que for atribuido um valor a ela e são isoladas se estiverem dentro de uma função.

Respondendo a sua pergunta, $exists e $on_list não existem até que sejam atribuidas.
Na ImovelaVenda.com.br você anuncia seu imóvel sem custo nenhum, adiciona até 50 fotos, marca o imóvel no Mapa e promove informações que terão visibilidade relevante na internet.

ImovelaVenda.com.br
DigUser
DigUser Super Participante Registrado
592 Mensagens 26 Curtidas
#5 Por DigUser
31/07/2009 - 18:40
[php]<?php
session_start();
$max_cab = 10;

$ext_cab = 0;
for($i=1; $i<=$max_cab; $i++){
$cab = 'cab_'.(($i<10)?'0'.$i:$i).'.swf';
if(!file_exists($cab)) continue;

$ext_cab++;
$nam_cabs[$ext_cab] = $cab;
echo "$cab existe
";
}
if(($_SESSION['cab'] == "")||($_SESSION['cab'] == $ext_cab)){
$esc_cab = 1;
}else{
$esc_cab = $_SESSION['cab'] + 1;
}
$_SESSION['cab'] = $esc_cab;
$cab = $nam_cabs[$esc_cab];
echo "
$cab foi o escolhido";
?>[/php]
Uffa, vê se é esse o código.
Fiz testes, onde eu tenho aqui 3 cab's, ele fez em ordem, a cada refresh da página, faz o teste aê e posta se gostou.
Obs.: Procure colocar o session_start() no início do documento, pois se ocorrer algum erro em comandos antes dele, será escrito uma mensagem do erro ocorrido e session_start() dirá que não foi possível definir header. Bem, vc deve saber disso.
/* Este programa é protegido por leis internacionais de software
* e pela lei de Deus.
*
* Afinal de contas, só Deus sabe como essa coisa funciona..
* Não altere a partir da linha de baixo. */
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal