
Frank K Hosaka
Membros-
Total de itens
1.623 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Como diluir um valor em campos diferentes - PHP
pergunta respondeu ao Marcio Marins de Frank K Hosaka em PHP
Eu acho muito difícil passar adiante as resmas mais antigas do que as mais novas, principalmente porque a turma da entrega tem mania de empilhar as novas resmas por cima das mais antigas. No MySQL, eu não teria a menor ideia de como fazer um controle de saída de acordo com o controle de entrada. No meu projeto, eu criei duas tabelas para controlar o estoque: o produto e a história do produto. O produto tem o id e a descrição. A história do produto tem id, id do produto, lançamento, quantidade, custo. A quantidade é positiva quando ocorre a entrada. A quantidade é negativa quando ocorre a saída. O problema é calcular o custo, assim: <?php $mysqli=new mysqli("localhost","root","","diario"); if(isset($_GET['quantidadeSolicitada']){ $qt=$_GET['quantidadeSolicitada']*(-1); $codProduto=$_GET['codigoProduto']; $lancamento=$_GET['lancamento']; $query=$mysqli->query("select sum(quantidade) as estoque, sum(custo) as total from tbhistprod where idProduto=$codProduto"); $rows=$query->fetch_all(MYSQLI_ASSOC); $estoque=$rows['estoque']; $total=$rows['total']; $media=intval($estoque/$total*100)/100; $custoSolicitacao=$media*$qt; $mysqli->query("insert into tbhistprod (lancamento,idProduto,quantidade,custo) values ($lançamento,$codProduto,$qt,$custoSolicitacao");} -
Lá em 2020, eu não tinha a conta estoque no plano de contas, mas eu queria ter um pouco mais de controle nas despesas. Assim eu inventei a tabela produtos e histórico de produtos. Mas em 2022, surgiu a conta estoque no plano de contas. Para ter um controle melhor, eu precisava impor a regra "a soma dos produtos tem que ser igual à soma dos registros contábeis". O problema é que a tabela produtos já contava com centenas de itens que representavam despesas. Pensei em criar uma nova tabela para separar o que é estoque do que é despesa, mas achei melhor usar a tabela produtos para fazer esse serviço. Encontrei o campo local, e lá eu defini o valor "a24" (abreviatura pessoal para "fora da prateleira"). Tentei fazer uma consulta, o valor do estoque é a soma do custo total onde o produto não está na prateleira "a24". Não deu certo, haviam muitos registros com valor null no local. Levei um tempão para mudar o valor padrão do campo local de null para ''. Depois disso, eu fiz a consulta no PHP: $query=$myqli->query("select sum(custototal) as soma from tbhistprod join tbprod on tbprod.codprod = tbhistprod.codprod where loc <> "a24" and custototal > 0"); $total=$query->fetch_all(MYSQLI_ASSOC)[0]['soma']; O problema é como converter isso na gramática do Eloquent. Pedi ajuda para o Bard, e ele meu um exemplo: $total = Tbhistprod::join('tbprod', 'tbhistprod.idprod', '=', 'tbprod.id') ->where('tbprod.loc', '!==', 'a24') ->sum('custo'); O código não funcionou, mas desconfiei do operador "!==", ele não é da gramática do MySQL. Ajeitei o meu código, e ele funcionou: $total=tbhistprod::join('tbprod','tbhistprod.codprod','=','tbprod.codprod') ->where('tbprod.loc','<>','a24') ->where('custototal','>',0) ->sum('custototal');
-
O meu livro Diário começou em setembro de 2020, consegui resolver o problema da apuração, criando um botão para cada período contábil. O problema é que o tempo passou e chegamos em 2024, agora eu tenho um monte de botão. Eu preciso dos botões para mudar o período de apuração, a minha saída foi diminuir o tamanho deles: arquivo MVC > Visoes > Apuracao.php <?php include 'menu.php'; foreach($apuracoes as $apuracao){ $ano = substr($apuracao->apuracao,0,4); $mes = substr($apuracao->apuracao,5,2); if(!isset($anoAnterior)){echo $ano ." ";$anoAnterior=$ano;} if($ano!==$anoAnterior){echo "<br>" . $ano ." <a href=?apurar=$apuracao->apuracao>$mes</a> "; $anoAnterior=$ano;} else { echo " <a href=?apurar=$apuracao->apuracao>$mes</a> ";}}
-
Estudando um pouco mais o only_full_group_by da versão 8.0.35 do MySQL, eu entendi que a consulta agrupamento só vai funcionar se você agrupar todos os campos que forem selecionados, assim: CREATE OR REPLACE VIEW `vw_bal1` AS SELECT `conta`, `descricao` FROM `tbconta` GROUP BY `conta`,`descricao` ORDER BY `conta`
-
Em 2020, eu criei uma consulta no MySQL assim: CREATE VIEW `vw_apuracao_antigo` AS SELECT DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') AS `apuracao` FROM `tbdiario` GROUP BY YEAR(`tbdiario`.`dia`) , MONTH(`tbdiario`.`dia`) ORDER BY DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') DESC Essa consulta também funcionou no servidor compartilhado do Hostinger em 2023. Mas na hora de mudar para o servidor VPS aqui em 2024, recebi a mensagem de que a consulta estava errada. A versão do MySQL no servidor VPS é 8.0.35 e não 8.0.31, ou seja, a nova versão não permite mais usar gambiarra. Entrei em pânico, eu fui logo conversar com o Barder, e ele confirmou que a consulta estava errada mesma. Ele sugeriu consertar, mas o código que ele me passou não fazia o menor sentido. Outra sugestão que ele me deu é de eu entrar no labirinto do Linux e alterar a configuração do MySQL e fazer com que ele aceite gambiarra. O Barder é bacana, mas tem hora que ele me tira do sério. Eu sei que a minha consulta é gambiarra, mas como eu não entendo nada de MySQL, não tive outra escolha senão melhorar a minha gambiarra, assim: CREATE VIEW `vw_apuracao` AS SELECT DATE_FORMAT(`tbdiario`.`dia`, '%Y-%m') AS `apuracao` FROM `tbdiario` GROUP BY `apuracao` ORDER BY `apuracao` DESC A minha nova gambiarra deu certo na versão 8.0.31 bem como na versão 8.0.35 do servidor VPS. Claro, o fato da consulta funcionar em versões diferentes não implica necessariamente que ele esteja certo.
-
Faz um ano que adquiri um domínio na internet: astudy.net, e com ele criei um projeto chamado orçamento, um em PHP e outro em Laravel. Os dois fazem a mesma coisa e usam o mesmo banco de dados. Agora, estou entrando em uma nova aventura. Estou saindo do serviço compartilhado para o serviço VPS. O VPS é bem diferente, usa uma nova gramática chamada "site" e "subdomínio". Eu apanhei bastante, mas consegui montar o mesmo esquema que eu tinha no serviço compartilhado. Ao invés de escrever astudy.net para o php e astudy.net/laravel para o laravel, eu vou escrever php.astudy.net e laravel.astudy.net. O problema é como transferir o dominio astudy.net do serviço compartilhado para o VPS, eu não não achei nenhum tutorial para isso. Pedi ajuda para a equipe técnica, e eles me orientaram a criar um novo registro do tipo A com o nome de @ para o IP do VPS no gerenciador de DNS. Nunca pensei que fosse tão simples mudar o domínio de um serviço compartilhado para o VPS. O problema foi na hora de atualizar a tela. O meu registro desapareceu. Tentei criar o registro de novo, mas ele disse que já existia aquele registro (o único problema é que eu não podia enxergar no painel dos registros do DNS). Seja como for, o VPS tem um novo vocabulário para fazer a mesma coisa. Ele tem um sistema operacional chamado Ubuntu. Só que ele não tem o programa nodejs e o npm. Eu tentei instalar, e não foi fácil. Fiquei tão perdido com as mensagens do Ubuntu que eu tive que destruir todo o servidor VPS pelo menos quatro vezes. Eu apanhei demais para entender o que é SSH User, até que eu tive que aprender na base da surra de que só pode haver um SSH User para cada site. Esses programas são importantes para instalar novos facilitadores no Laravel, eu só trabalhei com o básico, o Eloquent. Com o Ubuntu, eu posso instalar o Breezer, o LiveWire, o Blade, que eu conheci aqui no meu notebook, mas o serviço compartilhado não permitia instalar. O Laravel é fantástico, mas eu não tenho a menor ideia de como ele funciona. Por isso é que eu preciso do PHP, desde o ano passado que estou mudando a linguagem funcional para a linguagem de objetos. Esse é um mundo bacana, claro, quando você consegue fazer as coisas funcionarem.
-
Alguém aqui tem uma hospedagem VPS no Hostinger? [resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Depois de quase uma semana, eu finalmente consegui instalar o Laravel, projeto Chirp. Ele inclui o serviço de autenticação Breezer, alguns comandos adicionais do Blade bem como o CSS Tailwind. Eu optei por usar o Ubuntu com CloudPanel, onde aprendi a criar subdomínio e com ele o site correspondente, depois de instalar o certificado SSL além do auto-assinado. A surpresa é que eu não encontrei o nodejs e nem o npm no Ubuntu, precisei ver vários tutoriais para instalar e atualizar esses programas que são essenciais para turbinar o Laravel. Linux não é fácil, principalmente se você usar o terminal VNC da Hostinger. Como o Laravel não permite criar o projeto com a conta root, eu criei uma conta chamada frank. Para a minha surpresa, eu consegui instalar e atualizar o nodejs e o npm na conta root, mas a conta frank ficou restrito a uma versão anterior que não dava para usar para atualizar o laravel. Assim, eu tive que aprender a como conceder o privilégio de root para a conta frank. Agora que estou mais tranquilo, muito em breve vou transferir o dominio para o novo servidor vps. -
Preciso de ajuda no WinCSP [Resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Não é necessário mudar o Windows para a conta local para usar o WinCSP, e eu só consegui conectá-lo duas vezes no servidor VPS do Hostinger. Já o programa Filizolla não consegui nenhuma vez. O único que deu certo foi o protocolo SSH embutido no VS Code, mas teve uma hora que não consegui conexão porque precisei mexer no servidor. Mas encontrei um tutorial pedindo para limpar o arquivo SSH na pasta temporária do usuário do Windows, e o VS Code voltou a funcionar. O SSH usa os mesmos comandos do Ubuntu, só que ele não é capaz de alertar o sistema. Para isso é preciso usar o terminal VNC disponível no painel do Hostinger. -
Ontem, eu fui conferir a fatura do cartão de crédito e levei um baita susto: R$ 1.057,85. Um dos itens mencionava o aluguel do VPS da Hostinger por dois anos de R$ 719,76. Eu imaginava que ia ser 24 vezes R$ 29,99. Voltei no portal da Hostinger e vi que o idiota fui eu que tenho preguiça de ler o terceiro parágrafo:
-
Estou tendo problemas no CloudPanel do servidor vps do Hostinger, ele não tem a opção de fazer upload de pastas, só de arquivos. Tentei usar o protocolo ftp, mas não consegui fazer a conexão. Pedi ajuda para Hostinger, e eles só me deram um link e o navegador reclamou que aquele link não existe. Tem um outro link que explica que o ftp não funciona porque eu configurei errado. Fiquei desesperado, então eu tentei usar o protocolo SSH, apesar de eu não saber nada de Linux. Com a ajuda do Bard, descobri que 'ls' mostra os arquivos; 'cd' muda de diretório; 'cd ..' muda para o diretório acima, e assim eu consegui chegar no root. Lá eu vi um monte de diretórios nada familiares. Por tentativa e erro, eu fui no diretório home, e lá eu vi um ambiente bem mais familiar, é o que eu consigo enxergar no gerenciador de arquivos do CloudPanel. O problema é na hora de usar o scp, ele não funciona. Usei assim: scp -r C:/wamp64/www/laravel root@vps.astudy.net:/home/astudy-vps/htdocs/vps.astudy.net A minha tese é que o protocolo SSH não tem permissão de ver o Windows. O Bard corroborou a minha tese, e ele disse que eu preciso usar o protocolo SFTP, ele indicou o programa WinCSP. E asim, encontrei um novo problema: ele pede o nome do computador, o nome do usuario, a senha, e ficou assim: GALAXYSBOOKLAPTOP-70TC6THO, porta 22, astudy@hotmail.com,****. A conexão foi recusada. A minha tese é que preciso criar uma conta local no Windows para poder trabalhar com o WinCSP. Alguém pode confirmar, antes de fazer a besteira de mudar o Windows?
-
Alguém aqui tem uma hospedagem VPS no Hostinger? [resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Tentei instalar o certificado de segurança SSL no subdomínio laravel, mas eu não consegui. Eu ainda sou bem novato nessa área, eu não sei o que é "site" e "servidor", o máximo que eu aprendi mais ou menos é o gerenciador de arquivos. Então, eu fui no subdomínio vps (esse é o único que eu consegui instalar o certificado SSL), e eu criei um subdiretório chamado Laravel. Dentro dele, criei o seguinte arquivo arquivo Index.php <?php echo "você está no subdiretório laravel"; Eu fui no navegador e digitei vps.astudy.net/laravel e consegui executar o código. Eu fiquei feliz da vida! Pensei que eu tinha encontrado uma porta de entrada para instalar o laravel no servidor vps do hostinger. A alegria durou bem pouco. Olhando o CloudPanel, eu vi que não existe a opção de fazer a opção de fazer upload de pasta. A única esperança é usar um cliente ftp do notebook. Eu tenho o FileZila, mas ele não conseguiu conectar no ftp:vps.astudy.net com o usuário frank-ftp na porta 21. A outra esperança é o protocolo SSH, o grande problema é que eu não manjo nada de Linux. Enfim, estou espantando com a Hostinger, eu não sei como ela pretende alugar o servidor VPS se o usuário não sabe absolutamente nada de Linux, Servidor, Site, CloudPanel, ftp, ssh, ssl, php, html como é o meu caso. -
Alguém aqui tem uma hospedagem VPS no Hostinger? [resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Hoje de madrugada, um técnico da Hostinger me explicou que não basta ter um certificado de segurança (SSL) auto assinado para o site funcionar. Na base da tentativa e erro, eu consegui instalar o certificado de segurança, depois de ficar algumas horas no editor de DNS, eu apaguei alguns registros que não foram criados por mim do tipo "A", e só deixei o registro do tipo "A" para o meu domínio e o meu subdomínio. O subdomínio foi apontado para o IP do servidor VPS. Criei um site baseado no PHP genérico, e depois de instalar o certificado de segurança, eu consegui acessar o meu subdomínio pelo navegador, e eu vi "olá mundo", o que era esperado, pois o site só tem um index.php. Eu tive alguns problemas na hora de instalar o banco de dados. Eu chamei o banco de dados de "diario", mas o aplicativo do Hostinger chamou de "Diario". Enfim, eu tive que editar o código PHP para conectar no banco de dados com a letra capitalizada. Acredito que o problema é o sistema, o meu notebook é baseado no Windows e o servidor VPS deve trabalhar apenas com o Linux. O estranho é que eu criei ontem o subdomínio laravel no editor de DNS, criei um novo site baseado no Laravel 10, mas não consegui instalar o certificado de segurança (acredito que tenho que esperar 24 horas). Mesmo assim, eu consegui abrir o Laravel usando o novo subdomínio no navegador, fiquei abismado com essa proeza de abrir o projeto laravel que está hospedado em outra plataforma. -
Eu tenho uma collection chamada $tarifa e outra chamada $venda, ambos usam as mesmas datas. O problema é colocar lado a lado, dentro de uma tabela. No PHP, eu uso a chave do array da $tarifa para chamar o valor da $venda. Já o Laravel usa a tecnologia dos collections, e eu não tenho a menor ideia de como trabalhar com isso. Assim, eu apelei para o PHP, a minha única dúvida era saber se o PHP é capaz de trabalhar com as collections do Laravel. O certo é estudar o Laravel, mas esse é um dos casos que é bem mais rápido apelar para o PHP: app > Http > Controllers > DiarioController <?php // lista parcial public function mercado(Request $request){ $dataInicial='2024-01-01'; $dataFinal='2024-01-31'; $tarifas=tbdiario::where('contad',407)->where('hist','like','Mercado%') ->whereBetween('dia',[$dataInicial,$dataFinal])->get(); $venda=tbdiario::where('contac',304)->where('hist','like','Mercado%') ->whereBetween('dia',[$dataInicial,$dataFinal])->get(); $somaTarifa=$tarifas->sum('valor'); $somaVenda=$venda->sum('valor'); return view('mercado',compact('tarifas','venda','somaTarifa','somaVenda'));} resources > views >mercado.blade.php @include('menu') <script>btmenu.innerHTML='Mercado Pago Janeiro 2024'</script> <table class='table table-striped linha'><tr><th>Dia<th class=text-end>Tarifa<th class=text-end>Venda @foreach($tarifas as $key=>$tarifa) @php $valorVenda=$venda->where('dia',$tarifa->dia)->value('valor'); @endphp <tr><td>{{date('d/m/y',strtotime($tarifa->dia))}} <td class=text-end nowrap >{{dec($tarifa->valor)}} <td class=text-end>{{dec($valorVenda)}} @endforeach <tr><th>Total<th class=text-end>{{dec($somaTarifa)}} <th class=text-end>{{dec($somaVenda)}} </table> Pensando um pouco mais, eu decidi trabalhar com a collection como se fosse um array. E a ideia deu certo, não vou precisar do marcador @php no blade: resources>views>mercado.blade.php @include('menu') <script>btmenu.innerHTML='Mercado Pago Janeiro 2024'</script> <table class='table table-striped linha'><tr><th>Dia<th class=text-end>Tarifa<th class=text-end>Venda @foreach($tarifas as $key=>$tarifa) <tr><td>{{date('d/m/y',strtotime($tarifa->dia))}} <td class=text-end nowrap >{{dec($tarifa->valor)}} <td class=text-end>{{dec($venda[$key]->valor)}} @endforeach <tr><th>Total<th class=text-end>{{dec($somaTarifa)}} <th class=text-end>{{dec($somaVenda)}} </table>
-
O meu aluguel com a hospedagem de site vai terminar em 24 de fevereiro de 2024. Hoje eu decidi pegar um servidor VPS no Hostinger. Ainda estou me familiarizando com as novas ferramentas. Para testar o VPS, eu criei um subdominio assim vps.astudy.net e apontei para o IP do VPS; suponho que amanhã o subdomínio vai estar disponível e pegar o index.php que eu inventei na pasta htdoc. Ou eu estou fazendo alguma besteira?
-
O problema do método GET e do método POST no MVC [Resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
É possível usar o método GET para chamar um formulário, e usar o método POST para submeter o formulário. O único problema é atualizar o cabeçalho do navegador, e o único meio é usando o comando action do <form> assim: arquivo Index.php <?php class Teste { public function __construct(){ if(isset($_GET)){ $get=$_GET; switch(key($get)){ case 'get':echo "método get";break;}} if(isset($_POST)){ $post=$_POST; switch(key($post)){ case 'post':echo "método post";break;}}}} $teste=new Teste(); ?> <table> <tr><td><form><input type=submit value=MetodoGet name=get></form> <tr><td><form action="index.php" method=post><input type=submit value=MetodoPost name=post></form> </table> -
Faz uma semana que estou com problema numa classe chamada Pessoa, basicamente ele faz uma lista ou procura alguém. Eu não entendi porque a rotina de procurar não funcionava. Tenho uma outra classe chamada Produto, e ele funciona. Não consegui entender por que a classe Produto funciona e a classe Pessoa não funciona. Fazendo um rascunho, eu descobri o problema: <?php class Teste { public function __construct(){ if(isset($_GET)){ $get=$_GET; switch(key($get)){ case 'get':echo "método get";break;}} if(isset($_POST)){ $post=$_POST; switch(key($post)){ case 'post':echo "método post";break;}}}} $teste=new Teste(); ?> <table> <tr><td><form><input type=submit value=MetodoGet name=get></form> <tr><td><form method=post><input type=submit value=MetodoPost name=post></form> </table> Graças a esse código, eu vi que usei o método post tanto para fazer a listagem inicial dos produtos bem como a procura de um produto. Esse não foi o caso da classe Pessoas, eu usei o método get para fazer a listagem e o método post para procurar alguém. Para corrigir o problema, eu só mudei o método da procura para get, dentro da classe Pessoas, bem como o <form> correspondente.
-
É possível criar objetos literais no php?
pergunta respondeu ao iNosuKe 么 de Frank K Hosaka em Tutoriais & Dicas - PHP
Eu não conhecia o objeto literal no JavaScript, testei e funcionou, menos na hora de interpolar os textos. Hoje eu finalmente descobri como funciona a interpolação. A interpolação no JavaScript só funciona no meu notebook se eu usar aspas craseadas, e a interpolação no PHP só funciona se eu usar aspas duplas, assim: <script> programador = {"nome": "Fábio Akita","linguagem": "Ruby"} alert(`Olá, ${programador.nome}`) </script> <?php $programador=json_decode('{"nome":"Fábio Akita","linguagem":"Ruby"}'); echo "Olá, $programador->nome"; Para calcular o dia da semana em português, a minha sugestão é: <?php $week=['Mon','Thu','Wed','Tue','Fri','Sat','Sun']; $semana=['segunda','terça','quarta','quinta','sexta','sábado','domingo']; echo "hoje é " . $semana[array_search(date("D"),$week)]; -
A melhor forma de controlar um <form> é usando <input required>, a <form> não será submetida se o <input required> não for preenchida. O problema é quando tem um <input type=hidden>. Consultando o Bard, ele sugeriu usar a função preventDefault( ) no JavaScript, só que ele não funcionou. Depois de pesquisar o Google, tive a sorte de encontrar uma dica que funciona: <form onsubmit="return false">. Adaptei no meu código, e ele ficou assim: arquivo ProdutoIncluir.php <?php include VISAO . "/Menu.php"; ?> <script> btmenu.innerHTML='Produto' function verificaCodp(){ if(codp.value==''){ alert('Favor selecionar o fornecedor')} else {frmProd.submit()}} </script> <table class='table table-striped'> <form id=frmProd onsubmit='verificaCodp();return false'> <input type=hidden name=incluir value=incluir> <tr><td>Codigo<td><?=$prod->codprod?><input type=hidden name=codprod value=<?=$prod->codprod?>> <tr><td>Produto<td><?=$prod->prod?><input type=hidden name=prod value=<?=$prod->prod?>> <tr><td>Custo<td><?=$prod->custo?> <tr><td>Margem<td><?=$prod->marg?> <tr><td>Venda<td><?=$prod->custo?> <tr><td>Codigo de Barra<td><?=$prod->codbar?> <tr><td>NCM<td><?=$prod->cf?> <tr><td>Quantidade<td><input name=qt required> <tr><td>CustoTotal<td><input name=custototal required> <tr><td>Lçto<td><?=$lcto?><input type=hidden name=lcto value=<?=$lcto?>> <tr><td>Pessoa<td><a href=ControleDiario.php?pessoa><?=$pessoa?></a> <tr><td><td><input type=submit> <input type=hidden name=codp id=codp value=<?=$codp?>> </form> </table>
-
Ajuda com script codigo de rastreio.
pergunta respondeu ao Rafael Aleprandi Bergamin de Frank K Hosaka em PHP
<?php // ver https://www.correios.com.br/atendimento/developers/apicoleta if(isset($_GET['id'])){ $id=$_GET['id']; echo "<iframe src=http://www.linkcorreios.com.br/?id=$id width=700px height=500px></iframe>";} ?> <form> Rastreando o objeto <input type=submit name=id value="PO117284423BR"> </form> -
Depois de três anos estudando PHP, a primeira reação de quem vê o MVC é entrar em pânico. O PHP é bem abstrato, em três anos só aprendi 2% do que ele é capaz. E agora estou começando a engatinhar no MVC (ou POO PHP), e hoje eu consegui criar dois controladores, cada um cuidando de uma tabela: arquivo Index.php <?php session_start(); class ControladorPessoa { public function __construct(){ if(isset($_GET['proxPessoa'])){$_SESSION['vetorPessoa']++;}} public function consulta(){ $_SESSION['vetorPessoa']=0; $conexao=new Conexao(); return $conexao->consulta("tbpessoa");}} class ControladorProduto { public function __construct(){ if(isset($_GET['proxProd'])){$_SESSION['vetorProduto']++;}} public function consulta(){ $_SESSION['vetorProduto']=0; $conexao=new Conexao(); return $conexao->consulta("tbprod");}} class Conexao { public function consulta($tabela){ $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $stmt=$pdo->query("select * from $tabela"); return $stmt->fetchAll(PDO::FETCH_OBJ);}} $controlePessoa=new ControladorPessoa(); $controleProduto=new ControladorProduto(); if(!isset($_SESSION['pessoas'])){$_SESSION['pessoas']=$controlePessoa->consulta();} if(!isset($_SESSION['produtos'])){$_SESSION['produtos']=$controleProduto->consulta();} $pessoas=$_SESSION['pessoas']; $produtos=$_SESSION['produtos']; $vetorPessoa=$_SESSION['vetorPessoa']; $vetorProduto=$_SESSION['vetorProduto']; require 'Consulta.php'; arquivo Consulta.php <body style=margin-left:400px> <h4>Amostra da tabela Pessoa:</h4> <?=$pessoas[$vetorPessoa]->pessoa?> <form> <input type=submit value="Próxima Pessoa"> <input type=hidden name=proxPessoa value=<?=$vetorPessoa?>> </form> <hr> <h4>Amostra da tabela Produtos:</h4> <?=$produtos[$vetorProduto]->prod?> <form> <input type=submit value="Próximo Produto"> <input type=hidden name=proxProd value=<?=$vetorProduto?>> </form> </body>
-
Ontem eu vi o roteador do meu controlador Diario. Aquilo ficou feio de danar. Não consegui encontrar no Bard e no Google nada que pudesse melhorar a maquiagem do roteador. Hoje eu acordei com a ideia de esconder o roteador dentro da classe. O problema é como fazer a classe enxergar as solicitações do navegador. A minha solução foi esconder o roteador dentro da função __construct(). O meu teste deu certo: arquivo Index.php <?php class Controlador { private $mensagem; public function __construct(){ if(isset($_GET)){ $roteadorGet=$_GET; switch(key($roteadorGet)){ case 'escrever': $this->mensagem="olá mundo"; break; case 'apagar': $this->mensagem="";break;} $mensagem=$this->mensagem; require 'Teste.php';}}} $controlador=new Controlador(); ?> arquivo Teste.php <form> <table> <tr><td><input type=submit name=escrever value=Escrever> <tr><td><input type=submit name=apagar value=Apagar> </table> </form> <div><?=$mensagem?></div>
-
views é um recurso bem avançado do MySQL, eu consegui montar alguns em 2020, hoje eu não faço a menor ideia de como montar um view no MySQL. Em 2023, eu hospedei o meu banco de dados no Hostinger, só que as views não funcionaram. Então, eu usei o MySQL Workbench do meu notebook, e copiei a estrutura da view, mas eu tive que eliminar as linhas entre a palavra CREATE e VIEW, para criar a view no Hostinger. Ou seja, a view do Hostinger não é a mesma view que eu tenho no notebook. Para atualizar o meu banco de dados no notebook, eu peço para o Hostinger fazer a exportação mas sem os views. Hoje, no entanto, eu cochilei e esqueci de desmarcar as views na hora de exportar. Na hora que importei, o banco de dados do meu notebook ficou inoperante. Para torná-lo operante, eu precisei eliminar todas as views que foram importadas. O problema é que o Hostinger não trabalha com MySQL Workbench e sim o phpMyAdmin, e consultei o Google como ver a estrutura de um view no phpMyAdmin, mas eu só consegui a parte inicial da estrutura. Eu precisava da estrutura inteira. Tentei prosseguir com a pesquisa, mas a minha conexão com a internet caiu. Então, eu lembrei do VS Code e pedi para ele abrir o arquivo que havia importado do Hostinger, e encontrei a estrutura das views. Tudo o que eu precisava fazer é eliminar as instruções entre as palavras CREATE e VIEW. Pedi para o MySQL importar novamente, e agora deu tudo certo. Ao invés de criar um view, eu uso o PHP que é muito mais fácil de entender. A gramática do PHP é menos abstrata que a gramática MySQL. Em compensação, um view pode poupar centenas de códigos do PHP.
-
Eu levei cinco horas para montar o código a seguir. Eu recebi várias mensagens de erro, muitos eram familiares mas não sabia do que se tratava. O mais enigmático é que eu não podia usar a variável $_SESSION junto com o motor de banco de dados. Depois de várias tentativas e erros, acabei descobrindo que todos os erros eram gramaticais, usei o recurso do PHP aonde não devia. O grande problema do MVC é criar um controlador para cada tabela do banco de dados. Isso não é fácil, principalmente quando eu preciso de uma informação numa tabela que está disponível em outra tabela. Para criar uma ponte entre os controladores, eu usei a variável $_SESSION, assim: <?php session_start(); class Produto { public function incluir() { $lcto=$_SESSION['lcto']; $codprod=1;$qt=1;$subtotal=1; $pdo=new PDO("mysql:host=localhost;dbname=laravel","root",""); $pdo->query("insert into tbhistprod (lcto,codprod,qt,subtotal) values ($lcto,$codprod,$qt,$subtotal)");}} class Diario { public function incluir() { $contad=123;$contac=121;$valor=10;$historico='Compra de um repolho na quitanda'; $pdo=new PDO("mysql:host=localhost;dbname=laravel","root",""); $pdo->query("insert into tbdiario (contad,contac,valor,historico) values ($contad,$contac,$valor,'$historico')"); $_SESSION['lcto']=$pdo->lastInsertId(); $produto=new Produto(); $produto->incluir();}} $diario=new Diario(); $diario->incluir(); Olhando o código, o mais sensato era colocar o número do lançamento como parâmetro da função e não como variável global $_SESSION. O problema são os formulários, um vai pegar as contas, o outro vai pegar os produtos, e depois de várias submissões, tudo o que estava no caminho se perde no Vale das Sombras. Outra coisa bacana que aprendi com o MVC é a barra de endereço do navegador. Lá aparece o nome do controlador. No caso de uma submissão de um formulário, o PHP vai carregar o controlador que estiver na barra de endereço, assim decidi não usar a propriedade action do <form>, mas sim preparar o controlador para receber a submissão.
-
Estava pensando em utilizar a variável $_SESSION no meu projeto MVC Orçamento. Para saber como ele funciona, eu criei esse código Index.php na pasta Astudy: <meta name="viewport" content="width-device-width, initial-scale=1.0"> <?php session_start(); if(isset($_SESSION['time'])){ echo "O melhor time do mundo é o " . $_SESSION['time'];} if(isset($_GET['time'])){ $_SESSION['time']=$_GET['time']; header("location:Index.php");} ?> <body style='margin:0 auto'> <p>Qual o melhor time de todo o universo?</p> <form> <p><a href="?time=São Paulo">São Paulo</a><p> <p><a href="?time=Palmeiras">Palmeiras</a><p> <p><a href="?time=Corinthians">Corinthians</a> </form> Para testar esse programa, usei o meu notebook, colocando no navegador: localhost/astudy, e escolhi São Paulo. No celular, eu digitei 192.168.0.10/astudy. Apesar do programa ser o mesmo, a escolha que eu faço no notebook não afeta a escolha do celular e vice versa. Ou seja, a variável $_SESSION é global mas ele está vinculado a cada usuário e não ao código. Assim, eu posso usar a variável $_SESSION sem me preocupar com a escolha de outros usuários. Esse é um recurso bacana, mas ele não funciona para o banco de dados. O PHP não inventa um banco de dados para cada usuário. Nesse caso, eu preciso estudar muito para evitar que dois ou mais usuários tentem editar o mesmo registro ao mesmo tempo, eu ainda não tenho a menor ideia de como fazer isso.
-
consulta na tabela que me retorna registros duplicados
pergunta respondeu ao LIGNT de Frank K Hosaka em PHP
Por outro lado, se você persiste em trabalhar com cinco campos numéricos, a minha sugestão é a mesma, o de usar o recurso do array do PHP para calcular a frequências dos números envolvidos: <?php function frequencia($frequencia,$elemento){ $style="style=text-align:right"; if($frequencia[$elemento]==2){$style="style=text-align:right;color:green";} if($frequencia[$elemento]==3){$style="style=text-align:right;color:red";} echo "<td $style>$elemento |";} $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $stmt=$pdo->query("drop table if exists vetores"); $stmt=$pdo->query("create table vetores (id int not null auto_increment, re1 int default null, re2 int default null, re3 int default null, re4 int default null, re5 int default null, primary key(id)) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_0900_ai_ci"); $arrays=[[123,122,121,111,132],[122,22,221,211,232],[12,13,132,11,15],[123,32,33,36,123]]; foreach($arrays as $array){ $re1=$array[0]; $re2=$array[1]; $re3=$array[2]; $re4=$array[3]; $re5=$array[4]; $pdo->query("insert into vetores (re1,re2,re3,re4,re5) values ($re1,$re2,$re3,$re4,$re5)");} $stmt=$pdo->query("select * from vetores"); $todos=$stmt->fetchAll(PDO::FETCH_OBJ); $umVetor=[]; foreach($todos as $cada){ $umVetor=array_merge($umVetor,[$cada->re1,$cada->re2,$cada->re3,$cada->re4,$cada->re5]);} $frequencia=array_count_values($umVetor); ?> <table style=margin-left:400px><th>id |<th>re1 |<th>re2 |<th>re3 |<th>re4 |<th>re5 | <?php foreach($todos as $cada): ?> <tr><td style=text-align:right><?=$cada->id?> | <?php frequencia($frequencia,$cada->re1); frequencia($frequencia,$cada->re2); frequencia($frequencia,$cada->re3); frequencia($frequencia,$cada->re4); frequencia($frequencia,$cada->re5); endforeach;