Solucionado (ver solução)
Solucionado
(ver solução)
21
respostas

Uncaught TypeError must be of type DateTime string given, called in

Olá Alura,

eu preciso passar um campo de datetime e tive um erro aqui:

link do github:[ git@github.com:tiagobrandao03/pcd_curriculo.git]

erro.

Fatal error: Uncaught TypeError: Modelo\Curriculo::__construct(): Argument #22 ($criado_em) must be of type DateTime, string given, called in C:\xampp\htdocs\pcd_curriculo\index.php on line 33 and defined in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php:55 Stack trace: #0 C:\xampp\htdocs\pcd_curriculo\index.php(33): Modelo\Curriculo->__construct(NULL, 'Fabio Souza', 'fabiosouza@gmai...', '31 99994455', '21', 'masculino', 'branco', 'MG', 'Belo Horizonte', 'audicao', 'audicao', 'audicao', 'audicao', 'audicao', 'Administracao', 'Administracao', '5000', 'Integral', 'Integral', '31 99994455', 'facebook.com/jo...', '2024-11-04T07:4...') #1 {main} thrown in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php on line 55
21 respostas

Esse erro ocorre porque o parâmetro $criado_em precisa ser um objeto do tipo DateTime, mas você está passando uma string no formato datetime. Para corrigir, você deve instanciar um objeto DateTime antes de passar o valor para o construtor.

  1. Converta a string de data para um objeto DateTime antes de passar para o construtor.

    // Exemplo de string de data
    $data_criacao = '2024-11-04T07:40:00';
    
    // Converte a string para um objeto DateTime
    $data_criacao_obj = new DateTime($data_criacao);
    
    // Passe o objeto DateTime para o construtor
    $curriculo = new Modelo\Curriculo(..., $data_criacao_obj);
    
  2. Substitua o valor passado para $criado_em pelo objeto $data_criacao_obj.

Essa abordagem deve resolver o erro de TypeError que você encontrou, garantindo que o valor passado seja do tipo DateTime.

Meu caro, eu preciso encapsular a variavel no sistema que eu fiz. Eu fiz uma classe, uns construct e depois chamei para pagina index. Eu preciso de algo mais certo, entende?

Oi!

O erro é esse mesmo que foi mencionado pelo estudantes na resposta anterior. Na sua classe Curriculo o atributo $criado_em não é do tipo String e sim DateTime, então no seu arquivo index.php, você precisa converter de String para DateTime:

$dataString = $_POST['criado_em'];
$data = DateTime::createFromFormat('d/m/Y', $dataString);

$curriculo = new Curriculo(
        null,
        $_POST['nome'],
        $_POST['email'],
        $_POST['contato'],
        $_POST['idade'],
        $_POST['genero'],
        $_POST['raca'],
        $_POST['estado'],
        $_POST['cidade'],
        $_POST['deficiencia'],
        $_POST['cid'],
        $_POST['limitacao'],
        $_POST['laudo'],
        $_POST['cargo'],
        $_POST['interesse'],
        $_POST['formacao'],
        $_POST['expectativa_salarial'],
        $_POST['modelo_trabalho'],
        $_POST['regime_trabalho'],
        $_POST['preferencia_contato'],
        $_POST['redes_sociais'],
        $data
    );

Somente se atente ao formato da data.

Olá, Tiago. Tudo bem?

Para resolver o problema, a principal questão é que o campo criado_em, que precisa ser do tipo DateTime, está sendo passado como uma string ($_POST['criado_em']). Em PHP, é necessário converter essa string em um objeto DateTime antes de passá-la ao construtor da classe Curriculo. Veja os passos:

  1. No arquivo index.php, é preciso converter a data que vem do formulário ($_POST['criado_em']) para um objeto DateTime antes de criar uma instância de Curriculo.

  2. Caso a string de data seja inválida, podemos adicionar um tratamento de exceção para evitar que o sistema quebre.

  3. Código Modificado para o index.php. Aqui está a modificação que você pode adicionar ao arquivo index.php:

    if (isset($_POST['cadastro'])) {
        // Recebe a string de data do formulário e converte para DateTime
        $data_criacao_str = $_POST['criado_em'];
        
        // Tenta converter para DateTime, caso contrário, define como null ou exibe erro
        try {
            $data_criacao_obj = new DateTime($data_criacao_str);
        } catch (Exception $e) {
            // Lida com a exceção (ex.: você pode definir uma data padrão, exibir um erro, etc.)
            echo "Erro ao converter a data: " . $e->getMessage();
            $data_criacao_obj = null; // ou definir uma data padrão
        }
    
        $curriculo = new Curriculo(
            null,
            $_POST['nome'],
            $_POST['email'],
            $_POST['contato'],
            $_POST['idade'],
            $_POST['genero'],
            $_POST['raca'],
            $_POST['estado'],
            $_POST['cidade'],
            $_POST['deficiencia'],
            $_POST['cid'],
            $_POST['limitacao'],
            $_POST['laudo'],
            $_POST['cargo'],
            $_POST['interesse'],
            $_POST['formacao'],
            $_POST['expectativa_salarial'],
            $_POST['modelo_trabalho'],
            $_POST['regime_trabalho'],
            $_POST['preferencia_contato'],
            $_POST['redes_sociais'],
            $data_criacao_obj // Passa o objeto DateTime aqui
        );
    
        $curriculoRepositorio = new CurriculoRepositorio($pdo);
        $curriculoRepositorio->salvar($curriculo);
    }
    

Explicação das Alterações

  • Conversão de $_POST['criado_em']: Como o valor $_POST['criado_em'] vem como uma string (no formato YYYY-MM-DDTHH:MM), ele é convertido em um objeto DateTime usando o construtor new DateTime(). Essa conversão é essencial para que o valor seja aceito pelo parâmetro tipado DateTime no construtor da classe Curriculo.

  • Tratamento de Exceções: Adicionar um bloco try-catch permite lidar com erros de formatação de data, prevenindo a falha completa do sistema.

Esse ajuste deve resolver o erro de TypeError e garantir que o campo criado_em seja corretamente encapsulado como um objeto DateTime.

Espero ter ajudado. 

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Olá Alura,

O exemplo que vocês me daram, esta em try cath, e o modelo que eu fiz está em uma classe e depois o construtor está diferente do exemplo que vocÊs me deram:

class Curriculo
{
 private ?int $id;
    private string $nome;
    private string $email;
    private string $contato;
    private string $idade;
    private string $genero;
    private string $raca;
    private string $estado;
    private string $cidade;
    private string $deficiencia;
    private string $cid;
    private string $limitacao;
    private string $laudo;
    private string $cargo;
    private string $interesse;
    private string $formacao;
    private string $expectativa_salarial;
    private string $modelo_trabalho;
    private string $regime_trabalho;
    private string $preferencia_contato;
    private string $redes_sociais;
    private \DateTime $criado_em;

    
    public function __construct(?int   $id, string $nome, string $email, string $contato, string $idade, string
                                       $genero, string $raca, string $estado, string $cidade, string $deficiencia, string $cid, string $limitacao,
                                       string $laudo, string $cargo, string $interesse, string $formacao, string
                                       $expectativa_salarial, string $modelo_trabalho, string $regime_trabalho, string
                                       $preferencia_contato, string $redes_sociais, \DateTime $criado_em)
    {
        $this->id = $id;
        $this->nome = $nome;
        $this->email = $email;
        $this->contato = $contato;
        $this->idade = $idade;
        $this->genero = $genero;
        $this->raca = $raca;
        $this->estado = $estado;
        $this->cidade = $cidade;
        $this->deficiencia = $deficiencia;
        $this->cid = $cid;
        $this->limitacao = $limitacao;
        $this->laudo = $laudo;
        $this->cargo = $cargo;
        $this->interesse = $interesse;
        $this->formacao = $formacao;
        $this->expectativa_salarial = $expectativa_salarial;
        $this->modelo_trabalho = $modelo_trabalho;
        $this->regime_trabalho = $regime_trabalho;
        $this->preferencia_contato = $preferencia_contato;
        $this->redes_sociais = $redes_sociais;
        $this->criado_em = $criado_em;
    }
    
    ```
    //O Curriculo REpositorio
    
    public function salvar(Curriculo $curriculo)
    {
        //:nome,:email,:contato,:idade,:genero,:raca,:estado,:cidade,:deficiencia,:cid,:limitacao,:laudo,:cargo,:interesse,
        //        :formacao,:expectativa_salarial,:modelo_trabalho,:regime_trabalho,:preferencia_contato,:redes_sociais

        $sql = "INSERT INTO curriculo (nome,email,contato,idade,genero,raca,estado,cidade,deficiencia,cid,limitacao,laudo,cargo,interesse,formacao,expectativa_salarial,modelo_trabalho,regime_trabalho,preferencia_contato,redes_sociais,criado_em) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1,$curriculo->getNome());
        $statement->bindValue(2,$curriculo->getEmail());
        $statement->bindValue(3,$curriculo->getContato());
        $statement->bindValue(4,$curriculo->getIdade());
        $statement->bindValue(5,$curriculo->getGenero());
        $statement->bindValue(6,$curriculo->getRaca());
        $statement->bindValue(7,$curriculo->getEstado());
        $statement->bindValue(8,$curriculo->getCidade());
        $statement->bindValue(9,$curriculo->getDeficiencia());
        $statement->bindValue(10,$curriculo->getCid());
        $statement->bindValue(11,$curriculo->getLimitacao());
        $statement->bindValue(12,$curriculo->getLaudo());
        $statement->bindValue(13,$curriculo->getCargo());
        $statement->bindValue(14,$curriculo->getInteresse());
        $statement->bindValue(15,$curriculo->getFormacao());
        $statement->bindValue(16,$curriculo->getExpectativa_Salarial());
        $statement->bindValue(17,$curriculo->getModelo_Trabalho());
        $statement->bindValue(18,$curriculo->getRegime_Trabalho());
        $statement->bindValue(19,$curriculo->getPreferencia_Contato());
        $statement->bindValue(20,$curriculo->getRedes_Sociais());
        $statement->bindValue(21,$curriculo->getCriadoEm());
        $statement->execute();
    }
    

A sua classe Curriculo esta correta.

A mudança que mandamos deve ser feita no arquivo index.php pois é nesse arquivo que está sendo criando uma instância da classe Curriculo, com os valores sendo recuperados via $_POST

Olá alura,

Eu já tinha colocado o $_post[ 'criado_em'] na index e deu esse erro:

o link do github: git@github.com:tiagobrandao03/pcd_curriculo.git

Fatal error: Uncaught TypeError: Modelo\Curriculo::__construct(): Argument #22 ($criado_em) must be of type DateTime, string given, called in C:\xampp\htdocs\pcd_curriculo\index.php on line 33 and defined in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php:55 Stack trace: #0 C:\xampp\htdocs\pcd_curriculo\index.php(33): Modelo\Curriculo->__construct(NULL, 'Sekiro', 'sekiro@gmail.co...', '31 99994455', '21', 'masculino', 'branco', 'MG', 'Belo Horizonte', 'audicao', 'audicao', 'audicao', 'audicao', 'audicao', 'Adsminsitracao', 'Administracao', '5000', 'Integral', 'Integral', '31 99994455', 'facebook.com/jo...', '2024-11-06T10:3...') #1 {main} thrown in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php on line 55

No seu index.php, você tem esse trecho de código (da linha 10 até a linha 42):

if (isset($_POST['cadastro'])){
    $curriculo = new Curriculo(
        null,
        $_POST['nome'],
        $_POST['email'],
        $_POST['contato'],
        $_POST['idade'],
        $_POST['genero'],
        $_POST['raca'],
        $_POST['estado'],
        $_POST['cidade'],
        $_POST['deficiencia'],
        $_POST['cid'],
        $_POST['limitacao'],
        $_POST['laudo'],
        $_POST['cargo'],
        $_POST['interesse'],
        $_POST['formacao'],
        $_POST['expectativa_salarial'],
        $_POST['modelo_trabalho'],
        $_POST['regime_trabalho'],
        $_POST['preferencia_contato'],
        $_POST['redes_sociais'],
        $_POST['criado_em']
    );

    $curriculoRepositorio = new CurriculoRepositorio($pdo);
    $curriculoRepositorio->salvar($curriculo);
}
?>

É esse trecho que você precisa corrigir para:

if (isset($_POST['cadastro'])){
    $dataString = $_POST['criado_em'];
    $data = DateTime::createFromFormat('d/m/Y', $dataString);

    $curriculo = new Curriculo(
        null,
        $_POST['nome'],
        $_POST['email'],
        $_POST['contato'],
        $_POST['idade'],
        $_POST['genero'],
        $_POST['raca'],
        $_POST['estado'],
        $_POST['cidade'],
        $_POST['deficiencia'],
        $_POST['cid'],
        $_POST['limitacao'],
        $_POST['laudo'],
        $_POST['cargo'],
        $_POST['interesse'],
        $_POST['formacao'],
        $_POST['expectativa_salarial'],
        $_POST['modelo_trabalho'],
        $_POST['regime_trabalho'],
        $_POST['preferencia_contato'],
        $_POST['redes_sociais'],
        $data
    );

    $curriculoRepositorio = new CurriculoRepositorio($pdo);
    $curriculoRepositorio->salvar($curriculo);
}
?>

Está com esses erro agora.

Fatal error: Uncaught TypeError: Modelo\Curriculo::__construct(): Argument #22 ($criado_em) must be of type DateTime, bool given, called in C:\xampp\htdocs\pcd_curriculo\index.php on line 15 and defined in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php:55 Stack trace: #0 C:\xampp\htdocs\pcd_curriculo\index.php(15): Modelo\Curriculo->__construct(NULL, 'Sekiro', 'sekiro@gmail.co...', '31 99994455', '21', 'masculino', 'branco', 'MG', 'Belo Horizonte', 'audicao', 'audicao', 'audicao', 'audicao', 'audicao', 'Administracao', 'Administracao', '5000', 'Integral', 'Integral', '31 99994455', 'facebook.com/jo...', false) #1 {main} thrown in C:\xampp\htdocs\pcd_curriculo\src\Modelo\Curriculo.php on line 55

Manda aqui como ficou o seu codigo completo do arquivo index.php

<?php
global $pdo;
require "src/conexao-bd.php";
require "src/Modelo/Curriculo.php";
require "src/Repositorio/CurriculoRepositorio.php";

use Modelo\Curriculo;
use Repositorio\CurriculoRepositorio;

if (isset($_POST['cadastro'])){
    $dataString = $_POST['criado_em'];
    $data = DateTime::createFromFormat('d/m/Y', $dataString);

    $curriculo = new Curriculo(
        null,
        $_POST['nome'],
        $_POST['email'],
        $_POST['contato'],
        $_POST['idade'],
        $_POST['genero'],
        $_POST['raca'],
        $_POST['estado'],
        $_POST['cidade'],
        $_POST['deficiencia'],
        $_POST['cid'],
        $_POST['limitacao'],
        $_POST['laudo'],
        $_POST['cargo'],
        $_POST['interesse'],
        $_POST['formacao'],
        $_POST['expectativa_salarial'],
        $_POST['modelo_trabalho'],
        $_POST['regime_trabalho'],
        $_POST['preferencia_contato'],
        $_POST['redes_sociais'],
        $data
    );

    $curriculoRepositorio = new CurriculoRepositorio($pdo);
    $curriculoRepositorio->salvar($curriculo);
}
?>

Está certo o código. O problema é na conversão da data.

Qual o formato da data que aparece no campo do formulário?

Esse código que passei:

DateTime::createFromFormat('d/m/Y', $dataString);

Está considerando que a data vem do formulário no seguinte formato dd/MM/yyyy (por exemplo: 08/11/2024) se a data vier com um formato diferente vai dar erro.

<div class="col">
             <label for="criado_em">Criado em</label>
             <input type="datetime-local" id="criado_em" name="criado_em">

         </div>

Alterte essa linha:

$data = DateTime::createFromFormat('d/m/Y', $dataString);

Para:

$data = new DateTime($_POST['criado_em']);

E veja se resolve então

Fatal error: Uncaught Error: Object of class DateTime could not be converted to string in C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php:72 Stack trace: #0 C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php(72): PDOStatement->bindValue(21, Object(DateTime)) #1 C:\xampp\htdocs\pcd_curriculo\index.php(40): Repositorio\CurriculoRepositorio->salvar(Object(Modelo\Curriculo)) #2 {main} thrown in C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php on line 72

Agora o problema é no seu arquivo CurriculoRepositorio, na linha 72:

$statement->bindValue(21,$curriculo->getCriadoEm());

Altere essa linha para:

$statement->bindValue(21, $curriculo->getCriadoEm()->format('Y-m-d H:i:s'));

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php:73 Stack trace: #0 C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php(73): PDOStatement->execute() #1 C:\xampp\htdocs\pcd_curriculo\index.php(40): Repositorio\CurriculoRepositorio->salvar(Object(Modelo\Curriculo)) #2 {main} thrown in C:\xampp\htdocs\pcd_curriculo\src\Repositorio\CurriculoRepositorio.php on line 73

Manda aqui como ficou o código completo do seu arquivo CurriculoRepositorio.php

<?php

namespace Repositorio;

use Modelo\Curriculo;

class CurriculoRepositorio
{
    private \PDO $pdo;

    /**
     * @param PDO $pdo
     */
    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }


    /**
    getId())
     * getNome())
     * getEmail())
     * getContato())
     * getIdade())
     * getGenero())
     * getRaca())
     * getEstado())
     * getCidade()
     * getDeficiencia()
     * getCid()
     * getLimitacao()
     * getLaudo()
     * getCargo()
     * getInteresse()
     * getFormacao()
     * getExpectativa_Salarial()
     * getModelo_Trabalho()
     * getRegime_Trabalho()
     * getCurriculo()
     * getPreferencia_Contato()
     * getRedes_Sociais()
     * getCriado_Em()
     */
    public function salvar(Curriculo $curriculo)
    {
        //:nome,:email,:contato,:idade,:genero,:raca,:estado,:cidade,:deficiencia,:cid,:limitacao,:laudo,:cargo,:interesse,
        //        :formacao,:expectativa_salarial,:modelo_trabalho,:regime_trabalho,:preferencia_contato,:redes_sociais

        $sql = "INSERT INTO curriculo (nome,email,contato,idade,genero,raca,estado,cidade,deficiencia,cid,limitacao,laudo,cargo,interesse,formacao,expectativa_salarial,modelo_trabalho,regime_trabalho,preferencia_contato,redes_sociais,criado_em) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1,$curriculo->getNome());
        $statement->bindValue(2,$curriculo->getEmail());
        $statement->bindValue(3,$curriculo->getContato());
        $statement->bindValue(4,$curriculo->getIdade());
        $statement->bindValue(5,$curriculo->getGenero());
        $statement->bindValue(6,$curriculo->getRaca());
        $statement->bindValue(7,$curriculo->getEstado());
        $statement->bindValue(8,$curriculo->getCidade());
        $statement->bindValue(9,$curriculo->getDeficiencia());
        $statement->bindValue(10,$curriculo->getCid());
        $statement->bindValue(11,$curriculo->getLimitacao());
        $statement->bindValue(12,$curriculo->getLaudo());
        $statement->bindValue(13,$curriculo->getCargo());
        $statement->bindValue(14,$curriculo->getInteresse());
        $statement->bindValue(15,$curriculo->getFormacao());
        $statement->bindValue(16,$curriculo->getExpectativa_Salarial());
        $statement->bindValue(17,$curriculo->getModelo_Trabalho());
        $statement->bindValue(18,$curriculo->getRegime_Trabalho());
        $statement->bindValue(19,$curriculo->getPreferencia_Contato());
        $statement->bindValue(20,$curriculo->getRedes_Sociais());
        $statement->bindValue(21, $curriculo->getCriado_Em()->format('Y-m-d H:i:s'));
        $statement->execute();
    }

    public function buscar(int $id)
    {
        $sql = "SELECT * FROM curriculos WHERE id=?";
        $statement = $this->pdo->prepare($sql);
        $statement->bindValue(1, $id);
        $statement->execute();
        $dados = $statement->fetch(PDO::FETCH_ASSOC);

        return $this->formarObjeto($dados);
    }
}
solução!

Na sua função salvar tem um interrrogação a mais (devem ser 21):

$sql = "INSERT INTO curriculo (nome,email,contato,idade,genero,raca,estado,cidade,deficiencia,cid,limitacao,laudo,cargo,interesse,formacao,expectativa_salarial,modelo_trabalho,regime_trabalho,preferencia_contato,redes_sociais,criado_em) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

Consegui. Erro mesmo! Valeu Demais!