
Frank K Hosaka
Membros-
Total de itens
1.622 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Não consigo usar o Tailwinds nas tabelas
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
O meu projeto Orçamento usa o PHP, a Classe e o Laravel, os três usam o mesmo banco de dados e fazem a mesma coisa. A minha ideia é tentar igualar o código nos três, o máximo que eu puder. Estou muito contente ter aprendido alguma coisa de classe em 2024. Em 2022 eu comecei a estudar o Laravel, mas eu não aprendi nada sobre classe. A seguir estudei o MVC, mas os tutoriais são de amargar. Só em 2024 é que comecei a entender o que é autoload e o que é roteador. A classe é a melhor forma de organizar as funções. O meu desafio é usar a classe no PHP sem o autoload e sem o roteador. Outro desafio é o roteador do Laravel. O roteador que eu tenho na Classe é bem safado, jamais vai chegar aos pés do Laravel. Mas nada me impede de fazer o Laravel usar a mesma sintaxe que eu uso no roteador da Classe. Enfim, são apenas ideias. Outro desafio é entender porque o Tailwinds não se dá bem com a <table>. -
Não consigo usar o Tailwinds nas tabelas
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Finalmente decidi atualizar o Laravel que uso no Hostinger, primeiro precisei destruir todo o site. Pedi para a Hostinger instalar o Laravel 11, mas ele não instalou coisa alguma. Eu fiz a instalação através do terminal SSH, ele acabou criando uma pasta chamada Laravel. Peguei todo o conteúdo da pasta Laravel e joguei no diretório raiz. Isso não deu certo. Então eu fui no site onde tenho o projeto Chirp, e de lá copiei a pasta Public. Consegui colocar o Laravel no navegador. A seguir instalei o Breeze com Blade. Copiei o meu projeto que tenho no micro bem como alterei vários arquivos tipo .env, composer.json (para carregar o arquivo Helpers.php), web.php, AppServiceProvider.php, Config/app.php (para definir o horário). Agora o Laravel dá suporte para o Tailwinds bem como o Bootstrap. Como eu não sei fazer o Tailwinds trabalhar com o marcador <table>, o melhor jeito é continuar trabalhando com o suporte do CDN Bootstrap (eu uso app.php no diretório raiz da pasta Views), o app.php com o Tailwinds está em outra pasta, e só dá para usá-lo se você usar o marcador blade <x-app-layout>. Todas essas modificações dá para fazer no Hostinger se você pegar o plano VPS. -
arquivo resources > views > teste.blade.php <x-app-layout> <table> <tr><td class='ml-4 bg-blue-500 p-4'>Coluna A</td> <td class='ml-4 bg-greeen-500'>Coluna B</td></tr> </table> <br> <div class='flex'> <div class='ml-4 bg-blue-500 p-4'>Coluna A</div> <div class='ml-4 bg-green-500 p-4'>Coluna B</div> </div> </x-app-layout>
-
Ontem, choveu um pouco em Diadema, mas isso foi o suficiente para eu perder o WiFi que vinha do roteador da Claro. Mesmo assim, eu estava estudando o Laravel Blade. Fui no terminal, e usei o comando "php artisan serve". Em seguida, abri outro terminal e usei o comando "npm run dev". Abri o navegador, e ele me informou que eu não tinha nenhuma conexão. Eu digitei "localhost:8000", e assim consegui testar o meu projeto. Isso é uma boa noticia, o WampServ funciona, mesmo que o roteador da Claro tenha pifado!
-
Lamentavelmente, isso daí não é nada óbvio. Estou tentanto estudar a linguagem orientada a objetos desde 2020, mas eu só consegui engatinhar em 2024 com a ajuda do autoload para o PHP 8.2 que o iOwys publicou no fórum Script. O autoload explica para o PHP aonde estão as classes. Mas não basta o PHP saber onde estão as classes, ele precisa saber como chegar até a classe, assim ele precisa do roteador. Na internet tem um monte de roteadores prontos para você baixar pelo comando composer, mas ao invés disso eu ofereço um roteador meia-boca para você ver a cara dele, e estudar como ele funciona. Classe é um conceito muito antigo, mas para fazer funcionar, só nesse ano é que eu consegui alguma coisa. arquivo config.php <?php ini_set('display_errors', 1); date_default_timezone_set('America/Sao_Paulo'); spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); function view($arquivo, $array = null) { if (!is_null($array)){ foreach ($array as $var => $value) { ${$var} = $value; } } ob_start(); include $arquivo . ".php"; ob_flush(); } arquivo index.php <?php require 'config.php'; $rota='Provas_inicio'; if($_GET) { if(strpos(key($_GET),"_")==0) { exit; } $rota=isset($_GET) ? key($_GET) : $rota; } $segmentos=explode('_',$rota); $nomeControle=$segmentos[0] ?? 'Provas'; $metodo=$segmentos[1] ?? 'inicio'; $parametro=$segmentos[2] ?? null; $controle=new $nomeControle(); $controle->$metodo($parametro); arquivo provas.php <?php // mysql.teste.provas(id,questao) // (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'), // (2,'O Brasil tem futuro?,Sim,Não,Talvez') // (3, 'Quanto é 1+1?,1,2,3,4,5') // (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5') class Provas { private $Conexao; function __construct() { $this->Conexao=new mysqli("localhost","root","","teste"); } function imprimir() { $vetor=explode(",",$_POST['questoes']); echo "Prova 1<br>"; $numeroQuestao=0; foreach($vetor as $v) { $prova=$this->selecionar($v); $vetores=explode(',',$prova['questao']); $questao=array_shift($vetores); $numeroQuestao++; $this->imprimirQuestao($questao,$numeroQuestao); $indicador=0; foreach($vetores as $alternativa) { $indicador++; echo chr($indicador+64) . ". " . $alternativa . "<br>"; } } echo "<br>--------- picote aqui----<br>"; echo "<br>Prova 2<br>"; shuffle($vetor); $numeroQuestao=0; foreach($vetor as $v) { $prova=$this->selecionar($v); $vetores=explode(',',$prova['questao']); $questao=array_shift($vetores); $numeroQuestao++; $this->imprimirQuestao($questao,$numeroQuestao); shuffle($vetores); $indicador=64; foreach($vetores as $alternativa) { $indicador++; echo chr($indicador) . ". " . $alternativa . "<br>"; } } } function imprimirQuestao($questao,$numeroQuestao) { echo "<br>"; echo $numeroQuestao . ". " . $questao . "<br>"; } function inicio() { view('provasView'); } function selecionar($id) { return $this->Conexao->query("select * from provas where id=$id") ->fetch_assoc(); } } arquivo provasView.php <form method=post action=?Provas.imprimir> Quais são as questões selecionadas? <br> <input name=questoes placeholder="exemplo: digite 4,3"> <br> <input type=submit> </form>
-
Você não pode usar espaço entre a classe e o método: o correto é <?php use PHPUnit\Framework\TestCase; class ExceptionTest extends TestCase { public function testCreateException() { $throwable = new Exception('Test exception', 123); $exception = new Exception( $throwable->getMessage(), $throwable->getCode(), $throwable ); $this->assertEquals('Test exception', $exception->getMessage()); $this->assertEquals(123, $exception->getCode()); $this->assertSame($throwable, $exception->getPrevious()); } }
-
Há cinco anos, eu imaginava que precisava de um marcador para executar um comando JavaScript. O meu conhecimento em HTML era e ainda é bem precário, mas improvisei assim: <tr><td><a href data-bs-dismiss='modal' onclick=voltar(this.innerHTML)> {{$row->conta." ".$row->descricao}}</a> Eu também não sabia nada de CSS, assim eu apelei para o Bootstrap. E tudo foi uma maravilha nos últimos cinco anos. Hoje, no entanto, estou estudando o Laravel, o tutorial do Chirper com Blade. O Laravel Blade trabalha com o CSS da Tailwinds. Ao invés de pesquisar como funciona o modal no Tailwinds, eu simplesmente tirei um monte de <div> que o Bootstrap trabalhava bem como as suas classes. E tudo funcionou quase perfeitamente, o problema é que eu selecionava a conta, os dados eram passados no formulário principal, mas tudo era apagado porque o navegador foi atualizado. Depois de muito investigar, percebi que era o <a href> é que atualizava a tela, o Bootstrap é que dava um jeito de neutralizá-lo. Para corrigir o problema, eu só precisei eliminar o marcador <a href>. Quanto ao comando JavaScript, eu coloquei no marcador <td>. No Tailwinds, eu aprendi como diminuir o espaço entre as linhas através da classe 'leading-tight'. Para exibir ou ocultar a <div> onde montei o plano de contas, eu usei o CSS puro: Ah, o Tailwinds tem uma classe bacana que faz a caixa do input ficar redondo e que muda a cor assim que você foca nela, ele é enorme, eu decidi jogar no arquivo .env com o identificador input, e para usar no arquivo blade, eu chamo a classe com o marcador <?=env('input')?> .env input="class='ml-4 px-3 py-1 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500'" resources > views > diarioLcto.blade.php <x-app-layout> <script> document.title='<?=$btMenu?>' var idControle,Descricao function ir(controle,destino) { idControle=controle Descricao=destino plano.style.display="block" } function voltar(texto) { controle=document.getElementById(idControle) destino=document.getElementById(Descricao) controle.value=texto.substr(0,3) tamanho=texto.strlen destino.innerHTML=texto.substr(4,tamanho) plano.style.display='none' } </script> <div id=plano style="display:none" class="w-[500px] mx-auto fixed right-60"> <table class="leading-tight"> <?php foreach($ativo as $key=>$row): ?> <tr><td onclick=voltar(this.innerHTML)><?=$row->conta." ".$row->descricao?> <?php if($key<$contaPassivo): ?> <td onclick=voltar(this.innerHTML)><?=$passivo[$key]->conta." ".$passivo[$key]->descricao?></a> <?php else: ?> <td> <?php endif; ?> <?php endforeach; ?> </table> </div> <table class='w-[500px] mx-auto mt-2 leading-tight'> <?php if(count($produtos)): ?> <tr class=fw-semibold><td class=text-right>Cod<td>Produto <td class=text-end>Qt<td>Un<td class=text-right>Total <?php foreach($produtos as $prod): ?> <tr> <td class=text-end><a href="produtoAlterar?id=<?=$prod->id?>"><?=$prod->codprod?></a> <td nowrap><?=$prod->prod?> <td class=text-right><?=virgula($prod->qt)?> <td><a href="produtoExcluir?id=<?=$prod->id?>"><?=$prod->un?></a> <td class=text-right><?=dec($prod->custototal)?> <?php endforeach ?> <tr class='fw-semibold'><td><?=date('d/m/y',strtotime($produtos[0]->dia))?> <td colspan=3> <form method=post action="diarioProduto"> <input type=submit name=produto value='Produto' class=mr-10> <?php if($somaProdutos!==0):?> <a href=diarioPessoa><?=$produtos[0]->pessoa?></a> <td class=text-right><?=dec($somaProdutos)?> </form> <?php else: ?> <tr><td><td><td><td> <?php endif; ?> <?php else: ?> <?php if($btMenu!=="Novo Lançamento"): ?> <tr><td> <form method=post action="diarioProduto"> <input type=submit name=produto value='Produto'> </form> <?php endif; ?> <?php endif; ?> <form action='<?=$comando?>' method=post> <?php if($btMenu=="Edita Lançamento"): ?> <tr><td colspan=5> <a href="diarioAcrescentar&lcto=<?=$consulta->lcto?>"> Acrescentar no lançamento <?=$consulta->lcto?></a> <?php endif;?> <tr><td>Dia<td> <input <?=env('input')?> type=date name=lcto[] size=2 value='<?=$consulta->dia?>' autocomplete=off> <tr><td>Lcto<td colspan=4> <input <?=env('input')?> type=button name=lcto[] size=4 value='<?=$consulta->lcto?>'> <tr><td>ContaD<td colspan=4> <input <?=env('input')?> id='ContaD' name=lcto[] onclick="ir(this.id,'DescD')" size=2 value='<?=$consulta->contad?>' autocomplete=off> <a id=DescD></a> <tr><td>ContaC<td colspan=4> <input <?=env('input')?> id='ContaC' name=lcto[] onclick="ir(this.id,'DescC')" size=2 value='<?=$consulta->contac?>' autocomplete=off> <a id=DescC></a> <tr><td>Valor<td colspan=4> <input <?=env('input')?> name=lcto[] value='<?=dec($consulta->valor)?>' autocomplete=off size=6> <tr><td>Histórico<td colspan=4> <input <?=env('input')?> name=lcto[] value="<?=$consulta->hist?>" autocomplete=off size=49> <input type=hidden name=lcto[] value=<?=$consulta->docto?>> <tr><td><td><input <?=env('input')?> type=submit value=Confirmar><td><td><td> </form> </table> </x-app-layout>
-
Eu não sei mexer no Linux. Tentei mexer em 1997, mas me perdi bastante. Eu tive que esperar até 2020 até encontrar o WampServ para o Windows.
-
Eu uso o WampServ, e na bandeja do Windows tem um ícone verde, clicando nele tenho PHP > PHP Extensions > ative pgsql. O código que eu encontrei com o copilot.microsoft.com é assim: <?php // Defina os parâmetros de conexão $host = "localhost"; $port = "5432"; $dbname = "seu_banco_de_dados"; $user = "seu_usuario"; $password = "sua_senha"; // Crie a string de conexão $conn_string = "host=$host port=$port dbname=$dbname user=$user password=$password"; // Tente estabelecer a conexão $dbconn = pg_connect($conn_string); // Verifique se a conexão foi bem-sucedida if ($dbconn) { echo "Conexão bem-sucedida!"; } else { echo "Erro ao conectar ao banco de dados."; } ?> Espero que isso lhe ajude.
-
O CSS do Bootstrap é assim: <input class='control'> O CSS do Tailwinds é assim: <input class=class='px-3 py-1 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500'> Agora, imagina que você tem um formulário com seis inputs! A minha sorte é que o Laravel suporta o PHP, inclusive o marcador <?= ?> (o equivalente no Blade é {{ }}, mas no meu caso não funcionou), e assim consegui contornar o problema: resources > views > diarioEdita.blade.php <x-app-layout> @php $class="class='px-3 py-1 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500'"; @endphp <form method=post action='diarioEditado' class='w-[500px] mx-auto'> <table> <tr><td><input name=docto type=hidden value={{ $lcto->docto }}> Lçto<td><input name=lcto value='{{ $lcto->lcto }}' <?=$class?> > <tr><td>Dia<td><input name=dia type=date value={{ $lcto->dia }} <?=$class?>> <tr><td>ContaD<td><input name=contad value={{ $lcto->contad }} <?=$class?>> <tr><td>ContaC<td><input name=contac value={{ $lcto->contac }} <?=$class?>> <tr><td>Valor<td><input name=valor value={{ $lcto->valor }} <?=$class?>> <tr><td>Histórico<td><input name=hist value='{{ $lcto->hist }}' <?=$class?>> </table> </x-app-layout>
-
Breeze é um acessório que turbina o Laravel com a rotina de login e também instala a engenharia do CSS Tailwinds. Ele aparece no tutorial do Chirper versão Blade, Livewire e Inertia. Através do migrate, o Breeze cria no banco de dados a tabela user. O problema é que eu sou do tempo do Microsoft Access, onde aprendi a dar o nome da tabela assim: tbusuarios, com o nome dos campos diferentes do user do Breeze. Para fazer a minha tbusuarios funcionar no Laravel com Breeze tive que alterar o model assim: app > Models > User.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; protected $table = 'tbusuarios'; protected $fillable = ['nome','email','senha']; protected $hidden = ['senha','remember_token']; protected function casts(): array { return ['email_verified_at' => 'datetime', 'senha' => 'hashed','nome'=>'string']; } function getAuthPassword() { return $this->senha; } function getAuthPasswordName() { return 'senha'; } } A rotina de login do Breeze permite deletar a conta e também alterar os dados da conta, só que eu não consegui alterar o nome do usuário. Seguindo o bom exemplo daquele candidato que deu uma cadeirada no adversário que repetia desaforos a todo momento, eu fiz a mesma coisa: app > Http > Controllers > ProfileController.php <?php namespace App\Http\Controllers; use App\Http\Requests\ProfileUpdateRequest; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redirect; use Illuminate\View\View; class ProfileController extends Controller { //... function update(ProfileUpdateRequest $request) { $validated['nome']=$request->name; $validated['email']=$request->email; $request->user()->fill($validated); if ($request->user()->isDirty('email')) { $request->user()->email_verified_at = null; } $request->user()->save(); return Redirect::route('profile.edit')->with('status', 'profile-updated'); } }
-
Hahahahaha... agora, eu entendi. Você não confia nos alunos: <?php // mysql.teste.provas(id,questao) // (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'), // (2,'O Brasil tem futuro?,Sim,Não,Talvez') // (3, 'Quanto é 1+1?,1,2,3,4,5') // (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5') class Provas { private $Conexao; function __construct() { $this->Conexao=new mysqli("localhost","root","","teste"); } function imprimir($vetor) { echo "Prova 1<br>"; $numeroQuestao=0; foreach($vetor as $v) { $prova=$this->selecionar($v); $vetores=explode(',',$prova['questao']); $questao=array_shift($vetores); $numeroQuestao++; $this->imprimirQuestao($questao,$numeroQuestao); $indicador=0; foreach($vetores as $alternativa) { $indicador++; echo chr($indicador+64) . ". " . $alternativa . "<br>"; } } echo "<br>--------- picote aqui----<br>"; echo "<br>Prova 2<br>"; shuffle($vetor); $numeroQuestao=0; foreach($vetor as $v) { $prova=$this->selecionar($v); $vetores=explode(',',$prova['questao']); $questao=array_shift($vetores); $numeroQuestao++; $this->imprimirQuestao($questao,$numeroQuestao); shuffle($vetores); $indicador=64; foreach($vetores as $alternativa) { $indicador++; echo chr($indicador) . ". " . $alternativa . "<br>"; } } } function imprimirQuestao($questao,$numeroQuestao) { echo "<br>"; echo $numeroQuestao . ". " . $questao . "<br>"; } function selecionar($id) { return $this->Conexao->query("select * from provas where id=$id") ->fetch_assoc(); } } (new Provas)->imprimir([4,3]);
-
Lá em 2020, gastei quase um mês para montar uma consulta no MySQL para obter todos os documentos da tabela diário que envolviam as contas 130 e 211, eles estavam espalhados nos campos ctad e ctac. Aqui em 2024 enfrentei problema no Laravel. Ao invés de consultar a internet, achei melhor montar várias consultas simples, e depois pedi para o PHP fazer o resto do serviço. Ficou bem mais fácil, o MySQL é um poderoso banco de dados, mas ao invés de pedir serviços complicados para ele, melhor jogar nas costas do PHP! <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbcontacorrente; use App\Models\tbdiario; use App\Models\tbpessoa; class Pagar { function inicio() { $pendencias=tbcontacorrente::pluck('docto'); $doc1=tbdiario::where('dia','>','2023-12-31')->where('contad',130)->pluck('docto'); $doc2=tbdiario::where('dia','>','2023-12-31')->where('contac',130)->pluck('docto'); $doc3=tbdiario::where('dia','>','2023-12-31')->where('contad',211)->pluck('docto'); $doc4=tbdiario::where('dia','>','2023-12-31')->where('contac',211)->pluck('docto'); $documentos=$doc1->merge($doc2)->merge($doc3)->merge($doc4); $diferenca=$documentos->diff($pendencias); foreach($diferenca as $d) { $lcto=tbdiario::where('docto',$d)->value('lcto'); tbcontacorrente::create(['docto'=>$d,'lcto'=>$lcto,'pgto'=>0]); } $pendencias=[]; $contas=tbcontacorrente::where('pgto',0)->orderBy('vcto')->get(); foreach($contas as $conta) { $doc=tbdiario::where('docto',$conta->docto)->first(); $vcto=$conta->vcto; $docto=$conta->docto; $lcto=$doc->lcto; if($doc->contad==130 || $doc->contad==211) { $debito=$doc->valor; $credito=null; } else { $debito=null; $credito=$doc->valor; } $hist=dbr($doc->dia)." ".$doc->hist; if($conta->codp) { $pessoa=tbpessoa::where('codp',$conta->codp)->value('pessoa'); } else { $pessoa="Selecionar"; } $pendencias[]=['vcto'=>$vcto,'docto'=>$docto,'lcto'=>$lcto,'debito'=>$debito, 'credito'=>$credito,'hist'=>$hist,'pessoa'=>$pessoa]; } $pendencias=json_decode(json_encode($pendencias)); return view('pagarView',['pendencias'=>$pendencias]); } // ... }
-
<?php // mysql.teste.provas(id,questao) // (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'), // (2,'O Brasil tem futuro?,Sim,Não,Talvez') // (3, 'Quanto é 1+1?,1,2,3,4,5') // (4, 'Quanto é o logaritimo de 10 na base 10?,1,2,3,4,5') class Provas { private $Conexao; function __construct() { $this->Conexao=new mysqli("localhost","root","","teste"); } function selecionar($id) { return $this->Conexao->query("select * from provas where id=$id") ->fetch_assoc(); } function imprimir($vetor) { $q=0; foreach($vetor as $v) { $prova=$this->selecionar($v); $vetores=explode(',',$prova['questao']); foreach($vetores as $chave => $vetor) { if($chave==0) { echo "<br>"; $q++; echo $q . ". " . $vetor . "<br>"; } else { echo chr($chave+64) . ". " . $vetor . "<br>"; } } } } } (new Provas)->imprimir([4,3]);
-
6 segundos é o tempo que o PHP gasta para montar um balancete. Eu acho isso bem rápido. O problema é que eu tenho a mesma rotina no Laravel, mas ele gastou 18 segundos. Isso é um absurdo! Fiquei imaginando se o Eloquent é bem mais lento que o msqli ou o PDO. Para fazer auditoria, eu coloquei os seguinte comandos na function balancete( ) <?php function balancete() { $tempo1=microtime(true); // ... $tempo2=microtime(true); var_dump($tempo2-$tempo1);exit; (no Laravel: dd($tempo2-tempo1); ) } Os dois levaram 3 segundos, ou seja, o Eloquent é tão bom quanto o mysqli ou o PDO. Ou seja, o problema estava na renderização, e assim eu encontrei o probema no Laravel: <?php function inicio (Request $request) { $balancete=$this->balancete()->balancete; $apuracao=$this->balancete()->apuracao; $anterior=$this->balancete()->anterior; $receita=$this->balancete()->receita; $despesa=$this->balancete()->despesa; $resultado=$this->balancete()->resultado; $nota=$this->balancete()->nota; return view('balanceteView',['balancete'=>$balancete, 'apuracao'=>$apuracao,'anterior'=>$anterior,'despesa'=>$despesa, 'receita'=>$receita,'resultado'=>$resultado,'nota'=>$nota]); } Esse é um erro bem besta. Aqui eu pedi para o Laravel executar a função balancete( ) sete vezes, quando o correto é apenas uma vez assim: <?php function inicio (Request $request) { $previa=$this->balancete(); $balancete=$previa->balancete; $apuracao=$previa->apuracao; $anterior=$previa->anterior; $receita=$previa->receita; $despesa=$previa->despesa; $resultado=$previa->resultado; $nota=$previa->nota; return view('balanceteView',['balancete'=>$balancete, 'apuracao'=>$apuracao,'anterior'=>$anterior,'despesa'=>$despesa, 'receita'=>$receita,'resultado'=>$resultado,'nota'=>$nota]); } Moral da história: se um programa está lento demais, provavelmente o problema é aquela pecinha que fica na frente do monitor.
-
<?php // mysql.teste.provas(id,questao) // (1,'Quem descobriu o Brasil?,Pedro,João,Maria,Nenhuma das anteriores'), // (2,'O Brasil tem futuro?,Sim,Não,Talvez') class Provas { function listar($id) { $conexao=new mysqli("localhost","root","","teste"); return $conexao->query("select * from provas where id=$id")->fetch_assoc(); } } for($q=1;$q<=2;$q++) { $prova=(new Provas)->listar($q); $vetores=explode(',',$prova['questao']); foreach($vetores as $chave => $vetor) { if($chave==0) { echo "<br>"; echo $q . ". " . $vetor . "<br>"; } else { echo chr($chave+64) . ". " . $vetor . "<br>"; } } }
-
No meu projeto original eu criei duas tabelas, uma resumia a venda por mês e outra por dia. Quando o usuário selecionava uma data, a tabela exibia as vendas por hora daquele dia. O problema é que o usuário precisava rolar a página para ver os detalhes por hora. Ontem eu decidi tirar os detalhes das horas de dentro da tabela por dia, e colocar numa <div> por cima das outras duas tabelas (o blade usa a sintaxe {{ }} e @função, mas eu usei <?php ?>, para compartilhar os mesmos códigos entre o Laravel e o PHP): app > Http > Controllers > Venda.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\tbpedido; class Venda { function inicio(Request $request) { $detalhes=[]; if($request->detalhe) { $detalhes=tbpedido::wheredate('horavenda',$request->detalhe) ->orderBy('horavenda','desc')->get(); } if(!session()->has('apuracao')) { session(['apuracao'=>date('Y-m-01')]); } $primeiroDia=apuracao(session('apuracao'))->primeiroDia; $ultimoDia=apuracao(session('apuracao'))->ultimoDia; $grupos=DB::table('tbpedido') ->selectRaw('DATE(horavenda) as ddia, SUM(total) as ttotal') ->whereBetween(DB::raw('DATE(horavenda)'), [$primeiroDia, $ultimoDia]) ->whereNotNull('horavenda') ->groupBy('ddia') ->orderBy('ddia', 'desc') ->get(); $vendaMensal=DB::table('tbpedido') ->selectRaw('DATE_FORMAT(horavenda, "%Y-%m") as mes, SUM(total) as total') ->whereNotNull('horavenda') ->groupBy('mes') ->orderBy('mes', 'desc') ->get(); return view('vendaView',['grupos'=>$grupos, 'vendaMensal'=>$vendaMensal,'detalhes'=>$detalhes,'detalhe'=>$request->detalhe]); } function apuracao(Request $request) { $detalhe=$request->apuracao."-01"; session(['apuracao'=>$detalhe]); return $this->inicio(new Request(['detalhe'=>null])); } } resources > views > vendaView.blade.php @include('menuView') <script> document.title="Relatório Venda" btmenu.innerHTML="Relatório Venda" </script> <?php if(count($detalhes)): ?> <div class="position-absolute top-10 start-50 translate-middle-x bg-dark text-white" onclick="this.style.display='none'"> <table class="table table-striped linha border"> Detalhe por hora <tr class=fw-semibold><td><?=dbr($detalhes[0]->dia)?><td>Pedido<td>Bling<td>Total<td>dinheiro<td>troco<td>cartão<td>pix <?php foreach($detalhes as $grupo): ?> <tr> <td class=text-end><?=date('H:i',strtotime($grupo->horavenda))?> <td class=text-end><?=$grupo->ped?> <td class=text-end><?=$grupo->bling?> <td class=text-end><?=dec($grupo->total)?> <td class=text-end> <?php if(abs($grupo->dinheiro)>0): ?> <?=dec($grupo->dinheiro)?> <?php endif; ?> <td class=text-end> <?php if(abs($grupo->troco)>0): ?> <?=dec($grupo->troco)?> <?php endif; ?> <td class=text-center> <?php if($grupo->cartao==1): ?> x <?php endif; ?> <td class=text-center> <?php if($grupo->pix==1): ?> x <?php endif; ?> <?php endforeach; ?> </table> </div> </div> <?php endif; ?> <table class='table table-striped linha w-25' style=float:left> <tr><td colspan=2>Detalhe por mês <?php foreach($vendaMensal as $venda): ?> <tr><td><a href="vendaApuracao?apuracao=<?=$venda->mes?>"><?=$venda->mes?></a> => R$ <td class='text-danger text-end'> <?=dec($venda->total)?> <?php endforeach; ?> </table> <table class='table table-striped linha w-25' style=float:right> <tr><td colspan=2>Detalhe por dia <tr class=fw-semibold><td>Dia<td class=text-end>Total <?php foreach($grupos as $grupo): ?> <tr> <td><a href="vendaInicio?detalhe=<?=$grupo->ddia?>"> <?=date('d/m/y',strtotime($grupo->ddia))?></a> <td class=text-end><?=dec($grupo->ttotal)?> <?php endforeach;?> </table>
-
Programação PHP SELECT COUNT(*) as total FROM ?
pergunta respondeu ao Super Oferta TOP de Frank K Hosaka em PHP
O print do banco de dados não aparece na sua mensagem, assim improvisei uma nova tabela. Espero que isso ajude: <?php $pdo=new PDO("mysql:host=localhost;dbname=teste","root",""); // mysql.teste.tabela(id,telefone,pagou)(301,"99",0)(302,"99",0)(303,"99",0)(304,"99",0) // (305,"99",1) $stmt=$pdo->query("select * from tabela where pagou"); $pagadores=$stmt->fetchAll(PDO::FETCH_OBJ); ?> Lista dos pagadores: <table><th>id<th>telefone <?php foreach($pagadores as $pagador): ?> <tr><td><?=$pagador->id?><td><?=$pagador->telefone?> <?php endforeach; ?> </table> -
Eu tenho uma rotina no projeto que se chama pendência, que eu consegui montar em PHP em 2020. Aqui em 2024, tentei melhorar o código, mas havia tanta rotina repetida que achei melhor usar a tecnologia da classe. Geralmente, a gente separa o código da classe do código HTML, mas hoje tentei colocar HTML dentro da classe. Ele ainda está em fase de desenvolvimento, mas ele parece funcionar: <?php class pendencia { private $mysqli; function __construct() { $this->mysqli=new mysqli("localhost","root","","teste"); } function dec($value) { return ($value) ? number_format($value,2,',','.') : null; } function incluir($controles,$dados) { foreach($dados as $dado) if(!in_array($dado['docto'],$controles)) { $docto=$dado['docto']; $lcto=$dado['lcto']; $this->mysqli->query("insert into tbcontacorrente (docto,lcto) values ($docto,$lcto)"); } } function inicio() { $recebiveis=$this->mysqli->query("select * from tbdiario where contad=130 and dia>'2023-12-31'") ->fetch_all(MYSQLI_ASSOC); $recebidos=$this->mysqli->query("select * from tbdiario where contac=130 and dia>'2023-12-31'") ->fetch_all(MYSQLI_ASSOC); $pagaveis=$this->mysqli->query("select * from tbdiario where contac=211 and dia>'2023-12-31'") ->fetch_all(MYSQLI_ASSOC); $pagos=$this->mysqli->query("select * from tbdiario where contad=211 and dia>'2023-12-31'") ->fetch_all(MYSQLI_ASSOC); $controles=array_column($this->mysqli->query("select docto from tbcontacorrente") ->fetch_all(MYSQLI_NUM),0); $this->incluir($controles,$recebiveis); $this->incluir($controles,$recebidos); $this->incluir($controles,$pagaveis); $this->incluir($controles,$pagos); $controles=$this->mysqli->query("select * from tbcontacorrente left join tbpessoa on tbpessoa.codp = tbcontacorrente.codp join tbdiario on tbdiario.docto = tbcontacorrente.docto where pgto=0 order by vcto") ->fetch_all(MYSQLI_ASSOC); $totalReceber=0; ?> <style>td {white-space: nowrap} </style> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <table class='table table-striped table-sm m-auto' style=width:500px> <tr class=fw-semibold><td>Vencimento<td>Docto<td>Lcto <td class=text-end>Valor<td>Cliente<td>Histórico <?php foreach($controles as $c): $hist=date('d/m/y',strtotime($c['dia']))." ".$c['hist']; $totalReceber+=$c['valor']; ?> <tr><td><input type=date value='<?=$c['vcto']?>'> <td><?=$c['docto']?><td><?=$c['lcto']?> <td class=text-end><?=$this->dec($c['valor'])?> <td><?=$c['pessoa']?><td><?=$hist?> <?php endforeach; ?> <tr class=fw-semibold><td colspan=3>Total a receber<td colspan=3><?=$this->dec($totalReceber)?> </table> <?php } } (new pendencia)->inicio(); /* mysql CREATE TABLE `tbdiario` ( `docto` mediumint NOT NULL AUTO_INCREMENT, `dia` date DEFAULT NULL, `hist` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `lcto` mediumint DEFAULT NULL, `contad` mediumint DEFAULT NULL, `contac` mediumint DEFAULT NULL, `valor` decimal(13,2) DEFAULT NULL, PRIMARY KEY (`docto`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; insert into tbdiario (dia,hist,lcto,contad,contac,valor) values ('2024-09-23','Magazine Luiza',1,130,304,12.00), ('2024-09-24','Mappin',2,130,304,500.00) CREATE TABLE `tbcontacorrente` ( `docto` mediumint NOT NULL, `vcto` date DEFAULT NULL, `pgto` int DEFAULT '0', `codp` mediumint DEFAULT NULL, `lcto` mediumint DEFAULT NULL, PRIMARY KEY (`docto`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci CREATE TABLE `tbpessoa` ( `codp` int NOT NULL AUTO_INCREMENT, `pessoa` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `cnpj` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `end` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `tel` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `nota` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `updated_at` datetime NOT NULL, `vinculo` tinyint NOT NULL, PRIMARY KEY (`codp`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci */
-
No Hostinger, eu configurei o arquivo .env assim: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=Diario DB_USERNAME=Root DB_PASSWORD=1234 No meu Notebook à base de Windows, eu configurei assim: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=diario DB_USERNAME=root DB_PASSWORD= São dois arquivos que têm informações diferentes mas compartilham o mesmo nome. Depois de várias tentativas, acredito que consegui consertar o problema. O arquivo de cima permaneceu com o mesmo nome .env, e o de baixo recebeu o nome de .env.local, e agora a listagem do código laravel é exatamente igual no Hostinger como no notebook. Os dois tem os arquivos .env e .env.local. Para otimizar o código, usei o comando composer dump-autoload. Ambos estão programados para abrir o arquivo .env, mas o do notebook executa também o arquivo .env.local - essa é uma bela mágica que estava procurando desde 2022. Ele funciona!
-
PHP For loop com IDs diferentes
pergunta respondeu ao CarlosWebSB de Frank K Hosaka em Tutoriais & Dicas - PHP
<?php // index.php // mysql.teste.dados_socios (id,usuario)(1,"Frank")(3,"João")(4,"Maria") $conn = new mysqli("localhost","root","","teste"); $usuarios=$conn->query("select * from dados_socios")->fetch_all(MYSQLI_ASSOC); ?> <div style="width:500px;margin:0 auto"> <select> <?php foreach($usuarios as $usuario): ?> <option>ID <?=$usuario['id'] . " " . $usuario['usuario']?> <?php endforeach; ?> </select> </div> sugestões: alterar o nome da tabela de dados_socios para socios, alterar o nome do campo usuario para nomeSocio. -
Usei o endereço do eSocial, usei um certificado digital pj, e acabei recebendo um xml. Pesquisei o Google, e ele respondeu assim: Para enviar um arquivo XML de eventos, é possível seguir os seguintes passos: Acessar o eSocial Ir ao Painel Acessar a aba do evento Clicar em Utilitários Selecionar Exportar XML Escolher se deseja exportar apenas o evento selecionado ou todos do filtro aplicado
-
Eu encontrei auth()->user() no tutorial do Chirp versão Livewire, e isso disparou a mensagem de erro no VS Code. Instalei as extensões PHP Extension Pack bem como o Laravel Extension Pack com a ajuda do CTRL+SHIFT+X no VS Code, bem como tirei todas as credenciais do VS Code no Gerenciador de Credenciais do Windows, mas isso não removeu a mensagem de erro. Para você testar isso, pegue qualquer função index de qualquer controlador, e escreve dd(auth()->user()), o Laravel vai mostrar todos os dados do usuário logado, mesmo que o VS Code afirme que o auth() não tem o método user(), ====================================== Acredito que uma das medidas que eu tomei resolveu o problema, eu só não sei qual. Agora não aparece mais a mensagem de erro no VS Code.
-
A Bling fornece o cadastro de produtos através de arquivos .csv. Eu pego os arquivos, monto uma tabela de produtos da Bling, comparo com a minha tabela no MySQL, em seguida uso o marca texto na última célula (não consegui marcar toda linha) para lembrar o que eu já consertei no cadastro de produtos hospedado na Bling: <?php // bling.php class Bling { function diferenca() { return view('blingDiferenca'); } function diferenca2() { (new Conn)->exec("truncate table tbprodbling"); $arquivos=$_FILES['arquivos']; foreach($arquivos['tmp_name'] as $arquivo) { $dados=file($arquivo); foreach($dados as $linha) { $campos=explode(';',$linha); if(aspas($campos[1])!=="Código") { $codprod=intval(trim(aspas($campos[1]))); $un=aspas($campos[3]); $prod=aspas($campos[2]); $custo=deca(aspas($campos[11])); $codbar=trim(aspas($campos[19])); $cf=deca(aspas($campos[4])); $venda=deca(aspas($campos[6])); (new Conn)->insert("tbprodbling (codprod,un,prod,custo,codbar,cf,venda) values ($codprod,'$un','$prod',$custo,'$codbar','$cf',$venda)"); } } } $produto=(new Conn)->select("* from tbprod where loc <> 'a24'"); $contaProduto=count($produto); $prodBling=(new Conn)->select("* from tbprodbling"); $contaProdBling=count($prodBling); $dif=[]; foreach($produto as $key=>$pr) { $codprod=$pr->codprod; $previa=(new Conn)->select("* from tbprodbling where codprod=$codprod"); if(count($previa)==0) { $dif[$key][]=['Codigo'=>$codprod]; $dif[$key][]=['Incluir'=>$codprod,'Incluir2'=>'Incluir']; } else { $a=json_decode(json_encode($previa))[0]; $un=($pr->un==$a->un) ? 1 : 0; $prod=($pr->prod==$a->prod) ? 1 : 0; $custo=($pr->custo==$a->custo) ? 1 : 0; $codbar=($pr->codbar==$a->codbar) ? 1 : 0; $cf=($pr->cf==$a->cf) ? 1 : 0; $venda=($pr->venda==$a->venda) ? 1 : 0; if($un.$prod.$custo.$codbar.$cf.$venda !== '111111') { $dif[$key][]=['Codigo'=>$pr->codprod,'Codigo2'=>$a->codprod]; if($pr->prod!==$a->prod) { $dif[$key][]=['Descricao'=>$pr->prod,'Descricao2'=>$a->prod]; } if($pr->custo!==$a->custo) { $dif[$key][]=['Custo'=>$pr->custo,'Custo2'=>$a->custo]; } if($pr->codbar!=$a->codbar) { $dif[$key][]=['Codigo de Barra'=>$pr->codbar,'Codigo de Barra2'=>$a->codbar]; } if($pr->cf!==$a->cf) { $dif[$key][]=['NCM'=>$pr->cf,'NCM2'=>$a->cf]; } if($pr->venda!==$a->venda) { $dif[$key][]=['Venda'=>$pr->venda,'Venda2'=>$a->venda]; } if($pr->un!==$a->un) { $dif[$key][]=['Un'=>$pr->un,'Un2'=>$a->un]; } } } } return view('blingDiferenca2',['dif'=>$dif,'contaProduto'=>$contaProduto, 'contaProdBling'=>$contaProdBling]); } } <?php require 'menuView.php'; ?><!-- blingDiferenca.php --> <script>btmenu.innerHTML='Diferença Bling';document.title='Diferença Bling'</script> <form method=post class="w-50 m-auto" enctype="multipart/form-data" action=?Bling.diferenca2> <label for=arquivo>Escolha o arquivo XML</label> <input type=file name=arquivos[] multiple required> <input type=submit> </form> <?php require 'menuView.php'; ?><!-- blingDiferenca2.php --> <script>btmenu.innerHTML='Diferença Bling';document.title='Diferença Bling'</script> <table class='table table-sm'> <tr class=fw-semibold><td>Código<td>Campo<td>MySQL<td>Bling <tr><td><td>Produtos<td><?=$contaProduto?><td><?=$contaProdBling?> <?php foreach($dif as $d): foreach($d as $v):?> <?php if(array_keys($v)[0]=="Codigo"): $codigo=array_values($v)[0]; else: ?> <tr> <td><?=$codigo?> <td><?=array_keys($v)[0]?> <td><?=array_values($v)[0]?> <td onclick="this.style.backgroundColor='lightgray'"><?=array_values($v)[1]?> <?php endif; endforeach; endforeach; ?> </table>
-
O meu php é versão 8.2, ele não suporta o motor mysql, então usei o motor mysqli: <?php // index.php php 8.2 // mysql.terminais.videos(id,link)(1,'video1.mp4'); // aqui coloquei o video1.mp4 no diretório raiz do projeto, // se fosse colocado numa pasta chamada vídeos // a tabela vídeos teria que ser cadastrado assim (1,'videos/video1.mp4') $mysqli=new mysqli("localhost","root","","terminais"); $resultado=$mysqli->query("select * from videos"); while($linha=$resultado->fetch_assoc()) { $exlink = $linha['link']; ?> <iframe width="590" height="335" src="<?=$exlink?>" frameborder="0" allowfullscreen> </iframe> <?php }