Sessões em PHP

eXcept

Power Member
Viva.

Estou a programar um software que tem um sistema de login e Password, e estou a usar sessões para manter os dados. No entanto, a sessão funciona-me correctamente, mas só ao segundo login que faço. Ou seja, eu pus um campo na pagina após o login que me vai mostrar o nome associado ao login, mas tenho de fazer login - logout e depois login outra vez para que esse nome me apareça. Da primeira vez não aparece nada.

Segue-se o código

login.php ( Script para autenticação )

Código:
...
session_start();
$bla = $_POST[login];
$_SESSION['nome']=$bla;
...

main.php ( Página onde aparece o nome correspondente )

Código:
session_start();
$login = $_SESSION['nome'];
...
$req1 = "SELECT tipo FROM users WHERE login = '$login'";
$teste = mysql_fetch_array(mysql_query($req1,$connection));
$req2 = "SELECT nome FROM users WHERE login = '$login'";
$tipo = $teste['tipo'];
$getnome = mysql_fetch_array(mysql_query($req2,$connection));
$nome = $getnome['nome'];
echo   '<p align="center"><font face="Verdana" size="4"><b>Benvindo ';
echo $nome;
echo '</p></font></b>';

aqui o echo $nome só me funciona à segunda.

Alguem saberá qual o problema?

EDIT: Faltava uma linha de código
 
Última edição:
Hum..
1) a acção do form de autênticação (tag action="") aponta para o login.php certo? ou aponta para o main.php? se apontar para o login.php como tas a fazer o redirecionamento para o main.php?

2) $bla = $_POST[login]; - n sei se haver aproblema ou n aki, mas epxrimenta por ' ' entre o login, ou seja: $bla = $_POST['login'];

3) comenta akeles 3 echos k tens no main.php e substitui por var_dump($getnome); e dps diz ai o reultado k te apareceu no ecra (quando fazes o 1º login)

ms n sei pk, xeira-me k o problema será tao simples como corrgiri o que explico no ponto 2), ou talvez n, n sei bem... exprimenta...
 
1. Aponta para o login.php , o redirect é feito por um javascript

2. Já descobri qual era o problema.. o session_start() no login.php era feito abaixo do início do código. foi só mudar para logo a seguir ao <?php e passou a funcionar.

realmente problemas simples e de estupida distracção... bha

tks anyway :)
 
Já agora outro problema, nada a ver com sessions, mas que tenho agora. Sou completamente n00b em php, preciso de fazer isto para o work, e tenho estado a ler algumas coisas e é assim que tenho feito.

Código:
$verquaissaodia = mysql_query("SELECT dia FROM edicoes WHERE activo = '0'");
$verquaissaomes = mysql_query("SELECT mes FROM edicoes WHERE activo = '0'");
$verquaissaoano = mysql_query("SELECT ano FROM edicoes WHERE activo = '0'");
while ( $sacado = mysql_fetch_row($verquaissaodia)) {
    foreach ($sacado as $field)
    echo '<font face="Verdana" size="2">';
    echo $field;
	echo " de ";
}
  while ($sacado2 = mysql_fetch_row($verquaissaomes)) {
  foreach ($sacado2 as $field2)
  echo '<font face="Verdana" size="2">';
  echo $field2;
  echo " de ";
  }
  while ($sacado3 = mysql_fetch_row($verquaissaoano)) {
  foreach ($sacado3 as $field3)
  echo '<font face="Verdana" size="2">';
  echo $field3;
  echo "                   ";
  }
  echo '<font face="Verdana" size="2"><a href=activaactual.php>Activar</a></font></p>';

Isto funciona bem, mas os resultados são, quando tenho mais que um registo:

Código:
Edições por activar

1 de 2 de Janeiro de Janeiro de 2005 2005 Activar

O que pretendia era que aparecesse
Código:
1 de Janeiro de 2005 [u]activar[/u]
2 de janeiro de 2005[u]activar[/u]
 ou seja, fazer um ciclo que repetisse as três variáveis da forma como apresento aqui. Alguem me pode dar uma ajuda?
 
eXcept disse:
Já agora outro problema, nada a ver com sessions, mas que tenho agora. Sou completamente n00b em php, preciso de fazer isto para o work, e tenho estado a ler algumas coisas e é assim que tenho feito.

Código:
$verquaissaodia = mysql_query("SELECT dia FROM edicoes WHERE activo = '0'");
$verquaissaomes = mysql_query("SELECT mes FROM edicoes WHERE activo = '0'");
$verquaissaoano = mysql_query("SELECT ano FROM edicoes WHERE activo = '0'");
...
wtf?!
Pelo menos olha para o segundo exemplo (Example 2. Valid Query) aqui: http://pt.php.net/mysql_query ,que, para alem de aquilo que estás a fazer ser "esquesito", provavelmente, a lógica, ainda te vai ajudar a resolver o teu problema: "1 de 2 de Janeiro de Janeiro de 2005 2005 Activar".

eXcept disse:
Isto funciona bem, mas os resultados são, quando tenho mais que um registo:

Código:
Edições por activar

1 de 2 de Janeiro de Janeiro de 2005 2005 Activar
Aposto que se tiveres 3 registos na tabela, da forma como estás a fazer actualmente, isto vai-te aparecer em triplicado :P
 
as query's são válidas e retornam o devido valor. a leitura e impressão destes é correcta, exceptuando na forma como são apresentados.

suponho que falte um ciclo para ele correr isso, por cada linha três query's ( dia, mes, ano ) que encontre, faça a quebra de linha, mostre o registo 2, dia, mes ano, activar, quebra de linha, registo 3 e por aí adiante.

Não sei como fazer isto :s ando praki ah volta de ciclos, mas nenhum que me funcione
 
O que é esquesito (apenas sobre a parte do código que citei) é fazer 3 querys diferentes para apanhares 3 colunas da mesma tabela pertencentes á mesma linha, quando podias fazer algo como:
Código:
mysql_query("SELECT dia, mes, ano FROM edicoes WHERE activo = '0'");
o que te retornaria uma linha (row) com três valores: "dia, mes, ano".
Se tens mais que uma linha na tabela, põe o fetch num ciclo e vai printando cada linha retornada no fetch.

Tenho quase a certeza de que depois de perceberes o que se passa aqui, acabavas por resolver o teu problema sem teres que complicar tanto com tantos whiles e for eachs encadeados.
 
reformulei de acordo com as vossas indicações, e está assim:

Código:
$verquaissao = mysql_query("SELECT dia,mes,ano FROM edicoes WHERE activo = '0'");
$tlines = mysql_num_rows($verquaissao);
$ver2 = mysql_fetch_array($verquaissao);
for ( $i == 1 ; $i <= $tlines ; $i++ ) {
  echo '<font face="Verdana" size="2">';
  echo $ver2['dia'];
  echo " de ";
  echo $ver2['mes'];
  echo " de ";
  echo $ver2['ano'];
  echo ".";
  echo '<p>';
  }

mas agora retorna-me
Código:
1 de Janeiro de 2005.

1 de Janeiro de 2005.

1 de Janeiro de 2005.

qd devia retornar duas linhas apenas, com 2 dados diferentes ( 1 Jan 2005 e 2 Jan 2005 ) , que é o que está na DB.

pk?
 
em vez de teres esse ciclo "for" mete um while.

while($ver2 = mysql_fetch_array($verquaissao))
{
echo $ver2['dia'].$ver2['mes'].$ver2['ano'].'<br>';
}
 
Tens que fazer um fetch á tabela por cada linha que queres puxar.
Por exemplo, no http://pt.php.net/mysql_query está assim:

Código:
$result = mysql_query($query);
....

// Use result
// Attempting to print $result won't allow access to information in the resource
// One of the mysql result functions must be used
// See also mysql_result(), mysql_fetch_array(), mysql_fetch_row(), etc.
while ($row = mysql_fetch_assoc($result)) {
   echo $row['firstname'];
   echo $row['lastname'];
   echo $row['address'];
   echo $row['age'];
}

O que faz com que só saia do while quando já não houver mais linhas no result set.

No teu código experimenta algo parecido com isto:
Código:
$verquaissao = mysql_query("SELECT dia,mes,ano FROM edicoes WHERE activo = '0'");

while( $ver2 = mysql_fetch_array($verquaissao) ) {
  echo '<font face="Verdana" size="2">';
  echo $ver2['dia'];
  echo " de ";
  echo $ver2['mes'];
  echo " de ";
  echo $ver2['ano'];
  echo ".";
  echo '<p>';
  }
 
eXcept disse:
só me mostra o segundo registo :'(

isso é muito estranho...mas tenta substituir o codigo todo pelo codigo que o NoMercy colocou.

PS: se calhar tinhas $ver2 = mysql_fetch_array($verquaissao);
e a seguir meteste o codigo que disse para substituir...por isso deve so ter mostrado o ultimo registo, nao sei se se foi o que se passou...
 
Última edição:
Ah, quase me esquecia:
RTFM!!! :D


ps: Acabei de resolver um problema sem nunca ter programado em php.
ps2: Ok, menti, uma vez fiz um "hello world" :P
 
Mais uma dúvida, sou chato eu sei, qual a sntaxe correcta disto?

Código:
  echo '<a href=activaact.php?ed='$ver2['edid']'>Activar</a>';
 
eXcept disse:
Mais uma dúvida, sou chato eu sei, qual a sntaxe correcta disto?

Código:
  echo '<a href=activaact.php?ed='$ver2['edid']'>Activar</a>';

echo '<a href=activaact.php?ed='.$ver2['edid'].'>Activar</a>';

Usa o "." para concatenar strings.
Ou tb podes usar como o NoMercy fez...mas as vezes é necessario usar " nas strings, ás quais é necessario colocar um "\" antes.
 
Última edição:
funcionou.

eXcept disse:
com o code do NoMercy funcionou... tks :)
com o teu não funcionou devido ao teu ciclo for...next...
embora o codigo do noMercy esteja numa abordagem mais "limpa".


quando escreves-te :

Código:
for ( $i == 1 ; $i <= $tlines ; $i++ ) {

talvez quisesses escrever
Código:
for ( $i = 1 ; $i <= $tlines ; $i++ ) {

descubra as diferenças...
Onde está o wally?
 
Back
Topo