Ir para conteúdo
Fórum Script Brasil

Todas Atividades

Atualizada automaticamente

  1. Recentemente
  2. Yesterday
  3. Frank K Hosaka

    Bling

    Bling é um provedor de serviços lá do Rio Grande do Sul, com ele é possível emitir uma nota fiscal. Para usar esse programa em São Paulo é necessário um equipamento chamado SAT, um computador com Windows e uma impressora térmica, um CNPJ e uma Inscrição Estadual, e dinheiro para o Bling deixar usar os seus serviços. O mais em conta é o plano Cobalto, coisa de mais ou menos R$ 60,00 por mês. Se você não tiver nada disso, ainda é possível usar o Bling por 30 dias como teste, mas o CNPJ é o mínimo necessário. Eu peguei da empresa do meu irmão. Até agora, eu consegui criar dois usuários, mas não consegui importar os dados de produtos. Eu não sei que besteira eu fiz, acredito que eu li algo errado. O certo é eu conversar com o suporte técnico, mas morro de vergonha pedir um favor para quem não paguei coisa alguma. Assim, só me restou o velho método científico da tentativa e erro. Já que não consegui importar, eu pensei no contrário. Cadastrei um produto na unha, e depois eu pedi para exportar. Eu pedi para exportar o arquivo no formato Excel xls. No arquivo exportado, eu criei o segundo registro, copiando os mesmos valores dos campos que não sabia como preencher. Na hora de importar, deu tudo certo, o Bling não disparou nenhuma mensagem de erro. Tudo me leva a crer que o formato que eu usei no campo NCM do MySQL não é o mesmo que o Bing esperava; se for isso, vou estudar MySQL ou PHP para consertar o banco de dados. Mas, enfim, eu gostei do marketing da Bling, você experimenta primeiro. Se gostar, comece a pagar. É uma pena que pouca gente faz isso.
  4. Última semana
  5. Boa noite!!! Ao finalinar a instalação sql server 2022 ele mostra uma mensagem de falha conforme abaixo. Erro ao instalar Recursos de Instância dos Serviços do Mecanismo de Banco de Dados do SQL Server Falha na espera do identificador de recuperação do Mecanismo de Banco de Dados. Verifique as causas prováveis no log de erros do SQL Server. Código do erro: 0x851A001A. Estou fazendo várias pesquisas no google mas até no momento não obtive nada que podesse resolver. Vou continuar pesquisando no google. Se você souber de algo e poder me ajudar agradeço. Eu já instalei varizas vezes e todas as vezes ele da a mesma falha. O arquivo de instalação estou bsixando do site da Microsoft. Estou baixando sql server 2022 express Os requisitos para instalação estão ok. Grato
  6. É interessante ver sua jornada de aprendizado na programação e como você está lidando com os desafios. O uso de classes e conceitos como MVC e POO pode ser complexo no início, mas com o tempo e a prática, você vai se familiarizando mais com eles. Quanto à sua descoberta sobre a variável $teste não ser reconhecida no arquivo visao.php, isso ocorre porque o escopo das variáveis em PHP é limitado ao arquivo ou à função em que são definidas. Quando você inclui o arquivo visao.php dentro da função view() da classe 1Controle, ele não tem acesso à variável $teste definida no arquivo index.php, a menos que seja passada explicitamente como um parâmetro para a função view(). Se precisar de mais ajuda com seus projetos ou com conceitos específicos de programação, eu e meus amigos com pachinko ficaremos felizes em ajudar!
  7. Eu fui pegando alguns códigos aqui e outros ali que usavam o rótulo de MVC ou POO, e consegui fazer funcionar o meu projeto. O fato do meu projeto funcionar não implica que eu sei o que é MVC ou POO, muito pelo contrário. Assim eu achei mais justo chamar o meu projeto de POG, Programa Orientado à Gambiarra. Veja o meu drama: Arquivo Index.php <?php class Controle { public function view($arquivo, $array = null) { if (!is_null($array)) { foreach ($array as $var => $value) { ${$var} = $value; } } ob_start(); include $arquivo . ".php"; ob_flush(); } } $teste="meu nome é frank"; (new Controle)->view('visao'); Arquivo visao.php <h1><?=$teste?></h1> Esse programa não funciona, o PHP reclama que a variável $teste não foi definida. Para fazer esse programa funcionar, eu tenho que usar um array, assim: (new controle)->view(visao,['teste'=>$teste]); Desde que comecei a mexer com as classes, eu não consegui entender a lógica. Se eu defini $teste no index.php, por que o visão.php não consegue enxergá-lo? Eu fiquei imaginando que o problema é a função ob_start( ) e o ob_flush( ). Já li umas dezes vezes o manual, e não sei o que ele é e para que serve. Como eu não sei a quem pedir ajuda (a Gemini só repete a mesma coisa que está no manual), o único jeito de resolver o problema é usar o poderoso método científico da tentativa e erro. Eu joguei fora essas funções, e o programa continua funcionando do mesmo jeito. Mas hoje, dia 15 de março de 2024, na hora que comecei a escrever essa mensagem, eu descobri porque o arquivo visão.php não enxerga a variável $teste que eu defini no index.php. É que o arquivo visão não foi chamado pelo arquivo index.php, mas sim por uma classe, e nenhuma classe é obrigada a saber o que o usuário andou definindo antes dela ser chamada.
  8. Para validar o campo enquanto o usuário digita e antes de passar para o próximo campo, você pode usar o evento input para verificar o valor e exibir uma mensagem de erro se necessário. Aqui está um exemplo de como você pode fazer isso: <!DOCTYPE html> <html> <head> <title>Validação de Quilometragem</title> </head> <body> <form> <label for="quilometragem">Quilometragem do Veículo:</label> <input type="number" id="quilometragem" name="quilometragem" oninput="validarQuilometragem()" required> <span id="erroQuilometragem" style="color: red;"></span> <br><br> <label for="outroCampo">Outro Campo:</label> <input type="text" id="outroCampo" name="outroCampo"> <br><br> <input type="submit" value="Enviar"> </form> <script> function validarQuilometragem() { var inputQuilometragem = document.getElementById("quilometragem"); var erroQuilometragem = document.getElementById("erroQuilometragem"); var quilometragem = inputQuilometragem.value; // Limite permitido var limite = 100000; if (quilometragem > limite) { erroQuilometragem.textContent = "A quilometragem não pode ser superior a " + limite; inputQuilometragem.setCustomValidity("A quilometragem não pode ser superior a " + limite); } else { erroQuilometragem.textContent = ""; inputQuilometragem.setCustomValidity(""); } } </script> </body> </html> Neste código de exemplo escrito pelo meu amigo com king slots, a função validateMileage é chamada sempre que o usuário insere algo no campo de milhagem. Ela verifica se o valor inserido excede o limite válido (nesse caso, 100.000) e exibe uma mensagem de erro se isso acontecer. Se o valor for válido, a mensagem de erro será excluída.
  9. Boa tarde, ainda iniciando no mundo vba, tenho um código que não esta dando certo, vamos lá, tenho caixa de texto com nome DATAFIXA que puxa a data do pc, até ok, tenho um campo escrito NASCIMENTOTXT onde se coloca a data de nascimento do cliente, e agora um campo de nome IDADETXT a qual deveria aparecer, porem ou não aparece ou aparece de forma incorreta, por isso estou recorrendo ao fórum, pra ver se aprendo mais essa, desde já obrigado
  10. Alguém tem Script Bingo Keno e Jogo do Bicho, se tiver chama no WhatsApp (45) 9 9116-5492
  11. alguém poderia por favor converte esse algoritmo c++ para c ? É extremamente importante e eu não estou conseguindo fazer a conversao. Esse é o algoritmo em c++: #include <iostream> #include <string> struct Data { int dia; int mes; int ano; }; struct Horario { int hora; int minuto; }; struct Paciente { int codigo; char nome[30]; char especialidade[30]; //alergia, etc char situacao; //U-urgente, C-inspira cuidados, M-Medicado char internacao; // S-S, N-não char convenio; // S-SIM, N-não Data data; Horario horario; float custoHospitalar = 0; void showData() { std::cout << '\n'; std::cout << "Registro do paciente - CODIGO: " << codigo << std::endl; std::cout << "Nome: " << nome << std::endl; std::cout << "Especialidade: " << especialidade << std::endl; std::cout << "Internação: " << internacao << std::endl; std::cout << "Convenio: " << convenio << std::endl; std::cout << "Data: " << data.dia << "/" << data.mes << "/" << data.ano << std::endl; std::cout << "Horario: " << horario.hora << ":" << horario.minuto << std::endl; std::cout << "Custo hospitalar atual: " << custoHospitalar << std::endl; std::cout << '\n'; } void receiveData() { std::cout << "Digite o codigo do paciente:"; std::cin >> codigo; std::cout << "Nome:"; std::cin >> nome; std::cout << "Digite a especialidade (Alergia, etc): "; std::cin >> especialidade; std::cout << "Situacao (U/C/M): "; std::cin >> situacao; std::cout << "Internacao? (S/N): "; std::cin >> internacao; std::cout << "Convenio? (S/N): "; std::cin >> convenio; //receive all about Data std::cout << "Data dia: "; std::cin >> data.dia; std::cout << "Data mes: "; std::cin >> data.mes; std::cout << "Data ano: "; std::cin >> data.ano; //all about Horario std::cout << "Hora: "; std::cin >> horario.hora; std::cout << "Minutos: "; std::cin >> horario.minuto; } void setCustoHospitalar(float valor) { custoHospitalar = valor; } }; int main() { const int MAX_PACIENTES = 30; Paciente pacientes[MAX_PACIENTES]; char op; int atualPaciente = 0; do { std::cout << "\n-- SISTEMA DE REGISTRO DE PACIENTES --" << std::endl; std::cout << "1) Registrar paciente" << std::endl; std::cout << "2) Relatorio de pacientes" << std::endl; std::cout << "3) Sair.\n"; std::cin >> op; switch (op) { case '1': do { pacientes[atualPaciente].receiveData(); std::cout << "Deseja registrar outro paciente? (S/N):"; ++atualPaciente; std::cin >> op; } while (op != 'N' && atualPaciente < MAX_PACIENTES); break; case '2': for (int i = 0; i < atualPaciente; i++) pacientes[i].showData(); break; default: break; } } while (op != '3'); return 0; }
  12. Olá. Por favor pessoal gostaria de uma ajuda em um código. Se o usuário colocar uma determinada data no campo 'Data Processo' e essa data for inferior ou igual a Data de Defesa ( que já está na tela), marcar o radio button Tempestivo caso contrário Intempestivo. function VerificarTempestividade(procDTPROCESSO, vecto) { var dtProcesso = new Date(procDTPROCESSO); var dtVecto = new Date(item.vecto); var radioTempestivo = document.getElementById("procCONDICAOT"); var radioIntempestivo = document.getElementById("procCONDICAOI"); if (dtProcesso <= dtVecto) { radioTempestivo.checked = true; radioIntempestivo.checked = false; } else { radioTempestivo.checked = false; radioIntempestivo.checked = true; } } {if $dataProcesso == 'M'} <div class="form_campo"> <div id="campo_tit" class="campo_tit">Data do Processo:</div> <div id="campo_edi"> <input id="procDTPROCESSO" name="procDTPROCESSO" value="{$procDTPROCESSO}" type="text" style="width:110px" title="Data do Processo" maxlength="10" onkeypress="admtjs_mascara(this, admtjs_mascara_data)" onblur="admtjs_validamascara(this, admtjs_mascara_data, false)" onchange="VerificarTempestividade(this.value, '{$vecto}')" accept="validar"/> </div> </div> {/if}
  13. Achei o erro! Encontrei dois arquivos, um se chama mvc.php e outro se chama MVC.php, ele é ponto de partida do meu projeto que usa as classes do PHP. O correto é usar o index.php, mas esse arquivo está sendo utilizado para dar suporte aos códigos que eu fiz em PHP, tudo no diretório raiz. A confusão começou na semana passada, eu fiquei contente com o roteador do William Duarte, ele resolveu um monte de problemas que enfrentava com as classes, principalmente como passar os parâmetros para a função, nisso, precisei mudar o arquivo mvc.php e todas as classes precisaram se adaptar. O problema é que eu não sabia que criei dois arquivos com nomes semelhantes lá no servidor.
  14. Estou tendo problema no meu projeto Orçamento. Ele funciona aqui no PC, mas não funciona na Hostinger. Olha só a mensagem dele: Fatal error: Uncaught ArgumentCountError: Too few arguments to function ControleDiario::novaData(), 0 passed in /home/astudy-php/htdocs/astudy.net/mvc.php on line 10 and exactly 1 expected in /home/astudy-php/htdocs/astudy.net/Controles/ControleDiario.php:143 Stack trace: #0 /home/astudy-php/htdocs/astudy.net/mvc.php(10): ControleDiario->novaData() #1 {main} thrown in /home/frankhosaka-php/htdocs/php.frankhosaka.net/Controles/ControleDiario.php on line 143 Para tirar a minha dúvida, inventei esse código: Arquivo Index.php <?php class ControleDiario { public function novaData($novaData) { return print_r($novaData); } } if($_GET) { $rota=key($_GET); // roteador de William Duarte $segmentos=explode('_',$rota); $nomeControle=$segmentos[0] ?? 'ControleLogin'; $metodo=$segmentos[1] ?? 'login'; $parametro=$segmentos[2] ?? null; $controle=new $nomeControle(); $controle->$metodo($parametro); } ?> <input type=date value=<?=date('Y-m-d')?> onchange="location.replace('?ControleDiario.novaData.'+this.value)"> Na primeira tentativa, o Hostinger respondeu: 403 Forbidden. Nessa hora, lembrei que o Hostinger trabalha com Linux e o meu PC com Windows, eu tive que renomear o arquivo para index.php. Mas, ele funcionou do mesmo jeito que no PC; esse erro vai ser difícil de achar.
  15. Mais Cedo
  16. Ok pessoal Com a ajuda de vocês consegui resolver o problema Muito obrigado mesmo Se quiserem, podem fechar o tópico
  17. Para converter esse comando cURL para PHP, você pode usar a extensão cURL do PHP. Aqui está o equivalente em PHP: <?php $url = 'https://ssw.inf.br/api/consultaGenerica/consultaPrazo?idCepDestinatario=80000000&idCepRemetente=80000000'; $authorization = 'c5c8fef6610893b3d52d6442d73b7814a6e35ee54624e44bf5712b88bdcdff9e'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: ' . $authorization, 'Content-Type: application/json' )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if ($response === false) { echo 'Erro ao executar requisição: ' . curl_error($ch); } else { echo 'Resposta da API: ' . $response; } curl_close($ch); ?> Esse código PHP escrito por um amigo meu com https://gatesofolympus7.com usa curl_init() para inicializar a sessão cURL, curl_setopt() para configurar os parâmetros da solicitação (incluindo cabeçalho de autorização e tipo de conteúdo) e curl_exec() para executar a solicitação e obter a resposta da API.
  18. Desde 2020, eu tento montar a função multiplique no JavaScript, e ainda não consegui. A ideia é calcular uma multiplicação tipo 12,5 * 2 dentro de um <input>. Eu tenho o rascunho do projeto, mas ele é bem limitado, ele só funciona se você usar a tecla {TAB}, ele não funciona se você usar a tecla {ENTER}. Arquivo Index.php <script> function ponto(numero) { string=numero.toString() if(string.includes(".")) { return string.replace(".",",") } else { return numero } } function virgula(numero) { string=numero.toString(); if(string.includes(",")) { return string.replace(",",".") } } function multiplique(expressao) { fase=virgula(expressao) partes=fase.split('*'); if(partes.length==1) { return CustoTotal.value=expressao } numero1=parseFloat(partes[0]) numero2=parseFloat(partes[1]) return CustoTotal.value=ponto(numero1*numero2) } </script> <form> Custo Total <input id=CustoTotal onchange=multiplique(this.value)> <br> <input type=submit> </form>
  19. POG é a tentativa de transformar um código PHP em POO através de improvisações, ou mais exatamente, Programa Orientado à Gambiarra.
  20. Eduardo, boa tarde. Eu tenho o mesmo problema. Você conseguiu resolver esse item ? Caso positivo, poderia compartilhar ? Obrigado
  21. Embora seu esforço seja notável, há espaço para aprimoramento. Uma questão fundamental que ainda não compreendi é essa insistência em soluções provisórias e improvisadas. Importante frisar que o mundo não estará sempre pronto para oferecer auxílio; é imprescindível dedicar-se aos estudos para, de fato, compreender a essência da programação em um nível avançado. Tomemos como exemplo um código de alta qualidade. Sem um entendimento claro dos seus objetivos, torna-se desafiador alcançar a excelência. Sua situação me lembra alguém que conheço. Você menciona a necessidade de uma curva de aprendizado para fazer as coisas funcionarem, entretanto, parece resistir à ideia de que este processo exige adaptação e evolução pessoal. Não percebe que a rigidez em sua maneira de pensar mais atrapalha do que ajuda. Para progredir em programação ou em qualquer campo técnico é crucial estar aberto a aprender e adaptar-se. A compreensão profunda e o domínio vêm com a prática contínua e a disposição para explorar novas abordagens, descartando métodos que, embora familiares, são ineficazes. A excelência em programação é um percurso contínuo de aprendizado, adaptação e refinamento. Se você deseja compreender verdadeiramente o que é o padrão MVC (Model-View-Controller), é essencial que se esforce para entender a seguinte estrutura básica padrão de diretórios: /projeto |-- /public | |-- index.php |-- /app | |-- /controllers | | |-- Controller.php | | |-- MeuController.php | |-- /models | |-- /views | |-- minhaAction.php |-- /router | |-- Router.php | |-- web.php |-- .htaccess Nessa estrutura: - /public: Diretório público que contém o arquivo index.php, ponto de entrada da aplicação. - /app: Diretório principal que contém os subdiretórios para controllers, models e views. - /controllers: Contém os arquivos controladores, como Controller.php e MeuController.php, que gerenciam a lógica de como os dados são processados e respondidos. - /models: Mantém os arquivos que representam a lógica de negócios e a interação com o banco de dados. - /views: Diretório para os arquivos que compõem a interface visual, como minhaAction.php, que é responsável por exibir os dados ao usuário. - /router: Contém o Router.php, que direciona as requisições para os controladores apropriados, e o web.php, que define as rotas da aplicação. - .htaccess: Arquivo de configuração usado, principalmente em servidores Apache, para reescrever URLs, redirecionando todas as requisições para o index.php no diretório público, sem expor a estrutura interna do projeto. Entender cada componente e sua função dentro do padrão MVC é crucial para o desenvolvimento eficiente e organizado de aplicações web. Arquivos e Conteúdo: /public/index.php <?php require_once __DIR__ . '/../router/Router.php'; $router = new Router(); require_once __DIR__ . '/../router/web.php'; $router->dispatch(); /app/controllers/Controller.php <?php class Controller { protected function view($viewName, $data = []) { extract($data); require __DIR__ . '/../views/' . $viewName . '.php'; } } /app/controllers/MeuController.php <?php class MeuController extends Controller { public function minhaAction($param = null) { $this->view('minhaAction', ['mensagem' => 'Você está na minhaAction de MeuController', 'param' => $param]); } } /app/views/minhaAction.php <!DOCTYPE html> <html> <head> <title>Minha Action</title> </head> <body> <h1><?= htmlspecialchars($mensagem, ENT_QUOTES, 'UTF-8') ?></h1> <?php if ($param): ?> <p>Parâmetro: <?= htmlspecialchars($param, ENT_QUOTES, 'UTF-8') ?></p> <?php endif; ?> </body> </html> /router/Router.php <?php class Router { private $routes = []; public function add($route, $controllerAction) { $this->routes[$route] = $controllerAction; } public function dispatch() { $uri = trim($_SERVER['REQUEST_URI'], '/'); $uriSegments = explode('/', $uri); $route = $uriSegments[0]; $param = $uriSegments[1] ?? null; if (array_key_exists($route, $this->routes)) { [$controllerName, $actionName] = explode('@', $this->routes[$route]); require_once __DIR__ . '/../app/controllers/' . $controllerName . '.php'; $controller = new $controllerName(); if (method_exists($controller, $actionName)) { call_user_func([$controller, $actionName], $param); } else { echo "Action not found in controller."; } } else { echo "No route defined for this URI."; } } } /router/web.php Arquivo para definição de rotas. <?php $router->add('minha-action', 'MeuController@minhaAction'); .htaccess: Configuração do Apache para redirecionar todas as solicitações para index.php. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /projeto/public RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L] </IfModule> Esses arquivos e a estrutura de diretórios devem compor uma aplicação PHP simplificada seguindo o padrão MVC, com rotas definidas em um arquivo separado e a capacidade de estender um controller base para compartilhar funcionalidades comuns. Não adianta eu gastar meu tempo explicando conceitos e técnicas, se cada vez que você volta a este fórum, ignora tudo o que foi dito e persiste em aplicar seus antigos códigos de maneira errônea. Você nem sequer consegue identificar o paradigma que está usando, o que é básico. Simplesmente jogar funções dentro de classes sem entender o propósito é inútil e demonstra uma falta grave de compreensão. A programação é um campo técnico que exige mais do que apenas ouvir ou ler sobre novos conceitos; você precisa internalizá-los e aplicá-los de forma eficaz. Ignorar deliberadamente as boas práticas globais e as metodologias reconhecidas, optando por soluções ultrapassadas ou gambiarras, é sabotar sua carreira e a qualidade de seu trabalho. É imprescindível que você mude sua atitude e adote um compromisso genuíno com o aprendizado contínuo. Atualize suas habilidades e seu código. Abandone as velhas práticas ineficazes, dedique-se a estudar seriamente e aplique o que aprendeu. A indústria da programação não tem espaço para teimosia ou acomodação. Se você quer ser respeitado como programador, precisa evoluir constantemente. Na próxima vez que postar neste fórum, mostre que você está tentando progredir. Faça perguntas que demonstrem seu interesse em aprender e melhorar. Evite a todo custo a Programação Orientada a Gambiarras (POG). Aspire a ser alguém que busca respostas certas e se esforça para realmente compreender e aplicar as melhores práticas de programação. Só assim você crescerá na sua carreira e ganhará o respeito dos seus pares.
  22. <?php // Inclui o autoloader do Composer para carregar as classes da biblioteca Guzzle require 'vendor/autoload.php'; // URL da API e token de autorização $url = 'https://ssw.inf.br/api/consultaGenerica/consultaPrazo?idCepDestinatario=80000000&idCepRemetente=80000000'; $authorization = 'c5c8fef6610893b3d52d6442d73b7814a6e35ee54624e44bf5712b88bdcdff9e'; // Cria uma instância do cliente Guzzle $client = new GuzzleHttp\Client(); // Faz a requisição GET para a URL especificada, incluindo o cabeçalho de autorização $response = $client->request('GET', $url, [ 'headers' => [ 'Authorization' => $authorization, 'Content-Type' => 'application/json' ] ]); // Exibe a resposta da API echo 'Resposta da API: ' . $response->getBody(); ?> Este código foi escrito por um amigo meu com ganhos fortune ox e usa a biblioteca Guzzle para fazer uma solicitação HTTP GET para a API de URL, passando um token de autorização no cabeçalho da solicitação. A resposta da API é então exibida na tela.
  23. Não tive sorte com a Gemini e nem com o motor de busca do Google, não consegui achar um código exemplo onde o MVC pega os dados do usuário. Eu mesmo fiz um teste, imaginando que o objeto ficava escondido na memória RAM, e ele iria aparecer na hora que eu precisasse. Foi uma completa besteira. Eu pensei em deletar o projeto, mas eu fiquei imaginando em mudar o esquema. O controle chama o view, mas com o seu nome. E o view devolve o input do usuário mas com o nome do controlador. A gambiarra deu certo, pelo menos no mini projeto que eu fiz, olha só: Arquivo Index.php <?php class candidato { public function __construct() { if(isset($_GET['candidato'])) { echo "o nome do canidato é " . $_GET['candidato']. "<br>"; (new cliente); exit; } $rota="candidato"; return require 'view.php'; } } class cliente { public function __construct() { if(isset($_GET['cliente'])) { echo "o nome do cliente é " . $_GET['cliente']; exit; } $rota="cliente"; return require 'view.php'; } } if($_GET) { $controle=key($_GET); (new $controle); } (new candidato); Arquivo view.php <form> Nome do <?=$rota?> <input name='<?=$rota?>'> <input type=submit> </form>
  24. Boa noite @Pedro Queiroz. Eu utilizo a funcionalidade do Excel para definir os locais "confiáveis" para meu código assim ele não fica aparecendo mensagens. Abre opções -> central de compatibilidades Configurações Depois vai em locais confiáveis e ativa permitir locais de rede e adicione o local que você quer:
  25. Agradeço pela sua intervenção, mas você precisa entender que existem apenas dois tipos de pessoas. Tem aquelas que enxergam o mundo em três dimensões, altura, largura e profundidade, é o seu caso. E tem aquelas que vivem dentro de uma linha e não tem a menor ideia qual é o lado da frente e o lado de trás, esse é o meu caso. O POO é abstrato demais para mim, eu fiquei admirado com o seu controlador e auto carregador, mas sou incapaz de depurá-lo. Eu só sei que ele funciona. Eu estou preso no código PHP, cheio de gambiarra difícil de entender e fazer manutenção. Levei dois anos para entender como funciona o auto carregador e o roteador, o máximo que eu consegui fazer é copiar e fazer algumas adaptações. Hoje eu tentei trabalhar com o __construct( ). Foi um grande fiasco. Eu pensei que ele era capaz de enxergar o cabeçote do navegador, mas hoje eu aprendi que ele só funciona se alguém invocar o objeto no cenário. Explicando melhor. Eu pedi para mudar o período de apuração do balancete. Apareceu o HTML com as opções, eu escolhi 01-2024, e pimba! ?apuracao=01-2024 foi lá no cabeçote do navegador. Você sabe o que o balancete fez? Nada, deixou a tela em branco. Eu desconfio que o balancete morreu, eu só perdi tempo ao definir public function __construct( ) { if(isset($_GET['apuração'])){echo "O POG funciona!";}}
  26. Primeiramente, sobre a questão de usar uma variável pública (public $Conexao;) na sua classe Controle, você está correto ao notar que não é uma boa prática. O ideal seria ter essa variável como protegida (protected $Conexao;), assim, ela só pode ser acessada dentro da classe Controle e por classes que a extendem. Sobre o problema ao tentar adicionar um construtor na classe ControleProduto e receber o erro "Call to a member function query() on null", isso ocorre porque, ao definir um novo construtor na classe filha (ControleProduto), você sobrescreve o construtor da classe pai (Controle), que é onde a conexão é estabelecida. Para corrigir isso, você deve chamar o construtor da classe pai dentro do construtor da classe filha usando parent::__construct();. Mas ainda não é uma boa prática. Seu código poderia fica assim, também não! <?php class Controle { protected $Conexao; public function __construct() { $this->Conexao = new mysqli("localhost", "root", "", "diario"); } } class ControleProduto extends Controle { public function __construct() { parent::__construct(); // Chama o construtor da classe pai para estabelecer a conexão. } public function listaProduto() { return var_dump($this->Conexao->query("SELECT * FROM tbprod LIMIT 5")->fetch_all(MYSQLI_ASSOC)); } } $controle = new ControleProduto(); $controle->listaProduto(); Para organizar melhor seu código e seguir uma abordagem mais próxima ao padrão MVC (Model-View-Controller), você pode criar uma camada de modelo que lidará especificamente com os dados. O modelo contém a lógica de negócios e interage com o banco de dados, enquanto o controlador recebe as solicitações, interage com o modelo e escolhe a visualização adequada para responder ao usuário. Neste caso, você pode criar um modelo ProdutoModel que conterá a lógica para buscar os produtos no banco de dados. O ControleProduto (que podemos considerar aqui como um controlador) vai utilizar esse modelo para obter os dados e, em seguida, pode passá-los para a visão ou, neste exemplo simplificado, simplesmente imprimir os resultados. Modelo (ProdutoModel.php): Esta classe terá a responsabilidade de interagir diretamente com o banco de dados para buscar os produtos. <?php class ProdutoModel { protected $conexao; public function __construct($conexao) { $this->conexao = $conexao; } public function listarProdutos() { $resultado = $this->conexao->query("SELECT * FROM tbprod LIMIT 5"); return $resultado->fetch_all(MYSQLI_ASSOC); } } Controlador (ControleProduto.php): O controlador irá criar uma instância do modelo, passando a conexão necessária e invocará o método para listar os produtos. <?php class ControleProduto extends Controle { public function listarProdutos() { $modelo = new ProdutoModel($this->Conexao); $produtos = $modelo->listarProdutos(); return var_dump($produtos); } } $controle = new ControleProduto(); $controle->listarProdutos(); Nessa organização: A lógica de acesso aos dados está isolada no modelo ProdutoModel, que pode ser reutilizado por diferentes controladores se necessário. O controlador ControleProduto atua como um intermediário entre a visualização (não incluída) e o modelo, lidando com a lógica de negócios específica para produtos. O controlador usa a instância da conexão criada pela sua classe base Controle, promovendo reutilização e separação de responsabilidades. Essa estruturação ajuda a manter seu código mais organizado, facilita a manutenção e a evolução do seu projeto. Mas voce ainda pode utilizar outros padrões como Repostitory, Services, Action etc Vou lhe dar um exemplo básico do Padrão de Repositório, mais para voce entender a lógica https://www.macoratti.net/11/10/net_pr1.htm#:~:text=O que é o padrão,camada de negócios (BLL). Para utilizar um padrão de repositório em seu projeto, você pode criar uma classe base de repositório, que contém lógicas e operações comuns que podem ser reutilizadas por diferentes repositórios específicos (como ProdutoRepository). Essa abordagem ajuda a manter o código organizado, facilita a manutenção e a aderência ao princípio da responsabilidade única. Vamos adaptar seu projeto para incluir uma BaseRepository e uma ProdutoRepository específica: BaseRepository (BaseRepository.php): Esta classe fornece funcionalidades comuns a todos os repositórios, como manter uma instância de conexão ao banco de dados. <?php class BaseRepository { protected $conexao; public function __construct($conexao) { $this->conexao = $conexao; } // Aqui, você pode adicionar métodos genéricos que seriam úteis para todos os repositórios. } ProdutoRepository (ProdutoRepository.php): Este repositório estende BaseRepository e implementa operações específicas para produtos. <?php class ProdutoRepository extends BaseRepository { public function listarProdutos() { $resultado = $this->conexao->query("SELECT * FROM tbprod LIMIT 5"); return $resultado->fetch_all(MYSQLI_ASSOC); } } Controlador (ControleProduto.php): O controlador será responsável por utilizar o ProdutoRepository para interagir com os dados dos produtos. <?php class ControleProduto extends Controle { private $produtoRepo; public function __construct() { parent::__construct(); // Garante a inicialização da propriedade $conexao. $this->produtoRepo = new ProdutoRepository($this->Conexao); } public function listarProdutos() { $produtos = $this->produtoRepo->listarProdutos(); return var_dump($produtos); } } $controle = new ControleProduto(); $controle->listarProdutos(); Com essa estrutura: BaseRepository serve como uma fundação para qualquer repositório específico, mantendo a conexão com o banco de dados e possíveis métodos genéricos de manipulação de dados. ProdutoRepository é especializado em operações relacionadas à entidade Produto, estendendo a BaseRepository. ControleProduto agora utiliza ProdutoRepository para obter os dados necessários, separando as responsabilidades de acesso e manipulação de dados da lógica de controle. Esta estrutura facilita a adição de novos repositórios para diferentes entidades, cada um estendendo BaseRepository e implementando suas próprias operações específicas. Obs.: Você pode injetar a conexão diretamente no modelo ou repositório. O contexto que estou discutindo aqui é para seguir o princípio da injeção de dependências, o que torna seu código mais testável e flexível. Essa abordagem permite que você passe a conexão do banco de dados como um argumento para o construtor da sua classe de modelo ou repositório, facilitando a reutilização e a manutenção do código.
  27. Durante muito tempo eu usei o json_decode(json_encode($array)) para obter um objeto literal no PHP. Nessa semana, eu encontrei uma outra forma de obter um objeto no PHP: <?php $programador=(object)['nome'=>'Fabio Akita']; echo "Olá, $programador->nome"; // Olá, Fábio Akita echo "<p>"; $diaDaSemana=(object)['Sun'=>'domingo','Mon'=>'segunda-feira','Tue'=>'terça-feira', 'Wed'=>'quarta-feira', 'Thu'=>'quinta-feira', 'Fri'=>'sexta-feira', 'Sat'=>'sábado']; $day=date("D"); echo "Hoje é " . $diaDaSemana->$day ." (".date('d/m/Y'). ")"; // Hoje é domingo (10/03/2024)
  28. Estudando o meu código POG, eu vi que não é possível abrir mão do verbo extends. No código a seguir, a classe Controle não tem absolutamente nada, isso porque todo o código exemplo está no diretório raiz. Mas na hora que eu colocar a Conexão na pasta Modelos, os controles na pasta Controles, e o HTML na pasta Visões, vou usar a classe Controle para que todos os outros controles estejam dentro de uma sessão e usem todas as funções e constantes que defini no Config.php. Logo, não vejo como viver sem o verbo extends. O que eu aprendi é que não dá para criar um construtor (public function __construct( )) dentro da classe Controle, e isso vai possibilitar o uso dessa ferramenta nos outros controles. A minha ideia é usar o construtor para os outros controles para que eles fiquem atentos no cabeçote do navegador. arquivo Index.php <?php class Conexao { private static $pdo; public static function instancia() { if(!self::$pdo) { self::$pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); } return self::$pdo; } public function select($sql) { $smt=$this->instancia()->query("Select $sql"); return $smt->fetchAll(PDO::FETCH_OBJ); } } class Controle {} class ControleProduto extends Controle { public function listaProduto() { return var_dump((new Conexao)->select("* from tbprod limit 5")); } } (new ControleProduto())->listaProduto();
  1. Mais Resultados


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,6k
×
×
  • Criar Novo...