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

Asked

Viewed 628 times

1

I am getting this error when I try to make an insert in the bank 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’t find what is causing, I’m using this class for connection to 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 make error Insert

<?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);
 ?>

1 answer

2


The method query() do PDO does not support Prepared statements. When passing placeholders to 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 value array to the 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());
}    

Browser other questions tagged

You are not signed in. Login or sign up in order to post.