Blog
Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable
Se você está recebendo este erro em alguma função que funcionava normalmente e após atualizar sua versão do PHP para 7.2.x e ela te retorna a mensagem “PHP 7.2: count(): Parameter must be an array or an object that implements Countable”, seus problemas acabaram!
Traduzindo o erro, significa que “O parâmetro deve ser uma matriz ou um objeto que implemente Contábil”, ou seja, não nulo. Mas porque isso acontece somente com essa versão?
Nós desenvolvedores sempre sofremos com atualizações, descontinuações, etc. e nesse caso não é diferente. Foi alterada a lógica da função nativa count(), onde na versão do PHP 7.2 é preciso que o $array usado na função count($array) não pode ser um valor NULL.
Para corrigir esse problema é simples (rsrsrs... depois de sofrer 1 dia inteiro para resolver), basta você criar uma variável antes e setar ela com um valor, veja:
//ANTES if (count($this->documents) == 0) { //seu código aqui… } //DEPOIS DO PHP 7.2.X $pkCount = (is_array($this->documents) ? count($this->documents) : 0); if ($pkCount == 0) { //seu código aqui... }
Primeiro criamos e setamos uma variável e logo a seguir, testamos se ela é um array válido, se for, obtém a quantidade de itens no array, senão, setamos com um valor qualquer, no caso, usei 0 para continuar com a lógica normalmente como era.
Este problema começou a aparecer em testes de desenvolvimento de um e-commerce que estamos desenvolvendo, utilizando como forma de pagamento o PagSeguro, onde parou de funcionar do nada, e depois de vários testes, resolvi subir para hospedagem, sugerido pelo amigo Marcio Sales, e foi batata, lá como ainda estava com 5.6.x funcionava direitinho. Foi ai que resolvi procurar com calma aonde estava o problema e vi essa ressalva, onde coloquei em prática e resolveu o problema, funcionando agora na versão PHP 7.2.
Era isso ai pessoal, espero ter ajudado e lembre-se, o mesmo problema pode acontecer com a função sizeof(), por se tratar de um alias da função count().
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: Blog
Carregar conteúdo sob demanda com Ajax
11 July de 2019
Resolver erro SSL_connect instalando SASS no Windows
06 December de 2016
Como instalar certificado SSL (https) no WampServer
30 March de 2016
Olá, deixe seu comentário para Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable
João Desconhecido
$numeroDeItens = is_countable( $arrayOuObjecto ) ? count( $arrayOuObjecto ) : 0;
ou para quem não conhece esse método simplificado
$numeroDeItens = 0;
if( is_countable( $arrayOuObjecto ) ) {
$numeroDeItens = count( $arrayOuObjecto );
}
David Pinheiro
if(is_array($erro) && count($erro) == 0 || !isset($erro)){
echo "alert('Login efetuado com sucesso'); location.href='sucesso.php'";
marcos heiner
Vitor Saraiva
$socialmedia = [];
for($i = 0; $i < count($social_media); $i++){
$slug = getSlug($social_media[$i]->icon, $socialmedia);
$social_media[$i]->icon = $slug;
$socialmedia[$slug] = $social_media[$i];
}
Cache::put('social_media', $socialmedia);
return true;
}else{
return false;
}
}
Marcos Martins
Basta adicionar o teste se ele é um array (is_array( )) como abaixo:
if(is_array($social_media) && count($social_media)){
$socialmedia = [];
for($i = 0; $i < count($social_media); $i++){
$slug = getSlug($social_media[$i]->icon, $socialmedia);
$social_media[$i]->icon = $slug;
$socialmedia[$slug] = $social_media[$i];
}
Cache::put('social_media', $socialmedia);
return true;
}else{
return false;
}
}
Vitor Saraiva
-----------------------------------
Marcos Martins
Bom dia Vitor,
vc deve usar a partir do PHP 7.2.x da seguinte forma:
if(is_array($seu-array) && count($seu-array) > 0){
//CONTINUA SEU CÓDIGO SE FOR UM ARRAY VÁLIDO COM INFORMAÇÕES DENTRO...
}else{
//CASO QUEIRA MOSTRAR UM AVISO OU OUTRA COISA SE ELE NÃO TIVER DADOS...
}
JOAO FONTANA
Douglas Ribeiro
Jacinto Mulungo
Andre Wanderley
Dinho fk
Bruno Tozzi
function telefone($telefone, $Param_ddd = false) {
global $detect;
global $ddd;
global $prestadora;
$dddLink = ($Param_ddd) ? $Param_ddd : $ddd;
if($detect->isMobile()) {
$telefone = str_replace(array('-', ' ', '(', ')', '_', '*', '.'), '', $telefone);
$dddLink = str_replace(array('(',")"), '', $dddLink);
$prestadora = str_replace(array('(',")"), '', $prestadora);
$telefone = preg_replace('/[^0-9]/', '', $telefone);
$foneLink = ''.trim(substr($telefone, 0, (count($telefone)-5)).'-'.substr($telefone, (count($telefone)-5))).'';
return $foneLink;
} else {
return $telefone;
}
}
DESDE JÁ MUUUITO OBRIGADO
Marcos Martins
Bom dia Bruno,
como sua variável TELEFONE é uma string, usa no lugar de count($telefone)-5 o comando strlen($telefone)-5 que creio que dará certo.
Bruno Tozzi
Michell Sarno
Você explicou muito bem o problema e como resolver, eu que não sou um programador PHP, compreendi perfeitamente a sua explicação
Obrigado
Kaik Silva
eu recebo uma mensagem de erro....o que eu faço...?
Marcos Martins
if(is_array($SCList)){
$scName = substr($SCList[$i], 1, count($SCList[$i]) - 2);
}else{
//caso não tenha nada no array vc poderá setar ele com alguma coisa padrão
$scName = 'teste';
}
Cristiano Ramos
Fabio Vespero
Leonard Vieira
function ExecuteSQL($query, array $params = NULL){
$this->obj = $this->Conectar()->prepare($query);
if(count($params) > 0) {
foreach($params as $key =>$value){
$this->obj->bindvalue($key, $value);
}
}
Marcos Martins
function ExecuteSQL($query, array $params = NULL){
$this->obj = $this->Conectar()->prepare($query);
if(is_array($params) && count($params) > 0) {
foreach($params as $key =>$value){
$this->obj->bindvalue($key, $value);
}
}
}
Vinicius Pecci
thezzari pacheco
thezzari pacheco
$compList = aps_get_compare_list();
$pid_count = count($compList);
ficaria muito grato se alguém pudesse me ajudar.
Marcos Martins
Bom dia,
não sei o que fazer, mas em suma pode usar isso:
$compList = aps_get_compare_list();
$pid_count = (is_array($compList) ? count($compList) : 0); /* SE FOR UM ARRAY VÁLIDO ELE CONTA OS ELEMENTOS, SENÃO SETA COMO ZERO */
Gildo Paruque
Maikon Melo
Luciano Moreira
Warning: count(): Parameter must be an array or an object that implements Countable in C:\xampp\htdocs\loja\model\Conexao.class.php on line 41
só que estou usando o phpmyadmin
e seria nessa linha aqui
38 function ExecuteSQL($query, array $params = NULL){
39 $this->obj = $this->Conectar()->prepare($query);
40
41 if (count($params) > 0){
42 foreach($params as $key =>$value){
43 $this->obj->bindvalue($key, $value);
44 }
45 }
46
47 return $this->obj->execute();
48 }
lucas santos
Gustavo Melo
Tonim 90
Muito obrigado!
Paulo Diego
Anderson Ferro
Anderson Ferro
Fabiano Spada
Lucas Gomes
if ($operator if ($operator == 'or' && empty($options['reduce_duplicates'])) {
if (count($value) > 1) {
$operator = 'IN';
}
else {
$value = is_array($value) ? array_pop($value) : $value;
if (is_array($value) && count($value) > 1) {
$operator = 'IN';
}
else {
$operator = '=';
}
}
$add_condition = FALSE;
}
Marcos Martins
Lucas Gomes
João Silva
Estou com um problema similar neste parametro:
O que sugeria que fizesse aqui? Esta-me a dar voltas a cabeça, sou novo nisto.heheh
O erro que aparece é este:
Error filtering template: Warning: count(): Parameter must be an array or an object that implements Countable in /home/public_html/app/code/MGS/Lookbook/view/frontend/templates/widget/slider.phtml on line 2
Obrigado!
Marcos Martins
Para poder te ajudar, precisa postar aqui a parte do código que dá esse erro, a parte onde vc usa if count($alguma-coisa)
João Silva
Obrigado pela resposta Marcos.
Colei o codigo completo aqui:
https://pastebin.com/Pf8Fh4Fi
No entanto, a parte do codigo que da o erro é esta mesma (peço desculpa nao coloquei o codigo no post anterior, ou coloquei com o < ? p h p e ele desapareceu :)
Aqui vai:
Obrigado desde ja.
João Silva
if($slider && (count($this->getLookbooks())>0)):
João Silva
Marcos Martins
Troca as 2 primeiras linhas por estas 3:
<?php $slider = $this->getSlider() ?>
<?php $pkCount = (is_array($this->getLookbooks()) ? count($this->getLookbooks()) : 0); ?>
<?php if($slider && ($pkCount > 0)): ?>
Marcos Oliveira
if (!count($theme)){
$theme = 'finland';
} else {
$theme = $theme->theme;
}
Obrigado, abraço!
Marcos
Marcos Martins
Bom dia,
inverte a comparação e usa o is_array():
if(is_array($theme)){
$theme = $theme->theme;
}else{
$theme = 'finland';
}
Marcos Oliveira
if (!isset($_SESSION['theme']) || !$_SESSION['theme']){
$theme = $settings->getSetting("theme");
if (!count($theme)){
$theme = 'finland';
} else {
$theme = $theme->theme;
}
} else {
$theme = $_SESSION['theme'];
}
Obrigado pela atenção aplicada, abraço!
Marcos Martins
Boa tarde Marcos,
if (!isset($_SESSION['theme']) || !$_SESSION['theme']){
$theme = $settings->getSetting("theme");
if (!is_array($theme)){
$theme = 'finland';
} else {
$theme = $theme->theme;
}
} else {
$theme = $_SESSION['theme'];
}
andre luiz
o erro é o seguinte
Warning: count(): Parameter must be an array or an object that implements Countable in C:\xampp\htdocs\plugins\system\nge_system\nge_system.php on line 115
o codigo é este
// if there is a message, show a notification message
if(count($packageUpdateRecord)) {
$app->enqueueMessage(JText::_( sprintf('There is an update for NextGenEditor to version %sGo to update page', $packageUpdateRecord->version)), 'notice');
}
da um help de como corrigir isso pfv
Marcos Martins
Bom dia André,
basta você testar se ele é um array, ao invés de testar se existe algo dentro dele com o COUNT:
if(is_array($packageUpdateRecord)) {
$app->enqueueMessage(JText::_( sprintf('There is an update for NextGenEditor to version %sGo to update page', $packageUpdateRecord->version)), 'notice');
}
matheus aleixo
if (count($rows) === $this->checkQueryExpected)
Sandro Antunes
Sou estudante e estou desenvolvendo um aplicativo que mostra o erro relatado por vc
A minha linha de código é a seguinte:
Como eu poderia acrescentar as suas observações ?
Celso Passos
$total = (is_array($livros) ? count($livros): 0);
Marcos Martins
Boa tarde Celso,
se o valor só está chegando ZERO, essa variável $livros não é um array, debuga ela fazendo um var_dump($livros) antes.
Celso Passos
Celso Passos
giga bola
Anderson Ribeiro
if(count(EncodeExplorer::getConfig("users")) > 0)
Marcos Martins
$pkCount = (is_array(EncodeExplorer::getConfig("users")) ? count(EncodeExplorer::getConfig("users")) : 0);
if ($pkCount > 0) {
//seu código aqui...
}
Anderson Ribeiro
Italo Gervasio
Daniel Mendes
Warning: count(): Parameter must be an array or an object that implements Countable in /home/...../wp-content/themes/ta-meghna/inc/custom-metaboxes/init.php on line 746
E na linha 746 eu tenho:
elseif ( is_array( $meta_box['pages'] ) && count( $meta_box['pages'] === 1 ) )
Na próxima linha, a 747, eu tenho
$type = is_string( end( $meta_box['pages'] ) ) ? end( $meta_box['pages'] ) : false;
Pode, por gentileza, me ajudar e me dizer o que eu troco nessas duas linhas para que funcione?
Grato desde já.
Marcos Martins
Em versões do PHP > 7 você não pode usar o count direto no array, porque se ele não for válido, acusa esse erro Warning: count(). E olha sua instrução abaixo:
elseif ( is_array( $meta_box['pages'] ) && count( $meta_box['pages'] === 1 ) )
Você está perguntando se ele for um array E se a quantidade de registros no array for 1... portanto se esse segundo parâmetro estiver vazio, ele dará erro. Sugiro antes de verficar, armazenar num variavel pra depois testar.
elseif{
$Count = is_array( $meta_box['pages'] ) ? count( $meta_box['pages']) : 0);
( aqui continua sua lógica mas comparando agora o $Count, se vai comparar com 0 (vazio), com 1, ou com valores maiores )
}
Apesar que sua escrita está errada:
está assim:
elseif ( is_array( $meta_box['pages'] ) && count( $meta_box['pages'] === 1 ) )
correto é assim:
elseif ( is_array( $meta_box['pages'] ) && count( $meta_box['pages']) === 1 )
Daniel Mendes
Victor Freitas
Diogo Stancke
if ( $elements['page'] > count( $elements['pages'] ) ) { // if the requested page doesn't exist
$elements['page'] = count( $elements['pages'] ); // give them the highest numbered page that DOES exist
}
Marcos Martins
Não sei exatamente o que está fazendo, porém da forma que colocou o código aqui, imagino que esteja comparando as duas variáveis parecidas, porém com um (s) a mais, está certo disso,
se for, precisa primeiro receber o valor para depois você comparar elas, assim:
$pkCount = (is_array($elements['pages']) ? count($elements['pages']) : 0);
if ( $elements['page'] > $pkCount ) {
$elements['page'] = $pkCount;
}
Felipe Vargas
Marcos Nunes
Marcos Martins
Que bom que está ajudando várias pessoas e obrigado pelo feedback!!!
Gustavo Ribeiro
Estou fazendo um carrinho de compras no meu primeiro projeto.. o carrinho funcionou puxando os dados na página vercarrinho.php, mas quando fui passar o código para esta máquina que estou, apresenta o erro deste tópico, estou com o mesmo problema usando a versão 7.2.. Esta mostrando o mesmo erro, e dando o erro na linha onde se encontra o count
E no utlimo count estava usando esse count em um if na página vercarrinho.php para finalizar o pedido..
Finalizar Pedido
Gostaria de saber como alterar tudo isso para funcionar esse count no meu carrinho,
Desde ja agradeço!
Marcos Martins
Bom dia Gustavo,
só usar esta recomendação deste artigo que vc soluciona seu problema. Só prestar atenção na variável ali e trocar pela sua. Outra coisa, ali eu uso $this->documents porque dentro de uma classe privada, basta você trocar a VAR $this->documents pela sua.
Gustavo Ribeiro
Muito obrigado pela ajuda, consegui resolver!!
Revisando e revisando.
Obrigado.
Rodrigo Martins
if(count($result)) {
return '&Itemid=' . $result;
}
Como eu resolvo?
Marcos Martins
//DEPOIS DO PHP 7.2.X
Cria uma variavel auxiliar antes, com uma ternária para armazenar um valor, seja ele do array ou simplesmente o zero, caso o array esteja vazio.
$pkCount = (is_array($result) ? count($result) : 0);
Aqui você coloca sua condição, não sei precisa ser zero ou maior, então você sabendo o que deseja, modifique de acordo com o que precisa abaixo.
if ($pkCount == 0) {
return '&Itemid=' . $result;
}
João Carlos Lopes
function ExecuteSQL($query, array $params = NULL){
$this->obj = $this->Conectar()->prepare($query);
if(count($params) > 0){
foreach($params as $key =>$value){
$this->obj->bindvalue($key, $value);
}
}
return $this->obj->execute();
Obrigado
Marcos Martins
Bom dia João,
você pode usar a função is_array para testar se é um array válido, assim ele funciona em qualquer versão do PHP, pelo menos até o momento.
function ExecuteSQL($query, array $params = NULL){
$this->obj = $this->Conectar()->prepare($query);
//AGORA VOCE TESTA SE ELE É UM ARRAY ANTES, DESSA FORMA ELE VAI FUNCIONAR PELO MENOS ATÉ O MOMENTO, EM QUALQUER VERSÃO DO PHP
if(is_array($params)){
foreach($params as $key =>$value){
$this->obj->bindvalue($key, $value);
}
return $this->obj->execute();
}else{
return "RETORNA O ERRO QUE DESEJA AQUI";
}
}
Jair Deon
Marcos Martins
Olá Jair,
que bom que o artigo está ajudando bastante gente!
Helmiton Lins
O meu está dando o seguinte erro:
Fatal error: Uncaught Error: Using $this when not in object context in D:\estudo\vemajudar\home.php:30 Stack trace: #0 {main} thrown
E meu código é simples, ele só conta os registros de um SQL:
$user=get_all_Home();
Fiz o que vc falou:
$pkCount = (is_array($this->$user) ? count($this->$user) : 0);
E deu o erro:
Fatal error: Uncaught Error: Using $this when not in object context in D:\estudo\vemajudar\home.php:30 Stack trace: #0 {main} thrown
Abraço!
Marcos Martins
Bom dia Helmiton,
nesse seu caso, você deve usar assim:
$user=get_all_Home();
$pkCount = (is_array($user) ? count($user) : 0);
Você só deverá usar o $this-> se tiver fazendo seu código numa classe, e ter declarado ela antes dos métodos como private. Se for esse seu caso, ainda sim estaria errado, porque quando usa o $this-> a palavra a seguir, ou seja o nome da variável vai sem o $, ficando $this->user.
ricardo l
Andre Silva
Rodrigo Lopes
Me ajudou muito, quebrei a cuca também mas só implementar seu código ao meu e funcionou..
Waleu mesmo!
Marcos Vinicius Nunes Ferreira
Petrus Rennan
: Uncaught Error: Using $this when not in object context in C:\xampp\htdocs\aporte\wp-content\themes\aporte\template-parts\planos\planos-loop.php:18 Stack trace: #0 C:\xampp\htdocs\aporte\wp-includes\template.php(690): require() #1 C:\xampp\htdocs\aporte\wp-includes\template.php(647): load_template('C:\\xampp\\htdocs...', false) #2 C:\xampp\htdocs\aporte\wp-includes\general-template.php(155): locate_template(Array, true, false) #3 C:\xampp\htdocs\aporte\wp-content\themes\aporte\single-plano.php(28): get_template_part('template-parts/...', 'loop') #4 C:\xampp\htdocs\aporte\wp-includes\template-loader.php(74): include('C:\\xampp\\htdocs...') #5 C:\xampp\htdocs\aporte\wp-blog-header.php(19): require_once('C:\\xampp\\htdocs...') #6 C:\xampp\htdocs\aporte\index.php(17): require('C:\\xampp\\htdocs...') #7 {main} thrown in
Marcos Martins
É porque você ao invés de por a sua VARIÁVEL, colocou a minha do exemplo, portanto ela não existe em seu contexto, por isso o erro!
$pkCount = (is_array($this->documents) ? count($this->documents) : 0); // ESTÁ ASSIM NO SITE
$pkCount = (is_array($sua-variavel) ? count($sua-variavel) : 0); // USA A SUA VARIÁVEL
Att. Marcos
Yuri Bigio
Marcos Martins
Não é onde coloco esse código...
...e sim, se você estiver usando o PHP 7.2.X e por acaso estiver com esse problema "Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable", precisa antes testar se realmente é um array válido, porque agora nesta versão do PHP, o array não pode ser NULL, para obter a quantidade de registros dentro dele. Então basta trocar o exemplo de antes, pelo depois ali no artigo.