Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Ao tentar cadastrar CPF no banco, muda os numeros automaticamente

Recommended Posts

Galera,

 

Alguem já passou por algo assim?

 

Fiz um formulário bem simples de cadastro, contendo nome e CPF (resumindo pra não deixar todo o código aqui):

<form class="form-horizontal validar" action="?submit=true" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <label class="col-sm-2 control-label">Nome</label>
        <div class="col-sm-10"><input type="text" class="form-control validate[required]" name="txNome" placeholder="Digite o nome aqui" value="" /></div>
    </div>
    <div class="line line-dashed b-b line-lg pull-in"></div>
    <div class="form-group">
        <label class="col-sm-2 control-label">CPF</label>
        <div class="col-sm-6"><input type="text" class="form-control validate[required]" name="txCPF" placeholder="Digite o CPF aqui" value="" /></div>
    </div>
    <div class="line line-dashed b-b line-lg pull-in"></div>
    <div class="form-group">
        <label class="col-sm-2 control-label"></label>
        <div class="col-sm-10">
            <button class="btn btn-primary" type="submit">Gravar</button>
        </div>
    </div>
</form>

Porém, se eu cadastro um CPF (ex: "04992271901"), no banco, está indo como "2147483647".

O banco está como Varchar (15). Estava INT, mas mesmo com INT dava problema. Tentei mudar e o erro persiste.

 

Ao dar submit, ele executa este código:

if( $_GET['submit'] == "true" ){
    $objRegistro->cliNome = $_POST['txNome'];
    $objRegistro->cliCPF = $_POST['txCPF'];
    $resultado = $objRegistro->save();
    if( !empty( $resultado ) ){
        header( "Location: ?action=listar" );
    }
    else{
        $divRegistro .= alert("Ocorreu um erro ao executar a ação (Cadastrar registro)!");
    }
}

A função save() é meramente um insert no banco.

public function save( $showquery = false ){
    $query = $this->insert( $this->storage, 'sistema_cliente' )->values( $this->storage );
    if( $showquery ){
        echo $query."<br />";	
    }
    try {
        $objConnect = Config::connect();
        if( $objResult = $objConnect->query( $query ) ){
            return $objConnect->insert_id;
        }
        else{
            return false;	
        }
        $objResult->close();
        $objQuery->close();
    }
    catch ( Exception $e ){
        $object = null;
    }
}

O pior é que a query que vai pro banco executar já vai com o CPF "alterado".

Será que é por alguma incompatibilidade string/inteiro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque um var_dump de $_POST, para verificar se os itens estão sendo submetidos corretamente.

 

Verifique se há alguma função para alterar dados de request ($_POST, $_GET, $_REQUEST). Algumas funções tendem a mudar a representação de dados.

 

Outro detalhe, a maioria de informações com máscara devem ser cadastradas como string (telefone, cep, cpf, cnpj, rg). Apesar de alguns poderem ser compatíveis com inteiro, não é uma boa prática, pois não há necessidade de soma ou conversões (diferente de data e valores monetários).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste a função insert() e a função values()

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gabriel

Achava que era justamente o contrário! :assobiando:

Eu achava que qualquer valor inteiro (eu já estou submetendo os dados "limpos", sem máscaras ou qualquer outro caractere) e achava que pelo fato de estar em INT comprometia a representação.

 

Segue o var_dump:

 

 

array(8) {

["txNome"]=>
string(12) "Maykel Esser"
["txEmail"]=>
string(24) "teste@dominio.com.br"
["pwSenha"]=>
string(5) "admin"
["txCPF"]=>
string(11) "04992271901"
["txRG"]=>
string(8) "78314060"
["txTelefone"]=>
string(14) "4184012834"
["txDataNascimento"]=>
string(10) "22/03/1988"
["txEndereco"]=>
array(1) {
[0]=>
array(8) {
["CEP"]=>
string(8) "82840180"
["Logradouro"]=>
string(22) "Rua Gastão Luiz Cruls"
["Numero"]=>
string(4) "1100"
["Complemento"]=>
string(0) ""
["Bairro"]=>
string(4) "Alto"
["Cidade"]=>
string(8) "Curitiba"
["Estado"]=>
string(2) "PR"
["Referencia"]=>
string(20) "Teste de referência"
}
}
}

 

@William

 

insert()

public function insert( Array $fields, $table = null ){
    if( !is_null( $fields ) || count( $fields ) != false ){
        $table = is_null( $table ) ? $this->getTable() : '`'.$table.'`';
        $this->sqlQuery = sprintf( 'INSERT INTO %s ( %s )', $table, $this->quotedFields( $fields ) );
    }
    return $this;
}

values()

public function values( Array $values ){
    if( !is_null( $values ) || count( $values ) != false ){
        foreach( $values as $index => $data ){
            if( !is_numeric( $data ) ){
                $value[] = "'{$data}'";
            }else{
                $value[] = (integer)$data;
            }
        }
        $this->sqlQuery = sprintf( '%s VALUES( %s )', $this->sqlQuery, implode( ',', $value ) );
    }
    return $this;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vi nada de errado.

Tem certeza de que o tipo de campo no banco é varchar ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
$cpf = "04992271901";

if( !is_numeric( $cpf ) ){
	$value[] = "'{$cpf}'";
}else{
	$value[] = (integer)$cpf;
}
echo '<pre>';
print_r($value);
print_r($cpf);
echo '</pre>';
exit;

:assobiando:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui voltou:

Array
(
    [0] => 4992271901
)
04992271901
vc teve um resultado diferente @jhrhp ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho o mesmo resultado do @jhrhp.

 

Ó o banco!

 

4jX1A7F.png

 

Será que ele tá voltando assim por causa do (integer)? da função values()?

 

 

----

 

EDIT

 

Fiz o teste aqui, alterando a função values(), retirando o (integer) que compunha a string de retorno. A principio funcionou, mas... estranho, não devia alterar o valor de uma string, sendo inteiro ou não, certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual é a máquina de vcs?

 

echo PHP_INT_MAX; //9223372036854775807
@Maykel-ctba, o @jhrhp já explicou o seu problema.

Leia o post dele. Eu estava errado sobre o banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Huuuuuummmm.... interessante! Nem sabia desse MAX INT. O meu gerado é esse mesmo, 2147483647.

Lendo aqui rapidinho, vi que esse valor que é gerado (2147483647) é o valor máximo a ser gravado em uma string de 32 bits. Por isso ele para aí.

 

Bom, a principio a solução vai ser tirar o (integer) da função values para resolver.

 

Obrigado @William e @jhrhp pelo aprendizado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

@Gabriel

Achava que era justamente o contrário! :assobiando:

Eu achava que qualquer valor inteiro (eu já estou submetendo os dados "limpos", sem máscaras ou qualquer outro caractere) e achava que pelo fato de estar em INT comprometia a representação.

 

Submeter sem/com mascaras e/ou limpos é indiferente. Entretanto, ao salvar no SGBD, os dados devem ser antes sanitizados, estar sem mascara e estarem no formato de string, sem nenhum tipo de cast type.

Qual é a máquina de vcs?

 

echo PHP_INT_MAX; //9223372036854775807
@Maykel-ctba, o @jhrhp já explicou o seu problema.

Leia o post dele. Eu estava errado sobre o banco.

 

Eu tive o mesmo resultado que você (Debian 7.8 64 bits).

Entretanto, servidores PHP windows (Wamp, Xampp) são recomendados que sejam 32bits por causa da disponibilidade de DLLs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sanitizar é a limpeza necessária para um determinado dado (ou um determinado tipo de dado): remover máscara, adicionar/remover caracteres, truncate (grosseiramente "cortar" caracteres).

 

Cast type é transformar o tipo de dado. O PHP faz isso de forma automática, mas seria basicamente isso:

//String para integer
$integer = (int)"123456";

//Integer para booleano;
$boolean = (boolean)1;

//Integer para float
$float = (float)150;

//Float para integer
$integer = (int)15,5;

Tem mais alguns exemplos aqui:

http://php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

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.