Jump to content

Matheus Tavares

Moderadores
  • Content count

    1861
  • Joined

  • Last visited

  • Days Won

    32

Matheus Tavares last won the day on June 30 2018

Matheus Tavares had the most liked content!

Community Reputation

167 Muito Bom

About Matheus Tavares

  • Rank
    The Obstacle Is The Way • Ego Is The Enemy

Contato

Recent Profile Visitors

4811283 profile views
  1. Matheus Tavares

    [Resolvido] Alterar rota php com JQuey ou javaScript

    Show. Essa é a ideia :)
  2. Matheus Tavares

    [Resolvido] Alterar rota php com JQuey ou javaScript

    Exatamente. Não tem como apenas alterar o parâmetro utilizando o JS, pois o href foi definido no servidor, pelo PHP, com a sua função route(). São momentos de execução diferentes.
  3. Matheus Tavares

    [Resolvido] Alterar rota php com JQuey ou javaScript

    Olá. O índice "[ 1 ]" que você está informando na função route pertence ao PHP e não ao JS, e portanto não pode ser influenciado pelo clique do usuário, ao menos que você utilize outro meio para alterar o atributo href (via JS). Veja: https://forum.imasters.com.br/topic/588408-como-pegar-conteudo-de-uma-variavel-javascript-e-passar-pra-uma-variavel-php/
  4. Apenas complementando o que o Omar já explicou: Existe um processo de execução dos serviços: 1 - O usuário faz a requisição. 2 - Seu servidor a recebe e chama o programa (PHP) responsável pelo processamento dela. 2 - O PHP faz o que precisa ser feito e responde com o conteúdo (HTML/JS/CSS crús) que servirá para que o navegador renderize o que você instruiu. Você pode nessa etapa inserir uma variável do PHP, assim por exemplo: var id = parseInt( <?php echo $id ?> ); Pois após o PHP processar e responder, o que chega ao navegador é isso: var id = parseInt( 5 );// se $id fosse 5... Por isso código PHP é inacessível ao usuário, pois ele é executado dentro da máquina que está servindo a aplicação (servidor). Entenda que não tem como eu executar PHP novamente após a interação do usuário, ao menos que eu mande OUTRA (uma segunda) requisição em background (sem que o usuário perceba) utilizando JS. A esse tipo de requisição em background damos o nome de AJAX: https://developer.mozilla.org/pt-BR/docs/Web/Guide/AJAX Resumindo: PHP roda no servidor, HTML/CSS/JS roda no navegador. São camadas e momentos totalmente diferentes. Sacou?
  5. O que você está tentando fazer exige AJAX, pois o ID do produto será definido pelo usuário utilizando o select, mas os produtos estão na sua aplicação/banco. Para isso você pode usar: 1 - Fetch, nativo do navegador: https://developer.mozilla.org/pt-BR/docs/Web/API/Fetch_API/Using_Fetch 2 - ou, se estiver usando jQuery, $.get: https://api.jquery.com/jquery.get/ Você apenas precisa criar um endereço na sua aplicação que receba um ID e retorne o valor. (Exemplo: example.com/valor-produto.php?id=32). Daí com AJAX (JS) você busca o valor informando o ID em resposta ao evento change do seu select.
  6. Matheus Tavares

    [Resolvido] quebra de linha do php para o javascript

    @joao b silva, \n é o caractere que representa a quebra de linha. Basta inseri-lo dentro de sua string, assim: <?php for ($iFor = 0; $iFor <= count($Estrutura)-1; $iFor++): echo "var ".$Estrutura[$iFor]['VAR1']." = button.getAttribute('data-bs-".$Estrutura[$iFor]['CAMPO']."'); \n"; endfor; ?> E dá pra simplificar um pouquinho o código, dessa forma: <?php foreach ( $Estrutura as $campo ) printf( "var %s = button.getAttribute( 'data-bs-%s' );\n", $campo[ 'VAR1' ], $campo[ 'CAMPO' ], ); Daí se $Estrutura tiver esse conteúdo, por exemplo: <?php $Estrutura = [ [ 'VAR1' => 'teste', 'CAMPO' => 'meu-campo' ], [ 'VAR1' => 'minhaVar', 'CAMPO' => 'meu-outro-campo' ], ]; Teremos a seguinte saída: var teste = button.getAttribute( 'data-bs-meu-campo' ); var minhaVar = button.getAttribute( 'data-bs-meu-outro-campo' ); ==>> https://3v4l.org/EObSi#v8.2.1
  7. Matheus Tavares

    Criptografar senhas em bd antigo

    Olá. Você não deveria poder reverter o hash da senha. Se você puder, isso significa que os dados não estão seguros o suficiente. 1 - Faça o backup de tudo para não perder dados (e de preferência criptografe o arquivo de backup com GPG ou similar). 2 - Substitua a senha de todos os usuários no banco pelo hash baseado no algoritmo que você vá usar. Sugiro bcrypt (não use md5, sha128, sha512 e variantes deles): https://www.php.net/manual/pt_BR/function.password-hash.php 3 - Passe a utilizar o algoritmo para gerar o hash no cadastro e o algoritmo de comparação na hora de fazer o login: https://www.php.net/manual/pt_BR/function.password-verify.php 4 - Como passo adicional de segurança, seria interessante invalidar as senhas dos usuários antigos e enviar um e-mail para redefinir a senha e impedindo o cadastro da mesma senha utilizada anteriormente. Opcional, mas interessante. Você literalmente só precisa das duas funções que citei acima e todos os usuários passarão a ter a senha armazenada de forma segura no seu sistema (isso ainda não significa que todo o sistema está seguro, estamos falando apenas de uma minúscula fração das preocupações).
  8. Matheus Tavares

    [Resolvido] quebra de linha do php para o javascript

    Hehe, vamos acalmar os ânimos, pessoal. @Frank K Hosaka, não acho que o @Omar~ tenha sido hostil com você, meu amigo, ele apenas explicou que você pode utilizar as aspas duplas no atributo se escapá-las. Acredito que seja construtivo, mas por vezes as palavras podem não soar amistosas, uma vez que é o nosso único recurso nesse recinto. Já aconteceu muito comigo por aqui também :) Eu particularmente faria a sugestão da concatenação, pois não gosto de escapar as aspas (na minha opinião fica um pouco bagunçado), mas isso é totalmente de gosto. <?php echo '<input type="' . $type . '" />'; Outra possibilidade seria utilizar Heredoc: https://www.php.net/manual/pt_BR/language.types.string.php#language.types.string.syntax.heredoc O bom do Heredoc é que potencialmente poderia resolver também a questão do autor do tópico, @joao b silva, pois ela preserva as quebras de linha. Veja esse exemplo do manual: <?php // Sem indentação echo <<<END a b c \n END; // 4 espaços de indentação echo <<<END a b c END; Saída: a b c a b c (embora eu ainda faria como o Omar fez: aspas duplas e \n para representar o caractere de quebra de linha) E Frank, sua forma de escrever o atributo sem aspas na verdade está correta. Antigamente (HTML 4 pra trás) a única forma correta era com aspas duplas (até onde eu me lembre pelo menos), mas no HTML moderno (a.k.a HTML 5), você pode: 1 - Escrever valores de atributos sem aspas, desde que não contenham espaços. 2 - Escrever valores de atributos com aspas duplas ou aspas simples. Fonte: https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 Por convenção, no entanto, geralmente adotamos as aspas duplas, mas isso é meramente uma questão de convenção e costumes. Um feliz 2023 pra todos vocês! =]
  9. Matheus Tavares

    Dois arquivos com a mesma sintaxe mas só um funciona - Erro 500

    Erro 500 é um erro genérico respondido pelo servidor web. Como você instalou seu ambiente de desenvolvimento? Para não exibir os erros do PHP de forma apropriada, me parece estar mal configurado. Coloque isso na primeira linha do seu arquivo e veja se após executá-lo um arquivo de log é criado na pasta do seu projeto: error_reporting(E_ALL); ini_set('ignore_repeated_errors', TRUE); ini_set('display_errors', TRUE); ini_set('log_errors', TRUE); ini_set('error_log', 'errors.log'); Se puder alterar essas diretivas diretamente no PHP.INI, seria melhor. Se o trecho acima fizer efeito no seu servidor, você deverá ter um arquivo errors.log criado após executar seu código. Minha sugestão: 1 - Para o futuro, coloque na sua lista de estudos o Docker. Vai lhe permitir um melhor gerenciamento do seu ambiente. Para o momento, supondo que você esteja no Windows, sugiro que utilize o PHP/Mysql/Apache através de instaladores práticos como o xampp ou WampServer. Eles costumam trazer uma configuração mais pronta e de fácil manuseio. 2 - Não relacionado com o tópico, mas da forma como sua consulta está escrita no momento, está vulnerável a SQL injection. Recomendo que pesquise sobre prepared statements. É a forma correta de enviar instruções ao banco. Veja: https://websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection
  10. Matheus Tavares

    Implementação reCaptcha verificar PHP

    Olá Artur, tudo bem? Seja bem-vindo! A aprovação dos posts só é necessária enquanto você possuir menos de 5 posts aprovados. Nesse momento você já possui 3. Essa foi uma medida que a administração do fórum aplicou após uma série de ataques de spam que o fórum sofreu alguns anos atrás. Infelizmente a aprovação é manual e às vezes pode demorar algumas horas, mas logo você já entra para a whitelist e não precisa mais passar por isso. Sobre a sua dúvida, encontrei esse conteúdo que deve lhe ajudar: https://www.youtube.com/watch?v=kG_3LZ2OgBI Abraço!
  11. Certo, acho que agora entendi melhor, mas infelizmente acredito que essa necessidade seja oriunda de um modelo de dados que poderia ser otimizado no futuro. Dito isso, elaborei uma pequena solução que espero que lhe ajude. Veja: 1 - Primeiro pegamos o caminho até o subarray desejado: function getSubArrayPath( $array, $wantedKey ) { $mode = RecursiveIteratorIterator::SELF_FIRST; $iterator = new RecursiveIteratorIterator( new RecursiveArrayIterator( $array ), $mode ); foreach ( $iterator as $key => $value ) if ( $wantedKey === $key ) { $keys[] = $key; for ( $i = $iterator->getDepth()-1; $i >= 0 ; --$i ) { $keys[] = $iterator->getSubIterator( $i )->key(); } return $keys; } return []; } Essa função, que faz uso das classes nativas RecursiveIteratorIterator e RecursiveArrayIterator tem a simples tarefa de receber um array (como o que o json_decode nos entregou) e dizer qual o caminho deve ser feito para chegarmos até a chave desejada (no caso PRODUCTION). Ela deve se comportar da seguinte maneira: $path = getSubArrayPath( $array, $key ); Retorna isso: Array ( [0] => PRODUCTION [1] => CREDITOR ) 2 - Agora que temos o caminho dinâmico que estava enraizado na nossa árvore de dados, podemos encontrar a referência do subarray que queremos manipular. Para isso criamos a seguinte função: function &getSubArrayRef( &$array, $key ) { $path = getSubArrayPath( $array, $key ); $ref =& $array; while ( $node = array_pop( $path ) ) $ref =& $ref[ $node ]; return $ref; } Essa função é simples: enviamos os dados e dizemos a chave que ela deve encontrar recursivamente. Ela vai internamente chamar a "getSubArrayPath()" para determinar o caminho e então retornar a referência do subarray que desejamos. Se reunirmos tudo teríamos esse código: <?php $json = '{"CREDITOR":{"TAX":{"TAC":0.7},"ENABLE":"true","PRODUCTION":{"email":"email@dominio.com","senha":"12457895","BASE_URL":"https://domino.com"},"HOMOLOGATION":{"email":"email@dominio.com","senha":"12457895","BASE_URL":"https://domino.com"},"TARGET_VALUES":5000000}}'; $data = json_decode( $json, true ); function getSubArrayPath( $array, $wantedKey ) { $mode = RecursiveIteratorIterator::SELF_FIRST; $iterator = new RecursiveIteratorIterator( new RecursiveArrayIterator( $array ), $mode ); foreach ( $iterator as $key => $value ) if ( $wantedKey === $key ) { $keys[] = $key; for ( $i = $iterator->getDepth()-1; $i >= 0 ; --$i ) { $keys[] = $iterator->getSubIterator( $i )->key(); } return $keys; } return []; } function &getSubArrayRef( &$array, $key ) { $path = getSubArrayPath( $array, $key ); $ref =& $array; while ( $node = array_pop( $path ) ) $ref =& $ref[ $node ]; return $ref; } $ref = &getSubArrayRef( $data, 'PRODUCTION' ); $ref[ 'email' ] = 'novo e-mail'; $ref[ 'senha' ] = 'nova senha'; $ref[ 'atributo_novo' ] = 'AAAAAAAAAA'; print_r( $data ); E o retorno disso seria esse: Array ( [CREDITOR] => Array ( [TAX] => Array ( [TAC] => 0.7 ) [ENABLE] => true [PRODUCTION] => Array ( [email] => novo e-mail [senha] => nova senha [BASE_URL] => https://domino.com [atributo_novo] => AAAAAAAAAA ) [HOMOLOGATION] => Array ( [email] => email@dominio.com [senha] => 12457895 [BASE_URL] => https://domino.com ) [TARGET_VALUES] => 5000000 ) ) Achei melhor dividir as responsabilidades e trazer as manipulações para fora da função, mas se você preferir fazer tudo numa chamada só, basta modificar o valor de $ref após o while da nossa função "getSubArrayRef()". Dessa forma você poderia enviar o valor desejado e já sair com o array modificado de dentro da função (como você estava fazendo antes).
  12. Olá amigo, tudo bem? Vou tentar ajudar você, mas não entendi alguns pontos: No seu exemplo houve alteração no e-mail apenas de PRODUCTION, mas não em HOMOLOGATION. É esse o comportamento esperado? Desculpe, mas não entendi muito bem seu objetivo: seria varrer todo o array pela chave 'email' (por exemplo) e substituir todas as ocorrências ou apenas a primeira encontrada (ou ainda outra coisa)? Apenas para ilustrar melhor, como você fez a chamada da sua função para que ela gerasse o resultado que você colou no seu post? Digo, quais parâmetros você passou pra dentro dela? Apenas uma observação: if ($keyUpdate == null) { return $result; } else { return $result; } É o mesmo que simplesmente: return $result; (Provavelmente foi apenas falta de atenção, mas não custa mencionar...)
  13. Matheus Tavares

    Traduzir site

    Olá @Caio Vargas, existem diversas formas para isso. A mais simples (e amadora) seria simplesmente oferecer o link automático do Google Translate. Exemplo iMasters original: https://imasters.com.br/ iMasters em inglês: https://imasters-com-br.translate.goog/?_x_tr_sl=pt&amp;_x_tr_tl=en&amp;_x_tr_hl=pt-BR&amp;_x_tr_pto=wapp Para fazer isso, siga esse guia: https://www.dummies.com/article/technology/notable-websites/google/how-to-translate-a-website-with-google-translate-145071/ Minha sugestão é que você utilize a metodologia mais comum em todas as frameworks PHP por aí, que é essa: 1 - Crie uma função responsável pelas traduções (lang.php): <?php require_once 'lang/en.php'; function __( $string ) { if ( !array_key_exists( 'en', $_GET ) ) return $string; return $GLOBALS[ 'lang' ][ 'en' ][ $string ]; } 2 - Crie uma pasta chamada lang e coloque dentro um arquivo en.php com todas as traduções: <?php $GLOBALS[ 'lang' ][ 'en' ] = [ 'A' => 'THE', 'SEGUNDA' => 'SECOND', 'EDIÇÃO DO'=> 'EDITION OF', 'FORNECEDORES DE FUNDIÇÃO' => 'CASTING SUPPLIERS', 'Todos os direitos reservados' => 'All rights reserved', ]; 3 - Agora você simplesmente encapsula todas as frases, atributos e termos do seu site com a nossa função tradutora, enviando como argumento a frase original. Exemplo: <p><?= __( 'A' ) ?> <span class="word-contrast"><?= __( 'SEGUNDA' ) ?></span> <?= __( 'EDIÇÃO DO' ) ?></p> Ao acessar a página pelo link principal a função não vai tentar traduzir e vai simplesmente imprimir o que foi enviado para a função. Caso o acesso tenha sido em http://seusite.com/?en, a função vai tentar encontrar no dicionário do en.php a tradução apropriada para o que foi informado na chamada de cada função. Sacou? :)
  14. Matheus Tavares

    Pegar as cordenadas com cep

    Olá @Jack Oliveira, tudo bem? Pelo que vi, você está usando a API do ViaCep. O problema é que essa API não fornece a informação de latitude e longitude. Você pode: 1 - Trocar a API do ViaCep pelo CEPAberto (que fornece essa informação): https://cepaberto.com No entanto ela possui os seguintes limites: 2 - Ou consultar diretamente a API do Google Maps (que também vai impor limites de consulta). Se não me engano basta você criar uma conta no Google Dev Console, que vai te liberar uma API_KEY, e com isso você pode consultar dessa forma: https://maps.googleapis.com/maps/api/geocode/json?address=CEP&key=API_KEY
  15. Matheus Tavares

    API express.js e MySQL x API express.js e MongoDB

    Olá @Ferdz-Agencia-Digital. Seu tópico original era esse: https://forum.imasters.com.br/topic/588113-api-expressjs-e-mysql-x-api-expressjs-e-mongodb/ Infelizmente parece que deu algum problema com a sua conta anterior que estava impedindo você de fazer novos posts no fórum. Como não se trata apenas de performance, talvez seja interessante você prosseguir com a sua ideia, mas tudo depende do modelo de negócios da sua aplicação. Existe um ditado que diz: "Quando você possui apenas um martelo, tudo irá lhe parecer pregos". Quero dizer: você já possui uma aplicação em funcionamento e quer refazer ela para torná-la melhor, mais bem escrita, mais eficiente. Todo programador passa por isso, é natural. Um software nunca é finalizado, ele sempre estará em um processo constante de refatoração e reescrita. A questão é que você pode manter as linguagens que você já possui mais familiaridade, entende? Toda linguagem possui seus respectivos trade-offs e nenhuma é uma bala de prata. Todas terão benefícios e malefícios. O mesmo se aplica a bancos de dados e quaisquer outras ferramentas. Como não conheço seu modelo de negócios, não consigo opinar mais do que isso, mas espero ter ajudado. Se sobrar alguma dúvida, é só postar.
×

Important Information

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