Ir para conteúdo

Matheus Tavares

Moderadores
  • Total de itens

    1861
  • Registro em

  • Última visita

  • Dias vencidos

    32

Tudo que Matheus Tavares postou

  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. Matheus Tavares

    como pegar conteudo de uma variavel javascript e passar pra uma variavel php

    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. Matheus Tavares

    como pegar conteudo de uma variavel javascript e passar pra uma variavel php

    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. Matheus Tavares

    Função genérica para atualizar chave em JSON duplicada usando o PHP

    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. Matheus Tavares

    Função genérica para atualizar chave em JSON duplicada usando o PHP

    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.
  16. Matheus Tavares

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

    Olá @FerdzFernando, agora vi sua atualização no post. Por intuição, acredito que provavelmente a sua iniciativa de fazer uma mudança tão grande decorre de problemas de performance, mas a pergunta que fica é: existe mesmo essa necessidade? Eu iria sugerir antes fazer uma boa análise para ver se não faz mais sentido tentar consertar os gargalos ao invés de recriar a sua aplicação. Caso não seja apenas performance e o código seja muito antigo e você quer modernizar ele, tudo bem, faz parte, mas respondendo a sua pergunta: sim, haverá muito retrabalho, pois você não está apenas trocando o banco, mas toda a stack, linguagens, plataformas. Não há como contornar isso.
  17. Matheus Tavares

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

    Olá @FerdzFernando. Se houvesse boas ferramentas para abstrair o MongoDB e o MySQL simultaneamente e alternar entre eles com Adapters você provavelmente não teria tanto trabalho, mas até onde vi nem o Objection.js ou o Sequelize, que são ORMs muito populares no Node.js oferecem essa opção. Na minha opinião essa migração não faz sentido: ou você começa com o MySQL ou vai para o MongoDB, mas já no início do desenvolvimento. Qual seu modelo de negócio? Que tipo de dados você pretende abrigar no banco?
  18. Matheus Tavares

    impedir cadastro duplicado

    A coluna nome deve possuir, lá no seu banco de dados, um índice UNIQUE, exigindo assim que os dados da coluna sejam únicos. Você pode criar o índice na hora de criar a tabela (CREATE TABLE) ou adicionar ele depois com ALTER TABLE. Veja exemplos: https://www.w3schools.com/sql/sql_unique.asp A correta modelagem do banco é essencial (como dito acima), mas se quiser prover uma camada adicional de verificação e exibição de erros a lógica seria essa: 1 - Faça um SELECT com WHERE nome = $nome_desejado. 2 - Se encontrar o registro no banco, exiba um erro e interrompa, pois já existe. 3 - Se não encontrou, prossiga normalmente com o INSERT.
  19. Matheus Tavares

    listar dados com seis caracteres pra cima

    Olá @Biel.. Basta você filtrar sua consulta. Seria algo nesse sentido: ... WHERE LENGTH( roupas ) >= 6
  20. Matheus Tavares

    Erro ao migrar código de php 5.6 para pdo

    Show de bola, fico feliz que tenha dado certo. =D
  21. Matheus Tavares

    Colocar botão flutuante no lado direito.

    Olá! Teste assim: #BtnWrapper { position: fixed; /* Posicionamento absoluto da div na viewport */ right: 15px; /* Coloca à direita, e então dá 15px de margem */ width: 70px; /* Não precisamos de um Wrapper maior do que 70px */ height: 100%; /* Altura total para centralizarmos verticalmente */ display: flex; /* Ativamos o display flex para alinhamento */ align-items: center; /* Centro na vertical */ justify-content: right; /* Direita na horizontal */ } #Btn { border-radius: 10%; /* Arredondamos as bordas */ transform: rotate(90deg); /* Rotacionamos 90 graus */ height: 2rem; /* Altura */ border: 2px solid #999; /* Borda */ background: #ccc; /* Bg */ } <div id="BtnWrapper"> <button id="Btn">Suporte</button> </div>
  22. Matheus Tavares

    Erro ao migrar código de php 5.6 para pdo

    Então @Marcones Borges, o primeiro ponto é que você esqueceu dos parâmetros da função nessa nova versão: $retorna = function ( $igreja_nome=null, $id=null ) use ( $conexao ) O segundo ponto é que nesse exemplo você teria a possibilidade de fazer um loop OU retornar um único registro se informar o $id na função, e por conta dessa flexibilidade o uso do conceito de $qtd fica um pouco mais complicado. Diante do modelo de função que você postou, eu iria sugerir usar o fetchAll no lugar, como expliquei no meu post anterior. O fetchAll não lida bem quando você precisa recuperar MUITOS registros (pois ele armazena todos em memória ao invés de utilizar ponteiros para nevegar de um para o outro como nos outros casos), mas de todos os métodos ele é o mais prático. E por fim, não há necessidade de você formatar a string para JSON na mão, pois o PHP faz isso para você. Não pretendia fazer a função completa novamente, pois acredito que isso atrapalha o processo de aprendizado, mas são poucas linhas de código, então vamos lá: $retorna = function ( $igreja_nome = NULL, $id = NULL ) use ( $conexao ) { $id = (int)$id; // Como é só o celular que você precisa, limitamos a consulta // Para exibir o "Não encontrado", fiz um pequeno IF no select // Esse IF poderia ser feito via PHP, mas aqui parece ser mais fácil $sql = 'SELECT IF( `celular`, `celular`, "Nao encontrado" ) `celular` FROM membros'; // Não precisa do != null. $id é um inteiro e quando aplicado em um IF, 0=false, resto=true if ( $id ) $sql .= " WHERE `id` = {$id};"; $result = $conexao->query($sql); return json_encode( $result->fetchAll( PDO::FETCH_ASSOC ) ); }; // Não esqueça: Ao contrário de uma function normal, // nessa aqui você PRECISA colocar o ponto-e-vírgula // Isso pq essa está associada a uma variável, // e no final de todas as vars vem o ponto-e-vírgula. Outro detalhe é que $igreja_nome não está sendo utilizada na função. Alguns ajustes ainda podem ser feitos, mas a base da função seria essa aí.
  23. Matheus Tavares

    Proteger código fonte contra cópias.

    Olá @4Unknow. O que você deve buscar é ofuscar o JS para ficar como nesse exemplo aqui: https://forum.imasters.com.br/topic/587904-desofuscar-javascript-para-jogo/ É bem simples, existem ferramentas que você roda na sua própria máquina ou até direto no navegador. O Google tinha uma API para fazer isso também. O HTML/CSS você não consegue ofuscar, mas o JS com certeza, e isso dificulta muito para fazer uma engenharia reversa no código.
  24. Matheus Tavares

    Erro ao migrar código de php 5.6 para pdo

    Olá @Marcones Borges. Essa linha você precisa trocar para: while( $dados = $result->fetch(PDO::FETCH_ASSOC) ) Já para a contagem de registros, geralmente iriam te recomendar usar fetchAll e contar os registros usando PHP com count() ou sizeof(), desse jeito: $rows = $stmt->fetchAll(); $num_rows = count($rows); Outra opção (talvez melhor) seria fazer uma consulta ao banco apenas para recuperar a quantidade de itens: $numRows = $conn->query("SELECT COUNT(*) FROM tabela")->fetchColumn(); echo $numRows; Mas eu lhe dou uma terceira opção, que considero melhor: 1 - Antes do loop registramos a quantidade de itens já processados, no caso 0: $qtd = 0; 2 - Em cada iteração do loop, incrementamos 1 a essa variável: // dentro do loop: ++$qtd; Depois, verificamos se $qtd ainda é 0, pois isso significaria que o conjunto obtido pela consulta era vazio: if ( !$qtd ) { echo 'Nenhum registro encontrado.'; } Outro problema é que antes a conexão ao mysql era comumente utilizada de forma global como no seu código antigo, onde você chamava a função mysql_query. Perceba que com o PDO você precisa da variável $con, que você criou e que contém a conexão com o banco. Então precisamos passar a variável de conexão para dentro da função, uma vez que funções possuem um contexto fechado e desconhecem variáveis externas. Um exemplo disso seria inserindo o parâmetro na declaração da função. Seria assim: function montaSelect( $con ) { ... } // Agora chamamos: montaSelect( $con ); Mas observe que sempre que quisermos chamar a função montaSelect agora devemos enviar a variável pra dentro da função. Meio chato, né? Nesse caso podemos utilizar funções anônimas e explicitar o conhecimento global da conexão ao PDO. Ficaria assim: $montaSelect = function () use ( $con ) { ... } // Agora chamamos: $montaSelect(); Isso tudo desconsiderando orientação a objetos, que tornaria tudo mais profissional. Mas para um uso comum, rápido e prático deve servir :) Reunindo tudo, ficaria assim: $montaSelect = function () use ( $con ) { $sql = "SELECT * FROM membros"; $result = $con->query($sql); $qtd = 0; $opt = ''; while( $dados = $result->fetch( \PDO::FETCH_ASSOC ) ) { ++$qtd; $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>'; } if ( !$qtd ) { $opt = '<option value="0">Nenhum Membro cadastrado</option>'; } return $opt; }; echo $montaSelect();
  25. Matheus Tavares

    Duvida sobre estrutura de return function

    Ops... me dei conta após postar que eu não respondi inteiramente sua pergunta. Perdoe minha falta de atenção. Ao invés de editar o post anterior, vou complementar: o ponto principal da sua dúvida deve estar girando em torno do retorno de uma função, mas não é tão difícil quanto parece. Imagine uma função qualquer, como a do meu exemplo acima. Você chama ela e ela geralmente retorna algum valor primitivo ou objeto. No caso a função debounce, que é muito utilizada no JS, junto com a throttle, com a implementação que você postou faz um setup e retorna uma função para ser a substituta da sua função original. O que quero dizer é que quando você chama a debounce, você envia a função que você quer aplicar o algoritmo de "atraso" da debounce junto à quantidade de tempo desejada e a função lhe retorna a nova função que você deve passar a chamar, ou seja, uma função "infectada". Como diria Linus, "Talk is cheap, show me the code". Então vamos à prática com um exemplo bobo, mas que deve servir: // Funcao original function numAleatorio( min, max ) { return parseInt( Math.random() * ( max - min ) + min ); } // Essa funcao pega uma função genérica que retorne um inteiro e soma 10 ao seu resultado // Simples, bobo, mas eficaz e reutilizável function adiciona10AoRetorno( umaFuncao ) { return function( ...args ) { return umaFuncao( ...args ) + 10; } } // Agora criamos uma função infectada: // Perceba que não executamos a função numAleatorio, senão teríamos mandado numAleatorio() // Enviamos apenas a referência dela, para ser utilizada posteriormente const aleatorioMais10 = adiciona10AoRetorno( numAleatorio ); // Agora chamamos sempre que quiser e o número sempre será MODIFICADO com a soma por 10: // Nesse exemplo enviamos minimo como 50 e maximo como 60, // mas o número retornado sempre fica entre 60 e 70 console.log( aleatorioMais10( 50, 60 ) ); No caso da debounce, você envia a função e depois fica com uma "debouncedMinhaFuncao", que é a nova função, infectada com o comportamento provido por debounce. Espero ter ajudado :)
×

Informação importante

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