-
Total de itens
3967 -
Registro em
-
Última visita
-
Dias vencidos
47
Tudo que Williams Duarte postou
-
$.validator.addMethod( "customEmail", function (value, element) { // Regex que corresponde a @fulano, @beltrano, ou @sicrano return this.optional(element) || /^[\w-\.]+@(fulano|beltrano|sicrano)\.com\.br$/i.test(value); }, "Por favor, insira um e-mail válido com um dos seguintes domínios: @fulano.com.br, @beltrano.com.br, @sicrano.com.br" ); $("#formulario").validate({ ignore: ".ignore", rules: { empresa: { required: true }, nome: { required: true }, contato: { required: true }, celular: { required: true }, email: { required: true, email: true, customEmail: true }, }, }); Não sei se entendi direito! Agora se for qualquer dominio: $.validator.addMethod( "customEmail", function (value, element) { // Esta regex valida a estrutura básica de um e-mail. return this.optional(element) || /^[\w-\.]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i.test(value); }, "Por favor, insira um e-mail válido." ); $("#formulario").validate({ ignore: ".ignore", rules: { empresa: { required: true }, nome: { required: true }, contato: { required: true }, celular: { required: true }, email: { required: true, email: true, customEmail: true }, }, });
- 1 resposta
-
- javascript
- validação
-
(e mais 1 )
Tags:
-
Como posso melhorar esse código javascript encapsulado e usando método imutável?
Williams Duarte respondeu ao tópico de eiwes em Javascript
Para tornar o código mais limpo, modular e orientado a objetos (OOP), podemos encapsular as funcionalidades em classes e usar métodos para operar sobre os estados internos dos objetos. Isso torna o código mais organizado oque facilita a manutenção e compreensão. Vou reestruturar seu código. Classe OverviewCounter -> Esta classe conterá a lógica para contar os status e as pendências. Classe ComponentProcessor -> Esta classe será responsável por processar os componentes e pendências. Classe OverviewProcessor -> Esta classe usará as classes acima para processar os dados de visão geral e calcular as contagens. import { AssetStatusType } from '@domain/interfaces/common' import { BothComponentType, ComponentsType, GroupFiltersType, OperationType, OverviewModelType, PendenciesType, StructurePendenciesCount, StructureStatusCount } from '../../types' class OverviewCounter { private statusCount: StructureStatusCount = {} as StructureStatusCount; private pendenciesCount: StructurePendenciesCount = {} as StructurePendenciesCount; updateStatusCount(status: AssetStatusType) { this.statusCount[status] = (this.statusCount[status] || 0) + 1; } updatePendenciesCount(key: AssetStatusType, subKey: OperationType | PendenciesOverviewType) { this.pendenciesCount[key] = this.pendenciesCount[key] ?? {}; this.pendenciesCount[key][subKey] = (this.pendenciesCount[key]?.[subKey] || 0) + 1; } getStatusCount(): StructureStatusCount { return this.statusCount; } getPendenciesCount(): StructurePendenciesCount { return this.pendenciesCount; } } class ComponentProcessor { private counter: OverviewCounter; private countedIds: Set<string>; constructor(counter: OverviewCounter, countedIds: Set<string>) { this.counter = counter; this.countedIds = countedIds; } processPendencies(pendencies: PendenciesType[] | null | undefined, id: string, state: AssetStatusType) { if (pendencies?.length) { for (const { pendencyType } of pendencies) { const uniqueId = `${state}-${pendencyType}-${id}`; if (!this.countedIds.has(uniqueId)) { this.counter.updatePendenciesCount(state, pendencyType); this.countedIds.add(uniqueId); } } } } processComponents(components: ComponentsType[], isGroupByTree: boolean, id: string, type: BothComponentType) { for (const { pendencies, status, operationType } of components) { if (isGroupByTree && type === 'location') { this.counter.updateStatusCount(status); if (operationType) { this.counter.updatePendenciesCount(status, operationType); } } this.processPendencies(pendencies, id, status); } } } class OverviewProcessor { private counter: OverviewCounter; private countedIds: Set<string>; constructor() { this.counter = new OverviewCounter(); this.countedIds = new Set<string>(); } processOverviewData(data: OverviewModelType[], groupBy: GroupFiltersType) { const componentProcessor = new ComponentProcessor(this.counter, this.countedIds); const isGroupByTree = groupBy === 'tree'; const isGroupByAsset = groupBy === 'asset'; for (const { id, status, components, operationType, type } of data) { if (isGroupByAsset || type === 'asset') { this.counter.updateStatusCount(status); if (operationType) { this.counter.updatePendenciesCount(status, operationType); } } componentProcessor.processComponents(components, isGroupByTree, id, type); } } getResults() { return { ...this.counter.getStatusCount(), pendencies: this.counter.getPendenciesCount() }; } } export const calculateOverviewCounts = (data: OverviewModelType[], groupBy: GroupFiltersType) => { const processor = new OverviewProcessor(); processor.processOverviewData(data, groupBy); return processor.getResults(); };- 1 resposta
-
- javascript
- typescript
-
(e mais 1 )
Tags:
-
Replicar a imagem selecionada no primeiro input para o segundo, e diretamente isso não é viável devido às restrições de segurança dos navegadores. Eles não permitem que scripts manipulem arquivos de input de forma direta por razões de privacidade. Mas uma maneira de contornar essa limitação, mostrando a imagem selecionada em ambos os campos, mesmo que não possamos tecnicamente "carregar" a imagem no segundo input. Exemplo: <!DOCTYPE html> <html lang="pt"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Exemplo</title> </head> <body> <h2>Input1 - Escolha uma Imagem</h2> <input type="file" id="id1" name="input1" onchange="carregarImagem(event)"> <br><br> <h4>Imagem Selecionada no Input1:</h4> <img id="img1" style="width: 100px; height: 100px;" /><br><br> <h2>Input2 - Visualização da Imagem do Input1</h2> <input type="file" id="id2" name="input2" disabled> <!-- Desativei este campo, pois não é possível atribuir arquivos diretamente --> <h4>Imagem Espelhada do Input1 no Input2:</h4> <img id="img2" style="width: 100px; height: 100px;" /> <script> function carregarImagem(event){ var reader = new FileReader(); reader.onload = function(){ var output1 = document.getElementById('img1'); var output2 = document.getElementById('img2'); output1.src = reader.result; output2.src = reader.result; }; reader.readAsDataURL(event.target.files[0]); } </script> </body> </html>
-
O autoload do Omar só funciona no projeto dele
Williams Duarte respondeu ao tópico de Frank K Hosaka em PHP
Vamos começar pelo começo e pelo seu sistema de autoload em /mvc/modelos/funções.php, notei que você está utilizando um mecanismo personalizado para carregar suas classes. Isso é uma parte fundamental do projeto, pois um autoload eficiente e preciso é essencial para a gestão das dependências. Aqui está o seu trecho de código atual: spl_autoload_register(function ($Class) { $includeDir = false; $findDir = ['controles','modelos','visões']; 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("Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); Sugestões de Melhoria: Evite usar diretórios com acentos ou caracteres especiais, como visões. Isso pode causar inconsistências em diferentes ambientes de servidor. Prefira nomes em inglês ou sem acentuação, como views. Ao nomear diretórios e classes, adote uma convenção consistente. Por exemplo, use PascalCase para nomes de classes e camelCase para métodos e funções. Certifique-se de que o caminho gerado pela função FindClass seja o correto. Utilizar __DIR__ é uma boa prática, mas a função deve construir corretamente o caminho até o arquivo da classe. Agora, vamos falar sobre a conexão com o banco de dados em /mvc/modelos/conexão.php. Aqui está o trecho de código referente à sua classe conexão: class conexão { private static $pdo; public function __construct(){} public static function instância(){ $dbname="mvc"; $user="root"; $password=""; // ... código omitido ... if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);} return self::$pdo;}} Sugestões de Melhoria: Renomeie a classe para evitar acentos. Por exemplo, use Conexao em vez de conexão. Considere a segurança e manutenção do seu código. Armazenar credenciais de banco de dados diretamente no código não é uma prática segura. Idealmente, essas informações devem estar em um arquivo de configuração externo ou variáveis de ambiente. Embora o padrão singleton possa ser útil em alguns casos, ele pode limitar a testabilidade e a flexibilidade da sua aplicação. Pense em alternativas como a injeção de dependências para gerenciar suas conexões de banco de dados. Por último, mas não menos importante, vamos olhar para a forma como você está lidando com a entrada do usuário em /mvc/controles/controle.php. Notei que você está passando diretamente a entrada do usuário para consultas SQL, o que pode ser uma porta aberta para ataques de injeção de SQL. Aqui está um exemplo do seu código: public function validaEmail($email){ $stmt=conexão::instância()->query("select email from usuários where email='$email'"); return $stmt->fetch(PDO::FETCH_ASSOC);} Sugestões de Melhoria: Nunca insira diretamente dados do usuário em suas consultas SQL. Use prepared statements para evitar injeção de SQL. Com prepared statements, sua consulta deve se parecer com isto: $stmt = conexão::instância()->prepare("SELECT email FROM usuarios WHERE email = :email"); $stmt->execute(['email' => $email]); return $stmt->fetch(PDO::FETCH_ASSOC); Novamente, evite usar acentos e caracteres especiais nos nomes de classes e tabelas. Implementando essas sugestões, você não só aumentará a segurança e a robustez do seu projeto, mas também tornará o código mais limpo, organizado e de acordo com as melhores práticas de desenvolvimento. Se precisar de mais alguma ajuda, não hesite em perguntar! Só vou colocar abaixo como faria um refactory nos trechos acima: Antes: spl_autoload_register(function ($Class) { $includeDir = false; $findDir = ['controles','modelos','visões']; 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("Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); Depois: spl_autoload_register(function ($class) { $includeDir = false; $directories = ['controllers', 'models', 'views']; foreach ($directories as $dirName) { $filePath = __DIR__ . DIRECTORY_SEPARATOR . $dirName . DIRECTORY_SEPARATOR . $class . '.php'; if (!$includeDir && file_exists($filePath) && !is_dir($filePath)) { include_once ($filePath); $includeDir = true; break; } } if (!$includeDir) { die("Internal server error: Unable to locate crucial operational data!"); } }); Antes: class conexão { private static $pdo; public function __construct(){} public static function instância(){ $dbname="mvc"; $user="root"; $password=""; // ... código omitido ... if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);} return self::$pdo;}} Depois: class Conexao { private static $pdo; public function __construct() {} public static function getInstance() { $dbname = "mvc"; $user = "root"; $password = ""; // ... código omitido ... if (!self::$pdo) { self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password); } return self::$pdo; } } Antes: public function validaEmail($email){ $stmt=conexão::instância()->query("select email from usuários where email='$email'"); return $stmt->fetch(PDO::FETCH_ASSOC);} Depois: public function validaEmail($email) { $stmt = Conexao::getInstance()->prepare("SELECT email FROM usuarios WHERE email = :email"); $stmt->execute(['email' => $email]); return $stmt->fetch(PDO::FETCH_ASSOC); } Essas mudanças aumentam a segurança e a robustez do seu projeto, e também tornam o código mais claro, organizado e alinhado com as melhores práticas de desenvolvimento em PHP. Isso facilita a manutenção e a escalabilidade do projeto. Para aumentar a segurança das suas credenciais de banco de dados e outras informações sensíveis, é recomendável carregar esses dados de um arquivo .env externo ao invés de tê-los diretamente no código. Para isso, você pode usar o pacote vlucas/phpdotenv, que é amplamente utilizado na comunidade PHP. Aqui está como você pode fazer isso: Primeiro, instale o pacote usando Composer (se você ainda não tem o Composer, terá que instalá-lo primeiro): composer require vlucas/phpdotenv Crie um arquivo .env na raiz do seu projeto com o seguinte conteúdo: DB_NAME=mvc DB_USER=root DB_PASSWORD=sua_senha_aqui No seu arquivo Conexao.php, você pode carregar as variáveis de ambiente e usar os valores para conectar-se ao banco de dados: Antes: class Conexao { private static $pdo; public function __construct() {} public static function getInstance() { $dbname = "mvc"; $user = "root"; $password = ""; // ... código omitido ... if (!self::$pdo) { self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password); } return self::$pdo; } } Depois: use Dotenv\Dotenv; class Conexao { private static $pdo; public function __construct() {} public static function getInstance() { $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); $dbname = $_ENV['DB_NAME']; $user = $_ENV['DB_USER']; $password = $_ENV['DB_PASSWORD']; // ... restante do código ... if (!self::$pdo) { self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password); } return self::$pdo; } } Certifique-se de adicionar o .env ao seu .gitignore para evitar que suas credenciais sejam expostas se você estiver usando controle de versão como Git. Essa abordagem não apenas melhora a segurança do seu aplicativo, mas também facilita a gestão de configurações em diferentes ambientes (desenvolvimento, teste, produção), pois você pode ter arquivos .env separados para cada ambiente sem precisar alterar o código. -
Laravel é amplamente reconhecido como um framework robusto no ecossistema do PHP, introduzindo uma estrutura mais rica e elaborada que transcende as capacidades do PHP puro. Essa complexidade, contudo, não deve ser interpretada meramente como uma sobreposição ao PHP, mas como uma abordagem meticulosamente projetada para amplificar as potencialidades do desenvolvimento web. Embora seja verdade que ao adotar um framework como o Laravel, nos comprometemos com determinadas convenções e estruturas predefinidas, essa percepção de limitação é mitigada significativamente quando se integra o conhecimento e as práticas do Domain-Driven Design (DDD). O DDD oferece uma perspectiva que valoriza a modelagem do domínio de negócio, o que, por sua vez, promove uma abordagem mais flexível e adaptativa no desenvolvimento de software. Portanto, o compromisso com as convenções do Laravel pode ser visto não como uma restrição, mas como uma fundação sobre a qual soluções personalizadas e orientadas ao domínio podem ser construídas de forma eficaz. A escolha entre utilizar um framework como o Laravel ou optar pelo PHP puro não é uma questão de certo ou errado, mas sim uma decisão que deve ser alinhada às necessidades específicas de um projeto e à familiaridade do desenvolvedor com as ferramentas disponíveis. Enquanto alguns desenvolvedores apreciam a liberdade e a flexibilidade oferecidas pelo PHP puro, outros valorizam a eficiência, a estrutura e as facilidades que um framework como o Laravel pode oferecer. No que se refere à orientação a objetos, é crucial reconhecer que, apesar de existir uma curva de aprendizado, ela constitui uma abordagem poderosa que proporciona maior clareza, reusabilidade e facilidade de manutenção na programação em PHP. As críticas relacionadas à complexidade da orientação a objetos geralmente surgem de experiências de aprendizado mal direcionadas e não refletem a realidade prática, onde essa abordagem aprimora a gestão de projetos de software complexos e colaborativos. Conclusão, tanto o uso de frameworks como o Laravel quanto a programação em PHP puro apresentam seus próprios méritos e desafios. A decisão entre um e outro deve ser embasada no contexto do projeto, nos requisitos específicos e na experiência do desenvolvedor ou da equipe envolvida. Igualmente, a orientação a objetos, quando compreendida e implementada adequadamente, pode se tornar um recurso inestimável para aumentar a qualidade e a eficiência no desenvolvimento de software.
-
Incluir um arquivo PHP (include, require) diretamente de outro servidor não é possível dessa forma, pois o PHP tentará encontrar o arquivo no mesmo sistema de arquivos onde o script está sendo executado. No entanto, há algumas maneiras de obter dados de um script PHP em outro servidor: CURL ou file_get_contents (recomendado): file_get_contents: // pagina2.php <?php $url = "http://servidor-minas-gerais/pagina1.php"; $conteudo = file_get_contents($url); echo $conteudo; // imprime 21, se a pagina1.php só imprime o resultado ?> CURL: // pagina2.php <?php $url = "http://servidor-minas-gerais/pagina1.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $conteudo = curl_exec($ch); curl_close($ch); echo $conteudo; // imprime 21, se a pagina1.php só imprime o resultado ?>
-
PHP oferece um recurso chamado Heredoc e Nowdoc que permite criar strings de várias linhas de uma maneira mais legível. Heredoc: $sql = <<<SQL INSERT INTO conteudo (Publi, nome_p, Seq, Tit, Sub, p1, p2, p3, p4, p5, codigoc, codigoj, codigoh, pa6, p7, p8, p9, p10, imagem, video, data, autor) VALUES ('$publi', '$nomepubli', '$seq', '$titulo', '$subtitulo', '$textp1', '$textp2', '$textp3', '$textp4', '$textp5', '$textc', '$textj', '$texth', '$textp6', '$textp7', '$textp8', '$textp9', '$textp10', '$nomearquivo', '$nomearquivod', '$datacur', '$autor') SQL; Nowdoc $sql = <<<'SQL' INSERT INTO conteudo (Publi, nome_p, Seq, Tit, Sub, p1, p2, p3, p4, p5, codigoc, codigoj, codigoh, pa6, p7, p8, p9, p10, imagem, video, data, autor) VALUES ('$publi', '$nomepubli', '$seq', '$titulo', '$subtitulo', '$textp1', '$textp2', '$textp3', '$textp4', '$textp5', '$textc', '$textj', '$texth', '$textp6', '$textp7', '$textp8', '$textp9', '$textp10', '$nomearquivo', '$nomearquivod', '$datacur', '$autor') SQL;
-
Não recomendo dessa forma, mas segue o exemplo: // Recebe o valor do formulário $nome = mysqli_real_escape_string($ggCon, $_POST['nome']); // Chave para encriptação AES $chaveCriptografia = 'senha123'; // Query para inserir os dados encriptados $query = "INSERT INTO tab_aprendiz (nome) VALUES (AES_ENCRYPT('{$nome}', UNHEX(SHA2('{$chaveCriptografia}', 512))))"; // Executar a query if (mysqli_query($ggCon, $query)) { print "Cadastro realizado com sucesso"; } else { print "Erro ao realizar cadastro: " . mysqli_error($ggCon); } Veja um modo mais pratico: <?php // Chave de criptografia - ela deve ser mantida segura e constante uma vez que você começou a criptografar dados com ela $encryption_key = openssl_random_pseudo_bytes(32); // Mude aqui $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); // Função para criptografar function encrypt($data, $key, $iv) { return openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv); } // Função para descriptografar function decrypt($data, $key, $iv) { return openssl_decrypt($data, 'aes-256-cbc', $key, 0, $iv); } // Dados para criptografar $nome = "Nome a ser criptografado"; // Criptografando $nome_criptografado = encrypt($nome, $encryption_key, $iv); echo "Nome criptografado: " . $nome_criptografado . "\n"; // Descriptografando $nome_descriptografado = decrypt($nome_criptografado, $encryption_key, $iv); echo "Nome descriptografado: " . $nome_descriptografado . "\n"; ?>
-
Segue <?php $produtos = [ (object)[ 'produto' => '000001', 'var1' => 'LR', 'var2' => 'G', 'estoque' => 4.0000 ], (object)[ 'produto' => '000001', 'var1' => 'AZ', 'var2' => 'G', 'estoque' => -4.0000 ], (object)[ 'produto' => '000001', 'var1' => 'VD', 'var2' => 'G', 'estoque' => 0.0000 ], (object)[ 'produto' => '000001', 'var1' => 'BR', 'var2' => 'G', 'estoque' => 17.0000 ], (object)[ 'produto' => '000001', 'var1' => 'VR', 'var2' => 'G', 'estoque' => 0.0000 ], // ... resto dos objetos ]; $resultado = []; foreach ($produtos as $produto) { // Obtendo o tamanho (último caracter de var2) $tamanho = substr($produto->var2, -1); // Utilizando o operador de coalescência nula (??) para simplificar a inicialização dos arrays. $resultado[$produto->produto][$produto->var1][$tamanho] = ($resultado[$produto->produto][$produto->var1][$tamanho] ?? 0) + $produto->estoque; } // Para visualizar o resultado echo "<pre>"; print_r($resultado); echo "</pre>"; https://ideone.com/qLPtRf Outra forma <?php $produtos = [ (object)[ 'produto' => '000001', 'var1' => 'LR', 'var2' => 'G', 'estoque' => 4.0000 ], (object)[ 'produto' => '000001', 'var1' => 'AZ', 'var2' => 'G', 'estoque' => -4.0000 ], (object)[ 'produto' => '000001', 'var1' => 'VD', 'var2' => 'G', 'estoque' => 0.0000 ], (object)[ 'produto' => '000001', 'var1' => 'BR', 'var2' => 'G', 'estoque' => 17.0000 ], (object)[ 'produto' => '000001', 'var1' => 'VR', 'var2' => 'G', 'estoque' => 0.0000 ], // ... resto dos objetos ]; $resultado = []; foreach ($produtos as $produto) { // Obtendo o tamanho (último caracter de var2) $tamanho = substr($produto->var2, -1); // Checando se a chave do produto já existe no array resultado. if (!isset($resultado[$produto->produto])) { $resultado[$produto->produto] = []; } // Checando se a chave da var1 já existe no sub-array do produto. if (!isset($resultado[$produto->produto][$produto->var1])) { $resultado[$produto->produto][$produto->var1] = []; } // Inserindo ou somando o estoque ao tamanho correspondente. if (!isset($resultado[$produto->produto][$produto->var1][$tamanho])) { $resultado[$produto->produto][$produto->var1][$tamanho] = 0; } $resultado[$produto->produto][$produto->var1][$tamanho] += $produto->estoque; } // Para visualizar o resultado echo "<pre>"; print_r($resultado); echo "</pre>"; https://ideone.com/oMUg3Q
-
Event sourcing, CQRS Para trabalhar com queues, uma boa alternativa é o RabbitMQ, que é opensource https://www.rabbitmq.com com o cloudamqp voce ja tem uns planos bacanas além do FREE https://www.cloudamqp.com/ Segue o exemplo: https://www.youtube.com/watch?v=Fm6GahJ0DJk
-
Até onde eu sei, Laravel não é um superset do PHP, como o Typescript é do Javascript. Sendo assim, Laravel "Framework" ainda é php, php avançado ao meu ver é versão 8+, https://www.php.net/releases/8.0/en.php https://www.php.net/releases/8.1/en.php o Laravel ganhou fama pela facilidade de uso, antes dele, um dos mais usados era o Synfony, este que é base do Laravel até os dias de hoje. O Composer cria uma pasta chamada "vendor" esta pasta contém todas as depêdencias de produção e desenvolvimento, por isto ela é pesada, porém a mesma deve ser ignorada ao subir para produção. Se usar o Git como versionador, por padrão a pasta /vendor ja vem setada no .gitignore, e git não ira subir a mesma. No servidor execute o seguinte comando. composer install O comando ira gerar uma nova pasta vendor com tudo atualizado ou oque estiver declarado no composer.lock Para desenvolvimento você pode usar o https://laradock.io/ , também não é um superset do Docker Não recomendo usar o laradock em produção, mas sim criar suas proprias images, já que o laradock gera muito lixo, e não tem algumas configurações setadas para produção. Há não ser que voce mude as configurações. Laravel por padrão tem o sail, algumas images do Docker, então tenha em mente que o Laravel não é PHP avançado ou do outro mundo. Simplesmente a comunidade vai criando novos pacotes e deixando o Laravel mais rico, assim como o Taylor.
-
O que vejo é problema de modelagem nestas apis. Se quer fazer um join entre apis, já esta cheirando mal. Se sua comunicação for síncrona entre apis, vai começar a ter inúmeros problemas. Estude DDD se quer separar os contextos. [LIVRO RECOMENDADO] https://www.amazon.com.br/Domain-Driven-Design-Eric-Evans/dp/8550800651/ Faça réplica dos dados e retorne uma unica consulta oque quiser. Exemplo: /GET Sala - Alunos[] A réplica pode ser em mongobd.
-
Como Enviar vários anexos através de um formulário para e-mail, função mail()
Williams Duarte respondeu ao tópico de djessica em PHP
De uma olhada na LIB do PHPMailer, bem fácil de usar https://github.com/PHPMailer/PHPMailer -
document.getElementById('ponto').src = "verde.png"; Faltou as aspas
-
Esta ai o motivo, mandou agrupar, ele o fez! GROUP BY codigo Remova e terá todos os resultados.
-
Verifique a versão do PHP, pois esta extensão tornou-se obsoleta no PHP 5.5.0 e foi removida no PHP 7.0.0. Em vez disso, a extensão MySQLi ou PDO_MySQL deve ser usada. https://www.php.net/manual/en/function.mysql-query.php Para ver qual versão esta usando: <?php phpinfo();
-
Código gerado é uma b***a! E esse ainda é dos primórdios via Dreamweaver. Estude a linguagem, e você conseguira editar este código.
-
Não há bug! O que há é o uso incorreto da claúsula INNER JOIN. 2x vezes o match da mesma tabela, correto é usar o segundo filtro na clausula ON SELECT A.id, A.timea_id, T.nome_time, T.logo_time, A.timeb_id, TI.logo_time, TI.nome_time, A.data, A.hora, A.local \n" . "FROM `agenda` A\n" . "INNER JOIN time T\n" . "ON A.timea_id = T.id AND A.timeb_id = TI.id\n" . "ORDER BY A.id ASC " ; Equivalente a: SELECT A.id, A.timea_id, T.nome_time, T.logo_time, A.timeb_id, TI.logo_time, TI.nome_time, A.data, A.hora, A.local \n" . "FROM `agenda` AS A, Time AS T\n" . "WHERE A.timea_id = T.id AND A.timeb_id = TI.id\n" . "ORDER BY A.id ASC " ;
-
Não parece ser uma dúvida, mas sim um Job, procure por plataformas de Freelancer!
-
Ajustando seu script, Funcionando no ideone: https://ideone.com/PRRNDD <?php function obterPercentual($votes, $total_votes) { return number_format(( (float) ($votes/$total_votes) * 100), 2); } $total = 4380; $votes = [ 1580, 1200, 870, 730, ]; $some = 0; printf('Total de votos: %s - ', array_sum($votes)); foreach ($votes as $key => $vote) { $some += $percent = obterPercentual($vote, array_sum($votes)); printf('Votos: %s - Porcentagem: %s%s ',$vote, $percent, "%"); } printf("Apurado: %s%s", ceil($some), "% do votos"); Debug: Total de votos: 4380 - Votos: 1580 - Porcentagem: 36.07% Votos: 1200 - Porcentagem: 27.40% Votos: 870 - Porcentagem: 19.86% Votos: 730 - Porcentagem: 16.67% Apurado: 100% do votos
-
php Retorno de Dados dentro de um Lightbox
Williams Duarte respondeu ao tópico de Elisame Araújo em PHP
Não sei hoje em dia quais são as limitações do PHP, haja vista que se faz praticamente de tudo com esta linguagem, "Laravel + Livewire é um exemplo disso". Geralmente as limitações vem do desenvolvedor, ignoram as documentações etc, isto independente da linguagem. Existe uma regra básica para o uso de seletores "ID" com javascript, ele não pode se repetir ou sempre vai pegar o primeiro seletor na DOM, ainda mais sendo todos iguais. Se abrir seu código HTML gerado em algum depurador de JS, verás que sinalizara, que há ID´s duplicadas no documento. Seu problema está aqui: <div class="badge alinhamento-mais"><a href="#" data-toggle="modal" data-target="#adbr_killer">Resumo</a></div> e aqui: <div class="modal about-modal fade" id="adbr_killer" tabindex="-1" role="dialog"> Mesmo ID para todas as repectivas modais. E este não é o jeito correto para uso de modais, mas resolve. Pesquise por modal + ajax. Solução para seu caso. Concatene como id quem vem do banco no loop, deixando o único. Desta forma: <div class="badge alinhamento-mais"><a href="#" data-toggle="modal" data-target="#adbr_killer_<?php echo $membros["id"] ?>">Resumo</a></div> <div class="modal about-modal fade" id="adbr_killer_<?php echo $membros["id"] ?>" tabindex="-1" role="dialog"> Ou seja, o problema não é o php, ele fez oque você pediu para fazer, o javascript que não sabe que outros dados existem, pois está tudo com o mesmo ID. -
Verdade, nem uso mais ternário, somente uma explicação básica para iniciantes! Tem também o operador Elvis que uso bastante. https://en.wikipedia.org/wiki/Elvis_operator $titulo = $decode->titulo ?: '';
-
Pode ser que ja resolveu, mas tem um indice antes de USD $result['quotes']['USD']['price']
-
isset com ternário resolve! Exemplo de uso no seu caso. $titulo = isset($decode->titulo) ? $decode->titulo : ""; Se a primeira condição for verdadeira retorna o valor, senão retorna vazio. Você pode criar uma função que valida estes dados function fnIsset($string) { return isset($string) ? $string : ""; } $titulo = fnIsset($decode->titulo); $data = fnIsset($$decode->data); $ano = fnIsset($$decode->ano); $tipo = fnIsset($$decode->tipo);
-
As duas com PHP é: Com curl ou file_get_contents #curl <?php $url = 'https://api.coinpaprika.com/v1/tickers/btc-bitcoin'; // Initiate curl $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL,$url); $result=curl_exec($ch); curl_close($ch); var_dump(json_decode($result, true)); #file_get_contents <?php $url = 'https://api.coinpaprika.com/v1/tickers/btc-bitcoin'; $result = file_get_contents($url); var_dump(json_decode($result, true)); Acessando $result = json_decode($result, true); echo $result['name']; Mas se já conhece como funciona as promisses em javascrpit, tem as lib axios https://github.com/axios/axios