merovingio 0 Denunciar post Postado Junho 10, 2021 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
Omar~ 87 Denunciar post Postado Junho 10, 2021 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
merovingio 0 Denunciar post Postado Junho 12, 2021 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
Matheus Tavares 167 Denunciar post Postado Junho 12, 2021 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
merovingio 0 Denunciar post Postado Junho 14, 2021 Muito obrigado. Preferi a ideia abaixo mesmo: $x->get = new \stdClass; Compartilhar este post Link para o post Compartilhar em outros sites