Ir para conteúdo

Omar~

Members
  • Total de itens

    1325
  • Registro em

  • Última visita

  • Dias vencidos

    15

Posts postados por Omar~


  1. Remova o atributo de comando onchange

    Adicione um ID ao seletor ou qualquer outra forma para saber no javascript que o seletor é o alvo.

    Crie uma tag javascript use um ouvinte  com inspeção no comando "change":

    Element.addEventListener('change', funcao_qualquer, false);

     

    Crie um função qualquer que será acionada quando o seletor é alterado; assim que o ouvinte detectar que o seletor foi modificado, ela por sua vez verifica o valor para tomar as medidas cabíveis ao desejado.

    <select id="exemplo">
        <option value="">A</option>
        <option value="B">B</option>
        <option value="C">C</option>
    </select>
    
    <script>
        function funcao_qualquer(evento) {
            if (evento.target.value != '') {
                /* fazer alguma coisa pois o que foi selecionado não é <empty string>
                   Pode-se usar o redicionamento "location.href" aqui 
                */
            }
        }
    
        document.getElementById('exemplo').addEventListener('change', funcao_qualquer, false);
    </script>

     


  2. <?php
    $senhaA = 'aB1@';
    $senhaB = 'a1Bc2DeF3G@&';
    
    function verificarSenha($senha) {
        if (strlen($senha) < 6) {
            return ("<p>Menos de 6 Cacteres</p>");
        } else if (preg_match_all('/[a-z]/', $senha) < 2) {
            return ("<p>Menos de 2 Cacteres mínusculos</p>");
        } else if (preg_match_all('/[A-Z]/', $senha) < 2) {
            return ("<p>Menos de 2 Cacteres maiúsculos</p>");
        } else if (preg_match_all('/[0-9]/', $senha) < 2) {
            return ("<p>Menos de 2 números</p>");
        } else if (preg_match_all('/[^A-Za-z0-9]/', $senha) < 2) {
            return ("<p>Menos de 2 símbolos</p>");
        } else {
            return ("<p>Todos requisitos atendidos</p>");
        }
    }
    
    echo (
        '$senhaA: ' . verificarSenha($senhaA)
        . '<hr />' .
        '$senhaB: ' . verificarSenha($senhaB)
    );

     


  3. Só completando o que o @wanderval mencionou, não é pouco difícil e sim muito.

    Os recursos de estilização para certos componentes são mínimos, mas assim como ele disse podemos criar elementos que simulam o desejado.

    Um problema do exemplo apresentado pelo colega é que não há como capturar a opção que o usuário selecionou.

    Então podemos criar uma tag label vinculado a um input "checkbox" e esse label estará no lugar das tag's <a>. Apresentando uma caixa de seleção mas na verdade é outra coisa ao qual podemos obter o selecionado no servidor quando selecionado algum.

     

    Complemento pessoal:

    Quando eu estava criando esse script https://github.com/Spell-Master/sm-web/tree/master/javascript/SelectOption (que é outro recurso que simula uma caixa de seleção) a princípio estava criando algo que pudesse estilizar livremente cada option interno. No entanto cheguei a conclusão que isso não era correto, se um texto extrapola as limitações é conclusivo que o elemento necessário para tal finalidade não é um <select>


  4. Sim, assim como você brevemente fez use a função count para saber quantos índices existem na super global $_FILES.

    Além dessa verificação do lado do servidor seria bacana se você também fizesses algo do lado do cliente(usuário) assim poupa processamento do servidor quando algo não está de acordo, basta apenas delimitar os arquivos dentro do input usando o javascript.

    Mas sempre deve existir filtros do lado do servidor, vai lá saber quem e qual intenção da pessoa que está enviando informação para o servidor!

    E a propósito leia sobre isso: https://www.php.net/manual/pt_BR/class.finfo.php a última camada de sua proteção depois de 3/4/5/6/7.... verificações que possa executar.

    Leia aqui também, foi de grande ajuda para mim, e também será para você já que estamos falando de uploads.

    https://forum.imasters.com.br/topic/587426-até-onde-posso-confiar-na-classe-finfo/

    Do lado do cliente se for o caso pode está usando esse script meu:

    https://github.com/Spell-Master/sm-web/tree/master/javascript/FileTransfer

    Enfim, se não é o limite que estipulou um loop deve ser usando para salvar os arquivos e registrar eventuais coisas que são necessárias

     

    A última coisa e mais importante:

    Remova esse caractere antes de variável "@" ele ofuscará o erro e qualquer dano para sua aplicação. Eu posso por exemplo enviar outro arquivo dizendo que é uma imagem devido a ofuscação usando o "@" não importa o filtro ou qualquer verificação eu posso dizer que é um png ou jpg ou bmp sei lá, seu php vai aceitar pois qualquer erro está ofuscado e não tem mágica/truque que possa fazer. Na verdade o que estou enviando é um arquivo digamos .php ou .htaccess que me dar total e pleno acesso acesso a sua hospedagem quem sabe até um arquivo .????(ocultei) funcionando obtendo e me repassando qualquer informação que passa pelo seu protocolo http.

    Não importa o ambiente se é de produção ou entrega esse uso do "@" é para apenas testes de vulnerabilidades e processos de gastos para desenvolvedores contribuintes para aperfeiçoamento da linguagem php.

    E nunca em hipótese alguma o caractere de ofuscação "@" em junto a uma variável deve ser usado para quem  está em aprendizado ou até por profissionais em desenvolver aplicações. Ele existe para um único fim de testes para o próprio código de programação o PHP.


  5. Me parece que não adianta nada agora tentar corrigir a codificação de caracteres, pois o problema ocorreu quando os dados foram registrados.

    Vale ressaltar também que a codificação da aplicação também deve ser definida na mesma codificação usada pelo charset.

    Detalhes como a própria criação da tabela também vão ter grande relevância, exemplo:

    CREATE TABLE `exemplo` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `texto` varchar(100) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

     

    De qualquer forma um simples solução para codificação de caracteres é nunca usar acentuação e sim entidades das mesmas, exemplo:

    $salvar = htmlentities('João é um menino');
    
    /*
    No banco de dados fica salvo assim:
    - Jo&atilde;o &eacute; um menino
    
    Mas sempre que for exibido no html não importa qual a codificação será:
    - João é um menino
    */

    Se fosse meu caso e não ´pudesse reiniciar o banco de dados estaria a criar um mapa de caracteres desses que estão "diferentes".

    Criaria um programa - que automaticamente faria a leitura > converteria os estranhos para seu estado real > faria a atualização dos registros usando a função htmlentities.

    Lógico que alteraria a aplicação para que quando algum registro seja inserido ou alterado passe pela função htmlentities.

    Então nunca mais teria problemas relacionados ao charset seja lá qual for a codificação usada.


  6. <!-- Como errar ao escrever HTML ^.^ -->
    <input id="valorItemExtra" />
    <input id="valorItemExtra" />
    
    <input id="#valorItemExtra" />
    <input id="#valorItemExtra" />

     

    O atributo ID é único, somente um elemento pode possuir o mesma propriedade.

    Imagine 1/2/3 ou mais pessoas com o mesmo número de RG ou CPF quem sabe até o mesmo número de telefone, que confusão não seria, no mínimo dizer que isso nunca daria certo.

    Da mesmo jeito o atributo "ID" deve ser usado, de qualquer forma tanto o javascript quanto o próprio html ou o browser desconsidera isso apenas usando o ultimo ID pois ele sobrescreve os demais porque como dito só pode existir um apenas com a mesma identificação.

     

    Resposta para o problema.

    • Remova o erro de usar mais de um ID igual.
    • Busque pelos elementos de input
    • Adicione um ouvinte que detecta quando algum input é alterado.
    • Faça o calculo dentro de um loop pelos elementos quando marcados incrementa o valor.

  7. Pode está usando essa classe que escrevi para usar junto o PHPMailer:

    Spoiler
    
    <?php
    /**
     * ****************************************
     * @copyright (c) 2016, Omar Pautz
     * @version 4.2 (2023)
     * Envio de e-mail
     * @requires
     * PHPMailer 6.6.5
     * Contantes de definição:
     * @const MAILTYPE
     * (Tipo de acesso tls/ssl ao SMTP)
     * @const MAILHOST
     * (Endereço do SMTP)
     * @const MAILPORT
     * (Porta de Acesso)
     * @const MAILUSER
     * (Endereço do e-mail que envia)
     * @const MAILPASS
     * (Senha do e-mail que envia)
     * @const NAME
     * (Nome de quem envia)
     * ****************************************
     */
    
    class Mailer {
    
        private $mailer;
        private $fromMail;
        private $fromName;
        private $address;
        private $template;
        private $title;
        private $content;
        private $find;
        private $replaces;
        private $sendError;
        private $sendSucess;
    
        /**
         * ****************************************
         * Construtor, inicia e define o formato
         *  para a class PHPMailer.
         * ****************************************
         */
        function __construct() {
            $this->fromMail = MAIL_USER;
            $this->fromName = SITE_NAME;
    
            $this->mailer = new PHPMailer(false);
    
            $this->mailer->SMTPDebug = 0;
            $this->mailer->SMTPAuth = true;
            $this->mailer->Host = MAIL_HOST;
            $this->mailer->SMTPSecure = MAIL_TYPE;
            $this->mailer->Username = MAIL_USER;
            $this->mailer->Password = MAIL_PASS;
            $this->mailer->Port = (int) MAIL_PORT;
            $this->mailer->CharSet = 'utf-8';
    
            $this->mailer->isSMTP();
            $this->mailer->IsHTML(true);
            $this->mailer->getSentMIMEMessage();
            /* Corrija o diretório aí conforme onde deixar a classse
            Nesse caso aqui indica o mesmo diretório de PHPMailer.php e SMTP.php */
            //$this->mailer->setLanguage('pt_br', __DIR__ . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR);
        }
    
        /**
         * ****************************************
         * Recebe os dados
         * @Param {STR} $Address
         * Para quem o e-mail vai ser enviado.
         * @Param {STR} $title
         * Título do e-mail
         * @Param {STR} $html
         * Arquivo que contém o html do e-mail.
         * @Param {ARR} $values
         * Array com as informações que serão enviadas.
         * 
         * @example 
         * setMail(
         *     'recebe@recebe.com',
         *     'Título do envio',
         *     'caminho para o arquivo.html',
         *     [
         *         'valorA' => 'Valor de A',
         *         'valorB' => 'Valor de B',
         *     ]
         * );
         * ****************************************
         */
        public function setMail($Address, $title, $html, $values = []) {
            $this->address = (string) $Address;
            $this->title = (string) $title;
            $this->template = (string) $html;
            $this->templateDir();
            $this->find = [];
            $this->replaces = [];
            foreach ($values as $key => $value) {
                $this->find[] = '{' . $key . '}';
                $this->replaces[] = $value;
            }
            $this->objectValues();
        }
    
        /**
         * ****************************************
         * Adiciona arquivo de imagem junto ao
         *  e-mail.
         * @param {STRING} $img
         * Caminho para o arquivo de imagem.
         * @param {STRING} $name
         * Nome prefixo que será usado para
         *  carregar a imagem.
         * <img src="cid:nome_usado" alt="" />
         * ****************************************
         */
        public function addImage($img, $name) {
            $this->mailer->AddEmbeddedImage($img, $name);
        }
    
        public function send() {
            $this->sendValues();
        }
    
        /**
         * ****************************************
         * Informa o e-mail foi enviado.
         * ****************************************
         */
        public function sendSucess() {
            return ($this->sendSucess);
        }
    
        /**
         * ****************************************
         * Quando não consegue enviar informa
         *  o erro que ocorreu.
         * ****************************************
         */
        public function sendError() {
            return $this->sendError;
        }
    
        /**
         * ****************************************
         * Checa se o arquivo de template do html
         *  existe.
         * ****************************************
         */
        private function templateDir() {
            if (!file_exists($this->template)) {
                die('Erro ao solicitar dados para envio de e-mail');
            }
        }
    
        /**
         * ****************************************
         * Cria os objetos de envio
         * ****************************************
         */
        private function objectValues() {
            ob_start();
            include($this->template);
            $content = ob_get_clean();
            if (!empty($this->find) && !empty($this->replaces)) {
                $this->content = str_replace($this->find, $this->replaces, $content);
            }
        }
    
        /**
         * ****************************************
         * Envia os dados
         * @return Exeption (true/false)
         * ****************************************
         */
        private function sendValues() {
            $this->mailer->setFrom($this->fromMail, $this->fromName);
            $this->mailer->AddAddress($this->address);
            $this->mailer->Subject = $this->title;
            $this->mailer->Body = $this->content;
            try {
                $this->mailer->Send();
                $this->sendSucess = true;
            } catch (Exception $e) {
                $this->sendError = "Erro ao enviar e-mail linha: {$e->getCode()}<br/>Arquivo: {$e->getFile()}<br/>Detalhes: {$e->getMessage()}";
                $this->sendSucess = false;
            }
        }
    
    }

     

     

    Crie um arquivo que irá guardar os dados necessários para conexão SMTP

    <?php
    defined('SITE_NAME') || define('SITE_NAME', 'fulano'); // Nome que será usado para informar quem está enviando
    defined('MAIL_TYPE') || define('MAIL_TYPE', 'tls'); // Tipo de criptografia usada
    defined('MAIL_HOST') || define('MAIL_HOST', 'aaa.bbb.com'); // Servidor de envio
    defined('MAIL_PORT') || define('MAIL_PORT', 300); // Porta de acesso ao servidor
    defined('MAIL_USER') || define('MAIL_USER', 'fulano@fulano.com'); // E-mail que vai enviar
    defined('MAIL_PASS') || define('MAIL_PASS', 'senha_do_fulano'); // senha do e-mail que vai enviar

     

    Para enviar:

    <?php
    $mail = new Mailer();
    $mail->setMail(
         'recebe@recebe.com', // e-mail de quem vai receber
         'Título do envio',
         'caminho para o arquivo.html',
         [
            'AAAA' => 'Alguma coisa',
            'BBBB' => 'Pode-se adicionar quantos índices quiser',
         ]
    );

    Para o caminho para o arquivo.html você cria um arquivo html, nele você pode definir o layout como quiser como se fosse uma página web mesmo sempre usando o atributo style para tal.

    Nesse arquivo html você pode está incluindo os parâmetros que criou no array quando definiu os dados de envio exemplo:

    <p style="color:red">{AAAA}</p> <!-- AAAA será o texto de acordo com o mencionado antes: "Alguma coisa" -->

    Por fim você manda enviar

    $mail->send();


  8. Eu acho que não dar para fazer, mas posso está enganado.

     

    Se fosse para tentar fazer, eu partiria de usar as seguintes aplicações aos quais me vem a cabeça que poderiam ser usadas:

     

    Porém não sei se daria certo, pelo fato que não dar para prever quando a pessoa vai clicar em voltar na aba do navegador, porque isso não dar para capturar exceto se criar uma extensão própria para o navegador que comunicaria ao javascript que a ação foi realizada.

    Ou talvez tenha algum truque para detectar essa ação que nunca ouvir falar.

     

    Em uma "gambiarra" eu usaria um setinterval para está constantemente consultado a barra de navegação assim saber quantas páginas devem existir de acordo com a rolagem.


  9. As filtragens que pode aplicar é bem variável, pois depende se vai ou não manter ou permitir determinadas entradas.

    • Digamos que eu não queira uso de um caractere de aspa, então eu não executo o restante do código porque tem uma aspa na informação.
    • Mas se eu quero essa aspa eu posso alterar ela de forma que a mesma não chegue a atrapalhar ou quem sabe até dar algum problema.
    • Ou então não quero essa aspa ao invés parar a execução ou converter, simplesmente removo e meu código pode continuar.

    Isso também remonta a vários outros caracteres também usados no nosso ou em outros idiomas.

     

    O ruim de barrar caracteres atualmente são os conhecidos emoticon comuns em aparelhos móveis.

    Então bloquear determinados caracteres deve-se assegurar que esses caracteres não vão comprometer a exibição desses emoticon que são compostos caracteres unicode.

     

    Vou compor uma situação aqui:

    <?php
    class exemplo {
      private static $string;
      
      public static function converter($x) {
        self::$string = (string) $x;
        self::codificar();
        self::aspas();
        return (self::$string);
      }
    
      private static function codificar() {
        self::$string = mb_convert_encoding(htmlentities(self::$string), 'UTF-8', 'ASCII');
      }
    
      private static function aspas() {
        $aspas = ['/\'/', '/"/', '/`/'];
        $entidades = ['&apos;', '&quot;', '&grave;'];
        self::$string = preg_replace($aspas, $entidades, self::$string);
      }
    }
    
    // É um texto com "aspas" > e com a mesma 'simples' e invertida `também`
    $strA = "It'is a text with \"quotes\" > and with the same 'simple' and inverted `also`";
    
    $strB = exemplo::converter($strA);
    
    echo ($strB . "<br />");
    
    echo ("<pre>");
    var_dump($strB);
    echo ("</pre>");

    Se executar o código $strB mesmo sendo o valor aplicado pela classe é mostrado como o texto original não aparenta que nada foi modificado, até mesmo a função var_dump não monstra nada diferente.

    Até mesmo se inspecionar o texto pelo navegador não se ver diferença.

    Isso porque quaisquer caracteres especiais que venha a conter foram substituídos por entidades html então o navegador sempre irá mostrar ele como ele deveria ser exemplo:

    Mostra " mas na verdade é &quot;

    Mostra > mas na verdade é &gt;

    A única forma que existe para que se consiga ver como realmente é o texto é executando ele com algo que não é um interpretador html, PHP é um interpretador html.

    Podemos usar o javascript:

    echo ("<script>console.log(\"{$strB}\")</script>");

    Então no console do navegador verei como o texto é antes de ser interpretado.

    Digamos que salvo algum texto no banco de dados, quaisquer eventuais códigos serão salvos no banco sim, mas não como códigos funcionais apenas como uma simples string que nunca será interpretada como função, ou seja nunca sendo executada. Mesmo repassando a mesma eu várias ocasiões.

    A não ser que eu transforme novamente o texto de entidades a caracteres:

    echo html_entity_decode(utf8_decode($strB)); // Retorna o código ao estado original

     

    Você pode aplicar muito mais conversões usando entidades der uma olhada nisso que achei

    https://oinam.github.io/entities/

     

    Mas deixo claro que só a função htmlentities já faz um bom trabalho.

    O ponto forte de se usar entidades é que nunca irá precisar se preocupar com erros de acentuação por causa de codificação da aplicação pois não importa o idioma se é árabe, chinês, inglês ou português, se é utf-8, ANSI ou sei lá, quaisquer problemas relacionados a isso estarão solucionados.

    • João é amigo de maria
    • Jo&atilde;o &eacute; amigo de maria

     

    PDO e áspas....

    PDO já salva aspas escapadas para evitar justamente a quebra da coluna no banco de dados. 


  10. Simples dados 1 é substituído por dados 2/ e 3 substitui 2/ 4 substitui 3 etc... etc... etc...

    Exemplo:

    $variavel = 'AAA';
    $variavel = 'BBB';
    $variavel = 'CCC';
    var_dump($variavel); // Resultado é (string) CCC pois é a ultima informação igual definida.
    
    $variavel = [
      'AAA',
      'BBB',
      'CCC'
    ];
    var_dump($variavel); // Resultado é (array) AAA,BBB,CCC.

    Na verdade a substituição já acontece quando o navegador vai enviar as informação, somente enviando a última que substitui todas anteriores.

    Você pode definir os inputs como um array assim quando chegar ao lado do servidor terá vários dados dentro de uma array na super-global post

    Exemplo:

    <input type="text" name="como_array[]" value="A" />
    <input type="text" name="como_array[]" value="B" />
    <input type="text" name="como_array[]" value="C" />

    Então a cada índice você faz o update.

    Eu não mecho com mysqli, então apenas vou dizer para dar uma lida nisso talvez possa ser útil:

    https://www.php.net/manual/pt_BR/mysqli.multi-query.php

     

    Outra forma é criar cada input individual de acordo com a chave do array de retorno na query

    Exemplo:

    $sqlSelect = mysqli_fetch_assoc($result);
    foreach ($sqlSelect as $chave => $valor) {
      ?>
      <input type="text" value="<?= $valor['trackNumero'] ?>" name="trackNumero-<?= $chave ?>">
      <?php
    }

    Então no lado do servidor os valores serão separados (https://www.php.net/manual/pt_BR/function.substr.php) e indexados em um array.

    Então percorrer esse array criado e a cada chave idêntica no mesmo índice realizar o update.

     

     

    Ponderações:

    • Filtre melhor os dados que serão processados no servidor, imagine alguém quebrar a sintaxe do php para expor o código fonte que está sendo processado pelo servidor.
    • mysqli_real_escape_string é muito fácil burlar se é que isso funciona mesmo.
    • Nunca passe uma informação vinda do usuário direto dentro de uma query, nunca se sabe o que está sendo executado, injeções de código vem de todo lugar e você não vai querer alguma detonando todo seu baco de dados ou vai?
    • Use query pré preparadas https://www.php.net/manual/pt_BR/mysqli.quickstart.prepared-statements.php

     

    Dica pessoal minha:

    PDO é uma boa (não a melhor)  alternativa  pois já possui uma pequena proteção em seu mais simples uso. Não é bicho de sete cabeça e mais fácil e seguro de usar que mysqli.

     


  11. Para fins de estudo de caso outros cheguem até aqui.

    O site sem si fornecido pelo autor do tópico usa como referencia elemento de autua e largura totais, a a propriedade fixed sobre esses elementos para cobrir.

    Quando uma página é trocada ela não é trocada... Vou explicar apesar de ser um link da tag <a> exite um evento a espera desse click.

    No momento do click a função responsável troca o conteúdo da tag que irá cobrir ao mesmo tempo que a mostra pois ela está oculta.

    Os efeitos nada mais é que css de margin, opacity etc... 

    Voltando ao caso do click a função executa Asynchronous JavaScript And XML a um arquivo que irá devolver a resposta como texto html.

    Durante o processo de comunicação do AJAX, o histórico da url é manipulado. Fazendo pensar que na verdade clicasse em algum link.

    Quando a resposta está pronta a mesma função altera o html da página com o html da resposta e oculta o elemento que cobre a tela.

     

    Etapas:

    1 - Obter todos links

    2 - Remover comportamento padrão dos links.

    3 - Acionar uma requisição ajax quando o link é ativado.

    4 - Enviar pedido ao servidor para que forneça o arquivo referente ao link ativado.

    5 - Obter solicitar a resposta como text/html.  (Etapa 7 inicia aqui.)

    6 - Alterar HTML do elemento de animação. 

    7 - Alterar o histórico da url.

    8 - Alterar o HTML do elemento que irá carregar a página.

    9 - Alterar o HTML do elemento de animação.

     

    O resto é só css simples e básico position/opacity/margin/translate.


  12. @Biel. Vá até o diretório de instalação do phpmyadmin vasculhe os arquivos até encontrar aquele que faz esse gerenciamento, então é só editar ele conforme achar que pode fazer melhor.

    No entanto isso não passa de uma bobagem desnecessária.

    Não dou detalhes sobre qual arquivo porque não uso o phpmyadmin para gerenciar banco de dados e tabelas.

     

    1 hora atrás, Frank K Hosaka disse:

    Não consigo imaginar como é possível alguém ter mais de 14 tabelas num só banco de dados.

    Já trabalhei com redes logísticas e de varejo que possuíam quase 100 ou mais tabelas em um só banco de dados.

    Esse site mesmo aqui que é o sistema invision power board deve ter umas 80 tabelas por aí.

    Ter várias tabelas ou não depende da organização de um volume gigantesco de dados.


  13. Estranho....

    Eu diria que seria algo que possa está sendo registrado dentro da super-global $_SESSION, no entanto, vendo o que postou não tem esse registro sendo feito.

     

    Faça um teste aí.

    Altere o input type password para text no arquivo de login, desconfio que o browser está com a senha memorizada em cache. Então ao invés de uma nova senha a antiga está sendo usada.

    Porque realmente não consegui ver algum motivo para algo como isso acontecer.

    Tente ver primeiro como os dados foram repassados no arquivo de login dessa forma:

    <?php
    // if(!isset($_POST['SendLogin'])){exit;} exit é uma função ok?!
    
    $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);
    if (isset($dados['SendLogin'])) {
      echo "<pre>";
      var_dump($dados, $dados['senha']);
      echo "</pre>";
      /*
      Não executar, veremos primeiro os dados antes de fazer a coisa acontecer
      
      $query_usuario = "SELECT * FROM usuario WHERE 	email = :email LIMIT 1";
      $result_usuario = $conn->prepare($query_usuario);
      $result_usuario->bindParam(':email', $dados['email']);
      $result_usuario->execute();
    
      $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
      if ($row_usuario && (password_verify($dados['senha'], $row_usuario['senha']))) {
        $_SESSION['id'] = $row_usuario['id'];
        $_SESSION['nome'] = $row_usuario['nome'];
        $_SESSION['situacoe_id'] = $row_usuario['situacoe_id'];
        $_SESSION['niveis_acesso_id'] = $row_usuario['niveis_acesso_id'];
        header("Location: painel.php");
      } else {
        //echo "<div class=content><p style='color: red'>
        //      Erro: Usuário e/ou senha inválidos!</p>";
    
        // DA MESMA FORMA QUE PROPRIEDADES DE ATRIBUTOS DEVEM FICAR ENTRE ASPAS
        // TAG'S DEVEM SER FECHADAS
        echo "<div class=\"content\"><p style='color: red'>
              Erro: Usuário e/ou senha inválidos!</p>
              </div>".
      }
      */
      } else {
        exit();
      }
    ?>

     

     

    Só um complemento, que não tem haver com o tópico:

    16 horas atrás, mm_edilson disse:

    method=post

    Evite esse tipo de coisa, pois isso irá reduzir o desempenho, pois o browser vai ter que corrigir seu erro para method="post".

    Então sempre coloque o valor de um atributo dentro de aspas.

    Além do mais fique atento a fechamento de tag's

    <p>conteudo</p>

    <div>conteudo</div>

    <br />

    <input />

    A falta dessas normas podem causar anomalias estranhas na renderização do documento pelo browser

     


  14. Dar se não for um ambiente web.

    Exemplo uma página de servidor não pode acessar o conteúdo de um sistema operacional do usuário, graças a deus!

    Isso é questão de segurança além do mais impede que desinformados fiquem inventando moda com coisas que não tem nada haver.

     

    Se é um documento html por exemplo que é executado pelo próprio sistema operacional ao invés de um software como o navegador web pode-se abrir um diretório sim. Somente se for windows, outros sistemas operacionais que são seguros como o linux impedem esse tipo de ação "por segurança", no entanto o acesso pode ser concedido pelo terminal.

    <a href="file:///C:/">Abrir</a>

     

    Outro caso, se você adulterar o navegador ou criar um com essa finalidade pode sim. Pois abrir conteúdo qualquer browser vai impedir quando o link vier de algum ambiente web.

    Não vou dar mais detalhes pois estamos entrando numa área sombria que viola a segurança na web.


  15. Para começar jogue fora essa coisa aí que chama de script que insiste em usar.

     

    Então tá, mesmo a lógica não tendo nada haver, e o objetivo disso ser controverso....

    Digitei no primeiro input, o que eu digitar substitui o valor no segundo input, mas o segundo input só pode ter no máximo 20 caracteres (está aqui a falta de lógica).

    <input name="exemplo[]" /> <!-- input[0] -->
    <input name="exemplo[]" data-recebe="" /> <!-- input[1] -->
    
    <script>
        var input = document.getElementsByName('exemplo[]'),
            inputAlvo = {};
    
        input[0].addEventListener('keyup', digitar, false);
        input[1].addEventListener('keyup', digitar, false);
    
        function digitar(evento) {
            inputAlvo = evento.target;
            if (inputAlvo.dataset.recebe === '') {
                input[1].value = input[(input[0].value.length >= 1 ? 0 : 1)].value.substring(0, 20);
            } else {
                input[1].dispatchEvent(new Event('keyup'));
            }
        }
    </script>

     


  16. Tente algo como isso....

    <p>De qualquer forma os input só vão aceitar 20 caracters</p>
    <input maxlength="20" type="text" class="basic-usage" name="input-a" />
    <input maxlength="20" type="text" class="basic-usage" name="input-b" />
    
    <script>
        // Armazenamos todos elementos, teremos que pecorrer eles 2 vezes
        var input = document.querySelectorAll('input');
        // Quantidade de caracteres atuais
        var total_de_caracteres = 0;
        // Total de caracteres que podem co-existir
        var caracteres_permitidos = 10; // De acordo com seu tópico aqui seria 20, deixamos em 10 para exemplo
    
        // Percorremos os elementos para adicionar o evento neles
        for (var i = 0; i < input.length; i++) {
            input[i].addEventListener('keyup', digitar, false);
        }
    
        // Função que é executada através do ouvinte de eventos keyup
        function digitar(e) {
            // Começamos definindo que o total de caracteres é do input alvo
            total_de_caracteres = this.value.length;
            // Percorrendo os elementos novamente então
            for (var j = 0; j < input.length; j++) {
                // Se a volta atual do loop não for o input alvo aumentamos
                // o total de caracteres inseridos com o valor dos demais
                // inputs que existirem
                if (input[j] !== this) {
                    total_de_caracteres += input[j].value.length;
                }
            }
            // Então se o total for maior que o permitido
            // Redefinimos o valor do input alvo
            if (total_de_caracteres > caracteres_permitidos) {
                // Substituir tudo que é depois da quantidade permitida 
                this.value = this.value.substring(0, caracteres_permitidos);
            }
        }
    </script>

     


  17. 14 horas atrás, Luiz Henrique disse:

    Queria saber se há ganho de desempenho se após não precisar da variável mais eu destruir ela.

    Na verdade você está consumindo mais por eliminar.

    Não diria na seguinte situação dentre outras no contexto similar:

    Tenho um array onde executo loop nele para redenir valores. Só que novamente tenho que percorrer esse array em alguma parte futura do código e muitos dos índices não serão usados mais.

    Nesse caso eliminar os índices já no primeiro laço de repetição posso chegar a ganhar em desempenho ou não, dependendo do que vai ser eliminado.

     

    unset seria mais indicado se de acordo com o programa uma coisa não possa ser o esperado, podemos eliminar, e se mais tarde não existir, retornar a situação de erro de forma controlada.

     

    Para completar isso (não que seja algo errado):

    14 horas atrás, Luiz Henrique disse:
    
    $callback = Classe::primeiroSelect();

     

    Não reutilize, a menos que seja realmente necessário.

    Isso pode chegar a dar dor de cabeça em manutenções futuras e ter que ficar relendo várias vezes o código para saber o que realmente $callback está armazenando.

     

    Uma situação onde a gama de dados são registros que podem ultrapassar de 1000 e o loop deve ser excetuado duas vezes no segundo querys são lançadas.

    Eliminar os índices no primeiro loop poupa recursos que seriam usados novamente:

    Spoiler
    
    $categoryData = $select->result();
    
    // LOCALIZAR A CATEGORIA ALGO
    // DEFINIR SUA ORDEM DE EXIBIÇÃO
    // APAGAR
    foreach ($categoryData as $key => $del) {
        if ($del->c_hash == $categoryHash) {
            $order = $del->c_order;
            $delete->query("doc_category", "c_hash=:ch", "ch={$del->c_hash}");
            unset($categoryData[$key]);
        }
    }
    
    // ATULIZAR ORDEM DE EXIBIÇÃO DAS CATEGORIAS MAIOR DO QUE A APAGADA
    if ($delete->count()) {
        foreach ($categoryData as $upd) {
            if ($upd->c_order > $order) {
                $update->query(
                    "doc_category",
                    ['c_order' => ($upd->c_order - 1)],
                    "c_hash=:ch", "ch={$upd->c_hash}"
                );
            }
        }
    }

     

     


  18. <a href="#">Vai para o topo</a>
    
    <a>Não vai para o topo</a>
    <button>Não vai para o topo</button>

     

    O caractere # é um bookmak, como ele não específica um elemento id seu endereço é o início da tag body

    <a href="#exemplo">Vai para exemplo</a>
    <a href="#">Vai para topo</a>
    
    <div id="exemplo"></div>

     


  19. $array = [
        0 => ['id' => 1, 'nome' => 'Texto: a'],
        1 => ['id' => 2, 'nome' => 'Texto: b'],
        2 => ['id' => 3, 'nome' => 'Texto: c'],
        3 => ['id' => 4, 'nome' => 'Texto: d'],
        4 => ['id' => 5, 'nome' => 'Texto: e']
    ];
    if ($array[2]['nome'] === 'Texto: c') {
        echo("O \"Texto: c\" está na chave 2");
    }

     


  20. A questão mais é:

    Saber programar a aplicação e as querys em geral para o menor consumo da máquina é o que se deve se preocupar e não com o tamanho do banco de dados.

    Se não tem uma vasta capacidade de escrever código não importa qual tipo de banco de dados e seu tamanho a coisa sempre vai ter um retorno ruim.

     

    Faço também minhas essas palavras:

    3 horas atrás, Motta disse:

    A "grana" também é fator , quanto se pode pagar.

     


  21. Tem jeito melhor e mais eficaz de fazer isso acontecer, mas dessa forma fica mais simples de se entender.

    <style>
        * {margin: 0; padding: 0}
    
        #azul {
            max-width: 31.25rem; 
            margin: auto;
            height: 6.25rem;
            background-color: blue
        }
        #azul.acao {visibility: hidden}
    
        #verde {
            max-width: 31.25rem;  
            margin: auto;
            background-color:green;
            top: 0;
            position: sticky;
            visibility: hidden
        }
        #verde.acao {visibility: visible}
    
        .espaco {height: 312.5rem}
    </style>
    
    <div id="azul"> Azul </div>
    <div id="verde"> verde </div>
    <p id="p2">teste</p>
    <div class="espaco"></div>
    
    <script>
        var azul = document.getElementById('azul'),
            verde = document.getElementById('verde');
    
        document.addEventListener('scroll', function (evento) {
            if (window.scrollY >= azul.offsetHeight) { // Quando a rolagem for maior ou igual a altura do azul
                azul.classList.add('acao');
                verde.classList.add('acao');
            } else {
                azul.classList.remove('acao');
                verde.classList.remove('acao');
            }
        }, false);
    </script>

     

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.