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



  • 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 this is causing, I'm using this class for bank connection:

        <?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-&gt;query("INSERT INTO tb_exercicios(enunciado,pergunta,resposta1,resposta2,resposta3,respostacorreta,unidade) VALUES(:ENUNCIADO, :PERGUNTA, :RESPOSTA1, :RESPOSTA2, :RESPOSTA3, :RESPOSTACORRETA, :UNIDADE)",array(
                        ":ENUNCIADO"=&gt;$Enunciado,
                        ":PERGUNTA"=&gt;$Pergunta,
                        ":RESPOSTA1"=&gt;$resposta1,    
                        ":RESPOSTA2"=&gt;$resposta2,    
                        ":RESPOSTA3"=&gt;$resposta3,    
                        ":RESPOSTACORRETA"=&gt;$respostacorreta,    
                        ":UNIDADE"=&gt;$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);
    

    ?>



  • The method query() of PDO does not support statements prepared. When 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 with the values for 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());
    }


Log in to reply
 


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2