
Frank K Hosaka
Membros-
Total de itens
1.578 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Não testei, mas acho que a solução está aqui: Conexão do MS Access e PHP - Stack Overflow em Português
-
Com a ajuda do YouTube LARAVEL BÁSICO PARA INICIANTES - PARTE 1 de 3 - YouTube consegui abrir a pasta Usuários>frank>example-app com o Visual Studio Code, e de lá contemplar o código web.app routes>web.app ----------------------------------------------- <?php use Illuminate\Support\Facades\Route Route::get('/', function () { return view('welcome'); }); Também aprendi que não preciso do Ubuntu para ativar o servidor do Laravel, dá para fazer pelo prompt do Windows: C:\Users\frank\example-app>php artisan serv Seguindo o tutorial do YouTube, alterei return view('welcome') para return '<h1>olá mundo!</h1>, fui no navegador e digitei localhost:8000 e eu vi novamente a tela de boas vindas do Laravel. Eu esqueci de salvar o arquivo.
-
$cadatroUsuarioEmpresa['user_id'] = $inputDadosCadastro['user_id']; Pelo código que você passou, não dá para dizer se a variável $inputDadosCadastro['user_id'] contém o valor que você afirma que foi gerado. Eu precisaria de mais informações para depurar todo o programa, para saber se a variável tem a informação que você precisa. Por outro lado, achei interessante essa parte do código: $cadatroUsuario = array(); $cadatroUsuario['user_email'] = $inputDadosCadastro['user_email']; $cadatroUsuario['user_password'] = md5($inputDadosCadastro['user_password']); $cadatroUsuario['user_level'] = 3; $cadatroUsuario['user_registration'] = date('Y-m-d H:i:s'); $addbanco->ExeCreate("ws_users", $cadatroUsuario); Para mim, você está tentando incluir um array na tabela ws_users, mas não dá para afirmar nada sem ver a classe que está vinculado à variável $addbanco. Eu simulei um teste aqui e consegui isso: <?php $mysqli= new mysqli("localhost","root","","astudy"); $cadastroUsuario = array(); $cadastroUsuario['email'] = 'rogerio@gmail.com'; $cadastroUsuario['nome']='Rogerio Ceni'; $jcadastro=json_encode($cadastroUsuario); $query=$mysqli->query("insert into tbusuario (jcadastro) values ('$jcadastro')"); Ou seja, o PHP e o MySQL não permitem que eu salve um array num campo da tabela, a menos que o array seja convertido num json e o campo da tabela também seja um json.
-
Eu ainda não sei o que é o Laravel, mas ele é bastante comentado no forum do PHP. Para eu não ficar de fora, tentei instalar no meu PC. Encontrei vários tutoriais no Google, e como sempre o que o Google mostra não é nada do que eu vejo na minha tela. Eu tive que ver o YouTube, e ele disse que o Laravel está instalado quando você digita "localhost:8000" no navegador e vê o logotipo do Laravel. Não era o meu caso. Certamente, eu fiz muita besteira no meio do caminho. Eu vi um tutorial para usar o Ubuntu com o comando sudo php artisan serve e a mensagem que eu recebi é de que o composer estava usando a versão antiga do PHP, quando deveria usar a mais nova. O meu sistema é o Windows, mas no meio da confusão eu consegui instalar o Ubuntu dentro do Windows. Procurei outro tutorial para consertar o erro, encontrei um interessante para alterar a varável do ambiente do Windows. Não deu certo, mesmo reiniciando quinhentas vezes. Apelei para o Google, e encontrei um tutorial muito bacana. Já que não dá para resolver pelo Windows, o negócio é apelar para o Ubuntu. Nesse tutorial, o rapaz ensina a instalar o PHP dentro do Ubuntu: Ways to install Laravel 8.0 on Windows 11 | by Jayden Chua | CodeX | Medium - muita coisa eu já havia feito, só priorizei os comandos que instalam o PHP no Ubuntu. Consegui até alterar a versão a ser usada no Ubuntu. E assim tentei de novo: sudo php artisan serve, e como sempre apareceu outra mensagem, dessa vez assim PHP Fatal error: Uncaught Error: Class 'DOMDocument' not found. Outra vez pedi ajuda para o Google, e ele me deu esse endereço: Class 'DOMDocument' not found | PHP Composer: Dependências, Autoload e Publicação | Solucionado (alura.com.br) Finalmente, o php artisan disse que o servidor estava ativo na porta 8000. Traduzindo em português, isso significa que eu preciso deixar a janela do Ubuntu aberta. Enfim, eu não sei para que serve o Laravel, mas pelo menos eu sei o quanto as pessoas apanharam para instalar no PC. Mas estou contente em rever o Ubuntu, eu usei uma vez em 1993, e acabei perdendo o meu PC, e assim nunca mais eu queria saber de Linux. Eu acho que fiz muita besteira, acho que o Ubuntu não é necessário para usar o Laravel no Windows, mas foi com o Ubuntu que consegui botar o logotipo da Laravel na tela do navegador. Eu ainda não usei, pois eu morro de medo de ver novas mensagens de erro.
-
Eu também tive esse problema. Eu brinquei com o header("HTTP/1.1 301 Moved Permanently"); e fiquei cinco anos sem poder usar o WampServer, o MySQL, o PHP, o Facebook, o Windows e até o celular. Foi uma época triste, e ninguém sabe como resolver esse problema. Eu tentei de tudo, fui procurar o tal do .htacess do Apache e não achei. Quando o assunto é servidor, quase tudo é voltado para o Linux e nada para o Windows, que é o meu caso. Pensei em até pular da ponte. Mas eu fiz a minha última tentativa desesperada. Pedi para o Microsoft Edge limpar todo o histórico, todos os cokies, tudo o que havia ajuntado nos últimos trinta anos. E deu certo. Consegui acessar o localhost, graças a Deus. O chato é que eu não lembrava mais da senha para acessar o fórum Script Brasil.
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Exemplo de inventário com MySQL, PHP, HTML e Bootstrap 5.2</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous"> <style> .direita{text-align:right} .tela{width:500px} </style> <?php function dec($num) {if (empty($num)) {$fmt="";} else {$fmt = number_format($num,2,',','.'); return $fmt;}} $mysqli=new mysqli("localhost","root","","diario"); $query=$mysqli->query("select * from vw_inventario limit 10"); $linha=$query->fetch_all(MYSQLI_ASSOC); print "<div class=tela><table class='table table-sm table-striped'><th>Produto<th>Preço<th>Quantidade<th>Un<th>Estoque"; foreach ($linha as $listar) { $nomeProd = $listar['prod']; $p_venda = dec($listar['custo']*1.3); $quantidade = dec($listar['qtd']); $un=$listar['un']; $subtotal = dec($listar['custo']*1.3*$listar['qtd']); print "<tr><td nowrap>$nomeProd<td class=direita>$p_venda<td class=direita>$quantidade<td>$un<td class=direita>$subtotal";} print "</table></div>";
-
<?php $array=array( array( "registro" => 5, "data" => "14/10/2020", "horario" => "12:13 - 13:13 - 18:13 - 8:13", "ponto" => array ( "nome" => "ANDERSON LUIZ", "diasTrabalho" => "SEG-SEX", "horarioTrabalho" => "10 AS 18H" )), array ( "registro" => 4, "data" => "13/10/2020", "horario" => "15:29 - 16:11", "ponto" => array ( "registro" => 4, "nome" => "CAIO SANTOS", "diasTrabalho" => "SEG A SEX", "horarioTrabalho" => "9 AS 15H" )), array ( "registro" => 4, "data" => "14/10/2020", "horario" => "20:15", "ponto" => array ( "registro" => 4, "nome" => "CAIO SANTOS", "diasTrabalho" => "SEG A SEX", "horarioTrabalho" => "9 AS 15H")), array ( "registro" => 1, "data" => "13/10/2020", "horario" => "12:43 - 14:55", "ponto" => array ( "registro" => 1, "nome" => "DANIEL SANTOS", "diasTrabalho" => "SEG A SEX", "horarioTrabalho" => "9 AS 13H" ))); // ordenar o array asort($array); // listar horário de entrada por colaborador foreach($array as $key) { $registro=$key['registro']; $nome=$key['ponto']['nome']; $data=$key['data']; $horario=$key['horario']; if(empty($controle)){ $controle=$nome; echo "Registro $registro $nome <br>     $data:$horario <br>"; goto prossegue;} if($controle==$nome){ echo "<br>     $data:$horario<br>";} else {$controle=$nome; echo "Registro $registro $nome <br>     $data:$horario";} prossegue: } Resultado: Registro 1 DANIEL SANTOS 13/10/2020:12:43 - 14:55 Registro 4 CAIO SANTOS 13/10/2020:15:29 - 16:11 14/10/2020:20:15 Registro 5 ANDERSON LUIZ 14/10/2020:12:13 - 13:13 - 18:13 - 8:13
-
Eu não consegui arranjar uma solução para o registro contábil do cartão de crédito. O regime de competência permite que eu faça o lançamento, desde que eu tenha um documento, do tipo email do Uber. O Uber diz que vai cobrar R$ 15,00 por uma viagem do Jabaquara para Diadema. O lançamento ficaria assim: 1/9/22 D Transporte C Contas a Pagar, R$ 15,00, Visa Uber Jabaquara Olhando o balancete de 09/2022, tenho algo do tipo Contas a Pagar R$ 30,00 - como é que vou saber quanto do cartão de crédito tem nessa conta? Eu ainda não tenho a menor idéia, mas eu fiz a seguinte gambiarra, dessa vez, usando o regime de caixa: 10/10/22 C Contas a Pagar, R$ 15,00, Visa 09-22 10/10/22 D Transporte, R$ 15,00, Visa 01-09 Uber É óbvio que esse valor não vai aparecer no balancete de 09/2022, mas ele já está disponível no balancete de 10/2022. Ou seja, ao invés de usar a Contabilidade como uma maquina do tempo para olhar o passado, o que me impede de fazer lançamentos futuros? Claro que isso é uma péssima solução, mas com essa gambiarra eu posso usar a Contabilidade para acompanhar os lançamentos do cartão de crédito.
-
Encontrei o tutorial de como fazer dump do MySQL pelo PHP nesse endereço: Backup do banco de dados MySQL com PHP – Rafael Couto - eu ainda prefiro fazer pelo Workbench.
-
Cálculo com datas não funciona.
pergunta respondeu ao Edilson Santiago de Frank K Hosaka em Tutoriais & Dicas - PHP
Comigo deu tudo certo, só precisei colocar aspas na consulta $criancas = "SELECT * FROM tbpessoa WHERE DtNasc BETWEEN '$menos9anos' AND '$dataatual'"; Veja também o MySQL e confira se DtNasc foi configurado como DATETIME. -
Com os campos id, senha, ip e vip não há como usar o relógio do sistema para definir o vip para 1 depois de 30 dias. Mas já que o programa consegue alterar o vip de 1 para 5, por que não altera para 1, quando o jogador tiver chegado no 5?
-
Abrir página somente se o usuário estiver logado
pergunta respondeu ao mm_edilson de Frank K Hosaka em PHP
A minha sugestão é colocar isso no começo do index2.php session_start(); if(!isset($_SESSION["usuario"])){ header("location:index.php");exit;} Mas é preciso definir o $_SESSION["usuario"] no código valida_user.php, senão quem está devidamente cadastrado não vai conseguir entrar na página index2.php. -
O correto é usar o comando exportar do PHPMyAdmin ou do MySQL Workbench, e não o PHP.
-
Tentativa de limitar acesso a uma function
pergunta respondeu ao fernandopeluzo de Frank K Hosaka em PHP
Consegui consertar: <?php $username = "Frank"; $password = "1234"; if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'Usuário não autenticou a conta e senha'; exit;} else { if($_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password){echo "senha incorreta!";exit;}} echo "você está no estágio 2"; -
Não consigo retornar uma API Json PHP
pergunta respondeu ao paulo_henrique_cnl de Frank K Hosaka em PHP
Esse é um problema que enfrento há dois anos e não sei como resolver. O json_decode está retornando nulo para a $pagina porque ele entende que a $pagina não é um json válido. A pergunta que eu faço há dois anos é como tornar um texto no formato json se tornar válido no mundo do PHP. Como eu não entendo nada de programação, eu usei o famigerado método da tentativa e erro. Copiei a página http://transparencia.se.sesc.com.br/transparencia/api/licitacoes dentro do Notepad+. O Notepad+ ajuda bastante, pois ele avermelha as chaves { } e assim fica fácil separar as informações por parte e criar o arquivo astudy.php, assim astudy.php ------------------------------------ <?php $p001='{"pagina_total":3,"pagina_atual":1,"pagina_anterior":null,"pagina_proxima":2,"registro_total":21,"registro_atual":10}'; $teste=json_decode($p001);var_dump($teste); $p002='{"id":54,"identificacao":"Edital de Concorr\u00eancia N\u00b0 22\/000017","objeto":"Contrata\u00e7\u00e3o de empresa especializada para execu\u00e7\u00e3o das obras de revitaliza\u00e7\u00e3o da \u00e1rea de entorno das piscinas e recupera\u00e7\u00e3o do parque aqu\u00e1tico das unidades Sesc Praia e Sesc Beira Rio.","data_publicacao":"2022-08-19","data_abertura":"2022-09-06","local":"Sesc Caixeral Parna\u00edba-PI","telefone":"86 3217-2852","email":"licitasescpi@pi.sesc.com.br","processo":"N\u00b0 22\/000017","vencedores":[],"responsavel":"Supervis\u00e3o de Licita\u00e7\u00e3o","valor":"","modalidade":"Concorr\u00eancia","documentos":[{"descricao":"Edital de Concorr\u00eancia","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-edital-de-concorrencia-1661169326.pdf","tipo":null,"data":"2022-08-19 00:00:00"},{"descricao":"Anexo IV","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-anexo-iv-1660909754.pdf","tipo":null,"data":"2022-08-19 00:00:00"},{"descricao":"Anexo III","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-anexo-iii-1660909732.pdf","tipo":null,"data":"2022-08-19 00:00:00"},{"descricao":"ANEXO II ","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-anexo-ii-1660909699.pdf","tipo":null,"data":"2022-08-19 00:00:00"},{"descricao":"Anexo I","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-anexo-i-1660909679.pdf","tipo":null,"data":"2022-08-19 00:00:00"},{"descricao":"Aviso de Licita\u00e7\u00e3o","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/54\/54-aviso-de-licitacao-1660909627.pdf","tipo":null,"data":"2022-08-19 00:00:00"}],"classificados":[],"desclassificados":[]}'; $teste=json_decode($p002);var_dump($teste); $p003=`{"id":53,"identificacao":" Edital de Concorr\u00eancia RP N\u00b0 22\/000015","objeto":"Aquisi\u00e7\u00e3o de Materiais de Consumo Odontol\u00f3gico EPI'S para atender as demandas das clinicas odontol\u00f3gicas do Sesc\/PI.","data_publicacao":"2022-07-12","data_abertura":"2022-07-27","local":"Sesc AR\/PI","telefone":"86 3217-2852","email":"licitasescpi@pi.sesc.com.br","processo":"RP N\u00b0 22\/000015","vencedores":[],"responsavel":"Supervis\u00e3o de Licita\u00e7\u00e3o","valor":"","modalidade":"Concorr\u00eancia","documentos":[{"descricao":"Aviso de Resultado de Classifica\u00e7\u00e3o das Propostas","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/53\/53-aviso-de-resultado-de-classificacao-das-propostas-1659095595.pdf","tipo":null,"data":"2022-07-28 00:00:00"},{"descricao":"Ata de Sess\u00e3o 01","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/53\/53-ata-de-sessao-01-1658939463.pdf","tipo":null,"data":"2022-07-27 00:00:00"},{"descricao":"Edital de Concorr\u00eancia","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/53\/53-edital-de-concorrencia-1657812850.pdf","tipo":null,"data":"2022-07-27 00:00:00"},{"descricao":"Aviso de Licita\u00e7\u00e3o","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/53\/53-aviso-de-licitacao-1657797988.pdf","tipo":null,"data":"2022-07-12 00:00:00"},{"descricao":"MINUTA DO CONTRATO","arquivo":"http:\/\/transparencia.se.sesc.com.br\/uploads\/licitacao\/18\/53\/53-minuta-do-contrato-1658160342.docx","tipo":null,"data":"2022-02-27 00:00:00"}],"classificados":[],"desclassificados":[]}`; $teste=json_decode($p003);var_dump($teste); Para montar a variável $p003 eu tive que improvisar. O texto tem aspas simples e duplas ao mesmo tempo, e desconfio que é isso é que faz o PHP entender que o json não é válido. Para colocar o texto na variável eu usei as aspas inclinadas (é o acento agudo), e isso NÃO deu certo, o PHP insiste em reclamar que o $p003 é nulo, ou seja, não é um json válido. O resultado ficou assim: C:\wamp64\www\astudy\astudy.php:3: object(stdClass)[1] public 'pagina_total' => int 3 public 'pagina_atual' => int 1 public 'pagina_anterior' => null public 'pagina_proxima' => int 2 public 'registro_total' => int 21 public 'registro_atual' => int 10 C:\wamp64\www\astudy\astudy.php:6: object(stdClass)[2] public 'id' => int 54 public 'identificacao' => string 'Edital de Concorrência N° 22/000017' (length=37) public 'objeto' => string 'Contratação de empresa especializada para execução das obras de revitalização da área de entorno das piscinas e recuperação do parque aquático das unidades Sesc Praia e Sesc Beira Rio.' (length=194) public 'data_publicacao' => string '2022-08-19' (length=10) public 'data_abertura' => string '2022-09-06' (length=10) public 'local' => string 'Sesc Caixeral Parnaíba-PI' (length=27) public 'telefone' => string '86 3217-2852' (length=12) public 'email' => string 'licitasescpi@pi.sesc.com.br' (length=27) public 'processo' => string 'N° 22/000017' (length=13) public 'vencedores' => array (size=0) empty public 'responsavel' => string 'Supervisão de Licitação' (length=26) public 'valor' => string '' (length=0) public 'modalidade' => string 'Concorrência' (length=13) public 'documentos' => array (size=6) 0 => object(stdClass)[3] public 'descricao' => string 'Edital de Concorrência' (length=23) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-edital-de-concorrencia-1661169326.pdf' (length=100) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) 1 => object(stdClass)[4] public 'descricao' => string 'Anexo IV' (length=8) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-anexo-iv-1660909754.pdf' (length=86) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) 2 => object(stdClass)[5] public 'descricao' => string 'Anexo III' (length=9) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-anexo-iii-1660909732.pdf' (length=87) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) 3 => object(stdClass)[6] public 'descricao' => string 'ANEXO II ' (length=9) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-anexo-ii-1660909699.pdf' (length=86) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) 4 => object(stdClass)[7] public 'descricao' => string 'Anexo I' (length=7) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-anexo-i-1660909679.pdf' (length=85) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) 5 => object(stdClass)[8] public 'descricao' => string 'Aviso de Licitação' (length=20) public 'arquivo' => string 'http://transparencia.se.sesc.com.br/uploads/licitacao/18/54/54-aviso-de-licitacao-1660909627.pdf' (length=96) public 'tipo' => null public 'data' => string '2022-08-19 00:00:00' (length=19) public 'classificados' => array (size=0) empty public 'desclassificados' => array (size=0) empty C:\wamp64\www\astudy\astudy.php:9:null Fiz mais uma tentativa, tentei substituir todas as aspas simples por duplas. O Notepad+ não fez! Então, pedi para substituir todas as aspas simples por @, e depois o @ por aspas duplas. Também não deu certo. Estudando mais um pouco a variável $p003, eu percebi que o problema não é as aspas, mas é que havia um aspas que não deveria estar lá, assim EPI'S para atender. Eu arranquei na unha, e agora sim eu consegui converter o $p003 em json. O PHP é o melhor programa do mundo, quando funciona. -
Eu faria assim: <input type=checkbox name=aceito onclick=btncadastrar.disabled=false>Li e estou de Acordo.<br><br> <input type=submit id=btncadastrar name=btnCadUsuario value=Cadastrar disabled><br><br>
-
Eu acredito que o problema está nessa linha: <script type="text/javascript" src="https://www.google.com/jsapi"></script> Para montar o gráfico, você precisa ter uma conexão com a internet, chegar até o Google e de lá usar o API jsapi. Desconfio que o sistema do seu trabalho não permite a conexão com a internet.
-
astudy.php -------------------------------- <?php $participantes = array("1 - Rafael", "2 - João", "3 - Maria", "4 - Pedro", "5 - Patricia", "6 - Camila", "7 - Roberto", "8 - Rafael",); $numParticipantes = sizeof($participantes); $chances = round((1 / $numParticipantes) * 100); echo "- Temos no total <b>".$numParticipantes."</b> participantes;<br>"; echo "- Cada participante teve <b>".$chances."%</b> de chance de ganhar;<br><br>"; $sorteado[1] = $participantes[rand(0,$numParticipantes - 1)]; for ($i = 1; $i < 2; $i++) { $sorteado[2] = $participantes[rand(0,$numParticipantes - 1)]; if ($sorteado[2] == $sorteado[1]) {--$i;}} //for ($i = 1; $i < 2; $i++) { // $sorteado[3] = $participantes[rand(0,$numParticipantes - 1)]; // if ($sorteado[3] == $sorteado[1] || $sorteado[3] == $sorteado[2]) {--$i;}} echo "<b>Ganhadores:</b> <br>"; echo $sorteado[1] . "<br>"; echo $sorteado[2] . "<br>"; $mensagem="os sorteados foram $sorteado[1] e $sorteado[2]"; // <------------------ file_put_contents("sorteio.txt",$mensagem); // <------------------ echo "<p><input type=button value='SORTEAR !' onclick=document.location.reload(true)>" ?> astudy2.php -------------------------------------------------- <?php echo file_get_contents("sorteio.txt");
-
Ontem eu conheci o <datalist> e gostei dele. Ao invés de trabalhar com dois arquivos, um HTML com Jquery e outro PHP, o <datalist> resume tudo numa só página PHP. Eu não tenho certeza, mas o Autocomplete do Jquery dá a impressão que ele executa a consulta no MySQL toda vez que o usuário tecla a caixa de busca. O Autocomplete do Jquery lista "Limao" se você escrever "limão" na caixa, esse não é o caso do <datalist>, mesmo assim o resultado é satisfatório, uma vez que o <datalist> é capaz de listar "banana" quando você digita "nana". No código abaixo eu fiz de tudo para evitar de colocar o botão de confirmação, mas não consegui. Não sei como fazer o <form> submeter assim que você seleciona o item. <?php $mysqli=new mysqli("localhost","root","","diario"); if (isset($_POST['inpproduto'])){ echo "Produto ".$_POST['inpproduto'];echo "<input type=submit onclick=location.replace('astudy.php')>";exit;} $query=$mysqli->query("select * from tbprod order by prod"); ?> <!DOCTYPE html> <html> <meta charset="UTF-8"> <title>Autocomplete Textbox in HTML5 PHP and MySQL</title> <label for="inpproduto">Produto</label> <form method=post> <input type="text" list="produto" id="inpproduto" name="inpproduto" size=45 autofocus onclick=submit()> <datalist id="produto"> <?php while($row=$query->fetch_assoc()) { $prod=$row['prod'];?> <option><?=$prod?></option> <?php } ?> </datalist> </form>
-
O tutorial que encontrei na internet vem com quatro arquivos e seleciona um país pela letra. Eu reduzi tudo para dois arquivos, e ele busca o produto e também traz o preço de venda. O interessante no código é que ele mostra como usar o código PHP na hora de enfrentar o dilema das aspas simples e aspas duplas. A dica é simplesmente sair fora do código PHP e usar o máximo de HTML. Essa é uma solução engenhosa que eu não consegui compreender nesses dois últimos anos. Faz tempo que ouço falar de Jquery e Ajax, mas só hoje é que consegui fazer eles funcionarem. O meu sonho é mandar um json do PHP para o JavaScript, mas ainda estou apanhando bastante. Esse autocomplementar do Jquery Ajax é fora de série, ele vai ajudar bastante a melhorar o meu projeto. O código que segue é apenas um esboço, falta melhorar muita coisa, ele ainda não é prático. astudy.php ----------------------------------------------- <html> <head> <!-- algoritmo baseado em https://phppot.com/jquery/jquery-ajax-autocomplete-country-example/ --> <head> <style> body{width:610px;} .frmSearch {border: 1px solid #a8d4b1;background-color: #c6f7d0;margin: 2px 0px;padding:40px;border-radius:4px;} #listaproduto{float:left;list-style:none;margin-top:-3px;padding:0;width:390px;position: absolute;} #listaproduto tr{padding: 10px; background: #f0f0f0; border-bottom: #bbb9b9 1px solid;} #listaproduto tr:hover{background:#ece3d2;cursor: pointer;} #search-box{padding: 10px;border: #a8d4b1 1px solid;border-radius:4px;} </style> <script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script> <script> $(document).ready(function(){ $("#cxbusca").keyup(function(){ $.ajax({ type: "POST", url: "astudy2.php", data:'tecla='+$(this).val(), success: function(data){ $("#cxsugestao").show(); $("#cxsugestao").html(data); $("#cxbusca").css("background","#FFF");}});});}); function selectCountry(prod,venda) { $("#cxbusca").val(prod); avenda.innerHTML=venda; $("#cxsugestao").hide();} </script> </head> <body> <table class=frmSearch><tr><th>Produto<th>Venda <tr><td><input id="cxbusca" placeholder="Produto" size=40><td><a id=avenda></a> </table> <div id="cxsugestao"></div> </div> </body> </html> astudy2.php --------------------------------------------- <?php $mysqli=new mysqli("localhost","root","","diario"); if(!empty($_POST["tecla"])) { $query=$mysqli->query("select * from tbprod where prod like '%".$_POST['tecla']."%' order by prod limit 100"); if(!empty($query)) { echo "<table id='listaproduto'>"; foreach($query as $row) { $prod=$row['prod']; $venda=$row['custo']*1.3 ?> <tr onClick="selectCountry('<?=$prod?>','<?=$venda?>')"> <?php echo "<td>$prod<td>$venda"; } echo "</table>"; } }
-
Eu criei o seguinte código <?php echo "<h2>Esfiha de carne a R$ 1,69 pelo App Habib's<h2> <p><h2>Esfiha de carne a R$ 2,74 sem o App Habib's<h2> <p><h2>Não cobramos taxa de serviço se for retirar<h2> <p><h2>A taxa de serviço é de 10% se for consumir no estabelecimento<h2>";?> e criei dois arquivos. Um chamei de astudy.html e o outro chamei de astudy.php. O resultado foi um desastre:
-
Em 2020, eu consegui resolver o problema da conexão do notebook com o celular com a ajuda do WampServer e ngrok. Aqui em 2022, eu consegui hospedar o meu banco de dados na internet, mas ainda está em fase experimental. É uma ferramenta bem melhor que o meu notebook, mas eu recebo muitas mensagens de erro, que ainda não sei como consertar. Faço tudo na base da tentativa e erro, e o resultado é um monte de tempo perdido e um monte de telas horrorosas (estou anexando duas telas, um sem Bootstrap, outro com Booststrap). Nenhuma delas resolve o problema principal: como o usuário vai localizar um produto pelo celular se ele nem sabe ler e escrever? Para resolver esse problema, o WampServer tem duas soluções chamada PHP e MySQL, um é para guardar todos os produtos e o outro é para mostrar os produtos na tela do celular através da linguagem HTML. A linguagem HTML é um conjunto imenso de marcadores, mas eu só sei usar 2% do marcador <input>. Graças ao fórum Script Brasil, eu consegui até arrancar um calendário de um <input>. Com a ajuda do Google e o Script Brasil estou no pré-primário do HTML. O Google me ajudou a usar o marcador <link> e assim consegui trazer a beleza do Bootstrap para as minhas apresentações. Hoje, o Google me ensinou a diminuir o espaço das linhas da classe "table table-striped" do Bootstrap, usando esse outro marcador: <style>tr {line-height: 25px; min-height: 25px;height: 25px;}</style> No entanto, isso é só maquiagem. Desde 1999 eu venho fazendo a pergunta "como colocar os produtos na tela do celular?", e ontem finalmente encontrei a resposta no Google: jQuery AJAX Autocomplete – Country Example - Phppot, fiz o download na pasta wamp64/www/astudy, fiz o teste e ele não funcionou, não consegui ver nenhum país, mas eu fiz uma gambiarra aqui e ali para ver se ele podia mostrar os produtos, e eu consegui! O programa é muito engenhoso! Claro que o usuário precisa saber ler e escrever, mas a beleza desse programa consiste exatamente nisso, ele vai procurar o produto usando como critério o que o usuário digitar no teclado!
-
Eu só consegui isso: ::1 e usando esse código: astudy.php -------------------------------------------------------- <?php $ip = $_SERVER['REMOTE_ADDR']; echo "REMOTE_ADDR $ip"; echo "<p>Todas as configurações"; var_dump($_SERVER); ?> resultado: --------------------------------------------------------- REMOTE_ADDR ::1 Todas as configurações C:\wamp64\www\astudy\astudy.php:5: array (size=43) 'HTTP_HOST' => string 'localhost' (length=9) 'HTTP_CONNECTION' => string 'keep-alive' (length=10) 'HTTP_CACHE_CONTROL' => string 'max-age=0' (length=9) 'HTTP_SEC_CH_UA' => string '"Chromium";v="104", " Not A;Brand";v="99", "Microsoft Edge";v="104"' (length=67) 'HTTP_SEC_CH_UA_MOBILE' => string '?0' (length=2) 'HTTP_SEC_CH_UA_PLATFORM' => string '"Windows"' (length=9) 'HTTP_UPGRADE_INSECURE_REQUESTS' => string '1' (length=1) 'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.70' (length=134) 'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' (length=124) 'HTTP_SEC_FETCH_SITE' => string 'none' (length=4) 'HTTP_SEC_FETCH_MODE' => string 'navigate' (length=8) 'HTTP_SEC_FETCH_USER' => string '?1' (length=2) 'HTTP_SEC_FETCH_DEST' => string 'document' (length=8) 'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate, br' (length=17) 'HTTP_ACCEPT_LANGUAGE' => string 'pt-BR,pt;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,it;q=0.5,es;q=0.4,ca;q=0.3' (length=74) 'HTTP_COOKIE' => string 'PHPSESSID=iubscijf21m1ob83ijfgcbu07p' (length=36) 'PATH' => string 'C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\SafeNet\Authentication\SAC\x64;C:\Program Files\SafeNet\Authentication\SAC\x32;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps' (length=301) 'SystemRoot' => string 'C:\WINDOWS' (length=10) 'COMSPEC' => string 'C:\WINDOWS\system32\cmd.exe' (length=27) 'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53) 'WINDIR' => string 'C:\WINDOWS' (length=10) 'SERVER_SIGNATURE' => string '<address>Apache/2.4.51 (Win64) PHP/8.0.13 Server at localhost Port 80</address> ' (length=80) 'SERVER_SOFTWARE' => string 'Apache/2.4.51 (Win64) PHP/8.0.13' (length=32) 'SERVER_NAME' => string 'localhost' (length=9) 'SERVER_ADDR' => string '::1' (length=3) 'SERVER_PORT' => string '80' (length=2) 'REMOTE_ADDR' => string '::1' (length=3) 'DOCUMENT_ROOT' => string 'C:/wamp64/www' (length=13) 'REQUEST_SCHEME' => string 'http' (length=4) 'CONTEXT_PREFIX' => string '' (length=0) 'CONTEXT_DOCUMENT_ROOT' => string 'C:/wamp64/www' (length=13) 'SERVER_ADMIN' => string 'wampserver@wampserver.invalid' (length=29) 'SCRIPT_FILENAME' => string 'C:/wamp64/www/astudy/astudy.php' (length=31) 'REMOTE_PORT' => string '52375' (length=5) 'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7) 'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8) 'REQUEST_METHOD' => string 'GET' (length=3) 'QUERY_STRING' => string '' (length=0) 'REQUEST_URI' => string '/astudy/astudy.php' (length=18) 'SCRIPT_NAME' => string '/astudy/astudy.php' (length=18) 'PHP_SELF' => string '/astudy/astudy.php' (length=18) 'REQUEST_TIME_FLOAT' => float 1661620861.0145 'REQUEST_TIME' => int 1661620861
-
Abrir URL ao selecionar item do banco de dados no input de busca
pergunta respondeu ao Aureo Yamanaka de Frank K Hosaka em PHP
Já faz um ano que tento resolver esse problema, mas ainda não consegui. Encontrei uma solução quebra galho, ele é meio lento. Encontrei um exemplo bonito e rápido, ele funciona só dando um espaço na caixa de busca, mas não consegui repetir a mesma experiência no notebook. O exemplo que segue tem duas referências a CSS (tem um style.css, eu copiei de algum canto da internet e coloquei no meu diretório principal). Eu acho estranho esses dois arquivos, mas o programa não funciona se eles não estiverem por lá. astudy.php ------------------------------------------------------------ <?php $tagi=[["maçã","www.apple.com"],["televisão","www.nhk.jp"],["diversão","www.netfix.com"]]; ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>jQuery UI Autocomplete - Default functionality</title> <link rel="stylesheet" href="//code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css"> <link rel="stylesheet" href="style.css"> <script src="https://code.jquery.com/jquery-3.6.0.js"></script> <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script> <script> $(function () { function setSiteByProduct(prod, values) { for (var i = 0, len = values.length; i < len; i++) { if (values[i][0] == prod) { $('#site').val(values[i][1]); break;}}} tagi=<?=json_encode($tagi)?>; $("#produto, #site").autocomplete({ source: tagi.map(function(val){return val[0]}), select: function (event, ui) { setSiteByProduct(ui.item.value, tagi);}});}); </script> </head> <body> <input id=produto> <p> <input id=site> </body> </html> -
Faz dois anos que estou tentando entender o JavaScript, e só hoje é que eu tive uma faísca de esperança. Esse código não funciona já faz dois anos: <?php $problema=["php"=>"javascript"]; ?> <script> jteste={"php":"javascript"} console.log(jteste.php) $teste=<?=json_encode($problema)?> console.log($teste.php) </script> Depois de 2 anos, eu fiz a minha milésima tentativa e consegui fazer o código funcionar: <?php $problema=["php"=>"javascript"]; ?> <script> jteste={"php":"javascript"} console.log(jteste.php) $teste=<?=json_encode($problema)?>; console.log($teste.php) </script> A única diferença entre os dois códigos é um ponto e vírgula. Ao contrário do PHP, você pode escrever o JavaScript sem o ponto e vírgula. Mas quando você mistura PHP com JavaScript, aí você é obrigado a usar o ponto e vírgula, senão o JavaScript não funciona. Dois anos é muito tempo, mas é só apanhando é que a gente aprende alguma coisa, não é mesmo?