Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Criei esse script para fazer a seguinte função:
Entrar no BD e pegar o nivel do usuario na tabela "cadastro" onde (1=Administrador e 2=Moderador) em seguida checar qual o nivel do usuario e redirecionalo para sua respectiva pagina porém o script não funciona porque?
<?php
require_once("conexao.php");
$nivel = 'nivel';
switch ( $nivel["nivel"])
{
case "1":
{
$pagina = "admin.php";
break;
}
case "2":
{
$pagina = "moderador.php";
break;
}
default:
{
$pagina = "login.php";
break;
}
}
?>olha seu erro
$nivel = 'nivel';
aqui voce declara como $nivel não é uma array.
depois voce usa $nivel["nivel"]. então o resultado sempre sera $pagina = "login.php".
o sistema funciona, o caso é que esta mal trabalhado.
Porque você não estudou absolutamente nada e já quis faze-lo.
Fiz desse jeito agora porém o script não pega o "nivel" na tabela porque?
CREATE TABLE cadastro (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
[color="#FF0000"]nivel enum('1','2') NOT NULL default '2',[/color]email VARCHAR( 200 ) NOT NULL ,login VARCHAR( 200 ) NOT NULL ,senha VARCHAR( 200 ) NOT NULL ,repitasenha VARCHAR( 200 ) NOT NULL
) ENGINE = MYISAM ;
<?php
require_once("conexao.php");
$nivel = $_POST['nivel'];
$paga = "admin.php";
$pagb = "moderador.php";
$pagc = "login.php";
if ( $nivel == 1)
{
header("Location: $paga");
break;
} if( $nivel == 2) {
header("Location: $pagb");
break;
}
else{
header("Location: $pagc");
break;
}
}
?><!doctype html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
</head>
<body>
<fieldset>
<form method="post">
<label for="login">Login</label>
<input type="text" name="login" size="35" />
<label for="senha">Senha</label>
<input type="password" name="senha" size="35" />
<input type="submit" name="doLogin" value="Fazer Login" />
</form>
</fieldset>
<?php
if(isset($_POST['doLogin'])){
$PDO = new PDO( 'mysql:host=localhost;dbname=seu banco', 'root', 'sua senha' );
$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$PDO->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
$PDO->setAttribute( PDO::ATTR_TIMEOUT, 5 );
$SQLUsers = $PDO->prepare( 'SELECT * FROM `cadastro` WHERE `login` = :login AND `senha` = :senha' );
$SQLUsers->bindParam( ':login', $_POST['login'], PDO::PARAM_STR );
$SQLUsers->bindParam( ':senha', $_POST['senha'], PDO::PARAM_STR );
$SQLUsers->execute();
if( $SQLUsers->rowCount() == 1 ){
$Data = $SQLUsers->fetch( PDO::FETCH_ASSOC );
switch( $Data['nivel'] ){
/**
* Se o nível for 1, redireciona para admin.php
*/
case 1:
echo '<meta http-equiv="refresh" content="0;admin.php" />';
#header("Location: admin.php");
break;
/**
* Se o nível for 2, redireciona para moderador.php
*/
case 2:
echo '<meta http-equiv="refresh" content="0;moderador.php" />';
#header("Location: moderador.php");
break;
/**
* default como membro, caso não for nenhum
* dos níveis ..
*/
default:
echo '<meta http-equiv="refresh" content="0;membro.php" />';
#header("Location: membro.php");
break;
}
}
}
?>
</body>
</html>
...Ao invés do case porque não um array e um concat na index do array relativa ao nivel?
define('DEFAULT', 0);
$arr = array( 1 => 'admin', 2 => 'moderador', DEFAULT => 'membro');
//...
header(sprintf('Location: %s.php', $arr[$nivel]));
Fora isso,estuda.
@eibon, boa ídeia, assim não seria necessário mudar o switch toda hora ..
Enfim, sem falar da estrutura da tabela dele, que tá uma porcaria =) :joia:
@Andrey Knupp
Seu script esta com erro nessa linha:
$PDO = new PDO( 'mysql:host=localhost;dbname=cadastro', 'root', '' );
E não é as informações que eu coloquei do meu host.
Tentei fazer assim agora e nada :ermm:
<?php
require_once("conexao.php");
$nivel = $_POST['nivel'];
$paga = "admin.php";
$pagb = "moderador.php";
$pagc = "login.php";
if ( $_SESSION["nivel"] == 1 )
{
header("Location: $paga");
}
else
{
if( $_SESSION["nivel"] == 2) {
header("Location: $pagb");
}
else{
header("Location: $pagc");
}
}
?>Qual o erro ?
~>
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in C:\Arquivos de programas\EasyPHP5.3.0\www\sys\checando.php:18 Stack trace: #0 C:\Arquivos de programas\EasyPHP5.3.0\www\sys\checando.php(18): PDO->__construct('mysql:host=loca...', 'root', '') #1 {main} thrown in C:\Arquivos de programas\EasyPHP5.3.0\www\sys\checando.php on line 18
Depois do visitante logar ele vai pra pagina checando.php pra ver qual o nivel dele na tabela e redirecionalo
Eca, EasyPHP... :huh:
Vá no php.ini, procure por:
;extension=php_pdo_mysql_libmysql.dll
Troque para:
extension=php_pdo_mysql_libmysql.dll
Salve, reinicie o Apache.. execute o script novamente
Funcionou :joia: :clap:
Obrigado pela ajuda Andrey Knupp.
Vo estudar + PHP pra ampliar meus conhecimentos.
@Andrey Knupp
Como você já especifica...
$PDO->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
Não é necessário definir novamente
$Data = $SQLUsers->fetch( );
@Kratos Zohr, isso não é um metodo de busca, é e necessário usar sim o fetch em ambos metodos pois no setAttribute, você so espesifica que você quer os fetch com resultSet com array sem índice, então você força um outro FETCH_ASSOC, para remover as chaves..
@Andrey Knupp
Tem como você tirar essa parte de login no seu codigo? Porque no caso ele tera que fazer o login 2 vezes e a pagina checando.php é só pra verificar o nivel do visitante e redirecionalo somente
Pra que ?, essa pagina já autentica e redireciona ué , se o login estiver errado, ele não tem nen que ir pra outra pagina ..
Mas seu codigo é seguro pra usar em um site?
E pra bloquiar se um moderador tentar após logar entrar na pagina do admin.php?
>
@Kratos Zohr, isso não é um metodo de busca, é e necessário usar sim o fetch em ambos metodos pois no setAttribute, você so espesifica que você quer os fetch com resultSet com array sem índice, então você força um outro FETCH_ASSOC, para remover as chaves..
Sua explicação ficou meio confusa <_<
Testei das duas formas e o resultado é sempre o mesmo
<?php
var_dump( $SQLUsers->fetch( PDO::FETCH_ASSOC ) );
var_dump( $SQLUsers->fetch( ) );
?>
a variável $nivel ta pegando o 'nivel' da onde? formulario?
então tem que ser assim:
sacou?