
Frank K Hosaka
Membros-
Total de itens
1.590 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
A minha tela de login no projeto php é um horror na tela do celular, ele só aparece a metade do formulário no modo retrato. Tentei estudar o Laravel para ver como ele consegue colocar todo o formulário do login tanto no modo retrato como no modo paisagem no celular, mas eu não consegui apurar aonde começa o código e onde termina. Pedi ajuda para o Copilot, e ele me arranjou dois arquivos, o HTML e o CSS. Peguei o terminal do VS Code e digitei php -S 0.0.0.0:8000 e no celular eu digitei 192.168.0.4:8000, e comecei a estudar a tal da responsividade. O arquivo CSS é enorme, mas fiquei imaginando como ficaria o celular sem o CSS. O celular continuou funcionando, e diminui todo o HTML nos seguintes códigos: <form> <h2>Login</h2> <div> <input type="text" id="username" name="username" required placeholder="Usuário"> </div> <div> <input type="password" id="password" name="password" required placeholder="Senha"> </div> <input type="submit"> </form> Ou seja, o HTML é responsivo. O CSS é pura perfumaria.
-
Na imagem abaixo eu encontrei uma pequena diferença de R$ 0,01, ele é resultado da equação: C = aint(B - A). Para tentar resolver esse problema, eu improvisei assim: C = aint(B) - aint(A). Ele resolveu o meu problema agora. Não sei se dá para usar essa solução por toda a vida. a função aint que eu criei é essa: <?php function aint($valor) { return intval($valor*100)/100; }
-
Ao invés de conectar o Excel no MySQL remoto, eu pensei em jogar no PHP o serviço do Excel. Criei uma tabela chamada previsão, criei uma classe previsão e também uma imagem previsão. Se eu conseguir terminar o serviço, vou poder fazer as tarefas no celular, não vou mais depender do laptop: arquivo previsao.php <?php class previsao { static function alterar() { $previsao=deca($_POST['previsao']); $conta=$_POST['conta']; bd::x("update tbprevisao set valor=:valor where conta=:conta", ['valor'=>$previsao,'conta'=>$conta])->getx(); return self::inicio(); } static function inicio() { balancete::tbw(1); $painel=bd::x("select * from tbprevisao join tbw on tbprevisao.conta = tbw.conta")->get(); return view('previsaoView',['painel'=>$painel]); } } <?php require('menuView.php'); ?> <script>btMenu.innerHTML="Previsão";document.title="Previsão"</script> <div class="flex"> <div class="w-[50px] text-right">Conta</div> <div class="w-[200px] px-2">Descricao</div> <div class="w-[100px] text-right">Previsão</div> <div class="w-[100px] text-right">Contábil</div> <div class="w-[100px] text-right">Divergência</div> </div> <div class=flex> <?php foreach($painel as $p): ?> <div class="w-[50px] text-right"><?=$p->conta?></div> <div class="w-[200px] px-2 truncate"><?=$p->descricao?></div> <div class="w-[100px] text-right"> <form action=previsaoAlterar method=post> <input class="w-[100px] text-right" name=previsao value=<?=dec($p->valor)?>> <input type=hidden name=conta value=<?=$p->conta?>> </fom> </div> <div class="w-[100px] text-right"><?=dec($p->fim)?></div> <div class="w-[100px] text-right"><?=dec(abs($p->valor - $p->fim))?></div> <?php endforeach;?> </div>
-
O PHP foi a melhor maneira que eu encontrei para conectar o meu celular com o MySQL. Tanto o PHP como o MySQL estão hospedados na Hostinger. O problema é que o meu conhecimento em PHP é muito precário, ainda não posso jogar fora o programa Excel. Assim, todo ano preciso pagar R$ 459,00 para a Microsoft para eu poder usar o Excel (a assinatura se extende ao Access, ao Word, e muitos programas que não uso). Desde 2022, quando aluguei um espaço na Hostinger, preciso fazer um monte de backup do MySQL para eu poder conectar o Excel no banco de dados. Isso é uma chatice para quem detesta trabalhar, como é o meu caso. Assim, hoje eu pedi ajuda ao Copilot, ele me deixou feliz na hora que ele disse que posso conectar o Excel diretamente no MySQL lá na Hostinger. A minha alegria durou pouco tempo, eu não consegui conectar o meu ODBC à Hostinger. O problema não é só o Windows, é também a Hostinger, eu preciso mexer os pausinhos para o Excel poder consultar o banco de dados, conforme esse tutorial: https://www.hostinger.com/tutorials/mysql/how-to-grant-remote-access-mysql-vps Eu ainda não testei o tutorial, e assim continuo fazendo esse serviço chato do backup. Mas quem está na mesma situação que eu, desejo sorte com o tutorial.
-
Selecionar intervalo entre 2 textos no Word.
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Microsoft Office
[Copilot] Sub FormatTextInRed() Dim doc As Document Dim rng As Range Dim startPos As Long Dim endPos As Long ' Define the text delimiters Dim startText As String Dim endText As String startText = "aluno1" endText = "aluno2" ' Set the document Set doc = ActiveDocument ' Find the start position Set rng = doc.Content With rng.Find .Text = startText .Forward = True .Wrap = wdFindStop .Execute End With startPos = rng.Start + Len(startText) ' Find the end position Set rng = doc.Content With rng.Find .Text = endText .Forward = True .Wrap = wdFindStop .Execute End With endPos = rng.Start ' Format the text between the start and end positions Set rng = doc.Range(startPos, endPos) rng.Font.Color = wdColorRed End Sub -
O MS Access é bacana, eu apanhei durante 20 anos, e até hoje eu continuo apanhando. Pelo que vi, o problema é que existe uma tabela (tbSocio) com os campos (id,nome) e com os seguintes valores (1,Frank),(2,João),(3,Maria),(4,José),(5,Joaquim),(6,João). Também tem um formulário com o nome de frmSocio, e lá dentro tem um botão de navegação com o desenho do próximo registro (btProximo), e duas caixas de texto (txt_id) e (txt_nome). O problema é bem difícil de resolver: como colocar os registros do tbSocio no frmSocio. O primeiro registro deverá ser executado pelo formulário. Os demais registros devem ser executados pelo botão, assim: Option Compare Database Dim rs As DAO.Recordset Private Sub Form_Load() Set rs = CurrentDb.OpenRecordset("SELECT id, nome FROM tbsocios") If Not rs.EOF Then rs.MoveFirst txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value End If End Sub Private Sub btProximo_Click() If Not rs.EOF Then rs.MoveNext If Not rs.EOF Then txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value Else MsgBox "Você chegou ao último registro." rs.MovePrevious ' Volta ao último registro válido End If End If End Sub
-
Eu inventei a rotina da baixa de estoque em 1999, quando trabalhava com MS Access, e adaptei em 2020 no PHP, mas ele é lento demais. A rotina olha toda a tabela de produtos, estuda cada caso, para ver se é necessário fazer ajuste para calcular o estoque presumido. Eu queria simplificar, ao invés de olhar tudo, o melhor é olhar o que precisa. Ou seja, na tabela histórico do produto, eu tenho algo do tipo (666,'2025-02-01',1,10.00), (666,'2025-02-02',1,10.00),(666,'2025-02-03',1,10.00), como eu faço para pegar o último registro? Eu achei a solução lá em 1999, mas ele é péssimo para os padrões de 2025. O lado bom de viver em 2025 é que tem o Copilot, é um serviço de inteligência artificial que a Microsoft não cobra nada. Por enquanto. E hoje, o Copilot me apresentou o WITH, eu nem sabia que isso existia no MySQL: <?php $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $sql="WITH Produtos AS ( SELECT tbprod.codprod, prod, id, qt, custototal, ROW_NUMBER() OVER (PARTITION BY tbprod.codprod ORDER BY id DESC) AS rn FROM tbprod JOIN tbhistprod ON tbhistprod.codprod = tbprod.codprod WHERE loc <> 'a24' AND qt > 0 AND lcto <> 15092 and lcto <> 15093 AND dia BETWEEN '2025-02-01' AND '2025-02-28') SELECT codprod,prod,id, qt, custototal FROM Produtos WHERE rn = 1"; $produtos=$pdo->query($sql)->fetchAll(PDO::FETCH_OBJ); echo "<table><th>CodProd<th>Prod<th>Qtotal<th>vTotal<th>Uqt<th>Uvalor<th>AjusteQ<th>AjusteV"; foreach($produtos as $produto) { $previa=$pdo->query("select sum(qt) as qt, sum(custototal) as total from tbhistprod where codprod=$produto->codprod")->fetchAll(PDO::FETCH_OBJ)[0]; if($produto->qt!==$previa->qt) { $ajusteQ=$produto->qt - $previa->qt; $ajusteV=$produto->custototal - $previa->total; echo "<tr><td>$produto->codprod<td>$produto->prod <td>$previa->qt<td>$previa->total<td>$produto->qt<td>$produto->custototal <td>$ajusteQ<td>$ajusteV"; } } echo "</table>";
-
O grande problema do Excel com macro é que ele só funciona no PC. Busquei uma alternativa na planilho do Google, eu e o Copilot perdemos o dia todo tentando fazer a planilha consultar o arquivo tbprod.csv, mas no final eu pedi para o Copilot copiar todo o arquivo na página2 da planilha ativa, e usar a página1 do mesmo jeito que no Excel: Apps Script function copiarConteudoCSVParaPlanilha() { var idArquivoCSV = '1wwN8Z-SR0t0pFhrQOyx9YFYpgSiwaQo_'; // Substitua pelo ID do seu arquivo tbprod.csv try { var arquivo = DriveApp.getFileById(idArquivoCSV); var conteudo = arquivo.getBlob().getDataAsString(); var linhas = Utilities.parseCsv(conteudo); var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folha = planilha.getActiveSheet(); // Limpar qualquer conteúdo existente na planilha folha.clear(); // Copiar o conteúdo do CSV para a planilha folha.getRange(1, 1, linhas.length, linhas[0].length).setValues(linhas); SpreadsheetApp.getUi().alert('Conteúdo do arquivo CSV copiado para a planilha com sucesso!'); } catch (erro) { Logger.log('Erro: ' + erro); SpreadsheetApp.getUi().alert('Ocorreu um erro: ' + erro); } } function onEdit(e) { var folhaAtiva = e.source.getActiveSheet(); var celulaEditada = e.range; var valorCelula = celulaEditada.getValue(); if (folhaAtiva.getSheetName() == 'Página1') { var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folhaBusca = planilha.getSheetByName('Página2'); if (!folhaBusca) { SpreadsheetApp.getUi().alert('A planilha "Página2" não foi encontrada.'); return; } var intervaloBusca = folhaBusca.getRange('A:D').getValues(); for (var i = 0; i < intervaloBusca.length; i++) { if (intervaloBusca[i][0] == valorCelula) { var valorCorrespondente = intervaloBusca[i][3]; // Valor da coluna D // Colocar o valor da coluna D ao lado do valor digitado na Página1 celulaEditada.offset(0, 1).setValue(valorCorrespondente); // Opcional: Exibir um alerta com o valor digitado e o valor correspondente SpreadsheetApp.getUi().alert('O valor digitado é: ' + valorCelula + '. O valor correspondente é: ' + valorCorrespondente); return; } } // Se nenhum valor correspondente for encontrado SpreadsheetApp.getUi().alert('Nenhum valor correspondente encontrado para: ' + valorCelula); } }
-
Botão macro com link para segunda planilha.
pergunta respondeu ao joaoclaudiobrasil de Frank K Hosaka em VBA
Copilot: Sub botao_D1() Sheets("Plan5").Range("B4").Select Range("Plan5!B4").Value = Range("Plan5!B4").Value + 25 End Sub -
O PHP é o único recurso que eu conheço que conecta o MySQL com o HTML, e o Excel é o único recurso que o meu irmão Jorge conhece. Eu ainda não tenho a menor ideia de como fazer o pedido de compra, então decidi usar o PHP para exportar a tabela tbprod, assim: listagem parcial do produto.php function exportar() { $filename = "tbprod.csv"; header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename="' . $filename . '"'); header('Pragma: no-cache'); header('Expires: 0'); $file = fopen('php://output', "w"); fputcsv($file, array('codprod', 'un', 'prod','custo','marg', 'codbar','loc','emb','cf','codforn','estoque','venda','cfop'), ',', '"', "\\"); $result = (new conn)->select("* from tbprod where loc <> 'a24' order by prod"); if ($result && count($result) > 0) { foreach($result as $row) { fputcsv($file, (array)$row, ',', '"', "\\"); } require('menuView.php'); echo "Dados exportados com sucesso para " . $filename; } else { echo "Nenhum registro encontrado na tabela tbprod."; } fclose($file); } Para o meu irmão usar o arquivo tbprod.csv, eu criei a planilha SoFuncionaNoPC.xlms, com o seguinte código VBA Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' Adicione o código que você deseja executar ao dar duplo clique na célula If Not Intersect(Target, Me.Range("A1:Z100")) Is Nothing Then Dim valorProcurado As String Dim csvFilePath As String Dim csvFile As Workbook Dim csvSheet As Worksheet Dim activeSheet As Worksheet Dim found As Range Dim linhaAtual As Long Dim colunaAtual As Long ' Define o valor a ser procurado valorProcurado = ActiveCell.Value linhaAtual = ActiveCell.Row colunaAtual = ActiveCell.Column ' Caminho relativo para o arquivo CSV (no mesmo diretório da planilha atual) csvFilePath = ThisWorkbook.Path & "\tbprod.csv" ' Abre o arquivo CSV de forma oculta Application.ScreenUpdating = False Set csvFile = Workbooks.Open(csvFilePath) Set csvSheet = csvFile.Sheets(1) csvFile.Windows(1).Visible = False Set activeSheet = ThisWorkbook.activeSheet ' Procura pelo valor na coluna A (primeira coluna) Set found = csvSheet.Columns(1).Find(What:=valorProcurado, LookIn:=xlValues, LookAt:=xlWhole) ' Se encontrar o valor, copia a linha correspondente para a planilha ativa If Not found Is Nothing Then activeSheet.Cells(linhaAtual, colunaAtual + 1).Value = found.Offset(0, 2).Value Else MsgBox "Valor " & valorProcurado & " não encontrado no arquivo CSV.", vbExclamation End If ' Fecha o arquivo CSV csvFile.Close SaveChanges:=False Cancel = True ' Cancela a edição padrão de célula ao dar duplo clique End If End Sub Esse código vai no painel do código da planilha ativa. Por enquanto o programa é bem inútil, mas eu gostei. O meu irmão vai em uma célula qualquer, digita um valor, e ao dar um duplo clique na célula, o VBA vai até o tbprod.csv e traz a descrição do produto, se ele encontrar e coloca do lado da célula ativa.
-
Localizar e selecionar intervalo entre 2 textos no Word
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Visual Basic
Eu não entendi bem o problema, mesmo assim, tentei alterar o código assim: Public Sub Teste() Dim startText As String Dim endText As String Dim startPos As Long Dim endPos As Long Dim doc As Document Dim rng As Range Dim searchPos As Long startText = "End.: " endText = "Bairro: " Set doc = ActiveDocument searchPos = 1 Do startPos = InStr(searchPos, doc.Content.Text, startText) If startPos = 0 Then Exit Do endPos = InStr(startPos + Len(startText), doc.Content.Text, endText) If endPos = 0 Then Exit Do Set rng = doc.Range(startPos + Len(startText) - 1, endPos - 1) 'Substituir quebras de parágrafo por espaço rng.Text = Replace(rng.Text, vbCr, " ") searchPos = endPos + Len(endText) Loop End Sub -
Como capturar HTML editado no Textarea usando JavaScript?
pergunta respondeu ao claugo de Frank K Hosaka em Java
arquivo index.php <script src="https://cdn.tailwindcss.com"></script> <div class="w-[1000px] mt-5 flex m-0 m-auto"> <textarea rows="10" cols="50" class="border border-1 border-black" oninput="replica.innerText=this.value"> </textarea> <div id=replica class="w-[500px] h-[300px] border border-black"> </div> </div> -
Depois de 30 anos, finalmente descobri um jeito de tirar o texto de um pdf. A dica foi do Deep Seek: basta abrir o PDF no Adobe Reader, selecionar o texto, copiar e colar num arquivo texto. Nunca pensei que fosse tão fácil. Com arquivo de texto dá fazer uma festa com o PHP: arquivo fera.txt 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 RUA A - BOX 27 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 RUA A - BOX 35 arquivo index.php <?php // Define o caminho para o arquivo de texto $caminhoArquivo = 'fera.txt'; // Abre o arquivo para leitura $arquivo = fopen($caminhoArquivo, 'r'); if ($arquivo) { // Lê o conteúdo do arquivo linha por linha while (($linha = fgets($arquivo)) !== false) { $pos=strpos($linha," RUA"); $separar=substr($linha,0, $pos); echo $separar . "<br>"; $partes = explode(" ", $separar); // Atribui cada parte a uma variável correspondente $codigo = array_shift($partes); echo "codigo $codigo <br>"; $qt1 = array_shift($partes); echo "qt1 $qt1 <br>"; $total = array_pop($partes); echo "total $total <br>"; $unitario = array_pop($partes); echo "unitario $unitario <br>"; $qt2 = array_pop($partes); echo "qt2 $qt2 <br>"; $descricao = implode(' ', $partes); echo "descricao $descricao <br><br>"; } // Fecha o arquivo fclose($arquivo); } ?> // resultado: 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 codigo 103898 qt1 2,00 total 17,64 unitario 8,82 qt2 1,00 descricao REPOLHO ROXO 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 codigo 103899 qt1 1,00 total 8,82 unitario 8,82 qt2 1,00 descricao REPOLHO FATIADO NO MEIO
-
Erro em tempo de execução 9 Subscrito fora do intervalo
pergunta respondeu ao Barabara Amorim de Frank K Hosaka em Tutoriais & Dicas - MS Office
Eu não consegui resolver o problema, mas gostei bastante do código, o problema é que o Excel travou e assim eu pedi ajuda para o Copilot, e a sugestão dele deu certo. Eu montei uma nova planilha com o nome de Geral, onde célula A1=Digite Aqui, B1=Data, C1=Hora, D1=Soma(a2:a20), e o código ficou assim: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False ' Desativa eventos temporariamente On Error GoTo ExitSub ' Tratamento de erros para garantir que eventos sejam reativados If Target.Row > 1 Then If Target.Column = 1 Then Cells(Target.Row, 2) = Date Cells(Target.Row, 3) = Time Cells(Target.Row, 4) = Sheets("Geral").Cells(1, 4).Value End If End If ExitSub: Application.EnableEvents = True ' Reativa eventos End Sub -
Para facilitar eu simplifiquei tudo, ao invés de duas, eu só fiz uma planilha chamada tarefas, onde a coluna A representa o cliente, a coluna b status e a coluna c data. Para o formulário controle, usei o UserForm e dei o nome de frmControle, com duas caixas de texto (txtCliente, txtStatus), um botão (cmdPular) e um comboBox (cboStatus), e eles usam esse código: Dim ultimaLinhaPesquisada As Long Private Sub UserForm_Initialize() cboStatus.AddItem "Realizado" cboStatus.AddItem "Em Aberto" cboStatus.AddItem "Agendado" cboStatus.AddItem "Cancelado" ultimaLinhaPesquisada = 2 ' Começa na linha 2, assumindo que a linha 1 contém os cabeçalhos PesquisarProximaLinha End Sub Private Sub PesquisarProximaLinha() Dim ws As Worksheet Dim statusValue As String ' Definir a planilha "tarefas" Set ws = ThisWorkbook.Sheets("tarefas") ' Procurar a próxima linha com Status diferente de "Realizado" ou "Cancelado" For i = ultimaLinhaPesquisada To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row statusValue = ws.Cells(i, 2).Value ' Coluna B contém o status If statusValue <> "Realizado" And statusValue <> "Cancelado" Then ' Copiar valores para os controles do UserForm Me.txtCliente.Value = ws.Cells(i, 1).Value ' Coluna A para txtCliente Me.txtStatus.Value = ws.Cells(i, 2).Value ' Coluna B para txtStatus ' Ativar a célula na coluna B da linha pesquisada ws.Cells(i, 2).Activate ultimaLinhaPesquisada = i Exit For End If Next i End Sub Private Sub cmdPular_Click() PesquisarProximaLinha End Sub Private Sub cboStatus_Change() Dim ws As Worksheet Dim statusValue As String ' Definir a planilha "tarefas" Set ws = ThisWorkbook.Sheets("tarefas") ' Verificar o valor selecionado na ComboBox statusValue = Me.cboStatus.Value If statusValue = "Realizado" Or statusValue = "Cancelado" Or statusValue = "Em Aberto" Then ' Atualizar o status na coluna B na linha específica ws.Cells(ultimaLinhaPesquisada, 2).Value = statusValue ' Colocar a data atual na coluna C na linha específica ws.Cells(ultimaLinhaPesquisada, 3).Value = Date End If Me.cboStatus = "" End Sub Para chamar o formulário dentro da planilha, você vai precisar de um módulo, e lá dentro outro código: Sub ExibirControle() frmControle.Show End Sub Com esse código, vai ser possível usar o comando Desenvolvedor > Macros > ExibirControle. Esse programa não prevê um código para Agendado, eu não tive tempo, mas espero que ele lhe ajude.
-
A lógica é a mesma que comentei no texto anterior quando falei do fusca de 3 assentos, esse aqui tem desenho. arquivo config.php <?php class bd { private static $bindings = []; private static $initialized = false; private static $query; private static $pdo; static function get() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ); self::$query = ''; self::$bindings = []; return $result; } static function get1() { self::$query .= " LIMIT 1"; $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ)[0]; self::$query = ''; self::$bindings = []; return $result; } protected static function getPdo() { self::initialize(); return self::$pdo; } static function getv($column) { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); self::$query = ''; self::$bindings = []; return $result[$column] ?? null; } static function getx() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); return; } static function initialize() { if (!self::$initialized) { $dsn = 'mysql:host=localhost;dbname=teste'; self::$pdo = new PDO($dsn, 'root',''); self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$initialized = true; } } static function x($sql,$bindings=[]) { self::initialize(); self::$query=$sql; self::$bindings=$bindings; return new static; } } arquivo index.php <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Poltronas do Ônibus</title> <style> table { width: 50%; border-collapse: collapse; margin: 0 auto; } td { width: 20%; border: 1px solid #000; text-align: center; padding: 10px; } .floor-label { font-weight: bold; text-align: center; background-color: #f0f0f0; padding: 10px; } .corridor { width: 20%; background-color: #ddd; } .seat-button { width: 100%; height: 100%; background: none; border: none; cursor: pointer; } .reserved { background-color: red; color: white; } .selected { background-color: blue; color: white; } </style> </head> <body> <table> <?php require('config.php'); $seats = range(1, 64); // Poltronas de 1 a 64 $floors = [ 'Piso 1' => array_slice($seats, 48, 16), // Poltronas 49 a 64 'Piso 2' => array_slice($seats, 0, 48) // Poltronas 1 a 48 ]; foreach ($floors as $floor => $seats) { echo "<tr><td colspan='5' class='floor-label'>$floor</td></tr>"; for ($i = 0; $i < count($seats); $i += 4) { echo "<tr>"; for ($j = 0; $j < 4; $j++) { if ($j == 2) { echo "<td class='corridor'></td>"; } $seat = $seats[$i + $j]; // Verificar se a poltrona está reservada $ver = bd::x("SELECT poltrona FROM poltrona WHERE poltrona = :poltrona", ['poltrona' => $seat])->get(); $reserved_class = !empty($ver) ? 'reserved' : ''; echo "<td><form method='post' action=''><button type='submit' name='seat' value='$seat' class='seat-button $reserved_class' id='seat-$seat' onclick='highlightSeat($seat)'>$seat</button></form></td>"; } echo "</tr>"; } } // Verificar qual poltrona foi selecionada if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['seat'])) { $selected_seat = $_POST['seat']; // Verificar se a poltrona não está reservada $ver = bd::x("SELECT poltrona FROM poltrona WHERE poltrona = :poltrona", ['poltrona' => $selected_seat])->get(); if (empty($ver)) { bd::x("INSERT INTO poltrona (poltrona) VALUES (:poltrona)", ['poltrona' => $selected_seat])->getx(); echo "<script>location.reload()</script>"; } else { echo "<p>Poltrona já reservada: $selected_seat</p>"; } } ?> </table> </body> </html>
-
Script de aquisição de dados com erro me ajudem!!!
pergunta respondeu ao ANDREVERZOLA de Frank K Hosaka em Python
O meu problema é pior, eu não consigo enxergar o código. Não tem jeito de publicar o código dentro do code << >>? -
Bom dia, eu só estou tentando entender a linguagem de objetos, estou bem longe de dominar. O projeto semiLaravel me ensinou muita coisa, como mandar todas as solicitações para o index.php e de lá chamar as classes e objetos. No começo eu só usava o método get. Eu não tenho a menor ideia de como o Laravel consegue centralizar tudo no arquivo web.php, o máximo que eu consegui foi centralizar tudo no index.php. Nessa nova etapa do aprendizado eu tive a aprender a trabalhar com static function, eu ainda não entendi bem o que é. Enfim, eu abandonei o projeto de imitar o Laravel, não vou fazer mais isso, vou usar um novo caminho, onde a prioridade não é mais a elegância e sim a praticidade, e assim eu criei o bd::x($sql,[param1,param2,...), ao invés de eu ter um monte de métodos para tentar abraçar a ideia do CRUD, a ideia é executar o CRUD em um menor número de métodos. O nome disso é tentativa e erro, e vou exibindo os códigos para ver se alguém pode me avaliar e ver quanta besteira estou fazendo.
-
A última vez que eu vi a classe bd, ele estava ocupando quase 300 linhas, é muita coisa, não vale a pena tentar imitar o Laravel, mas eu aprendi muita coisa, e assim montei uma classe bd com poucos métodos, que não precisa mexer toda vez que aparece uma tarefa nova: arquivo .htaccess RewriteEngine On # Redirecionar tudo para index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] arquivo index.php <?php require('config.php'); $requestUri = $_SERVER['REQUEST_URI']; $path = substr($requestUri, strlen($basePath)); if ($path == "") { $path = "loginLogin"; } if (!strpos($path, '(')) { $path .= '()'; } if (preg_match('/^([a-z]+)([A-Z][a-zA-Z]*)\((.*)\)$/', $path, $matches)) { $classe = $matches[1]; $metodo = $matches[2]; $argumentos = explode(',', $matches[3]); $argumentos = array_map('urldecode', $argumentos); if (!empty($argumentos[0]) && !empty($argumentos)) { $classe::$metodo(...$argumentos); } else { $classe::$metodo(); } } else { echo "Formato de URL inválido."; } ?> arquivo config.php <?php session_start(); error_reporting(E_ALL); ini_set('display_errors', 1); date_default_timezone_set('America/Sao_Paulo'); $baseDir = $_SERVER['SERVER_NAME'] === 'frank.com' ? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/chirper/'; $basePath = $_SERVER['SERVER_NAME'] === 'frank.com' ? '/' : '/chirper/'; defined('HOST') || define('HOST', 'localhost'); defined('DBNAME') || define('DBNAME', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Diario' : 'diario'); defined('USER') || define('USER', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Root' : 'root'); defined('PASSWORD') || define('PASSWORD', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? '12345678' : ''); spl_autoload_register(function ($class) { $path = str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'; if (file_exists($path)) { require $path; } else { echo "classe $class não encontrada"; exit; } }); class bd { private static $bindings = []; private static $initialized = false; private static $query; private static $pdo; static function get() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ); self::$query = ''; self::$bindings = []; return $result; } static function get1() { self::$query .= " LIMIT 1"; $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ)[0]; self::$query = ''; self::$bindings = []; return $result; } protected static function getPdo() { self::initialize(); return self::$pdo; } static function getv($column) { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); self::$query = ''; self::$bindings = []; return $result[$column] ?? null; } static function getx() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); return; } static function initialize() { if (!self::$initialized) { $dsn = 'mysql:host=' . HOST . ';dbname=' . DBNAME; self::$pdo = new PDO($dsn, USER, PASSWORD); self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$initialized = true; } } static function x($sql,$bindings=[]) { self::initialize(); self::$query=$sql; self::$bindings=$bindings; return new static; } } exemplo de comandos: $lctos=bd::x("select * from tbdiario where dia=:dia order by lcto",['dia'=>$dia])->get(); $somaDebito=bd::x("select sum(valor) as soma from tbdiario where dia=:dia and contad>0",['dia'=>$dia])->getv('soma'); bd::x("insert into tbcontacorrente (docto,lcto) values (:dif,:lcto)",['dif'=>$dif,'lcto'=>$lcto])->getx(); bd::x("delete from tbcontacorrente where docto=:docto",['docto'=>$p->docto])->getx(); ou seja, ao invés de criar um método para cada tarefa CRUD Create Read Update Delete, por que não criar um método para todas as tarefas do CRUD?
-
O Copilot é uma excelente ferramenta, o problema é que ele faz exatamente o que você pede, e agora tenho uma classe bd que ficou enorme, e mesmo assim surge um problema novo que os métodos da classe bd não são capazes de resolver. Esse é o caso do método first, eu precisava do último registro de uma tabela, e o copilot sugeriu alterar o código para self::$orderBy = "ORDER BY ped DESC"; Isso resolve o meu problema no curto prazo, mas lá frente, eu sei que vou precisar ordenar de forma diferente, assim decidi mudar o método por conta própria e eu criei o argumento $opção, e o código ficou assim: static function first($columns = '*', $conditions = [],$opcao = null) { self::initialize(); $table = static::getTableName(); if (is_array($columns)) { $columns = implode(', ', $columns); } $whereClause = ''; self::$bindings = []; if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $operator = $condition[1]; $value = $condition[2]; if ($operator == 'BETWEEN' && is_array($value)) { $whereClause .= "$field BETWEEN :{$field}_start AND :{$field}_end AND "; self::$bindings["{$field}_start"] = $value[0]; self::$bindings["{$field}_end"] = $value[1]; } else { $whereClause .= "$field $operator :$field AND "; self::$bindings[$field] = $value; } } $whereClause = 'WHERE ' . rtrim($whereClause, ' AND '); } $sql = "SELECT $columns FROM $table $whereClause"; if($opcao) { $sql .= ' '.$opcao; } $sql .= ' LIMIT 1'; $stmt = self::getPdo()->prepare($sql); foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_OBJ); self::$result = $result ? [$result] : []; return $result; } Agora, posso escrever tbpedido::first('*',[],'ORDER BY ped DESC"). É claro que isso está bem longe de parecer com o Eloquent do Laravel, é por isso que dei o nome de semiLaravel ao projeto.
-
Hoje fiquei o dia todo tentando entender porque o projeto me jogava na tela de login toda vez que eu pedia para executar a rotina do produtoDescontinuar. Tudo indicava que eu sempre perdia a variável global $_SESSION['id'] toda vez que executava esse comando. Isso não fazia o menor sentido, pois eu pedi para o .htaccess jogar todas as solicitações para o index.php, e a primeira tarefa dele é carregar o config.php, onde estava o session_start( ) e assim não há como perder uma sessão. Na base da tentativa e erro, eu mudei o método, ao invés de chamar produto::descontinuar eu chamei de produto:descont, ou seja, o index.php não recebia mais a requisição produtoDescontinuar e sim produtoDescont. O index tem um roteador que separa classe::método( ), e assim tudo voltou a funcionar como eu esperava. A minha tese é que a requisição produtoDescontinuar entrou em conflito com o sistema de arquivos do projeto, um deles se chamava produtoDescontinuar.php, onde estava o formulário onde aguardava o código do produto a descontinuar. Ou seja, na hora que a requisição foi efetivada, o PHP ficou sem saber se abria o arquivo ou jogava tudo no index.php, e acabou decidindo me jogar na tela do login.
-
https://forum.scriptbrasil.com.br/topic/226896-projeto-semilaravel-versão-em-atualização-28012025-1640/
-
Como criar um código Sku no vba
pergunta respondeu ao Pedro Dantas de Negreiros Neto de Frank K Hosaka em VBA
Eu sou um péssimo professor, pior que o pessoal do YouTube, mas vamos lá. Produto é um nome genérico para qualquer coisa que possa ser trocado por dinheiro. Ninguém faz cadastro de produto, a menos que seja por puro desespero. Então, abra uma nova planilha, dê o nome de produto (tudo em minúsculo). Você olha ao seu redor e você vê porta, laptop, celular. Você digita na célula A1 porta, na célula A2 laptop e na célula A3 celular. Para ver como funciona um formulário do Excel, crie um formulário com uma caixa de texto e um botão, dê um duplo clique no botão e crie o seguinte código: Private Sub CommandButton1_Click() Dim ws As Worksheet Dim nextCell As Range Dim productName As String ' Defina a planilha Set ws = ThisWorkbook.Sheets("produto") ' Obtenha o valor da caixa de texto productName = TextBox1.Value ' Verifique se a caixa de texto não está vazia If productName <> "" Then ' Encontre a próxima célula disponível na coluna A Set nextCell = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1, 0) ' Copie o conteúdo da caixa de texto para a próxima célula disponível nextCell.Value = productName End If End Sub Se você tiver um módulo (se não tiver clique em inserir módulo), e dentro dele crie o seguinte código: Public Sub MeuPrimeiroPrograma() UserForm1.Show End Sub Volte na planilha produto, vá em Desenvolvedor, Macros, e clique em MeuPrimeiroPrograma. Ao invés de você cadastrar o produto na planilha, o formulário é que vai pegar o nome do produto e vai jogar na planilha, escreva maçã e aperte salvar, escreva pera aperte salvar. Viu que bacana? Espero que tenha gostado da aula. -
Feliz Ano Novo, Wash, eu simplifiquei o código. Eu só me preocupei em controlar os clientes e os seus assentos, a mensagem original falava de um ônibus, eu reduzi para um fusca, onde nenhum cliente pode selecionar mais de um assento. Mudando de assunto, você consegue ver por aí porque a atualização do "Projeto semiLaravel - atualização" ficou travado? O pessoal viu que é muita bobeira ou o código é que ocupa muito espaço?
-
O seu código envolve muitos detalhes. Para focar no problema da alocação de clientes para os seus assentos, eu simplifiquei tudo, onde só tenho um pacote que vão levar 3 clientes num fusca, assim: mysql CREATE TABLE cliente ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(255) NOT NULL ); INSERT INTO cliente (nome) values ('Frank'),('João'),('Pedro'); CREATE TABLE poltrona ( id INT AUTO_INCREMENT PRIMARY KEY, poltrona INT NOT NULL, pacote VARCHAR(255) NOT NULL, id_cliente INT, FOREIGN KEY (id_cliente) REFERENCES cliente(id) ); arquivo index.php <?php if(isset($_POST['cliente'])) { try { $conn = new PDO('mysql:host=localhost;dbname=teste', 'root', ''); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $clienteId = $_POST['cliente']; $poltronaId = $_POST['poltrona']; // Verificar se a poltrona já está reservada $stmt = $conn->prepare("SELECT id_cliente FROM poltrona WHERE poltrona = :poltrona"); $stmt->bindParam(':poltrona', $poltronaId); $stmt->execute(); $result = $stmt->fetch(); if ($result && $result['id_cliente']) { echo "<script>alert('Esta poltrona já está reservada!');</script>"; } else { // Atualizar ou inserir a poltrona com o ID do cliente if ($result) { $stmt = $conn->prepare("UPDATE poltrona SET id_cliente = :id_cliente WHERE poltrona = :poltrona"); } else { $stmt = $conn->prepare("INSERT INTO poltrona (poltrona, id_cliente) VALUES (:poltrona, :id_cliente)"); } $stmt->bindParam(':id_cliente', $clienteId); $stmt->bindParam(':poltrona', $poltronaId); $stmt->execute(); } } } catch (PDOException $e) { echo "Erro: " . $e->getMessage(); } } ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Reservar Poltrona</title> </head> <body style="width:500px;margin:0 auto;margin-top:50px;"> <h1>Reservar Poltrona</h1> <form method="post"> <label for="cliente">Cliente:</label> <select name="cliente" id="cliente" required> <option value=''>Selecione um cliente</option> <?php // Conectar ao banco de dados e buscar os clientes não reservados $conn = new PDO('mysql:host=localhost;dbname=teste', 'root', ''); $stmt = $conn->query("SELECT id, nome FROM cliente WHERE id NOT IN (SELECT id_cliente FROM poltrona WHERE id_cliente IS NOT NULL)"); while ($row = $stmt->fetch()) { echo "<option value='{$row['id']}'>{$row['nome']}</option>"; } ?> </select><br><br> <label for="poltrona">Poltrona:</label> <select name="poltrona" id="poltrona" required> <option value=''>Selecione uma poltrona</option> <?php // Buscar poltronas disponíveis $stmt = $conn->query("SELECT * FROM poltrona WHERE id_cliente IS NULL"); $poltronasDisponiveis = $stmt->fetchAll(); // mostrar poltronas disponíveis if (empty($poltronasDisponiveis)) { for ($i = 1; $i <= 3; $i++) { $ocupado=$conn->query("SELECT * FROM poltrona WHERE poltrona=$i")->fetchAll(); if(count($ocupado)==0) { echo "<option value='$i'>Poltrona $i</option>"; } } } ?> </select><br><br> <input type="submit" value="Reservar"> </form> <h2>Reservas Feitas</h2> <ul> <?php // Exibir reservas feitas $stmt = $conn->query("SELECT c.nome, p.poltrona FROM poltrona p JOIN cliente c ON p.id_cliente = c.id WHERE p.id_cliente IS NOT NULL"); while ($row = $stmt->fetch()) { echo "<li>Cliente: {$row['nome']}, Poltrona: {$row['poltrona']}</li>"; } ?> </ul> </body> </html>