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

diokhan

registo

15 mensagens neste tópico

Boas,

é possível fazer em php algo do género, uma pessoa faz o registo no site mas só pode fazer login quando o admin do site confirmar o registo?

basicamente a ideia é, quando o utilizador fizer o registo fica com o activo=0 e depois do admin confirmar o registo, o activo do utilizador passa a 1 e assim já tem acesso a fazer login,  antes do admin confirmar o registo não é possível efectuar o login.

:hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca essa indicação na base de dados, adicionando uma coluna com o "estado do registo".

Se preferires, para obter futuramente algumas indicações estatísticas, ao invés de "estado do registo", utiliza informações como "data de registo", "data de confirmação" e/ou "data do último login".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tenho um campo na base de dados que é o ACTIVE que por defeito é 1, e pensei em usar esse campo para fazer esta ideia, se o registo fosse feito pelo utilizador o ACTIVE entrava como 0 e não deixava fazer login ate o admin mudar de ACTIVE=0 para ACTIVE=1.

e se fosse o admin a adicionar um utilizador o ACTIVE ja entrava como 1.

era esta a minha ideia inicial por assim dizer, porque pode existir outra solução melhor que a minha, e desde ja obrigado pela dica :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tenho assim no meu sistema:

register.php

<?php

echo"
<table>
<h2>Register:</h2><hr>
  <form action='admin/insere.php' method='POST'>
    <tr>
      <td>Name:</td>
      <td><input type='text' name='name'></td>
    </tr><tr>
      <td>User:</td>
      <td><input type='text' name='user'></td>
    </tr><tr>
      <td>Password:</td>
      <td><input type='password' name='password'></td>
    </tr><tr>
      <td>Repeat Password:</td>
      <td><input type='password' name='repeatpassword'></td>
    </tr><tr>
      <td>E-Mail:</td>
      <td><input type='text' name='email'></td>
    </tr><tr>
      <td><input type='hidden' name='level' value='1'></td>
    </tr><tr>
      <td><input type='hidden' name='active' value='0'></td>
    </tr><tr>
      <td colspan='2' align='center'>
        <input type='image' src='images/user.png' alt='New User' border='0' id='Submit_btn' value='New User'>
        <input type='image' src='images/cross_shield.png' alt='Clear' value='Clear'>
      </td>
    </tr> 
</form>
</table>";

?>

insere.php

<?php

require_once ('../../BioCantProject/functions.php');

$reg = new Registration;

if ($password == $repeatpassword){

$reg->SetName($name);
$reg->SetUsername($user);
$reg->SetPassword($password);
$reg->SetEmail($email);
$reg->SetAccessLevel($level);
$reg->SetActive($active);
$reg->SetRegister($register);

$error = $reg->InsertUserToSql();

if(!empty($error['2']))
{
echo $error['2'];
}

header('Location: ../../BioCantProject/index.php');

}else{
header('Location: ../../BioCantProject/index.php');
}
?>

e a parte da function que é necessario

class login extends Registration
{
	/**
	 * @return if falis return false if ok return session 
	 */
	function CheckLogin()
	{
		try {
		    $stmt = $this->dbh->prepare("SELECT NAME, ACCESS_LEVEL
				FROM user WHERE USER = :user AND PASSWORD = :password");
			$stmt->bindParam(':user', $this->Username);
			$stmt->bindParam(':password', $this->Password);
			$stmt->execute();
		} catch (PDOException $e) {
		    echo 'Query error: ' . $e->getMessage();
		}

		if($stmt->rowCount() > 0 )
		{	
			$result = $stmt->fetch(PDO::FETCH_BOTH);
			$_SESSION['USER'] = $this->Username;
			$_SESSION['NAME_USER'] = $result[0];
			$_SESSION['ACCESS_LEVEL'] = $result[1];

return true;
		}
		else
		{
			return false;
		}

	}
}

como faço agora para verificar se o ACTIVE é 0 ou 1 antes de efectuar o login? Que so posso deixar fazer o login se tiver o ACTIVE=1

PS: eu pensei em fazer uma coisa, na query SELECT do login colocava mais uma condição no WHERE, algo do género "ACTIVE = 1", é boa politica fazer assim? ou há outra forma melhor? :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para ver se um user ta activo fazes por exemplo

$res = mysql_db_query($base_dados,"SELECT id FROM tabela WHERE pass="{$pass}" AND user="{$user}" AND ACTIVADO='1' LIMIT 1; ");

if( mysql_num_rows($res)==1 )

echo 'activo';

else

echo 'ainda nao activo';

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu usei o WHERE ACTIVE=1 e ficou a funcionar, nao sei se é o mais correcto, mas funciona, é que eu preciso verificar se o ACTIVE ta a 0 ou a 1 antes de deixar efectuar o login, porque so quem tem ACTIVE=1 é que pode fazer o login, mas a tua resposta é boa, vai dar-me jeito quando fizer aparecer na tabela todos os users, e assim posso separar os que tao activos dos que estao inactivos :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

alguém tem alguma sugestão para por exemplo, quando vou apresentar os dados fazer aparecer a vermelho todos os registos que tiverem ACTIVE=0 mas sem usar css externo, fazer tudo no mesmo ficheiro que tenho para apresentar os dados :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No código PHP, não te poderei ajudar muito, até porque também me estou a iniciar nesta linguagem. Mas funcionalmente, poderei apoiar e sugerir que pegues no exemplo do elcsat e desenvolvas uma tabela, em conformidade com o valor obtido pelo ACTIVE.

  • Obtém todos os registos da tabela;
  • Faz um ciclo para cada selecção/registo;
  • Valida o valor de ACTIVE:
    • Se ACTIVE = 0 então desenha a linha da tabela em vermelho;
    • Se ACTIVE = 1 então desenha a linha da tabela em preto;

Se a minha explicação ainda te parece confusa, peço a alguém que tente traduzir para código (como disse, ainda estou a dar os primeiros passos no PHP). Entretanto, estarei a tentar desenvolver para depois postar aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu vou deixar aqui o meu código caso ajude, e desde já agradeço a disponibilidade em ajudarem ;)

<?php

$dsn = 'mysql:dbname=***;host=localhost';
	$user = '***';
	$password = '***';

	try {
	    $dbh = new PDO($dsn, $user, $password);
	    
	} catch (PDOException $e) {
	    echo 'Connection failed: ' . $e->getMessage();
	}

$sql = "SELECT * FROM user";

echo'<table class="tabela">
    <tr>
        <th  align=center>
    		Name
        </th>
       	<th  align=center>
        	E-Mail
       	</th>
       	<th  align=center>
        	Access Level
       	</th>';
        		
/* Verifica nivel de acesso do utilizador. 
        			Apenas quem tem acesso de nivel 2 consegue visualizar estas opções. */
if ($_SESSION['ACCESS_LEVEL']==2){
       	echo'<th  align=center>
       			Active
       		</th>
       		<th  align=center>
       			Edit User
       		</th>
       		<th  align=center>
       			Delete User
       		</th>
       		</tr>';
       		}

foreach ($dbh->query($sql) as $row)
        {
        echo '<tr>
        	<td>';
        		print $row['NAME'];
        	echo'</td>
        	<td>';
        		print $row['EMAIL'];
        	echo'</td>
        	<td  align=center>';
        		print $row['ACCESS_LEVEL'];
        	echo'</td>';
        			
        	/* Verifica nivel de acesso do utilizador. 
        	Apenas quem tem acesso de nivel 2 consegue visualizar estas opções. */
        	if ($_SESSION['ACCESS_LEVEL']==2){
        	echo"
       			<td  align=center>";
        		print $row['ACTIVE'];
        		echo"</td>
        		<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=edit&id=$row[iD_USER]><img src=images/pencil.png border=0 align=center></a>
      			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=delete&id=$row[iD_USER]><img src=images/cross.png border=0 align=center></a>
       			</td>";}
	echo'</tr>';
        }
         
        echo "</table>
        <table align=center>";
		if ($_GET['ot']=='edit'){
			include('edit_user.php');
		}elseif($_GET['ot']=='delete'){
			include('delete.php');
		}
        echo "</table>";
?>

eu não me importo de, em vez de ser o 0 a ficar a vermelho que seja a célula em que está o 0 que mude de cor, se for mais simples :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basta adicionares, onde te parece melhor a validação a ACTIVE. Para manter o que pediste inicialmente, eu colocaria no início de cada <TR>, justamente para que a linha inteira fique com as letras vermelhas:

[...]
foreach ($dbh->query($sql) as $row)
{
if ($row['ACTIVE']==0) {
	echo '<tr style="color:red">'
} else {
	echo '<tr>'
}
   echo '<td>';
[...]

Não testei o código.  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu vou testar e ja digo algo ;)

PS: testei e nao funciona, mas sei o motivo, por causa do css que tenho, ja tinha definido no css

.tabela td
{
background: #66FF99;
}

posso mudar a cor da letra, mas a cor de fundo não aceita por causa do css, para mudar só a cor da letra eu fiz e funciona:

if (($_SESSION['ACCESS_LEVEL']==2)AND ($row['ACTIVE']==0)){
        	echo"
       			<td class=tdactive><font color=red style='font-weight: bold'>";
        		print $row['ACTIVE'];
        		echo"</font>
        		</td>
        		<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=edit&id=$row[iD_USER]><img src=images/pencil.png border=0 align=center></a>
      			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=delete&id=$row[iD_USER]><img src=images/cross.png border=0 align=center></a>
       			</td>";
        	}elseif(($_SESSION['ACCESS_LEVEL']==2)AND ($row['ACTIVE']==1))
        	{
        		echo"
       			<td><font style='font-weight: bold'>";
        		print $row['ACTIVE'];
        		echo"</font>

por enquanto tenho assim, é o básico e simples, mas funciona, se houver outra forma melhor para resolver eu altero e agradeço sugestões ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

agora vou dificultar as coisas eu sei, mas por exemplo, se o ACTIVE for igual a 0 eu queria que o 0 fosse um "link" por assim dizer, e sempre que clico no 0 eu altero na base de dados o ACTIVE de 0 para 1, e vice versa, sempre que clicar no 1 mudo na base de dados para 0.

assim posso activar e desactivar os users de forma rápida e simples, sei que vou dar muitas voltas por causa disto mas pronts :hmm:

PS: ou tao eu crio mais um botao para activar e desactivar os users, assim evito de usar o 0 e o 1 para clicar e alterar, o que seria mais simples e eficaz?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

resolvido todos os problemas. deixo aqui o codigo caso alguem esteja interessado ;)

aqui apresento os dados:

if (($_SESSION['ACCESS_LEVEL']==2)AND ($row['ACTIVE']==0)){
        	echo"
       			<td class=tdactive>
       				<font color=red style='font-weight: bold'>";
        			print $row['ACTIVE'];
        		echo"</font>
        		</td>
        		<td>
        			<a href=restrito.php?opcao=admin&op=users&ot=active&id=$row[iD_USER]><img src=images/delete.png border=0 align=center></a>
        		</td>
        		<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=edit&id=$row[iD_USER]><img src=images/pencil.png border=0 align=center></a>
      			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=delete&id=$row[iD_USER]><img src=images/cross.png border=0 align=center></a>
       			</td>";
        	}elseif(($_SESSION['ACCESS_LEVEL']==2)AND ($row['ACTIVE']==1))
        	{
        		echo"
       			<td>
       				<font style='font-weight: bold'>";
        			print $row['ACTIVE'];
        		echo"</font>
        	</td>
        	<td>
        		<a href=restrito.php?opcao=admin&op=users&ot=deactivate&id=$row[iD_USER]><img src=images/accept.png border=0 align=center></a>
        		</td>
        		<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=edit&id=$row[iD_USER]><img src=images/pencil.png border=0 align=center></a>
      			</td>
       			<td align=center>
       				<a href=restrito.php?opcao=admin&op=users&ot=delete&id=$row[iD_USER]><img src=images/cross.png border=0 align=center></a>
       			</td></tr>";
        	}
        }
        echo "</table>
        <table align=center>";
		if ($_GET['ot']=='edit'){
			include('edit_user.php');
		}elseif($_GET['ot']=='delete'){
			include('delete.php');
		}elseif($_GET['ot']=='deactivate'){
			include('deactivate.php');
		}elseif($_GET['ot']=='active'){
			include('active.php');
		}

        echo "</table>";

e aqui altero os dados e volto a pagina anterior:

$dsn = 'mysql:dbname=***;host=localhost';
	$user = '***';
	$password = '***';

	try {
	    $dbh = new PDO($dsn, $user, $password);
	    
	} catch (PDOException $e) {
	    echo 'Connection failed: ' . $e->getMessage();
	}
try{
	$stmt = $dbh->prepare("UPDATE user SET ACTIVE = 0 WHERE ID_USER = :id");

		$stmt->bindParam(':id', $_GET['id']);
		$stmt->execute();

	}
catch ( PDOException $e )
	{ echo "Error: ".$e->getMessage(); 
	}

header('Location: ../BioCantProject/restrito.php?opcao=admin&op=users');

este é o codigo para desactivar, mas para activar é so trocar o 0 por 1,

$stmt = $dbh->prepare("UPDATE user SET ACTIVE = 1 WHERE ID_USER = :id");

e obrigado pela ajuda ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gostava de sugerir algumas melhorias no código:

if (($_SESSION['ACCESS_LEVEL']==2){
echo"
<td class=tdactive>
<font color=red style='font-weight: bold'>";
print $row['ACTIVE'];
echo"</font>
</td>
<td>"
if ($row['ACTIVE']==0)) {
	echo "<a href=restrito.php?opcao=admin&op=users&ot=change&act=0&id=$row[iD_USER]><img src=images/delete.png border=0 align=center></a>"
} else {
	echo "<a href=restrito.php?opcao=admin&op=users&ot=change&act=1&id=$row[iD_USER]><img src=images/accept.png border=0 align=center></a>"
}
echo "</td>
<td align=center>
<a href=restrito.php?opcao=admin&op=users&ot=edit&id=$row[iD_USER]><img src=images/pencil.png border=0 align=center></a>
</td>
<td align=center>
<a href=restrito.php?opcao=admin&op=users&ot=delete&id=$row[iD_USER]><img src=images/cross.png border=0 align=center></a>
</td>";
}
}
echo "</table>
<table align=center>";
if ($_GET['ot']=='edit'){
include('edit_user.php');
}elseif($_GET['ot']=='delete'){
include('delete.php');
}elseif($_GET['ot']=='change'){
include('change.php');
}

echo "</table>";

change.php

$dsn = 'mysql:dbname=***;host=localhost';
$user = '***';
$password = '***';

try {
$dbh = new PDO($dsn, $user, $password);

} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
try{
if($act==0) {
	$stmt = $dbh->prepare("UPDATE user SET ACTIVE = 1 WHERE ID_USER = :id");
} else {
	$stmt = $dbh->prepare("UPDATE user SET ACTIVE = 0 WHERE ID_USER = :id");
}

$stmt->bindParam(':id', $_GET['id']);
$stmt->execute();

}
catch ( PDOException $e )
{ echo "Error: ".$e->getMessage();
}

header('Location: ../BioCantProject/restrito.php?opcao=admin&op=users');

O que achas?

O código não foi testado, nem sequer posso garantir que não existam erros...No PHP apenas dou babysteps;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se bem percebi a ideia, tu juntas-te o que eu fiz em dois ficheiros em apenas um, é uma hipótese, e assim ficava com menos ficheiros, não vejo erros assim numa análise por cima, deve estar a funcionar, vou testar, e obrigado pela sugestão ;)

PS: a tua sugestão para alterar o código funciona, só há uma crise, qualquer valor tanto 1 como 0 aparece a vermelho, mas é algo que eu vou tentar alterar, obrigado pela ajuda ;)

PS2: já alterei o que disse no PS anterior, deixo aqui o código alterado

if ($_SESSION['ACCESS_LEVEL']==2)
        	{
        echo"
	        <td>";
	        if ($row['ACTIVE']==0) 
	        {
	        echo "<font color=red style='font-weight: bold'>";
	        	print $row['ACTIVE'];
	        echo "</font>";
	        } else {
	        echo "<font style='font-weight: bold'>";
	        	print $row['ACTIVE'];
	        echo "</font>";
        		}
        	}

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