Ir para conteúdo

Omar~

Members
  • Total de itens

    1325
  • Registro em

  • Última visita

  • Dias vencidos

    15

Posts postados por Omar~


  1. 15 horas atrás, Frank K Hosaka disse:

    Eu fiz uma pesquisa sobre a possibilidade de disponibilizar todas as constantes e funções para todos os módulos do PHP e tudo indica que existe uma extensão chamada phpize, mas só está disponível para quem usa Linux.

    Nem pensar em usar isso, só vai complicar sua vida ainda mais.

     

    Vamos por parte...

    DIRECTORY_SEPARATOR é uma constante nativa do PHP ela vem configurado de acordo com a separação padrão do sistema operacional, se a separação usa barra, o valor será "/", se a separação usa contra-barra o valor será "\".

    Quase impossível encontrar um SO que não reconheça a separação pela barra comum, ou seja

    Isso: 'dirA' . DIRECTORY_SEPARATOR . 'dirB' . DIRECTORY_SEPARATOR . 'dirC' . DIRECTORY_SEPARATOR

    É a mesma coisa de usar: 'dirA/dirB/dirC/

    Na verdade eu só uso que desse modo ao bater os olhos em cima já vejo que tem algo sendo anexo alí.

     

    Você pode usar a constante mágica nativa do PHP  "__DIR__" sempre retorna o diretório do arquivo em  que ela é acionada.

    Digamos que eu queira voltar uma diretório atrás e entrar em outro: __DIR__ . '../outro_diretorio'

    Ou seja do local atual retroceda e entre em outro, essa é uma das melhores dicas que sempre apresento as pessoas, pois assim fica muito mais fácil apontar locais de arquivos, se começar por onde está arquivo que vai anexar outro evitando qualquer discordância gerada por um de reescrita por htaccess em exemplo no apache.

    Citar

    Constantes nativas do PHP sempre vão funcionar pois estão ligadas ao código raiz do PHP

     

    Notei um problema bem perigoso no código, isso pode gerar uma dor de cabeça para ajeitar no futuro...

    Existem em seu código arquivos, diretórios e afins que usam caracteres diacríticos 

    20 horas atrás, Frank K Hosaka disse:

    require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/usuários.php';

    20 horas atrás, Frank K Hosaka disse:

    require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';}

     

    Fora o nome de classes, métodos, funções, objetos etc... que estão com letras acentuadas, isso nunca deve acontecer, vemos incontáveis pessoas que cometem esse erro depois ficam malucas tentando corrigir codificação, acentuações e tais.

    É como construir uma casa, se faz o alicerce errado, não adianta mais concerta-lo depois do telhado pronto, é derrubar tudo e reiniciar do zero.

     

    • POO não tem essa de "eu vou fazer do meu jeito porque assim fica melhor", o padrão deve ser LEI INVIOLÁVEL.
    • Classes sempre devem ter nomes iniciadas com letras maiúsculas
    • O nome do arquivo deve ser idêntico ao nome da classe.
    • Métodos de classe devem sempre começar com letras minúsculas e se for mais de uma palavra ficam juntas sendo a segunda começando com letra maiúscula. Expl: meuMetodo()
    • Funções devem começar com letras maiúsculas e segue o mesmo dos métodos de classe ao usar palavras compostas.

     

    Voltando ao problema...

    Não sei se de fato isso vai interferir na composição do PHP, mas quando tentei aderir tive muitos problemas parecidos, e todo mundo que conheço que usou passou por problemas.

    Usar uma barra antes para indicar o caminho de um arquivo, como aqui:

    20 horas atrás, Frank K Hosaka disse:

    <form method=post action=/mvc/controles/controle.php>

    Em teoria o php irá gerar na memória o código do controle.php, por causa da barra ele irá ao topo da arquitetura, antes do index, não sei se é realmente isso

    Além do mais você usa uma má prática de sintaxes depurativas que não é usar propriedades de atributos entre aspas, o não uso é apenas para fins de testes de desempenho pois vai forçar muito mais a máquina porque o navegador vai ter que concertar seu erro antes de renderizar o HTML e nem sempre ele corrige corretamente uma vez que há muito código do html mau escrito, assim como tem barras na propriedade que indica o arquivo para onde deve redirecionar o navegador pode chegar a enviar uma informação incoerente ao servidor que terá que entregar a composição da arquitetura completamente bagunçada.

    Você pode colocar propriedades fora de aspas?

    Pode, mas somente se não utiliza um linguagem de servidor por trás como o PHP, é nos mesmos princípios de escrever uma string dentro de uma função em usar aspas.

     

    Algumas coisas que você pode testar:

    Dentro da tag <head> do html você pode usar:

    <base href="endereco_http_do_website" />

    Assim seu html sempre será definido a partir de onde está o arquivo index ou seja a partir da raiz. Não influência diretamente no php, exceto em informações que vem do usuário, como endereço de um arquivo para formulários

    Para agilizar esse processo existe uma função no mesmo projeto BaseURI.php que sabe qual o endereço físico real independente do provedor, servidor ou diretórios acessados.

     

    15 horas atrás, Frank K Hosaka disse:

    Ele funcionou dentro do index.php, mas na hora que o controle.php invocou new usuários(), o PHP disse que não encontrou essa classe, quando esperava pelo menos mensagem de erro interno. A minha tese é que a rotina do login atualizou a página e mandou para o espaço a engenharia do autoload.

    Por isso mencionei um possível erro, é que controle.php está sendo gerado e anexo na memória antes do index.php ou seja antes que a função ou constantes existam.

     

    Similar a um problema é que se você tem 2 arquivos A & B.

    No arquivoA uma variável é criada, depois disso faço o inclusão do arquivoB e esse também vai reconhecer a variável pois ele está na memória depois.

    Por outro lado usamos o objeto XMLHttpRequest anexar o arquivoB ao A, nesse caso a variável ainda não existe para ele pois B está logo após o cabeçalho HTTP, mesmo que seja renderizado no HTML depois, o PHP o processa antes que sequer o arquivoA exista.

    Uma solução bem simples para essa situação é criar um arquivo coringa, esse irá carregar e definir tudo aquilo que será usado praticamente a todo momento.

    Esse arquivo coringa você o requisita novamente sempre quando precisar dos tais dados de uso periódico.

    O projeto usa um arquivo coringa como esse:

    https://github.com/Spell-Master/wesite_pessoal/blob/master/system/config.php

     

    Ou seja sempre que algo for anexo e os dados mais importantes gerados em config.php não existir novamente requisito ele sempre usando a função nativa do PHP require_once.

     

    Teste esses conceitos e vamos ver no que ai dar. No entanto acredito que só o uso de um arquivo coringa já deve solucionar o problema.

     

    Por fim deixo dicas de softwares bem mais eficientes, são gratuitos e o melhor não possuem propaganda nem rouba dados de sua máquina:

    Substituir o wampserver por: https://www.apachefriends.org/pt_br/download.html

    Substituir o vscode por: https://netbeans.apache.org/front/main/

    Depois que passar a usar nunca mais vai querer usar outros. O netbeans mesmo a melhor IDE que existe, te ajuda muito te puxa a orelha quase sempre quando se tenta inventar moda e escrever o código errado, de fato o netbeans não te deixa escrever sintaxes de código errado.


  2. @Frank K Hosaka Sugiro que crie um tópico sobre o assunto, para não desviar esse.

    Seu problema me parece ser da configuração do seu PHP, o que requer alguns posts até encontrar qual é o problema mesmo.

     

    Faça o download desse projeto meu que nem vou trabalhar mais nele.

     https://github.com/Spell-Master/wesite_pessoal

    Em system/config/connections.php configure um banco de dados seu aí.

    O banco de dados crie uma tabela e um registro qualquer.

    Peque qualquer arquivo dentro de modules existe até um de teste de produção _TESTE_.php

    Nele faça a leitura da tabela que você criou:

    <?php
    $objeto = new Select();
    $objeto->query('nome_da_tabela_no_banco_de_dados');
    
    echo "<pre>";
    var_dump($objeto->result());

    Se configurou corretamente o acesso em connections.php e não há problemas de configuração do seu php verá todos os registros da tabela no banco de dados que você criou.

    Note que em nenhum momento o arquivo da classe Select.php e nem a Connect.php foram incluídas ou requeridas elas estão em diretórios distintos, mas uma função usada no projeto o spl_autoload_register fez a mágica acontecer.

     

    Se não funcionou com meu projeto, crie um tópico a respeito do problema para que toda comunidade possa ajudar a encontrar uma solução.

    Frameworks podem causar anomalias ao usar recursos nativos do PHP ou até conflitar com eles, normalmente eles para funcionar desativam ou ativam aplicações do PHP alterando sua configuração padrão.

    Também temos o lado da versão do PHP, enfim são várias questões a serem abordadas.


  3. 4 horas atrás, Frank K Hosaka disse:

    É muito difícil, mas assim que você pegar o jeito, vai querer abandonar o PHP e partir para o Laravel.

    Laravel nada mais é que um framework que usa o PHP logo a ferramenta tem suas raízes que é o PHP.

    Mas sim, não é PHP bruto e simples. Possui suas próprias peculiaridades para usar o PHP.

    Não uso e não recomendo o uso de frameworks apesar deles serem de grandiosa utilidade por agilizar conceitos básicos do desenvolvimento.

     

    Um framework te prende a ele e somente a ele impedindo e limitando o que pode ser feito apenas usando as sintaxes do simples PHP, fora que com que o utilizador aos poucos perca suas capacidades de desenvolver um software, robusto e leve.

    Frameworks são Úteis? Claro que sim.

    Frameworks são Inúteis? Claro que sim.

     

    Orientação ao objeto não é nada difícil, os tutoriais/aulas que tem por aí que enfiam isso na cabeça de quem está a aprender só para o egocentrismo de dizer: "Orientação é difícil veja como sou expert por te ensinar".

    Orientação ao objeto é que torna a programação em PHP muito mais fácil.


  4. Evite fazer requisição de arquivos em métodos, sei que dependendo do cenário isso é necessário.

    Nosso colega apresentou um recurso viável e muito coeso.

    Possuir uma classe específica só para conectar.

     

    Mas vou sugerir algo diferente, ao invés de manter a conexão fixa hora que o servidor pode cair o uso do método construtor na classe pode gerar problemas nessa situação nada grave.

    Citar

    Somente estrando se por ventura alterar o servidor de armazenamento do banco de dados senhas, banco, dados e coisas similares, mas ainda existem usuários acessando a aplicação.

     

    Enfim pode optar por herança, toda classe que possuir métodos para acesso ao banco de dados é filha da classe mãe que faz a conexão.

    Na classe mãe você pode optar por duas alternativas:

    • Usar um método que devolve o atributo que armazena a conexão.
    • Usar o mesmo atributo que armazena a conexão (menos confiável).

    Em ambos os casos para que a classe filha possa acessar o método ou atributo deve ser protegido, não público para que não haja alguma forma de arbitrariedade da aplicação.

    A classe filha você estende ela para a mãe assim pode usar quaisquer atributos ou métodos criado anteriormente.

     

    Outra dica que digo; é usar constantes, assim em toda a aplicação ela é válida sendo em classes ou qualquer outro ambiente da aplicação. (Use para armazenar dados de acesso).

     

    Veja na prática com essas duas classes que utilizam PDO.

    Spoiler

    Classe mãe responsável por estabelecer a conexão

    
    <?php
    /*-------------------------------------------*\
    |    ______ ____ _____ ___   __               |
    |   / ____ / _  / ____/  /  /  /              |
    |   \___  /  __/ __/ /  /__/  /___            |
    |  /_____/_ / /____//_____/______/            |
    |       /\  /|   __    __________ _________   |
    |      /  \/ |  /  |  /  ___  __/ ___/ _  /   |
    |     /      | / ' | _\  \ / / / __//  __/    |
    |    /  /\/| |/_/|_|/____//_/ /____/_/\ \     |
    |   /__/   |_|     PHP Script          \/     |
    |                                             |
    +---------------------------------------------+
    | @copyright: (c) 2014, Omar Pautz            |
    | @version: 6.5 (?/?/2017)                    |
    | @description: Conexão PDO SingleTon         |
    \*-------------------------------------------*/
    
    class Connect {
    
        private static $host = DB_HOST; // Endereço do banco de dados
        private static $user = DB_USER; // Usuário que tem acesso ao banco de dados
        private static $pass = DB_PASS; // Senha do usuário que tem acesso ao banco de dados
        private static $data = DB_DATA; // Nome do banco de dados
        private static $isConnect = null;
        private static $isError = null;
    
        /**
         * ****************************************
         * Constroi a conexão
         * ****************************************
         */
        private static function makeConnect() {
            try {
                if (self::$isConnect == null) {
                    $dsn = 'mysql:host=' . self::$host . '; dbname=' . self::$data;
                    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];
                    self::$isConnect = new PDO($dsn, self::$user, self::$pass, $options);
                }
            } catch (PDOException $e) {
                self::$isError = '<br>Não foi possível conectar com o banco de dados!<br> Descrição:' . $e->getMessage() . '<br>';
                die('Erro interno no servidor. Código de referência 500');
            }
            self::$isConnect->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return (self::$isConnect);
        }
    
        /**
         * ****************************************
         * Chama o construtor da conexão
         * ****************************************
         */
        protected static function callConnect() {
            return (self::makeConnect());
        }
    
        /**
         * ****************************************
         * Informa erros de conexão somente
         *  quando são disparados.
         * ****************************************
         */
        protected static function getError() {
            if (self::$isError) {
                return (self::$isError);
            }
        }
    
    }

     

    Classe filha para leitura de dados que tem acesso a classe mãe.

    
    <?php
    /*-------------------------------------------*\
    |    ______ ____ _____ ___   __               |
    |   / ____ / _  / ____/  /  /  /              |
    |   \___  /  __/ __/ /  /__/  /___            |
    |  /_____/_ / /____//_____/______/            |
    |       /\  /|   __    __________ _________   |
    |      /  \/ |  /  |  /  ___  __/ ___/ _  /   |
    |     /      | / ' | _\  \ / / / __//  __/    |
    |    /  /\/| |/_/|_|/____//_/ /____/_/\ \     |
    |   /__/   |_|     PHP Script          \/     |
    |                                             |
    +---------------------------------------------+
    | @copyright: (c) 2014, Omar Pautz            |
    | @version: 6.5 (?/?/2017)                    |
    | @description: Ler registros no banco de     |
    |  dados                                      |
    \*-------------------------------------------*/
    
    class Select extends Connect {
    
        /** @Attr: Armazena a tabela */
        private $selectTable;
    
        /** @Attr: Armazena os valores */
        private $selectFields;
    
        /** @Attr: Armazena a syntax da query */
        private $selectSyntax;
    
        /** @Attr: Armazena a conexão */
        private $selectConn;
    
        /** @Attr: Armazena se houve sucesso na incerssão */
        private $selectData;
    
        /** @Attr: Armazena o erro para personalizar a saída */
        private $selectError;
    
        /**
         * ****************************************
         * Recebe os dados para ler.
         * 
         * @Param {STR} $table
         * Tabela para ler.
         * @Param {STR} $fields
         * Campos para ler.
         * @Param {STR} $statements
         * Valores para ler.
         * @see: (LIMIT/OFFSET) São opcionais.
         * ****************************************
         */
        public function query($table, $fields = null, $statements = null) {
            if (!empty($statements)) {
                parse_str($statements, $this->selectFields);
            }
            $this->selectTable = 'SELECT * FROM ' . $table . (isset($fields) ? ' WHERE ' . $fields : null);
            $this->selectExecute();
        }
    
        /**
         * ****************************************
         * Para leitura personalizada da query.
         * 
         * @Param {STR} $Query
         * Tabela para ler.
         * @Param {STR} $statements
         * Valores para ler.
         * @see : "LIMIT/OFFSET" São opcionais.
         * ****************************************
         */
        public function setQuery($Query, $statements = null) {
            if (!empty($statements)) {
                parse_str($statements, $this->selectFields);
            }
            $this->selectTable = (string) $Query;
            $this->selectExecute();
        }
    
        /**
         * ****************************************
         * Informa quantos resultados que foram
         *  encontrados.
         * 
         * @Return: (INT) Quantidade de registros
         * ****************************************
         */
        public function count() {
            return ($this->selectSyntax->rowCount());
        }
    
        /**
         * ****************************************
         * Informa os resultados que foram
         *  encontrados.
         * 
         * @Return: (ARRAY/BOLL)
         * ****************************************
         */
        public function result() {
            if ($this->selectData) {
                return ($this->selectData);
            }
        }
    
        /**
         * ****************************************
         * Informa erros de consulta.
         * 
         * @Return: (STRING/BOLL) Resultado
         *  a partir de PDOException
         * ****************************************
         */
        public function error() {
            if (!empty($this->selectError)) {
                return ($this->selectError);
            }
        }
    
        /**
         * ****************************************
         * Constroi a Syntax para query.
         * Altomaticamente detecta o uso de
         *  vinculos atribuitivos de resultado
         *  (LIMIT/OFFSET) e trata os mesmos como
         *  INTEGER.
         * ****************************************
         */
        private function selectConstruct() {
            if ($this->selectFields) {
                foreach ($this->selectFields as $type => $value) {
                    if ($type == 'limit' || $type == 'offset') {
                        $value = (int) $value;
                    }
                    $this->selectSyntax->bindValue(":{$type}", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR));
                }
            }
        }
    
        /**
         * ****************************************
         * Inicia a conexão e faz o
         * Prepare Statements.
         * ****************************************
         */
        private function selectConnect() {
            $this->selectConn = parent::callConnect();
            $this->selectSyntax = $this->selectConn->prepare($this->selectTable);
            $this->selectSyntax->setFetchMode(PDO::FETCH_OBJ);
        }
    
        /**
         * ****************************************
         * Executa os métodos e obtem os
         *  resultados.
         * 
         * @Return: (EXCEPTION) TRUE or FALSE
         * ****************************************
         */
        private function selectExecute() {
            $this->selectConnect();
            try {
                $this->selectConstruct();
                $this->selectSyntax->execute();
                $this->selectData = $this->selectSyntax->fetchAll();
            } catch (PDOException $error) {
                $this->selectData = null;
                $this->selectError = "Erro ao ler dados: {$error->getMessage()} {$error->getCode()}";
            }
        }
    }

     

     

    Veja que na classe filha o uso do prefixo extends depois do nome da classe atual seguida da classe ao qual vai herdar valores.

     

    Queria deixar aqui uma dica bônus, para que não precise ficar usando require nos arquivos de classe, uma função que no momento que você declara um objeto ela vai fazer isso de forma mágica, toda vez que uma classe for necessária essa função automatiza o processo para que não precise ficar escrevendo require de arquivo por arquivo.

    Portanto basta apenas usar um require no arquivo de que guarda a função no index.php por exemplo, dependendo da arquitetura do seu projeto, você nem precisará mais requerir

    Spoiler
    
    <?php
    /**
     * *********************************************************************
     * @function: Função para auto carregamento de classes
     * *********************************************************************
     * @copyright (c) 2014, Spell Master AND Zeed
     * @vesion: 6.0 2021, Spell Master
     * *********************************************************************
     */
    
    spl_autoload_register(function ($Class) {
        $findDir = [
            'database',
            'helper',
            'mailer',
            'model'
        ];
        $includeDir = null;
        foreach ($findDir as $DirName) {
            if (!$includeDir && file_exists(__DIR__ . FindClass($DirName, $Class))
                    && !is_dir(__DIR__ . FindClass($DirName, $Class))) {
                include_once (__DIR__ . FindClass($DirName, $Class));
    
                $includeDir = true;
            }
        }
        if (!$includeDir) {
            die("{$Class}");
        }
    });
    
    function FindClass($dir, $class) {
        return (
            DIRECTORY_SEPARATOR
            . '..'
            . DIRECTORY_SEPARATOR . 'class'
            . DIRECTORY_SEPARATOR . $dir
            . DIRECTORY_SEPARATOR . $class . '.php'
        );
    }

     

     

    Obs.:

    Spoiler

    Necessita PHP 7.3 ou superior. (Não fiz testes no PHP 8.2, mas acredito que não haja problemas).

    Na função o array $findDir lista quais diretórios existem arquivos de classes, assim você pode ter uma organização melhor como mostrada database somente para classes que vão usar o banco, mailer para classes para e-mail e por aí vai, edite como achar melhor.

    A outra função FindClass você diz em qual diretório estão as pastas da função anterior, apenas informe onde elas estão, como se fosse fazer um include ou require.

     

    Separar o diretório onde estão as pastas de classe se ganha muito em desempenho.

    O uso de duas funções não que seja necessário, apenas é um padrão de reponsabilidade desenvolvimento onde funções/métodos devem evitar ultrapassar 22 linhas.

     

    Exemplo:

    Diretórios da aplicação que foi usada

    Dentro da pasta raiz do projeto, onde se encontra o index.php etc... pasta system

    Dentro da pasta system > function

    Dentro da pasta function o arquivo da função de auto carregamento de classes

    Dentro da pasta system > a pasta class

    Dentro da pasta class estão as pastas listadas pelo array $findDir

     

     


  5. 7 horas atrás, terra disse:

    São bots e dá trabalho ficar apagando

    Use captcha, é para essa finalidade que isso existe.

    Você pode desenvolver um, não use sistemas alheios a eficácia está no código não ser conhecido para que programas não possam ser projetados para burlar.

     

    Existe um serviço da google que é "gratuito" onde você implementa somente a interface, sendo o código protegido pela empresa.

    Comece lendo: https://www.google.com/recaptcha/about/


  6. @terra É realmente necessário?

    A primeiro ver acredito que daria para criar uma expressão de avaliação de string, tal essa verificaria incoerência no texto.

    No entanto uma só não funcionaria, teria que fazer uma análise nas milhares possibilidades de combinações de letras possíveis. Aí entra o contexto que assim exigiria muito processamento para algo que realmente não seja necessário.

     

    Teria que ser somente com uso de expressões regulares e não daria para criar uma lista de nomes possíveis permitidos. Quantos nomes diferentes existem nos 8 bilhões de pessoas que existem aproximadamente no mundo? Inviável criar uma listinha para isso.

     

    Tenha em mente que seria um algoritmo bem chato de criar e levaria tempo para produzir-lo com eficácia aceitável, analisar diferentes combinações de letras para determinar o que é válido ou não, além do mais existem nomes de pessoas bem "bizarros"

     


  7. Só para complementar o tópico do colega que no geral postou algo simplificado, mas devo acrescentar em caso do leigo compreender que pode ser executado algo assim.

    Lembrando que no exemplo ou na condição de simplificação do aprendizado não há problemas.

    11 horas atrás, Frank K Hosaka disse:

    $ref=$_POST['ref'];

    Armazena o valor que atribuído ref que veio no protocolo não se sabe de quem ou de onde nem mesmo se foi seu formulário que enviou.

    O php vai armazenar na variável $ref sem problemas escapando qualquer codec.

    O problema é se usar instrução como essa em uma aplicação pronta e operando:

    11 horas atrás, Frank K Hosaka disse:

    $sqlVF=mysqli_query($ggCon,"select * from tab_aprendiz where ref=$ref");

    Veja e $ref entrou na string de comando sem tratamento algum, sem mencionar o perigo ao banco de dados apenas atentarei em uma quebra de código, tal finalizando o php na linha e imprimindo todo o código fonte processado pelo php, isso inclui dados de acesso em geral que a aplicação está usando no momento.

     

    Por fim, como mencionado não há problemas em usar, se for no termos de simplificar um exemplo, um teste ou para prover a curva do aprendizado, pois você sabe que é você que está enviando, e sabe o que está enviando.

    Nosso colega não errou em passar a var direto na string, pois o tratamento de dados requer um refino bem apurado de acordo com a situação e não cabe em um só post.

     

    Complementando meu post anterior havia me esquecido:

    17 horas atrás, Omar~ disse:

    Para que haja redirecionamento na tag <form> e os valores dos elementos do formulário possam está na url, basta apenas alterar o protocolo de método substituindo post por get

    <form method="get" action="pagina2.php">
      <input type="text" name="envio" value="exemplo" />
      <button type="submit">Enviar</button>
    </form>
    
    <--
        Tag's form não utilizam a atributo "name", somente seus componentes
        No atributo "action" você indica para onde os dados devem ser enviados (forneça o endereço se necessário)
        Submetendo o formulário teremos na url pois enviamos pelo GET e não POST:
            endereço http atual/pagina2.php?envio=exemplo
            Pode ser relativo dependendo das configurações do apache ou um htaccess
    -->

    O arquivo pagina2.php recebe a mesma coisa sem o uso do formulário, pode-se até digitar na barra de navegação que vai do mesmo jeito.

     

    <a href="pagina2.php?envio=exemplo">Enviar</a>

    POST também pode ser enviado, de forma arbitrária, só que não convém apresentar as formas necessárias para isso.


  8. Vou te mostrar a função mais últil do PHP: var_dump

    Com ela você testar qualquer informação existente ou não, com erros ou não

    Se clicado no link da tag <a> em pagina1.php:

    var_dump($_GET); // Tudo que existe na super global GET

    Se submetido o formulário 

    var_dump($_POST); // Tudo que existe na super global POST

     

    Para que haja redirecionamento na tag <a> o atributo deve possuir na propriedade o endereço do arquivo pagina2.php

    Para que haja redirecionamento na tag <form> e os valores dos elementos do formulário possam está na url, basta apenas alterar o protocolo de método substituindo post por get.

     

    Apenas para manipular o endereço da barra de navegação do usuário, leia seu tópico anterior pois respondi lá com o link da API que gerencia essa ação.

     

    Obs.: Não aconselhável manipular dados no servidor usando GET, apenas use para passar informações de referência, nunca para validação de dados.

     


  9. Antes de mais nada, assim como o colega disse o método usado mais ideal para levar dados de uma página/arquivo a outro é usando o protocolo GET.

     

    Respondendo a questão, não importa se vai levar dados por GET ou POST, basta apenas capturar o valor do input do formulário do arquivo anterior e  ao atributo value pode-se usar o comando echo do PHP para isso

     

    Usar 1 arquivo ao invés de 2 tem pros e contras

    Pros: Menos arquivos que na verdade uso de mais é desnecessário, além que deixa o código mais flexivel.

    Contras: Maior arquivo de armazenagem, requer mais memória e processamento de condicionais que monitorarão qual parte do código deve entrar em ação.

     

    Minha sugestão é que se é necessário reutilizar o valor de um input do formulário anterior que use um só mesmo, não precisa inventar moda, quanto mais simples, mais limpo, mais eficaz.

    Afinal de contas do que adianta levar o valor do input do primeiro formulário para o segundo se nesse segundo o usuário pode modificar, sem sentido não é? Fica a dica de um só formulário.

     

    Se for algo indispensável usar 2 ou mais formulários "o que acredito que não seja", pode-se deixar a responsabilidade de processamento com o usuário criando novos formulários através do javascript, assim poupa o servidor em criar algo desnecessário, pois o consumo do usuário será praticamente o mesmo, em criar novos form's sem redirecionar ou usando o servidor que no caso o download de todos os dados a cada processo.


  10. A tag button não contabiliza o atributo value.

    Use a tag input.

    Em caso de uso necessário da tag button capture valores determinados como o próprio texto no elemento ou mesmo a propriedade de atributo dataset.

     

    https://developer.mozilla.org/pt-BR/docs/Web/API/Node/textContent

    https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset

     

     

    Leia isso:

    https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array

    E evite inventar rodas quadradas como essa:

    Em 08/11/2023 at 15:17, Biel. disse:

    var x = document.getElementById('doc1');

    // x.value=xx; x.value="teste";

    // for(var i=0; i<x.length; i++){

    // x.value = "teste";

    // }

     


  11. Adicione um evento de click em cada link então você pode optar por duas alternativas:

    • Retornar a função e devolver um valor falso.
    • Prever o comportamento padrão do navegador com a tag.

     

    No entanto sugiro mesmo que use uma tag button é para esse tipo de finalidade que ela serve.

     

    Preparei um exemplo usando a minha biblioteca javascript

    Arquivos usados:

    https://github.com/Spell-Master/sm-web/blob/master/javascript/jsd/js-default.js

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

     

    <?php
    $idA = 'Simulando valor';
    $idB = 'Outro simulado de valor';
    ?>
    
    <script src="js-default.js" type="text/javascript"></script>
    <script src="ajax.js" type="text/javascript"></script>
    
    <p><a href="pagina.php?id=<?= $idA ?>" data-exemplo=""> pagina A </a></p>
    <p><a href="pagina.php?id=<?= $idB ?>" data-exemplo=""> pagina B </a></p>
    
    <div id="resultado"></div>
    
    <script>
        // Criando tudo antes para melhorar o desempenho
        var links = jsd('[data-exemplo]'),
            href = undefined,
            resultado = jsd('#resultado');
    
        links.click(function (evento) {
    
            // Impedindo que redirecione
            evento.preventDefault();
            // Extraíndo o valor de id do href
            href = jsd(this).attr('href').split('id=').reverse()[0];
    
            // Solicitando o arquivo pagina.php envinado a ele um Protocolo GET com os dados do link
            jsd.ajax({
                url: 'pagina.php',
                protocol: 'GET',
                type: 'html',
                response: 'text',
                values: {
                    pagina: href
                },
                onResult: function (resposta) {
                    resultado.html(resposta);
                }
            });
        });
    </script>

     

     


  12. Verifica se o contexto é interger

    https://github.com/Spell-Master/sm-web/blob/master/javascript/jsd/js-default.js#L453

    Porém o valor de um input é sempre string mesmo que sejam numeros, ou seja não passa pelo filtro da função.

     

    Outra alternativa é remover o que não é um numero.

    <script src="js-default.js" type="text/javascript"></script>
    
    <div id="exemplo"></div>
    <script>
        var criar = jsd.create({
            tagName: 'input',
            type: 'text',
            placeholder: '000',
            id: 'jump',
            classList: 'mini'
        });
        jsd('#exemplo').append(criar);
    
        jsd(criar).keyup(function (e) {
            this.value = this.value.replace(/\D/g, '');
        });
    </script>

     

    Citar

    Obs.: A biblioteca jsd do arquivo js-default.js apresenta simplificação nos meios de uso do javacript, essa biblioteca é de minha autoria mesmo visando agilizar processos de desenvolvimento.

    Visivelmente se nota todos termos abordados pelo javascript convencional.

     


  13. Agora a primeira coisa que me vem a cabeça é que você pode está usando o método de propriedade https://developer.mozilla.org/en-US/docs/Web/CSS/calc

    Quantas letras divididas por 100, esse valor se aplica a font-size do elemento, entretanto deve-se levar em consideração o tamanho de expansão da fonte usada.

    O negocio é tentativa e erro.

    Porém não estou tendo nada em mente para uma fonte 100% adaptável, a não ser redefinir o tamanho de acordo com o resolução.

     

    Se pensar em algo volto aqui.


  14. @gersonab Verifique sim o console mas use o navegador Mozilla-Firefox, verifique os elementos no seletor veja se eles possuem valor.

    - Caso possua, o problema está na parte de recebimento de dados antes ou durante o UPDADE.

    Antes da executar a query verifique os dados recebidos através da função var_dump 

    Os dados estão corretos nessa parte então presumimos que algo está errado na execução da query, você poderá saber qual o problema usando PDOException para lançar o motivo do erro pela exceção.

     

    - Caso os valores não estão presentes nas opções siga o procedimento anterior.

    Sem nenhum problema nos termos citados nessa parte veremos então o javascript, ao qual desconsidero ser o problema pois ele não monta o seletor.

     

    Se acha conveniente poste a estrutura das duas tabelas (não precisa dos registros) que irei fazer um exemplo prático para você analisar e compila-lo nas suas necessidades.

     

    O conceito apresentado pelo @washalbano é sem dúvida muito bom, assim se possui um arquivo que sempre estará de pronta entrega dos dados então é só montar o HTML com base no resultado. E necessariamente não é preciso trabalhar com JSON, porém é melhor pois quando se trata de arrays multidimensional é mais prático usar json no javascript.

    Mas considere que aplicar restrições/condições de leitura, hora que se usamos 2 ou mais tabelas; não precisaremos de ler outras tabelas quando apenas precisamos de uma só.

     

    Citar

    O que é um modal?

    Modal é um modelo usado para um bloco que surge em frente aos elementos visíveis do html na tela.

    
    <p>Se remover ou alterar o display do elemento abaixo ele me cobre, e isso é o que chama-se de modal</p>
    <div style="display:none; background:white; position: fixed; bottom: 10px; left: 10px;">
      Eu sou um modal
    </div>

     

     


  15. @rogerblower Veja que na minha postagem existe um spoiler onde está escrito "Mostrar conteúdo oculto"

    Pois bem clique para mostrar, verá então o código da classe.

    Copie todo o código dentro do spoiler.

    Como você está usando o wamppserver então dentro da pasta www crie um novo arquivo .php e cole o código da classe.

    Veja que o nome da classe é CreateCode então salve o arquivo com o mesmo nome.

    Agora crie outro arquivo .php esse você pode nomear como quiser.

    Nesse novo arquivo escreva isso:

    <?php
    require('CreateCode.php'); // Requisitando o arquivo da classe.
    
    $codigo = new CreateCode(); // Instanciando a classe, assim o objeto de orientação será $codigo
    $resultado = $codigo->defCode(10) . time(); // defCode é um dos métodos públicos da classe
    
    var_dump($resultado); // $resultado é o retorno do método

    Sugiro que estude sobre orientação ao objeto pois isso é o mais vital no php


  16. Essa classe possui métodos para geração aleatória de string, veja se algum lhe é útil:

    Spoiler
    
    <?php
    /**
     * ********************************************
     * * @copyright (c) Spell master
     * * @version 1.0
     * * Cria códigos aletórios
     * ********************************************
     */
    
    class CreateCode {
    
        private $lengths;
        private $chars;
        private $code;
    
        /**
         * ****************************************
         * Cria um código de string aleatório
         * ****************************************
         * @param {INT} $len
         * Quandidade de caracteres no código, se
         * não informado o valor será 5.
         * @return
         * Código alfabético com quantidade de
         * caracteres informados pelo $len.
         * ****************************************
         */
        public function strCode($len = null) {
            $this->lengths = (isset($len) ? (int) $len : 5);
            $this->chars = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVxXyYwWzZ';
            $this->setCode();
            return ($this->code);
        }
    
        /**
         * ****************************************
         * Cria um código de string aleatório
         * ****************************************
         * @param {INT} $len
         * Quandidade de caracteres no código, se
         * não informado o valor será 5.
         * @return 
         * Código numérico com quantidade de
         * caracteres informados pelo $len.
         * ****************************************
         */
        public function intCode($len = null) {
            $this->lengths = (isset($len) ? (int) $len : 5);
            $this->chars = '0123456789';
            $this->setCode();
            return ($this->code);
        }
    
        /**
         * ****************************************
         * Cria um código de string aleatório
         * ****************************************
         * @param {INT} $len
         * Quandidade de caracteres no código, se
         * não informado o valor será 10.
         * @return
         * Código numérico e alfabético misturados
         * com quantidade de caracteres informados
         * pelo $len.
         * ****************************************
         */
        public function defCode($len = null) {
            $this->lengths = (isset($len) ? (int) $len : 10);
            $this->chars = '0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVxXyYwWzZ0123456789';
            $this->setCode();
            return ($this->code);
        }
    
        /**
         * ****************************************
         * Cria o código baseado nas informações
         * dos métodos públicos.
         * ****************************************
         */
        private function setCode() {
            $this->code = "";
            $chars = str_split($this->chars);
            for ($i = 0; $i < $this->lengths; $i++) {
                $this->code .= $chars[array_rand($chars)];
            }
        }
    }

     

     

    Exemplo:

    $codigo = new CreateCode();
    $resultado = $codigo->defCode(10) . time();
    
    var_dump($resultado); // string única, ou seja jamais será gerada outra igual

     


  17. Aqui:

    12 horas atrás, gersonab disse:

    valvista = :vloo1, valprazo = :vloo2

     

    12 horas atrás, gersonab disse:

    $sql2->bindValue(':valvista',$vloo1);

    $sql2->bindValue(':valprazo',$vloo2);

     

     

    Você se confundiu no argumento, acontece com todo mundo...

    Na query temos :vloo1 e :vloo2

    $sql2->bindValue(':vloo1',$vloo1);

    $sql2->bindValue(':vloo2',$vloo2);

     

    Leia isso aqui pode lhe ser útil:

    https://pt.stackoverflow.com/questions/87384/qual-a-diferença-entre-bindparam-e-bindvalue


  18. A palavra chave é estagnação e a falta de interesse.

    Vemos uma tópico hoje com uma ou mais respostas coerentes e corretas, semana que vem outra  no mesmo contexto que se trata da mesma coisa.

    Sempre o mais do mesmo repetitivamente.

    Ou seja, não é falta de conteúdo é falta de interesse na busca. Uma prévia pesquisa se tem uma gama enorme de material sobre a questão abordada.

     

    Realmente uma moderação ativa excluindo conteúdo antigo por mais recentes e até mais coerentes/atualizados melhoraria, não muito, mas melhoraria. Porém requer um moderador ativo e com disposição para tal trabalho que demandará muito tempo.

     

    A proposta de um fórum é discutir/interagir, e aqui vemos que alguns não compreende isso.

    Hora uns só querem perguntar e perguntar nunca levantar uma discursão, nunca interagir.

    Hora ao levantar uma opinião que contradiz uma postagem, logo se ofendem pois na mente regida pela estupidez o ato de mostrar um ponto de vista, um método diferente se trata de ofensa e não um conceito a ser pensado/debatido com eloquência.

     

    Difícil fazer uma postagem, cujo o assunto já foi redigido dezenas de vezes.

    Difícil fazer uma postagem, cujo sua opinião levará a uma discursão não saudável.

     

    Mas esse não é um problema apenas dessa comunidade e sim de muitas outras plataformas, a falta de interesse no enriquecimento do conhecimento é muito mais complexo. Vemos por exemplo um vídeo de 20 segundos de uma dancinha sem conteúdo ter milhares de visualizações enquanto uma palestra de paradigmas da programação de 1 hora cheia de tesouros para o conhecimento apenas com algumas poucas visualizações.

     

    Triste realidade em que a o conteúdo na internet se caminha para fazer das novas gerações cada vez mais estúpidos.


  19. Outra tática e até acho mais eficiente "dependendo do cenário", seria buscar todos registros de forma que só fazemos uma query assim estressando menos o banco de dados, mas em todo caso depende de quantos registros vamos trabalhar.

     

    Selecionamos todos registros da tabela.

    Teremos então um array contamos quantos índices possui

    Com a quantidade de índices existentes no array fazemos o calculo de percentual necessário.

    // criando um array como exemplo
    $arr = []; // representação do resultado da query dos registros no banco de dados
    $i = 0;
    $quantos_registros = 4000; // altere aqui a quantidade de registros que o array deve possuir
    while ($i < $quantos_registros) {
        $i++;
        $arr[$i] = $i;
    }
    
    // calculando o percentual
    $contagem = count($arr);
    $porcentagem = 10; // 10% dos total de indices contados de "$contagem"
    $resultado = $contagem * ($porcentagem / 100);
    
    var_dump($resultado); // << Quantidade de 10% dos índices do array "$arr" 

    Agora o que fazer depende de quais índices vão ser exibidos final, meio ou início.

    Podemos remover do array que armazenou os índices o restante que não é o $resultado ou vise-versa.

    Podemos ignorar quando esse array for representado.

    E por aí vai.....

×

Informação importante

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