Undefined index: nome PHP
25/06/2019
0
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
Post mais votado
27/06/2019
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.
Leonardo
Mais Posts
25/06/2019
Alex William
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.
25/06/2019
Leonardo
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"]; ?>
26/06/2019
Alex William
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.
26/06/2019
Leonardo
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"];?>
27/06/2019
Alex William
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
27/06/2019
Leonardo
01/07/2019
Leonardo
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.
03/07/2019
Alex William
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
Clique aqui para fazer login e interagir na Comunidade :)