• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Knitter

Conversão esquisita entre valores passados por URL e conteúdo da variável...

15 mensagens neste tópico

Boas,

Estou a usar alguns valores passados por URL para controlar um script. Já fiz isto inúmeras vezes mas desta deparei-me com um erro que não consigo perceber.

Suponham o seguinte URL: http://somepalce.moc/index.php?id=0, ao passar para o script que tenho abaixo, a variável $i irá conter o valor "00" e não o valor "0". Quando somo, através da linha $i + 1, a variável $next fica com o valor "1". Na segunda iteração, ao passar "id=1" no URL, a variável $i fica com o valor "11". Isto continua até que o if de controlo reinicia a variável. Não faço a minima ideia de onde está o erro. Sei apenas que, neste caso o ciclo termina quando $i for maior que 51, e que o $i toma os valores "00", "11", "22", "33", "44", "55" e "66", valor no qual o ciclo é reiniciado.

$i = $_GET['id'];
if($_GET['id'] < 0 || $_GET['id'] >= $count) {
    $i = 0;
}
$prev = ($i == 0 ? -1 : $i - 1);	
$next = ($i == ($count - 1) ? -1 : $i +1 );

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olhando para o teu código, corrigo:

$i = $_GET['id'];
if($_GET['id'] < 0 || $_GET['id'] >= $count) {
    $i = 0;
}
$prev = ($i == 0) ? -1 : ($i - 1);	 // isto
$next = ($i == ($count - 1)) ? -1 : ($i +1); // e isto

Se funciona ou não para o que queres, não sei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o djthyrax postou enquanto eu escrevia, suponho que seja a mesma coisa (+/-), mas como sou um bocado preguiçoso não me apetece alterar...

$i = $_GET['id'];
if($_GET['id'] < 0 || $_GET['id'] >= $count) {
   $i = 0;
}
($i == 0) ? $prev = -1 : $prev = $i -1;
($i == $count - 1) ? $next = $count -1 : $next =  $i +1 ;

Suponho que assim o comportamento seja o mesmo..? Experimenta e relata..!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não percebo muito de PHP, mas as alterações sugeridas não têm lógica quando olhamos para as tabelas de precedências de operadores em PHP, básicamente vêm reforçar o que já está escrito... mas mesmo assim testei. Não tem qualquer efeito no caso.

Reparem que a única variável que tem valores estranhos é a $i. Se eu fornecer o valor 1 no URL e imprimir a variável $i ela tem o valor 11, mas quando chega ao operador ternário o valor de $next é 2 e o de $prev é 0, e esses valores estão correctos, o problema é que o valor da variável $i é inválido e altera o funcionamento do script.

Estou completamente à nora...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm. Pois bem me parecia que também não tava a perceber muito bem disso lol. Ok, experimenta o seguinte, mete um (int) logo antes de qualquer referencia ao $i, tipo assim

...
(int) $i = etc. etc.
...

vai fazer um typecast para int, forçando (digo eu) a soma dos valores numéricos. Não deveria ser preciso, mas pode ser que resolva...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mesmo assim não dá. Bem estive a fazer uns testes e pensei que fosse da construção do URL, mas tudo está bem, no entanto deparei-me ocm outro problema, este erro só acontece com números de 1 digito. Isto é de 0 a 9 dá problemas, mas se passar de 10 para cima funciona bem....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
$_GET['id'] = 1; // valor passado plo browser, var_dump($_GET['id']) returna int(1)

$id = (str) $_GET['id']; // var_dump($id) vai retornar string(1) "1"
$id .= $id; // var_dump($id) vai retornar string(2) "11"

if($id > 51) $id = "00";
else{ $id = (str) ($id{0}+1); $id .= $id; }
# [...]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, oh dj, já comeca a ser chato essas coisas de postares enquanto tou a escrever..! Lol na brinca, segue mais uma sugestão.... Experimenta assim..

$i = (int) $_GET['id'];
if($i < 0 || $i >= $count) {
   $i = 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, oh dj, já comeca a ser chato essas coisas de postares enquanto tou a escrever..!

Pois, eu sou assim, RÁPIDO! :thumbsup: Anyway, editei o meu código anterior, pus lá o else
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi nada do que o djthyrax quis dizer :thumbsup:, e a questão de tentar converter já tinha feito. Pior, por alguma razão agora já não faz a cena de duplicar o valor, tipo se dou id=1 então o $i fica com "1" mas continua a saltar no if sempre que o $i fica com o valor 6, e o $count está a 51!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O uso do var_dump que eu desconhecia, detectou uns problemazitos. Eu quero que as variáveis sejam todas inteiros mas o php está considerá-las como strings, mesmo o $count, que eu assumia ser inteiro é uma string. Vou analizar o resto do código e corrigir essas minhas suposições...

Como eu gosto das linguagens em que EU decido o que quero e não um qualquer motor.... enfim, quanto mais mexo nisto mais odeio o php....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi nada do que o djthyrax quis dizer :D

Todos os meus professores me dizem o mesmo.

O uso do var_dump que eu desconhecia, detectou uns problemazitos. Eu quero que as variáveis sejam todas inteiros mas o php está considerá-las como strings, mesmo o $count, que eu assumia ser inteiro é uma string.

$i = "1"; // <- string(1) "1"
$i = $i + 0; // <- int(1)
$i = (int) $i; // <- int(1)

Como eu gosto das linguagens em que EU decido o que quero e não um qualquer motor.... enfim, quanto mais mexo nisto mais odeio o php....

Lol, com o tempo habituaste :thumbsup:
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora explico-te o código que tinha postado lá em cima que tu n percebeste:

$_GET['id'] = 1; // valor passado plo browser, var_dump($_GET['id']) returna int(1)

$id = (str) $_GET['id']; // var_dump($id) vai retornar string(1) "1"
$id .= $id; // var_dump($id) vai retornar string(2) "11"

if($id > 51) $id = "00"; // Se o $id for maior que 51, reiniciar a variável (foi o que disseste que pretendias no 1º post)
else{
$id = (str) ($id{0}+1); // o $id{0} é o primeiro caracter da string (neste caso é string(1) "1"). Converto o caracter para integer, incremento e volto a converter para string.
$id .= $id; // passo o $id de string(1) "2" para string(2) "22"
}
# [...]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Habituar-me?! Espero bem que não, nunca gostei de linguagem deste tipo, onde o motor decide o que fazer e tenta ajudar o programador libertando-lhe o "esforço" de declarar meia dúzia de variáveis.

Seja como for resolvi o problema, o bloco de código mostava um problema mais profundo, eu estava a considerar muitas variáveis no script como inteiros e na verdade o PHP estava a usá-las como strings, isso só dava asneira. Em alguns pontos existiam espaços dentro das variáveis... bem passei a usar a função intval() em todos os pontos sensíveis e, se não me esqueci de nenhum, está tudo a funcionar.

Nunca me habituarei a esta linguagem, posso usá-la, como o tenho feito muitas vezes mas mesmo assim não morro de amores por ela. Até agora só gosto de uma linguagem de scripting e é perl.

Bem, obrigado pela ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Habituar-me?! Espero bem que não, nunca gostei de linguagem deste tipo, onde o motor decide o que fazer e tenta ajudar o programador libertando-lhe o "esforço" de declarar meia dúzia de variáveis.

Scripting definitivamente não é para ti :thumbsup:

Seja como for resolvi o problema, o bloco de código mostrava um problema mais profundo, eu estava a considerar muitas variáveis no script como inteiros e na verdade o PHP estava a usá-las como strings, isso só dava asneira. Em alguns pontos existiam espaços dentro das variáveis... bem passei a usar a função intval() em todos os pontos sensíveis e, se não me esqueci de nenhum, está tudo a funcionar.

Nunca mais me lembrei da intval()...
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora