-
Total de itens
1339 -
Registro em
-
Última visita
-
Dias vencidos
15
Tudo que Omar~ postou
-
Qual sistema operacional você usa ou gosta?
Omar~ respondeu ao tópico de Hacker_Buiu em Docker, Kubernets e outros ambientes
Bom, eu uso o Ubuntu para trabalhar, ou seja 99% do tempo que passo na frente da tela é programando, porém uso o Window 7 para lazer ou seja navegar na web e jogar de vez em quando. Mas de longe eu prefiro o linux mesmo, no principal motivo é a não busca de atualizações muito menos atualizações automáticas, o que deixa um sistema com windows desagradável de usar. Além do caso do desempenho que o linux além de mais confiável é infinitamente mais rápido e prático de usar. -
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/required
-
Se fosse minha situação eu armazenaria os produtos do cliente em um array, caso ele queira devolver algum simplesmente eliminaria o índice desse array correspondente ao produto que ele devolveu, mais ou menos isso: <?php $produtos_no_pedido = [ ['id' => 0, 'nome' => 'fone'], ['id' => 1, 'nome' => 'fone'], ['id' => 2, 'nome' => 'teclado'], ['id' => 3, 'nome' => 'pen driver'], ['id' => 4, 'nome' => 'pen driver'], ['id' => 5, 'nome' => 'pen driver'], ['id' => 6, 'nome' => 'pen driver'] ]; echo '<pre>'; var_dump($produtos_no_pedido); echo '</pre><hr />'; $remover_do_pedido = [2, 3, 6]; // Para remover o 2º fone e o primeiro e o último pen driver foreach ($remover_do_pedido as $chave) { if (array_key_exists($chave, $produtos_no_pedido)) { echo ("<p>Item removido: {$produtos_no_pedido[$chave]['id']}-{$produtos_no_pedido[$chave]['nome']}</p>"); unset($produtos_no_pedido[$chave]); } } echo '<pre>'; var_dump($produtos_no_pedido); echo '</pre><hr />'; Então com o array_key_exists chegamos ao índice de uma determinada chave no array. Agora vamos supor que ele não queira mais um determinado produto, mas nesse array tem vários produtos iguais, aí para a coisa dar certo podemos buscar no array o nome dos produtos $remover_do_pedido = ['teclado', 'pen driver']; foreach ($remover_do_pedido as $remover) { foreach ($produtos_no_pedido as $chave => $produto) { if (array_search($remover, $produto)) { echo ("<p>Item removido: {$produtos_no_pedido[$chave]['id']}-{$produtos_no_pedido[$chave]['nome']}</p>"); unset($produtos_no_pedido[$chave]); } } } echo '<pre>'; var_dump($produtos_no_pedido); echo '</pre><hr />';
-
input type="time" apagar o value quando o checkbox for desmarcado
Omar~ respondeu ao tópico de carlosmassam em Javascript
<input type="checkbox" id="checkmarcacao1" /> <input type="time" id="hora101" disabled="" /> <script> var checkbox = document.getElementById('checkmarcacao1'), time = document.getElementById('hora101'); checkbox.checked = null; time.value = null; time.setAttribute('disabled', ''); function alterarInput(e) { if (e.target.checked) { time.removeAttribute('disabled'); } else { time.setAttribute('disabled', ''); time.value = null; } } checkbox.addEventListener('change', alterarInput, false); </script>- 1 resposta
-
- input type=time
- input type
- (e mais 5 )
-
Primeiro vamos esclarecer o porque de usar herança em classes. Digamos por exemplo que eu tenha classe_A, classe_B, classe_C; em ambas classes eu precise executar uma tarefa que se repete nelas.... Se não precisamos de algo recursivo a herança é desnecessária. Porém nesse requisito de repetição trabalhamos com uma classe mãe que vai executar essas tarefas que são específicas da classe mãe, portanto a classe mãe torna-se algo com importância tão relevante que seu acesso deve ser restrito. Ou seja não é adequado que ela possua dados públicos que podem ser manipulados de forma leviana. Em outras palavras nada de usar public em uma classe mãe que possui uma responsabilidade maior. Um construtor.... Um construtor de uma classe é somente para definir com quais dados/comportamento a classe deve possuir antes de usar qualquer tarefa que ela venha a fazer, caso não precisamos desses dados iniciais em todos os métodos seguintes não é necessário um construtor. Fora do contexto de classe, mas na questão do tópico: É muito estranho que em "pleno século 21" alguém ainda pensa em usar md5 para criptografia de senha, qualquer string é facilmente decifrada com o md5. Se você quer segurança use o password_hash que lança um novo salt a cada execução. Porém qualquer desses você pode registrar que numa comparação se for a mesma string o retorno é sempre verdadeiro. <?php class ClasseMae { private $pass; private $newPass; private function novaSenha() { $this->newPass = password_hash($this->pass, PASSWORD_DEFAULT); } protected function alteraSenha($pass) { $this->pass = htmlentities($pass); $this->novaSenha(); } protected function retornarSenha() { return (empty($this->newPass) ? null : $this->newPass); } } Perceba a responsabilidade da classe as quais filhas vão herdar seus métodos. O que uma filha pode acessar é protegido o que ela não pode mexer é privado. Ou senha nenhum objeto tem acesso a nada na mãe para que não possa manipular-la de forma alguma, porque ela é a mãe e não pode sofrer interferência de ninguém. <?php class ClasseFilha extends ClasseMae { public function modificarSenha($senha) { $this->alteraSenha($senha); } public function verSenha() { return ($this->retornarSenha()); } public function compararSenha($novaSenha) { if (password_verify($novaSenha, $this->retornarSenha())) { return (true); } else { return (false); } } } Note que então numa filha seus métodos são públicos pois sua responsabilidade é só receber/usar o que a mãe tem a oferecer. Por fim vejamos um exemplo de execução <?php $objeto = new ClasseFilha(); $objeto->modificarSenha('12345'); var_dump($objeto->verSenha()); echo ("<hr />"); var_dump($objeto->compararSenha('54321')); echo ("<hr />"); var_dump($objeto->compararSenha('12345'));
-
Obter dados de único nome MYSQL
Omar~ respondeu ao pergunta de gamesmax2 em Perguntas e respostas rápidas
Bom, se eu entendi e o caso for que o status não possa ser"OK". A coisa é meio óbvia: SELECT nome, pedido, status FROM cadastros WHERE status != 'Ok' Todos os dados de nome, pedido, status na tabela cadastros que não tiver com o status definido como Ok serão retornados -
<?php class MinhaClasse { private $atributo; public function meuMetodo($paramA, $paramB) { $this->atributo = $paramA . ', ' . $paramB; return ([$this->atributo, $paramA, $paramB]); } public function outroMetodo($paramC) { return ([$this->atributo, $paramC]); } } $obj = new MinhaClasse(); $a = $obj->meuMetodo('Bom dia', 'Boa tarde'); $b = $obj->outroMetodo('Boa Noite'); echo "<pre>"; var_dump($a, $b); echo "</pre><hr />"; function MinhaFuncao($paramA, $paramB) { return ([$paramA, $paramB]); } echo "<pre>"; var_dump(MinhaFuncao('Olá', 'Mundo')); echo "</pre>";
-
lastInsertId é um método da classe PDO portanto basta que apenas use o objeto PDO para chamar o método logo depois de mandar executar a query. Exemplo $objetoPdo = new PDO( ... bla... bla... bla $conexao = $objetoPdo->prepare( ... bla... bla... bla $conexao->execute( ... bla... bla... bla if ($conexao->rowCount()) { $ultimoID = $objetoPdo->lastInsertId(); }
-
Mas então explique o objetivo a se obtido, variáveis não se altera dentro de um escopo global. O laço de loop for (para enquanto...) podemos reescrever a mesma varável e usar-la de forma diferente dentro do próprio loop, mas daí tem que saber o que se é para fazer.
-
Envie os dados que precisa por parâmetro para o método. Se precisar reaproveitar eles em outros métodos use atributos... Se não precisar reaproveitar use funções ao invés de classes
-
Dinâmica como? Não ficou claro o resultado que você espera.... Seria algo como isso, nesse caso usamos uma array para criar um índice a cada volta: <?php $exemplo = []; for ($dia = 0; $dia < 7; $dia++) { $exemplo[$dia] = $resultadoBD->horario_$dia } echo '<pre>'; var_dump($exemplo);
-
O problema da lentidão está na "segunda"; melhor nas várias outras vezes que o código faz consulta, é loop dentro de loop fazendo consulta... Faça as querys separadas do e dentro do loop compare os dados. Para falar a verdade ambas querys são as mesmas e não há necessidade de re-executar a mesma coisa, ainda mais ficar fazendo querys dentro de loop Quanto mais voltas o loop faz mais querys são lançadas, mais custoso é para o servidor processar, menos desempenho você tem. Vejamos um exemplo que com uma única query você pode criar diferentes arrays para cada situação: <?php $ENG_REL_EPIS = [ /* Simulando um resultado da query "ORDER BY DATA ASC" */ ['NOME' => 'Bruno', 'to_date' => '2021-06-05'], ['NOME' => 'Carlos', 'to_date' => '2021-06-06'], ['NOME' => 'André', 'to_date' => '2021-06-07'], ]; echo '<pre>'; var_dump($ENG_REL_EPIS); /* Resultado da consulta ordenada por DATA */ echo '</pre>'; $emNome = []; foreach ($ENG_REL_EPIS as $nome) { foreach ($nome as $chave => $value) { if (!isset($emNome[$chave])) { $emNome[$chave] = []; } $emNome[$chave][] = $chave; } } array_multisort($emNome['NOME'], SORT_DESC, $ENG_REL_EPIS); echo '<hr /><pre>'; var_dump($ENG_REL_EPIS); /* 1 query e os mesmos resultado da consulta ordenados por NOME */ echo '</pre>';
-
Como adicionar um evento específico nos campos de um formulário HTML.
Omar~ respondeu ao tópico de Flaviaac em Desenvolvimento frontend
Algo simples, um ouvinte de eventos no seletor e pronto. Mas devo ressaltar que ao inserir o valor em um input text não é o ideal, pois o usuário "seleciona laranja depois vai ao input e escreve limão" removendo a lógica da questão. Nesse contexto o input pode ser oculto e ao invés de só inserir o valor no input manipulamos outro elemento "não editável" para informar o valor selecionado. <select name="qualquer_coisa" id="seletor"> <option value="">Selecione uma opção</option> <option value="1">Opção A</option> <option value="2">Opção B</option> <option value="3">Opção C</option> </select> <input type="hidden" name="outra_coisa" id="caixa_de_texto" /> <div></div> <!-- Use o CSS para personalizar esse divisor para que ele se pareça com um input-type-text --> <script> var seletor = document.getElementById('seletor'); var texto = document.getElementById('caixa_de_texto'); function alterarInput(evento) { var alvo = evento.target; var divTexto = texto.nextElementSibling; // O próximo elemento HTML depois do input texto.value = alvo.value; // Alterando o valor do input para o valor selecionado divTexto.innerText = (alvo.value.length ? alvo.value : ''); // Colocando o valor na div } seletor.selectedIndex = 0; // Sempre quando carregar a página o seletor muda para primeira opção seletor.addEventListener('change', alterarInput, false); </script> Questão de string e inteiros. Uma vez como valores de elementos mesmo sendo números na verdade são strings então. Para converter um número em INT com javascript você usa a função parseInt console.log( parseInt('123') ); Para converter um número em INT com o php você usa a nomenclatura (int) <?php $inteiro = (int) '123'; -
Malz apenas tinha o upado... https://drive.google.com/file/d/1LJdV04j7wGu-WthcLrlCBOIR35Y1Tq1V/view?usp=sharing
-
O que eu vi e percebi que você está tentando fazer, me corrija se eu estiver errado.... Em um arquivo você chama o método home da class Admins esse por sua vez como é herdeira da class Controller usa o método model para incluir outro arquivo de class, até aqui tudo bem (só deixando em destaque o atributo adminModel que está inexistente em ambas classes). Logo em seguida você aciona o método view da class Controller para anexar um arquivo no caso o home.php, e acredito que seja nesse arquivo que você quer acessar os dados carregados pelo método home. Um problema está no método view. Esse método tem por função anexar um arquivo, porém você não pode passar parâmetros seja por include seja por require para esse arquivo, isso não é possível de fazer. Outra questão está na herança como view pertence a classe mãe "Controller" ela não tem acesso a dados de sua filha no caso a class Admins a não ser que você mande esses dados por parâmetro assim como você fez (mesmo que isso perde no conceito de abstração, mas não vem ao caso). Veja que as coisas deram certo nesse exemplo: https://drive.google.com/file/d/1LJdV04j7wGu-WthcLrlCBOIR35Y1Tq1V/view?usp=sharing Acho que seu problema foi que os métodos de suas classes fazem mais do que deviam fazer, em uma classe no geral podemos dizer que um método escreve a letra i e o outro método coloca o pingo nesse i. Dê uma enxugada nos métodos se um olha se o e-mail está correto ele já fez mais do que o necessário deixe a próxima tarefa para outro método até mesmo se use de classes específicas para cada coisa, se uma classe faz leitura no banco não há necessidade dele validar strings etc... Siga esse truque se um método possui mais até 11 linhas é bom se está com até 22 ele está no seu limite, mais que isso aí o método não está trabalhando como se deve. Incluir arquivos usando classes, não que isso seja errado, mas prefiro usar funções para tal finalidade e classes para coisas corriqueiras da aplicação. Abaixo uma função que se por exemplo você faz: $a = new MinhaClasse(); Sem mesmo você incluir o arquivo a função sabe que o código precisa da classe e faz o anexo dela Requer manipulação do diretório no FindClass para correto funcionamento. Ou seja essa função vai até o diretório class/ [ $findDir ] / $class .php
-
Faz do seguinte poste todo o código da classe Admins e Controller e como você faz a instância. Pode ser que o problema não seja nesse contexto que estamos tratando e sim outra coisa, nesse caso possuir todo o código pode ajudar a chegar a raiz do problema. Ou simplesmente diga qual o objetivo a alcançar, talvez possamos chegar a um jeito mais fácil porque essa é a questão da orientação a objeto simplificar o complicado.
-
De fato você está vendo o atributo é um array, mas não retorna nada porque o array está vazio, você tem que criar antes. Perceba que mandei criar algo antes de usar.... Em resumo o que disse seria public function home() { $this->dados = [ // Ao invés de usar uma variável aqui você usa um atributo 'admins' => $this->adminModel->lerAdmin() ]; /* Não sei o que isso faz, mas se for um redirecionamento você perde todo conteúdo da classe Então isso deveria está em um método diferente onde você só aplicaria um redirecionamento quando realmente for necessário */ $this->view('paginas/admins/home', $this->dados); } Portanto uma vez que o método home for executado você terá algo no atributo dados. Então basta que tenha outro método para retornar o atributo dados. Devemos olhar que as chaves que vão compor o conteúdo serão definidos pelo método lerAdmin, se ele não retornar nada $this->dados será um array com a chave admins que estará vazio.
-
Fica complicado dizer qual é o problema pois dizer que o problema é uma coisa, mas na verdade pode ser outra. Os trechos de código apresentados não diz a causa. Assim como os 2 métodos não sabemos se são da mesma classe o que é importante saber. O que podemos então presumir que você está tentando acessar o array $dados no método home. Se você quer acessa basta que $dados seja um atributo e algum método o retorne. <?php class exemplo { private $dados = []; public function criarArray() { $this->dados = ['a' => '1', 'b' => '2', 'c' => '3']; } public function verArray() { return $this->dados; } } $e = new exemplo(); var_dump($e->verArray()); //echo $e->verArray()['a']; // (Seu problema aqui) Não posso ver a chave porque ela ainda não existe echo "<hr />"; $e->criarArray(); var_dump($e->verArray()); echo "<hr />"; var_dump($e->verArray()['a']); echo $e->verArray()['a']; echo $e->verArray()['x']; // Seu erro representado aqui a chave não existe Por fim sempre use a função var_dump para analisar dados ao invés de echo
-
Rapaz isso é tão simples que penso que esse sistema foi desenvolvido por um completo amador. Está ligado ao charset portanto nenhum arquivo adicional irá resolver, o negócio vai ser corrigir a codificação. É algo extremamente fácil de resolver porém requer nem que seja um mínimo de conhecimento técnico. Portanto se você não entende as mínimas sugiro que contrate algum dev para fazer essa correção, o que não é caro mediante a facilidade do trabalho. Mas caso queira você mesmo fazer vejamos algumas soluções possíveis: ** Começando verifique o charset dentro da tag <header> geralmente você vai poder encontrar no arquivo index. Mas em alguns casos a estrutura HTML pode ser gerada por função, métodos ou mesmo inclusões. O negócio vai ser encontrar a tag <meta> que cuida em dizer ao browser qual codificação a página deve ser renderizada. A tag na melhor alternativa ficaria <meta charset="UTF-8"> ** Em segunda hipótese seria a própria codificação de arquivos, esse contexto todos os arquivos que compõe a aplicação deve ser verificados. Se você usa linux, abra todos os arquivos com o GEDIT e os salve novamente. mas se sua máquina usa windows use o programa Notepad++ e abra todos os arquivos com ele. Com todos os programas abertos no notepad++ siga esse procedimento em todos os aquivos, clicando em formatar > converter para utf-8 (sem bom) pressione "ctrl + A" com todos caracteres selecionados clique em editar > conversão de linhas > converter para unix. Feche e salve. Esse processo deve ser realizado em tdos arquivos. ** Outra forma seria ir em arquivo a aquivo procurar onde texto são renderizados para o browser e alterar os caracteres acentuados por entidades html exemplo. echo "olá mundo"; sendo o caractere "á" o que vai gerar o erro de codificação echo "ol´ mundo"; substituindo o caractere do problema por sua entidade representacional. Ficando apresentado no html olá mundo echo htmlentities("olá mundo"); resolvendo de forma mais bruta usando uma função do PHP pra fazer essa conversão para entidade representacional.. Ficando apresentado no html olá mundo Depois de realizado um ou mais desses processos é só hospedar esses arquivos no lugar dos outros (Não se esqueça de testar antes em um servidor local, e fazer o backup dos que estão em nuvem)
-
Boas?! Como o próprio título diz posso realmente confiar em obter o mime-type do arquivo através da classe finfo? Ao logo dos anos sempre para uploads de arquivos para o servidor, como os sistemas que eu desenvolvi um upload só podia ser realizado por um administrador, apenas verificava a extensão do arquivo através da chave "type" na super global $_FILES. Mas sempre soube que não podia confiar em tal. No mais simples podemos enganar a chave "type" criando um arquivo de texto qualquer e salvando com a extensão .JPG se consultamos por exemplo $_FILES['upload']['type'] teremos então o mime-type image/jpg mesmo o arquivo de fato sendo um .TXT (A proposta não se trata só de imagens mas qualquer tipo de arquivo, apenas usei uma imagem para exemplificar) Mas usando a classe finfo essa obtive o correto modelo de arquivo. <?php $finfo = new finfo(FILEINFO_MIME); $mimeType = $finfo->file($_FILES['upload']['tmp_name']); echo "<pre>"; var_dump( substr($mimeType, 0, strpos($mimeType, ';')), $_FILES['upload']['type'] ); Mas seria possível enganar o método? Obs.: Se houver como não poste código nesse contexto, apenas quero saber de possíveis vulnerabilidades dessa classe nativa que até então nunca utilizei.
-
Erro: Cannot modify header information - headers already sent by
Omar~ respondeu ao tópico de Sapinn em PHP
Devemos ressaltar que esse erro é porque alguma coisa já foi para o browser e agora você tentar enviar algum cabeçalho. É comum isso acontecer devido a função include um arquivo enviou e você inclui outro que mexe em alo a respeito cabeçalho http e então tem esse erro gerado. Como o matheus disse isso ocorre na maioria dos casos por causa de "qualquer tipo de caractere antes a abertura da tag do PHP". Entenda que um arquivo incluído é como se fosse mesmo arquivo que executou a função include. Se qualquer arquivo antecessor possui um caractere antes de <?php ou fechamento de ?> + algum caractere se der include em outro arquivo saiba que o cabeçalho já foi enviado. Uma forma também de descobrir esses tipos de caracteres é através de ferramentas próprias, uma delas é o NetBeans IDE ou PhpStorm que podem identificar qualquer tipo de caractere mesmo aqueles que são invisíveis para o windows. Um péssimo editor de código que é muito popular é o "Visual Studio Code" esse é mestre em criar anomalias em arquivos. Vale também lembrar que se você manda algo para o cabeçalho você não pode mandar outra coisa (O que possivelmente não é seu caso como já mencionado). A solução para re-envio é armazenar o buffer de saída ao qual só vai entregar o cabeçalho quando tudo estiver pronto usando o ob_start para esse armazenamento. Der uma lida nesse ARTIGO para mais detalhes. -
Blz @Matheus Tavares Gostei de certos pontos que você citou, como varrer o binário do arquivo em busca de códigos, mas penso que isso poderia custar muito em desempenho e sacrificar a usabilidade. Sobre usar um diretório reconfigurando o apache com htaccess para não processar PHP (Dessa eu não sabia que era possível ^^) Mas o fato que mais me predeu atenção é salvar os arquivos em outro servidor. Quanto ao caso de nome do arquivo, imagem em geral até mesmo sua extensão isso é "LEI ter de se fazer" então sempre apliquei essas condutas, no caso de imagem ou sempre a recrio "até mesmo para fazer a correção da orientação" consigo me livrar de códigos maliciosos na mesma. A questão do mime-type era justamente o que fazer com o arquivo que o usuário enviar, sem que ele possa enganar dizendo que um arquivo é uma coisa quando na verdade é outra. Na aplicação aqui o usuário pode enviar "qualquer coisa". Se for imagem > recrio ela e salvo Se for arquivo comprimido (zip/7z/bz/ra) > Salvo o mesmo sem fazer verificações apenas altero seu nome quando salvo "Acredito eu que não seja possível embutir código nesse tipo de arquivo". Talvez esse seja o ponto que eu esteja pecando na vulnerabilidade. Se for qualquer outro tipo > estou compactando com ZipArchive uma vez que isso é gerado pelo meu código e apenas pego o conteúdo temporário e insiro dentro do arquivo ZIP criado, acredito que não há problemas. Como você mesmo disse... Minha preocupação não está com o usuário fazer download de um suposto arquivo contaminado (mesmo que deveria) e sim na segurança da aplicação. Pois em meu testes justamente enviei um arquivo para quebrar meu código PHP disfarçado de outro tipo de arquivo o que deu certo, e como dessa vez a aplicação que estou a fazer vai poder receber arquivos até do "zé da silva" me fez prender a atenção sobre a integridade do código nesse requisito... Mesmo porque sou paranoico-e-meio-tanto com segurança. A questão mesmo era confiar na classe, a qual é a primeira vez que uso, então passei o dia todo rodando a internet em busca de experiências com a mesma. Até porque a documentação do PHP é muito branda sobre essa classe.
-
Bom, a minha questão lá de usar um hash foi apenas para não usar coluna id do usuário eu sim uma string contendo números e letras aleatória única para cada usuário, dessa forma futuramente posso usar o coluna ID no backend sem que um usuário jamais saiba o id de outro usuario, assim evitando falsificação de dados. Então eu gero um hash só para cada usuário que uso no logar do seu ID para composição de dados no HTML. Aí você estaria criando o token do login se recriar toda a vez, pode ser útil usando em cookie para uma autentificação de dois ou três fatores. Vamos supor que o usuário A logou em um determinado IP`usando um sansung galaxy o token foi gerado como cookie e você registrou esse cookie e os dados no banco, se usuário B tentar roubar esse cookie e querer falsificar o login do usuário A, no entanto ele está vamos supor em um AMD Linux-Ubuntu além do IP incompatível logo você não deixa logar. Então nesse caso não importa o roubo de cookies não importa a falsificação dos cookies, a única forma de usuário B entrar com o login de usuário A é através de seus dados de acesso como e-mail e senha. A unica forma de gerar algo igual é 2 códigos serem processados na mesma fração de segundo, e nenhum servidor que eu saiba faz 2 coisas simultâneas, então eu acho seguro sim.
-
Salvar dados na tabela com JAVASCRIPT
Omar~ respondeu ao pergunta de Jack Oliveira em Perguntas e respostas rápidas
Aqui eu estou supondo que haja apenas uma postagem ou várias a avaliar por página. Se for várias apenas os form's devem ser gerados dentro de um loop das postagens. Vou resumir, apesar de ser algo bem simples requer algumas manipulações do front para termos a coisa dinâmica, mas nada complicado. <?php $postID = 99; ?> <form method="post" action="" id="ajax_form_<?= $postID ?>"> <input type="hidden" name="alvo_da_postagem" value="<?= $postID ?>" /> <input type="text" name="avaliar" value="" /> <!-- Mude para type="hidden" está como text para você testar aí --> <a data-value="1" class="voto">Sim</a> <a data-value="2" class="voto">Não</a> </form> <script> var botoes = document.getElementsByClassName('voto'); // Obtenho os botões de avaliação if (typeof botoes !== 'undefined' && botoes !== null) { // Depois eu digo o porque disso for (var i = 0; i < botoes.length; i++) { botoes[i].addEventListener('click', salvarForm, false); // Adiciono evento click a cada botão } } function salvarForm(e) { var alvo = e.target; // Obtenho o correto botão clicado var pai = alvo.parentNode; // Obtenho o elemento pai é o form "alvo.parentNode" /* O primeiro elemento filho é um input que irá identificar o id da postagem "children[0]" Encontro o input para adicionar o valor da avaliação que é o segundo filho "children[1]" Então nesse filho que é o que tenho de manipular adiciono o valor do atributo data do botão clicado */ pai.children[1].value = alvo.dataset.value; /* AQUI então você salva o form por ajax Caso precise identificar o id do formulário lembre-se que já o encontramos então caso precise o "pai.id" será o mesmo valor que o foi renderizado no HTML id="ajax_form_<?= $postID ?>" */ } </script> Então no arquivo que vai receber os dados do form você terá o $_POST['alvo_da_postagem'] >>>> Que é o id da postagem para avaliar $_POST['avaliar'] >>>> Que é data-value clicado pelo usuário Nesse mesmo arquivo ao salvar a avaliação poderemos manipular o HTML Como o #ID do form está assim ajax_form_<?= $postID ?> e $_POST['alvo_da_postagem'] será o mesmo que $postID então podemos chegar ao formulário para manipular qualquer um de seus elementos filhos no caso remover o ouvinte de eventos click do botão clicado Assim sendo não podendo clicar novamente no mesmo ou em ambos, sei lá como vai querer fazer... document.getElementById('ajax_form_<?= $_POST['alvo_da_postagem'] ?>') Ao caso do usuário recarregar a página fechar e reabrir a página sempre estará disponível os botões de avaliação. Por isso a importância de também haver registro de qual postagem aquele usuário postou Aqui eu estarei apenas usando a própria tabela que você apresentou, mas poderá criar outra apenas para essa finalidade de checagem CREATE TABLE `avali_comentario` ( `id` int(11) NOT NULL AUTO_INCREMENT, `comentario_id` int(11) NOT NULL, `usuario_id` int(11) NOT NULL DEFAULT '1' COMMENT 'ID do usuario que avaliou', `up` int(11) NOT NULL, `down` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Nesse meu caso é só checar se o usuário já fez sua avaliação no post que se segue: SELECT comentario_id, usuario_id FROM avali_comentario WHERE comentario_id = '$ID_DO_COMENTARIO' AND usuario_id = '$ID_DO_USUARIO' Se por exemplo essa query retornar algum valor podemos apenas escrever o html sem executar a função dos botões <?php $retornoDaQuery = true; /* Supondo que o usuario já votou porque a query retornou algum valor */ ?> <a <?= ($retornoDaQuery ? 'data-value="1" class="voto"' : null) ?>>Sim</a> <a <?= ($retornoDaQuery ? 'data-value="2" class="voto"' : null) ?>>Não</a> Assim sendo se os botões não tem as propriedades necessárias o voto não acontece ou até mesmo poderíamos colocar um IF se sim nem escreveríamos o html deles. Por isso a identificação da existência pelo typeof antes de adicionar ouvintes nos botões se eles não existirem vai gerar erro de console.- 6 respostas
-
- php
- javascript
-
(e mais 1 )
Tags:
-
Salvar dados na tabela com JAVASCRIPT
Omar~ respondeu ao pergunta de Jack Oliveira em Perguntas e respostas rápidas
Tem sim (pelo ip físico da máquina do usuário dizem que tem como obter o DNS também, mas não sei como). Há uma possibilidade de erro (duplicar o mesmo), mas se colocar-mos IP + dados da máquina + sistema operacional você terá uma margem bem alta de precisão, pode acontecer de duplicar, mas seria extremamente raro. Veja essa classe com ela você pode obter o IP o SO e até o browser que o usuário esteja usando. No entanto de qualquer forma terá que registrar em algum lugar no servidor, seja um banco de dados, um XML JSON, TXT etc... Não importa tem que registrar em algum lugar para saber se o usuário já fez a sua avaliação.- 6 respostas
-
- php
- javascript
-
(e mais 1 )
Tags: