Ir para conteúdo
merovingio

[Resolvido] Erro ao enviar form com PHP 8.0.6

Recommended Posts

Ao tentar enviar dois formulários em um site que tenho em PHP eles funcionavam perfeitamente. Mas ao mudar para a verão 8.0.6 do PHP aparece os seguintes erros:

Fatal error: Uncaught Error: Attempt to assign property "name" on null in D:\wamp64\www\01siteOne\src\core\Route.php on line 40
( ! ) Error: Attempt to assign property "name" on null in D:\wamp64\www\01siteOne\src\core\Route.php on line 40

Segue parte do conteúdo de Route.php: (que funciona perfeitamente em versões anteriores a 8 do PHP.

 private function getRequest() {
        $obj = new \stdClass();

        foreach ($_GET as $key => $value) {
            @$obj->get->$key = $value;
        }

        foreach ($_POST as $key => $value) {
40            @$obj->post->$key = $value;
        }
        return $obj;
    }

E parte dos formulários que uso:

 <form role="form" method="post" action="/newsletter" id="news">
      <div class="input-group mb-3">
         <span class="input-group-text" id="user"><i class="fa fa-user icon" aria-hidden="true"></i></span>
          	<input type="text" class="form-control" name="name" id="name" placeholder="Digite seu nome" aria-describedby="user">
      </div>
   (...)
</form>

E:

<form action="/send" id="contactForm" method="post">
   <div class="form-floating mb-2">
      <input type="text" class="form-control" id="contactName" name="name" placeholder="John Smith">     
   </div>
  (...)
</form>  

Se há campos em branco ou errados são tratados no servidor. Mas o problema é que mesmo que preencha todos os campos eles não são reconhecidos pelo PHP 8.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparentemente o código da class está correto.

Porém acredito que a falta de um construtor seja o problema, o PHP 8 está cheio de frescuras, muito dos meus códigos também tive de fazer alterações para funcionar na versão.

 

Tente usar essa classe ela é para captura de super globais:

Spoiler

<?php
/**
 * ********************************************
 * * @Class GlobalFilter
 * * @author Spell-Master (Omar Pautz)
 * * @version 2.0 (2019)
 * ********************************************
 * * Aplica um filtro padrão sobre
 * super-globais e retorna os mesmos como
 * objetos.
 * ********************************************
 */

class GlobalFilter {

    /**
     * ****************************************
     * Converte array singular em objeto.
     * ****************************************
     * @Param {ARR} $array
     * array para converter.
     * ****************************************
     */
    public static function StdArray($array) {
        $object = new stdClass();
        if (is_array($array)) {
            foreach ($array as $name => $value) {
                $object->$name = $value;
            }
        }
        return $object;
    }

    /**
     * ****************************************
     * Converte array multi-dimensional em
     *  objeto.
     * ****************************************
     * @Param {ARR} $array
     * array para converter.
     * ****************************************
     */
    public static function ObjArray($array) {
        if (is_array($array)) {
            return (object) array_map(__FUNCTION__, $array);
        } else {
            return $array;
        }
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_GET.
     * ****************************************
     */
    public static function filterGet() {
        $filterGet = filter_input_array(INPUT_GET, FILTER_DEFAULT);
        $filter = isset($filterGet) ? self::StdArray($filterGet) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_POST.
     * ****************************************
     */
    public static function filterPost() {
        $filterPost = filter_input_array(INPUT_POST, FILTER_DEFAULT);
        $filter = isset($filterPost) ? self::StdArray($filterPost) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_SESSION.
     * ****************************************
     */
    public static function filterSession() {
        $filterSession = filter_input_array(INPUT_SESSION, FILTER_DEFAULT);
        $filter = isset($filterSession) ? self::StdArray($filterSession) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_COOKIE.
     * ****************************************
     */
    public static function filterCookie() {
        $filterCookie = filter_input_array(INPUT_COOKIE, FILTER_DEFAULT);
        $filter = isset($filterCookie) ? self::StdArray($filterCookie) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_SERVER.
     * ****************************************
     */
    public static function filterServe() {
        $filterServe = filter_input_array(INPUT_SERVER, FILTER_DEFAULT);
        $filter = isset($filterServe) ? self::StdArray($filterServe) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_ENV.
     * ****************************************
     */
    public static function filterEven() {
        $filterEven = filter_input_array(INPUT_ENV, FILTER_DEFAULT);
        $filter = isset($filterEven) ? self::StdArray($filterEven) : false;
        return ($filter);
    }

    /**
     * ****************************************
     * Aplica um filtro padrão sobre entrada
     *  INPUT_REQUEST.
     * ****************************************
     */
    public static function filterRequest() {
        $filterRequest = filter_input_array(INPUT_REQUEST, FILTER_DEFAULT);
        $filter = isset($filterRequest) ? self::StdArray($filterRequest) : false;
        return ($filter);
    }

}

 

 

Exemplo:

<?php
$post = GlobalFilter::filterPost(); // Obtem tudo que está na super global $_POST

if ($post) {
  var_dump($post);
  // No seu caso >>>>>
  echo $post->name;
} else {
  // Nenhum $_POST existente o valor de $post é (false)
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado. Mas não resolveu. Aí resolvi voltar a fonte heheheh e achei a solução.

https://www.youtube.com/watch?v=j9QltW5IBNY&list=PLSYIyzca1f9wGynWlC-SH2lVBkE8S81A0&index=13&ab_channel=TJGWeb

 

private function getRequest()
  {
       $obj=new \stdClass;
        
        $get=(object)$_GET;
        $post=(object)$_POST;

        $obj->get=$get;
        $obj->post=$post;
        
        return $obj;   
}

Em teoria, o arroba (@) deveria ter ajudado, mas não ajudou. Mas esse código aí de cima deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @merovingio, tudo bem? Seja bem-vindo!

 

Que bom que já conseguiu resolver o problema, mas vou complementar um pouco:

 

1 - Veja a mensagem de erro:

Fatal error: Uncaught Error: Attempt to assign property "name" on null

O que ele nos diz é que houve um erro fatal ao tentar atribuir "name" em null.

 

Quem seria name e quem seria null?

Name seria o valor (string) que sua $key está carregando nessa iteração e null seria a chave get ou post, que nesse caso não existe, pois não foi declarada/instanciada.

 

Ou seja: $obj->get->$key, onde get era para ser um objeto, mas como você ainda não havia definido ele, ele era null, ou vazio/nulo.

 

Resumindo:

<?php
$x = new \stdClass;

$x->get->teste = 1;

print_r( $x );// fatal error, pois get não existe

Solução:

<?php
$x = new \stdClass;
$x->get = new \stdClass;

$x->get->teste = 1;

print_r( $x );// agora sim

É claro que o que eu disse para get também vale para post.

 

No caso as linhas de atribuição deveriam estar fora do seu foreach.

 

A forma que você encontrou para solucionar é mais elegante que utilizando os foreach, mas apenas até o momento em que você não manipula ou consulta essas variáveis (você está apenas fazendo uma cópia).

 

E por fim, sugiro que não utilize o operador de supressão de erros, @. É uma má prática, pois os nossos erros nos ajudam a aprender. Devemos conhecê-los para não repeti-los no futuro :)

error_reporting( E_ALL ); para exibir os erros em desenvolvimento, sempre.

error_reporting( 0 ); para suprimir TODOS os erros aos nossos usuários, quando a aplicação estiver no ar.

Esse é o comportamento ideal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.