Jump to content

michelmir

Members
  • Content count

    19
  • Joined

  • Last visited

Community Reputation

0 Comum

About michelmir

Recent Profile Visitors

335 profile views
  1. michelmir

    Sistema de login com PHP

    Como forma de aprimoramento e segurança é importante que o seu código se previna de SQL injection que é um tipo de ameaça de segurança que interage com dados através de comandos SQL, onde o atacante consegue inserir uma instrução SQL personalizada e indevida dentro de uma consulta query (SELECT/UPDATE) através de formulários ou URL de uma aplicação por exemplo. No caso, para o PHP, você pode montar o seu script baseando-se em prepared statements que no caso, segundo manual do PHP, consiste em dois estágios: preparar e executar. No estágio de preparação, um modelo de instrução é enviado ao servidor de banco de dados. O servidor executa uma verificação de sintaxe e inicializa os recursos internos do servidor para uso posterior. Isso é uma forma segura de evitar o SQL Injection. Abaixo segue um exemplo de um script que tem a função de realizar um login depois que o usuário inseri os dados de acesso: $message = ''; if(isset($_POST["login"])) { $query = " SELECT * FROM register_user WHERE user_email = :user_email "; $statement = $connect->prepare($query); $statement->execute( array( 'user_email' => $_POST["user_email"] ) ); $count = $statement->rowCount(); if($count > 0) { $result = $statement->fetchAll(); foreach($result as $row) { if($row['user_email_status'] == 'verified') { if(password_verify($_POST["user_password"], $row["user_password"])) //if($row["user_password"] == $_POST["user_password"]) { $_SESSION['user_id'] = $row['register_user_id']; $_SESSION['userName'] = $row['user_name']; header("location: minha-conta.php"); } else { $message = "<label>Senha incorreta</label>"; } } else { $message = "<label class="text-danger">Ative a sua conta clicando no link de ativação enviado para o e-mail de cadastro</label>"; } } } else { $message = "<label class="text-danger">E-mail de cadastro incorreto</label>"; } } Observe que a variável $query é preparada e depois executada no formato abaixo: $statement = $connect->prepare($query); $statement->execute( array( 'user_email' => $_POST["user_email"] ) ); Outro ponto importante para um sistema de login é a validação do e-mail cadastrado. Dessa forma a autenticação de um e-mail válido seria mais eficiente pois é uma das maneiras de autenticar e validar o cadastro com um e-mail válido. Além dessas formas aqui citadas, é importante também criar mecanismos de validação de campos para verificar se as informações inseridas dentro de um campo por um usuário por exemplo, estão corretas antes de serem enviadas para o banco de dados. Um exemplo poderia ser o campo CPF/CNPJ. Se nesses campos não houver um código jquery por exemplo, validando um número cpf o ucnpj, o banco de dados poderá receber qualquer sequência de números "sujando", digamos assim, o seu banco de dados com dados incorretos. Por fim, criei um exemplo de um sistema simples de login, validação de e-mail usando a biblioteca PHPmailer e ativação de conta onde você pode baixar e fazer testes com ele. No mais, sucesso aí.
  2. Que bom que funcionou. Sucesso aí
  3. Quais são as colunas após a coluna "premium_points? Quanto a $_session[' '], dentro da mesma deverá conter algum nome que deve estar relacionado a algum valor dentro da tabela accounts. Normalmente é uma foreingKey. Outro ponto é verificar se o usuário logado contém pontos. Observei que na primeira imagem que você enviou, alguns usuários estão com a pontuação zerada. No caso você esta logado com alguma conta que possui pontos? Por fim, vamos testando as possibilidades baseando-se no que falamos aqui
  4. Tente fazer o seguinte: Selecione exatamente a parte do código do formulário contato abaixo: <div class="container-login100-form-btn"> <button type="submit" class="login100-form-btn"> Enviar </button> </div> <br> <div class="container-login100-form-btn"> <button type="reset" class="login100-form-btn"> Limpar Campos </button> </div> Em seguida, por cima dessa seleção que você fez, cole o script abaixo: <?php $db = new PDO('mysql:host=localhost;dbname=sistema', 'user', 'pass'); $sth = $db->prepare("SELECT premium_points FROM accounts WHERE userFK = ".$_SESSION["nickname"].""); $sth->execute(); $result = $sth->fetchColumn(); if ($result < 1): ?> <h6>Você não possui pontos suficientes para comentar</h6> <div class="container-login100-form-btn"> <button type="submit" class="login100-form-btn" disabled>Enviar</button> </div> <br> <div class="container-login100-form-btn"> <button type="reset" class="login100-form-btn" disabled>Limpar Campos</button> </div> <?php else: ?> <div class="container-login100-form-btn"> <button type="submit" class="login100-form-btn" >Enviar</button> </div> <br> <div class="container-login100-form-btn"> <button type="reset" class="login100-form-btn" >Limpar Campos</button> </div> <?php endif ?> O script acima desabilitará os botões "Enviar" e "Limpar Campos" caso o usuário tenha zero premium_points, caso contrário os botões "Enviar" e "Limpar Campos" estarão habilitados. Lembrando que você deve inserir as informações de conexão do banco de dados bem como se atentar para a parte da query "WHERE userFK" ser exatamente o nome da coluna da tabela "accounts" que armazena o ID do usuário cadastrado bem como o "$_SESSION["nickname"]" estar relacionado ao ID do usuário também. Dessa forma o resultado retornado estará relacionado ao usuário logado
  5. michelmir

    menu prsonalzado no bootstrap

    Seria algo similar a este exemplo? Também no site do Getty Image, o navbar deles utiliza collapse sidebar. Seria mais ou menos isso?
  6. michelmir

    Error Cookie de navegador

    Olá! Isso esta relacionado com a interação entre o navegador e o seu site, porém não quer dizer que o mesmo pode estar com problemas. Neste link aqui do stackoverflow, um usuário questiona o problema e recebe uma resposta do Google Lab a respeito. Esta em inglês mas se fuçar acho que pode encontrar algo a respeito que retire este aviso do console ou acrescente alguma linha no seu código.
  7. Então, basicamente você deverá criar um script php que tenha a função de atualizar os pontos do usuário quando o mesmo clicar no botão 'enviar comentário'. Pelo que entendi, você mencionou que existem outros bancos de dados que estão conectados entre-si neste projeto, correto? ou seria apenas um banco de dados com todas as tabelas nele? De qualquer forma, ambas as situações você deverá se atentar na forma como o script se conecta a esses banco de dados configurando o script de conexão conforme as suas configurações bem como a query SELECT e UPDATE. Abaixo, segue um script que atualiza a pontuação 'premium_points' da tabela 'accounts': Nome: update-pontos.php <?php // Initialize the session session_start(); $db = new PDO('mysql:host=localhost;dbname=', 'user', 'pass'); $sth = $db->prepare("SELECT premium_points FROM accounts WHERE userFK = ".$_SESSION["nickname"].""); $sth->execute(); $result = $sth->fetchColumn(); $pontos = $result - 1; $st = $db->prepare("UPDATE accounts SET premium_points = $pontos WHERE userFK = ".$_SESSION["nickname"].""); $st->execute(); $db = null; ?> Repare que na query 'WHERE userFK' você deve sustituir o 'userFK' pelo nome da coluna que armazena o id do usuário correspondente dentro dessa tabela 'accounts', ou seja, seria uma foreing key (FK) dentro da tabela 'accounts', pois na imagem que você postou não dá pra ver como se chama a coluna do ID do usuário nesta tabela. Outro ponto é o $_SESSION. No caso reparei que existe um '$_SESSION['nickname']'. O $_SESSION deve estar relacionado com o ID do usuário que esta logado pois dessa forma a query SELECT retornará corretamente os resultados relacionados ao usuário logado. Após ter criado o script 'update-pontos.php', abra o script que envia os dados do formulário para a tabela 'comentários' e inclua um 'include' na seguinte parte: if(mysqli_insert_id($conn)){ include_once 'update-pontos.php'; $_SESSION['msg'] = "<p style='color:green;'>Comentário enviado com sucesso, obrigado por enviar o seu feedback.</p>"; header("Location:/index.php/p/v/sucesso2"); } Dessa forma, caso a mensagem seja enviada corretamente, este script também chama e executa o script 'update-pontos.php' que atualiza a coluna 'premium_points' atualizando os dados relativos a mesma. Dê uma olhada neste exemplo que criei. Quando você inserir um comentário no campo e clicar no botão enviar comentário, a mensagem é inserida na tabela 'comentários' e ao mesmo tempo, com o sucesso da mensagem enviada, o campo 'premium_points' é atualizado em uma outra tabela chamada 'accounts'. Por fim, basicamente a lógica é mais ou menos essa. Uns também criam funções para executar este tipo de tarefa outros preferem utilizar métodos simples desde que o script seja criado evitando sql injection. Tente adaptar ao seu projeto, lembrando de configurar a conexão conforme os dados do seu banco de dados, usuário e senha do mesmo. Caso alguém deseje acrescentar alguma melhoria, fique a vontade.
  8. michelmir

    CSS condicional

    Dê uma olhada neste exemplo.
  9. O script comentario.php contém uma tabela chamada comentário com colunas nome, mensagem, sendo e created. No caso, qual tabela esta a coluna pontos? Se puder, me diga o nome da tabela onde esta a coluna pontos e suas respectivas colunas pra eu poder adaptar o script que atualizará os pontos pra você.
  10. Olá! Baseando-se nesta parte da sua questão: Você pode usar PHP e MySql como solução montando um script para debitar o ponto a cada vez que usuário realizar um submit no formulário. No caso, partindo que você já tem um sistema de login de usuário, você pode criar um script php que ao ser chamado atualiza a coluna "pontos" no MySql. Abaixo segue um script básico com função de atualizar a coluna pontos quando o botão submit do formulário "comentários" for clicado. Repare que no início do mesmo contém um "session_start()" que tem como função armazenar o id do usuário durante o seu login. Esse número ID é usado para selecionar dados relativos a ele : <?php // Initialize the session session_start(); if(isset($_POST['submit'])){ include 'pdo_connection.php'; $sth = $db->prepare("SELECT pontos FROM users WHERE id = ".$_SESSION["id"].""); $sth->execute(); $result = $sth->fetchColumn(); $pontos = $result - 1; $st = $db->prepare("UPDATE users SET pontos = $pontos WHERE id = ".$_SESSION["id"].""); $st->execute(); $db = null; } ?> E abaixo, o script que inseri o comentário, por exemplo. Nesse script php, o comentário é inserido na coluna "comentario" do MySql onde ao mesmo tempo ele chama o script php (update-pontos.php) acima onde atualiza a pontuação depois do comentário ter sido inserido: <?php // Initialize the session session_start(); $link = mysqli_connect("localhost", "root", "", "system"); // Check connection if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } // Escape user inputs for security $comentario = mysqli_real_escape_string($link, $_REQUEST['comentario']); // Attempt insert query execution $sql = "INSERT INTO comentarios (comentario, usuarioFK) VALUES ('$comentario',".$_SESSION["id"].")"; if(mysqli_query($link, $sql)){ include_once 'update-pontos.php'; header("location: comentario-inserido-com-sucesso.php"); } else{ echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } ?> Criei um sistema bem básico como forma de demonstração. Dê uma olhada e se possível baixe os arquivos para testar. No caso do banco de dados criei uma tabela para armazenar os comentários e uma tabela para armazenar usuários e seus pontos. Link para o sistema básico de testes
  11. Após alguns ajustes consegui encontrar uma solução. Após ter criado uma variável chamada "lista" para criar um objeto, fiz um ajuste no evento afterSelect do Typeahead onde após selecionar uma opção dentro do input text o evento Typeahead envia um valor relacionado ao item para dentro da div #imagem. Esta solução pode ser vista em funcionamento aqui. Segue o script ajustado: <script type="text/javascript"> var produtos; var lista = {}; // cria o objeto $ ( function () { $('#categoriaFK').on('change', function(){ var queryID = $(this).val(); $.ajax({ url:"fetch.php", method:"POST", data: { categoria: queryID }, dataType:"json", success:function(data) { console.log(data); $("#produtos").val (''); produtos = data; } }); }); $('#produtos').typeahead({ source: function ( query, result ) { result ( $.map(produtos, function (item) { return item.nomeProduto; } )); }, /* O ajuste foi feito aqui no evento afterSelect */ afterSelect: function(data) { $.each(produtos, function(idx, item){ lista[item.nomeProduto] = item.imagem; }); var img = lista[data]; $('#imagem').html(img); }, }); }); </script> Por fim, essa foi a solução que consegui encontrar. Caso alguém sugira uma modificação mais otimizada fiquem a vontade. Valeu!
  12. michelmir

    mostrar/esconder

    Vê se te atende. No caso utilizei Jquery para ocultar e mostrar os formulários Cadastre-se e login. Quanto ao style utilizei o Bootstrap: <!DOCTYPE html> <html lang="pt-br"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8"> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> <head> <body> <div class="container" style="max-width:700px;"> <br> <div align="center"> <p><h2>Selecione uma das opções abaixo</h2></p> <br> <div class="row"> <div class="col"><button type="button" class="btn btn-info btn-block" id="cadasbtn">CADASTRAR-SE</button></div> <div class="col"><button type="button" class="btn btn-info btn-block" id="entrarbtn">FAZER LOGIN</button></div> </div> </div> <br> <div class="card" id="formlogin"> <div class="card-header"> FAÇA LOGIN </div> <div class="card-body"> <blockquote class="blockquote mb-0"> <form> <div class="form-group"> <label>E-mail</label> <input type="email" class="form-control" id="e-mail" placeholder="Insira o seu e-mail de cadastro"> </div> <div class="form-group"> <label>Senha</label> <input type="password" class="form-control" id="senha" placeholder="Insira a sua senha"> </div> <button type="submit" class="btn btn-primary btn-block">FAZER LOGIN</button> </form> </div> </blockquote> </div> <div class="card" id="formcadas"> <div class="card-header"> CADASTRE-SE </div> <div class="card-body"> <blockquote class="blockquote mb-0"> <form> <div class="form-group"> <label>E-mail</label> <input type="email" class="form-control" id="e-mail" placeholder="Insira o seu e-mail de cadastro"> </div> <div class="form-group"> <label>Senha</label> <input type="password" class="form-control" id="senha" placeholder="Insira a sua senha"> </div> <button type="submit" class="btn btn-primary btn-block">CADASTRAR</button> </form> </div> </blockquote> </div> </div> <br> </body> </html> <script> $('#formcadas').hide(); $('#formlogin').hide(); </script> <script> $(document).ready(function(){ $("#entrarbtn").click(function(){ $("#formlogin").show(); $("#formcadas").hide(); }); $("#cadasbtn").click(function(){ $("#formlogin").hide(); $("#formcadas").show(); }); }); </script>
  13. Olá! Recentemente fiz uma postagem aqui no fórum a respeito de se carregar valores em um input text baseando-se na opção selecionada em uma select box, onde obtive uma solução. Por conta disso resolvi adicionar um complemento neste meu código onde o mesmo deve carregar valores corretamente dentro de uma input text utilizando o plugin TypeAhead.js e o evento onchange do Jquery. Como forma de demonstrar a minha dúvida em funcionamento, criei uma página como forma de testar a solução. O que ocorre é que quando seleciona uma opção no select box "Categorias", o Ajax manda um request para o php script onde o mesmo retorna os valores corretamente em JSON conforme a imagem do console do navegador Chrome abaixo: Até aqui os valores relacionados com a opção selecionada no select box "Categorias" são carregados corretamente porém se eu não atualizar a página "F5" e ao mesmo tempo eu selecionar alguma outra opção dentro do select box, o input text carrega além dos valores relacionados, todos os valores não relacionados com a opção selecionada ou seja, o input text somente carrega os valores corretamente se eu atualizar a página em questão. Abaixo uma imagem demonstrando os valores carregados em uma input text quando seleciono uma outra opçao no select box quando não se atualiza a página. Todos os valores não relacionados também são carregados: Abaixo publico o html e os scripts Ajax, Typeahead e PHP que estou utilizando neste projeto: HTML <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <!-- jQuery library --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <!-- jQuery UI library --> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script> </head> <body> <div class="container"> <br> <h1>DYNAMIC TWITTER TYPEAHEAD</h1> <br> <div class="row"> <?php // Include the database config file include_once 'dbConfig.php'; // Fetch all the country data $query = "SELECT * FROM categorias ORDER BY categoria ASC"; $result = $db->query($query); ?> <!-- categoria dropdown --> <div class="col-md-4"> <select id="categoriaFK" name="categoriaFK" class="form-control"> <option value="">seleciona categoria</option> <?php if($result->num_rows > 0){ while($row = $result->fetch_assoc()){ echo '<option value="'.$row['categoriaID'].'">'.$row['categoria'].'</option>'; } }else{ echo '<option value="">Categoria não encontrada</option>'; } ?> </select> </div> <div class="col-md-4" id="prod"> <div ><input type="text" name="produtos" id="produtos" class="form-control input-lg typeahead" autocomplete="off" placeholder="" /></div> </div> <div class="col-md-4"> <div id="imagem" name="imagem"></div> </div> </div> </div> </body> </html> No script abaixo, o Ajax envia um request para o script PHP que por sua vez retorna os valores em JSON para o Ajax que envia para o TypeAhead e carrega o input text com valores relacionados. Após selecionar uma opção no input text, o Jquery envia um valor relacionado para a div "#imagem" : $(document).ready(function(){ var produtos; var nomes = []; // array var lista = {}; // objeto $('#categoriaFK').on('change', function(){ var queryID = $(this).val(); $.ajax({ url:"fetch.php", method:"POST", data:{categoria:queryID}, dataType:"json", success:function(data){ console.log(data); $.each(data, function(i, optionHtml){ $('#produtos').append(optionHtml); }); $("#imagem").empty(''); $(".typeahead").val(''); produtos = data; } }); $('.typeahead').typeahead({ source: function(query, result) { $.each(produtos, function(idx, item){ if(!~nomes.indexOf(item.nomeProduto)) nomes.push(item.nomeProduto); lista[item.nomeProduto] = item.imagem; }); return result(nomes); }, afterSelect: function (data) { var img = lista[data]; $('#imagem').html(img); }, }); }); }); Abaixo, o php script que seleciona os valores baseando-se no valor selecionado do select box e os envia em formato JSON para o Ajax: <?php require_once 'dbConfig.php'; if(!empty($_POST["categoria"])){ $query = " SELECT * FROM produtos WHERE categoriaFK = ".$_POST['categoria']." "; $result = $db->query($query); $data = array (); if ( $result->num_rows > 0 ) { while($row = $result->fetch_assoc ()) { $data[] = $row; } header("Content-type: application/json; charset=utf-8 cache-control: no-cache, no-store, must-revalidate"); echo json_encode($data); exit(); } } ?> No caso como mencionado acima, nesta página que criei demonstra o funcionamento de todo o código acima, porém acredito que devo modificar o script para que o mesmo carregue valores corretamente quando seleciono alguma opção no select box "Categorias" sem precisar atualizar a página para que o mesmo carregue corretamente. Como posso proceder? Desde já agradeço a atenção de todos.
  14. Olá @ShadowDLL, valeu pelo feedback. Testei a sua solução e deu certo aqui. Muito obrigado
  15. Olá! Eu tenho um campo input text que carrega corretamente dados utilizando o Twitter-Typeahead. No caso, também possuo uma caixa de seleção e eu gostaria que quando selecionar um valor nesta caixa, o campo input text fosse preenchido com dados relacionados com o número ID da opção selecionada em questão. Por exemplo, se dentro da minha caixa de seleção (categorias) conter a opção "Calçados" e a mesma for selecionada, o campo input text com twitter-typeahead fosse preenchido automaticamente com as opções relacionadas a opção selecionada "calçados" onde essas opções (ex.: "Nike", "Adidas", "Puma") fossem aparecendo a medida que fosse digitando na caixa input text com twitter-typeahead. Abaixo, segue o código que estou utilizando para tentar montar essa solução. No código abaixo contém 2 campos um select box com as categorias e carregado com php e um campo input text que carrega dados utilizando o Twitter-TypeAhead: <!DOCTYPE html> <html lang="pt-br"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8"> <!-- CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <!-- jQuery library --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script> </head> <body> <div class="container"> <br> <h1>DYNAMIC TWITTER TYPEAHEAD</h1> <br> <div class="row"> <?php // Include the database config file include_once 'dbConfig.php'; // Fetch all the category data $query = "SELECT * FROM categorias ORDER BY categoria ASC"; $result = $db->query($query); ?> <!-- category dropdown --> <div class="col-md-4"> <select id="categoriaFK" name="categoriaFK" class="form-control"> <option value="">Selecione a categoria</option> <?php if($result->num_rows > 0){ while($row = $result->fetch_assoc()){ echo '<option value="'.$row['categoriaID'].'">'.$row['categoria'].'</option>'; } }else{ echo '<option value="">Categoria não encontrada</option>'; } ?> </select> </div> <div class="col-md-4"> <input type="text" name="produtos" id="produtos" class="form-control input-lg" autocomplete="off" placeholder="" /> </div> </div> </div> </body> </html> Abaixo segue o script Ajax que chama o script php para popular o input text: <script> $(document).ready(function(){ $('#categoriaFK').on('change', function(){ var queryID = $(this).val(); if(queryID){ $('#produtos').typeahead({ source: function(query, result) { $.ajax({ url:"fetch.php", method:"POST", data: 'query='+queryID, dataType:"json", success:function(data) { result($.map(data, function(item){ return item; })); } }) } }); } }); }); </script> E por fim, o código php que tem como função enviar o resultado da query para o Ajax: <?php //fetch.php include 'dbConfig.php'; if(!empty($_POST["query"])){ $request = mysqli_real_escape_string($db, $_POST["query"]); $query = " SELECT * FROM produtos WHERE nomeProduto LIKE '%".$request."%' AND categoriaFK = ".$_POST["query"]." "; $result = $db->query($query); $data = array(); if(mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { $data[] = $row["nomeProduto"]; } echo json_encode($data); } } ?> Como podem observar no código acima, estou tentando utilizar o Ajax para preencher o input text conforme o valor selecionado na caixa de seleção. No caso como posso acertar o código php e o script Ajax para montar essa solução? É possível? Desde já agradeço.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.