Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!