Unexpected ‘?’
Если вы пытаетесь использовать тег <?php
внутри другого такого же тега <?php
*
$var = 'hello '<?php echo 'world'; ?>;
* Для PHP версий 4.3.1, 4.3.5 — 4.3.11, 4.4.0 — 4.4.1, 5.0.0 — 5.0.5, 4.4.2 — 4.4.9, 5.1.0 — 5.1.6, 5.2.0 — 5.2.17, 5.3.0 — 5.3.29, 5.4.0 — 5.4.45, 5.5.0 — 5.5.38, 5.6.0 — 5.6.40, 7.0.0 — 7.0.33, 7.1.0 — 7.1.33, 7.2.0 — 7.2.34, 7.3.0 — 7.3.31, 7.4.0 — 7.4.24
Если используется оператор null coalescing operator ??
в версиях PHP ниже, чем PHP 7
<?= $a ?? 2; // Работает в PHP 7+
<?= (!empty($a)) ? $a : 2; // Работает во всех версиях PHP
Unexpected ‘?’, expecting variable
Аналогичная ошибка может возникнуть для типов, допускающих значение NULL, например:
function add(?int $sum): ?int {
Что снова указывает на то, что используется устаревшая версия PHP (то же касается CLI). Проверьте версию PHP через phpinfo();
. Необходимо будет либо повысить версию, либо переписать код под старые версии, без использования нового синтаксиса
Unexpected ‘continue’ (T_CONTINUE)
Оператор continue
используется только внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации. continue
не возвращает значения
Таким образом continue
нельзя использовать в тернарном операторе или любом операторе, требующем возвращаемого значения (return).
Unexpected ‘break’ (T_BREAK)
То же самое касаестся break;
. Нельзя использовать в выражениях (те, что могут вернуть значение). Используется внутри for, foreach, while, do-while или switch.
Unexpected ‘return’ (T_RETURN)
Если на предыдущих строках произошла синтакцическая ошибка, то при приходе к слову return
будет подобная ошибка. Например:
is ($value == null) { // Ожидалось что будет if
return $this->unban();
}
или
mysql_query("INSERT INTO 'users' VALUES ('', '$email', '$name', '".md5 ($password)."')"
^^^ нет знаков );
return mysql_insert_id();
При данной ошибке ищите синтаксическую ошибку раньше указанного места в тексте ошибки, а не прямо на этой же строчке.
Unexpected ‘=’
Может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве. Это можно отобразить регулярным выражением: ^[a-zA-Z_x80-xff][a-zA-Z0-9_x80-xff]*$
Замечание: Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 (0x80-0xff).
Unexpected T_PAAMAYIM_NEKUDOTAYIM
T_PAAMAYIM_NEKUDOTAYIM — это наименование для двойного двоеточия ::
на иврите ¯_(ツ)_/¯
Происходит использование двойного двоеточия, вместо стрелочки объекта (статический вызов, вместо вызова метода в нестатическом контексте).
Например в коде указано $cnf::getConfig($key);
, а должно быть $cnf->getConfig($key);
Это было возможно в ранних версиях. Возможно ошибка появилась после переноса куда-либо (например нахостинг). Поэтому проверьте версию PHP и либо установится такую же версию, на которой было разработано приложение, либо измените вызов свойства/метода на вызов их не в статическом виде
Unexpected T_OBJECT_OPERATOR
-
В очень старых версиях PHP (4) нельзя делать «method chaining», т.е. консрукция ниже не сработает
$item->get_enclosure()->get_link()
-
В версиях ниже *PHP 5.4* нельзя вызвать метод у только что созданного объекта
$purchaseOrder = (new PurchaseOrderFactory)->instance();
можно вначале создать объект, а только потом вызвать у него метод:
$purchaseFactory = new PurchaseOrderFactory; $purchaseOrder = $purchaseFactory->instance();
Также нужно обратить внимание на круглые скобки, писать
new PurchaseOrderFactory->instance();
нельзя, это невалидно! -
Пропущен знак доллара у переменной.
Например написано
mysqli->query
, а должно быть$mysqli->query
или написаноthis->transform($lessons)
а должно быть$this->transform($lessons)
Unexpected T_DOUBLE_ARROW
Причины:
-
Использование `=>` при описании массива, но при этом ключевое слово объявления массива было забыто:
$statement->execute( ':login'=>$_POST['email'] );
должно быть
$statement->execute(array(':login' => $_POST['email']));
-
Пропущена запятая перед объявлением массива
Route::post('/updateaccount'[ ⇑ 'uses' => 'UserController@postSaveAccount', 'as' => 'account.save' ]);
должно быть
Route::post('/updateaccount', [ ⇑ 'uses' => 'UserController@postSaveAccount', 'as' => 'account.save' ]);
-
Пропущена какой-то закрывающий элемент в пересислении массива
$saveData = array( 'mid' => $this->_saveAsUserId, 'post_name' => slug($thisShow['title'], ⇑ Пропущена закрывающая скобка функции slug 'post_content' => $thisShow['content'], );
Unexpected T_BOOLEAN_OR
Unexpected T_BOOLEAN_AND
Возникают, как правило, вследствие несовпадения открывающих и закрывающих круглых скобок. Пример
if(is_file($filechk1) && (is_file($filechk2))) || (is_file($dirchk1) && (is_file($dirchk2))){
⇑
...
}
или
if ($args == !empty && $command != 'reload'){
^^^^^^ Невалидно. должно быть `!empty($args)`
}
или
if(isset($_GET['test'] && strcmp($_GET['test'],'test') == 0)
⇑
Решение: проверьте весь код на соответствие скобок друг другу! Если нужно, то выносите сложные конструкции в отдельные переменные, чтобы не путаться и работайте с ними. Пример
if (IS_REGISTRATOR() && (($params.status === 'W' || $params.status === 'D' || $params.status === 'A') && $params.remark && (($params.subres_level == 0 && ($user_info->selected_title->tid == $params.boss || $user_info->selected_title->tid == $doc_signer_tid || !$params.usertid) || $params.subres_level > 0 && $user_info->selected_title->tid == $params.usertid))) { ... }
этот код будет читаться легче в таком виде:
$docIsInWorkAcceptOrDraft = ...;
$bossHasSignerPriviledge = ...;
$userCanSign = ...;
if ($docIsInWorkAcceptOrDraft && $bossHasSignerPriviledge && $userCanSign) {
// ...
}
Почему возникает ошибка
Ошибка undefined index появляется при попытке обращения к не существующему элементу массива:
<?php
$arr = [];
echo $arr['title'];
Если в настройках PHP включено отображение ошибок уровня E_NOTICE, то при запуске этого кода в браузер выведется ошибка:
Notice: Undefined index: title in D:ProgramsOpenServerdomainstest.localindex.php on line 3
Как исправить ошибку
Если элемента в массиве нет, значит нужно ещё раз проверить логику программы и понять, почему в массиве нет тех данных, что вы ожидаете. Проверить, что по факту лежит в переменной можно с помощью функции var_dump():
$arr = [];
var_dump($arr);
При работе с массивами $_GET и $_POST нет гарантии, что клиент (браузер) отправил абсолютно все нужные нам данные. В этом случае можно добавить проверку на их существование:
<?php
if(!isset($_GET['body'], $_GET['title']))
die('Пришли не все данные');
// Далее что-то делаем с данными
Если ключ массива существует не всегда, можно указать для него значение по-умолчанию:
<?php
if(isset($_GET['id']))
$id = $_GET['id'];
else
$id = 0;
Сокращённый синтаксис:
// С тернарным оператором
$id = isset($_GET['id']) ? $_GET['id'] : 0;
// С оператором объединения с null (PHP 7+)
$id = $_GET['id'] ?? 0;
Или если нужно сохранить значение по-умолчанию в сам массив:
<?php
if(!isset($arr['title']))
$arr['title'] = '';
// Или короче (PHP 7+)
$arr['title'] = $arr['title'] ?? '';
// Или ещё короче (PHP 7.4+)
$arr['title'] ??= '';
Пишите в комментариях, если столкнулись с этой ошибкой и не можете найти решение.
Исправляем сообщение об ошибке – Notice: Undefined index.
Причина ошибки в том, что PHP не находит содержимое переменной. Для исправления такого нотиса, надо убрать эту переменную из вида.
Например, ошибка сообщает:
( ! ) Notice: Undefined index: variable in /var/www/html/wp-content/themes/….php on line 380
Открываем соответствующий файл и смотрим на место, которое не нравится интерпретатору:
if (!$data[‘variable’]) {
}
Видим что ругается на массив data, в котором находится ключ variable. А т.к. в данном случае, на этой странице, в массиве data ключ variable не содержится, то php ругается на его отсутствие.
Мы меняем этот код на другой:
if (!empty($data[‘variable’])) {
}
И ошибка исправлена. На этот раз PHP интерпретатор не ищет специальный ключ, а смотрит существует ли он или нет.
вот код :
<?php
session_start();
if ($_SESSION['users']) {
header('Location: profile.php');
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Авторизация и регистрация</title>
<link rel="stylesheet" href="assets/css/main.css">
</head>
<body>
<!-- Форма авторизации -->
<form>
<label>Логин</label>
<input type="text" name="login" placeholder="Введите свой логин">
<label>Пароль</label>
<input type="password" name="password" placeholder="Введите пароль">
<button type="submit" class="login-btn">Войти</button>
<p>
У вас нет аккаунта? - <a href="/register.php">зарегистрируйтесь</a>!
</p>
<p class="msg none">Lorem ipsum dolor sit amet.</p>
</form>
<script src="assets/js/jquery-3.4.1.min.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
-
Вопрос задан19 янв.
-
69 просмотров
Условие оберни в isset:
if (isset($_SESSION['users'])) {
Пригласить эксперта
-
Показать ещё
Загружается…
12 июн. 2023, в 12:01
40000 руб./за проект
12 июн. 2023, в 11:51
500 руб./за проект
12 июн. 2023, в 11:16
5000 руб./за проект
Минуточку внимания
Подобные ошибки при запуске phpmyadmin в OpenServer можно наблюдать:
Parse error: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING or '(' in C:OpenServermodulessystemhtmlopenserverphpmyadminindex.php on line 8
или вот такой список
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Overloading of string functions using mbstring.func_overload is not supported by phpseclib.' in С:modulessystemhtmlopenserverphpmyadminvendorphpseclibphpseclibphpseclibbootstrap.php:11 Stack trace: #0 С:modulessystemhtmlopenserverphpmyadminvendorcomposerautoload_real.php(66): require() #1 С:modulessystemhtmlopenserverphpmyadminvendorcomposerautoload_real.php(56): 'С:modulessyst...') #2 С:modulessystemhtmlopenserverphpmyadminvendorautoload.php(7): ComposerAutoloaderInit::getLoader() #3 С:modulessystemhtmlopenserverphpmyadminlibrariescommon.inc.php(85): require_once('С:modulessyst...') #4 С:modulessystemhtmlopenserverphpmyadminindex.php(20): require_once('С:modulessyst...') #5 {main} thrown in С:modulessystemhtmlopenserverphpmyadminvendorphpseclibphpseclibphpseclibbootstrap.php on line 11
Подобное возникает при неверной версии PHP. phpmyadmin поддерживает версию php только выше 5.5. Чтобы исправить, перейдите в настройки
И выберите версию 5.5 или выше. В Разделе http сервера выберите из списка подходящую версию Apache или Nginx. После сохранения, если http сервер и php модуль соответствую, OpenServer перезагрузится. Готово.