Fatal error Uncaught PDOException: General error: mode must be an integer

1

I'm getting this error when trying to do an insert in the database with PDO:

> > <br /> <b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY000]: General error: mode must be an integer in
> C:\Users\Usuário.NB-0307\Documents\Site\Admin
> 2\db\enviarexercicio.php:51 Stack trace:
> #0 C:\Users\Usuário.NB-0307\Documents\Site\Admin 2\db\enviarexercicio.php(51): PDO-&gt;query('INSERT INTO tb_...',
> Array)
> #1 {main}   thrown in <b>C:\Users\Usuário.NB-0307\Documents\Site\Admin 2\db\enviarexercicio.php</b> on line <b>51</b><br />

I can not find what's causing it, I'm using this class to connect to a bank:

    <?php
/**
 * Classe de conexão ao banco de dados usando PDO no padrão Singleton.
 * Modo de Usar:
 * require_once './Database.class.php';
 * $db = Database::conexao();
 * E agora use as funções do PDO (prepare, query, exec) em cima da variável $db.
 */
class Database
{
    # Variável que guarda a conexão PDO.
    protected static $db;
    # Private construct - garante que a classe só possa ser instanciada internamente.
    private function __construct()
    {
        # Informações sobre o banco de dados:
        $db_host = "******";
        $db_nome = "*****";
        $db_usuario = "****";
        $db_senha = "****";
        $db_driver = "***";
        # Informações sobre o sistema:
        $sistema_titulo = "***";
        $sistema_email = "*****";
        try
        {
            # Atribui o objeto PDO à variável $db.
            self::$db = new PDO("$db_driver:host=$db_host; dbname=$db_nome", $db_usuario, $db_senha);
            # Garante que o PDO lance exceções durante erros.
            self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            # Garante que os dados sejam armazenados com codificação UFT-8.
            self::$db->exec('SET NAMES utf8');
        }
        catch (PDOException $e)
        {
            # Envia um e-mail para o e-mail oficial do sistema, em caso de erro de conexão.
            mail($sistema_email, "PDOException em $sistema_titulo", $e->getMessage());
            # Então não carrega nada mais da página.
            die("Connection Error: " . $e->getMessage());
        }
    }
    # Método estático - acessível sem instanciação.
    public static function conexao()
    {
        # Garante uma única instância. Se não existe uma conexão, criamos uma nova.
        if (!self::$db)
        {
            new Database();
        }
        # Retorna a conexão.
        return self::$db;
    }   
}

And it works normal when I select, but when I try to insert the error

<?php
    require_once './Database.class.php';
    $db = Database::conexao();
    date_default_timezone_set('America/Sao_Paulo');    
    $errors = array(); //To store errors
    $form_data = array(); //Pass back the data to 'form.php'

    /* Validate the form on the server side */
    if (empty($_POST['Enunciado'])) {
        $errors['erro'] = 'EnunciadoName cannot be blank';
    }
    if (empty($_POST['Pergunta'])) { 
        $errors['erro'] = 'Pergunta cannot be blank';
    }
    if (empty($_POST['resposta1'])) { 
        $errors['erro'] = 'resposta1 cannot be blank';
    }
    if (empty($_POST['resposta2'])) { 
        $errors['erro'] = 'resposta2 cannot be blank';
    }
    if (empty($_POST['resposta3'])) { 
        $errors['erro'] = 'resposta3 cannot be blank';
    }
    if (empty($_POST['respostacorreta'])) { 
        $errors['erro'] = 'respostacorreta cannot be blank';
    }
    if (empty($_POST['unidade'])) { 
        $errors['erro'] = 'unidade cannot be blank';
    }
    if (!empty($errors)) { //If errors in validation
        $form_data['success'] = false;
        $form_data['erros']  = $errors;
    }
    else { //If not, process the form, and return true on success

        $Enunciado = $_POST['Enunciado'];
        $Pergunta = $_POST['Pergunta'];
        $resposta1 = $_POST['resposta1'];
        $resposta2 = $_POST['resposta2'];
        $resposta3 = $_POST['resposta3'];
        $respostacorreta = $_POST['respostacorreta'];
        $unidade = $_POST['unidade'];

        $resultado = $db->query("INSERT INTO tb_exercicios(enunciado,pergunta,resposta1,resposta2,resposta3,respostacorreta,unidade) VALUES(:ENUNCIADO, :PERGUNTA, :RESPOSTA1, :RESPOSTA2, :RESPOSTA3, :RESPOSTACORRETA, :UNIDADE)",array(
                        ":ENUNCIADO"=>$Enunciado,
                        ":PERGUNTA"=>$Pergunta,
                        ":RESPOSTA1"=>$resposta1,    
                        ":RESPOSTA2"=>$resposta2,    
                        ":RESPOSTA3"=>$resposta3,    
                        ":RESPOSTACORRETA"=>$respostacorreta,    
                        ":UNIDADE"=>$unidade
                    ));
        if($resultado){
            $form_data['success'] = true;
            $form_data['enviado'] = 'Cadastrado';
        }else{
            $form_data['success'] = false;
            $errors['erro'] = 'Erro ao fazer o cadastro no banco';
            $form_data['erros']  = $errors;
        }
    }

    //Return the data back to form.php
    echo json_encode($form_data);
 ?>
    
asked by anonymous 18.01.2018 / 12:52

1 answer

2

The query() of the PDO method does not support prepared statements. By passing placeholders to the insert they will be understood as strings.

To use prepared statements the first step is to call the method prepare() and then excute() passing the array to the values for the corresponding placeholders.

Change:

 $resultado = $db->query("INSERT INTO tb_exercicios(enunciado,pergunta,resposta1,resposta2,resposta3,respostacorreta,unidade) VALUES(:ENUNCIADO, :PERGUNTA, :RESPOSTA1, :RESPOSTA2, :RESPOSTA3, :RESPOSTACORRETA, :UNIDADE)",array(
                        ":ENUNCIADO"=>$Enunciado,
                        ":PERGUNTA"=>$Pergunta,
                        ":RESPOSTA1"=>$resposta1,    
                        ":RESPOSTA2"=>$resposta2,    
                        ":RESPOSTA3"=>$resposta3,    
                        ":RESPOSTACORRETA"=>$respostacorreta,    
                        ":UNIDADE"=>$unidade
                    ));

To:

$resultado = $db->prepare("INSERT INTO tb_exercicios(enunciado,pergunta,resposta1,resposta2,resposta3,respostacorreta,unidade) VALUES(:ENUNCIADO, :PERGUNTA, :RESPOSTA1, :RESPOSTA2, :RESPOSTA3, :RESPOSTACORRETA, :UNIDADE)");

$sucesso = $resultado->execute( array(":ENUNCIADO"=>$Enunciado,
       ":PERGUNTA"=>$Pergunta,
       ":RESPOSTA1"=>$resposta1,    
       ":RESPOSTA2"=>$resposta2,    
       ":RESPOSTA3"=>$resposta3,    
       ":RESPOSTACORRETA"=>$respostacorreta,    
       ":UNIDADE"=>$unidade));

if(!$sucesso){
    echo '<pre>';
    print_r($resultado->errorInfo());
}    
    
18.01.2018 / 12:59