
Frank K Hosaka
Membros-
Total de itens
1.623 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
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.
-
Eu encontrei um erro brutal no meu projeto MVC produtos, ele tinha que fazer uma lista de 8 produtos em 4 colunas, e ele acabou listando mais de 8 produtos, repetindo um ou outro produto que já tinha sido publicado. Tive que parar tudo e corrigir a lógica. Eu consegui corrigir o problema para 4 colunas, mas não sei como fazer a quinta coluna. <?php function colunar($itens,$colunas){ $contagem = count($itens); $linhas=intval($contagem/$colunas); if($contagem/$colunas>$linhas){$linhas++;} echo "<tr><td colspan=4>$colunas colunas<tr>"; for($iLinha=0;$iLinha<$linhas;$iLinha++){ for($iColuna=0;$iColuna<=$colunas;$iColuna++){ if(($iLinha+$iColuna*$linhas)<$contagem){ echo "<td>".$itens[$iLinha+$iColuna*$linhas];}} echo "<tr>";}} echo "<table>"; $itens=[0,1,2,3,4,5,6,7]; colunar($itens,1); colunar($itens,2); colunar($itens,3); colunar($itens,4); colunar($itens,5);
-
ScriptIn.php, um jeito de testar o MVC projeto produto
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
O programa ScriptOut.php faz justamente o contrário. Ele varre o diretório astudy do meu notebook, e lista todos os arquivos bem como o código fonte do arquivo para eu poder publicar no fórum. O problema é que eu não sei como exibir o código fonte do PHP na tela do navegador, a não ser usando a opção do código fonte do navegador: <?php $script=""; $arquivos = scandir("astudy"); array_shift($arquivos); // retira . array_shift($arquivos); // retira .. foreach ($arquivos as $arquivo) { if(is_dir("astudy/$arquivo")){ $diretorio="astudy/$arquivo"; $files=scandir($diretorio); array_shift($files); array_shift($files); foreach($files as $file){ $script.="arquivo /$diretorio/$file\n"; $script.=file_get_contents("$diretorio/$file")."\n\n";}} else { $script.="arquivo /astudy/$arquivo\n"; $script.=file_get_contents("astudy/$arquivo")."\n\n"; }} echo $script; // não é possível ver o código fonte do PHP pelo comando echo // favor usar o comando exibir código fonte do navegador -
A minha sugestão é instalar o arquivo ScriptIn.php no diretório C:\wamp64\www. Você copia todo código fonte do tópico MVC projeto produto no mesmo diretório com o nome de script.txt. Em seguida você digita no navegador "localhost/scriptin", e o programa vai criar a pasta astudy, bem como as outras pastas e arquivos. Depois disso, basta você digita "localhost/astudy", para você conhecer o projeto produtos. arquivo c:/wamp64/www/ScriptIn.php <?php if (!is_dir("astudy")){ mkdir("astudy"); mkdir("astudy/Controller"); mkdir("astudy/Model"); mkdir("astudy/View");} $script=file_get_contents("script.txt"); $ocorrencias=substr_count($script,"arquivo /astudy/"); $substring = "arquivo /astudy/"; $posicao = []; $posicao[0]=strpos($script,$substring); for($i=1;$i<=$ocorrencias-1;$i++){ $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);} $codigo=[]; for($i=0;$i<=$ocorrencias-2;$i++){ $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);} $codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]); for($i=0;$i<=$ocorrencias-1;$i++){ $lines=explode("\n",$codigo[$i]); $arquivo=trim(substr($lines[0],9)); $criar=fopen($arquivo,"w"); $tamanhoNome=strlen($arquivo)+9; $conteudo=trim(substr($codigo[$i],$tamanhoNome)); file_put_contents($arquivo,$conteudo); fclose($criar);} echo "Trabalho encerrado";
-
Eu pedi um roteador para o Bard, mas o exemplo que ele passou usa a tecnologia Laravel, certamente não vai funcionar no ambiente PHP. Aqui no fórum estou publicando o projeto MVC produtos, e eu uso o arquivo index.php como roteador. O problema de você usar o index.php como roteador é que você só pode usar uma única chave, não pode usar a mesma chave várias vezes. No meu caso, eu só tenho a tabela produto, assim eu posso usar <input name=incluir> <input name=excluir> <input name=alterar> O problema é quando eu precisar criar uma outra tabela que precisa incluir, excluir e alterar um registro. Nesse caso, usar o index.php é um péssimo negócio. O único jeito que eu encontrei para resolver isso foi através de gambiarra, ou seja, usar o controlador como roteador, assim: /atest/Controller/testeController.php <?php class teste{public function ola(){echo "olá mundo!";}} if(isset($_GET['ola'])){ $teste=new teste(); $teste->ola();} /atest/View/viewTeste.html <form action="../Controller/testeController.php"> <input type=submit name=ola value="Me Clique"> </form> <a href="../Controller/testeController.php?ola">Me Clique</a> /atest/index.php <?php header('location:View/viewTeste.html');
-
// histórico das atualizações no projeto produtos 18/11/23 foi criado conexao.php, tornando possível todo código se reportar a apenas uma conexão. 19/11/23 foi criado viewAtualizar.php 20/11/23 criei o código ScripIn.php para ajudar a testar o MVC projeto produtos. 21/11/23 criei o código ScripOut.php para publicar o projeto no fórum. 22/11/23 acrescentei a rotina de alteração e inclusão de produtos, bem como mudei o roteador do index.php para o controlador 23/11/23 acrescentei a rotina do orçamento
-
Usei o meu programa ScriptOut.php para publicar todos os arquivos e os respectivos conteúdos da pasta astudy aqui. Agora, sugiro você copiar todo o texto e salvar em script.txt no diretório C:/wamp64/www, e em seguida executar o programa ScriptIn.php que publiquei em outro tópico, ele vai montar o diretório astudy e todos os arquivos do projeto no seu computador. arquivo /astudy/Controller/orçamentoController.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/produto.php"; require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/funções.php"; class orçamentoController { private $produto; public function __construct(){$this->produto=new produto();} public function produto(){ $produtos=$this->produto->listarTudo(); $irPara="Controller/orçamentoController"; require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewFiltro.php";exit;} public function inicio(){ $soma=0; $itens=[]; $_SESSION['itens']=[]; require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function acrescentaItem($prod){ $soma=0; $_SESSION['itens'][]=$prod; $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function excluir($key){ $soma=0; array_splice($_SESSION['itens'],$key,1); $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function alterar($alterar,$chave){ $soma=0; $_SESSION['itens'][$chave][1]=$alterar; $_SESSION['itens'][$chave][4]=$alterar*$_SESSION['itens'][$chave][3]; $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;}} $get=$_GET; $class=new orçamentoController(); if(key($get)=='produto'){$class->produto();} if(key($get)=='inicio' || key($get)=='apagar'){$class->inicio();} if(key($get)=='id'){ $prod=$get['prod']; $un=$get['un']; $preço=$get['preço']; $total=$get['preço']; $class->acrescentaItem([$prod,1,$un,$preço,$total]);} if(key($get)=='excluir'){$class->excluir($get['excluir']);} if(key($get)=='alterar'){$class->alterar($get['alterar'],$get['chave']);} arquivo /astudy/Controller/produtoController.php <?php require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/produto.php"; class produtoController { private $produto; public function __construct(){ $this->produto=new produto();} public function criarTabela(){$this->produto->criarTabela();} public function listar(){ $produtos=$this->produto->listar(); $contagem=count($produtos); $colunas=4; $numLinhas=intval($contagem/$colunas); if($contagem/$colunas>$numLinhas){$numLinhas++;} require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewProduto.php';exit;} public function filtrar($filtro){ $produtos=$this->produto->filtrar($filtro); $irPara="View/viewAtualizar"; require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function atualizar($dados){ $irPara="View/viewAtualizar"; $produtos=$this->produto->atualizar($dados); require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function incluir($dados){ $produtos=$this->produto->incluir($dados); require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function excluir($dados){ $produtos=$this->produto->excluir($dados);}} if(isset($_GET)){ $get=$_GET; $classe=new produtoController(); if(key($get)=="criarProdutos"){$classe->criarTabela();} if(key($get)=="verProdutos"){$classe->listar();} if(key($get)=="item"){$classe->filtrar($get['item']);} if(key($get)=="atualizar"){$classe->atualizar($get['atualizar']);} if(key($get)=="excluir"){$classe->excluir($get['excluir']);} if(key($get)=="incluir"){$classe->incluir($get['incluir']);}} arquivo /astudy/Model/conexao.php <?php class conexao { private static $pdo; public function __construct(){} public static function getInstance(){ if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=laravel","root","");} return self::$pdo;}} arquivo /astudy/Model/funções.php <?php function nf($número){return number_format($número,2,',','.');} arquivo /astudy/Model/produto.php <?php require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/conexao.php"; class produto { private $pdo; public function __construct(){ $this->pdo=conexao::getInstance();} public function criarTabela(){ $tabela='produto'; $stmt=$this->pdo->prepare("SELECT COUNT(*) AS total FROM information_schema.tables WHERE table_name = ?"); $stmt->execute([$tabela]); $total=$stmt->fetchColumn(); if($total>0){$this->pdo->exec("DROP TABLE $tabela");} $sql="CREATE TABLE $tabela (id INT NOT NULL AUTO_INCREMENT, prod VARCHAR(255) NOT NULL, preço FLOAT NOT NULL, un VARCHAR(2) NOT NULL, PRIMARY KEY (id))"; $this->pdo->exec($sql); $sql="INSERT INTO produto (prod,preço,un) values (?,?,?)"; $dados=[["Maçã Red",20,"kg"],["Macarrão Tipo Ninho",5.5,"un"], ["Pera Portuguesa",25,"kg"],["Picanha Fresca",50,"kg"], ["Pão de Forma",7,"un"],["Pão Francês",11,"kg"],["Banana Nanica",8,"kg"], ["Laranja Lima",5,"kg"],["Refrigerante 2L",8.50,"un"]]; foreach($dados as $dado){ $stmt=$this->pdo->prepare($sql); $stmt->execute($dado);} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewBasico.html"; echo "<h1>Tabela criada com sucesso!<br>";} public function listarUm($id){ $stmt=$this->pdo->query("SELECT * from produto where id=$id"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function listarTudo(){ $stmt=$this->pdo->query("SELECT * from produto order by prod"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function listar(){ $stmt=$this->pdo->query("SELECT SUBSTRING_INDEX(prod,' ',1) AS grupo FROM produto GROUP BY grupo ORDER BY grupo"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function filtrar($filtro){ $stmt=$this->pdo->query("select * from produto where prod like '$filtro%' order by prod"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function atualizar($dados){ $stmt=$this->pdo->prepare('UPDATE produto SET prod=?,preço=?,un=? WHERE id=?'); $stmt->execute([$dados[1],$dados[2],$dados[3],$dados[0]]); $filtro=$dados[0]; $stmt=$this->pdo->query("select * from produto where id=$filtro"); return $stmt->fetchAll(PDO::FETCH_ASSOC);} public function incluir($dados){ $stmt=$this->pdo->prepare('INSERT INTO produto (prod,preço,un) values (?,?,?)'); $stmt->execute([$dados[0],$dados[1],$dados[2]]); $filtro=$this->pdo->lastInsertId(); $stmt=$this->pdo->query("select * from produto where id=$filtro"); return $stmt->fetchAll(PDO::FETCH_ASSOC);} public function excluir($dados){ $id=$dados[1]; $produto=$dados[0]; $this->pdo->query("delete from produto where id=$id"); require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewBasico.html"; echo "<h1>o produto $produto foi excluido</h1>";}} arquivo /astudy/View/viewAtualizar.php <?php require('viewBasico.html'); $id=$_GET['id']; $prod=$_GET['prod']; $preço=$_GET['preço']; $un=$_GET['un']; ?> <table class="table table-striped fs-1"> <form action='../Controller/produtoController.php'> <tr><td>Código<td><?=$id?><input type=hidden name=atualizar[] value=<?=$id?>> <tr><td>Produto<td><input name=atualizar[] value='<?=$prod?>'> <tr><td>preço<td><input name=atualizar[] value=<?=$preço?>> <tr><td>Un<td><input name=atualizar[] value='<?=$un?>'> <tr><td><td colspan=2><input name=alterar type=submit value=Atualizar> </form> <tr><td><td> <form action='../Controller/produtoController.php'> <input type=hidden name=excluir[] value='<?=$prod?>'> <input type=hidden name=excluir[] value=<?=$id?>> <input type=submit value=Excluir> </form> </table> arquivo /astudy/View/viewBasico.html <!DOCTYPE html> <meta name="viewport" content="width=device"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <input id=inputMenu class=fs-1 type=submit value=Menu onclick="location.replace('../View/viewMenu.php')"> <a class='fs-1 link-underline-light' id=mensagem></a> <hr> arquivo /astudy/View/viewFiltro.php <?php include('viewBasico.html'); echo "<table class=table><th class=fs-1>Cód<th class=fs-1>Produto <th class=fs-1>preço<th class=fs-1>Un"; foreach($produtos as $produto){ $id=$produto['id']; $prod=$produto['prod']; $prodURL=urlencode($prod); $preço=$produto['preço']; $un=$produto['un']; echo "<tr><td class='fs-1 text-end'>$id"; echo "<td class='fs-1 text-nowrap overflow-hidden'>"; echo "<a class='link-underline-light' href=../$irPara?id=$id&prod=$prodURL&preço=$preço&un=$un>$prod</a>"; echo "<td class=fs-1>$preço<td class=fs-1>$un";} ?> </table> arquivo /astudy/View/viewIncluir.php <?php require('viewBasico.html'); ?> <form class="w-50 mt-5 m-auto" action='/astudy/Controller/produtoController.php'> <table class="table table-striped fs-1"> <tr><td><td class=fs-1>Novo Produto <tr><td>Produto<td><input name=incluir[] required> <tr><td>Preço<td><input name=incluir[] required> <tr><td>Un<td><input name=incluir[] required> <tr><td><td><input type=submit value='Incluir Novo Produto'> </form> </table> arquivo /astudy/View/viewMenu.php <?php include('viewBasico.html'); ?> <script>inputMenu.setAttribute('type','hidden')</script> <table class='table table-striped fs-1'> <tr><td><a class=link-underline-light href="/astudy/Controller/produtoController.php?criarProdutos"> Criar ou recriar tabela produtos</a> <tr><td><a class=link-underline-light href="/astudy/Controller/produtoController.php?verProdutos"> Ver todos produtos</a> <tr><td><a class=link-underline-light href="/astudy/View/viewIncluir.php"> Incluir novo produto</a> <tr><td><a class=link-underline-light href="/astudy/Controller/orçamentoController.php?inicio">Orçamento</a> </table> arquivo /astudy/View/viewOrçamento.php <?php include('viewBasico.html') ?> <script>mensagem.innerHTML="Orçamento"</script> <table class='fs-1 table table-striped'> <th>Produto<th>Qt<th>Un<th>Preço<th>Total <?php foreach($itens as $key=>$item): ?> <tr><td><a class=link-underline-light href='../Controller/orçamentoController.php?excluir=<?=$key?>'> <?=$item[0]?></a> <td><input class='border border-light bg-transparent' value=<?=$item[1]?> size=1 onchange="location.replace ('../Controller/orçamentoController.php?alterar='+ this.value+'&chave=<?=$key?>')"> <td><?=$item[2]?><td class=text-end><?=nf($item[3])?><td class=text-end><?=nf($item[4])?> <?php endforeach;?> <tr><td><input type=submit value=Produto onclick="location.replace ('../Controller/orçamentoController.php?produto')"> <input type=submit value=Apagar onclick="location.replace ('../Controller/orçamentoController.php?apagar')"> <td><td><th>Geral<th><?=nf($soma)?> </table> arquivo /astudy/View/viewProduto.php <?php include('viewBasico.html') ?> <p class='fs-1 text-center'><?=$contagem?> grupos de produtos <table class=table> <!--esse algorítimo é péssimo, ele só faz 4 colunas no máximo--> <?php for($iLinha=0;$iLinha<$numLinhas;$iLinha++){ for($iColuna=0;$iColuna<=$colunas;$iColuna++){ if(($iLinha+$iColuna*$numLinhas)<$contagem){ $item=$produtos[$iLinha+$iColuna*$numLinhas]['grupo']; echo "<td><a class='link-dark link-underline link-underline-opacity-0 fs-2' href='?item=$item'>$item</a>";}} echo "<tr>";} ?> </table> arquivo /astudy/index.php <?php header("location:View/viewMenu.php");
-
O meu projeto é assim pasta <controller> produtoController.php pasta <model> tbproduto.php index.php Eu uso o endereço absoluto para pular do index para o controller ou chamar a classe tbproduto. O problema é quando eu crio o namespace Controller no produtoController. Aí o index reclama que não consegue achar o produtoController. Para resolver isso, eu mudei $classe = new produtoController para $classe = new Controller\produtoController. O drama começa quando eu crio um namespace no arquivo tbproduto como model. No produtoController, eu coloco "use model\tbproduto", e na hora de iniciar uma classe $tbproduto=new tbproduto() ou $tbproduto=new Model\tbproduto(), aí o controlador diz que não encontrou a classe. Alguém aqui usou o Namespace no PHP (ou seja, fora do Laravel) e conseguiu fazer funcionar?
-
Como colocar o máximo de texto na tela de celular com 7 cm de largura?
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Valeu. Não consegui fazer funcionar as elipsis, mas o CSS do cálculo é bom demais! <style>p {width:calc(8cm - 8px);white-space: nowrap;overflow:hidden}</style> Pensei em usar a propriedade text-overflow, mas ele não funcionou. A função calc só funciona se você colocar espaço antes e depois do operador -. -
Eu fiz um código, estipulando 35 caracteres como o máximo que dá para colocar em 7 cm na tela do celular, mas ficou um horror: astudy/Model/funcoes.php <meta name="viewport" content="width=device-width"> <?php class funcoes { public function ajustarTexto($texto){ if(strlen($texto)>35){ return substr($texto,0,32)."...";} else {return $texto;}} } $funcoes=new funcoes(); echo "<br>".$funcoes->ajustarTexto("Descontinuar Abraçadeira Fluorescente"); echo "<br>".$funcoes->ajustarTexto("Descontinuar Acabamento Registro de Pressão"); Existe algum jeito de fazer os dois textos terminarem exatamente no canto direito do celular?
-
Select de Produtos mais Vendidos
pergunta respondeu ao adrsublimacao de Frank K Hosaka em Tutoriais & Dicas - PHP
<?php // mysql store (id,idProduto,qt,venda)(1,116,10,10)(2,115,2,2) // (3,115,1,1)(4,115,4,4)(5,116,20,20); $connect=new mysqli("localhost","root","","laravel"); $query=$connect->query("select idProduto, count(idProduto) as contagem from store group by idProduto order by contagem desc"); while($row=$query->fetch_assoc()){ echo "contagem ".$contagem=$row['contagem']." idProduto ".$row['idProduto']."<br>";} // contagem 3 idProduto 115 contagem 2 idProduto 116 Aqui, uma versão melhorada: <?php // mysql store (id,idProduto,qt,venda)(1,116,10,10)(2,115,2,2) // (3,115,1,1)(4,115,4,4)(5,116,20,20); // mysql produto (id,nome)(115,"canabis")(116,"papola") $connect=new mysqli("localhost","root","","laravel"); $query=$connect->query("select idProduto, count(idProduto) as contagem from store group by idProduto order by contagem desc"); while($row=$query->fetch_assoc()){ $idProduto=$row['idProduto']; $query2=$connect->query("select nome from produto where id=$idProduto"); $produto=$query2->fetch_assoc()['nome']; echo "contagem ".$contagem=$row['contagem']." produto $produto<br>";} // contagem 3 produto canabis contagem 2 produto papola -
Na listagem seguinte, o comando @include('menu') pressupõe que tem um link para o CDN do Bootstrap. web.php <?php use Illuminate\Support\Facades\Route; Route::middleware(['auth','verified'])->group(function(){ Route::get('megasena',[App\Http\Controllers\EstoqueController::class,'megasena']);} =============================== EstoqueController.php <?php namespace App\Http\Controllers; class EstoqueController extends Controller { public function megasena(){ $vr['escolha']=mt_rand(1,14); if($vr['escolha']<=6){ $vr['titulo']="Palpite para Mega-Sena: linha ".$vr['escolha'];} if($vr['escolha']>=7 and $vr['escolha']<=12){ $vr['coluna']=$vr['escolha']-6; $vr['titulo']="Palpite para Mega-Sena: coluna ".$vr['coluna'];} else {$vr['coluna']=0;} $vr['diagonal']=0; if($vr['escolha']>12){ $vr['diagonal']=$vr['escolha']-12; $vr['titulo']="Palpite para Mega-Sena: diagonal ".$vr['diagonal'];} $matriz=[]; for($j=1;$j<=6;$j++){ for ($i = 0, $palpites = []; $i < 1500; $i++) @$palpites[mt_rand(1, 60)]++; arsort($palpites); $i=0; $sorteio=[]; foreach($palpites as $key => $valor){ $sorteio[]=$key; $i++; if($i==6){break;}} sort($sorteio); $matriz[]=$sorteio;} return view('megasena',compact('vr','matriz'));} } ======================== megasena.blade.php @include('menu') <table class=table> <td colspan=6>{{$vr['titulo']}} @foreach($matriz as $linha=>$mat) <tr> @foreach($mat as $coluna=>$sorte) @if($vr['escolha'] < 7 && ($linha+1)==$vr['escolha'] || $vr['escolha'] > 6 && $vr['escolha'] < 13 && ($coluna+1)==$vr['coluna'] || $vr['diagonal']==1 && ($linha+$coluna==5) || $vr['diagonal']==2 && $linha==$coluna) <td class=text-danger>{{$sorte}} @else <td>{{$sorte}} @endif @endforeach @endforeach
-
O Bard é bacana. Nem sempre ele encontra a melhor resposta. Hoje, por exemplo, eu queria saber como pegar o nome do cliente no Laravel. A resposta dele estava certa, dentro do contexto do Controller do Laravel. Eu precisava da resposta no contexto do Views. Eu apelei para a improvisação, e consegui achar a solução. No Model, eu tinha uma relação. No Controller eu fiz assim: $hists=tbhistprod::where('codprod',$codprod)->with('relação')->get( ). No Views, eu fiz assim <tr><td>{{$hists->relação->nomeCliente}}. Essa solução não é nada óbvia, mas quem inventou o Laravel é bastante engenhoso. Hoje de noite, eu perguntei se é possível criar um arquivo HTML que caiba na tela do celular. Ele deu várias dicas, e eu experimentei esse daqui: <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <title>Exemplo de HTML responsivo</title> </head> <body> <h1>Este é um exemplo de HTML responsivo</h1> <p>Este texto será exibido em toda a largura da tela, mesmo que ela seja pequena.</p> </body> </html> Eu fiquei bastante contente com a resposta. Ele funciona! Todos os códigos que eu fiz, eu pedi para trabalhar com 50% da tela de um notebook para ver se cabia na tela do celular. Mas não cabe, você é obrigado a empurrar a tela para o lado para ver o resto da informação. Mas com a dica do Bard, eu consigo colocar todo o meu layout exatamente no tamanho da tela do celular, o ruim é que é bem difícil de enxergar. Mas isso já vai ajudar bastante na hora de mudar o layout.
-
Laravel: mandando um monte de variáveis do controller para o view
uma questão postou Frank K Hosaka PHP
Para resolver esse problema eu inventei uma classe chamada vr dentro da pasta Controllers do Laravel. Ficou esquisito, mas ele funcionou. Mas hoje eu senti um enorme peso na consciência e fiz um teste com PHP e eu vi que a maneira mais elegante de passar um monte de variáveis do Controller para um view é usando um vetor, assim: <?php $vr['nome']='Frank'; $vr['idade']=64; $vr['cidade']='Diadema'; $vr['cadastro']=date('Y-m-d'); var_dump($vr);