Ir para conteúdo
Fórum Script Brasil
  • 0

Todas as colunas da tabela são retornadas, menos a de id


iNosuKe 么

Pergunta

Estou criando um pequeno crud, em um projeto de controle de usuário. E na lógica de login, possuo um método responsável por fazer uma consulta ao bd, baseada nas informações cedidas no form. A consulta retorna todos os campos, menos o de id.

Segue a classe e o método responsável pela consulta:

<?php

declare(strict_types=1);

namespace app\models;

use app\database\Connection;
use app\database\entyties\User;
use \PDO;
use \PDOException;

class LoginModel
{
    public static function getUser(User $user): ?User
    {
        try {
            $instance = Connection::getInstance();

            $SQL = "SELECT * FROM user u WHERE u.email = :e AND u.password = :p";

            $state = $instance->prepare($SQL);
            $state->bindValue(":e", $user->getEmail());
            $state->bindValue(":p", $user->getPassword());
            $state->execute();

            $result = $state->fetch(PDO::FETCH_ASSOC);

            if ($result) {
                echo "<pre>";
                var_dump($result);
                echo "</pre>";

                exit;


                return new User(
                    $result["email"],
                    $result["password"],
                    $result["name"],
                    $result["id"]
                );
            }

            return null;
        } catch (PDOException $e) {
            echo $e->getMessage();
        }

        return null;
    }
}

A classe User em questão: 

<?php

declare(strict_types=1);

namespace app\database\entyties;

class User
{
    private string $name;
    private string $email;
    private string $password;
    private int $id;

    public function __construct(
        string $email,
        string $password,
        string $name = "",
        int $id = 0
    ) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
        $this->password = $password;
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function setEmail(string $email): void
    {
        $this->email = $email;
    }

    public function getPassword(): string
    {
        return $this->password;
    }

    public function setPassword(string $password): void
    {
        $this->password = $password;
    }
}

 

No debug, a saída é a seguinte: 

array(4) {
  ["id"]=>
  int(2)
  ["name"]=>
  string(7) "Matheus"
  ["email"]=>
  string(15) "teteu@gmail.com"
  ["password"]=>
  string(8) "12345678"
}

O que poderia acarretar esse comportamento? 

Adicional, preview da tabela: 

MariaDB [enose]> describe user;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(50)  | NO   |     | NULL    |                |
| email    | varchar(50)  | NO   |     | NULL    |                |
| password | varchar(255) | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.018 sec)

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Não entendi a sua questão, o id é o primeiro item que aparece no seu depurador.

Mesmo assim, eu gostei do código. Eu nunca tinha visto declare(strict_types=1), eu tirei ele do código, e isso me deu um baita trabalho na hora de criar o public function setId, precisei fazer assim:

public function setId(int $id): int { $this->id=$id; return $id;}

Com essa declaração, você não precisa retornar o $id explicitamente.

Para quem quer fazer o teste, fiz algumas modificações:

arquivo index.php
<?php

declare(strict_types=1);

class User
{
    private string $name, $email, $password;
    private int $id;

    public function __construct(string $name, string $email, string $password, int $id = 0) 
    {
        $this->name = $name;
        $this->email = $email;
        $this->password = $password;
        $this->id = $id;
    }

    public function getId(): int { return $this->id; }
    public function setId(int $id): int { $this->id=$id; }
    public function getName(): string { return $this->name; }
    public function setName(string $name): void { $this->name = $name; }
    public function getEmail(): string { return $this->email; }
    public function setEmail(string $email): void { $this->email = $email; }
    public function getPassword(): string { return $this->password; }
    public function setPassword(string $password): void { $this->password = $password; }
}

class LoginModel
{
    public static function getUser(User $user)
    {
        try {
                $instance = new PDO("mysql:host=localhost;dbname=teste","root","");
                $SQL = "SELECT * FROM user WHERE email = :e AND password = :p";
                $state = $instance->prepare($SQL);
                $state->bindValue(":e", $user->getEmail());
                $state->bindValue(":p", $user->getPassword());
                $state->execute();
                $result = $state->fetch(PDO::FETCH_ASSOC);
                if ($result) 
                { 
                    return new User($result["name"],$result["email"],$result["password"],$result["id"]);
                }
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
    }
}

$user=new User("Matheus","teteu@gmail.com","12345678");
$loggedInUser=LoginModel::getUser($user);
if($loggedInUser)
{
    echo "Você entrou, bem vindo ". $loggedInUser->getName() . "o seu id é " .$loggedInUser->getId();
} else {
    echo "Favor verificar nome e senha";
}

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...