PDOStatement :: bindParam () blends the data

0

I have a class that does the insertion of records into a table. The data that comes from the request I transform into an array and then construct a SQL statement similar to this:

INSERT INTO web_messages (pk_web_messages, fk_type_messages, name_user, email_user, title_msg, phone_user, cel_user, end_user, compl_user, city_user, state_user, cep_user, msg_user) VALUES (:pk_web_messages, :fk_type_messages, :name_user, :email_user, :title_msg, :phone_user, :cel_user, :end_user, :compl_user, :city_user, :state_user, :cep_user, :msg_user)

The parameters step by the function bindParam and when I do the execute executes a lot of crazy data in the table: see the code as I am:

        foreach ($this->Dados as $field => $defs): // Constrói os parâmetros do comando INSERT
            if (is_array($defs)): // Se $defs é um array então possui valor e tipo do dado
                $value = ((($defs['type'] > FDT_STR) && (isset($defs['value']))) ? $defs['value'] : null); //  pega o valor ou um tipo de arquivo a ser armazenado
                $type = (($value) ? $FIELD_PDO_TYPE[$defs['type']] : PDO::PARAM_NULL); // Se o valor for nulo retorna PDO::PARAM_NULL senão converte para o tipo correto
                $this->Create->bindParam(":{$field}", $value, $type); // Cria o parâmetro no PDO com o nome do campo, valor e tipo
            else:
                $this->Create->bindParam(":{$field}", $defs); // Cria o parâmetro PDO com o Default (PDO::PARAM_STR)
            endif;
        endforeach;

the data array contains:

[pk_web_messages] => 0
[fk_type_messages] => 3
[name_user] => Nome do usuario
[email_user] => [email protected]
[title_msg] => Mensagem nova com testes da classe
[phone_user] => (11) 3333-4444
[cel_user] => (11) 2222-3333
[end_user] => Rua do usuário, 1111
[compl_user] => apto 10
[city_user] => Cidade do usuário
[state_user] => SP
[cep_user] => 00.000-000
[msg_user] => 
    (
        [value] => Texto a ser inserido no campo Blob.
        [type] => 6
    )

See what type in the msg_user field means the mapping to insert objects into the BLOB field which becomes the PDO :: PARAM_LOB constant. If I do the debug of the php variables everything works correctly, however when doing the PDOStatement :: execute () it writes a lot of nonsense in the database, or it gives conversion error of the variables, or error that truncates the data to the field.... What can this be?

    
asked by anonymous 14.04.2016 / 22:51

1 answer

2

This bindParam is wrong, the right thing would be to use bindValue :

$this->bindValue(':campo',$string,PDO::PARAM_STR);

Explaining the difference between bindParam and bindValue (@Bacco tip)

bindParam :

$sexo = 'masculino';
$s = $dbh->prepare('SELECT nome FROM cadastro WHERE sexo = :sexo');
$s->bindParam(':sexo', $sexo); // usado bindParam para vincular a variável
$sexo = 'feminino';
$s->execute(); // executado como WHERE sexo = 'feminino'

bindValue :

$sexo = 'masculino';
$s = $dbh->prepare('SELECT nome FROM cadastro WHERE sexo = :sexo');
$s->bindValue(':sexo', $sexo); // usado bindValue para vincular o valor da variável
$sexo = 'feminino';
$s->execute(); // executado como WHERE sexo = 'masculino'

Explaining:

The bindParam receives the variable by reference and the bindValue uses the variable only as value.

Examples taken from: link

    
14.04.2016 / 22:54