Syntax error unexpected expecting name

PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их Часто программисты допускают ошибки. Могут возникать ошибки синтаксиса. Например: Неожиданный символ не всегда является настоящим виновником. Но номер строки дает приблизительное представление о том, с чего начать поиск. Всегда смотрите на контекст кода. Синтаксическая ошибка часто кроется в упомянутых или в предыдущих строках кода. […]

Содержание

  1. PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их
  2. 8 ответов 8
  3. Unexpected T_STRING
  4. Unexpected identifier «xxx»
  5. Строки с неверными кавычками
  6. Незакрытые строки
  7. Кавычки, не связанные с программированием
  8. Отсутствует точка с запятой
  9. Невидимые символы Unicode
  10. Заэкранированная кавычка
  11. Unexpected T_VARIABLE
  12. Unexpected ‘$varname’ (T_VARIABLE)
  13. Отсутствует точка с запятой
  14. Неверная конкатенация строк
  15. Пропущен оператор выражения
  16. В перечислениях в массивах или функциях
  17. В объявлении свойств классов
  18. Переменные сразу после идентификаторов
  19. Отсутствие скобок до/после языковых конструкций if, for, foreach
  20. Else не ожидает условий
  21. Необходимы скобки для замыканий (closure)
  22. Невидимые пробелы
  23. Общее о синтаксических ошибках
  24. ### Заметка:
  25. ### Как интерпретировать ошибки парсера
  26. Unexpected (
  27. Выражения в параметрах объявленной функции
  28. Выражения в свойствах класса
  29. isset(()), empty, key, next, current
  30. Unexpected )
  31. Висячая запятая при вызове функции/метода
  32. Незавершённые выражения
  33. Foreach as constant
  34. Unexpected <
  35. Unmatched subexpressions in an if (Несовпадающие подвыражения) в if
  36. < and >в выражениях
  37. Unexpected >
  38. Последнее выражение в блоке и потеря точки с запятой
  39. Недопустимая вложенность блоков/Forgotten < (забытая < )
  40. Unexpected < , expecting (
  41. Список параметров функции/метода
  42. Условные конструкции
  43. Unexpected T_CONSTANT_ENCAPSED_STRING
  44. Unexpected T_ENCAPSED_AND_WHITESPACE
  45. Неправильная интерполяция переменных
  46. Отсутствует конкатенация
  47. Отсутствует начальная кавычка
  48. Пропущена запятая в массиве
  49. Пропущена запятая в аргументах функции/метода
  50. Строка закрыта слишком поздно
  51. Отступ в HEREDOC
  52. Unexpected $end
  53. Unexpected end of file
  54. Отступ в HEREDOC
  55. Заэкранированная кавычка
  56. Альтернативный синтаксис
  57. Unexpected T_FUNCTION

PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их

Часто программисты допускают ошибки. Могут возникать ошибки синтаксиса. Например:

Неожиданный символ не всегда является настоящим виновником. Но номер строки дает приблизительное представление о том, с чего начать поиск.

Всегда смотрите на контекст кода. Синтаксическая ошибка часто кроется в упомянутых или в предыдущих строках кода. Сравните свой код с примерами синтаксиса из руководства.

Дополнительные ссылки для поиска ошибок:

В ответах ниже обобщены распространенные ошибки, найдите ошибку в списке ниже и перейдите к ответу с её описанием.

Unexpected $end / Unexpected end of file

Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN)

В работе.

Unexpected character in input: ‘ ‘ (ASCII=92) state=1

Unexpected ‘public’ (T_PUBLIC)
Unexpected ‘private’ (T_PRIVATE)
Unexpected ‘protected’ (T_PROTECTED)
Unexpected ‘final’ (T_FINAL)

Unexpected ‘use’ (T_USE)

Unexpected ,
Unpexected .
Unexpected ;
Unexpected *
Unexpected :
Unexpected ‘:’, expecting ‘,’ or ‘)’
Unexpected &
Unexpected .

8 ответов 8

Unexpected T_STRING

Unexpected identifier «xxx»

Означает, что был обнаружен необработанный идентификатор. Это может быть разное: от «голых слов» до оставшихся констант или имен функций, забытых строк без кавычек или любого простого текста. Примерные проблемы:

Строки с неверными кавычками

Любая неэкранированная и случайная кавычка » или ‘ образует недопустимое выражение.

В данном примере используются двойные кавычки в двойных. Это неверно. Интерпретатор «увидит» строку » и строку «>click here» (т.к. строки заключаются в кавычки), а что такое http://example.com он не поймёт. Важно не забывать использовать обратный слэш для экранирования » двойных кавычек или ’ одинарных кавычек — в зависимости от того, что использовалось снаружи для всей строки (для ознакомления со строками). Например если снаружи двойные кавычки, то внутри проще использовать одинарные, чтобы не запутаться, либо экранировать двойную. С одинарными аналогично. Ещё проще большой текст помещать в HEREDOC или NOWDOC

Незакрытые строки

Если вы пропустите закрывающую кавычку, то синтаксическая ошибка обычно возникает позже.

Кавычки, не связанные с программированием

Обычно возникают, когда копируют текст из книги. Они могут выглядеть так:

Отсутствует точка с запятой

Невидимые символы Unicode

Если вы получили жалобу парсера T_STRING на совершенно не вызывающий подозрений код, например:

Нужно взять другой текстовый редактор. Или даже hexeditor. То, что здесь выглядит как простые пробелы и символы новой строки, может содержать невидимые константы. Такое бывает в документах с кодировкой UTF-8 BOM и нужно сделать кодировку UTF-8 без BOM

Заэкранированная кавычка

Символ имеет особое значение. Часто символ применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строка echo «Jim said »Hello»»; выведет Jim said «hello» . Если применить последовательность » , то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибку

правильно будет экранировать обратные слэши тоже:

Unexpected T_VARIABLE

Unexpected ‘$varname’ (T_VARIABLE)

Означает, что есть конкретная переменная с указаннымв ошибке именем, которая не вписывается в текущую структуру выражения/инструкции.

Отсутствует точка с запятой

Как правило пропущена точка с запятой, а на следующей строке идёт переменная:

Неверная конкатенация строк

Пропущен оператор выражения

В перечислениях в массивах или функциях

В объявлении свойств классов

В свойства можно назначать только статические значения (которые однозначно определены), но не выражения.

Если необходимо присвоивать переменной выражение, то это нужно делать либо в конструкторе, либо в другом каком-либо инициализирующем методе

Переменные сразу после идентификаторов

Отсутствие скобок до/после языковых конструкций if, for, foreach

Else не ожидает условий

тут надо либо фигурные скобки, либо применять elseif (если не нарушает логики)

Необходимы скобки для замыканий (closure)

Переменные, которые передаются в замыкания всегда надо оборачивать в круглые скобки

Невидимые пробелы

Как отмечалось ранее. Могут быть невидимые символы. Проверьте на их наличие (читайте выше ошибки Unexpected T_STRING)

Общее о синтаксических ошибках

### Заметка:

Если ваш браузер отображает сообщения об ошибках, такие как «SyntaxError: illegal character», то это на самом деле связано не с PHP, а с Javascript и синтаксическими ошибками в нём

Синтаксические ошибки, возникающие в коде vendor: если синтаксическая ошибка возникла после установки или обновления пакета vendor’а — это может быть связано с несовместимостью версии PHP, поэтому проверьте версию vendor’а. и требования к настройке вашей платформы.

Используйте IDE, например PHPStorm, который всегда подскажет, что с кодом что-то не так. Обращайте внимание на подсказки:

Иногда возникают ошибки из-за лишних символов в начале файла, в частности BOM. Убедитесь, что файл сохранён в UTF-8 без BOM. (если нужен именно utf8)

Если ваш веб-сайт просто пустой с белым экраном, то, как правило, причиной является синтаксическая ошибка. Включите их отображение с помощью этой инструкции

### Как интерпретировать ошибки парсера

Типичное сообщение об ошибке синтаксиса:

Parse error: syntax error, unexpected T_STRING, expecting ‘ ; ‘ in file.php on line 217

(Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_STRING, ожидалось ‘ ; ‘ в файле file.php в строке 217)

Тут указано возможное место синтаксической ошибки. См. упомянутые имя файла и номер строки.

Токен, такой как T_STRING , объясняет, какой символ синтаксический анализатор/токенизатор не смог окончательно обработать. Однако это не обязательно является причиной синтаксической ошибки. Поэтому важно изучить предыдущие строки кода. Часто синтаксические ошибки — это ошибки, произошедшие ранее. Номер строки ошибки — это именно то место, где синтаксический анализатор окончательно отказался от обработки всего этого, а не точная линия ошибки

Unexpected (

Открывающие круглые скобки обычно следуют за языковыми конструкциями, такими как if / foreach / for / array / list , или начинают арифметическое выражение. Они синтаксически неверны после «strings» , предыдущих скобок () , одинокого $ и в некоторых типичных контекстах объявлений. Типичные ошибки:

Выражения в параметрах объявленной функции

Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. То есть выражение time() + 90000 нельзя использовать в качестве дефолтного значения параметра функциию. Тем не менее при вызове функции можно свободно использовать выражение:

Выражения в свойствах класса

Как и ошибка выше, нельзя применять выражения для свойств класса, т.е.

Если необходимо что-то вычислить, то данные вычисления/выражения стОит помеестить в конструктор класса.

Единственное, PHP 7 позволяет написать public $property = 1 + 2 + 3; . Но это посзволительно, т.к., по сути, это выражение с константными значениями, не вычисляемое «на лету».

isset(()), empty, key, next, current

И isset() и empty() являются встроенными языковыми конструкциями языка, а не функциями, им необходим прямой доступ к переменной. Если вы непреднамеренно добавите слишком много скобок, то вы создадите доп. выражение:

Для PHP Parse error: syntax error, unexpected ‘(‘

Для PHP Fatal error: Cannot use isset() on the result of an expression

Начиная с версии 7.0 — ошибки не будет

Unexpected )

Висячая запятая при вызове функции/метода

В новых версиях языка позволены висячие запятые при нициализации массивов или списков (а также в объявлении функций/методов), но не при вызове функций/методов

Незавершённые выражения

Например если забыли в арифметическом выражении, то синтаксический анализатор сдается. Потому что он не знает как интерпретировать это:

Но если забыли закрывающую скобку вдобавок, то получите жалобу о неожиданной точке с запятой.

Foreach as constant

Если забыть добавить доллар к переменной:

PHP здесь иногда говорит, что вместо этого ожидался -> или ?-> . Поскольку class->variable мог бы удовлетворить ожидаемому выражению.

Unexpected <

Фигурные скобки < и >окружают блоки кода. И синтаксические ошибки о них обычно указывают на какую-то неправильную вложенность.

Unmatched subexpressions in an if (Несовпадающие подвыражения) в if

Чаще всего несбалансированные ( и ) являются причиной, если парсер жалуется на открывающуюся фигурную скобку < , которая появляется слишком рано. Простой пример:

Необходимо посчитать все открывающие и закрывающие скобки и сопоставить их количество. Также используйте IDE, которая помогает в этом и не пишите код без пробелов. Удобочитаемость имеет значение.

< and >в выражениях

Нельзя оборачивать выражения в скобки.

Придётся выражение вынести в переменную и подставлять уже её:

Unexpected >

Когда получаете ошибку «unexpected > «, чаще всего означает, что закрывали блок кода слишком рано.

Последнее выражение в блоке и потеря точки с запятой

Недопустимая вложенность блоков/Forgotten < (забытая < )

Блок кода был > закрыт слишком рано, или забыли открытую скобку < :

В приведенном выше фрагменте if не было открывающей фигурной скобки < . Таким образом, закрывающая >ниже стала излишней. И поэтому следующая закрывающая > , предназначенная для функции, не была связана с исходной открывающей фигурной скобкой < .

Unexpected < , expecting (

Языковые конструкции, требующие условия/объявления и блока кода, вызовут эту ошибку.

Список параметров функции/метода

Условные конструкции

То же самое для частых используемых конструкций: for / foreach , while / do , etc.

Как минимум всегда смотрите документацию, чтобы сравнить, правильно ли вы пишите ne или иную конструкцию/функцию/метод/класс и т.д.

Unexpected T_CONSTANT_ENCAPSED_STRING

Unexpected T_ENCAPSED_AND_WHITESPACE

Предупреждения T_ENCAPSED… появляются в контексте строки с двойными кавычками, в то время как строки T_CONSTANT… часто возникают в простых выражениях или операторах PHP.

Неправильная интерполяция переменных

Ключи массива должны быть в кавычках. Но в строках с двойными кавычками (или HEREDOC) это не так. Парсер жалуется на содержащуюся в одинарных кавычках строку.

Можно использовать PHP2-style для написания ключей мамссивов внутри строки

Но лучше изучить фигурный синтаксис и использовать его. Он позволяет писать ключи массива как обычно:

Отсутствует конкатенация

Отсутствует начальная кавычка

Пропущена запятая в массиве

Пропущена запятая в аргументах функции/метода

Строка закрыта слишком поздно

Отступ в HEREDOC

До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже вызовет ошибку

Unexpected $end

Unexpected end of file

Ошибка означает, что код закончился, в то время как парсер ожидает больше кода. (Сообщение немного вводит в заблуждение, если понимать его буквально. Речь идет не о переменной с именем «$end», как иногда предполагают новички. Оно относится к «концу файла»). Причина: несовпадение количества открывающих и закрывающих фигурных скобок.

Почти всегда речь идет об отсутствующей закрывающей фигурной скобке > для закрытия предшествующих блоков кода. Это говорит о том, что синтаксический анализатор ожидает найти закрывающую скобку > , но на самом деле достиг конца файла.

  • Используйте правильные отступы, чтобы избежать таких проблем. И вообще, в принципе, используйте отступы и форматирование!
  • Используйте IDE с сопоставлением скобок, чтобы выяснить, где > была утеряна. Большинство IDE выделяют совпадающие фигурные скобки, квадратные скобки и круглые скобки. Что позволяет довольно легко проверить соответствие:

Отступ в HEREDOC

До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже может вызывать ошибку

Заэкранированная кавычка

Символ имеет особое значение. Часто символ применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строка echo «Jim said »Hello»»; выведет Jim said «hello» . Если применить последовательность » , то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибку

правильно будет экранировать обратные слэши тоже:

С другой стороны, PHP обычно преобразует пути в стиле Unix (например, «C:/xampp/htdocs/» ) в правильный путь для Windows.

Альтернативный синтаксис

Несколько реже вы можете увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов/кодов в шаблонах. Используя if: и else: отсутствует endif; , например (т.е. закрывающий тег)

Unexpected T_FUNCTION

Может возникнуть например в версии PHP ниже 5.3.0, когда не было ещё анонимных функций. В некоторые функции, такие как array_map нужно было передать имя функции обработчика, например $range = array_map( «name_of_function_to_call», $myArray ); . Так что минимум надо проверить версию PHP и проверить что именно на вход ожадает текущая функция. И принять решение: повысить версию PHP или переписать под старый стиль: создать отдельно функцию и во вторую передать имя первой.

Источник

За последние 24 часа нас посетили 11584 программиста и 1164 робота. Сейчас ищут 309 программистов …


  1. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    Подскажите как исправить

    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query: «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>

    Parse error: syntax error, unexpected ‘:’, expecting ‘,’ or ‘)’ in W:domainsPhptestcsscreate.php on line 9


  2. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    А откуда такой синтаксис взялся, с query:? То, что новые штормы так автоматом показывают бледным шрифтом, не означает, что это так писать надо.
    — Добавлено —
    Так можно, вроде, будет писать в 8 версии php, но она пока только RC, выйдет через месяц


  3. ADSoft

    перевести трудно? гугл транслейт хотя бы?
    посмотреть описание функции?

    : — замените на ,


  4. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    заменил и и вот опять ошибка «Warning: mysqli_query() expects parameter 1 to be mysqli, null given in W:domainsPhptestcsscreate.php on line 9»


  5. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0


  6. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    Ошибка изменилась, значит проблема другая. Скорее всего, подключения к базе не произошло, судя по тексту. Или переменная не так называется. Всё написано нормальным английским языком.Не понятен вопрос. Напишите в соответствии с синтаксисом php. Если не знаете синтаксис — какого фига лезете программировать?


  7. Dimon2x

    С нами с:
    26 фев 2012
    Сообщения:
    2.176
    Симпатии:
    180

    Начни с линухи и ангийского, без этих знаний будут постоянные проблемы, на решения которых ты будешь тратить целые дни.

    PHP тащит за собой сервер, сервер тащит за собой линукс, линукс тащит за собой английский, php ничего не знает про mysql.

    PHP это язык программирования, программирование это инженерия, инжеру надо знать очень много.


    Taktreba и mkramer нравится это.


  8. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    @Dimon2x Только я бы сказал, php — это программирование, программирование тащит за собой английский


  9. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    я не понимаю почему не произошло подключения
    этот код мне выводит дание из бд
    <? include_once(‘db.php’) ?>
    <? $sql = $db->query(«SELECT * FROM `Users`»); /* запрос сам*/
    $db-> close;
    while ($result = $sql ->fetch_assoc()):?>
    <div class=»login»><h3><?=$result[‘login’] ?></h3> </div>
    <div class=»FIO»> <?=$result[‘FIO’] ?> </div>
    <? endwhile ?>

    а вот:
    не хочет вносить но подключаю к db.php
    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query, «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>


  10. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    А что в db.php? И прочитайте в подписи, как оформлять код

    Это бред сивой кобылы, прочитайте документацию по mysqli.

    И судя по коду, вы в основах путаетесь, что такое переменная, что такое параметры.


  11. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    В db.php:
    <?php
    $db = new mysqli(‘localhost’,’root’,’root’,’Users’);

    ?>


  12. acho

    acho
    Активный пользователь

    И не надо смешивать процедурный и ООП стили.


  13. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    @nevidomo, ну я же говорю, переменные не понимаете. В одном месте она у вас $db называется, а в другом месте должна как-то преобразоваться в $connect сама собой?


  14. Dimon2x

    С нами с:
    26 фев 2012
    Сообщения:
    2.176
    Симпатии:
    180

    ‘Users’ — это строка
    $users — это переменная


  15. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    зделал
    db.php:
    <?php
    $connect = new mysqli(‘localhost’,’root’,’root’,’Users’); /* connect db */

    ?>
    create.php:

    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘Login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query, «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>
    но ошибка: Warning: mysqli_query() expects parameter 3 to be integer, string given in W:domainsPhptestcsscreate.php on line 9


  16. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    Ну уже изменилось. Но документацию по mysqli_query так и не поискал. И код оформляешь как попало. Как правильно — у меня в подписи.

    https://www.php.net/manual/ru/mysqli.query.php — читаем здесь, как правильно. Вообще не понимаю, откуда у тебя слово query в параметрах. Это неосознанное программирование, бич молодых программистов, судя по тем, что к нам на собеседования приходят. Код через сознание не проходит, спрашиваешь: «с какой целью написал именно так, а не иначе» — ответить не могут. Не приучайте себя к такому. Правило очень простое, чтоб программирование было осознанным — читать про каждую функцию, которая вызывается, документацию. Читать, как работает язык на котором пишешь. Читать, читать и ещё раз читать.


  17. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    большое спасибо
    уже понял где проблема


  18. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.562
    Симпатии:
    1.284
    Адрес:
    Лень

    @nevidomo, самое начало, от чего нужно начинать отталкиваться, это

    russkij_jazyk_uchebniki_3_4_kl_1979_80_g_g.jpg

    Пи3дец — даже подсветку текстаАрены нахрен продуплить o_O какое б… программирование ??

    Читаем Parse error — что за херня ? Транслятор нельзя было врубить и перевести ??? «Ошибка синтаксического анализа»

    Что такое СИНТАКСИС ? Снова гуглим — узнаем.. Это тоже 6лядь как русский язык ГРА МА ТИ КА
    С таким же успехом дальше переводим, думаем, покурим и снова думаем, можешь даже поужинать если до такого дошло.
    Line ? строка
    Что — то в строке 9 Синтаксис долбаный сломан в PHP o_O Ведь пхп интерпретатор ругается
    Смотрим и дуплим, что там за 9 строка

    1. mysqli_query($connect, query: «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login‘, ‘$Group‘, ‘$FIO‘)»);

    Идем, смотрим ОФФ документацию — гуглим mysqli_query
    Читаем и просвещаемся. Cмотрим на ПРИМЕРЫ ЗАПОЛНЕНИЯ АТРИБУТОВ, у данной функции.

    Оказывается, какого }{Yя у тебя бичь в виде «query: » скопирована из помойной документации в интернете.

    На будущее, юзай редактор с ПОДСВЕТКОЙ PHP
    — Добавлено —
    Даже тут херня эта подсвечивается

Sometimes we know what works right, but we don’t know what works wrong. Let me make a list of a few errors that one could encounter so that you don’t waste much time figuring it out.

Unncessary Imports

Copy the code below into a file and execute it.

Full file: ErrProg1.go

package main

import "fmt"
import "os" //excessive - we are not using any function in this package

func main() {
 fmt.Println("Hello world")
}

Output:

prog.go:4: imported and not used: os

Go is particularly parsimonious when it comes to code — if you are not going to use something, don’t ask for it. Here, you have indicated that you want to import the os package but you haven’t used it anywhere. That’s not allowed. If you are not using it, remove it. If you remove the import os at line 4, this program will work.

Exact Names — case dependent

Full file: ErrProg2.go

package main

import "fmt"

func main() {
 fmt.println("Hello world")
}

Output:

prog.go:6: cannot refer to unexported name fmt.println
prog.go:6: undefined: fmt.println

Notice how we have written fmt.println and not fmt.Println. Go is case dependent, which means to say that when you use another’s name, use it exactly as it is defined. If the name is John, then only John works — not john, not joHn, and no other combination. So, in this case some of the others that are not allowed:

Invalid code

Package main
iMport "fmt"
import "Fmt"
Func main() {}
Fmt.Println
fmt.println

Separating lines with semicolons

If you are coming from a background in languages like C, C++, Java, Perl, etc. you will notice that Go (at least so far) has not required you to put semi colons at the end of the line. In Go, the new line character automatically indicates the end of the line. However, if you happen to put two statements in the same line, then you need to have a semicolon separating them. Let’s take a look at an example.

Full file: ErrProg3.go

package main

import "fmt"

func main() {
 fmt.Println("Hello world") fmt.Println("Hi again")
}

Output:

prog.go:6: syntax error: unexpected name, expecting semicolon or newline or }

Now you could make this work by putting the two Println statements on two separate lines, like so:

Partial file

func main() {
 fmt.Println("Hello world") 
            fmt.Println("Hi again")
}

But for the purpose of illustrating this example, try out this version.

Full file:

package main

import "fmt"

func main() {
 fmt.Println("Hello world"); fmt.Println("Hi again")
}

Output:

Hello world
Hi again

So, semi colons in Go can be used but are not compulsory on every line. But if you are going to have multiple statements in a line, you need to separate them with semi colons.

So this one is also valid and will get you the same output.
Full file: ErrProg4.go

package main;

import "fmt";

func main() {
 fmt.Println("Hello world"); fmt.Println("Hi again");
};

Output:

Hello world
Hi again

But watch out where you go with all those free semicolons.

Unnecessary semicolons

Let’s simplify that program, but go overboard with our semicolons. Try out this code now.

Full file

package main

import "fmt";;

func main() {
 fmt.Println("Hello world")
}

Output:

prog.go:3: empty top-level declaration

Again, Go is strictly frugal with its code. Here, alongside the import statement, there are two semicolons. Now the first one is acceptable — not necessary here, but acceptable. But two! Nope, that is where Go draws the line. The semicolon indicates the end of a statement, but there is no valid statement prior to the second semicolon. So remove the extra semicolon and all should be fine again.

Syntax and other things

The compiler demands that you follow proper syntax. There are a large possibility of syntax errors and it wouldn’t be a good idea to list them all. But I shall list a few. If you know these ones, most of the rest are just similar.

package 'main' //ERROR - no quotes for the package name: package main
package "main" //ERROR - no quotes for the package: package main

package main.x  //ERROR - packages names in go are just one expression.  So either package main or package x.
package main/x  //ERROR - packages names in go are just one expression.  So either package main or package x.

import 'fmt' //ERROR - needs double quotes "fmt"
import fmt //ERROR - needs double quotes "fmt"

func main { } //ERROR - functions have to be followed by parantheses: func main() {}

func main() [] //ERROR - where curly braces are required, only those are allowed.  They are used to contain blocks of code.  func main() {}

func main() { fmt.Println('hello world') } //ERROR - use double quotes for strings: func main() { fmt.Println("hello world") }

Примерно вот так нужно было показать схему БД. Чтобы понимать как у тебя связаны таблицы между собой.
Изображение

А то, что у тебя во всех таблицах есть user_id это не беда. Беда в простом понимании связей между таблицами.
Легче же соображать, когда у тебя связь между HistoryBalance и (Person / User) прописана вот так.
Модель HistoryBalance и две примерные связи

Код: Выделить всё

public function getUser() {
        return $this->hasOne(User::className(), ['user_id' => 'user_id']);
}
public function getPerson() {
        return $this->hasOne(Person::className(), ['person_id' => 'person_id']);
}

Т.е. у тебя в модели HistoryBalance сохраняется user_id или person_id для связи с пользователем/человеком.

Внутри модели User связь с HistoryBalance

Код: Выделить всё

public function getHistoryBalance() {
        return $this->hasMany(HistoryBalance::className(), ['user_id' => 'user_id']);
}

Внутри модели Person связь с HistoryBalance

Код: Выделить всё

public function getHistoryBalance() {
        return $this->hasMany(HistoryBalance::className(), ['person_id' => 'person_id']);
}

Для того, чтобы можно было выбрать всю историю баланса Person или User.

Тебе бы переделать БД по хорошему. Переделать первичные ключи в соответствии с названием таблицы, т.е. таблица User PK (primary key — первичный ключ) — user_id, таблица Person PK — person_id, таблица HistoryBalance PK — historybalance_id. Переделать связи в моделях.
А то в скором времени у тебя будут не очень приятные запросы в твоих search.

Твоя первоначальная задача решается несколькими путями, первый и самый простой чтобы проверить будет ли у тебя выводить информацию сделали через findHistoryBalanceByUser($id) в модели HistoryBalance.
1. делается find() из HistoryBalance
2. указывается joinWith(‘person’, false, ‘LEFT JOIN’) с таблицей пользователя (ты ведь открыл Person — View, а там в $model->id указан id пользователя из модели Person)
3. указывается условие where([‘person_id’ => $id]), говорит о том, что нужно выбрать все записи с конкретным пользователем.
4. указывается сортировка orderBy
5. устанавливается лимит limit(30)
6. т.к. возврат записей, то прописываем all(), если бы возвращался запрос то ничего не прописывали бы.

Более долгий, но всё равно нужно правильная база данных.
Берем HistoryBalanceSearch в search дописываем дополнительный параметр $id.
Примерно вот так в PersonController

Код: Выделить всё

public function actionView($id)
    {
        $model = $this->findModel($id)// поиск твоей модели
        $searchModel  = new  HistoryBalanceSearch;
	$dataProvider = $searchModel->search(Yii::$app->getRequest()->get(), $id);

        return $this->render('view', [
            'model' => $model,
            'dataProvider' => $dataProvider,
            'searchModel' => $searchModel,
        ]);
    }

Внутри модели HistoryBalanceSearch было бы

Код: Выделить всё

public function search($params, $id = 0)
    {
        $query = HistoryBalance::find();

	if(0 < $id){
	$query
	->joinWith('person', false, 'LEFT JOIN')
	->where(['person_id' => $id])
	->orderBy(['historybalance_id' => SORT_DESC])
	->limit(30);
	}
	
        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'user_id' => $this->user_id,
            'balance' => $this->balance,
            'credit' => $this->credit,
            'balance_up' => $this->balance_up,
            'credit_up' => $this->credit_up,
            'created_at' => $this->created_at,
        ]);

        $query->andFilterWhere(['ilike', 'type', $this->type])
            ->andFilterWhere(['ilike', 'comment', $this->comment]);

        return $dataProvider;
    }

А дальше как я говорил с ListView

Код: Выделить всё

<?= ListView::widget([
	'dataProvider' => $dataProvider,
	'pager' => [
		'hideOnSinglePage' => true,
		'firstPageLabel' => Yii::t('main', 'First'),
		'lastPageLabel'  => Yii::t('main', 'Last'),
	],
	'itemView' => '_history_balance',
	'layout' => '<div class="box box-solid"><div class="box-header"><div class="pull-right">{summary}</div></div></div><div class="row">{items}</div>{pager}',
])?>

Создаешь своё представление (файл view со своими примерным именем _history_balance.php) в котором у тебя будет отрисовка информации, которая будет приходить по от контроллера $dataProvider.
Вроде бы понятно объяснил. Спрашивай конкретные вопросы, что не понял.

Понравилась статья? Поделить с друзьями:
  • Syntax error unexpected expecting end of file перевод
  • Syntax error unexpected eof while parsing python
  • Syntax error unexpected eof php
  • Syntax error unexpected eof expecting
  • Syntax error unexpected endforeach