
Frank K Hosaka
Membros-
Total de itens
1.533 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
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>
-
Como criar um código Sku no vba
pergunta respondeu ao Pedro Dantas de Negreiros Neto de Frank K Hosaka em VBA
Na célula a1 tenho Categoria, na célula b1 tenho Foto, na célula c1 tenho Junção. Na célula a2 tenho 1, na célula b2 tenho 1, na célula c2 tenho a função =TEXTO(A2;"00")&"."&TEXTO(B2;"000"), o que dá 01.001 Eu não entendi a função do formulário e do VBA. Se que copiar a fórmula da célula C2 na célula C3, você usa o comando copiar e colar. Se eu entendi tudo errado, tem jeito mostrar o esquema do formulário (tire uma foto com o comando printScreen) e também uma lista do código que está dando problema? Sem ver o código, fica dificil saber o que está acontecendo. -
Projeto semiLaravel, introduzindo o operador BETWEEN na classe bd
uma questão postou Frank K Hosaka PHP
Hoje o dia foi bem complicado, pedi para o Copilot me ajudar com o operador BETWEEN, e ele introduziu o conceito de depurador, e a partir daí acabei me desentendo com o Copilot. Pensei que o meu problema era a gambiarra que eu fiz no autoload, então decidi tentar introduzir o BETWEEN sem a ajuda do Copilot. O depurador do Copilot é assim: echo $sql. Eu não entendi o que estava acontecendo. Mas mudei o código assim: echo $sql."<br>"; e tudo fez sentido, e foi justamente com a ajuda do depurador é que consegui introduzir o BETWEEN na classe bd. Quanto ao autoload, eu trouxe a versão original. Já a classe das tabelas ficou assim class tbdiario extends bd { }. No meio de tanta confusão, acabei gostando da função getTableName na classe bd, ele é capaz de saber o nome da tabela que foi invocada, e o VS Code não reclama que a classe tabela está ausente. O código seguinte vai executar esse tipo de consulta: $debitos=array_column(tbdiario::groupBy('contad') ->select(['contad','sum(valor) as debito'], [['dia','BETWEEN',[$primeiroDia,$ultimoDia]]]),'debito','contad'); listagem parcial do arquivo config.php 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 $pdo; private static $initialized = false; private static $orderBy = ''; private static $groupBy = ''; private static $bindings = []; 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; } } protected static function getPdo() { self::initialize(); return self::$pdo; } protected static function getTableName() { $reflection = new \ReflectionClass(static::class); return strtolower($reflection->getShortName()); } public static function orderBy($column, $direction = 'ASC') { self::$orderBy = "ORDER BY $column $direction"; return new static; } // Adicionando o método groupBy public static function groupBy($columns) { if (is_array($columns)) { $columns = implode(', ', $columns); } self::$groupBy = "GROUP BY $columns"; return new static; } public static function select($columns = '*', $conditions = []) { 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 (self::$groupBy) { $sql .= ' ' . self::$groupBy; self::$groupBy = ''; // Reset groupBy after use } if (self::$orderBy) { $sql .= ' ' . self::$orderBy; self::$orderBy = ''; // Reset orderBy after use } // echo $sql."<br>"; // depurador $stmt = self::getPdo()->prepare($sql); foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } } class tbconta extends bd { } class tbdiario extends bd { } class tbusuarios extends bd { } -
Projeto semiLaravel, eliminando a classe tabela [não deu certo]
uma questão postou Frank K Hosaka PHP
** estou tentando implantar a condição between, e vejo que a ideia de eliminar a classe tabela está atrapalhando ** O Laravel tem uma pasta chamada Model e dentro dela tem um arquivo para cada tabela na forma de classe. No projeto semiLaravel eu só trabalho no diretório raiz e pensei em eliminar a classe que representa a tabela, passando a tarefa de criar a classe tabela para o autoload, conforme a necessidade do código. Eu não sou capaz de criar um código desse tipo, mas o Copilot sim: ** o grande efeito colateral é a tela do VS Code, ele sempre vai reclamar que a classe tabela não existe ** listagem parcial do config.php <?php spl_autoload_register(function ($class) { $path = str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'; if (file_exists($path)) { require $path; } else { eval("class $class extends bd {}"); } }); class bd { private static $pdo; private static $initialized = false; private static $orderBy = ''; private static $groupBy = ''; // Adicionando a variável para a cláusula GROUP BY 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; } } protected static function getPdo() { self::initialize(); return self::$pdo; } protected static function getTableName() { return strtolower((new \ReflectionClass(static::class))->getShortName()); } public static function orderBy($column, $direction = 'ASC') { self::$orderBy = "ORDER BY $column $direction"; return new static; } // Adicionando o método groupBy public static function groupBy($columns) { if (is_array($columns)) { $columns = implode(', ', $columns); } self::$groupBy = "GROUP BY $columns"; return new static; } public static function select($columns = '*', $conditions = []) { self::initialize(); $table = static::getTableName(); if (is_array($columns)) { $columns = implode(', ', $columns); } $whereClause = ''; if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $operator = $condition[1]; $value = $condition[2]; $whereClause .= "$field $operator :$field AND "; } $whereClause = 'WHERE ' . rtrim($whereClause, ' AND '); } $sql = "SELECT $columns FROM $table $whereClause"; if (self::$groupBy) { $sql .= ' ' . self::$groupBy; self::$groupBy = ''; // Reset groupBy after use } if (self::$orderBy) { $sql .= ' ' . self::$orderBy; self::$orderBy = ''; // Reset orderBy after use } $stmt = self::getPdo()->prepare($sql); if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $value = $condition[2]; $stmt->bindValue(":$field", $value); } } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } } -
Projeto semiLaravel, introduzindo a função groupBy na classe bd
uma questão postou Frank K Hosaka PHP
Para executar esse comando: $debitosAnteriores=array_column(tbdiario::groupBy('contad') ->select(['contad','sum(valor) as debito_anterior'], [['dia','<',$primeiroDia]]),'debito_anterior','contad'); eu precisei alterar a classe bd: listagem parcial de config.php <?php class bd { private static $pdo; private static $initialized = false; private static $orderBy = ''; private static $groupBy = ''; // Adicionando a variável para a cláusula GROUP BY 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; } } protected static function getPdo() { self::initialize(); return self::$pdo; } protected static function getTableName() { return ''; // Será implementado na classe filha } public static function orderBy($column, $direction = 'ASC') { self::$orderBy = "ORDER BY $column $direction"; return new static; } // Adicionando o método groupBy public static function groupBy($columns) { if (is_array($columns)) { $columns = implode(', ', $columns); } self::$groupBy = "GROUP BY $columns"; return new static; } public static function select($columns = '*', $conditions = []) { self::initialize(); $table = static::getTableName(); if (is_array($columns)) { $columns = implode(', ', $columns); } $whereClause = ''; if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $operator = $condition[1]; $value = $condition[2]; $whereClause .= "$field $operator :$field AND "; } $whereClause = 'WHERE ' . rtrim($whereClause, ' AND '); } $sql = "SELECT $columns FROM $table $whereClause"; if (self::$groupBy) { $sql .= ' ' . self::$groupBy; self::$groupBy = ''; // Reset groupBy after use } if (self::$orderBy) { $sql .= ' ' . self::$orderBy; self::$orderBy = ''; // Reset orderBy after use } $stmt = self::getPdo()->prepare($sql); if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $value = $condition[2]; $stmt->bindValue(":$field", $value); } } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } } class tbdiario extends bd { protected static function getTableName() { return 'tbdiario'; } } class tbconta extends bd { protected static function getTableName() { return 'tbconta'; } } class tbusuarios extends bd { protected static function getTableName() { return 'tbusuarios';}} -
formulario de pesquisa, retornar dados em branco quando a base de dados estiver em branco
pergunta respondeu ao ACRMENDES de Frank K Hosaka em VBA
rs é abreviatura de recorset, eu usava isso quando trabalhava com o MS Access dentro do MS Excel, e o código era mais ou menos assim: Sub LerEGravarValoresNoAccess() Dim ws As Worksheet Dim db As Object Dim rs As Object Dim strDBPath As String Dim i As Integer ' Definir a planilha onde os dados estão Set ws = ThisWorkbook.Sheets("NomeDaSuaPlanilha") ' Altere o nome da planilha conforme necessário ' Caminho do banco de dados do Access strDBPath = "C:\Caminho\Para\Seu\BancoDeDados.accdb" ' Altere para o caminho do seu banco de dados ' Abrir conexão com o banco de dados do Access Set db = CreateObject("DAO.DBEngine.120").OpenDatabase(strDBPath) ' Definir o Recordset para a tabela onde os dados serão gravados Set rs = db.OpenRecordset("NomeDaSuaTabela", 2) ' Altere o nome da tabela conforme necessário ' Ler e gravar valores no banco de dados do Access For i = 1 To 3 ' Assumindo que os valores estão nas células A1:A3 e B1:B3 rs.AddNew rs.Fields("Orcamento").Value = ws.Cells(i, 1).Value ' Assumindo que os valores do orçamento estão na coluna A rs.Fields("Valor").Value = ws.Cells(i, 2).Value ' Assumindo que os valores estão na coluna B rs.Update Next i ' Fechar o Recordset e o banco de dados rs.Close db.Close ' Limpar objetos Set rs = Nothing Set db = Nothing End Sub Mas eu não tenho certeza se você está falando do MS Access, pois você só fala em "banco de dados", e assim fica difícil oferecer qualquer tipo de ajuda, eu não sei se você conseguiu conectar o Excel no banco de dados, eu não sei se você sabe usar critério de consulta, e o pior é que também não sei se o formulário tem uma caixa de texto chamado txt_ValorOrcamento, onde qualquer erro de digitação impede que o valor esperado apareça no local esperado. -
Estou montando o projeto na base da tentativa e erro, pois eu não entendo nada de lógica. Tenho muita ajuda do Copilot, fico contente quando o código funciona, entender o código, isso sim é uma tarefa difícil. O primeiro problema é do roteador é que eu precisei criar o arquivo .htaccess para mandar todas as solicitações para o arquivo index.php, ele funciona aqui no notebook que usa o Apache. Mas lá no Hostinger, ainda não sei se o código vai funcionar. Eu consegui executar o código do login com a primeira versão do roteador. Mas na hora de testar um novo código que trabalha com datas, o programa travou. O meu roteador foi projetado para executar classe:metodo( ). Tive que mudar tudo, precisei mudar o código para suportar classe:metodo(argumento), ele ficou assim: arquivo index.php <?php require('config.php'); $requestUri = $_SERVER['REQUEST_URI']; $basePath = '/semiLaravel/'; $path = substr($requestUri, strlen($basePath)); if ($path == "") { $path = "loginLogin()"; } // Ajuste a regex para capturar argumentos no formato classeMetodo(arg) if (preg_match('/^([a-z]+)([A-Z][a-zA-Z]*)\((.*)\)$/', $path, $matches)) { $classe = $matches[1]; $metodo = $matches[2]; $argumento = $matches[3]; // Supondo que o método aceita um argumento if (!empty($argumento)) { $classe::$metodo($argumento); } else { $classe::$metodo(); } } else { echo "Formato de URL inválido."; } ?>
-
O meu código PHP usa um query builder bem simples (PDO->query()), mas na semana passada o Copilot viu o meu código e ele comentou que ele é vulnerável a um ataque do tipo "injeção de SQL", ele sugeriu eu separar a consulta dos parâmetros da consulta. Já que preciso mudar a minha query builder, então que seja mais ou menos no formato do Eloquent, mas hoje o dia foi terrível, eu e o Copilot ficamos o dia todo preso nesse código: if ($lcto) { $btnMenu = "Acrescenta Lançamento"; } else { $lcto = tbdiario::orderBy('lcto', 'DESC')->select('lcto')[0]->lcto+1; } $dia = isset($_SESSION['dia']) ? $_SESSION['dia'] : date('Y-m-d'); $ativo = tbconta::select('*', [['conta', '<', 201]]); O Copilot trabalhou duro, e várias vezes ele reclamou que a minha codificação é uma porcaria; tentei fazer do jeito dele, e não deu certo. Exausto, o Copilot me sugeriu executar uma consulta de cada vez, e para a minha perplexidade, eles funcionam de maneira separada. Eu inverti a ordem da consulta, e o código andou. O Copilot pensou, pensou e pensou e concluiu que o problema era a função orderBy( ). Ele inventou um comando do tipo reset para a função orderBy( ), e agora consigo executar o meu programa do jeito que eu listei. A seguir eu mostro o query builder que eu chamei de semiLaravel. O Laravel coloca todas as classes na pasta Model, no PHP eu não trabalho com nenhuma pasta. No caso do banco de dados, eu joguei tudo dentro do arquivo config.php, assim: listagem parcial do arquivo config.php class bd { private static $pdo; private static $initialized = false; private static $orderBy = ''; 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; } } protected static function getPdo() { self::initialize(); return self::$pdo; } protected static function getTableName() { return ''; // Será implementado na classe filha } public static function orderBy($column, $direction = 'ASC') { self::$orderBy = "ORDER BY $column $direction"; return new static; } public static function select($columns = '*', $conditions = []) { self::initialize(); $table = static::getTableName(); if (is_array($columns)) { $columns = implode(', ', $columns); } $whereClause = ''; if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $operator = $condition[1]; $value = $condition[2]; $whereClause .= "$field $operator :$field AND "; } $whereClause = 'WHERE ' . rtrim($whereClause, ' AND '); } $sql = "SELECT $columns FROM $table $whereClause"; if (self::$orderBy) { $sql .= ' ' . self::$orderBy; self::$orderBy = ''; // Reset orderBy after use } $stmt = self::getPdo()->prepare($sql); if (!empty($conditions)) { foreach ($conditions as $condition) { $field = $condition[0]; $value = $condition[2]; $stmt->bindValue(":$field", $value); } } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } } class tbdiario extends bd { protected static function getTableName() { return 'tbdiario'; } } class tbconta extends bd { protected static function getTableName() { return 'tbconta'; } } class tbusuarios extends bd { protected static function getTableName() { return 'tbusuarios';}} ?>