Ir ao conteúdo

Air-Gear

Membro Pleno
  • Posts

    306
  • Cadastrado em

  • Última visita

  1. Bom, eu vou fazer essas alterações. Qualquer coisa eu dou uma resposta de como ficou.
  2. Olá pessoal! Eu comecei com um desenvolvimento de sistema de escola em PHP. Eu decidir fazer esquema de login separado para administrador, professores e alunos. Eu inserir todos os usuários via phpMyAdmin, mas precisava que a senha ficasse hashada, ex: Q#%$#@% O código do index.php abaixo, o link do resto do código está abaixo. <?php session_start(); require 'includes/db.php'; ini_set('display_errors', 1); error_reporting(E_ALL); // Geração do CSRF token se não existir na sessão if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Processamento do formulário de login if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Verificação do token CSRF if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("Token CSRF inválido!"); } // Coleta e sanitiza os dados do formulário $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); $passwordInput = $_POST['password']; // Busca o usuário no banco de dados $stmt = $pdo->prepare("SELECT id, name, password, role FROM users WHERE email = ?"); $stmt->execute([$email]); $user = $stmt->fetch(); // Validação das credenciais if ($user && password_verify($passwordInput, $user['password'])) { // Sessão de usuário autenticado $_SESSION['user_id'] = $user['id']; $_SESSION['role'] = $user['role']; $_SESSION['name'] = $user['name']; // Redireciona para o painel do usuário header("Location: dashboard.php"); exit; } else { $error = "Credenciais inválidas!"; } } ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login - Escola</title> </head> <body> <h1>Login</h1> <!-- Exibe mensagem de erro --> <?php if (isset($error)) : ?> <p style="color: red;"><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></p> <?php endif; ?> <!-- Formulário de login --> <form method="POST" action=""> <input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8') ?>"> <label for="email">Email:</label> <input type="email" name="email" id="email" required><br> <label for="password">Senha:</label> <input type="password" name="password" id="password" required><br> <button type="submit">Entrar</button> </form> </body> </html> Eu fiz todo o esquema pra converter, pelo código PHP, mas não conseguir. Alguém pode me ajudar, por favor? Meu código completo com o Banco de Dados: https://github.com/AndersonBHBR/projeto-escola
  3. Obrigado pela ajuda! Foi erro do site, agora funcionou!
  4. Olá pessoal! Eu estou tentando resolver um código de um desafio, mas não consigo achar o erro que impede de imprimir a saída. Aponta que minha implementação encerrou com um retorno inválido. Segue a Descrição Agora, vamos combinar vários conceitos de lógica de programação, como manipulação de strings, operações matemáticas, controle de fluxo e expressões regulares, aplicados para o desenvolvimento de uma solução de correção para a equipe de administração de uma empresa bancária. Eles precisam de uma solução para a validação de números de contas com base em regras específicas. O programa solicitará ao usuário que insira um número de conta e verificará se ele atende aos critérios predefinidos de validação. Além disso, você pode adicionar a capacidade de informar ao usuário qual regra específica não foi cumprida caso a validação falhe. Regras de Validação: O número de conta deve ter exatamente 6 dígitos. O primeiro dígito deve ser maior que zero, ou seja, estar no intervalo de 1 a 9. A soma dos dígitos do número de conta não deve ser maior do que 30. Entrada O programa deve solicitar as seguintes informações: Número de conta (uma sequência de 6 dígitos). Saída O programa deverá fornecer uma mensagem que informa se o número de conta é válido ou inválido, indicando se o número de conta atende às regras de validação. Caso o número de conta seja inválido, o programa deve informar qual regra específica não foi cumprida. Exemplos A tabela abaixo apresenta exemplos com alguns dados de entrada e suas respectivas saídas esperadas. Certifique-se de testar seu programa com esses exemplos e com outros casos possíveis. Entrada: 634100 Saída: Numero de conta valido. Entrada: 023699 Saída: Numero de conta invalido: O primeiro digito deve ser maior que zero. Entrada: 989899 Saída: Numero de conta invalido: A soma dos dígitos e maior que 30. O código feito por mim: //Desafios JavaScript na DIO têm funções "gets" e "print" acessíveis globalmente: //- "gets" : lê UMA linha com dado(s) de entrada (inputs) do usuário; //- "print": imprime um texto de saída (output), pulando linha. //Saiba mais sobre Expressões Regulares: //https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Regular_expressions // O gets() receberá um número de conta como entrada: const numeroConta = gets(); // Verifica se o número de conta consiste em exatamente 6 dígitos usando uma expressão regular: if (/^\d{6}$/.test(numeroConta)) { const numArray = numeroConta.split('').map(Number); // Calcula a soma dos dígitos no número de conta const sum = numArray.reduce((a, b) => a + b, 0); // Verifica se o primeiro dígito é maior que zero e a soma dos dígitos é menor ou igual a 30 if (numArray[0] > 0 && sum <= 30) { // Se a condição acima for verdadeira, imprime a mensagem de número de conta válido: print('Numero de conta valido.'); } else { // Verifica se o numArray[0] referente ao primeiro dígito é igual a zero : if (numArray[0] === 0) { // Se o primeiro dígito for igual a zero, imprime a mensagem de número de conta inválido por causa do primeiro dígito: print('Numero de conta invalido: O primeiro digito deve ser maior que zero.'); } else { // Caso contrário, imprime a mensagem de número de conta inválido devido à soma dos dígitos ser maior que 30: print('Numero de conta invalido: A soma dos digitos e maior que 30.'); } } } else { // Se o número de conta não tiver exatamente 6 dígitos, imprime uma mensagem de erro: print('Numero de conta invalido: Deve conter exatamente 6 digitos.'); } Alguém sabe onde estou errando?
  5. Olá pessoal! Eu estou vendo videoaulas sobre Spring Boot e no projeto utiliza o Swagger para a interface, porém a versão do Swagger que está no site para colocar manualmente não aceita versões do Spring acima do 3.0. Eu tentei gerar com uma versão mais próxima que o professor utilizava e não conseguir colocar nem do site e nem a versão do curso, dava erro de vulnerabilidade. Eu percebi que os vídeos foram gravados dois anos atrás e com isso muita coisa mudou. Eu queria saber se tem alguma versão mais nova do Swagger ou algum substituto dele para colocar no meu projeto?
  6. Eu fiz isso e cheguei até as Variáveis de Ambiente e adicionei o C:\wamp64\bin\php\php5.6.40\php.exe Não funcionou, ainda fica laranja.
  7. Olá pessoal! Eu desinstalei o WampServer antigo para instalar a versão 3.2.6 para usar o PHP 8. Quando iniciei, ele não fica verde e apresenta essa mensagem: Warning: There is Wampserver path (c:/wamp64) into Windows PATH environnement variable: (C:\wamp64\bin\php\php5.6.40) Warning: It seems that a PHP installation is declared in the environment variable PATH C:\wamp64\bin\php\php5.6.40 Wampserver does not use, modify or require the PATH environment variable. Using a PATH on Wampserver or PHP version may be detrimental to the proper functioning of Wampserver. Alguém pode me ajudar?
  8. Eu conseguir evoluir com o o código, os dados já são enviados para o banco de dados. Agora só falta retornar todos os dados de cada posição ao invés do ultimo. Segue o novo código: public class clUpload { #region insert internal static tbUploadSCP novoUpload(objUpload obj) { tbUploadSCP uploadA = new tbUploadSCP(); using (TransactionScope ts = new TransactionScope()) { using (Repository<tbUploadSCP> repSol = new Repositoryupload()) { for (int i = 0; i < obj.arq.Count; i++) { uploadA = new tbUploadSCP { url = obj.arq[i].url, userId = obj.arq[i].userId, upIdAcao = obj.arq[i].upIdAcao, upTipo = obj.arq[i].upTipo, upData = obj.arq[i].upData, }; repSol.Add(uploadA); } } ts.Complete(); return uploadA; } } }
  9. Bom, como não fiquei parado, eu continuei tentando e acabei que optando o for no lugar do foreach. Segue o novo código: public class clUpload { #region insert internal static bool novoUpload(tbUploadSCP obj) { tbUploadSCP uploadA = new tbUploadSCP(); using (TransactionScope ts = new TransactionScope()) { using (Repository<tbUploadSCP> repSol = new Repositoryupload()) { string[] end = { }; for (int i = 0; i < obj.url.Length; i++) { end[i] = obj.url[i].ToString(); obj.url = end[i]; } uploadA = new tbUploadSCP { url = obj.url, userId = obj.userId, upIdAcao = obj.upIdAcao, upTipo = obj.upTipo, upData = obj.upData, }; repSol.Add(uploadA); //var upMetaPeriodo = UpMetaPeriodo(obj); } ts.Complete(); return true; } } //Resto do código que não tem haver com o problema } Visual Studio não deu erro no código, mas não executou como devia. Eu tentei colocar "url = end;", mas apontou erro. Eu estou mais ou menos no caminho.
  10. Olá pessoal! Entregaram um código já montando e preciso fazer uma modificação na parte do campo url, já que ele é uma array de string com tamanho variado. Antes de mexer no código, já funcionava, mas o campo url pegava só a primeira posição. No Front-End que utiliza Javascript eu conseguir resolver, o Back-End que utiliza C# estou pegando agora. Eu preciso implementar um foreach no campo, mas o campo está dentro de uma concatenação. Eu até tentei colocar o Foreach dentro, mas o Visual Studio aponta erro. Então coloquei antes para depois jogar dentro, mas estou agarrando e não estou achando um tutorial especifico para esse foreach. Alguém pode me ajudar? Segue o código. public class clUpload { #region insert internal static bool novoUpload(tbUploadSCP obj) { tbUploadSCP uploadA = new tbUploadSCP(); using (TransactionScope ts = new TransactionScope()) { using (Repository<tbUploadSCP> repSol = new Repositoryupload()) { string[] end = obj.url.Length; foreach (var i in end) { obj.url[i] = end[i]; } uploadA = new tbUploadSCP { url = obj.url, userId = obj.userId, upIdAcao = obj.upIdAcao, upTipo = obj.upTipo, upData = obj.upData, }; repSol.Add(uploadA); //var upMetaPeriodo = UpMetaPeriodo(obj); } ts.Complete(); return true; } } //Resto do código que não tem haver co o problema }
  11. Valeu @GabrielSennaMs! Enquanto isso eu trabalhei no novoUpload e finalmente conseguir imprimir o novo nome do arquivo que esta na primeira posição. Agora eu estou trabalhando numa array para imprimir todos os nomes, mas imprime só o primeiro nome. Segue o código. echo<<<EOF <p></p> <p>Nome: {$sFileName}</p> <p>Tamanho: {$sFileSize}</p> <input class="arrayFoto" id="impu" type="text" ng-model="sp.nomeFoto[{$i}]" name="nomeFoto[{$i}]" disabled value={$nome_final}> <p></br></p> EOF; function novoUpload(impu) { data = new Date(); debugger dia = String(data.getDate()).padStart(2, '0'); mes = String(data.getMonth() + 1).padStart(2, '0'); ano = data.getFullYear(); dataAtual = dia + '/' + mes + '/' + ano; debugger var lista = document.getElementsByClassName("arrayFoto"); for (i=0; i < lista.length; i++){ end = "app/upload/"+document.getElementById("impu").value; document.getElementById("demo").innerHTML = end; //Essa linha é usado pra impressão de teste //ext = path.split('.').pop(); } debugger id = $rootScope.usuario.id; url = arq.end; userId = arq.id; upIdAcao = arq.nome; upTipo = 1; upData = arq.dataAtual; //upArray = arq. return arq; }
  12. Tem algum material que faz upload de foto em Angular ou algum framework em Javascript que você recomenda?
  13. @GabrielSennaMs Bom, eu tentei fazer o esquema de salvar fotos sem depender de PHP, mas não conseguir. Só para ter uma ideia do caminho, no HTML com Angular tem um campo input para escolher as fotos. Em seguida, clicando no botão vai ativar uma função Javascript que verifica se os arquivos são validos e vai chamar upload.php com ID do usuário. Dentro do PHP, vai analisar os arquivos e fazer o esquema de renomear-los para jogar de volta no HTML. Sim, essa lista vai ser carregada no Front-End. Vai exibir a mensagem que o arquivo foi salvo e vai jogar input invisível com o novo nome década arquivo de foto. E também quero jogar esses novos nomes dentro de uma função Javascript.
  14. Olá pessoal! O sistema já tem um código que salva todos os campos no Banco Dados, eu simplesmente preciso implementar o upload de fotos. Bom, eu já conseguir fazer upload das fotos com os novos nomes deles em código PHP, mas precisei jogar de volta na página para salvar os dados das fotos junto com outros dados de cadastro. Na parte de jogar de volta eu fiz assim. //Código do Upload acima echo<<<EOF <p></p> <p>Nome: {$sFileName}</p> <p>Tamanho: {$sFileSize}</p> <input id="impu" type="hidden" ng-model="sp.nomeFoto[{$i}]" name="nomeFoto[{$i}]" disabled value={$nome_final}> <p></br></p> EOF; //Resto do código e fechamento do PHP Neste código, eu jogo todo o novo nome das fotos dentro deum input invisível. Após jogar de volta na página eu mando salvar junto com outros dados. O novoNome é um array, pois salvo várias fotos. O problema que na inspeção do código, não envia o novo e outros dados das fotos. O código para adicionar os dados são esses. function addItem() { if (validaAddItem()) { var objadd = { //Somente o nomeFoto para exemplificar melhor o código. "nomeFoto": $(novoUpload(impu)).value } debugger loadingItensAdicionados = true; $timeout(function () { arrayItensAdicionados.push(objadd); limparItem(); loadingItensAdicionados = false; }, 200); } } function montarSalvar() { debugger var params = { //Parte do código fica aqui no lugar do comentário. }; arrayItensAdicionados.forEach(element => { params.itens.push( { //Parte do código fica aqui no lugar do comentário. "sciNomeFoto": element.nomeFoto } ); }); return params; } E foi necessário criar uma nova função, novoUpload. Segue o código. function novoUpload(impu) { data = new Date(); debugger dia = String(data.getDate()).padStart(2, '0'); mes = String(data.getMonth() + 1).padStart(2, '0'); ano = data.getFullYear(); debugger end = "app/upload/"+impu.HTMLCollection.nomeFoto[0].namedItem(defaultValue); ext = path.split('.').pop(); dataAtual = dia + '/' + mes + '/' + ano; debugger id = $rootScope.usuario.id; url = arq.end; userId = arq.id; upIdAcao = arq.nome; upTipo = 1; upData = arq.dataAtual; //upArray = arq. return arq; } Inspecionei o código e foi necessário implementar o HTMLCollection5, mas nunca usei e não sei se é assim, pois não mostrou o erro no Console da Inspeção do Código. Onde estou errando?
  15. Bom no final eu conseguir fazer e utilizei o EOF pra achar os erros e ter noção do que o código faz, além de claro conseguir salvar varias imagens de formatos diferentes mais PDF ao mesmo tempo. No código renomeia todos os arquivos mantendo o formato PDF e colocando todas as imagens em JPG. Código pronto e concluído. <?php function bytesToSize1024($bytes, $precision = 2) { $unit = array('B','KB','MB'); return @round($bytes / pow(1024, ($i = floor(log($bytes, 1024)))), $precision).' '.$unit[$i]; } //Pega o id do usuário logado $id_url = $_GET['id']; // Numero de campos de upload $numeroCampos = count($_FILES['image_file']['name']); // Tamanho máximo do arquivo (em bytes) $tamanhoMaximo = 1024*1024*2; // Extensões aceitas $extensoes = array(".jpg", "jpeg", ".gif", ".png", ".pdf", ".bmp", ".pdf", ".tiff"); //Local da pasta $_UP['pasta'] = '../upload/'; $substituir = false; for ($i = 0; $i < $numeroCampos; $i++) { // Informações do arquivo enviado $sFileName = $_FILES['image_file']['name'][$i]; $sSize = $_FILES['image_file']['size'][$i]; $sFileSize = bytesToSize1024($sSize, 1); $nomeTemporario = $_FILES['image_file']['tmp_name'][$i]; // Verifica se o arquivo foi colocado no campo if (!empty($sFileName)) { $erro = false; // Verifica se o tamanho do arquivo é maior que o permitido if ($sSize > $tamanhoMaximo) { $erro = "O arquivo " . $sFileName . " não deve ultrapassar " . $tamanhoMaximo. " bytes"; } // Verifica se a extensão está entre as aceitas elseif (!in_array(strrchr($sFileName, "."), $extensoes)) { $erro = "A extensão do arquivo <b>" . $sFileName . "</b> não é válida"; } // Verifica se o arquivo existe e se é para substituir elseif (file_exists($_UP['pasta'] . $sFileName) and !$substituir) { $erro = "O arquivo <b>" . $sFileName . "</b> já existe"; } else{ //Pega a extensão do arquivo $TipoExtensao = pathinfo($sFileName, PATHINFO_EXTENSION); // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta // Primeiro verifica se deve trocar o nome do arquivo $unixTime = time(); $timeZone = new \DateTimeZone('America/Sao_Paulo'); $time = new \DateTime(); $time->setTimestamp($unixTime)->setTimezone($timeZone); $formattedTime = $time->format('d-m-Y_l_h-i-s-a'); $aleatorio = rand(); if($TipoExtensao == 'pdf'){ $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.pdf'; }else{ $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.jpg'; } // Depois verifica se é possível mover o arquivo para a pasta escolhida if (move_uploaded_file($nomeTemporario, $_UP['pasta'] . $nome_final)) { // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo echo "Upload do arquivo ".$sFileName." foi efetuado com sucesso!"; } else { // Não foi possível fazer o upload, provavelmente a pasta está incorreta echo "Não foi possível enviar o arquivo, tente novamente"; } } echo <<<EOF <p></p> <p>Nome: {$sFileName} Tamanho: {$sFileSize}</p> <p>{$erro}</p> <p></br></p> <p>Posição: {$i}</p> <p>Algum erro?: {$erro}</p> <p>Nome Inicial: {$sFileName}</p> <p>Nome Temporário: {$nomeTemporario}</p> <p>Nome Final: {$nome_final}</p> <p>Tamanho: {$sFileSize}</p> <p></br></p> EOF; }else{ echo "Selecione algum arquivo de imagem ou PDF para fazero upload."; } } echo <<<EOF <p></p> <p>Número de arquivos adicionados no upload: {$numeroCampos}</p> EOF;

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...