Jump to content
novoAquiNoForum

Verificar se no banco possui palavras iguais a variável em PHP

Recommended Posts

Pessoal tudo bem?

Vou direto ao ponto.

Estou desenvolvendo um sistema que faz upload de arquivos PDFs. No PHP eu pego este arquivo extraio o texto do mesmo e armazeno em uma variável $conteudo para depois inserir no banco da dados.

Tenho no sistema uma rotina para cadastro de tipo documentais, onde o usuário cadastra um tipo de documento e palavras-Chave que existam somente naquele documento EX:

Nome: Boleto palavras-Chave: Sacado, Banco, Cedente.

o nome boleto será salvo na tabela tipo_documento contendo o id_tipo

as palavras-Chave serão salvas em outra tabela chamada indexadores com os campos:

id_indexador, id_tipo, palavraschaves. No PHP faço o explode na virgula, transformando essas palavras em array, ou seja cada palavra será um registro no banco com seu respectivo ID mas recebendo o id_Tipo que é o do documento.

Até aqui tudo bem, mas o problema segue abaixo:

Voltando um pouco acima, onde eu falava do upload e da extração do texto, sendo salvo na variável $conteudo.

Esta variável contem todo o meu texto do PDF, mas antes de inserir no banco eu preciso classificar este documento verificando se ele é uma conta de luz, agua, contrato, boleto etc..

Para verificar isto preciso consultar a tabela indexadores e ver se aquelas palavras chaves que cadastrei, possuam nesta variável $conteudo se possuir este documento receberá a descricao e o id do tipo_documento. EX:

Fiz um upload de um boleto, a minha classe leu o arquivo e guardou todo o texto na variável $conteudo. Como já tenho um tipo documental Boleto com as palavras chaves: Banco, Cedente, Sacado, se eu encontrar na variável $conteudo estas palavras ela vai pertencer ao tipo de documento Boleto.

Mas não estou conseguindo verificar isto, como tenho uma string enorme, como faço esta verificação? como procuro estas palavras dentro da string?

Preciso urgentemente de uma resposta.

Tentei ser o mais claro possível.

Share this post


Link to post
Share on other sites
$text = strpos($varaivel, "busca");

Ela permite que seja pesquisada uma determinada string dentro de outra string.

dai você cria uma codição, se ele encontra a string dentro da varivale, retorna TRUE se não false.

Share this post


Link to post
Share on other sites

Olá primeiramente obrigado por responder, já fiz uso desta função realmente deu certo. Mas digamos que tenho um select no banco que traz todos meus indexadores:

$result = $conn->query("SELECT * FROM indexadores INNER JOIN tipo_documento ON indexadores.id_tipo = tipo_documento.id_tipo");
                if(mysqli_num_rows($result) > 0){
 
                    while($doc = mysqli_fetch_array($result)) {
                            $palavras = $doc['palavraschave'];
                            $id_tipo = $doc['id_tipo'];
                            $tipo = $doc['descricao'];
 
                }
 
 
                if (strpos($conteudo, $palavras) !== false)
                        {
                        $status = "Indexado";
                        $query = $conn->query("INSERT INTO documentos (id_tipo, nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                        VALUES ($id_tipo,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')");
                        }
                        else
                        {
                        $tipo = "<b>Indefinido</b>";
                        $status = "<b>Não Indexado</b>";
                        $query = $conn->query("INSERT INTO documentos (id_tipo, nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                        VALUES (0,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')");
                        }
                    }
                    else
                    {
                      echo "Nenhum tipo de documento encontrado."; 
                    }

os meus indexadores são três Sacado,Boleto,Cedente.

Essa função verifica se tem essas três palavras na variável ou se ela encontrar uma já retorna TRUE.

Quero que contenha exatamente as três palavras.

Edited by Gabriel Heming
Adicionar bbcode

Share this post


Link to post
Share on other sites

Você pode fazer verificações usando IF e ELSEIF

mas como o Beraldo falo, fica mais enxuto e pratico fazer na query

Share this post


Link to post
Share on other sites

Olá desculpe a demora em responder, o tempo realmente é curto.

Tentei várias vezes resolver isto com Like e com o IN, mas não obtive sucesso, talvez não tenha feito da maneira correta me levando a recorrer a alguma função do PHP. Tentei fazer o seguinte:

 $pdf = new PdfToText ($temp);

//A minha classe lê todo o PDF e guarda na variavel conteúdo

 $conteudo = mysqli_real_escape_string($conn, $pdf -> Text);
                
                
 $result = $conn->query("SELECT * FROM indexadores WHERE palavraschave IN ('$conteudo')");
 $pdf = new PdfToText ($temp);
 $conteudo = mysqli_real_escape_string($conn, $pdf -> Text);
                              

 $result = $conn->query("SELECT * FROM indexadores where palavraschave LIKE '%".$conteudo."%'");

a minha tabela indexadores e tipo_documento, estão desta forma:

CREATE TABLE tipo_documento (
  id_tipo int(10) NOT NULL AUTO_INCREMENT,
  descricao varchar(200),
  indexadores varchar(200),
  PRIMARY KEY (id_tipo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE indexadores(
  id_indexador int(10) NOT NULL AUTO_INCREMENT,
  id_tipo int(10) NOT NULL,
  palavraschave varchar(200),
  PRIMARY KEY (id_indexador)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Resultado da minha tabela tipo_documento

id_tipo   descricao

3	  Conta de Luz		
17	  Redes	
20	  Boleto	

Meus indexadores guardam cada palavra como um registro com um id único pertencente a um id_tipo do documento

id   id_tipo    palavraschave

7	3	RGE
8	3	Emissor
36	17	Bridge
37	17	Address
40      20      Banco
41      20      Conta
42      20      Sacado

Assim talvez tenha ficado mais claro, o que preciso fazer.

Sempre quando realizo o upload de um PDF a minha classe extrai o texto e armazena na variável $conteudo, logo após, preciso verificar se na tabela indexadores, possui palavras que contenham no documento, para definir qual tipo de documento é este PDF, EX:

Se eu fazer o upload de um boleto, tenho que procurar palavras que contenham neste arquivo, se ele encontrar as palavras Banco,Sacado e conta, o arquivo vai ser classificado como boleto, caso ele não encontre nenhuma palavra, ele vai inserir no banco, porem este documento vai ficar como não classificado.

Resumindo, ele tem que encontrar todas as palavras informadas para aquele documento na variável $conteudo para poder classificar o mesmo. Pois posso ter documentos que também possuam a palavra Banco, mas que não sejam boletos. Então o usuário vai cadastrar o máximo de palavras chaves que ele julga que só tenha em boleto, para este tipo ser único.

Desde já agradeço.

Share this post


Link to post
Share on other sites

Vou postar todo o meu código atual aqui para ficar melhor.

upload.php

<?php
$conn = new mysqli("localhost", "root", "","clae");
include ("PDF/PdfToText.phpclass");//classe que extrai o texto do PDF


if(isset($_FILES["myfile"]))
  {
  $ret = array();
 
  $error = $_FILES["myfile"]["error"];

    {  
        if(!is_array($_FILES["myfile"]["name"]))
        {
          
            //pega as informações do upload

            $temp = $_FILES["myfile"]["tmp_name"]; 
            $nome = $_FILES["myfile"]["name"];
            $tamanho = $_FILES["myfile"]["size"];
           
            //abre o documento    
            $fp = fopen($temp,"rb");
            $documento = fread($fp,filesize($temp));
            fclose($fp); 

            //guardo o conteudo do PDF que é um binario e converto para hexadecimal
            $dados = bin2hex($documento);
                
            //A classe faz a leitura do PDF  
            $pdf = new PdfToText ($temp);

            //a minha variavel conteudo armazena o texto extraido, escapo todos os caracteres especiais que surgem devido a uma má leitura do documento
            $conteudo = mysqli_real_escape_string($conn, $pdf -> Text);
                
            //faço uma consulta na tabela indexadores e tipo_documento para me trazer as informações que preciso   

            $result = $conn->query("SELECT * FROM indexadores INNER JOIN tipo_documento ON indexadores.id_tipo = tipo_documento.id_tipo");
                if(mysqli_num_rows($result) > 0){

                    while($doc = mysqli_fetch_array($result)) {
                            $palavras = $doc['palavraschave'];
                            $id_tipo = $doc['id_tipo'];
                            $tipo = $doc['descricao'];

                }
                   
                //verifico se minha variavel $conteudo possui alguma palavrachave de meus indexadores
                if (strpos($conteudo, $palavras) !== false)
                        {

                        //Se possuir o documento é inserido no banco já classificado
                        $status = "Indexado";
                        $query = $conn->query("INSERT INTO documentos (id_tipo, nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                        VALUES ($id_tipo,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')") or die(mysqli_error($conn));;
                        }
                        else
                        {
                        //Se não possuir o documento é inserido porem sem classificação
                        $tipo = "<b>Indefinido</b>";
                        $status = "<b>Não Indexado</b>";
                        $query = $conn->query("INSERT INTO documentos (id_tipo, nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                        VALUES (0,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')") or die(mysqli_error($conn));;
                        }
                    }
                    else
                    {
                      echo "Nenhum tipo de documento encontrado."; 
                    }
                }
            }
        }

//Aqui é verificado se o documento foi inserido ou não
 if(mysqli_affected_rows($conn) < 1){
    
    $resposta = "<div title='Ocorreu um erro ao inserir o arquivo.'style='color:#AB4450;background-color: #F2DEDE; border-radius:5px;padding:10px; margin-top:10px; width:auto;height:auto;'>Erro: ".$nome."</div>";
    }
    else
    {
    $resposta = "<div  title='O arquivo foi inserido com sucesso.'style='color:#3C763D;background-color: #DFF0D8;border-radius:5px; padding:10px; margin-top:10px; width:auto;height:auto;'>Sucesso: ".$nome."</div>";
    }

    echo $resposta;
 
$conn->close();


?>

Ressalto que sou iniciante em PHP, então podem ter erros no código.

Share this post


Link to post
Share on other sites

Olá Pessoal, consegui resolver, segue código abaixo para quem tiver a mesma dificuldade:

Como eu tenho uma variavel contendo o resultado da leitura do PDF, precisava conferir cada palavra no banco, na tabela indexadores, que seriam as palavras-chave, que o usuario cadastra para para a identificação automática do documento, para isso fiz da seguinte forma:

//Uso o mysqli_real_escape_string para escapar alguns caracteres não permitidos pelo Mysql.
//$response é a que recebe todas o texto extraido

            $conteudo =  mysqli_real_escape_string($conn, $response);

            //Faço um explode na variavel response quebrando onde tiver espaço, transformando todo o texto extraido em um array.
              
            $textoPDF = explode(" ", $response);
            //Faço um implode na variavel textoPDF colocando vírgula e aspas em cada palavra, para poder consultar no banco com o IN.
            $text = "'" . implode("','",$textoPDF) . "'";
            
            //Faço uma consulta juntando as tabelas tipo_documento e indexadores. E verifico se na tabela indexadores possui palavras iguais
            //ao texto extraido do PDF. Se o resultado for maior ou igual a 2
            //é listado as variaveis e inserido o documento já classificado no banco, recebendo o id_tipo, id_area etc.
            $result = $conn->query("SELECT * FROM indexadores INNER JOIN tipo_documento ON indexadores.id_tipo = tipo_documento.id_tipo WHERE palavraschave IN ($text) AND id_empresa = $empresa");
            if(@mysqli_num_rows($result) >= 2){ 
            while($doc = mysqli_fetch_array($result)) {
                            $id_tipo = $doc['id_tipo'];
                            $tipo = $doc['descricao'];
                            $id_area = $doc['id_area'];
                            // echo "palavras: ".$doc['palavraschave'];;
                            
                    }
                     $tipo_doc = $tipo;
                     $status = "Indexado";
                     //Se a condição for satisfeita,o arquivo foi classificado, faço o Insert na tabela documentos.
                     $query = $conn->query("INSERT INTO documentos (id_tipo, id_area, id_empresa, nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                     VALUES ($id_tipo,$id_area,$empresa,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')") or die(mysqli_error($conn));
                    
            }else{

                    //Caso o resultado for menor que 2 palavras, o documento é inserido, mas não classificado.
                     $tipo = "<b>Indefinido</b>";
                     $status = "<b>Não Indexado</b>";
                     $query = $conn->query("INSERT INTO documentos (id_tipo, id_area,id_empresa,nome_documento, descricao_documento, tamanho_documento, dados_documento, conteudo_documento, status_documento) 
                     VALUES (0,0,$empresa,'$nome', '$tipo','$tamanho','$dados','$conteudo','$status')") or die(mysqli_error($conn));
                }

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Alex Dias
      Olá amigo, não sou usuário avançado, conseguir um código-fonte que lista arquivos de uma pasta no servidor, esses fontes listavam apenas os arquivos, daí eu dei uma incrementada nele para além dos arquivos ele listar também o tamanho do arquivo e a data da última modificação, segue ANEXO como ele está exibindo os resultados com perfeição.

      A minha dificuldade é que ele lista os arquivos da pasta por ordem alfabética de A a Z e eu gostaria muito que essa lista de arquivos fosse exibida por ordem de data de modificação decrescente, da mais atual para a mais antiga, e não estou conseguindo realizar essa tarefa, gostaria muito da ajuda dos amigos para solucionar esse ocorrido, desde já agradeço a ajuda de todos.

      Segue o código-fonte

       
      <?php //$diretorio = "D:\SERVIDOR-APACHE\PATRIMONIO TECNOLOGIA\images"; $diretorio = "/home/patrimonio/www/sites/default/files/ftpdata/download/Acesso Remoto"; //USADO PARA LISTAR OS ARQUIVOS DA PASTA $url = "sites/default/files/ftpdata/download/Acesso Remoto/"; // USADO PARA FAZER O LINK DE DOWNLOAD // abre o diretório $ponteiro = opendir($diretorio); // monta os vetores com os itens encontrados na pasta while ($nome_itens = readdir($ponteiro)) { $itens[] = $nome_itens; } // ordena o vetor de itens sort($itens); // percorre o vetor para fazer a separacao entre arquivos e pastas foreach ($itens as $listar) { // retira "./" e "../" para que retorne apenas pastas e arquivos if ($listar!="." && $listar!=".."){ // checa se o tipo de arquivo encontrado é uma pasta if (is_dir($listar)) { // caso VERDADEIRO adiciona o item à variável de pastas $pastas[]=$listar; } else{ // caso FALSO adiciona o item à variável de arquivos $arquivos[]=$listar; } } } // lista as pastas se houverem if ($pastas != "" ) { foreach($pastas as $listar){ print "";} } // lista os arquivos se houverem if ($arquivos != "") { foreach($arquivos as $listar){ //CONDICAO PARA NOMEAR EM BYTES, KB, MB, GB, TB $tamanho = filesize("$url/$listar"); $kb = "1024"; $mb = "1048576"; $gb = "1073741824"; $tb = "1099511627776"; if($tamanho<$kb){ $tamanho_resposta = ($tamanho." bytes"); }else if($tamanho>=$kb&&$tamanho<$mb){ $kilo = number_format($tamanho/$kb,2); $tamanho_resposta = ($kilo." KB"); }else if($tamanho>=$mb&&$tamanho<$gb){ $mega = number_format($tamanho/$mb,2); $tamanho_resposta = ($mega." MB"); }else if($tamanho>=$gb&&$tamanho<$tb){ $giga = number_format($tamanho/$gb,2); $tamanho_resposta = ($giga." GB"); } // FIM CONDICAO PARA NOMEAR EM BYTES, KB, MB, GB, TB // DATA DA ULTIMA MODIFICACAO $modificado = date("d/m/Y H:i:s", filemtime("$url/$listar"))."<br>"; // FIM DATA DA ULTIMA MODIFICACAO //echo"$modificado"; // FAZ A LISTA DE XIBICAO DOS AQRUIVOS DO DIRETORIO // FAZ A LISTA DE XIBICAO DOS AQRUIVOS DO DIRETORIO echo" <tr> <td width='438' height='30' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;<a href='$url/$listar' target='_blank'>$listar</a></font></p></td> <td width='192' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;$tamanho_resposta</font></p></td> <td width='340' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;$modificado</font></p></td> <td width='202' bgcolor='#ffffff'><p align='center'><a href='$url/$listar' target='_blank'><img src='images/nuvem.jpg'/></a></p></td> </tr> "; } } else { echo "<p><font color='#ff0000' size='3'>Não há nenhum arquivo.</font><p><br>"; } echo"</table>" ?>  

    • By luialcantara
      Olá, a empresa onde trabalho tem uma página de login para área restrita que está com problema na função de cadastro. O formulário está enviando os dados para o banco de dados e o usuário se torna ativo para acesso normalmente. O problema é que a mesma função que salva os dados deveria redirecionar o cliente para a área restrita ou então para a página inicial para que ele digite usuário e senha e consiga acessar a página. 
       
      A página já estava pronta quando comecei aqui e eu não tenho domínio sobre php, mas já corrigi alguns erros que estavam impedindo o cadastro. Porém os clientes reclamam pois após concluir o cadastro a imagem de carregamento não desaparece, então apenas coloquei um delay para evitar os questionamentos, pois o usuário fica ativo, então é só voltar para o login que eles conseguem usar nosso site.
       
      A página está dividida entre uma de login (php), uma para cadastro (php) e a principal, que está no wordpress. 
       
      Função do formulário de cadastro:
                  submitHandler: function(form) {                 $(".botoesactions").hide();                 $(".ajaxloader").show();                 var dados = jQuery( form ).serialize();                  $(".ajaxloader").fadeOut(1500);                 $.ajax({type: "POST", data: dados, url:"<?php echo get_site_url(); ?>/atendimento/cadastrar",success: function(data){                     console.log(data);                     try {             var ret = JSON.parse(data);                     } catch (e) {          var ret = false;                    }                     $(".ajaxloader").hide();                     if(ret !== false && ret.retorno === "ok"){                         console.log(ret);                         alert("Cadastrado realizado com sucesso!");                         window.location.href = "<--!?php echo get_site_url(); ?-->/atendimento/";                     }else if(ret !== false && ret.retorno === "fail"){                         alert(ret.mensagem);                         $(".botoesactions").show();                     }else{                         $(".botoesactions").show();                     }                 }});             }  
       
      Função de inserção de informações no banco de dados:
      elseif('cadastrar' == $syjusaten){                         if(!isset($_SESSION) || !isset($_SESSION['jusate_session']['answeris']) || $_SESSION['jusate_session']['answeris'] != 42 ){                 if($_POST && $_POST['typos'] == "iscadastro"){                     $url= $urlServer.'/Cliente/ClienteSite/cadastraclientesite';                     $parms = array(                         "usuario" => $_POST['user'],                         "Senha" => $_POST['pass'],                         "Cliente.ClienteId" => $_POST['clienteId'],                         "Cliente.Nome" => $_POST['nome'] /*Existem outros dados, mas acho que ficaria muito codigo e não contribuem para erro*/                     );                     $respServer = syJuCurl($url, $parms);                     if($respServer == ""){                         echo json_encode( array(                             "retorno" => "fail",                             "mensagem" => "Não foi possivel realizar o cadastro. Tente novamente mais tarde"                         ));                     }else{     echo $respServer;                         }                 }else{                     echo "ELSEE";                     header("Location: ".get_site_url()."/atendimento");                 }                         exit;             }else{                 header("Location: ".get_site_url()."/atendimento/");             }         }  
      Agradeço pela atenção ;)
       
    • By TheRonaldoStar
      Olá, Venho aqui de novo para tirar uma dúvida que creio eu ser muito simples porem não sei como aplicar!;
      Como diz no título do post eu gostaria de fazer um select de cadastros cujo o id do usuário online está nesta coluna,
      Porem neste campo contem 2 id separados por uma ' , '. Sendo assim não dar para mim fazer uma pesquisa com com a tag WHERE id ='Valor'
      Em fim eu quero ajuda para selecionar todos os cadastro cujo o id do usuário online está por EX: Sou o usuário 1 existe dois cadastros que tem meu id: [1, 2] e [2, 1];
      Alem de pesquisar todos os cadastros que tenha meu id nesta coluna eu quero que não tenha interferência ou listar cadastro do usuário 1 se eu for o usuário 21 por ex.
       
      Qual quer ajuda é bem vinda!
      Atenciosamente,
      ~Ronaldo
    • By Agnosticado
      Olá senhores, estou intrigado com uma coisa: tenho o seguinte código:
      $id_exame = "50296"; $pesquisa = "SELECT motivo, CASE WHEN motivo = 'Intensa superposição celular em mais de 75% de esfregaço' THEN 'A' WHEN motivo = 'Sangue em mais de 75% de esfregaço' THEN 'B' WHEN motivo = 'Artefatos de dessecamento mais de 75% de esfregaço' THEN 'C' ELSE 'TESTE' END AS opcao FROM insatisfatorio WHERE exame_id = '$id_exame' ORDER BY opcao ASC"; $linha = mysql_query($pesquisa); while ($pesquisa = mysql_fetch_array($linha) or die(mysql_error())){ echo $pesquisa["opcao"]; } Quando executo usando
       
      $linha = mysql_query($pesquisa);
                 while ($pesquisa = mysql_fetch_array($linha) or die(mysql_error())){
              echo $pesquisa["opcao"];
              echo "<br>";
       
       
      a saída é palavra "TESTE" que o default e não o texto "B" que corresponde a string da chamada do $id_exame = 50296.
       
      O ESQUISITO é que quando executo todo select que está na variável $pesquisa direto no SGBD dá certo e o texto "B" aparece normalmente.
      PQ DIABOS ISSO ACONTECE???
    • By Alandeoli
      Boa noite Pessoal!
       
       
      Estou criando uma tela de login, e passando os dados para uma pagina que vai se conectar ao AD, mas mesmo eu colocando os campos em branco a conexão esta passando como ok, segue os códigos se puderem me ajudar agradeço muito!
       
      Tela conexao:
       
      <?php   $adServer = "ldap://xxx.xxxx.xx.xx";   $ldap = ldap_connect($adServer); $username = $_POST['user']; $password = $_POST['pass'];   $ldaprdn = 'XXX' . "\\" . $username;   ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);   $bind = @ldap_bind($ldap, $ldaprdn, $password);   if($bind=true)   {   echo "conexão ok";     } else   {   echo "erro";     }   Tela Login:   <!DOCTYPE html> <html lang="pt-br"> <link href='css/login.css' rel='stylesheet' />


        <head> <meta charset="UTF-8"> <title>Tela de Login e Senha</title> </head>   <body> <div name="login" id="login"> <div name="box" id="box"> <form method="POST" action="ad.php" name="form"> Login : <input type="text" name="user" id="user"><br><br> Senha : <input type="password" name="pass" id="pass"><br><br> <input type="submit" value="Login" id="button"> </form> </div> </div>   </body>   </html>                                
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.