<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luiz Amaro</title>
    <description>The latest articles on DEV Community by Luiz Amaro (@luizamaro11).</description>
    <link>https://dev.to/luizamaro11</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1145626%2Fb4727595-0e1b-4afe-8917-87faabf26b2d.jpeg</url>
      <title>DEV Community: Luiz Amaro</title>
      <link>https://dev.to/luizamaro11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luizamaro11"/>
    <language>en</language>
    <item>
      <title>Sistema administrativo desenvolvido com programação estrutural em PHP</title>
      <dc:creator>Luiz Amaro</dc:creator>
      <pubDate>Mon, 04 Sep 2023 17:34:59 +0000</pubDate>
      <link>https://dev.to/luizamaro11/sistema-administrativo-desenvolvido-com-programacao-funcional-em-php-1hoi</link>
      <guid>https://dev.to/luizamaro11/sistema-administrativo-desenvolvido-com-programacao-funcional-em-php-1hoi</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A um tempo atras eu publiquei no meu LinkedIn falando que começaria um novo projeto onde eu pegaria um sistema feito no meu TCC e começaria 100% do 0 com o PHP, porém dessa vez começaria o projeto da forma mais amadora possível e aos poucos iria profissionalizando o projeto utilizando os recursos do PHP e desenvolvendo o PHP do jeito certo. E faria alguns posts por aqui documentando o projeto.&lt;br&gt;
E nesse post irei mostrar como eu fiz utilizando apenas a programação estrutural do PHP, sem autoload, PSRs, composer, orientação a objetos e etc...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77s897xvsbprsxokusj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77s897xvsbprsxokusj7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Sobre o projeto
&lt;/h2&gt;

&lt;p&gt;Mas antes de mostrar como foi feito vamos falar sobre o sistema.&lt;/p&gt;

&lt;p&gt;O sistema é basicamente um sistema de gerenciamento de quiosque, onde ele tem a parte administrativa e o app de fato. O app tem como objetivo auxiliar as atividades do garçom e da cozinha. Então o garçom poderá através do app selecionar a mesa que o cliente está, e criar um pedido e adicionar os produtos no pedido, ao adicionar o pedido ele irá diretamente para o histórico de pedidos, que a cozinha irá acompanhar e quando finalizar o pedido irá atualizar automaticamente no estoque a quantidade que tem daquele produto.&lt;/p&gt;

&lt;p&gt;Já na parte administrativa o usuário poderá criar as mesas e colocar uma numeração, cadastrar os funcionários que trabalham no quiosque e cadastrar os produtos. Um sistema bem simples, porém que tem o objetivo de ajudar a gerenciar um quiosque com mais facilidade.&lt;/p&gt;

&lt;p&gt;Obs: nesse post irei mostrar apenas a parte administrativa desenvolvido e nos próximos irei mostrar como foi feito o app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Sistema de login
&lt;/h2&gt;

&lt;p&gt;Primeiro começarei mostrando como foi realizado o sistema de login.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cadastro do usuário
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohdyp1wx34bryaoa87zt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohdyp1wx34bryaoa87zt.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom na parte do cadastro, como vocês podem ver na imagem, teremos esses campos.&lt;/p&gt;

&lt;p&gt;Então para fazer os cadastro do usuário no sistema, criei um arquivo .php e comecei nele trazendo as configurações para fazer a conexão com o banco de dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

define('DB_SERVER', '');
define('DB_USERNAME', '');
define('DB_PASSWORD', '');
define('DB_NAME', '');

try {
    $pdo = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD);
    $pdo-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Não foi possível conectar." . $e-&amp;gt;getMessage());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é o conteúdo do arquivo de configurações e ele será requirido em todos os meus arquivos .php que faz a conexão com o banco de dados, nesse caso se eu tivesse utilizando o autoload não seria necessário, eu colocaria esse arquivo no composer.json e iria fazer automaticamente, mas como disse, irei evoluindo o projeto ao longo dos posts.&lt;/p&gt;

&lt;p&gt;Depois disso faço uma verificação se o method request é um POST e armazeno os dados que o usuário preenche nas variáveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // limpa o input
    $name = htmlspecialchars($_POST["name"]);
    $phone = htmlspecialchars($_POST["phone"]);
    $username = htmlspecialchars($_POST["username"]);
    $accessLevel = htmlspecialchars($_POST["access_level"]);
    $email = htmlspecialchars($_POST["email"]);
    $password = htmlspecialchars($_POST["password"]);
    $confirmPassword = htmlspecialchars($_POST["confirm_password"]);

    // variaveis de erro
    $errors = [];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, faço algumas verificação em algumas variáveis para verificar se por exemplo, se os campos está vazio, ou se o campo está com a formatação correta, ou no caso do username, email e senha se ele já está em uso. Segue o exemplo de um dos campos abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Validar nome de usuário
    if (empty($username)) {
        $errors[] = "Por favor coloque um nome de usuário.";
    } elseif (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
        $errors[] = "O nome de usuário pode conter apenas letras, números e sublinhados.";
    } else {

        // Prepare uma declaração selecionada
        $sql = "SELECT id FROM users WHERE user = :user";

        if ($stmt = $pdo-&amp;gt;prepare($sql)) {
            // Vincule as variáveis à instrução preparada como parâmetros
            $stmt-&amp;gt;bindParam(":user", $username, PDO::PARAM_STR);

            // Tente executar a declaração preparada
            if ($stmt-&amp;gt;execute()) {
                if ($stmt-&amp;gt;rowCount() == 1) {
                    $errors[] = "Este nome de usuário já está em uso.";
                }
            } else {
                echo "Ops! Algo deu errado. Por favor, tente novamente mais tarde.";
            }

            // Fechar declaração
            unset($stmt);
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E caso alguma verificação de falso, salvo na variável de errors, após essas verificações verifico essa variável de errors que nesse caso fiz como um array, e se estiver vazio dou continuidade, fazendo assim de fato o cadastro do usuário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Verifique os erros de entrada antes de inserir no banco de dados
    if (empty($errors)) {

        // Prepare uma declaração de inserção
        $sql = "INSERT INTO users (name, phone, email, password, user, access_level) VALUES (:name, :phone, :email, :password, :user, :access_level)";

        $password = password_hash($password, PASSWORD_DEFAULT);

        if($stmt = $pdo-&amp;gt;prepare($sql)){
            // Vincule as variáveis à instrução preparada como parâmetros
            $stmt-&amp;gt;bindParam(":name", $name, PDO::PARAM_STR);
            $stmt-&amp;gt;bindParam(":phone", $phone, PDO::PARAM_STR);
            $stmt-&amp;gt;bindParam(":email", $email, PDO::PARAM_STR);
            $stmt-&amp;gt;bindParam(":password", $password, PDO::PARAM_STR);
            $stmt-&amp;gt;bindParam(":user", $username, PDO::PARAM_STR);
            $stmt-&amp;gt;bindParam(":access_level", $accessLevel, PDO::PARAM_STR);

            // Tente executar a declaração preparada
            if ($stmt-&amp;gt;execute()) {
                //Redirecionar para a página de login
                header("location: ../../src/index.html");
            } else {
                echo "Ops! Algo deu errado. Por favor, tente novamente mais tarde.";
            }

            // Fechar declaração
            unset($stmt);
        }
    }

    // Fechar conexão
    unset($pdo);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Login
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr39c7cxiufk8zf3xn7bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr39c7cxiufk8zf3xn7bg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o usuário cadastrado partiremos para o arquivo que faz algumas verificações e se tudo estiver certo fazendo o login no sistema.&lt;/p&gt;

&lt;p&gt;Antes de tudo, inicio a sessão de variáveis globais e verifico se já existe a variável global de login como true, caso esteja true será redirecionado automaticamente para dentro do sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Inicialize a sessão
session_start();

// Verifique se o usuário já está logado, em caso afirmativo, redirecione-o para a página de boas-vindas
if (isset($_SESSION["loggedin"]) &amp;amp;&amp;amp; $_SESSION["loggedin"] === true) {
    header("location: ../../src/widgets/tables/tables.php");
    exit;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, faz algo bem parecido com o de registro, verifica o method request, captura os dados do input e salva na variável, verifica se eles estão vazios, caso esteja preenche o erro na variável de errors, depois verifica a variável, e se estiver vazio consulta o usuário e verifica se a senha está correto e se o usuário é um administrador(já que só o administrador tem permissão de entrar) e caso esteja, realiza o login e cria a variável global de login deixando como true.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Processando dados do formulário quando o formulário é enviado
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // limpa o input
    $username = htmlspecialchars($_POST["username"]);
    $password = htmlspecialchars($_POST["password"]);

    $errors = [];

    // Verifique se o nome de usuário está vazio
    if (empty($username)) {
        $errors[] = "Por favor, insira o nome de usuário.";
    }

    // Verifique se a senha está vazia
    if (empty($password)) {
        $errors[] = "Por favor, insira sua senha.";
    }

    // Validar credenciais
    if (empty($errors)) {

        // Prepare uma declaração selecionada
        $sql = "SELECT id, user, password, access_level FROM users WHERE user = :user";

        if ($stmt = $pdo-&amp;gt;prepare($sql)) {

            // Vincule as variáveis à instrução preparada como parâmetros
            $stmt-&amp;gt;bindParam(":user", $username, PDO::PARAM_STR);

            // Tente executar a declaração preparada
            if ($stmt-&amp;gt;execute()) {

                // Verifique se o nome de usuário existe, se sim, verifique a senha
                if ($stmt-&amp;gt;rowCount() == 1) {

                    if ($row = $stmt-&amp;gt;fetch()) {
                        $id = $row["id"];
                        $username = $row["user"];
                        $hashed_password = $row["password"];
                        $accessLevel = $row["access_level"];

                        if (password_verify($password, $hashed_password) &amp;amp;&amp;amp; $accessLevel == "administrador") {

                            // A senha está correta, então inicie uma nova sessão
                            session_start();

                            // Armazene dados em variáveis de sessão
                            $_SESSION["loggedin"] = true;
                            $_SESSION["id"] = $id;
                            $_SESSION["username"] = $username;                            

                            // Redirecionar o usuário para a página de boas-vindas
                            header("location: ../../src/widgets/tables/tables.php");
                        } else {
                            // A senha não é válida, exibe uma mensagem de erro genérica
                            $errors[] = "Nome de usuário ou senha ou nivel de acesso inválidos.";
                        }
                    }
                } else {
                    // O nome de usuário não existe, exibe uma mensagem de erro genérica
                    $errors[] = "Nome de usuário ou senha inválidos.";
                }
            } else{
                echo "Ops! Algo deu errado. Por favor, tente novamente mais tarde.";
            }

            // Fechar declaração
            unset($stmt);
        }
    }

    // Fechar conexão
    unset($pdo);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Logout
&lt;/h3&gt;

&lt;p&gt;E por ultimo mostrarei o arquivo de logout, onde basicamente ele destrói todas as variáveis globais e redireciona para o login.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
// Inicialize a sessão
session_start();

// Remova todas as variáveis de sessão
$_SESSION = array();

// Destrua a sessão.
session_destroy();

// Redirecionar para a página de login
header("location: ../../src/index.html");
exit;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Bom esse basicamente foi um sistema de login feito apenas com o PHP utilizando a programação estrutural e o PDO. além do login fiz o crud básico de cadastro das mesas, listagens dos usuários e edição, e crud dos produtos, pórem como os arquivos basicamente eram bem parecidos com o que mostrei no sistema de login, apenas mudando as tabelas, os campos e claro o tipo de consulta, decide não colocar para não ficar muito grande o post(mais do que já está haha), mas caso queiram que eu faça um post mostrando o CRUD também, deixem nos comentários e também claro, sugestões, correções e etc...&lt;/p&gt;

&lt;p&gt;Nos próximos post, mostrarei o projeto agora com algumas melhorias como por exemplo ele feito orientado a objeto e autoload/psr-4.&lt;/p&gt;

</description>
      <category>php</category>
      <category>web</category>
    </item>
  </channel>
</rss>
