
Frank K Hosaka
Membros-
Total de itens
1.622 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
A parte mais difícil da gramática do MySQL, HTML e o PHP é quando eu precisei usar o apóstrofo simples ou duplo (tipo cano 3/4") no histórico ou descrição de um formulário. Para evitar esse problema, eu sempre evitei de usar os apóstrofos. Ontem, no entanto, a Gemini sugeriu usar o comando addslashes do PHP. Agora sim eu posso escrever o que eu quiser no MySQL: <?php // ... $this->Conexao->insert("tbdiario (dia,lcto,contad,contac,valor,hist) values ('$dia',$lcto,$contad,$contac,$valor,'".addslashes($hist)."')");
-
Comparando o banco de dados do Bling com o PHP
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Editado. -
Comparando o banco de dados do Bling com o PHP
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Editado. -
Aqui eu tento comparar os arquivos csv obtidos na Bling e comparar com o que tem no MySQL: arquivo Modelos / Config.php <?php // ... function aspas($bling) { return str_replace('"','',$bling); } function dec($value) { if($value==null) { return null; } return number_format($value,2,',','.'); } function deca($num) { $value=str_replace(".","",$num); return str_replace(",",".",$value); } arquivo Controles / ControleBling.php <?php class ControleBling extends Controle { private $Conexao; public function __construct() { $this->Conexao=new Conexao; } public function diferenca() { $this->Conexao->exec("truncate table tbprodbling"); $arquivos=['produtos1.csv','produtos2.csv','produtos3.csv','produtos4.csv','produtos5.csv']; foreach($arquivos as $arquivo) { $dados=file($arquivo); foreach($dados as $linha) { $campos=explode(';',$linha); if(aspas($campos[1])!=="Código") { $codprod=intval(trim(aspas($campos[1]))); $un=aspas($campos[3]); $prod=aspas($campos[2]); $custo=deca(aspas($campos[11])); $codbar=trim(aspas($campos[19])); $cf=deca(aspas($campos[4])); $venda=deca(aspas($campos[6])); $this->Conexao->insert("tbprodbling (codprod,un,prod,custo,codbar,cf,venda) values ($codprod,'$un','$prod',$custo,'$codbar','$cf',$venda)"); } } } $produto=$this->Conexao->select("* from tbprod where loc <> 'a24'"); $prodBling=$this->Conexao->select("* from tbprodbling"); echo "O número de registros no MySQL é ".count($produto).".<br>"; echo "O número de registros na Bling é ".count($prodBling).".<br>"; echo "<table><th><th class=text-left>MySQL<th class=text-left>Bling"; foreach($produto as $pr) { $codprod=$pr->codprod; $bling = array_filter($prodBling, function ($produto) use ($codprod) { return $produto->codprod == $codprod;}); $a=current($bling); if(is_null($a)) { echo "<tr><td>Codigo<td><td>Incluir"; } else { $un=($pr->un==$a->un) ? 1 : 0; $prod=($pr->prod==$a->prod) ? 1 : 0; $custo=($pr->custo==$a->custo) ? 1 : 0; $codbar=($pr->codbar==$a->codbar) ? 1 : 0; $cf=($pr->cf==$a->cf) ? 1 : 0; $venda=($pr->venda==$a->venda) ? 1 : 0; if($un.$prod.$custo.$codbar.$cf.$venda !== '111111') { echo "<tr><td>**<td>**<td>**"; echo "<tr><td>Código<td>$pr->codprod<td>$a->codprod"; if($pr->prod!==$a->prod) { echo "<tr><td>Descriçao<td>$pr->prod<td>$a->prod"; } if($pr->custo!==$a->custo) { echo "<tr><td>Custo<td>$pr->custo<td>$a->custo"; } if($pr->codbar!=$a->codbar) { echo "<tr><td>Código de Barra<td>$pr->codbar<td>$a->codbar"; } if($pr->cf!==$a->cf) { echo "<tr><td>NCM<td>$pr->cf<td>$a->cf"; } if($pr->venda!==$a->venda) { echo "<tr><td>Venda<td>$pr->venda<td>$a->venda"; } } } } } }
-
Esse é um problema difícil de resolver, eu decidi fazer gambiarra: <?php // tb_cadastro (id pk nn ai,nome varchar(45)) InnoDB // (1,"Frank")(2,"João")(3,"Pedro")(4,"Rafael")(5,"Lazaro") session_start(); $conn=mysqli_connect("localhost","root","","polo"); $avancar=(isset($_GET['avancar'])) ? $_GET['avancar'] : null; $where=""; if($avancar) { $id=$_SESSION['referencia']+$avancar; $where="where id >= $id"; } $intervalo=3; $query=$conn->query("select * from tb_cadastro $where order by nome limit $intervalo"); $clientes=$query->fetch_all(MYSQLI_ASSOC); $query=$conn->query("select count(*) as limite from tb_cadastro"); $limite=$query->fetch_assoc()['limite']-$intervalo; $_SESSION['referencia']=($limite>$clientes[0]['id']) ? $clientes[0]['id'] : $limite; $pagina=$intervalo-1; ?> <table> <tr> <td><a href="?avancar=<?=-$pagina?>">Anterior</a> <td><a href="?inicio">Inicio</a> <td><a href="?avancar=<?=$pagina?>" >Posterior</a> <tr> <th>id<th>cliente <?php foreach($clientes as $cliente) : ?> <tr><td><?=$cliente['id']?><td><?=$cliente['nome']?> <?php endforeach; ?> Esse código saiu em desacordo com a estrutura da tabela que você apresentou, mas precisei simplificar para a listagem não ficar longa.
-
Uma nova janela (e não um novo guia) do navegador com Java Script
uma questão postou Frank K Hosaka PHP
<script> window.open("https://www.example.com", "novaJanela", "width=400,height=300,toolbar=no,location=no,menubar=no,scrollbars=yes,resizable=yes"); </script> -
Download automático de video e upload em FTP
pergunta respondeu ao regiane cecilia Primoni de Frank K Hosaka em PHP
Achei isso com a Gemini: <?php // Verifica se o arquivo foi enviado if (isset($_FILES['arquivo'])) { // Define o nome do arquivo $nomeArquivo = $_FILES['arquivo']['name']; // Define o local de destino $destino = "uploads/" . $nomeArquivo; // Move o arquivo para o destino if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $destino)) { echo "Arquivo salvo com sucesso!"; } else { echo "Erro ao salvar o arquivo."; } } ?> -
O código a seguir faz o download do arquivo csv.csv com a ajuda do JavaScript. Ele não deveria funcionar, pois ele está amarrado dentro de um link vazio (href=""). Mas eu consegui fazer funcionar colocando um comando logo abaixo do location.replace. Mas isso só funciona se a página de destino for trabalhar com o download. Se a próxima página não for download, o código Java só vai funcionar se você colocar qualquer coisa no link, na propriedade href. Melhor mesmo é não usar o JavaScript, a sintaxe do link é <a href="paginaDestino.php">Próximo</a>, mas no meu caso precisei apelar para a gambiarra: arquivo csv.csv 1 arquivo index.php <script> function bling() { location.replace("teste.php") alert() } </script> <a href="" onclick=bling()>Bling</a> arquivo teste.php <?php header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("csv.csv")); header('Content-Length: ' . filesize("csv.csv")); ob_get_clean(); readfile("csv.csv");
-
[Editado]
-
Finalmente, consegui montar um arquivo csv no servidor e baixar no notebook. O meu problema estava no comando readfile("$pBling.csv"), ele baixava o arquivo csv mas também todo o código HTML que fazia parte do contexto do código PHP. Na base da persistência, encontrei o comando ob_get_clean que "limpa" a área de trabalho e só manda o arquivo csv. arquivo bling.php <?php include('menu.php'); $pedido=$_GET['pedido']; $pBling=$_GET['pBling']; $query=$mysqli->query("select count(bling) as contagem from tbpedido where bling=$pBling"); $verificar=$query->fetch_all(MYSQLI_ASSOC)[0]['contagem']; if($verificar) { exit; } $mysqli->query("update tbpedido set bling=$pBling where ped=$pedido"); $contato="Consumidor Final"; $query=$mysqli->query("select * from tbhistped where ped=$pedido"); $itens=json_decode(json_encode($query->fetch_all(MYSQLI_ASSOC))); $query=$mysqli->query("select sum(subtotal) as soma from tbhistped where subtotal < 0 and ped=$pedido"); $desconto=($query->fetch_assoc()['soma']) ? abs($query->fetch_assoc()['soma']) : 0; $query=$mysqli->query("select total from tbpedido where ped=$pedido"); $total=$query->fetch_assoc()['total']; $query=$mysqli->query("select dia from tbpedido where ped = $pedido"); $data=date('d/m/Y',strtotime($query->fetch_assoc()['dia'])); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $arquivo = fopen("$pBling.csv", "w"); fputcsv($arquivo, $dados[0]); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } fclose($arquivo); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$pBling.csv")); header('Content-Length: ' . filesize("$pBling.csv")); ob_get_clean(); readfile("$pBling.csv"); unlink("$pBling.csv");
-
Download do PHP só funciona se você ficar de braço cruzado
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Na hora de mandar o arquivo para a Bling, a Bling se recusou de receber porque estava fora do padrão que ela esperava. Eu fui ver o arquivo, e levei um susto. Hoje eu aprendi que o comando do PHP header( ) é poderoso, mas se tiver alguma ponta solta lá atrás, o resultado é um completo desastre. Para resolver o meu problema, eu tive que tirar o comando include('menu.php'), e no lugar eu criei uma conexão com o banco de dados $mysqli=new mysqli etc. Ou seja, eu devo ter feito muita besteira no arquivo menu.php para atrapalhar o serviço de download do PHP. -
Download do PHP só funciona se você ficar de braço cruzado
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Depois de várias tentativas, creio que não é possível fazer mais nada depois que você pede para o PHP fazer o download; se você coloca uma instrução para voltar para o orçamento, ele faz o serviço, mas não faz o download, isso porque o PHP carrega todas as instruções de uma vez para o navegador. Não há como pedir para o PHP fazer por parte, eu até usei o comando sleep. Não sei para que inventaram esse comando. Por outro lado, dá para fazer um monte de gambiarra antes de pedir para o PHP fazer o download com a ajuda do JavaScript, assim: <script> function bling(pedido) { pBling=prompt("digite o número do pedido na Bling") window.location.href="?ControleOrcamento.bling."+pedido+"&pBling="+pBling alert('Por favor, aguarde o download') location.replace() } </script> Essa função foi definida no formulário do orçamento, e ele é executado a partir de um link. O Java Script pede o número do pedido na Bling, a seguir ele pede para o PHP fazer o download, a seguir pede para o usuário aguardar, a seguir o navegador (testei o Chrome e o Edge) confirma o download, e finalmente o usuário clica ok no alerta, e finalmente o Java Script atualiza a tela, onde o usuário vê a confirmação do pedido da Bling no orçamento PHP. Esse Java Script é muito bom, se bem que toda essa improvisação eu consegui na base da tentativa e erro. -
Fiquei o dia todo testando o download do PHP, tentando atualizar a tela do orçamento, mas não consegui. Eu só consegui fazer o download funcionar, quando eu pedi para ele não fazer mais nada. Existe algum macete para fazer o download e em seguida pedir para o PHP atualizar a tela do orçamento? A Gemini sugeriu usar o JavaScript para redirecionar, tipo echo "<script>window.location.href='orcamento.php'</script>; o download funcionou, mas o Java Script não. <?php class ControleOrcamento extends Controle { // ... public function bling($pedido) { $pBling=$_GET['pBling']; $this->Conexao->update("tbpedido set bling=$pBling where ped=$pedido"); $contato="Consumidor Final"; $itens=$this->Conexao->select("* from tbhistped where ped=$pedido"); $desconto=$this->Conexao->select("sum(subtotal) as soma from tbhistped where subtotal < 0 and ped=$pedido")[0]->soma; $total=$this->Conexao->select("total from tbpedido where ped=$pedido")[0]->total; $data=date('d/m/Y',strtotime($this->Conexao->select("dia from tbpedido where ped = $pedido")[0]->dia)); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $arquivo = fopen("$pBling.csv", "w"); fputcsv($arquivo, $dados[0]); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } fclose($arquivo); if (file_exists("$pBling.csv")) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$pBling.csv")); header('Content-Length: ' . filesize("$pBling.csv")); readfile("$pBling.csv"); unlink("$pBling.csv"); } // return header("location:?ControleOrcamento.inicio"); exit; }
-
tente var_dump($vagas); ou, se preferir: var_dump($vagas[1]); ou você pode personalizar, assim: <?php $vagas=json_decode( '[1,1,[ {"id":"1064992","vaga_id":660,"horaentrada":"2024-04-04 12:03:12", "horalimite":"2024-04-04 12:03:08","pago":null,"incorreto":"0","placa":null, "autuacao_id":null,"autuacao_placa":null,"data_notificacao":null, "regularizado":null,"pagamento_valor":null,"pagamento_tempo":null,"pagamentos": {"valor":0,"tempo":0,"data":null},"minutos":-337}, {"id":"1064993","vaga_id":666,"horaentrada":"2024-04-04 13:27:24", "horalimite":"2024-04-04 13:28:24","pago":0,"incorreto":0,"placa":"AAx1234", "autuacao_id":null,"autuacao_placa":null,"data_notificacao":null, "regularizado":null,"pagamento_valor":null,"pagamento_tempo":null,"pagmentos": {"valor":0,"tempo":0,"data":null},"minutos":-261}]]'); $vagasOcupadas=$vagas[2]; echo "<table><td>Vaga<td>Placa<td>Entrada<td>Limite"; foreach($vagasOcupadas as $vaga) { echo "<tr><td>$vaga->vaga_id<td>$vaga->placa<td>$vaga->horaentrada<td>$vaga->horalimite"; }
-
Em 2020 não existia a inteligência artificial como a Gemini, desde então fui forçado a usar o marcador <input> para pegar informação do usuário. Aqui em 2024, a Gemini disse que é possível pegar informação do usuário sem o marcador <input>, assim: arquivo index.php <?php class bling { public function __construct() { if(isset($_GET['pedidoPHP'])) { echo "O número do pedido PHP é ".$_GET['pedidoPHP']."<br>"; echo "O número do pedido Bling é ".$_GET['pedidoBling']; exit; } } } (new bling); $pedidoPHP=666; ?> <script> function bling(pedidoPHP) { pedidoBling=prompt("Número do Pedido Bling") window.location.href="?pedidoPHP="+pedidoPHP+"&pedidoBling="+pedidoBling } </script> <a href="#" onclick="bling(<?=$pedidoPHP?>)">Bling</a>
-
Esse foi difícil, mas eu consegui: <?php $mysqli=new mysqli("localhost","root","","diario"); $vetor=[]; $vetor[]=(object) json_decode('{"1":1}'); $vetor[]=(object) json_decode('{"1":2}'); $vetor[]=(object) json_decode('{"1":3}'); $vetor[]=(object) json_decode('{"2":4}'); print_r($vetor); // Array ( [0] => stdClass Object ( [1] => 1 ) [1] => stdClass Object ( [1] => 2 ) // [2] => stdClass Object ( [1] => 3 ) [3] => stdClass Object ( [2] => 4 ) ) foreach($vetor as $vet) { foreach($vet as $id=>$valor) { $mysqli->query("insert into tabela (id,valor) values ($id,$valor)"); } }
-
Como não dá para usar a Bling no tablet ou no celular, eu criei essa gambiarra para transformar o notebook numa ponte entre a Hostinger e a Bling. O PHP cria o arquivo CSV no servidor, depois faz o download no notebook, e em seguida o Bling importa o pedido de venda para fazer o resto do serviço. <?php class ControleOrcamento extends Controle { // ... public function bling() { $pedido=63; $contato="Consumidor Final"; $data="30/03/2024"; $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento"), array($pedido,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, 1604,"pc",1,1,1, 1,null,null,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0) ); // Abrir o arquivo CSV para escrita $arquivo = fopen("novo.csv", "w"); // Escrever o cabeçalho do arquivo fputcsv($arquivo, $dados[0]); // Escrever os dados do array no arquivo foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } // Fechar o arquivo fclose($arquivo); if (file_exists("novo.csv")) // não usado a variável $arquivo porque o comando exige string e não um componente { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("novo.csv")); header('Content-Length: ' . filesize("novo.csv")); readfile("novo.csv"); } else { echo "Arquivo não encontrado."; } }
-
Eu estava estudando um meio de emitir o cupom fiscal em São Paulo e a orientação que recebi da contabilidade é que eu corresse atrás de um programador homologado na Secretaria da Fazenda bem como do aparelho do SAT. O aparelho mais em conta que eu achei foi o da Tanca (R$ 850,00) e o preço da instalação é de R$ 100,00. Eu decidi instalar por conta própria, é bem difícil, o técnico cobra o preço justo, mas eu consegui configurar o aparelho bem como ativar na Sefaz. Consultei dois programadores, e eles me pediram para assinar o plano (um pediu R$ 75,00 por mês, outro pediu R$ 250,00 por mês) que iria instalar e ensinar a como emitir um cupom fiscal. Na internet, eu encontrei a Bling, mas o programa da Bling não emite Cupom Fiscal (CF-e SAT). Para a minha surpresa a Bling me apresentou a NFC-e e eles me informaram que a Nota Fiscal ao Consumidor não precisa da SAT. O portal da NFC-e de São Paulo http://www.nfce.fazenda.sp.gov.br/NFCePortal/Paginas/DuvidasFrequentes.aspx diz que o SAT é obrigatório, já a Bling afirma o contrário. Para resolver esse dilema, eu tirei o SAT do notebook, pedi o credenciamento da NFC-e na Sefaz, peguei o código de segurança do contribuinte, configurei o programa da Bling, mudei o modo teste para o modo produção, e assim consegui conferir que a Bling estava com razão. Estou usando o plano amostra grátis da Bling, ainda tenho 20 dias para testar. O plano mais em conta é o Cromo de R$ 30,00 por mês. Eu gostei da Bling, o único problema é que tudo acontece na internet, onde ninguém pode lhe convencer que os seus dados estão seguros. Para atualizar o banco de dados da Bling estou usando os meus códigos em PHP, o MySQL e o Excel, mas acho que só o Excel é suficiente para o programador ajudar o contribuinte a montar o banco de dados na Bling. Aconselho a usar o Excel CSV, os outros formatos só me deram dor de cabeça. Para corroborar a Bling eu encontrei o artigo 6o. da Portaria CAT 12 de 04/02/2015 que obriga a NFC-e a trabalhar com o SAT bem como a Portaria SRE 34/23 de 05/05/23 que revogou o artigo 6o.
-
A melhor maneira de estudar o PHP é usando o método GET para quem é iniciante, ele coloca na barra de endereço do navegador todos os valores que você pretende passar de um código para outro. Depois de três anos, você começa a perceber que o método GET começa a atrapalhar. Eu, por exemplo, tenho um comando que pede para atualizar a tela, mas ele acaba duplicando o registro e eu sou forçado a apagá-lo. Hoje, eu encontrei uma solução, eu não sei se ele é válido, por isso eu dei o nome de POG (Programação Orientada à Gambiarra). Eu usei o comando header, é o único meio que eu encontrei para "limpar" a barra de endereço do navegador: <?php class ControleEstoque extends Controle { // ... public function atualizar() { $itens=$this->Conexao->select("* from tbentraprod"); foreach($itens as $item) { $codprod=$item->codprod; $prod=$this->Conexao->select("* from tbprod where codprod=$codprod")[0]; $id=$item->id; $this->Conexao->update("tbentraprod set prod='$prod->prod',margem=$prod->marg where id=$id"); } // return $this->entraProduto(); return header("location:?ControleEstoque.entraproduto"); } O mais sensato seria usar o método POST. Isso eu já faço, quando eu monto um <form method=post>. Eu tentei usar o método POST no link tipo <a href=qualquerlugar.php method=post>, mas isso não deu certo.
-
Como procurar um produto pela descrição parcial? [resolvido]
pergunta respondeu ao Frank K Hosaka de Frank K Hosaka em PHP
Usei o MySQL Workbench, e consegui achar o resultado assim: select * from produtos where descricao like 'cadeado%20%' ou seja, a solução para o problema é dividir a variável $busca em $parte1 e $parte2, e depois concatenar os dois usando o coringa % no meio dos dois. -
Ontem eu vi a lista de produtos da Bling, eu digitei 417, e ele me retornou o produto correspondente. O código que eu fiz busca o produto por descrição. Para procurar em outros campos, eu inventei um código baseado no primeiro caractere, tipo @417, só que ele retorna o produto do código 417 bem como o 1417 e outros produtos que contenham o 417 na descrição ou no código de barra. Fiquei imaginando se é possível priorizar a busca pelo código do produto, e a Gemini me passou a instrução INSTR, assim: <?php // $produtos=$this->Conexao->select("* from tbprod where // concat_ws(',',codprod,un,prod,codbar,loc,emb,cf,codforn) like '%$busca%' // order by prod"); $produtos=$this->Conexao->select("* FROM tbprod WHERE INSTR(concat_ws(',', codprod, prod, codbar), '$busca') > 0 ORDER BY INSTR(concat_ws(',', codprod, prod, codbar), '$busca'), prod"); O código da Gemini é engenhoso, ele realmente prioriza o código que foi digitado, mas o resultado da Bling é fascinante. Ele só retorna o produto do código correspondente e não mostra mais nada. Desconfio que o código da Bling seja assim: 1. pegar o que foi digitado no <input> e guarda em $busca. 2. se $busca é numérico e o seu valor for menor igual ao maior código dos produtos, então execute o comando "select * from produtos where codigoProduto = $busca". 3. se $busca é numérico e o seu valor for maior que o maior código dos produtos, então execute o comando "select * from produtos where codigoBarra = $busca". 4. se $busca não é numérico, então execute o comando "select * from produtos where descricaoProduto like '%busca%'". O que mais me impressionou no motor de busca da Bling é o uso parcial na busca pela descrição do produto. Vamos supor que temos algo do tipo "cadeado trancatudo 20mm", eu posso buscar o produto na Bling usando como critério escrevendo assim "cadeado 20mm". Nesse caso o verbo like ou o INSTR não retornam coisa alguma. Alguém tem alguma ideia de como é possível consultar um produto usando partes da descrição sem a necessidade dessas partes estarem na mesma posição?
-
consumindo wsdl com php com retorno em xml
pergunta respondeu ao rinaldofcosilva de Frank K Hosaka em Repositório de Scripts - PHP
Se eu entendi a sua pergunta, você quer que o PHP pegue as informações contidas no arquivo xml; o PHP tem o comando simplexml_load_file( ), mas se ele conseguir abrir o arquivo, o resultado é o mesmo que você vê na tela do navegador, mas você pode separar as informações por chave mais ou menos assim: <?php $xml = simplexml_load_file("meu_arquivo.xml"); if ($xml) { // Acessa os dados do XML echo $xml->nome; echo $xml->idade; } else { echo "Erro ao abrir o arquivo XML."; } Mas se você tiver dúvida de como usar o portal da SSW, eu só consegui achar o email contato@ssw.inf.br, mas eu aconselho a conversar com quem já usou o serviço deles, principalmente os amigos de longa data. -
O máximo que eu consegui foi bloquear o usuário. Para conseguir isso, eu tive que tirar o campo data da tabela bloqueios_login. As tabelas ficaram assim: CREATE TABLE `bloqueios_login` ( `ip` varchar(20) DEFAULT NULL, `tentativas` int DEFAULT NULL, `codigo_cliente` int DEFAULT NULL, `navegador` varchar(100) DEFAULT NULL, `id` int NOT NULL AUTO_INCREMENT, `codigo_stm` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CREATE TABLE `streamings` ( `id` int NOT NULL AUTO_INCREMENT, `porta` varchar(45) DEFAULT NULL, `senha` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci Na tabela streamings, utilizei um usuário válido assim (id,porta,senha) (2,2,2). No seu código, o cálculo de número de tentativas não estava dando certo, acrescentei a chave do array [0], e utilizei dois arquivos para testar o seu código: arquivo index.php <form method=post action=verificar.php> porta<input name=porta value="1"><br> senha<input name=senha value="1"><br> <input type=submit> </form> arquivo.verificar.php <?php $conexao=new PDO("mysql:host=localhost;dbname=irlanda","root",""); // Verificar se o formulário de login foi submetido if ($_SERVER["REQUEST_METHOD"] == "POST") { $porta = $_POST['porta']; $senha = $_POST['senha']; // Verificar se o IP já foi bloqueado $ip = $_SERVER['REMOTE_ADDR']; $verificarBloqueio = $conexao->prepare("SELECT * FROM bloqueios_login WHERE ip = ?"); $verificarBloqueio->bindParam(1, $ip,PDO::PARAM_STR); $verificarBloqueio->execute(); $stm=$verificarBloqueio; $resultadoBloqueio = $verificarBloqueio->fetchAll(PDO::FETCH_ASSOC); if(!isset($tentativas)) { $tentativas=0; } if ($stm->rowCount() > 0) { // Se o IP já estiver na tabela, atualize o número de tentativas $tentativas = $resultadoBloqueio[0]['tentativas'] + 1; // Verificar se excedeu o limite de tentativas if ($tentativas >= 6) { die("Seu IP foi bloqueado devido a múltiplas tentativas de login malsucedidas. Tente novamente mais tarde."); } // Atualizar o número de tentativas na tabela a cada erro $atualizarTentativas = $conexao->prepare("UPDATE bloqueios_login SET tentativas = ? WHERE ip = ?"); $atualizarTentativas->bindParam(1,$tentativas,PDO::PARAM_INT); $atualizarTentativas->bindParam(2,$ip,PDO::PARAM_STR); $atualizarTentativas->execute(); } else { // Se o IP não estiver na tabela, insira-o como 1 tentativa $inserirBloqueio = $conexao->prepare("INSERT INTO bloqueios_login (codigo_cliente, data, ip, navegador, tentativas) VALUES (?, NOW(), ?, ?, 1)"); $codigoCliente = 1; // Aqui está enviando a informação para o banco como 1 , preciso enviar o que está na tabela codigo_cliente $navegador = $_SERVER['HTTP_USER_AGENT']; $inserirBloqueio->bindParam(1,$codigoCliente,PDO::PARAM_INT); $inserirBloqueio->bindParam(2,$ip,PDO::PARAM_STR); $inserirBloqueio->bindParam(3,$navegador,PDO::PARAM_STR); $inserirBloqueio->execute(); } // Obter a porta digitada no formulário $porta = $_POST['porta']; // Adicionar a porta na coluna codigo_stm coletada do que foi digitado no formulario não há necessidade de busca na tabela $adicionarPorta = $conexao->prepare("UPDATE bloqueios_login SET codigo_stm = ? WHERE ip = ?"); $adicionarPorta->bindParam(1,$porta,PDO::PARAM_STR); $adicionarPorta->bindParam(2,$ip,PDO::PARAM_STR); $adicionarPorta->execute(); // Verificar as credenciais do usuário se está correta $verificarUsuario = $conexao->prepare("SELECT * FROM streamings WHERE porta = ? AND senha = ?"); $verificarUsuario->bindParam(1,$porta,PDO::PARAM_STR); $verificarUsuario->bindParam(2,$senha,PDO::PARAM_STR); $verificarUsuario->execute(); $stm=$verificarUsuario; $resultadoUsuario = $verificarUsuario->fetchAll(PDO::FETCH_OBJ); // Se as credenciais estiverem corretas if ($stm->rowCount() > 0) { // Limpar o IP da tabela de bloqueios se o login for bem-sucedido $limparBloqueio = $conexao->prepare("DELETE FROM bloqueios_login WHERE ip = ?"); $limparBloqueio->bindParam(1, $ip,PDO::PARAM_STR); $limparBloqueio->execute(); // Adicionar o valor da "porta" na coluna 'codigo_stm' $row = $resultadoUsuario->fetch_assoc(); $codigo_stm = $row['codigo_stm']; echo "Login bem-sucedido! Código STM: $codigo_stm"; } else { echo "Credenciais inválidas. Por favor, tente novamente. Tentativa n. $tentativas"; include 'index.php'; } } Como você pode ver usei os métodos nativos do PDO, o que você usa é personalizado.
-
O problema é entender esse ID que você menciona, é difícil imaginar um registro com ID=1, outro com ID=3, outro com ID=3. Geralmente, o id é chave primária de quase todas as tabelas, e muitas delas tem um auto incremento, e assim não é permitido repetir o mesmo id. Se você puder dar um exemplo seria mais fácil ajudá-lo. A seguir montei um código mais simplificado para entender o seu problema: <?php $conn=new mysqli("localhost","root","","diario"); $conn->query("drop table if exists usuarios_dados"); $conn->query("CREATE TABLE `usuarios_dados` (`id` int NOT NULL AUTO_INCREMENT, `empresa` varchar(45) DEFAULT NULL,`senha` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"); $conn->query("insert into usuarios_dados (empresa,senha) values ('Varig','senha'),('Globo','senha'), ('Record','senha'),('Laravel','senha'),('Band','senha')"); $result=$conn->query("select * from usuarios_dados"); ?> <table class='tabela_dados' border='1'> <tr> <td>id</td> <td>Empresa</td> </tr> <?php if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { ?> <tr> <td><?=$row['id']?></td> <td><?=$row['empresa']?></td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='id' value='<?=$row[id]?>'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='id' value='<?=$row[id]?>'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> <?php } }
-
Eu ainda não tenho menor ideia do que seja distribuição de responsabilidade, mas para usar um view por vários métodos diferentes, eu inventei o POG, ou seja, tentativa e erro até funcionar: Arquivo Index.php <?php class Controller { public function getUserInput() { if($_GET) { $metodo = key($_GET)=='pergunta' ? $_GET[key($_GET)] : key($_GET); $parametro= key($_GET)!=='pergunta' ? $_GET[$metodo] : null; return $this->$metodo($parametro); } $this->loadview('candidato ou cliente?','pergunta'); } private function candidato($parametro) { $nome = $parametro ?? null; if($nome) { echo "O nome do candidato é " . $nome . "<hr><br>"; $_GET=null; return $this->getUserInput(); } $this->loadView('nome do candidato?','candidato'); } private function cliente($parametro) { $nome = $parametro ?? null; if($nome) { echo "O nome do cliente é " . $nome . "<hr><br>"; $_GET=null; return $this->getUserInput(); } $this->loadView('nome do cliente?','cliente'); } private function loadView($mensagem,$metodo) { require 'view.php'; } } (new Controller)->getUserInput(); Arquivo view.php <form> <?=$mensagem?> <input name=<?=$metodo?>> <input type='submit'> </form>