Jump to content

Omar~

Members
  • Content count

    911
  • Joined

  • Last visited

  • Days Won

    15

Posts posted by Omar~


  1. Certo, certo.... Está usando win8/8.1 ou 10, enfim a causa pode vim da porcaria do windows defender, mas descarto isso, pelo fato de um arquivo que não interage com o que estava acessando funcionar.

    Acredito que o problema esteja no diretório "sistema" que está acessando, pode uma condição do PHP ou uma reescrita de um htaccess.

    Por não saber o que tem nesse diretório e por desconhecer sua source não tenho e ninguém terá como lhe ajudar.

    Vá até esse diretório analise arquivos como index, home ou default (.php/.html/.hta/.htaml) se existir um .htaccess analise-o também porque em algum desses arquivos está fazendo é não renderizar um html para o usuário.

    Pode também ser um erro fatal do php e a demonstração desses erros estão desabilitados em algum arquivo como os que mencionei.


  2. Fez o arquivo que falei e colocou o que disse nele?

    Se sim ficou todo em branco?

    Veja o console do browser se há algum warning ou error apresentado.

     

    Qual é SO que está usando?


  3. Faz um teste aí....

    Vá até a pasta htdocs pegue todos os arquivos e tire-os de lá. (Você pode até apagar se quiser.....)

    Então nessa mesma pasta crie um arquivo qualquer desde que seja um .PHP.

    Nesse arquivo escreva:

    Citar

    <?php phpinfo(); ?>

     

    Abra seu browser e acesse 127.0.0.1/nome_do_arquivo_que_criou.php

     

    Veja se funciona...

    Funcionou? Cache do seu browser está ainda pegando os heades de index.php dos arquivos da documentação.

    Não funcionou? 99% de certeza que o Apache não está funcionando.


  4. Tipo isso?

    <?php
    function formatStr($string) {
        $match = [];
        $match['a'] = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜüÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿRr"!@#$%&*()_+={[}]/?;:.,\\\'<>°ºª`';
        $match['b'] = 'aaaaaaaceeeeiiiidnoooooouuuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr                                 ';
        $decode = strtr(utf8_decode($string), utf8_decode($match['a']), $match['b']);
        $stroke = preg_replace('/[ -]+/', '-', $decode);
        $leftStroke = ltrim($stroke, '-');
        $rightStroke = rtrim($leftStroke, '-');
        return (utf8_encode($rightStroke));
    }
    
    function createCode($len = null) {
        $lengths = (isset($len) ? (int) $len : 10);
        $chars = '0123456789aAbBcCdDeEfFgGhHiIjJkKlLm0123456789MnNoOpPqQrRsStTuUvVxXyYwWzZ0123456789';
        $code = "";
        $arr = str_split($chars);
        for ($i = 0; $i < $lengths; $i++) {
            $code .= $arr[array_rand($arr)];
        }
        return ($code);
    }
    
    $nome = "João Maria José";
    $resultado = mb_strtolower(formatStr($nome)) . '-' . createCode(20);

     


  5. Vai transportar dados para o update?

    Qual a linguagem back-end?

    Essas são coisas que você deveria informar.

     

    O problema do ajax nessa situação é que dependendo do vai requisitar/atualizar * a quantidade de pessoas acessando  pode deixar seu servidor lento. Em casos extremos até a queda ou travamento do mesmo.

    por isso o ideal é usar uma linguagem javascript serve-side no caso NodeJS para manipular WebSocket. Mais informações em:

    https://developer.mozilla.org/pt-BR/docs/WebSockets/Writing_WebSocket_servers

     

    No entanto se sua aplicação não terá uma gama enorme de centenas acessos simultâneos e não irá executar muitas consultas e updades simultâneos a cada atualização. Você pode sim usar ajax a cada X segundos, usando-se por detectar a atividade do(s) usuário(s) na página.

    O que isso quer dizer?

    - Quer dizer que faremos uma aquisição de arquivos ao qual fará o updade a cada intervalo de tempo, mas só quando o usuário estiver visualizando o documento, caso ele minimize o browser, esteja em outra aba; esse processo de aquisição de arquivo automatizado é interrompido, e iniciado caso o usuário retorne.

     

    Então vamos ao caso do ajax (obs.: Usarei esse script que desenvolvi por ser bem pático para fim de requisições)

    Arquivos necessários:

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

    Exemplo:

    Spoiler

     

    
    <!-- Nesse lugar será carregado o arquivo por via GET que fará o update -->
    <div id="executar_arqui"></div>
    
    <script>
        var intervalo = 0;
    
        /* Fazer com que o carregamento automático só funcione caso a pessoa esteja visualizando o documento */
        document.addEventListener('visibilitychange', visibilidade, false);
        function visibilidade() {
            if (document.hidden) {
                parar();
            } else {
                iniciar();
            }
        };
        /* --- */
    
    
        /* Define que a cada X segundos a função de carregar deve ser executada */
        function iniciar(alguma_infomacao) {
            window.intervalo = setInterval(function () {
                carregar((alguma_infomacao ? alguma_infomacao : false));
            }, 10000); // A cada 10 Segundos
        };
    
        /* Para a contagem de tempo pararando as requisições */
        function parar() {
            clearInterval(window.intervalo);
        };
    
        /* Carrega o arquivo que fará o update */
        function carregar(recebe_isso) {
            carregar.prototype = new AjaxRequest();
            carregar.prototype.open('executar_arqui', 'diretorio/arquivos.php' + (recebe_isso ? '?alguma_coisa=' + recebe_isso : null));
        };
    </script>

     

     


  6. @Alberto Nascimento uma session nada mais que é um ARRAY global portanto você deletar como deleta qualquer outro array no php.

    unset($_SESSION); // Simples assim

     

    Porque se isso aqui não surtiu efeito acredito que seu problema é o buffer do cabeçalho.

    2 horas atrás, Sapinn disse:
    
    <?php
    session_start();
    session_unset();
    session_destroy();
    header("location:../index.html");
    ?>

     

     

     

    Experimente essa minha classe para gerenciar sessões:

    Session.php

    Spoiler
    
    <?php
    /**
     * ********************************************
     * * @class Session
     * * @copyright (c) Spell master
     * * @version 2.0
     * * @see Classe para gerenciamento de cessões
     * ********************************************
     * @usage
     * * Iniciar cessão
     * $session = Session::startSession();
     * Inicia as cessões, caso já iniciadas
     * retorna as mesmas não iniciando novamente.
     * 
     * * Definir uma cessão
     * $session->Word = "Olá";
     * 
     * * Verificar as cessões estão ativas
     * Session::getSession();
     * 
     * * Remover todas cessões
     * Session::destroy();
     * 
     * * Remover a cessão expecífica
     * unset($session->Word);
     * 
     * ********************************************
     * * Para evitar roubo de cessões defina
     * um nome prefixo para suas cessões exemplo:
     * $session = Session::startSession('nome');
     * $session->Word = 'Olá';
     * var_dump($_SESSION);
     * - Resultado:
     * array(1) { ["Word_nome"]=> string(3) "Olá" }
     * ********************************************
     */
    
    class Session {
    
        private static $status;
        private static $globalName;
        private static $session;
    
        /**
         * ****************************************
         * Gerencia entradas para cessões.
         * ****************************************
         * @Param {STR} $prefix
         * Se definido o prefixo todas as cessões
         * terão esse prefixo alocado.
         * ****************************************
         */
        public static function startSession($prefix = null) {
            self::$globalName = (empty($prefix) ? null : '_' . $prefix);
            if (!self::$status) {
                self::$session = new self;
            }
            self::$status = session_start();
            return (self::$session);
        }
    
        /**
         * ****************************************
         * Verifica se existem cessões iniciadas
         * ****************************************
         */
        public static function getSession() {
            return (self::$status);
        }
    
        /**
         * ****************************************
         * Elimina todas cessões iniciadas
         * ****************************************
         */
        public static function destroy() {
            self::$session = session_destroy();
            unset($_SESSION);
        }
    
        /**
         * ****************************************
         * Métodos de auxilio a classe.
         * Automatiza eventos...
         * ****************************************
         */
        public function __set($name, $value) {
            $_SESSION[$name . self::$globalName] = $value;
        }
    
        public function __get($name) {
            if (isset($_SESSION[$name . self::$globalName])) {
                return ($_SESSION[$name . self::$globalName]);
            }
        }
    
        public function __isset($name) {
            return (isset($_SESSION[$name . self::$globalName]));
        }
    
        public function __unset($name) {
            unset($_SESSION[$name . self::$globalName]);
        }
    
    }

     

     

     

    Muito simples de usar. Vou demostrar o exemplo com três arquivos

    Arquivo 1. Onde criamos a cessão

    Citar
    
    <?php
    require_once ('Session.php');
    $session = Session::startSession();
    $session->dizer = "Olá";
    
    var_dump($_SESSION); // array(1) { ["dizer"]=> string(4) "Olá" }
    
    if (isset($session->dizer)) {
        echo '<p>Existe a $_SESSION[\'dizer\']</p>';
    }

     

     

    Arquivo 2. Onde destruímos a cessão:

    <?php
    require_once ('Session.php');
    $session = Session::startSession();
    var_dump($_SESSION); // array(1) { ["dizer"]=> string(4) "Olá" }
    
    if (isset($session->dizer)) {
        echo '<p>Existe a $_SESSION[\'dizer\'] e vamos destruír</p>';
        Session::destroy(); // <<<<< Destroi todas cessões iniciadas!
    }

     

    Arquivo 3. Onde verificamos quais sessões existem:

    <?php
    require_once ('Session.php');
    $session = Session::startSession();
    var_dump($_SESSION);
    
    
    if (isset($session->dizer)) {
        echo '<p>Existe a $_SESSION[\'dizer\']</p>';
    } else {
        echo '<p>Não existe a $_SESSION[\'dizer\']</p>';
    }

     

    Bom, se você acessar o (arquivo 1) pelo browser verá que a sessão é criada, então acessar o (arquivo 3) vemos que essa cessão que criamos no arquivo 1 existe.

    Porém se acessar o (arquivo 2) a sessão vai deixar de existir, então se irmos até o arquivo 3 vemos que não existe mais a cessão.

     

    No mais leia a documentação da classe pois exitem mais recursos disponíveis


  7. ??? Deveria está fazendo o calculo?

     

    Tentou verificar o que são:

    $qtC

    e

    $vatual

     

    Faça um var_dump dessas variáveis e veja se seus valores são dados que podem ser calculados, pois acredito que possa ser essa a razão de não fazer o calculo.

    Se mesmo assim forem strings numérias converta-as em INTEGER antes do calculo.


  8. Não entendi direito mas veja se é isso:

     

    SELECT * FROM boletos WHERE proc = 0 AND (idOrganizador !='0' AND idPiloto !='0');

     

    Instrução da query:

    Citar

    Selecione tudo em boletos

    Onde proc tem que ser '0'

    E na mesma linha idOrganizador não pode ser '0' e também idPiloto não pode ser '0'

    Obs.: idOrganizador & idPiloto forem do tipo (int) você também pode instruir dessa forma >'0'


  9. De fato, tudo se  normalizou hoje devido a backup's da hospedagem, mas a treta continua e mesmo agora insiste que tem que ser ressarcido pelo estresse e problema passado.

    Eu disse ao meu parsa que fique tranquilo a culpa de fato não foi dele, pois ele me passou os arquivos, revisei e vi que realmente o problema não foi causado pelo programador.

     

    Mas será um briga de "Davi VS Golias" pois é uma franquia de varejo presente em quase todos estados brasileiros enquanto ele só um programador autônomo que passa praticamente 20 horas por dia na frente do PC para sustentar a família.

     

    De fato não sei o que querem tirar dele, porque o que essa empresa ganha em um dia ele nem chega perto de ganhar em um/dois/três meses. E acho que qualquer judiciário que for analisar o caso terá esse mesmo entendimento meu.


  10. 2 horas atrás, Alberto Nascimento disse:

    Existe algum código que faça redimensionar as imagens?

     

    Ter, não tem. Mas tem como recriar outra com o tamanho específico usando a função imagecopyresampled

    Porém acho que complicar com algo simples como o seu não é o caso.

    //Ao invés de fazer
    echo "".$rows_cursos['novonome']."<br>";
    
    //Faça
    echo "<pre>";
    var_dump($rows_cursos['novonome']); // Precisamos saber como essa string é

    E poste o que aparece na tela

     


  11. Boas, desculpa aí mas nem sei onde postar algo como isso...

    A poucos minutos antes dessa postagem um amigo meu me liga dizendo que se enfiou numa encrenca devido a um sistema que ele desenvolveu.

    Todos nós sabemos que nunca se deve modificar arquivos no servidor por FTP enquanto a aplicação está sendo usada.

    Porém nesse mesmo sistema que ele criou, existe uma página para o administrador alterar configurações da aplicação tais como senhas, comportamento, acessos dentre outras configurações.

    Nada mais que pegar o valor de inputs usar a função fwrite e re-escrever o arquivo que guarda essas informações com as novas.

    Acontece que durante a manhã o dono do website fez modificações nas configurações e ao salvar por algum bug do PHP a função fwrite  simplesmente escreveu o arquivo de modo errôneo o que expôs em texto toda a configuração do website incluindo login e senha de acesso ao banco de dados.

    E assim permaneceu por quase 24h até que o dono da aplicação conseguiu contactar esse meu amigo que desenvolveu e fez a restauração do arquivo manualmente, porém já era tarde demais, alguém acessou o servidor e apagou tudo.

     

    A questão complica mais que durante a madrugada ele me liga desesperado pois seu cliente ao qual ele desenvolveu a aplicação falou que vai processar-lo por causa dos danos, uma vez que todos dados de estoque, débitos e créditos foram perdidos, pois o infeliz parece que nunca ouviu falar em backup.

    Segundo o dono que comprou o website desse meu amigo, o prejuízo pode ultrapassar os 1.5 milhões.

    Mas é um caso isolado pois o website já estava a quase 2 anos online e tempos em tempos as configurações eram alteradas e nada de anormal aconteceu, por isso acredito que foi algum tipo de bug.

    Acontece que eu também faço isso a anos em websites que desenvolvo e nunca recebi qualquer tipo de reclamação sobre algum erro nem que seja similar.

     

    E se fossem você o que faria nessa situação complicada?


  12. Hun... Nesse caso basta fazer a substituição, listando todos os caracteres em um array e usar a função str_replace para substituí-los por nada.

    Exemplo:

    <?php
    $stringInicial = " > 'João' e 'maria' < foram no \"mercado\" comprar = `pão`";
    var_dump($stringInicial);
    
    $invalidos = [ // Array com todos tipos de caracteres que queira remover da string;
        '"',
        "'",
        '`',
        '=',
        '-',
        '<',
        '>'
    ];
    
    $stringLimpa = str_replace($invalidos, null, $stringInicial); // Fazendo a substituição por um valor nulo
    
    echo ("<hr />");
    var_dump($stringLimpa);

    Lógico que isso irá remover quaisquer caracteres que estejam no array, porém temos nesse termo espaços duplicados como "o asterisco representa um espaço"

    Antes: *>*'João'

    Depois:  **João

    Então basta fazer o tratamento desse termo.

     

    Porém se for mesmo questão de usar uma expressão basta usar o regex aceitando acentuações:

    <?php
    $stringInicial = " > 'João' e 'maria' < foram no \"mercado\" comprar `pão`";
    var_dump($stringInicial);
    
    echo ("<hr />");
    $stringLimpa = preg_replace('/[^[:alnum:] a-zÀ-ú]/', '', $stringInicial);
    var_dump($stringLimpa);

     


  13. Sorry... É que quando coloco um código aqui no forum apenas o escrevo aqui, dificilmente testo antes.

    Mas, enfim, podemos então verificar se o valor digitado no input é um número válido toda a vez que waapTel1 é clicado.

    Sim o evento vai existir sempre, porém a função só é acionada caso o que está no input seja um número de telefone válido. (Obs.: Usei como referência dados da ANATEL)

    Assim aceitando como válido os seguintes tipos de números de telefone:

    • +55(99)99999-9999
    • +559999999-9999
    • +5599999999999
    • 9999999-9999
    • 99999999999
    • 9999-9999
    • 99999999

    Desta vez testei e está funcionando bem como esperado aqui, dar um olhada:

    Spoiler
    
    <input type="text" name="telefone" id="telefone" />
    <button id="waapTel1">waapTel1</button>
    
    <script>
        var telefone = document.getElementById('telefone');
        telefone.value = null; // Apaga qualquer valor no input vindo de cache ou atualização da página
    
        document.getElementById('waapTel1').addEventListener('click', function (e) {
            if (numeroValido()) {
                // openWhatsApp(b, apelido); // Requisitando a função pois o número do input é válido
                console.log('Requisitando a função'); // Só por depuração mesmo
            } 
            else { // Só por depuração mesmo
                console.log('O numero não é válido'); // Só por depuração mesmo
            } // Só por depuração mesmo
        }, false);
    
        function numeroValido() {
            var numero = ((window.telefone).value); // "numero" getID do input onde é digitado o numero
            if (numero.length && numero.match(/\s/g)) {
                return false;
            } else if (numero.length && !numero.match(/^(?:(?:\+|00)?(55)\s?)?(?:\(?([1-9][0-9])\)?\s?)?(?:((?:9\d|[2-9])\d{3})\-?(\d{4}))$/)) {
                return false;
            } else {
                return true;
            }
        }
    </script>

     

     

    O problema é que não consegui uma forma de validar se é realmente um número de telefone móvel ou fixo sem conflitar.... :confused:

     

    Tomei a liberdade de criar uma máscara ao input fazendo com que o usuário só possa digitar um número de telefone de forma correta (mas para o funcionamento tive de alterar a função):

    Spoiler
    
    <input 
        type="text"
        id="telefone"
        maxlength="15"
        placeholder="Forneça o telefone"
        onkeypress="mask(this, mtel)" onblur="clearTimeout()"
        required
        />
    
    <button id="waapTel1">waapTel1</button>
    
    <script>
        var telefone = document.getElementById('telefone'),
                vObj,
                vFun;
        telefone.value = null; // Apaga qualquer valor no input vindo de cache ou atualização da página
    
        document.getElementById('waapTel1').addEventListener('click', function (e) {
            if (numeroValido()) {
                // openWhatsApp(b, apelido); // Requisitando a função pois o número do input é válido
                console.log('Requisitando a função'); // Só por depuração mesmo
            }
        }, false);
    
        function numeroValido() {
            var numero = ((window.telefone).value); // "numero" getID do input onde é digitado o numero
            /*
             * Descartamos isso
             * if (numero.length && numero.match(/\s/g)) {
             *     return false;
             * } else
             * if (numero.length && !numero.match(/^(?:(?:\+|00)?(55)\s?)?(?:\(?([1-9][0-9])\)?\s?)?(?:((?:9\d|[2-9])\d{3})\-?(\d{4}))$/)) {
             *     return false;
             * } else {
             *     return true;
             * }
             */
    
            var exp = /^(?:(?:\+|00)?(55)\s?)?(?:\(?([1-9][0-9])\)?\s?)?(?:((?:9\d|[2-9])\d{3})\-?(\d{4}))$/;
            if (numero.length) {
                return (numero.match(exp) ? true : false);
            } else {
                return false;
            }
        }
    
        function mask(o, f) {
            window.vObj = o;
            window.vFun = f;
            setTimeout(function () {
                window.vObj.value = window.vFun(window.vObj.value);
            }, 1);
        }
    
        function mtel(v) {
            var valor = v.replace(/\D/g, '')
                         .replace(/^(\d{2})(\d)/g, '($1) $2')
                         .replace(/(\d)(\d{4})$/, '$1-$2');
            return valor;
        }
    </script>

     

     

    Em ambos eu testei e está funcional aqui, também de nada adianta isso sem uma verificação do lado do servidor


  14. A tag <section> define toda uma cessão dentro no documento, essa por vez pode conter diversos elementos incluindo artigos.

    A tag <article> define um artigo, dentro de um contexto, esse por sua vez contém um texto narrativo como postagens, comentários, descrições etc...

     

    Portanto a estrutura mais adequada é a segunda.

     


  15. Estranho... Deveria encerrar o evento nesse situação aí!

    Bom, podemos também usar alguma variável que é mudada conforme o comprimento do input se altere.

    Dar uma olhada:

    <input type="text" name="telefone" id="telefone" />
    <span id="waapTel1">waapTel1</span>
    
    <script>
        var podeClicar = false; // Essa variável quando verdadeira vai realmente chamar a função
        var telefone = document.getElementById('telefone');
        telefone.addEventListener('keypress', verificaNumero, false);
        telefone.value = null; // Apaga qualquer valor no input vindo de cache ou atualização da página
    
        document.getElementById('waapTel1').addEventListener('click', function (e) {
            if (podeClicar) {
                openWhatsApp(b, apelido);
            }
        }, false);
    
        function verificaNumero(e) {
            var alvo = e.target.value;
            if (alvo.length >= 11) {
                podeClicar = true;
            } else {
                podeClicar = false;
            }
    
        }
    </script>

     


  16. Só completando o que o @Williams Duarte disse, sobre o erro de usar jQuery também você tem uma função sendo requisitada a cada 5 segundos e lançando uma query em seu SQL a cada sincronização.

    Isso não é o ideal imagina 10 páginas abertas por 1000 usuários. São mais de 100.000 carregamentos e requisições por minuto o suficiente para sufocar seu servidor.

    Prefira deixar esse recurso sendo manuseado por WebSocket por exemplo


  17. Acontece que na primeira situação você tem uma função anônima agregando uma outra função e não um evento de disparo.

    E para você encerrar um evento você tem que ter um evento iniciado.

     

    Bom nesse caso, você pode ter uma função que ouvirá o evento, assim sendo podemos remover-lo uma vez que alguém está ouvindo.

    Outra coisa é que ficou confuso sobre como esse evento deve ser encerrado, uma vez que você tem o objeto elem ao qual dispara o evento, e você tem um DOM#ID waapTel1 que não sei se é elem.

    elem.addEventListener('click', ouvirEvento, false);
    
    function ouvirEvento(e) {
        openWhatsApp(b, apelido); // Talvez seja necessário a composisão de objetos ou prototipos para chegar em "b, apelido"
        elem.removeEventListener('click', ouvirEvento);
    }

     

     


  18. Se eu entendi direito, seria como se o administrador pudesse ordenar quais "empresas" seriam priorizadas como ordem de exibição

    Nesse caso particularmente faria uma adição na tabela para ordenar isso, ou criaria outra para tal afim, e como nosso amigo @marsolim disse é o recurso eficiente.

    E não usaria um "espaço" e sim um input ou um select para tal coisa, seguindo o conceito que haveria uma coluna ou tabela onde poderia armazenar esse dado. No mais é até um upgrade simples dependendo da arquitetura do sistema.

     

    Porque "não é possível de se fazer" uma vez que o cliente/empresa pode alterar o campo onde fica gravado o nome.

    Se nós tentarmos pegar os espaços não dar certo pois por exemplo podemos ter um nome composto com "espaços" tipo " Loja de roupa" .

    Mesmo que tenhamos um espaço no início temos também espaços no decorrer da string, mesmo que possamos fazer uma expressão regular para tal afim acho que não daria certo.

     

    Veja essa questão dos espaços:

    <?php
    $stringAnterior = "   anterior";
    var_dump($stringAnterior);
    
    $totalDeEspacos = substr_count($stringAnterior, ' ');
    $espacos = " ";
    $novaString = str_repeat($espacos, $totalDeEspacos) . "substituir";
    echo ("<br />");
    var_dump($novaString);

     

     


  19. Simples sua tag <a> deve está dentro de uma tag <div> essa recebe a propriedade "relative".

    • A tag <a> vai dentro da <div> relativa
    • A tag <a> recebe a propiedade "block"
    • A imagem vai dentro da tag <a>
    • O elemento de "LIKE" dentro da taga <div> relativa fora da tag <a>.
    • O elemento de "LIKE" recebe a propriedade "abusolute"

    No mais o resto é posicionar o elemento do "LIKE" usando left e top


  20. Acho que só meu exemplo já explica, mas qualquer dúvida é só perguntar.

    <?php
    $test = new classeTeste;
    
    echo "Valor inicial \"{$test->myVar}\" <br />"; // 1000
    
    $test->alterar_myVar();
    echo "myVar após chamada do método: \"{$test->myVar}\" <br />"; // Continua sendo 1000
    
    $test->myVar = 2000;
    echo "Atributo público pode ser manipulado diretamente \"{$test->myVar}\" <br />"; // 2000
    
    echo "<hr />";
    echo "Valor inicial do atributo myVarB \"{$test->verMyVar()}\" <br />"; // 1000
    
    $test->alterarMyVar();
    echo "Valor do atributo myVarB depois de alterado \"{$test->verMyVar()}\" <br />"; // 20000
    
    //$test->myVarB = 2000; /* ERRO Não se pode acessar atributo protegido */
    
    class classeTeste {
    
        public $myVar = 1000; // Isso aqui é um atributo (público)
        private $myVarB = 1000;
    
        public function alterar_myVar() {
            $myVar = 20000; // Isso aqui é uma variável e não o atributo
        }
        
        /*
         * Nome de métodos não devem conter _ "underline" só letras minusculas e maiúsculas
         * Isso não é regra e sim boa prática
         */
        public function alterarMyVar() {
            $this->myVarB = 20000;
        }
        
        public function verMyVar() {
            return ($this->myVarB);
        }
    
    }

     


  21. 7 horas atrás, szLeonardo disse:

    Cara deu certo seu exemplo, muito obrigado, teria como me enviar um exemplo de autenticação de login com a descriptografia?

    É muito simples, eu seu formulário de login, você deve ter um campo input para nome de login e senha (eu sempre uso só e-mail e senha), enfim não importa. A questão é ter um campo ao qual poderemos localizar os dados do usuário no banco, pois nesse caso a senha não serve para localizar e sim para autenticar.

     

    Digamos então que o usuário digitou seu e-mail e sua senha, basta fazer uma busca no banco de dados por aquele e-mail, se existir podemos armazenar a senha do usuário em uma $var e fazer a autenticação:

    // Aqui estamos no contexto que o e-mail do usuário que está tentando logar existe
    if (password_verify($senha_digitada_pelo_usuario, $senha_criptograda_no_banco)) {
      // Podemos logar tanto o e-mail existe quanto a senha é do usuário
    } else {
      // a senha não confere de acordo com o SALT (Ou seja aqui ele errou a senha) 
    }

     

    Só para completar o coluna na tabela que vai armazenar a senha deve ser VARCHAR de pelo menos 255 caracteres, ou pode se um TEXT. 

     


  22. Hora?? Para que tanta "moda"?!

    Se a intenção é cadastrar e já logar, basta que ao completar o registro inicie os índices de session que forem cabíveis ao usuário logado, então redirecione para a página inicial por exemplo.

     

    Uns detalhes:

    Nisso aqui para começar

    23 horas atrás, szLeonardo disse:

    @$usuario      = trim(strip_tags($_POST['usuario']));

     

    Você tem um input name "usuario" blz não é?! Mas por causa do ofuscador @ que colocou alí, um malandro pode manipular o html removendo-o ou modificando-o, o PHP irá aceitar mesmo sendo inválido, ou seja a PDO vai inserir um valor nulo.

    Outra coisa não confie na função strip_tags ela pode ser facilmente burlada, use um filter_var para cada valor pois isso sim é seguro.

    Outra me parece que você deve ter um input que define o nível de acesso, isso não é seguro, algo assim só pode ser manipulado no back-end.

    Veja um exemplo de otimização que fiz:

    Spoiler
    
    <?php
    if (isset($_POST['cadastrar'])) {
        $usuario = (isset($_POST['usuario']) ? trim($_POST['usuario']) : false);
        $senha = (isset($_POST['senha']) ? trim($_POST['senha']) : false);
    
        if (!$usuario) {
            // Não recebeu $_POST['usuario'] ou o mesmo está vazio
        } else if (!filter_var($usuario, FILTER_SANITIZE_STRING)) {
            // Inseriu algum caractere que não é uma string válida, expl.: tentativa de XSS ou SQL INJECT
        } else if (!$senha) {
          // Não recebeu $_POST['senha'] ou o mesmo está vazio
        }
      	// Não precisamos filtrar a senha pois vamos trabalhar com criptografia nela
      	else {
            $salvar_usuario = htmlentities($usuario); // Previna erros de acentuação e codificação usando a função htmlentities
            $salvar_senha = password_hash($senha, PASSWORD_DEFAULT); // Proteja seus usuários use criptografia nas senhas
    
            $insert = "
                    INSERT INTO 
                        cad_usuario (usuario, senha, nivel_acesso) 
                    VALUES
                        (:usuario, :senha, :nivel_acesso)
                ";
    
            try {
                $result = $conexao->prepare($insert);
                $result->bindParam(':usuario', $salvar_usuario, PDO::PARAM_STR);
                $result->bindParam(':senha', $salvar_senha, PDO::PARAM_STR);
                //$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
                $result->bindParam(':nivel_acesso', '1', PDO::PARAM_STR);
                $result->execute();
                if ($result->rowCount()) {
                    echo ("<div class=\"alert alert-success\">"
                    . "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
                    . "<span style=\"font-weight:bold\">Sucesso!</span> O Usuario foi Cadastrado!</div>");
    
                    /*
                      AQUI VOCÊ INICIA AS SESSÕES E REDIRECIONA O USUÁRIO
                     */
                    $_SESSION['autenticado'] = true;
                    $_SESSION['usuario'] = $salvar_usuario;
                    $_SESSION['nivel_acesso'] = 1;
                    header('LOCATION: ./');
                    
                    // Ou 
                    /*
                  	?>
                    <script>
                      setTimeout(function () {
                        window.location.reload();
                        // ou
                        //window.location.href = 'local para ser redirecionado';
                      }, 3000);
                     </script>
                    <?php
                    */
                } else {
                    echo ("<div class=\"alert alert-danger\">"
                    . "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
                    . "<span style=\"font-weight:bold\">Erro ao cadastrar!</span>"
                    . "Não foi possível cadastrar o Usuario.</div>");
                }
            } catch (PDOException $e) {
                //echo $e;
                /*
                 * Registre um log de erros você não vai querer um espertalhão ter acesso ao código fonte caso algo der errado
                 * $e->getLine();
                 * $e->getMessage();
                 */
            }
        }
    }

     

     


  23. Eu sempre opto em ter uma tabela de confirmação outra de cadastro.

    Quando o usuário faz seu cadastro, armazeno todos os dados que ele inseriu na tabela de confirmação, mas também adiciono um código randômico em uma coluna, esse que por sua vez passo como link ao e-mail da pessoa exemplo:

    https://siteurl/confirmar_cadastro?chave=Hj1e5s1kauk4654KJa1mn2sa1lss423712146

    Então ao clicar em seu e-mail o usuário vai para a página de confirmação informando sua chave de ativação, ao qual faço a leitura da tabela, se a chave existe, pego todos os dados da dele inserido anteriormente e armazeno na tabela de cadastro, logo após então apago o registro da tabela de confirmação.

×

Important Information

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