У меня есть форма авторизации, где получают пароль по введеному $_POST[‘telegram_id’],
если пароль равен введенному $_POST[‘password’] то все ок.
Но если ввести telegram_id которого нет в ДБ, выходит ошибка Trying to access array offset on value of type null
Как исправить?
Код:
<?php
session_start();
require_once '../admin/connection.php';
include '../admin/tg_token.php';
//текста ошибки по стандарту нет
$id_error = '';
$pass_error = '';
if (isset($_POST['auth'])) {
$telegram_id = filter_var(trim($_POST['telegram_id']), FILTER_SANITIZE_STRING);
$password = filter_var(trim($_POST['password']), FILTER_SANITIZE_STRING);
//проверка длины
if(strlen($telegram_id) < 5 || strlen($telegram_id) > 15 ) {
$id_error = "Недопустимая длина ID";
}
if(strlen($password) < 5 || strlen($password) > 20 ) {
$pass_error = "Недопустимая длина пароля";
}
$query = "SELECT * FROM `workers` WHERE telegram_id='$telegram_id'";
$result = $mysql->query($query);
$result = $result->fetch_assoc();
if ($telegram_id == $result["telegram_id"] and $password == $result["password"]) {
echo "пароль верный";
}
else {
echo "пароль неверный";
}
}
?>
-
Вопрос заданболее двух лет назад
-
7260 просмотров
Пригласить эксперта
fetch_assoc
вместо массива возвращает null
, если запрос вернул пустой результат. У вас переменная $result
равна null. Об этом прямо написано в ошибке.
if (
is_array($result)
&& $telegram_id === $result["telegram_id"]
&& $password === $result["password"]
) {
echo "пароль верный";
}
Кстати, советую эту статью почитать: https://habr.com/ru/post/148701/. К слову, рано или поздно вы с автором этой статьи тут столкнётесь (если он не забанен сейчас), потому что он мимо такого кода не проходит, и у него большая практика тыкания лицом в какашки.
-
Показать ещё
Загружается…
12 февр. 2023, в 02:07
2000 руб./за проект
12 февр. 2023, в 00:06
1000 руб./в час
11 февр. 2023, в 22:57
25000 руб./за проект
Минуточку внимания
Today We are Going To Solve Message: Trying to access array offset on value of type null in Php. Here we will Discuss All Possible Solutions and How this error Occurs So let’s get started with this Article.
- How to Fix Message: Trying to access array offset on value of type null Error?
To Fix Message: Trying to access array offset on value of type null Error just Use isset(). This error occurs only when your index
'char_data'
does not exist.
So first of all you have to check if the index exists or not. So for to check this you can use isset(). So just run the below command to check it :isset($cOTLdata['char_data'])
So you can try this into your final code. And your error will be removed. - Message: Trying to access array offset on value of type null
To Fix Message: Trying to access array offset on value of type null Error just check
$guest
value. To solve this error just try this:
Just check$guest
value by given command:foreach((array)$result as $guests) { if (!is_array($guests)) { continue; }
Solution 1 : Use isset()
This error occurs only when your index 'char_data'
does not exist.
So first of all you have to check if the index exists or not. So for to check this you can use isset(). So just run the below command to check it :
isset($cOTLdata['char_data'])
So you can try this into your final code. And your error will be removed.
Solution 2 : check $guest
value
To solve this error just try this:
Just check $guest
value by given command:
foreach((array)$result as $guests)
{
if (!is_array($guests)) {
continue;
}
Conclusion
So these were all possible solutions to this error. I hope your error has been solved by this article. In the comments, tell us which solution worked? If you liked our article, please share it on your social media and comment on your suggestions. Thank you.
Also Read This Solutions
- Plugin “react” was conflicted between “package.json » eslint-config-react-app »
- Solving environment: failed with initial frozen solve. Retrying with flexible solve
- How to downgrade python version from 3.10 to 3.9
- “Uncaught SyntaxError: Cannot use import statement outside a module” when importing ECMAScript 6
- vTools failed to load SourceMap: Could not load content for chrome-extension
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Closed
condor2 opened this issue
Dec 22, 2019
· 9 comments
Comments
What version of OpenCart are you reporting this for?
Master Branch
Describe the bug
This warning message is displayed on Error log using Php 7.4
PHP Notice: Trying to access array offset on value of type null in admin/controller/marketplace/extension.php on line 48
Same in vendor/leafo/scssphp/src/Compiler.php on line 5230
Server / Test environment (please complete the following information):
- PHP 7.4
Not sure if there are other issues in PHP 7.4 yet but I managed to fix this error (which for me was occurring in storage/vendor/scss.inc.php) by changing this line:
$key = $key[1];
To this:
$key = isset($key[1]) ? $key[1] : null;
klebinhopk reacted with hooray emoji
luismaf, prosenjeet123, AWC-Software, annaluk23, jorangedres, and klebinhopk reacted with heart emoji
Copy link
Contributor
Author
No missing column_left icons for you?
Because somehow in 7.4 space has no effect.
#7778
Yes actually I realised the icons in the admin menu disappeared, and then ran into that problem with spacing which was causing css class names to merge together in some of the twig templates.
Ended up here twigphp/Twig#3248 and then decided attempting to cradle Opencart into PHP 7.4 wasn’t a good idea when they obviously just don’t support it yet (or at least not in the version I’m using — v3.0.2.0).
Copy link
Contributor
Author
From system/library/template/Twig/Lexer.php
Change this (line 164)
$text = rtrim($text);
Replace with:
@condor2 your if and elseif conditions evaluate the same?
Copy link
Contributor
Author
I have found the same issue and I just done what @elanclarkson done as well and fixed the issue,
I don’t if this fix was sugest to the verndor as well.
$Key = $Key[1] ?? null;
Copy link
Contributor
Author
@condor2 your if and elseif conditions evaluate the same?
I think the best solution is this: (and not from screenshot)
if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
$text = rtrim($text);
}
instead of this:
if (isset($this->positions[2][$this->position][0])) {
$text = rtrim($text);
}
Work just fine
Миграция с PHP5 на PHP7 и PHP8: что чаще всего приходится править в исходниках
Если не считать необходимого теперь перехода с MySQL на MySQLi и борьбы с Warning: A non-numeric value encountered, есть ещё несколько типовых проблем при миграции скриптов с PHP 5.X (особенно если исходная версия ниже 5.3) на PHP 7.3 — 7.4, а позднее и на PHP 8. Попробую приспособить для описания решений эту заметку, если ещё всплывёт подобное.
Для проверки фрагментов кода предполагалось, что в его начале указана директива
error_reporting (E_ALL);
Уведомление Trying to access array offset on value of type null/bool/int
Часто возникает при использовании синтаксиса обращения к элементу массива на других типах данных. Пример:
$a = false; var_dump($a['somekey']); // PHP 7.3: // NULL // // PHP 7.4: // Notice: Trying to access array offset on value of type bool in Command line code on line ...
Так бывает, например, если функция может возвращать массив в нормальном случае и false/null в случае ошибки, а дальше вверх по стеку информация о false/null теряется и этот случай не обрабатывается отдельно.
Решение — проверять с помощью is_array, является ли объект массивом.
Применение функции mysql_real_escape_string
…которой традиционно «обезопасивали» хранимые в базе данных строки от SQL-инъекций.
было: mysql_real_escape_string($s)
надо: mysqli_real_escape_string ($id,$s)
, где $id
— идентификатор соединения MySQLi. Или хотя бы addslashes($s)
— если нужно только экранировать «опасные» для SQL-запроса кавычки.
Перебор массива с помощью list и each
было: while (list(,$var) = each($params)) {
надо: foreach ($params as $var) {
или же: while (list($num,$var) = each($params)) {
а теперь: foreach ($params as $num=>$var) {
— если массив перебирается как ассоциативный и/или нужны ключи его элементов.
Модификатор /e функции preg_replace
было:
$text = preg_replace('~([0-9]+)^([0-9]+)~e', 'pow("\1", "\2")', $text); //вычислить a^b
надо:
$text = preg_replace_callback('~([0-9]+)^([0-9]+)~',
function ($m) { return pow($m[1], $m[2]); }, $text); //вычислить a^b
— то есть, через callback-функцию.
Проблема с подключаемыми графическими шрифтами GD
было:
$bbox=imagettfbbox ($f,0,'arial.ttf','String');
надо:
$font = dirname(__FILE__) . '/arial.ttf';
$bbox=imagettfbbox ($f,0,$font,'String');
— если фонт лежит в папке скрипта, как обычно и бывает.
То же самое с imageTtfText
, например:
$font = dirname(__FILE__) . '/Roboto-Bold.ttf'; imageTtfText($myimg, $size, $angle, $j, 30, $c, $font, $z);
error_reporting(0) и подобное
Многие разработчики привыкли решать проблему с предупреждениями и даже сообщениями об ошибках просто выключая сообщения о них. При миграции скриптов это приводит к «загадочным белым экранам» вместо содержимого. Лучше всего вообще не трогать включённое в новых версиях протоколирование ошибок по умолчанию, а все вызовы функции error_reporting
приводить к виду, указанному в начале статьи.
Строковые функции
Начиная с версии PHP 5.6 кодировкой по умолчанию стала кодировка Юникода UTF-8, соответственно, вместо прежних «си-подобных» строковых функций теперь лучше использовать их многобайтовые аналоги.
Наиболее часто приходится менять:
- вместо
strlen($s)
писатьmb_strlen($s,'UTF-8')
; - вместо
strpos ($haystack,$needle,0)
писатьmb_strpos ($haystack,$needle,0,'UTF-8')
; - вместо
strstr ($haystack,$needle,false)
писатьmb_strstr ($haystack,$needle,false,'UTF-8')
; - вместо
substr ($string,$start,$length)
писатьmb_substr ($string,$start,$length,'UTF-8')
…и т.д., принцип, думаю, понятен. Будьте внимательны, проверяя, есть ли для функции многобайтовый аналог.
Для «бинарно безопасных» функций strcmp
/ strcasecmp
, к примеру, таковых нет, а сравнение всё равно не работает:
<?php $s1="Привет"; $s2="привет"; echo strcasecmp($s1,$s2); //-32 ?>
и нужно делать так:
<?php function mb_strcasecmp($str1, $str2, $encoding = null) { if (null === $encoding) { $encoding = mb_internal_encoding(); } return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding)); } $s1="Привет"; $s2="привет"; echo mb_strcasecmp($s1,$s2,'UTF-8'); //0 ?>
С другой стороны, как видно из примера, для strtoupper
и strtolower
эти аналоги есть.
Применение array_key_exists к объекту, а не к массиву
Теперь нельзя применять array_key_exists
к объектам классов (а можно только к массивам). Неправильно:
class foo { public $a, $b; }; $bar = new foo(); echo (array_key_exists('a',$bar) ? 'yes' : 'no'); //deprecated
Правильно:
echo (property_exists($bar,'a') ? 'yes' : 'no'); //yes
Итак, 8-я версия, вышедшая в ноябре-2020, теперь есть и в составе XAMPP, ниже, вероятнее всего, будут добавляться исправления для PHP8, хотя и для версии 7 всё написанное выше остаётся в силе.
Отмечу, что в сборке PHP 8.0.0 с сайта XAMPP в файле
php.ini
(диск:xamppphpphp.ini
) была по умолчанию отключена библиотека gd:;extension=gdСоответственно, все функции imagecreatetruecolor,
imagecreatefromgif,
imagecreatefromjpeg,
imagecreatefrompng и т.д. «вдруг перестали работать».Решение — убрать точку с запятой из первой позиции указанной выше строки,
сохранить изменённыйphp.ini
, перезагрузиться.
Функция get_magic_quotes_gpc удалена (PHP8)
Любые упоминания о функции get_magic_quotes_gpc теперь придётся исключить из кода, она просто удалена. При этом нужно учесть, что начиная с версии 5.4 она всё равно всегда возвращала 0.
Почему нельзя было оставить в реализации пустое имя функции, а надо заставлять людей переделывать кучу кода — совершенно неясно.
И так у них всё
Функция each удалена (PHP8)
Удалена в PHP8 и функция each. В общем случае можно попытаться заменить на next
или array_shift, но однозначного рецепта нет из-за возможности использования функции не только в цикле, как показано выше, но и, например, в рекурсивных построениях.
Фигурные скобки и литералы без кавычек для индексов массива (PHP8)
В PHP8 больше нельзя писать $a{$i}
вместо $a[$i]
или $foo[bar]
вместо $foo['bar']
. Просто исправьте это.
Разумеется, если ключ является числовой константой или берётся из переменной, заключать его в апострофы не нужно, $i = 1; $a[$i]
или $a[1]
— это верный синтаксис.
13.02.2020, 17:35 [15114 просмотров]
К этой статье пока нет комментариев, Ваш будет первым