
Frank K Hosaka
Membros-
Total de itens
1.623 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
consulta na tabela que me retorna registros duplicados
pergunta respondeu ao LIGNT de Frank K Hosaka em PHP
<?php $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $stmt=$pdo->query("drop table if exists vetores"); $stmt=$pdo->query("create table vetores (id int not null auto_increment, vetor json default null, primary key(id)) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_0900_ai_ci"); $arrays=[[123,122,121,111,132],[122,22,221,211,232],[12,13,132,11,15],[123,32,33,36,123]]; foreach($arrays as $array){ $json=json_encode($array); $pdo->query("insert into vetores (vetor) values ('$json')");} $stmt=$pdo->query("select * from vetores"); $todos=$stmt->fetchAll(PDO::FETCH_OBJ); $umVetor=[]; foreach($todos as $cada){ $umVetor=array_merge($umVetor,json_decode($cada->vetor));} $frequencia=array_count_values($umVetor); ?> <table style=margin-left:400px><th>id |<th>re1 |<th>re2 |<th>re3 |<th>re4 |<th>re5 | <?php foreach($todos as $cada): ?> <tr><td style=text-align:right><?=$cada->id?> | <?php $vetor=json_decode($cada->vetor); foreach($vetor as $elemento): $style="style=text-align:right"; if($frequencia[$elemento]==2){$style="style=text-align:right;color:green";} if($frequencia[$elemento]==3){$style="style=text-align:right;color:red";} ?> <td <?=$style?>><?=$elemento?> | <?php endforeach; endforeach; ?> Ao invés de trabalhar com cinco campos re1 ... re5, a minha sugestão é trabalhar com apenas um campo tipo texto para armazenar os cinco números na forma de array. -
Tudo funciona quando as classes estão agrupadas no Index.php, mas na hora de separar por pastas e na hora de trabalhar com um serviço de banco de dados dentro de uma classe que foi guardado dentro da variável global $_SESSION, a mensagem que eu recebo é esse: Fatal error: Uncaught Error: The script tried to call a method on an incomplete object. Please ensure that the class definition "Classe" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in C:\wamp64\www\Astudy\Controles\Classe.php on line 10 arquivo Controles > bd.php <?php class bd { public function dados () { $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $stmt=$pdo->query("select * from tbprod limit 2"); return $stmt->fetchAll(PDO::FETCH_OBJ);}} arquivo Controles > Classe.php <?php require __DIR__ . '/Subclasse.php'; class Classe extends SubClasse { private $variavel; public function get() {return $this->variavel;} public function set($valor) {$this->variavel = $valor;}} if(!isset($_SESSION['objeto'])){$_SESSION['objeto'] = new Classe();} if (isset($_GET['valor'])) {$_SESSION['objeto']->set($_GET['valor']);} if (isset($_GET['obter'])) {echo $_SESSION['objeto']->get();} if (isset($_GET['bd'])){var_dump($_SESSION['objeto']->bd());}?> <form><input name=valor onchange=submit()></form> <form><input type=submit name=obter value=Obter></form> <form><input type=submit name=bd value=bd></form> arquivo Controles > Subclasse.php <?php require __DIR__ .'/bd.php'; class Subclasse { public function bd(){ $conexao=new bd(); return $conexao->dados();}} arquivo Index.php <?php session_start(); require __DIR__ . '/Controles/Classe.php'; $_SESSION['Diario']=new Classe();
-
Em 2020 eu criei a tabela tbsupervariavel para poder salvar alguns valores no meio do caminho para utilizar lá na frente. Aqui em 2023 estou batendo a cabeça na parede para estudar o MVC, mais conhecido como "programação orientada a objetos", mas não vejo como eliminar a tbsupervariavel. Sente o meu drama: <?php session_start(); class Classe { private $variavel; public function get() {return $this->variavel;} public function set($valor) {$this->variavel = $valor;}} if(!isset($_SESSION['objeto'])){ $_SESSION['objeto'] = new Classe();} if (isset($_GET['valor'])) {$_SESSION['objeto']->set($_GET['valor']);} if (isset($_GET['obter'])) {echo $_SESSION['objeto']->get();} ?> <form action="" method="get"> <input name="valor" onchange="this.form.submit()"> </form> <form action="" method="get"> <input type="submit" name="obter" value="Obter"> </form> Alguém sabe como fazer esse código funcionar sem usar a gambiarra da $_SESSION?
-
Hoje eu criei a classe OrcamentoControle como uma extensão da classe ProdutoControle, assim eu consegui usar a função procurar( ) do ProdutoControle dentro da classe OrçamentoControle. O problema é que eu só consegui usar só uma vez. Na segunda vez, o PHP reclamou que o ProdutoControle não tinha conexão. Para continuar com o serviço, eu tive que fazer uma bela gambiarra, ao invés de iniciar a conexão com o famoso __construct( ), eu defini a conexão dentro da função da classe ProdutoControle: Arquivo Astudy > Controles > ProdutoControle.php <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/Astudy/Modelos/Conexao.php"; class ProdutoControle{ private $pdo; public function procurar(){ $this->pdo=Conexao::instancia(); $stmt=$this->pdo->query("select * from tbprod limit 10"); $produtos=$stmt->fetchAll(PDO::FETCH_OBJ); require $_SERVER['DOCUMENT_ROOT'] . "/Astudy/Visoes/Produtos.php"; exit; } } Arquivo Astudy > Controles > OrcamentoControle.php <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/Astudy/Controles/ProdutoControle.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/Astudy/Modelos/Conexao.php"; class OrcamentoControle extends ProdutoControle { private $pdo; public function __construct(){ $this->pdo=Conexao::instancia();} public function inicio(){ $pedido=1; if(isset($_GET['codprod']) && !isset($_GET['qt'])){ $prod['codprod']=$_GET['codprod']; $prod['prod']=$_GET['prod']; $prod['custo']=$_GET['custo'];} $stmt=$this->pdo->query("select * from tbhistped join tbprod on tbhistped.codprod = tbprod.codprod where ped=$pedido"); $itens=$stmt->fetchAll(PDO::FETCH_OBJ); require $_SERVER['DOCUMENT_ROOT']."/Astudy/Visoes/Orcamento.php";exit;} public function incluir(){ $ped=1; $codprod=$_GET['codprod']; $qt=$_GET['qt']; $subtotal=$codprod*$qt; $this->pdo->query("insert into tbhistped (ped,codprod,qt,subtotal) values ($ped,$codprod,$qt,$subtotal)"); $this->inicio();}} $controle=new OrcamentoControle(); if(isset($_GET)){ if(key($_GET)=='produto'){$controle->procurar();} if(key($_GET)=='codprod'){$controle->inicio();} if(key($_GET)=='qt'){$controle->incluir();} }
-
achar um valor ao ser digitado na textbox usando vba
pergunta respondeu ao ewerton28054414 de Frank K Hosaka em VBA
Eu tenho pavor do VBA, principalmente no Excel, sempre recebo mensagens estranhas e a tela de ajuda é de amargar, mas para resolver esse tipo de problema, eu uso o gravador de macro. Eu faço uma busca manual, encontro o que eu preciso, e depois estudo a macro que o Excel criou. O meu ficou assim: Sub Macro1() Dim val As String val = InputBox("O que procura?") Cells.Find(What:=val, After:=ActiveCell, LookIn:=xlFormulas2, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate End Sub -
Laravel: mandando um monte de variáveis do controller para o view
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Não consegui executar o código do ikkinet, eu fiz as seguintes modificações: arquivo routes>web.php <?php use Illuminate\Support\Facades\Route; Route::get('/',[App\Http\Controllers\IndexController::class,'index']); arquivo app>Http>Controllers>IndexController.php <?php namespace App\Http\Controllers; class IndexController extends Controller { public function index(){ // tirei :view da versão original $data['nome'] = 'Pedro'; $data['idade'] = 37; $data['valor'] = 25.2; $data['notas'] = ['q1' => 8,'q2' => 7,'q3' => 9,'q4' => 10]; return view('nome_do_arquivo_da_view',compact('data'));}} // tirei ->with($data) do original arquivo resources > views > nome_do_arquivo_da_view.blade.php <div class="row"> <label>Nome</label> <p>{{ $data['nome'] }}</p> </div> <div class="row"> <label>Idade</label> <p>{{ $data['idade'] }}</p> </div> <div class="row"> <label>Valor</label> <p>{{ $data['valor'] }}</p> </div> <div class="row"> <label>Media das notas dos bimestres</label> <p>{{ ($data['notas']['q1']+$data['notas']['q2']+ $data['notas']['q3']+$data['notas']['q4'])/4 }}</p> </div> <!-- a minha versão do laravel é básica, eu nem consegui instalar o Breezer. Ele não permite usar a chave de um array como se fosse uma variável. --> Desconfio que o ikkinet tem uma versão bem mais poderosa do Laravel ou ele está bebemorando 2024 muito antes das datas previstas. Seja como for, fiz um teste, eu tirei compact('data') no código do controller, e o Laravel reclamou que tem um monte de variável indefinida e isso não faz o menor sentido. O que o Laravel fez com a classe IndexController onde foi definida a variável $data? Isso é um bom exemplo de que eu fiz a coisa errada. O Laravel não ensina ninguém a criar um MVC, pois o Laravel é um MVC, mas um MVC bem obscuro. No MVC a gente chama um arquivo para mostrar no navegador, já o Laravel "renderiza", ou seja, ele mostra o arquivo no navegador e some com o controlador que chamou o arquivo. O nome disso é "mágica"! -
Preenchimento de form com dados de várias tabelas
pergunta respondeu ao jcvilanova de Frank K Hosaka em PHP
Finalmente terminei o rascunho (ele só faz o básico, ele não contempla nenhum controle dos que já foram selecionados e nem a quantidade necessária de cada serviço, e como ele trabalha com data precisa definir o local, coisa que também não fiz). Espero que você goste: Mysql CREATE TABLE `tb_escaladiaria` ( `id` int NOT NULL AUTO_INCREMENT, `data` date DEFAULT NULL, `id_servidor` int DEFAULT NULL, `id_servico` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `tb_servicos` ( `id` int NOT NULL AUTO_INCREMENT, `descricao` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=innoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CREATE TABLE `tb_servidores` ( `id` int NOT NULL AUTO_INCREMENT, `nome` varchar(45) DEFAULT NULL, `id_servico` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci arquivo Index.php <body style='width:1200px;margin:0 auto;margin-top:50px'> <?php $pdo=new PDO('mysql:host=localhost;dbname=diario','root',''); $stmt=$pdo->query("select * from tb_escaladiaria join tb_servidores on id_servidor = tb_servidores.id join tb_servicos on tb_servidores.id_servico = tb_servicos.id"); $escalas=$stmt->fetchAll(PDO::FETCH_OBJ); if(isset($_GET['servidor'])){ $dia=date('Y-m-d'); $id_servidor=$_GET['servidor']; $id_servico=$_GET['idServico']; $stmt=$pdo->query("insert into tb_escaladiaria (data,id_servidor,id_servico) values('$dia',$id_servidor,$id_servico)"); header("location:index.php?servico=$id_servico");} $stmt=$pdo->query("select * from tb_servicos"); $servicos=$stmt->fetchAll(PDO::FETCH_OBJ); if(isset($_GET['servico'])): $idServico=$_GET['servico']; $stmt=$pdo->query("select descricao from tb_servicos where id=$idServico"); $descricaoServico=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['descricao']; echo "<input type=submit value='$descricaoServico' onclick=location.replace('index.php')> <i> Clique nesse botão para mudar o serviço</i><p>"; $stmt=$pdo->query("select * from tb_servidores where id_servico=$idServico"); $servidores=$stmt->fetchAll(PDO::FETCH_OBJ); ?> <form> <select name=servidor onchange=submit()> <option>Selecione o colaborador <?php foreach($servidores as $servidor): ?> <option value=<?=$servidor->id?>><?=$servidor->nome?> <?php endforeach; ?> </select> <input type=hidden name=idServico value=<?=$idServico?>> </form> <?php else: ?> <form> <select name=servico id=servico onchange=submit()> <option>Selecione o serviço <?php foreach($servicos as $servico): ?> <option value=<?=$servico->id?>><?=$servico->descricao?> <?php endforeach; ?> </select> </form> <?php endif; ?> <table border=1><th>Data<th>Colaborador<th>Função <?php foreach($escalas as $escala): ?> <tr><td><?=$escala->data?><td><?=$escala->nome?><td><?=$escala->descricao?> <?php endforeach; ?> -
Preenchimento de form com dados de várias tabelas
pergunta respondeu ao jcvilanova de Frank K Hosaka em PHP
A minha ideia é mostrar toda a tabela escaladiaria, onde vão aparecer os servidores e suas funções. Como você não quer escrever na mão essa tabela, vamos precisar de dois formulários. O primeiro vai ter uma combo com os serviços. O segundo vai ter uma combo os servidores que fazem aquele serviço. Assim que ele for selecionado, a tabela escaladiaria será atualizada. A minha ideia é criar uma linha para cada escala assim: 18/12/23 Maria, motorista 18/12/23 João, motorista 18/12/23 Pedro, motorista e não 18/12/23 [Maria, João, Pedro], motorista. Nesse caso, ao invés de um id_servidor (int) teríamos que mudar para ids_servidores (varchar(45)), onde teríamos um array de vários de ids, o que eu acho bem difícil de trabalhar. Aconselho a não fazer isso, a menos que isso seja mais útil para você. Em seguida, um rascunho do que estava fazendo, ele está incompleto, mas preciso abandonar porque tenho que fazer a janta. Boa sorte para você. <?php $pdo=new PDO('mysql:host=localhost;dbname=diario','root',''); $stmt=$pdo->query("select * from tb_escaladiaria join tb_servidores on id_servidor=tb_servidores.id"); $escalas=$stmt->fetchAll(PDO::FETCH_OBJ); if(isset($_GET['servidor'])){ $dia=date('Y-m-d'); $id=$_GET['servidor']; $stmt=$pdo->query("insert into tb_escaladiaria (dia,id_servidor,id_servico) values('$dia','$id',1)");} $stmt=$pdo->query("select * from tb_servicos"); $servicos=$stmt->fetchAll(PDO::FETCH_OBJ); ?> <form> <select name=servico id=servico onchange=submit()> <option>Selecione o serviço <?php foreach($servicos as $servico): ?> <option value=<?=[$servico->id,$servico->descricao]?>><?=$servico->descricao?> <?php endforeach; ?> </select> </form> <?php if(isset($_GET['servico'])): $idServico=$_GET['servico'][0]; $descricaoServico=$_GET['servico'][1]; $stmt=$pdo->query("select * from tb_servidores where id_servico=$idServico"); $servidores=$stmt->fetchAll(PDO::FETCH_OBJ); ?> <form> <select name=servidor onchange=submit()> <option>Selecione o colaborador <?php foreach($servidores as $servidor): ?> <option value=<?=$servidor->id?>><?=$servidor->nome?> <?php endforeach; ?> </select> </form> <?php endif; ?> <table border=1><th>Data<th>Colaborador<th>Função <?php foreach($escalas as $escala): ?> <tr><td><?=$escala->data?><td><?=$escola->nome?><td><?=$escala->funcao?> <?php endforeach; ?> -
Preenchimento de form com dados de várias tabelas
pergunta respondeu ao jcvilanova de Frank K Hosaka em PHP
Eu peço desculpas pelo comentário que realmente não ajudou em nada. O mais importante são as tabelas tb_servidores (id), tb_serviços (id) e tbescaladiaria(id,id_servidor,id_servico), a sua tabela tbescaladiaria não contempla o serviço que será feito pelo servidor. Vamos supor que você precisa de 5 motoristas: Maria, José, João, Mateus e Pedro. Logo, você vai preencher 5 registros na tbescaladiaria. Vamos supor que você pegou a Maria como motorista. Logo, a próxima vez que você selecionar os motoristas disponíveis, devem aparecer apenas José, João, Mateus e Pedro. Nesse caso, precisamos de mais um campo na tb_servidores, assim (id,escalado), e assim podemos fazer uma consulta para popular o formulário dos motoristas que ainda não foram escalados. Outro problema é a tbescaladiaria, como ele vai saber que só podem ser convocados 5 motoristas? Nesse caso, temos mais uma alteração na tbserviços (id, maximo_necessario). Antes de quebrar a cabeça com o formulário, veja se o banco de dados tem informações suficientes para resolver o seu problema. Agora, se a tabela é imexível, aí o escopo é outro. Você tem o escopo do projeto? Escopo é algo do tipo: eu não tenho o privilégio de administrador, não posso mexer na estrutura do banco de dados que é composto dessa tabela (id,nome) e outra tabela (id,descricao), e com essas informações gostaria de saber se é possível fazer um controle de escalas. -
Preenchimento de form com dados de várias tabelas
pergunta respondeu ao jcvilanova de Frank K Hosaka em PHP
Ao invés de servidor, prefiro usar a palavra colaborador. Acho que três tabelas resolvem o problema: colaboradores, serviços e escalas. A tabela colaboradores só tem um id: id=1, Frank. A tabela serviços só tem dois ids: id=1, Faxina; id=2, Programador. Agora a tabela escala tem que ter esses campos: id, data_com_hora_inicio, data_com_hora_final, id_colaborador, id_servico. Na escala de hoje, a tabela ficaria assim: 1,2023-12-18 08:00,2023-12-18 12:00,1,1 2,2023-12-18 13:00,2023-12-18 17:00,1,2 O seu caso é diferente, você trabalha na Câmara Municipal, onde temos vários colaboradores que não têm o que fazer. Nesse caso, a tabela escala ficaria com essa cara: 3,2023-12-18 13:00,2023-12-18 17:00,2,2 4,2023-12-18 13:00,2023-12-18 17:00,3,2 5,2023-12-18 13:00,2023-12-18 17:00,4,2 6,2023-12-18 13:00,2023-12-18 17:00,5,2 Ou seja, são vários colaboradores fazendo o mesmo serviço no mesmo período. -
arquivo /Astudy/Index.php <?php require_once __DIR__.'/Modelos/Config.php'; echo DBNAME; echo NovaClasse::teste(); echo "<br>".$config->dec(2); arquivo /Astudy/Modelos/Config.php <?php class Config { public function __Construct(){ defined('HOST') || define('HOST','localhost'); defined('DBNAME') || define('DBNAME','laravel'); defined('USER') || define('USER','root'); defined('PASSWORD') || define('PASSWORD',''); spl_autoload_register(function($Class){ $includeDir = false; $findDir = ['Modelos']; foreach ($findDir as $DirName) { if (!$includeDir && file_exists($this->FindClass($DirName, $Class)) && !is_dir($this->FindClass($DirName, $Class))) { include_once ($this->FindClass($DirName, $Class)); $includeDir = true;}} if (!$includeDir) { die("$Class - Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); } public function FindClass($dir,$class) { return ( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'Astudy' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} public function dec($value){ if($value!==null){return number_format($value,2,',','.');}} } // gambiarra $config = new Config(); arquivo /Astudy/Modelos/NovaClasse.php <?php class NovaClasse { public static function teste(){return "<br>isso é um teste!";} }
-
Hoje eu descobri como funciona o projeto Vagas (GitHub - william-costa/wdev-crud-php-pdo-mysql: CRUD com PHP orientado a objetos, PDO e MySQL feito no canal WDEV), onde o William criou um arquivo chamado formulário, e ele utiliza tanto para cadastrar bem como atualizar o cadastro. Eu não sabia como o formulário era capaz de devolver a resposta do usuário ao programa cadastrar.php ou editar.php. O grande truque é a propriedade action do <form>, o William simplesmente omitiu, ou seja, se o programa cadastrar.php chamar o formulario.php e o usuário apertar o botão enviar, o PHP vai executar novamente o programa cadastrar.php. Desde 2020 eu faço a mesma coisa, mas só nessa semana é que entendi como funciona o PHP. O botão enviar é poderoso para preparar o navegador para receber um novo arquivo HTML, mas não tão poderoso para apagar o último código executado pelo PHP. Essa é a poderosa lei do retorno. O PHP só vai apagar o último código se o HTML pedir. Para testar isso na prática, eu criei o código teste.php: <?php if(isset($_POST['teste'])){ echo "teste concluído";exit;} echo "<form method=post><input type=submit name=teste></form>"; Eu fiz um complicado código no meu projeto para fazer o PHP executar a rotina de quem chamou o formulário, quando, na verdade, a solução do William é bem mais simples. Tudo o que o PHP tem que fazer é esperar a resposta do usuário e executar o código se o usuário responder. Assim, eu tentei ajustar o meu código à simplicidade do William, mas não deu certo. A pergunta é: por que a lei do retorno só funciona no caso do William? A resposta é simples. No caso do William, foi um código PHP puro que chamou o formulário. No meu caso, é uma função de uma classe que chamou o formulário. Ou seja, na hora que o usuário submeter o formulário, o último código executado pelo PHP não é a função que chamou o formulário, mas a classe inteira a que a função pertence. Ou seja, se a classe não estiver preparada, certamente o usuário vai ver uma tela branca e se perguntar porque o PHP não funciona. Mesmo assim, a solução do William (não usar action no <form>) parece funcionar na classe também. Eu pedi para a classe instanciar uma nova classe, e aguardar algum usuário apertar o botão de enviar, e pedi para escrever "olá mundo", e deu certo. Agora, preciso fazer uma gambiarra no formulário para a classe saber se vai cadastrar ou editar um registro. No formulário eu tenho um botão e o texto será definido pela função novo ($btn="novo";) ou pela função edite ($btn="edite";), e dentro do <form> vou criar um <input type=hidden name=retorno value=<?=$btn?>>, e lá na classe instanciada, vou fazer isso: <?php class Diario { ... } $Diario=new Diario() if(isset($_POST['retorno']){ if($_POST['retorno']=="novo"){$Diário->novo();} if($_POST['retorno']=="edite"){$Diário->edite();} } Ideias simples são fáceis de entender, o duro é como usar na prática.
-
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.