Todas as Novidades
Atualizada automaticamente
- Mais antigo
-
encontrei aqui... $minuto = date('i'); // Obtiene los minutos actuales (00 - 59) switch ($minuto) { case '00': echo "Es el comienzo de una nueva hora."; break; case '30': echo "Estamos a la mitad de la hora."; break; case '59': echo "Último minuto antes de una nueva hora."; break; default: echo "Minuto actual: $minuto"; }
-
Na verdade preciso fazer este select mudar de categoria a cada 30 minutos.
-
daemon começou a seguir select com varias categorias por horario
-
Tenho 3 selects assim com varias categorias... $sql = "SELECT * FROM topicos WHERE idcategoria = $idcategoria AND pubdate BETWEEN NOW() - INTERVAL $intervalo1_horas_ou_minutos $tipo_intervalo1_horas_mnutos AND NOW() - $intervalo2_horas_ou_minutos ORDER BY pubdate DESC LIMIT 1"; Preciso que na minha pagina principal (index) mostre este registro por 10minutos.. passando de 10 minutos mostra o resultado do proximo select (categoria)..
-
show de bola. Por exemplo, o site do SBT. Não encontrei nenhum feed nele, porém o google consegue importar o topico. Deve ser acordo como você postou. Obrigado !
-
Alguém com pratica em subir site em codeigniter4 na Hostinger? Não consigo acessar o bd. Erro de Autenticação. O mesmo site funciona normal em outro servidor web.
clovis.sardinha postou um tópico no fórum MySQL
ERROR - 2025-03-07 18:25:14 --> Error connecting to the database: mysqli_sql_exception: Access denied for user 'u640929234_clovis'@'82.112.247.246' (using password: YES) in /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Database/MySQLi/Connection.php:184 Stack trace: #0 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Database/MySQLi/Connection.php(184): mysqli->real_connect() #1 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Database/BaseConnection.php(392): CodeIgniter\Database\MySQLi\Connection->connect() #2 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Database/BaseConnection.php(575): CodeIgniter\Database\BaseConnection->initialize() #3 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Database/BaseBuilder.php(1616): CodeIgniter\Database\BaseConnection->query() #4 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/Model.php(271): CodeIgniter\Database\BaseBuilder->get() #5 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/BaseModel.php(679): CodeIgniter\Model->doFirst() #6 /home/u640929234/domains/prov.larpegumercindo.com.br/app/Models/AdministradorModel.php(53): CodeIgniter\BaseModel->first() #7 /home/u640929234/domains/prov.larpegumercindo.com.br/app/Controllers/Home.php(184): App\Models\AdministradorModel->login() #8 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/CodeIgniter.php(943): App\Controllers\Home->recuperaSenha() #9 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/CodeIgniter.php(503): CodeIgniter\CodeIgniter->runController() #10 /home/u640929234/domains/prov.larpegumercindo.com.br/vendor/codeigniter4/framework/system/CodeIgniter.php(361): CodeIgniter\CodeIgniter->handleRequest() #11 /home/u640929234/domains/prov.larpegumercindo.com.br/public_html/index.php(79): CodeIgniter\CodeIgniter->run() #12 {main} Já tentei tudo que eles indicam. Consigo abrir o phpmyadmin normalmente com a senha utilizada através do link da própria Hostinger. . -
Entendi. Como a maioria dos sites de notícias utiliza WordPress, por padrão eles já possuem a tag description nos seus feeds RSS. Sobre o MSN (e outros agregadores de notícias), eles não apenas leem o feed RSS, mas também rastreiam links, sitemaps, etc. Quando o feed fornece um elemento <link>, o MSN acessa a página completa da notícia e extrai o conteúdo (título, texto, imagens) utilizando técnicas de web scraping. Eles possuem bots especializados que analisam o HTML da página e identificam o conteúdo principal através de seletores CSS ou algoritmos de extração de conteúdo. Vale ressaltar que muitos sites de notícias mantêm acordos comerciais com o MSN, fornecendo feeds mais ricos ou APIs específicas, como o endpoint "wp/v2/posts" do WordPress, que permite acesso direto ao conteúdo completo dos artigos. Quanto ao Google News, ele opera de forma diferente, priorizando a indexação e o redirecionamento para o site original, sem armazenar o conteúdo completo em seus servidores, o que preserva o tráfego direto para os publicadores. Ao trabalhar com agregação de conteúdo web, é fundamental entender como extrair dados de diferentes fontes de forma eficiente. Quando precisei implementar isso em meus projetos, desenvolvi uma abordagem simples usando PHP que funciona bem para a maioria dos casos. A ideia básica é utilizar cURL para fazer as requisições HTTP e depois processar o HTML recebido para extrair as informações relevantes. O Simple HTML DOM Parser é perfeito para isso, pois permite navegar pelo DOM usando seletores similares ao jQuery. Um ponto importante: sempre respeite o robots.txt dos sites e adicione delays entre as requisições para não sobrecarregar os servidores alheios. Também recomendo implementar um sistema de cache para evitar requisições repetidas ao mesmo conteúdo. Aqui vai um exemplo simplificado do algoritmo que uso: Lib: https://github.com/voku/simple_html_dom <?php function buscar_conteudo($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MeuBot/1.0)'); $html = curl_exec($ch); curl_close($ch); require_once 'simple_html_dom.php'; $dom = str_get_html($html); $resultado = []; // Ajuste os seletores conforme o site alvo foreach ($dom->find('article.noticia') as $artigo) { $titulo = $artigo->find('h2', 0)->plaintext; $link = $artigo->find('a', 0)->href; $resumo = $artigo->find('p.resumo', 0)->plaintext; $resultado[] = [ 'titulo' => trim($titulo), 'link' => $link, 'resumo' => trim($resumo) ]; } $dom->clear(); return $resultado; }
-
A maioria dos feeds rss, não tem descrição. Não entendo como o portal msn consegue pegar a notícia e postar no site deles mesmo.. Já o google news não tem descrição, redireciona somente o tópico.
-
Muito obrigado ! Antes de inserir no banco vou fazer um while na tabela procurando duplicidade. Caso encronte eu controlo com break, do contrário eu insiro no banco. Vou verificar a data tb. Para não ficar fazendo a verificação do while depois de 2h da primeira postagem. Assim fica mais rápido a execução do script.
-
O ponto central é: como definir e usar o $novaFrase dentro do seu loop foreach ($feeds->channel->item as $item) para verificar a similaridade antes de inserir, já que é um script de importação automático. Vou te mostrar um "exemplo" de como integrar isso diretamente no seu fluxo atual. O $novaFrase será extraído de cada $item do feed (provavelmente o título ou descrição, dependendo do que você considera o "assunto"). Depois, usaremos essa variável para comparar com os registros existentes antes de decidir se faz o INSERT. Vou assumir que o campo que você quer verificar é o título ($item->title), mas você pode ajustar isso conforme a estrutura do seu feed. <?php // Conexão ao banco $conn = new mysqli("localhost", "usuario", "senha", "banco"); if ($conn->connect_error) { die("Conexão falhou: " . $conn->connect_error); } // Supondo que $feeds já foi carregado (ex.: via SimpleXML ou outro parser) foreach ($feeds->channel->item as $item) { // Definindo $novaFrase a partir do feed (ajuste conforme o campo do seu feed) $novaFrase = (string) $item->title; // Pode ser $item->description ou outro campo, se preferir // Verificação inicial: busca registros existentes para comparar $sql = "SELECT id, assunto FROM noticias"; $result = $conn->query($sql); $fraseDuplicada = false; if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { // Compara $novaFrase com cada assunto existente similar_text($novaFrase, $row['assunto'], $percentual); // Se a similaridade for alta (ex.: > 80%), considera duplicada if ($percentual > 80) { echo "Frase semelhante encontrada: " . $row['assunto'] . " (Similaridade: $percentual%)\n"; $fraseDuplicada = true; break; // Sai do loop assim que encontra uma duplicata } } } // Se não houver duplicata, insere o registro if (!$fraseDuplicada) { $stmt = $conn->prepare("INSERT INTO noticias (assunto) VALUES (?)"); $stmt->bind_param("s", $novaFrase); $stmt->execute(); echo "Novo registro inserido: $novaFrase\n"; $stmt->close(); } else { echo "Frase ignorada (duplicada): $novaFrase\n"; } } $conn->close(); Resolvendo sua dúvida específica: Ele é definido dentro do foreach, a partir do $item. No exemplo, usei $novaFrase = (string) $item->title, assumindo que o título do feed é o "assunto". Se o campo do seu feed for diferente (ex.: $item->description), basta ajustar essa linha. $novaFrase = (string) $item->title; // Se o assunto vem do título // OU $novaFrase = (string) $item->description; // Se vem da descrição No seu código atual, você mencionou que ele insere toda vez que não encontra o registro exato. Isso provavelmente acontece porque você usa algo como: $sql = "SELECT * FROM noticias WHERE assunto = ?"; E só compara igualdade exata. Com similar_text, você verifica similaridade, não igualdade, permitindo detectar frases parecidas (ex.: "Morre David Johansen" vs. "Morre, aos 75 anos, David Johansen"). - O $novaFrase é extraído de cada $item no início do loop. - Antes de inserir, o código consulta os assuntos existentes e usa similar_text para calcular a similaridade. - Só faz o INSERT se nenhuma frase semelhante for encontrada. Testando no seu caso: <channel> <item> <title>Morre David Johansen, vocalista dos New York Dolls, aos 75 anos</title> <description>Notícia completa aqui...</description> </item> <item> <title>Morre, aos 75 anos, David Johansen, do New York Dolls</title> <description>Outra versão da notícia...</description> </item> </channel> O código acima vai: - Pegar $novaFrase = "Morre David Johansen, vocalista dos New York Dolls, aos 75 anos" no primeiro item. - Verificar no banco e inserir (se for o primeiro registro). - No segundo item, $novaFrase = "Morre, aos 75 anos, David Johansen, do New York Dolls" será comparado, detectará alta similaridade (ex.: 90%) e não inserirá. Ajustes finais: - Campo do feed: Confirme qual campo do $item contém o "assunto" no seu caso (`title`, `description`, etc.) e ajuste a linha $novaFrase = (string) $item->.... - Percentual de similaridade: O valor 80 é um exemplo. Teste com valores como 70 ou 90 para ver o que funciona melhor para o seu caso. - Log: As mensagens echo são para debug. Você pode removê-las ou substituí-las por logs em um arquivo.
-
No caso o parametro $novafrase, ficaria como no código ? eu utilizo: foreach ($feeds->channel->item as $item) Faço um loop em tudo e vou gravando registro por registro. a unica verificação é se existe o assunto, se não tiver ele registra um novo na base. No caso ele faz um INSERT toda vez que não tiver o registro encontrado. E este é o problema, não sei onde consigo verificar o "$novafrase" para inserir. pois é só um script de importação.
-
Boa tarde, Via php, não estou conseguindo pegar a string da nova noticia. Estou lendo um arquivo FEED, e quando leio ele pego o tópico (ASSUNTO) e insiro no banco. Dessa forma não tenho um formulario para inserir a noticia e comparar a mesma. Obs: O sql do banco tem algo errado, mas preciso resolver por php mesmo. Obrigado
-
Muito obrigado
-
Humm, pelo que li, a função SOUNDEX do MySQL foi criada para comparar palavras simples e sua pronúncia em inglês, não serve! Mas você pode criar um índice full-text na coluna e utilizar a função MATCH … AGAINST para buscar similaridades sem precisar que a frase seja idêntica. Uma query básica seria: SELECT *, MATCH(assunto) AGAINST('Morre 75 anos David Johansen New York Dolls' IN NATURAL LANGUAGE MODE) AS relevancia FROM noticias WHERE MATCH(assunto) AGAINST('Morre 75 anos David Johansen New York Dolls' IN NATURAL LANGUAGE MODE); Essa abordagem retorna resultados com um score de relevância, ajudando a identificar notícias similares mesmo com pequenas variações. Outra abordagem é recuperar os registros do banco e utilizar funções do PHP, como similar_text ou levenshtein, para calcular a similaridade entre a nova frase e as frases existentes. Por exemplo, usando similar_text: <?php // Conexão ao banco $conn = new mysqli("localhost", "usuario", "senha", "banco"); if ($conn->connect_error) { die("Conexão falhou: " . $conn->connect_error); } // Nova frase a ser cadastrada $novaFrase = "Morre, aos 75 anos, David Johansen, do New York Dolls"; // Consulta para buscar frases existentes $sql = "SELECT id, assunto FROM noticias"; $result = $conn->query($sql); $fraseDuplicada = false; if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { // Calcular similaridade entre a nova frase e cada registro similar_text($novaFrase, $row['assunto'], $percentual); if ($percentual > 80) { // Você pode ajustar este percentual conforme a necessidade echo "Frase semelhante encontrada: " . $row['assunto']; $fraseDuplicada = true; break; } } } if (!$fraseDuplicada) { // Inserir nova frase $stmt = $conn->prepare("INSERT INTO noticias (assunto) VALUES (?)"); $stmt->bind_param("s", $novaFrase); $stmt->execute(); echo "Nova frase cadastrada com sucesso!"; $stmt->close(); } else { echo "Frase não cadastrada para evitar duplicação."; } $conn->close();
-
Tentei colocar uma frase diferente e não encontrou... Cheguei a retirar algumas palavras mesmo assim não encontrou.. (Só encontra colocando exatamente igual).
-
Williams Duarte começou a seguir comando like (Mysql) no php
-
O sql tem a função SOUNDEX para verificar frases similares. SELECT * FROM noticias WHERE SOUNDEX(assunto) = SOUNDEX('Morre, aos 75 anos, David Johansen, do New York Dolls'); Alguns bancos suportam funções personalizadas como LEVENSHTEIN. Você pode calcular a distância entre strings diretamente no SQL e filtrar por um limite.
-
Preciso fazer uma busca antes de inserir um registro no banco de dados. No caso preciso verificar se existe uma frase no banco antes de cadastrar uma nova. Exemplo: Tenho no banco a coluna ASSUNTO = "Morre David Johansen, vocalista dos New York Dolls, aos 75 anos". Quando vou cadastrar uma nova notícia "Morre, aos 75 anos, David Johansen, do New York Dolls" é parecida. Mas não quero cadastrar 2 vezes. No like não consigo fazer esta busca.... o que posso fazer para verificar esta busca antes de cadastrar ?
-
Preciso mostrar o intervalo em horas e minutos entre 2 registros. Por exemplo, tenho um campo data e hora que postei um conteudo (exemplo : 15:00). E tenho a hora atual (16:30). Preciso imprimir a quanto tempo foi postado. No caso volta aparecendo "30 minutos". se passar de 1 hora "1h e 5min" etc.. etc...
-
Ana Gauna alterou sua foto pessoal
-
Boa tarde, Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites. Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link. Para isso utilizo esta função: function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; } Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
-
Julianderson Souza Guerra começou a seguir Ajuda com Extends e envio para o banco
-
gbmariz alterou sua foto pessoal
-
EasyWorkNet começou a seguir Ajuda com Extends e envio para o banco
-
iosman começou a seguir Fixar div até atingir uma certa altura
-
dlemes começou a seguir PHP+Codeginiter - Orientação para Impressão
-
Você pode ajustar o comportamento da div para que ela pare de ser fixa ao se aproximar do rodapé, calculando a distância entre a div e o rodapé durante o scroll. Aqui está uma solução que faz isso: <script> $(function(){ var jElement = $('.fixar_banner'); var footer = $('footer'); // Substitua 'footer' pelo seletor do seu rodapé var offsetTop = jElement.offset().top; var footerOffset = footer.offset().top; var elementHeight = jElement.outerHeight(); $(window).scroll(function(){ var scrollTop = $(this).scrollTop(); var distanceToFooter = footerOffset - (scrollTop + elementHeight + 20); // 20 é um espaçamento extra if (scrollTop > offsetTop && distanceToFooter > 0) { jElement.css({ 'position': 'fixed', 'top': '10px' }); } else if (scrollTop > offsetTop && distanceToFooter <= 0) { jElement.css({ 'position': 'absolute', 'top': footerOffset - elementHeight }); } else { jElement.css({ 'position': 'relative', 'top': 'auto' }); } }); }); </script> Explicação: Cálculo das Posições: - offsetTop: É a distância inicial da div em relação ao topo da página. - footerOffset: É a distância do rodapé em relação ao topo da página. - elementHeight: É a altura da div que você quer fixar. Lógica do Scroll: 1. Quando o scroll é maior que a posição inicial da div (offsetTop) e ainda há espaço antes do rodapé (distanceToFooter > 0): - A div é fixada na posição desejada (por exemplo, top: 10px). 2. Quando a div está próxima do rodapé (distanceToFooter <= 0): - A div é posicionada de forma absoluta, alinhando-se ao topo do rodapé. 3. Caso contrário: - A div retorna à posição relativa original. Ajustes: - Certifique-se de substituir 'footer' pelo seletor correto do seu rodapé. - O valor 20 é um espaçamento extra para evitar que a div encoste no rodapé. Ajuste conforme necessário.
-
Opa. Vaeu, mas não consegui. Consegue me ajudar com o código ou me passar um link de artigo ou vídeo? Abs
-
DeepSeek, a ferramenta de IA, vai tirar suas dúvidas e é gratuita ainda: https://chat.deepseek.com/
-
DeepSeek, a ferramenta de IA, vai tirar suas dúvidas e é gratuita ainda: https://chat.deepseek.com/
-
DeepSeek, a ferramenta de IA, vai tirar suas dúvidas e é gratuita ainda: https://chat.deepseek.com/
-
Caros amigos, saudações. Por favor, me permita tirar uma dúvida com os amigos. Tenho um Formulário onde o Usuário digita todos os Dados necessários. Minha dúvida: --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ? Grato, Cesar
-
Tenho uma abela de usuarios e uma tabela de administradores e clientes. Gostaria de uma ajuda para implementar um cadastro users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc... Queria ajuda para extender de user as classes Admin e Client Olhem como estáAdmin <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User { use HasFactory; protected $fillable = [ 'name', 'email', 'password', 'registration' ]; private string $registration; public function create( string $name, string $email, string $password, string $registration ) { //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]); parent::$name = $name; parent::$email = $email; parent::$password = $password; $this->registration = $registration; } } User <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ use HasFactory, Notifiable; static string $name; static string $email; static string $password; /** * The attributes that are mass assignable. * * @var list<string> */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var list<string> */ protected $hidden = [ 'remember_token', ]; /** * Get the attributes that should be cast. * * @return array<string, string> */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } public function roles() : BelongsToMany { return $this->belongsToMany(Role::class); } public function hasHole(Array $roleName): bool { foreach ($this->roles as $role) { if ($role->name === $roleName) { return true; } } return false; } public function hasHoles(Array $rolesName): bool { foreach ($this->roles as $role) { foreach ($rolesName as $rolee) { if ($role->name === $rolee) { return true; } } } return false; } public function hasAbility(string $ability): bool { foreach ($this->roles as $role) { if ($role->abilities->contains('name', $ability)) { return true; } } return false; } } Como gravar um Admin na tabela admins sendo que ele é um User por extensão? Tentei assim mas é claro que está errado... public function store(Request $request, Admin $adminModel) { $dados = $request->validate([ "name" => "required", "email" => "required|email", "password" => "required", "registration" => "required" ]); $dados["password"] = Hash::make($dados["password"]); $admin = Admin::where("registration", $dados["registration"])->first(); if ($admin) return redirect()->route("admin.new") ->withErrors([ 'fail' => 'Administrador já cadastrados<br>, favor verificar!' ]); $newAdmin = $adminModel->create( $dados['name'], $dados['email'], $dados['password'], $dados['registration'] ); dd($newAdmin); $adminModel->save(); //$adminModel::create($admin); return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso'); }