4

I have a working php application and it is running fine on php 7.0 version. But when I upgrade a php version to 7.2. I am getting this error:

count(): Parameter must be an array or an object that implements Countable

I am getting errors on code where I am comparing my data with count function. For example this is my code:

$keytest = KeyUser::where('key', '=', $key)->first();
 if (count($keytest) == 1) {
   //logic ... 
  }

I am using laravel where I am running a query and counting it if it is equal to 1 then logic should work.

So my problem is I have written this kind of logic on many controllers and if I have to change everything one by one it could become nightmare. So is there any way where I can write a global function to make count work as it was working in php older version. What can be the easiest fix.

7
  • That's logical. First returns objects. You should use get() method in order to retrieve an array Commented Jun 3, 2018 at 14:19
  • try doing var_dump($keytest) and check what is the type returned for $keytest Commented Jun 3, 2018 at 14:25
  • I can do that but I need to change all of the code my question is can we write any global function to make it workable my application is very big. Commented Jun 3, 2018 at 14:27
  • github.com/yiisoft/yii/issues/4167 php made changes to count function I need a solution to make it work. Commented Jun 3, 2018 at 14:29
  • It is actually provable: 3v4l.org/MFVQC -- very interesting to be honest. I think you could write your own count() function that checks for is_object() and returns 1 in this case, not throwing an error. And after this check you perform the old count() call. But I have no idea if it is possible to override built-in functions of the language itself, so you might need to update all references to the function. Commented Jun 3, 2018 at 14:33

3 Answers 3

8

This problem can be handle using disable error handling. Please refer this link for solution: Laravel not compatiable with php 7.2

Here I found a solution to your problem simply write this code inside your controller or if you want to make it work for whole application write this code in route.php:

 //app/Http/routes.php

 if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
// Ignores notices and reports all other kinds... and warnings
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
// error_reporting(E_ALL ^ E_WARNING); // Maybe this is enough
}

I know this is not the best solution but it can be a good hack.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for this solution it worked all of my warning is gone.
Beware! Handling the problem by disabling the error reporting is just a FISHY WORKAROUND rather than becoming a SOLUTION. Please stop misguiding the newcomers who need to understand the real issue behind. Workarounds are not solutions! The correct solution is using well written libraries / frameworks which does not explodes on minor version upgrades, at least adaptable in a reasonable time window. Passing arbitrary variables/types to the native count() function was always a design problem, even before the release of PHP 7 but brillant maintainers ignored it until the real warning arrives.
2

It's solved when you change your code:

$keytest = KeyUser::where('key', '=', $key)->first();
if ($keytest) {
   //logic ... 
}

Comments

1

Try to use this Instead of "count" you can use "empty" function to check the contents. Eg: Instead of:

if ( count( $data ) ) 

Use:

if ( ! empty( $data ) )

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.