Undefined index: nome PHP

MySQL

PHP

25/06/2019

Prezados, bom dia.
conforme título acima, não sei como resolver.
Trata-se de logar no sistema, o mesmo abre uma sessão pegando 3 itens: "nome, usuário e senha", abaixo mostrarei o código da função para melhor entendimento:

public function logar($usuario, $senha) {
global $pdo;

$sql = $pdo->prepare("SELECT nome,usuario,nivel FROM usuarios WHERE usuario = :u AND senha = :s AND ativo = 1 LIMIT 1");
$sql->bindValue(":u",$usuario);
$sql->bindValue(":s",sha1($senha));
$sql->execute();
$dado = $sql->fetch(PDO::FETCH_ASSOC);
session_start();
$_SESSION["nome"] = $dado['nome'];$_SESSION["usuario"] = $dado['usuario'];$_SESSION["nivel"] = $dado['nivel'];
$nivel = $_SESSION['nivel'];

if(isset($nivel))
{ //entrar no sistema (sessao)

switch($nivel)
{
case '3': echo "<br />"."nivel 0 confirmado!"; break;
case '1': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
case '2': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
}
return true; //cadastrado com sucesso
}
else
{ //nao foi possivel logar
return false;session_destroy();exit;
}

ele faz o login normalmente no sistema, e deveria mostrar o nome de quem está logado e nível de usuário, mas não é o que acontece e sim dá o erro descrito no título tanto para nome quanto para nível... podem me ajudar??
Leonardo

Leonardo

Curtidas 0

Melhor post

Leonardo

Leonardo

27/06/2019

Boa Tarde Alex,

esta é a sequencia das pastas:

localhost/Bycase/modulos/comercial/home.php

OBS: dentro da pasta comercial está a pasta Classes e as páginas php (home.php por exemplo).

eu também uso o vscode e xampp.

fiz algumas alterações...

public function logar($usuario, $senha) {
global $pdo;

try{
$sql = $pdo->prepare("SELECT nome,usuario,nivel FROM usuarios WHERE usuario = :u AND senha = :s AND ativo = 1 LIMIT 1");
$sql->bindValue(":u",$usuario);
$sql->bindValue(":s",sha1($senha));
$sql->execute();
$dado = $sql->fetch(PDO::FETCH_ASSOC);

if($sql->rowCount() == 1)
{ //entrar no sistema (sessao)
session_start();

$_SESSION["nome"] = $dado["nome"];
$_SESSION["usuario"] = $dado["usuario"];
$_SESSION["nivel"] = $dado["nivel"];
$nivel = $_SESSION["nivel"];

switch($nivel)
{
case '3': echo "<br />"."nivel 0 confirmado!"; break;
case '1': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
case '2': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
}
return true; //cadastrado com sucesso
}
else
{ //nao foi possivel logar
unset ($_SESSION['usuario']);
unset ($_SESSION['senha']);
header('location:login.php');
}
}catch(Exception $e){
$msgErro = $e->getMessage();
}

}
Na pasta home está assim:

<?php include 'classes/usuarios.php';
session_start();$usuario_online = $_SESSION["nome"]; $nivel = $_SESSION["nivel"];?>

nao sei usar o github kkkkkkkkkkk... forte abraço.
GOSTEI 1

Mais Respostas

Alex William

Alex William

25/06/2019

Olá amigo, tudo bem?

No trecho de codigo abaixo:
$_SESSION["nome"] = $dado["nome"];$_SESSION["usuario"] = $dado["usuario"];$_SESSION["nivel"] = $dado["nivel"];
$nivel = $_SESSION["nivel"]; 


Coloque um "foreach" dessa forma:
foreach ($dado as $user) {
        $_SESSION["nome"] = $user["nome"];
        $_SESSION["usuario"] = $user["usuario"];
        $_SESSION["nivel"] = $user["nivel"];
        $nivel = $_SESSION["nivel"]; 
}



Veja se dessa forma funciona.

Se não funcionar, poste o erro. Obrigado.

Espero ter ajudado.
GOSTEI 0
Leonardo

Leonardo

25/06/2019

olá Alex William, estou bem e vc??

então segue o erro que deu depois que coloquei o foreach:

Notice: Undefined index: nome in C:\\xampp\\htdocs\\Bycase\\Modulos\\comercial\\home.php on line 2

Notice: Undefined index: nivel in C:\\xampp\\htdocs\\Bycase\\Modulos\\comercial\\home.php on line 2

abaixo é o código referente a pagina home.php linha 2:

1 <?php include 'classes/usuarios.php'; $u=new Usuario; $u=new Usuario; $u->conectar("bycase", "localhost", "root", "");
2 session_start(); $usuario_online = $_SESSION["nome"]; $nivel = $_SESSION["nivel"]; ?>
GOSTEI 0
Alex William

Alex William

25/06/2019

Olá jovem. Estou bem, obrigado por perguntar.

Primeiro, acredito que você tenha que dar um nome pra sua sessão.

Segundo, você ja estanciou a sessão no foreach da pagina anterior, então não precisa chamar mais o session_start porque senão ele vai estanciar uma nova sessão vazia.

O que voce pode fazer:

Comente o session_Start da linha 2 e veja se funciona.

Poste o erro que gerar. Obrigado.
GOSTEI 0
Leonardo

Leonardo

25/06/2019

Alex boa tarde,
então fiz como recomendou, e continua com o problema da variável indefinida:

Notice: Undefined variable: _SESSION in C:\\xampp\\htdocs\\Bycase\\Modulos\\comercial\\home.php on line 2

Notice: Undefined variable: _SESSION in C:\\xampp\\htdocs\\Bycase\\Modulos\\comercial\\home.php on line 2

revendo o código:


Conexão com banco de dados:

class Usuario {
private $pdo;
public $msgErro = "";

public function conectar($nome, $host, $usuario, $senha) {
global $pdo;
try {$pdo = new PDO("mysql:dbname=" . $nome . ";host=" . $host, $usuario, $senha);}
catch (PDOException $u) {$msgErro = $u->getMessage();}
}

public function logar($usuario, $senha) {
global $pdo;

$sql = $pdo->prepare("SELECT nome,usuario,nivel FROM usuarios WHERE usuario = :u AND senha = :s AND ativo = 1 LIMIT 1");
$sql->bindValue(":u",$usuario);
$sql->bindValue(":s",sha1($senha));
$sql->execute();
$dado = $sql->fetch(PDO::FETCH_ASSOC);

if($sql->rowCount() == 1)
{ //entrar no sistema (sessao)
session_start();
foreach ($dado as $user) {
$_SESSION["nome"] = $user["nome"];
$_SESSION["usuario"] = $user["usuario"];
$_SESSION["nivel"] = $user["nivel"];
$nivel = $_SESSION["nivel"];
}
switch($nivel)
{
case '3': echo "<br />"."nivel 0 confirmado!"; break;
case '1': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
case '2': echo "<script>window.location='modulos/comercial/home.php'</script>"; break;
}
return true; //cadastrado com sucesso
}
else
{ //nao foi possivel logar
unset ($_SESSION['usuario']);
unset ($_SESSION['senha']);
header('location:index.php');
}
}



}

e na página home está assim:

<?php include 'classes/usuarios.php';$u=new Usuario; $u->conectar("bycase", "localhost", "root", "");
$usuario_online = $_SESSION["nome"]; $nivel = $_SESSION["nivel"];?>


GOSTEI 0
Alex William

Alex William

25/06/2019

Olá, Leonardo.

Bem, eu coloquei seu codigo no VSCode e executei no xampp.

Dessa forma que eu vou lhe passar, funcionou.

usuario.php
<?php

    class Usuario {
        private $pdo;
        public $msgErro = "";

        public function conectar($nome, $host, $usuario, $senha) {
            global $pdo;
            try {
                $pdo = new PDO("mysql:dbname=" . $nome . ";host=" . $host, $usuario, $senha);
            }catch (PDOException $u) {
                $msgErro = $u->getMessage();
            }
        }

        public function logar($usuario, $senha) {
            global $pdo;

            try{

                $sql = $pdo->prepare("SELECT nome,usuario,nivel FROM usuarios WHERE usuario = :u AND senha = :s AND ativo = 1 LIMIT 1");
                $sql->bindValue(":u",$usuario);
                $sql->bindValue(":s",sha1($senha));
                $sql->execute();
                $dado = $sql->fetch(PDO::FETCH_ASSOC);

                if($sql->rowCount() == 1) { 
                    //entrar no sistema (sessao)
                    session_start();
                    $_SESSION["nome"] = $dado['nome'];
                    $_SESSION["usuario"] = $dado["usuario"];
                    $_SESSION["nivel"] = $dado["nivel"];
                    $nivel = $_SESSION["nivel"];

                    switch($nivel) {
                        case '3': 
                            echo "<br />"."nivel 0 confirmado!"; 
                            break;

                        case '1': 
                            echo "<script>window.location='modulos/comercial/home.php'</script>"; 
                            break;

                        case '2': 
                            echo "<script>window.location='modulos/comercial/home.php'</script>"; 
                            break;
                    }
                    
                    return true; //cadastrado com sucesso

                }else { 
                    //nao foi possivel logar
                    unset ($_SESSION['usuario']);
                    unset ($_SESSION['senha']);
                    header('location:index.php');
                }

            }catch(Exception $e){
                $msgErro = $e->getMessage();
            }
        }
    }
?>


index.php -> essa eu fiz pra chamar seu logar e ver se funcionaria.
<?php 
    include 'Classes/usuario.php';
    
    $u=new Usuario; 
    
    $u->conectar("teste", "localhost", "root", "");
    
    $u->logar("alex", "1234");

?>


home.php
<?php 
    include '../../Classes/usuario.php';
    
    $u=new Usuario; 
    
    $u->conectar("teste", "127.0.0.1", "navicat", "emed01");

    session_start();

    echo "Nome = ".$usuario_online = $_SESSION["nome"]."<br>"; 
    echo "Nivel = ". $nivel = $_SESSION["nivel"];
?>


Minha pasta deste projeto esta assim:
[Pasta_Raiz]
->Classes
->->usuario.php

->modulos
->->comercial
->->->home.php

Como meu arquivo usuario esta em uma pasta diferente, se eu colocar include("Classes/usuario.php"); ele vai procurar dentro da pasta atual a pasta classes, no caso da home.php ele vai procurar dentro da pasta comercial uma pasta Classe, que não existe.

Então colocar ../../ me faz navegar duas pastas para tras, até a pasta raiz e ai sim procurar a pasta Classes.

A principio desta forma, aqui ele printou meu usuario e nivel na tela.

Se continuar dando erro, você poderia upar seu codigo no github e me passar o link para eu ver a forma como voce dispos as pastas e os codigos?

pode me mandar por email se sim: alex.william@outlook.com

Espero ter ajudado. :D

GOSTEI 0
Leonardo

Leonardo

25/06/2019

Boa tarde Alex, irei testar e lhe darei uma resposta.. muito obrigado mais uma vez.
GOSTEI 0
Leonardo

Leonardo

25/06/2019

Oi Alex bom dia,
fiz como recomendou e mesmo assim não tive êxito,
minha intenção é que usuário faça o login e dentro da função que faz a verificação abra a sessão e me retorne a sessão com os dados do usuário e nível. entende.
GOSTEI 0
Alex William

Alex William

25/06/2019

Oi Alex bom dia,
fiz como recomendou e mesmo assim não tive êxito,
minha intenção é que usuário faça o login e dentro da função que faz a verificação abra a sessão e me retorne a sessão com os dados do usuário e nível. entende.


Então amigo, sempre que for iniciar a sessão, precisa iniciar o nome dela. Senão o navegador vai iniciar nova sessão toda hora.
<?php
session_name("minha_sessao");
session_start();
?>


Dessa forma, ele sempre vai iniciar a sessão certa e te trazer os dados da sessão.

Se você colocar somente session_start() ele vai iniciar uma sessão generica, e quando você tentar startar novamente ele não vai saber que sessão iniciar e vai iniciar outra sessão vazia.

Espero ter ajudado. :D
GOSTEI 1
Leonardo

Leonardo

25/06/2019

Prezado, muito obrigado, deu certo aqui.. forte abraço.
GOSTEI 0
POSTAR