- Unsupported operand types
- 2 Answers 2
- Solve PHP Fatal Error: Unsupported operand types
- Take your skills to the next level ⚡️
- About
- Search
- Tags
- Fatal error: Uncaught TypeError: Unsupported operand types: string + int in
- 2 Answers 2
- PHP — Fatal error: Unsupported operand types
- Php unsupported operand types string int
- Правильный алгоритм переезда Битрикса на PHP8
- Ошибки при обновлении версии PHP для Битрикса (обновляется)
- Полезные SSH команды для упрощения обновления
- Что делать если нет доверенного разработчика?
Unsupported operand types
I am working on a shopping cart function for a website and have stumbled across this error: Fatal error: Unsupported operand types in . on line xx I think this may be because I am performing some math between a variable and a value within an array. What I am not sure of is how to perform math on a value within an array:
$line_cost = $price * $quantity;
?> $quantity) < list($name, $description, $price) = getProductInfo($product_id); echo "$price"; // 20 var_dump($quantity); // "array(2) < ["productid"]=>string(1) "2" ["qty"]=> int(1) >". $line_cost = $price * $quantity; //Fatal error occurs here > ?>
It means your two operands are not numbers or anything that can be converted to numbers. What are the two variables?!
You’ve got a bunch of SQL injection problems here. You should read php.net/manual/en/security.database.sql-injection.php
Thanks for your comments. Sorry for the delay in responding. Line 77 is «$line_cost = $price * $quantity;» echo from $price is «20» and Var_dump from $quantity is «array(2) < ["productid"]=>string(1) «2» [«qty»]=> int(1) >». What I am trying to do is multiply the quantity by the price
2 Answers 2
As the gettype() function shows that $price is a string and $quantity is an array, typecast $price first to integer and use the array $quantity with its key to access the integer value (if it is not an integer, typecast it too).
$line_cost =(int)$price * (int)$quantity['key'];
Thanks, this worked a treat. my issue was the same output but coming from a WordPress integration problem between the plugin ELEX and the plugin woocommerce product bundles. ELEX never once defined the data type of variables it deals with. Thanks again (added the comment so others that have the same problem can find this solution)
for future readers, note that depending on the case, the casting should be to FLOAT instead of INT, otherwise they may loose precision. In this case, since it’s a price, I would expect it to have cents (or whatever, depending on currency)
I think this may be because I am performing some math between a variable and a value within an array.
You are attempting to perform math (multiplication) between an integer and an array, eg: 20 x array. This doesn’t work because array’s don’t have a multiplication operand (and if they did, it probably wouldn’t do what you want).
What you want to do is to perform math on an variable and a value (element) within an array. Since your array is an associative array, you need to supply the key, like so:
$line_cost = $price * $quantity['qty'];
Solve PHP Fatal Error: Unsupported operand types
Posted on Sep 30, 2022
The PHP Fatal Error: Unsupported operand types is an error message that indicates you have used operators on values that are not supported.
PHP operators like + and — can be used on int type values. When you try to combine values like array or string with an int , the error message will appear:
This fatal error commonly occurs in PHP v8, where the execution of operands is made stricter.
In PHP v7 or below, the string will be ignored and PHP will print out the int value:
To solve this fatal error, you need to make sure that the operands (the values on the left or right side of the operator) are supported by PHP.
Arithmetic operators like + , — , * , and / support int and float types.
You can’t add an array and an int , or a string and a float when using these operators:
Even PHP v5 will show “Unsupported operand types” when you add an array and an int as in the example above.
When you don’t know how to fix the issue, use var_dump() to see the type of the variable like this:
The above example will output the content of the $arr variable:
Knowing that it’s an array, you can choose to perform addition to the number element, which is the price element:
PHP requires you to use supported operand types for the code.
When you see the message “Fatal Error: Unsupported operand types”, you need to pay attention to the variables used as operands.
They are the variables on the left or right side of the operator symbol. You can find information about them using the var_dump() function.
Once you know the operand types, adjust your code accordingly to solve this error.
And that’s how you handle PHP Fatal Error: Unsupported operand types. Nice work! 😉
Take your skills to the next level ⚡️
I’m sending out an occasional email with the latest tutorials on programming, web development, and statistics. Drop your email in the box below and I’ll send new stuff straight into your inbox!
About
Hello! This website is dedicated to help you learn tech and data science skills with its step-by-step, beginner-friendly tutorials.
Learn statistics, JavaScript and other programming languages using clear examples written for people.
Search
Type the keyword below and hit enter
Tags
Click to see all tutorials tagged with:
Fatal error: Uncaught TypeError: Unsupported operand types: string + int in
Fatal error: Uncaught TypeError: Unsupported operand types: string + int in C:\xamppp\htdocs\file\thefile\config.php:105 Stack trace: #0 C:\xamppp\htdocs\file\thefile\category.php(84): alphaID(‘f’, true) #1 thrown in C:\xamppp\htdocs\file\thefile\config.php on line 105
$pass_hash = hash('sha256',$pass_key); $pass_hash = (strlen($pass_hash) < strlen($index) ? hash('sha512', $pass_key) : $pass_hash); for ($n = 0; $n < strlen($index); $n++) < $p[] = substr($pass_hash, $n, 1); >array_multisort($p, SORT_DESC, $i); $index = implode($i); > if ($to_num) < $len = strlen($in) - 1; for ($t = $len; $t >= 0; $t--) < $bcp = bcpow($base, $len - $t); $out = $out + strpos($index, substr($in, $t, 1)) * $bcp; >if (is_numeric($pad_up)) < $pad_up--; if ($pad_up >0) < $out -= pow($base, $pad_up); >> > else < if (is_numeric($pad_up)) < $pad_up--; if ($pad_up >0) < $in += pow($base, $pad_up); >> for ($t = ($in != 0 ? floor(log($in, $base)) : 0); $t >= 0; $t--) < $bcp = bcpow($base, $t); $a = floor($in / $bcp) % $base; $out = $out . substr($index, $a, 1); $in = $in - ($a * $bcp); >> return $out; > ?>
2 Answers 2
The error you’ve provided only occurs on PHP 8 and it is because you’re trying to add a string to an integer. In previous versions the error message used to be «A non-numeric value encountered» which in some situations made the issue a lot clearer.
Your issue will be resolved by changing $out = » to $out = null which has no adverse affect on the output.
- In PHP v5.6 you would receive no error at all (and the code would work fine)
- In PHP v7 you would be informed with a WARNING that «A non-numerical value was encountered»
- In PHP v8 you are informed with a FATAL error that «Uncaught TypeError: Unsupported operand types: string + int»
omg thank you so much for help. it fixed. and you share new info to that i didn’t know yet. thank you so much. 🙂
PHP — Fatal error: Unsupported operand types
+ can be used in different ways but to avoid complications, only use it on numeric values.
When you didnt initially set $this->vars to be an array, it won’t work (thx to deceze); see http://codepad.viper-7.com/A24zds
Instead try init the array and use array_merge :
public function set($key,$value=null)< if (!is_array($this->vars)) < $this->vars = array(); > if(is_array($key))< $this->vars = array_merge($this->vars, $key); >else< $this->vars[$key] = $value; > >
one' print_r($test); $test = array_merge($test, $t); // will print both elements print_r($test);
We cannot tell this for sure but $this->vars looks like supposed to be an array according to the question.
But since the OP is getting the error he’s getting, it apparently is not an array. So this won’t help much. The operation is also not equivalent to the OP’s.
@deceze Good point, you are right there. I guess it’s null when the OP tries his code, null+array doesn’t work either.
The solution is in the error. You are trying to sum two value that has different types. You are summing array with normal value;
$this->vars should be an array
**PROBLEM YOUR FAILED TO ADDED EQUAL SIGN TO THE VARIABLE WHICH FETCH INFORMATION TO THE DATABASE **
Hell guys i tried to remove PHP — Fatal error: Unsupported operand types this error will occur during us fail to declare the variable correct so you will solve it this error by add the sign «=» Example if you try to type like this:
$sa="SELECT * FROM `anquiz` WHERE user_id = $a"; $af=mysql_query($sa); while($cv-mysql_fetch_array($af))< $d1=$cv['id']; $d2=$cv['answer'];//student answer $d4=$cv['quiz_id'];// quiz id $d5=$cv['user_id'];// user id insert his file $d6=$cv['time'];
you will get error of fatal unsupported operand by sign - on varible that carry the mysql_fetch_array instead of adding = Take that example` by adding that sign you will see an error
Php unsupported operand types string int
Многие владельцы Битрикса видят с января 2023 года эту неприятную надпись. Давайте будем разбираться, как технически осуществить данный переезд.
Правильный алгоритм переезда Битрикса на PHP8
- Делаем бэкап текущего сайта
- Разворачиваем его на DEV версии под php7
- Обновляем на DEV ядро Битрикса
- Меняем на DEV сервере версию php на восьмую
- Смотрим, работает ли админка. Если нет - устраняем ошибки (скорее всего они будут в сторонних модулях), добиваемся работоспособности.
- Запускаем проверку системы, не должно быть ошибок
- Переходим в публичную часть сайта и проверяем основной функционал, если есть ошибки - устраняем
- Ещё раз всё перепроверяем, добиваемся отсутствия ошибок
- Переезжаем на PROD (боевой) сервер
Конечно, многие пункты весьма трудоемки. Ниже мы собрали наиболее типовые ошибки, возникающие при обновлении PHP
Ошибки при обновлении версии PHP для Битрикса (обновляется)
1. В списке модулей есть пустые строки
Может проявляться примерно так
[Ux11] Ошибка описания модуля "название.модуля". Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля "название.модуля"
В этом случае в файле install/index.php функцию module_name() заменяем на __construct()
2. Ошибка работы со статическими методами
call_user_func_array(): Argument #1 ($function) must be a valid callback, non-static method
Лечится следующим образом: в папке модуля ( /bitrix/modules/проблемный_модуль) нужно в классах найти проблемный метод и дописать слово static. Получится примерно так:
static function MyFunction()
Эту операцию возможно нужно будет повторить много-много раз.
3. Ошибка в функции count()
В php 8 функция count стала требовать строго типизированный параметр. Ранее в случае подачи некорректного параметра функция возвращался false, теперь же возвращает fatal error
count(): Argument #1 ($value) must be of type Countable|array, null given (0)
Проще всего сделать своеобразное "переопределение" функции, например таким образом:
function php7_count($ar) < if (is_array($ar)) < return count($ar); >return false; >
И потом рекурсивно пробежать по сторонним модулям и используемым шаблонам, подменить count( на php7_count. Массово это можно сделать с помощью Notepad++.
4. Ошибка в функции impode()
Возникает не так часто, как count(), выглядит примерно так:
implode(): Argument #2 ($array) must be of type ?array, string given (0)
Опять же, нет проверки на массив, который подается на вход функции
Решается следующим образом:
Для уверенности лучше рекурсивно прогнать по всем скриптам сайта и поискать вхождения функции impode.
5. Ошибка с фигурными скобками
В предыдущих версиях PHP к элементам массива можно было обращаться и через квадратные, и через фигурные скобки. В PHP8 поддержка фигурных скобок в этом контексте запрещена.
Fatal error: Array and string offset access syntax with curly braces is no longer supported in путь/к/вашему/скрипту
Решается путем замены фигурных скобок на квадратные
6. Проблема с функцией each()
В версии PHP 8 удалена функция each. Ошибка проявляется так:
Call to undefined function each()
Исправляется заменой функции на следующую:
function php7_each(&$data) < $key = key($data); $ret = ($key === null)? false: [$key, current($data), ‘key’ =>$key, ‘value’ => current($data)]; next($data); return $ret; >
и вызываться она должна с предварительной проверкой на переменную-массив:
7. Ошибки с преобразованием типов
Данный класс ошибок проявляется примерно так
Unsupported operand types: string * int (0)
Для решения нужно явно привести типы. Например, так:
$int_value = (int)$maybe_string_value
Раньше было допустимо просто строковое значение умножать на единицу и получать int значение. Теперь - нет.
8. Ошибка с типами данных в операциях
Раньше можно было выполнять арифметические операции без явного приведения типов. В PHP8 необходимо строго указать тип, иначе появляется ошибка вида
Fatal error: Uncaught Error: Unsupported operand types: string - string
Вместо минуса может быть любой оператор.
Чтобы устранить ошибку, необходимо явно задать тип переменным, например, так:
9. Недопустимый тип смещения
У меня подобная ситуация встретился в компоненте news.list. Оказалось, что при вызове компонента в качестве PROPERTY_CODE прилетал пустой массив. Ранее это вызывало лишь warning, теперь же в версии php 8 это стало fatal error. Лечится путем анализа каждого конкретного случая отдельно и не поддается общему решению.
10. Ошибка в функции number_format
[TypeError] number_format(): Argument #1 ($num) must be of type float, string given (0)
В функцию на вход должно подаваться число, если подается строка или null, то теперь выдает ошибку. Решение простое, через явное преобразование типов floatval:
number_format(floatval($price), 2,'.', ' ')
Полезные SSH команды для упрощения обновления
поиск содержимого в файлах
Что делать если нет доверенного разработчика?
Можете обратиться в Брейнфорс, помогут аккуратно провести обновление битрикс до php 8