
Frank K Hosaka
Membros-
Total de itens
1.585 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
ATUALIZAR BANCO DE DADOS ATRAVÉS DO EXCEL
pergunta respondeu ao joshuat de Frank K Hosaka em Tutoriais & Dicas - SQL Server
Eu nunca pensei em usar o Excel como fonte de dados para o banco de dados. Eu faço o contrário, o Excel é que olha o banco de dados e compara com os valores que eu espero, e ele me calcula quanto falta para eu chegar lá. Seja como for, migrar 400.000 linhas de informação num banco de dados não é nada fácil. A minha sugestão é trabalhar com o time que está ganhando, se o Excel sempre deu motivo de alegria, não há porque abandoná-lo agora. A minha sugestão é exportar 10 linhas lá para o Microsoft Access, veja se você consegue montar um formulário, uma consulta e um relatório. Gaste no máximo 30 minutos. Depois de uma semana, veja se você consegue fazer uma conexão entre o Excel e Access, faça o Excel importar dados ou exportar dados para o Access. O problema do Excel e do Access é que você precisa pagar R$ 459,00 por ano para a Microsoft. Vale a pena pagar. Na internet tem um programa inteiramente grátis, ele se chama WampServe. Você precisa ter uma enorme paciência com ele, ver vários tutoriais, ler bastante, consultar amigos. Se você conseguir instalar, ele trás de graça o banco de dados MySQL e o PHP. Ao contrário do Access, o MySQL é o banco de dados, e o PHP é a ferramenta que você vai utilizar para criar formulário, consulta e relatórios, mas tudo será publicado na janela do navegador. Em 2020 eu experimentei e gostei, principalmente porque o meu celular também tem um navegador. Mas eu devo muito para o Microsoft Access, eu não manjo nada de SQL. Para mexer no MySQL e no PHP você tem que saber como funciona a sintaxe do SQL, e isso eu consegui com a ajuda do Access. O Access tem bastante facilitadores que criam a consulta para você. Depois de pronto e funcionando, você pede para ele mostrar como fazer a mesma consulta em SQL. -
como executar o if so uma vez
pergunta respondeu ao adrsublimacao de Frank K Hosaka em Tutoriais & Dicas - PHP
Como o prouduto se repete inúmeras vezes na mesma fatura, então você pode esquecer o produto_id como referência do desconto. Nesse caso, só sobrou a chave primária da tabela store, onde você não pode usar a função MAX para achar o maior valor, porque com essa função não dá para pegar o id. Você precisa ordenar a tabela store por valor em ordem decrescente, e assim você pega o valor e o id do registro que estiver no topo, assim: <?php // mysql CREATE TABLE `store` (`id` int NOT NULL, `valor` float DEFAULT NULL, // 'idsecao` int DEFAULT NULL, `idu` int DEFAULT NULL,`produto_id` int // DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=innoDB DEFAULT CHARSET=utf8mb4 // COLLATE=utf8mb4_0900_ai_ci (1,10,1,1,1)(2,20,1,1,2)(3,30,1,1,3) $_POST["venda_id"]=1; $cod_id=1; $connect=new PDO('mysql:host=localhost;dbname=laravel',"root",""); $stmt = $connect->query("SELECT id, valor FROM store WHERE idsecao = '".$_POST["venda_id"]."' AND idu = '$cod_id' order by valor desc limit 1"); $maiorValores = $stmt->fetchAll(PDO::FETCH_OBJ)[0]; $maiorValor = $maiorValores->valor; $idMaiorValor = $maiorValores->id; $stmt = $connect->query("SELECT * FROM store WHERE idsecao = '".$_POST["venda_id"]."' AND idu=$cod_id"); $fatura=$stmt->fetchAll(PDO::FETCH_OBJ); echo "<table><th>id<th>valor<th>id<th>desconto"; foreach($fatura as $item){ $desconto=0; if($item->id==$idMaiorValor){$desconto=$item->valor;} echo "<tr><td>$item->id<td>$item->valor<td>$item->id<td>$desconto";} -
Usar um formulário para cadastrar e também para atualizar
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Para ter o endereço absoluto no PHP, eu usei a variável $_SERVER['DOCUMENT_ROOT']. Já no código HTML, eu usei <a href='/Vagas/Controles/Controle.php'. -
Ontem eu vi uma parte do vídeo no YouTube https://youtu.be/uG64BgrlX7o?si=AVfbI-4x_CXZsfeK Ele fala da possibilidade de usar o mesmo formulário tanto para cadastrar uma nova vaga de trabalho, bem como atualizar. Achei interessante. O problema é que ele usa o Composer para montar o autoload.php e também usa a tecnologia do namespace. Talvez esse seja o segredo, mas eu adaptei o código dele, mas sem usar o Composer: arquivo /Vagas/Controles/Controle.php <?php require $_SERVER['DOCUMENT_ROOT'].'/Vagas/Modelos/Config.php'; require MODELO."/Vaga.php"; class Controle { public static function inicio(){ $vagas = Vaga::getVagas(); include VISAO."/Header.php"; include VISAO."/Listagem.php"; include VISAO."/Footer.php";} public function cadastrar($post,$fase){ $obVaga = new Vaga; if($fase==2){ $obVaga->titulo = $post['titulo']; $obVaga->descricao = $post['descricao']; $obVaga->ativo = $post['ativo']; $obVaga->cadastrar(); $this->inicio(); exit;} $id=null; include VISAO.'/header.php'; include VISAO.'/formulario.php'; include VISAO.'/footer.php';} public function excluir($id,$fase){ if(!isset($id) or !is_numeric($id)){ $this->inicio();exit;} if(isset($id)){ $obVaga = Vaga::getVaga($id); if(!$obVaga instanceof Vaga){ $this->inicio();exit;}} if($fase==2){ $obVaga=new Vaga(); $obVaga->excluir($id); $this->inicio();exit;} include VISAO.'/header.php'; include VISAO.'/confirmar-exclusao.php'; include VISAO.'/footer.php';exit;} public function editar($id){ if(!is_array($id)){ $obVaga = Vaga::getVaga($id); if(!$obVaga instanceof Vaga){ $this->inicio();}} if(isset($id['titulo'])){ $obVaga = Vaga::getVaga($id['id']); $obVaga->titulo = $id['titulo']; $obVaga->descricao = $id['descricao']; $obVaga->ativo = $id['ativo']; $obVaga->atualizar(); $this->inicio(); exit;} include VISAO.'/header.php'; include VISAO.'/formulario.php'; include VISAO.'/footer.php';}} $controle=new Controle(); if(isset($_POST)){ $post=$_POST; if(key($post)=='titulo'){ if($post['id']==null){ $controle->cadastrar($post,2);} else { $controle->editar($post);}} if(key($post)=='id'){$id=$post['id'];$controle->excluir($id,2);}} if(isset($_GET)){ $get=$_GET; if(key($get)=='Cadastrar'){$controle->cadastrar($get,1);}} if(key($get)=='inicio'){$controle->inicio();} if(key($get)=='excluir'){$id=$get['excluir'];$controle->excluir($id,1);} if(key($get)=='editar'){$id=$get['editar'];$controle->editar($id);} arquivo /Vagas/Index.php <?php require $_SERVER['DOCUMENT_ROOT'].'/Vagas/Modelos/Config.php'; require CONTROLE."/Controle.php"; Controle::inicio(); arquivo /Vagas/Modelos/Config.php <?php date_default_timezone_set("America/Sao_Paulo"); defined('CAMINHO') || define('CAMINHO',$_SERVER['DOCUMENT_ROOT'].'/Vagas'); defined('CONTROLE') || define('CONTROLE',CAMINHO."/Controles"); defined('VISAO') || define('VISAO',CAMINHO."/Visoes"); defined('MODELO') || define('MODELO',CAMINHO."/Modelos"); defined('TITLE') || define('TITLE','Cadastrar vaga'); defined('HOST') || define('HOST','localhost'); defined('NAME') || define('NAME','laravel'); defined('USER') || define('USER','root'); defined('PASS') || define('PASS',''); arquivo /Vagas/Modelos/Database.php <?php require $_SERVER['DOCUMENT_ROOT'].'/Vagas/Modelos/Config.php'; class Database{ const HOST = HOST; const NAME = NAME; const USER = USER; const PASS = PASS; private $table,$connection; public function __construct($table = null){ $this->table = $table; $this->setConnection();} private function setConnection(){ try{ $this->connection = new PDO('mysql:host='.self::HOST.';dbname='.self::NAME,self::USER,self::PASS); $this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ die('ERROR: '.$e->getMessage());}} public function execute($query,$params = []){ try{ $statement = $this->connection->prepare($query); $statement->execute($params); return $statement; }catch(PDOException $e){ die('ERROR: '.$e->getMessage());}} public function insert($values){ $fields = array_keys($values); $binds = array_pad([],count($fields),'?'); $query = 'INSERT INTO '.$this->table.' ('.implode(',',$fields).') VALUES ('.implode(',',$binds).')'; $this->execute($query,array_values($values)); return $this->connection->lastInsertId();} public function select($where = null, $order = null, $limit = null, $fields = '*'){ $where = !empty($where) ? 'WHERE '.$where : ''; $order = !empty($order) ? 'ORDER BY '.$order : ''; $limit = !empty($limit) ? 'LIMIT '.$limit : ''; $query = 'SELECT '.$fields.' FROM '.$this->table.' '.$where.' '.$order.' '.$limit; return $this->execute($query);} public function update($where,$values){ $fields = array_keys($values); $query = 'UPDATE '.$this->table.' SET '.implode('=?,',$fields).'=? WHERE '.$where; $this->execute($query,array_values($values)); return true;} public function delete($where){ $query = 'DELETE FROM '.$this->table.' WHERE '.$where; $this->execute($query); return true;}} arquivo /Vagas/Modelos/MySQL.sql CREATE TABLE `vagas` ( `id` int NOT NULL AUTO_INCREMENT, `titulo` varchar(255) DEFAULT NULL, `descricao` text, `ativo` enum('s','n') DEFAULT NULL, `data` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci arquivo /Vagas/Modelos/Vaga.php <?php require_once MODELO."/Database.php"; class Vaga{ public $id, $titulo, $descricao, $ativo, $data; public function cadastrar(){ $this->data = date('Y-m-d H:i:s'); $obDatabase = new Database('vagas'); $this->id = $obDatabase->insert([ 'titulo' => $this->titulo, 'descricao' => $this->descricao, 'ativo' => $this->ativo, 'data' => $this->data]); return true;} public function atualizar(){ return (new Database('vagas'))->update('id = '.$this->id,[ 'titulo' => $this->titulo, 'descricao' => $this->descricao, 'ativo' => $this->ativo, 'data' => $this->data]);} public function excluir($id){ $this->id=$id; return (new Database('vagas'))->delete('id = '.$this->id);} public static function getVagas($where = null, $order = null, $limit = null){ return (new Database('vagas'))->select($where,$order,$limit) ->fetchAll(PDO::FETCH_CLASS,self::class);} public static function getVaga($id){ return (new Database('vagas'))->select('id = '.$id) ->fetchObject(self::class);}} arquivo /Vagas/Visoes/Confirmar-exclusao.php <main> <h2 class="mt-3">Excluir vaga</h2> <form method="post" action="../Controles/Controle.php"> <div class="form-group"> <p>Você deseja realmente excluir a vaga <strong><?=$obVaga->titulo?></strong>?</p> <input type=hidden name=id value=<?=$id?>> </div> <div class="form-group"> <a href="../Controles/Controle.php?inicio"> <button type="button" class="btn btn-success">Cancelar</button> </a> <button type="submit" name="excluir" class="btn btn-danger">Excluir</button> </div> </form> </main> arquivo /Vagas/Visoes/Footer.php <!-- .container --> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> </body> </html> arquivo /Vagas/Visoes/Formulario.php <main> <section> <a href="../Controles/Controle.php?inicio"><button class="btn btn-success">Voltar</button></a> </section> <h2 class="mt-3"><?=TITLE?></h2> <form method="post" action='../Controles/Controle.php'> <div class="form-group"><label>Título</label> <input type="text" class="form-control" name="titulo" value="<?=$obVaga->titulo?>"> <input type=hidden name=id value=<?=$id?>> </div> <div class="form-group"><label>Descrição</label> <textarea class="form-control" name="descricao" rows="5"><?=$obVaga->descricao?></textarea> </div> <div class="form-group"><label>Status</label> <div> <div class="form-check form-check-inline"><label class="form-control"> <input type="radio" name="ativo" value="s" checked> Ativo</label> </div> <div class="form-check form-check-inline"><label class="form-control"> <input type="radio" name="ativo" value="n" <?=$obVaga->ativo == 'n' ? 'checked' : ''?>> Inativo </label> </div> </div> </div> <div class="form-group"><input type="submit" class="btn btn-success mt-3"> </div> </form> </main> arquivo /Vagas/Visoes/Header.php <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <title>WDEV Vagas!</title> </head> <body class="bg-dark text-light"> <div class="container"> <div class="jumbotron bg-danger"> <h1>WDEV Vagas</h1> <p>Exemplo de CRUD com PHP orientados a objetos</p> </div> arquivo /Vagas/Visoes/Listagem.php <?php $resultados = ''; foreach($vagas as $vaga){ $resultados .= "<tr> <td>$vaga->id <td>$vaga->titulo <td>$vaga->descricao <td>".($vaga->ativo == 's' ? 'Ativo' : 'Inativo')." <td>".date('d/m/Y à\s H:i:s',strtotime($vaga->data))." <td> <a href='/Vagas/Controles/Controle.php?editar=$vaga->id'> <button type=button class='btn btn-primary'>Editar</button> </a> <a href='/Vagas/Controles/Controle.php?excluir=$vaga->id'> <button type=button class='btn btn-danger'>Excluir</button> </a>";} $resultados = strlen($resultados) ? $resultados : "<tr> <td colspan=6 class='text-center>Nenhuma vaga encontrada";?> <main> <section> <a href='/Vagas/Controles/Controle.php?Cadastrar'> <button class="btn btn-success">Nova vaga</button> </a> </section> <section> <table class="table bg-light mt-3"> <tr><th>ID<th>Título<th>Descrição<th>Status<th>Data<th>Ações <?=$resultados?> </table> </section> </main>
-
Usando foreach para exibir dois arrays ao mesmo tempo
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
A seguir, o mesmo código, utilizando o estilo Bootstrap para melhorar a aparência: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script>function voltar(texto){conta.value=texto}</script> <input id=conta data-bs-toggle=modal data-bs-target="#myModal"> <div class=modal id=myModal> <div class=modal-dialog> <div class=modal-content> <div class=modal-body> <?php $pdo=new PDO("mysql:host=localhost;dbname=mvc","root",""); $stmt=$pdo->query("select * from tbconta where conta<201"); $ativo=$stmt->fetchAll(PDO::FETCH_ASSOC); $stmt=$pdo->query("select * from tbconta where conta>=201"); $passivo=$stmt->fetchAll(PDO::FETCH_ASSOC); $contaPassivo=count($passivo); echo "<table class='table table-striped'>"; foreach($ativo as $key=>$row){ $js="<a data-bs-dismiss='modal' onclick=voltar(this.innerHTML)>"; echo "<tr style=line-height:0px><td>$js".$row['conta']."</a>"; if($key<$contaPassivo){ echo "<td>$js".$passivo[$key]['conta']."</a>";} else { echo "<td>";} } ?> </div> </div> </div> </div> -
Foi em 2020 é que eu vi o PHP foreach pela primeira vez. Eu queria usá-lo para exibir o meu plano de contas na tela do notebook. Só em dezembro de 2023, mais exatamente hoje, é que eu consegui: <?php $pdo=new PDO("mysql:host=localhost;dbname=mvc","root",""); $stmt=$pdo->query("select * from tbconta where conta<201"); $ativo=$stmt->fetchAll(PDO::FETCH_ASSOC); $stmt=$pdo->query("select * from tbconta where conta>=201"); $passivo=$stmt->fetchAll(PDO::FETCH_ASSOC); $contaPassivo=count($passivo); echo "<table style='width:500;margin:0 auto'>"; foreach($ativo as $key=>$row){ echo "<tr><td>".$row['conta']; if($key<$contaPassivo){ echo "<td>".$passivo[$key]['conta'];}}
-
Consegui reduzir o espaço na vertical, quando o <form> está dentro de um <tr>
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Encontrei outro problema, dessa vez com o <input type=date>. A minha lista de CSS ficou assim: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <style> .linha {line-height:0} .linhaDate {line-height: 14} .menos {margin-top:-8px;margin-bottom:-8px} .mais {height:20px} </style> <meta name=viewport content='width=device-width'> <table class='table table-striped w-25 m-0 m-auto mt-5'> <tr class=linha><td><form class=menos><input></form> <tr class=linha><td>Teste <tr class=linha><td>Teste <tr class=linha><td><input class='menos mais' type=submit> <tr class=linhaDate><td><input class=menos type=date value='2023-12-06'> </table> -
Consegui reduzir o espaço na vertical, quando o <form> está dentro de um <tr>
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Encontrei um problema com o <input type=submit>, o CSS style="margin-top:-8px;margin-bottom:-8px" simplesmente "esmaga" o controle. A solução que eu encontrei foi "margin-top:-7px;margin-bottom:-7px;height:20px". -
Eu uso a classe 'table table-striped' do Bootstrap, ele monta tabela bem distribuida, alterando a cor de uma linha para outra. O problema é o espaço entre as linhas. Isso não é problema no notebook que tem 14 polegadas, mas é no celular. Semana passada, eu descobri o CSS line-height:0 que reduz a linha para o tamanho do texto. Mas ele não funciona quando um controle do tipo <form> estiver no meio do caminho. Hoje descobri a solução: <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <meta name=viewport content='width=device-width'> <table class='table table-striped w-25 m-0 m-auto mt-5' style=line-height:0> <tr><td><form style=margin-top:-8;margin-bottom:-8><input></form> <tr><td>Teste <tr><td>Teste </table>
-
como fazer a divisao da taxa de entrega quando é um numero impar
pergunta respondeu ao adrsublimacao de Frank K Hosaka em Tutoriais & Dicas - PHP
Eu sempre jogo a diferença no útlimo item na hora de ratear o frete: <?php function dec($valor){return number_format($valor,2,",",".");} $frete=5; $produtos=['maçã'=>10,"pera"=>20,"laranja"=>30]; $pesoTotal=0; foreach($produtos as $produto=>$peso){$pesoTotal+=$peso;} $ultimoItem=end($produtos); $ultimaChave=key($produtos); $verificador=0; echo "<table><th>Produto<th>Peso<th>Frete"; foreach($produtos as $produto=>$peso){ $fretePorItem=intval($frete*$peso/$pesoTotal*100)/100; $verificador+=$fretePorItem; if($produto==$ultimaChave){$fretePorItem+=$frete-$verificador;} echo "<tr><td>$produto<td>$peso<td align=right>".dec($fretePorItem);} echo "<tr><td><th>Total<th align=right>".dec($frete)."</table>"; -
Na listagem dos marcadores encontrei o <command>. Pedi um código exemplo para o Bard, mas não funcionou. A tag que eu inventei funciona. <!DOCTYPE html> <html lang="pt-br"> <head> <title>Exemplo de comando no HTML5</title> </head> <body> <command id="abrir" type="button" onclick="window.open('https://google.com')">Abrir Google</command> <p> <f onclick="window.open('https://google.com')">Abrir Google</f> </body> </html>
-
O meu conhecimento em HTML é muito precário. Eu queria um plano de contas com texto em preto, mas que ficasse azul quando o usuário passar o mouse por cima da conta (hover). Eu tentei usar o elemento <a> com o Boostrap, mas para mudar a cor do link com o hover, isso eu não consegui. Então tentei o bom e veho CSS, mas ele não tem nenhum efeito no elemento <a>. Só tem efeito se você usar o famoso atributo <a href>, mas aí ele atualiza a página e você perde o controle do fluxo do código. Mudei de marcador, usei o marcador <i>. Funciona do jeito que eu queria, mas as letras ficaram inclinadas. Como o meu conhecimento em HTML só vai até aí, eu não tive outra escolha senão apelar para o método científico da tentativa e erro: <style> f {color:black;text-decoration:none} f:hover{color:blue;} </style> <f>Meu nome é Frank</f> Para a minha surpresa, ele funcionou exatamente do jeito que eu queria. Mas preciso da experiência dos veteranos: isso pode queimar o meu modem?
-
Com a ajuda do Fonte da Página de Exibição do Microsoft Edge eu descobri como o PHP colocou espaço à esquerda do meu texto. O código é esse: <tr><td><a onclick=voltar(this.innerHTML)> <?=$plano[$i][0]." ".$plano[$i][1]?></a> Eu esperava "101 Caixa", mas acabou saindo " 101 Caixa". Usei o método científico da tentativa e erro, e mudei o código para: <tr><td><a onclick=voltar(this.innerHTML)><?=$plano[$i][0]." ".$plano[$i][1]?></a> E assim eu consegui resgatar o texto do jeito que eu pretendia. Moral da história: se você enfeitar o código, o PHP enfeita o resultado.
-
Preencher um formulário com a ajuda de uma tabela
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Excelente resposta, se o plano de contas tivesse apenas cinco contas. No meu caso, tenho 46 contas, e preciso mostrar o máximo que eu puder dentro da tela de um celular. Outro problema bem chato de resolver é o user digitar uma conta que não existe, isso é uma dor de cabeça que eu não sei resolver há três anos. Como só eu uso essa rotina, deixei para o PHP explodir com as suas mensagens. Isso é uma solução bem porcaria, mas é a minha cara, eu só sei improvisar. Eu ainda estou no ambiente mono usuário, o máximo que eu consegui foi utilizar dois usuários. Já o ambiente multiusuário, eu não tenho a menor ideia de como implementar. -
Aqui a ideia é usar o PHP para montar o plano de contas e esconder num <div>. Quando o usuário clicar no <input> da conta devedora, o JavaScript mostra o plano de contas; quando o usuário escolhe a conta, o JavaScript esconde o plano de contas e preenche os dados da conta devedora. Esse é o mesmo raciocínio para conta credora. A grande dificuldade que eu senti foi na função slice do Javascript. Para pegar o lado esquerdo, usei escolha.slice(0,3) e deu certo. Para pegar o lado direito, eu tentei escolha.slice(3,-1), mas não deu certo. Então usei a função substr( ) : <script> var endereçoConta, endereçoDescrição function voltar(escolha){ destino=document.getElementById(endereçoConta) destino.value=escolha.slice(0,3) destino=document.getElementById(endereçoDescrição) tamanho=escolha.length-3; destino.innerHTML=escolha.substr(3,tamanho) conta.style.display='none'} function escolha(voltarConta,voltarDescrição){ conta.style.display='block' this.endereçoConta=voltarConta this.endereçoDescrição=voltarDescrição} </script> <div id=conta style=display:none> <table style="width:250px;margin:0 auto;margin-top:100"> <tr><td>Escolha uma conta: <?php $contas=[[101,'Banco'],[201,'Patrimônio'],[301,'Salário'],[401,'Despesa']]; foreach($contas as $conta): ?> <tr><td><a onclick=voltar(this.innerHTML)><?=$conta[0]." ".$conta[1]?></a> <?php endforeach; ?> </table> </div> <table style="width:250px;margin:0 auto;margin-top:100"><th style=width:50px><th> <tr><td>ContaD<td><input id=ContaD onclick="escolha('ContaD','DescriçãoD')" size=2> <a id=DescriçãoD></a> <tr><td>ContaC<td><input id=ContaC onclick="escolha('ContaC','DescriçãoC')" size=2> <a id=DescriçãoC></a> </table>
-
Para reduzir o espaço da linha do Bootstrap eu usei o CSS line-height:0. Para não usar o espaço além do previsto, eu não usei o CSS nowrap. O problema são os textos longos, ele acaba se sobrepondo e tornando ilegível o texto. Como eu não consegui fazer funcionar o Bootstrap overflow e nem no CSS, eu tive que apelar para o PHP: <?php function ellipsis($texto){ if(strlen($texto)>44){ return substr($texto,0,44)." ...";} else { return $texto;}} ?> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <table style=line-height:0 class='table table-striped w-25 m-auto mt-5'> <tr><th><?=ellipsis("Prioridades do Cop-28")?> <tr><td><?=ellipsis("Acabar com o uso dos combustíveis fósseis e a queimada na floresta")?> <tr><td><?=ellipsis("Acabar com o poder Supremo")?> <tr><td><?=ellipsis("Acabar com a reeleição")?> </table>
-
modelos, visões e controles: a soma de todos os débitos e créditos
uma questão postou Frank K Hosaka PHP
Estou estudando a programação orientada a objetos (POO) na base da tentativa e erro. Hoje eu queria criar um controle chamado diário, e dentro dele eu queria usar uma variável privada chamada diário. O PHP entrou num looping infinito, assim eu precisei mudar o nome da classe para controleDiário, e assim descobri porque os controladores tem o sufixo de Controller em seus nomes. Eu decidi usar o controle como prefixo. Outra coisa bacana é a definição das variáveis utilizada dentro da classe como privada. Eu queria mudar para público, isso me pouparia de escrever pelo menos dois métodos. Mas veio um enorme peso na consciência e decidi não mexer no tipo das variáveis utilizadas dentro da classe, decidi mandar o resultado de três consultas dentro de um vetor. Enfim, o POO é chato, mas dá para fazer gambiarra. arquivo mvc/controles/controleDiário.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/diário.php'; require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php'; class controleDiário { private $diário; public function __construct(){ $this->diário=new diário();} public function início($dia){ $consultas=$this->diário->consulta($dia); $lçtos=$consultas[0]; $somaDébito=$consultas[1]; $somaCrédito=$consultas[2]; require $_SERVER['DOCUMENT_ROOT']."/mvc/visões/diário.php";exit;}} $diário=new controleDiário(); if(isset($_POST['novaData'])){$diário->início($_POST['novaData']);} if(isset($_GET)){$dia=date('Y-m-d');$diário->início($dia);} arquivo mvc/modelos/diário.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php'; class diário extends conexão { private $pdo; public function __construct(){ $this->pdo=conexão::instância();} public function consulta($dia){ $stmt=$this->pdo->query("select sum(valor) as somaDébito from diário where contaD>0 and dia='$dia'"); $somaDébito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaDébito']; $stmt=$this->pdo->query("select sum(valor) as somaCrédito from diário where contaC>0 and dia='$dia'"); $somaCrédito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaCrédito']; $stmt=$this->pdo->query("select * from diário where dia='$dia'"); return [$stmt->fetchAll(PDO::FETCH_OBJ),$somaDébito,$somaCrédito];}} arquivo mvc/visões/diário.php <?php include $_SERVER['DOCUMENT_ROOT']."/mvc/visões/menu.php"; ?> <table class='table table-striped'> Lançamentos do dia <form method=post action='../controles/controleDiário.php'> <input type=date name=novaData value=<?=$dia?> onchange=submit()> </form> <th>lçto<th>contad<th>contac<th>valor<th>hist <?php foreach($lçtos as $lçto): ?> <tr> <td><?=$lçto->lçto?> <td><?=$lçto->contad?> <td><?=$lçto->contac?> <td class=text-end><?=dec($lçto->valor)?> <td><?=$lçto->hist?> <?php endforeach; ?> <tr><td><td><td><td><?=dec($somaDébito)?><td>Soma dos Débitos <tr><td><td><td><td class=text-danger><?=dec($somaCrédito)?> <td class=text-danger>Soma dos Créditos -
A possiblidade de usar o marcador <a> com o método POST
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Hoje eu perguntei de novo ao safado Bard para saber onde ele conseguiu a informação, e olha só o que ele respondeu: Não, não é possível usar o método post com o marcador <a>. O método post é um método HTTP usado para enviar dados para um servidor. O marcador <a>, por outro lado, é um marcador HTML usado para criar links. Os marcadores <a> não podem ser usados para enviar dados para um servidor. Esse Bard herdou a mesma característica do motor de busca do Google, a cada hora tem resposta diferente! -
O meu conhecimento em HTML é bastante precário, mas foi graças ao PHP que conheci em 2020 é que aprendi o que é <table>, <form>, <input> e o <a>. Nesses três últimos anos, usei o marcador <a> com o método GET. Achei meio rídiculo perguntar ao Bard se é possível usar o método POST com o marcador <a>, olha só o que ele respondeu: Sim, é possível criar uma solicitação POST usando o elemento <a>. Para isso, basta definir o atributo method do elemento como post e o atributo href como a URL do servidor que receberá a solicitação. Por exemplo, o seguinte código criará uma solicitação POST para a URL https://example.com/api/v1/login: HTML <a href="https://example.com/api/v1/login" method="post"> Login </a> Fiquei entusiasmado, fui logo fazer um teste de campo assim: mvc/view/viewLogin.php <a href="/mvc/controller/controller.php" method="post" data="nome=Frank">Teste</a> mvc/controller/controller.php <?php class controller { } if(isset($_POST)){var_dump($_POST);} Mas na hora de fazer o teste, não consegui transportar os dados do view para o controller. Se o Bard estiver certo, o que eu fiz de errado?
-
Eu uso esses dois comandos, quando preciso trabalhar com MVC: <?php echo $_SERVER['DOCUMENT_ROOT']; // C:\wamp64\www echo __DIR__; // C:\wamp64\www\astudy Sem dúvida, o primeiro comando é o melhor e é com ele que eu monto o endereço absoluto dos arquivos que o PHP precisa trabalhar, tipo require $_SERVER['DOCUMENT_ROOT'].'/astudy/Controller/produtoController.php'; já o segundo comando é problema, ele diz em que diretório se encontra o código que está sendo executado.
-
Ontem o Omar do iMaster me apresentou a função spl, ele é ótimo para quem está estudando MVC. Ele é mais ou menos assim: function my_autoloader($class){include 'model/'.$class.'.php';} spl_autoload_register('my_autoloader'); Eu hospedei o código no index.php. Se você for tentar chamar uma classe assim $produto=new produto() e se ele não encontrar a classe, nesse caso, o PHP vai procurar a solução no spl_autoload, nesse caso particular ele vai procurar o arquivo model/produto.php. Eu gostei dessa função, assim eu fiquei imaginando em usar a função para abrir um arquivo da pasta view, por exemplo, o viewMenu. O viewMenu não é uma classe, mas sim um formulário. Mesmo assim, o truque funciona, assim: function my_autoloader($class){ if(substr($class,0,4)=="view"){ require 'View/'.$class.'php';} spl_autoload_register('my_autoloader'); Para fazer funcionar, eu escrevi $view=new viewMenu( ). E funcionou! Esse é um recurso super bacana, bem como as constantes do define('constante','valor'). O problema é que o ciclo de vida deles é bem curto. Qualquer solicitação post ou get acaba com a vida deles. O mesmo drama acontece com as classes do MVC. Pesquisei um pouco mais o PHP e ouvi dizer que existe uma extensão chamada phpize que dá vida a essas mágicas para todos os módulos do PHP, mas na hora de procurar na internet, eu não achei a extensão para o Windows. Além de não achar a extensão, eu descobri que a função right( ) e left( ) não funcionam no meu código, apesar da versão ser 8.2. Eu tive que trocar por substr($variavel,0,4) para os primeiros quatro caracteres da esquerda e substr($variavel,-4) para os quatro últimos caracteres da direita. Enfim, não me resta outra escolha senão continuar com a minha improvisação, usar a minha imaginação para dar mais vida a uma variável local o máximo que eu puder.
-
<?php $zip = new ZipArchive(); $zip->open('arquivo.zip', ZipArchive::CREATE); $zip->addFile('index.php', 'index.php'); $zip->close();
-
como fazer um foreach nessa string
pergunta respondeu ao adrsublimacao de Frank K Hosaka em Tutoriais & Dicas - PHP
<?php $string='{"paging":{"offset":0,"limit":100,"total":37},"results":[ {"reason":"Plano Fidelidade 2","status":"active","subscribed":0,"back_url":"https://webhook.site/26b1e008-b05b-4b7a-a767-29bc21866c04","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018bff3b0a600e2c","date_created":"2023-11-23T22:49:01.280-04:00","id":"2c9380848bebed70018bff3b0a600e2c","last_modified":"2023-11-23T23:05:33.382-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://pednowhats.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018bff38e68d0e2a","date_created":"2023-11-23T22:46:41.037-04:00","id":"2c9380848bebed70018bff38e68d0e2a","last_modified":"2023-11-23T22:46:41.037-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://seu.site.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebedbc018c02446c111018","date_created":"2023-11-24T12:58:07.761-04:00","id":"2c9380848bebedbc018c02446c111018","last_modified":"2023-11-24T12:58:07.761-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://seu.site.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018c02451f6c0f9c","date_created":"2023-11-24T12:58:53.676-04:00","id":"2c9380848bebed70018c02451f6c0f9c","last_modified":"2023-11-24T12:58:53.676-04:00","application_id":7489360988572536}]}'; $js=json_decode($string); $results=$js->results; $values=[]; foreach($results as $result){ $amount=$result->auto_recurring->transaction_amount; $values[]="('$result->id','$result->reason',$amount)";} $connect=new mysqli("localhost","root","","laravel"); foreach($values as $value){ $connect->query ("insert into plano (id,reason,transaction_amount) values $value");} Usei a seguinte tabela: CREATE TABLE `plano` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `reason` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `transaction_amount` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci -
Intranet é um trabalho bem difícil. Eu levei várias semanas para fazer um notebook enxergar outro notebook, usando a rede Windows, tudo na base da tentativa e erro. Depois que eu consegui os dois notebook se enxergarem, levei várias semanas para instalar uma impressora e compartilhar na rede. Tentei pelo Wi-Fi. Foi um desastre. Botei logo um cabo de rede nos três aparelhos. Agora, para fazer o celular enxergar a rede Windows, isso eu não consegui. O mais difícil é entender a gramática do manual do Windows, ele é muito difícil de entender. De 1999 até 2020 eu só consegui a intranet na base de cabo de rede. Em 2020 eu conheci o WampServe para Windows. Levei várias semanas para instalar e entender como funcionava, o mais difícil foi criar uma tal de porta 80. Mexer no Windows é difícil, e mexer no firewall é bem mais difícil. Mas enfim depois de vinte tentativas e três meses, eu consegui instalar o Wamp Server. Ele funciona que é uma maravilha, ele conecta os notebooks e a impressora tudo pelo WiFi. Depois de 2020, o WampServe teve várias atualizações, mas eu não atualizei nada. Tenho pavor de mexer nele. Aqui em Diadema, não encontro ninguém que entenda de WampServe e muito menos Windows.
-
Hoje eu executo o Laravel pelo Hostinger, mas sempre faço o backup do Hostinger para o meu notebook. Tentei abrir o Laravel no notebook com "localhost/laravel", e deu certo! Antigamente, eu tinha que abrir o VS Code, usar a linha de comando, digitar "php artisan serve", depois usar "localhost:8000" no navegador.