Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

allantoledo

Pesquisa por CPF em Banco de Dados MSSQL

Recommended Posts

Estou criando uma página de pesquisa em um banco de dados MSSQL, estou utilizando o CPF como chave, mas na tabela, alguns estão cadastrados com . e -, como "999.999.999-99", e outros como "99999999999". Estou utilizando umas máscara porque a maioria está cadastrada com pontos e traço, mas quando o cadastro contém apenas números, ele não encontra.

Alguma dica?

Código:


<html>
<head>
	<title>Instant Search</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
	<script src="js/jquery.maskedinput.min.js"></script>
	
	<script>
	jQuery(function($){
		$("#cpf").mask("999.999.999-99", { placeholder: " " });
    });
	</script>

	<style>
        /*css*/
    </style>
</head>
<body>
	<form method="get" action="">
		<input type="text" id="cpf" name="q" />
		<input type="submit" value="Ver pontos" />
	</form>

	<div id="results"></div>

</body>
</html>

<?php

if(!empty($_GET['q'])) {
	search();
}

function search() {

// Dados do banco
$dbhost   = "host";   #Nome do host
$db       = "BANCO";   #Nome do banco de dados
$user     = "USER"; #Nome do usuário
$password = "SENHA";   #Senha do usuário

// Dados da tabela
$tabela = "ConsultaClientes";    #Nome da tabela
$campo1 = "Nome";  #Nome do campo da tabela
$campo2 = "Pontos";  #Nome de outro campo da tabela
$campo3 = "CPF"; #campo com CPF

@mssql_connect($dbhost,$user,$password) or die("Não foi possível a conexão com o servidor!");
@mssql_select_db("$db") or die("Não foi possível selecionar o banco de dados!");

$q = str_replace("'","''",$_GET['q']);
$sql = mssql_query("
    SELECT
        $campo1, $campo3
    FROM $tabela
    WHERE $campo3 LIKE '%{$q}%'
    ")
or die ( 'Query Error' );

//Create an array with the results
$numRegistros = mssql_num_rows($sql);

if ($numRegistros!=0) {
	while ($v = mssql_fetch_array($sql)) {
		echo "$v[$campo1] - $v[$campo3]\n<br>\n";
	}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

CPFs devem ser cadastrados como strings e sem máscaras. Na realidade, todos os dados que possuem máscara devem ser cadastrados sem (CPF, CNPJ, Telefone, CEP, etc...).

A solução é fazer a sanitização dos seus dados. Pode fazer expressão regular para limpar e depois faça a busca:

http://stackoverflow.com/questions/29206404/mssql-regular-expression

A gambiara é usar expressão regular direto na busca:

http://stackoverflow.com/questions/29206404/mssql-regular-expression

Entretanto, busca por expressão regular será custosa e deixará sua busca lenta, muito lenta. É provável que tenha de criar índices específicos para esse caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentando, mas sem muito resultado, ainda dando erro:


Warning: mssql_query() [function.mssql-query]: message: An expression of non-boolean type specified in a context where a condition is expected, near 'REPLACE'. (severity 15) in /home/storage/c/60/21/allantoledo/public_html/conectar.php on line 59

$sql = mssql_query("
    SELECT
        $campo1, $campo3
    FROM $tabela
    WHERE REPLACE(REPLACE($campo3,'.',''),'-','') = '%{$q}%'
    ")
or die ( 'Query Error' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você leu o post #4?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, li sim, mas sou novo no assunto. A primeira vez que me meti a programar em PHP foi na semana passada, agora vem o SQL, to ficando doido.

Se você tiver tempo pra detalhar um pouco sua resposta, o assunto me interessa diretamente, inclusive já tenho algumas ideias de onde usar no meu sistema.

Consegui fazer a busca funcionar assim:

$sql = mssql_query("
    SELECT
        $campo1, $campo3
    FROM $tabela
    WHERE REPLACE(REPLACE($campo3,'.',''),'-','') = '$q'
    ")
or die ( 'Query Error' );
Muito obrigado pelas orientações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Expressões regulares precisam ser estudadas. A maioria dos brasileiros aprendeu com algum material daqui: http://aurelio.net/regex/

Você pode estudar o básico no seguinte link:

http://aurelio.net/regex/guia/

Depois de estudar, deverá aplicar no SQL Server, utilizando o comando REGEXP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testa ai, eu não testei, mas suponho que estejá sem erros :)

<html>
<head>
    <title>Instant Search</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="js/jquery.maskedinput.min.js"></script>
    
    <script>
    jQuery(function($){
        $("#cpf").mask("999.999.999-99", { placeholder: " " });
    });
    </script>

    <style>
        /*css*/
    </style>
</head>
<body>
    <form method="get" action="">
        <input type="text" id="cpf" name="q" />
        <input type="submit" value="Ver pontos" />
    </form>

    <div id="results"></div>
</body>
</html>

<?php

if(!empty($_GET['q'])) {
    search();
}

function search() {

    // Dados do banco
    $dbhost   = "host";   #Nome do host
    $db       = "BANCO";   #Nome do banco de dados
    $user     = "USER"; #Nome do usuário
    $password = "SENHA";   #Senha do usuário

    // Dados da tabela
    $tabela = "ConsultaClientes";    #Nome da tabela
    $campo1 = "Nome";  #Nome do campo da tabela
    $campo2 = "Pontos";  #Nome de outro campo da tabela
    $campo3 = "CPF"; #campo com CPF

    @mssql_connect($dbhost,$user,$password) or die("Não foi possível a conexão com o servidor!");
    @mssql_select_db("$db") or die("Não foi possível selecionar o banco de dados!");

    $q = $_GET['q'];

    if (isset($q)) {
        $cpf_das_novinha = $q;

        $cpf_das_novinha = str_replace('.', '', $cpf_das_novinha); // Retira os pontos
        $cpf_das_novinha = str_replace('-', '', $cpf_das_novinha); // Retira os hifens

        $arruma_o_cpf_da_novinha = substr($cpf_das_novinha , 0, 3).".".substr($cpf_das_novinha , 3, 3).".".substr($cpf_das_novinha , 6, 3)."-".substr($cpf_das_novinha , 9, 2);
        $show = $arruma_o_cpf_da_novinha;

        $sql = mssql_query(" SELECT $campo1, $campo3 FROM $tabela WHERE $campo3 LIKE '%{$show}%' ") or die ( 'Query Error' );

        //Create an array with the results
        $numRegistros = mssql_num_rows($sql);

        if ($numRegistros!=0) {
            while ($v = mssql_fetch_array($sql)) {
                echo "$v[$campo1] - $v[$campo3]\n<br>\n";
            }
        }else{
            if isset($q) {
                $cpf_das_novinha = $q;
                
                $cpf_das_novinha = str_replace('.', '', $cpf_das_novinha); // Retira os pontos
                $cpf_das_novinha = str_replace('-', '', $cpf_das_novinha); // Retira os hifens

                $show1 = $cpf_das_novinha;

                $sql = mssql_query(" SELECT $campo1, $campo3 FROM $tabela WHERE $campo3 LIKE '%{$show1}%' ") or die ( 'Query Error' );

                //Create an array with the results
                $numRegistros = mssql_num_rows($sql);

                if ($numRegistros!=0) {
                    while ($v = mssql_fetch_array($sql)) {
                        echo "$v[$campo1] - $v[$campo3]\n<br>\n";
                    }
                }else{
                    echo "Fuuuuuuuuuuuuuuuuuuuuuuuck!!! não encontrei o cpf das novinha :(";
                }
            }
        }
    }
}
?>

Qualquer coisa, só falar....

E antes que eu me esqueça, o sistema foi simples de tudo, eu fiz com que ele tenha 2 verificações, na primeira eu utilizei um modo simples para que ele coloca-se as pontuações, caso não encontre nada ele irá re fazer a pesquisa em utilizar estas pontuacoes, deixando assim o código limpo :)

Se tiver erros porfavor avise-me!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.