Содержание
- PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их
- 8 ответов 8
- Unexpected T_STRING
- Unexpected identifier «xxx»
- Строки с неверными кавычками
- Незакрытые строки
- Кавычки, не связанные с программированием
- Отсутствует точка с запятой
- Невидимые символы Unicode
- Заэкранированная кавычка
- Unexpected T_VARIABLE
- Unexpected ‘$varname’ (T_VARIABLE)
- Отсутствует точка с запятой
- Неверная конкатенация строк
- Пропущен оператор выражения
- В перечислениях в массивах или функциях
- В объявлении свойств классов
- Переменные сразу после идентификаторов
- Отсутствие скобок до/после языковых конструкций if, for, foreach
- Else не ожидает условий
- Необходимы скобки для замыканий (closure)
- Невидимые пробелы
- Общее о синтаксических ошибках
- ### Заметка:
- ### Как интерпретировать ошибки парсера
- Unexpected (
- Выражения в параметрах объявленной функции
- Выражения в свойствах класса
- isset(()), empty, key, next, current
- Unexpected )
- Висячая запятая при вызове функции/метода
- Незавершённые выражения
- Foreach as constant
- Unexpected <
- Unmatched subexpressions in an if (Несовпадающие подвыражения) в if
- < and >в выражениях
- Unexpected >
- Последнее выражение в блоке и потеря точки с запятой
- Недопустимая вложенность блоков/Forgotten < (забытая < )
- Unexpected < , expecting (
- Список параметров функции/метода
- Условные конструкции
- Unexpected T_CONSTANT_ENCAPSED_STRING
- Unexpected T_ENCAPSED_AND_WHITESPACE
- Неправильная интерполяция переменных
- Отсутствует конкатенация
- Отсутствует начальная кавычка
- Пропущена запятая в массиве
- Пропущена запятая в аргументах функции/метода
- Строка закрыта слишком поздно
- Отступ в HEREDOC
- Unexpected $end
- Unexpected end of file
- Отступ в HEREDOC
- Заэкранированная кавычка
- Альтернативный синтаксис
- 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 программистов …
-
- С нами с:
- 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
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
А откуда такой синтаксис взялся, с query:? То, что новые штормы так автоматом показывают бледным шрифтом, не означает, что это так писать надо.
— Добавлено —
Так можно, вроде, будет писать в 8 версии php, но она пока только RC, выйдет через месяц -
перевести трудно? гугл транслейт хотя бы?
посмотреть описание функции?: — замените на ,
-
- С нами с:
- 23 окт 2020
- Сообщения:
- 14
- Симпатии:
- 0
заменил и и вот опять ошибка «Warning: mysqli_query() expects parameter 1 to be mysqli, null given in W:domainsPhptestcsscreate.php on line 9»
-
- С нами с:
- 23 окт 2020
- Сообщения:
- 14
- Симпатии:
- 0
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
Ошибка изменилась, значит проблема другая. Скорее всего, подключения к базе не произошло, судя по тексту. Или переменная не так называется. Всё написано нормальным английским языком.Не понятен вопрос. Напишите в соответствии с синтаксисом php. Если не знаете синтаксис — какого фига лезете программировать?
-
- С нами с:
- 26 фев 2012
- Сообщения:
- 2.176
- Симпатии:
- 180
Начни с линухи и ангийского, без этих знаний будут постоянные проблемы, на решения которых ты будешь тратить целые дни.
PHP тащит за собой сервер, сервер тащит за собой линукс, линукс тащит за собой английский, php ничего не знает про mysql.
PHP это язык программирования, программирование это инженерия, инжеру надо знать очень много.
Taktreba и mkramer нравится это.
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
@Dimon2x Только я бы сказал, php — это программирование, программирование тащит за собой английский
-
- С нами с:
- 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
<?phprequire_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’)»);
?> -
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
А что в db.php? И прочитайте в подписи, как оформлять код
Это бред сивой кобылы, прочитайте документацию по mysqli.
И судя по коду, вы в основах путаетесь, что такое переменная, что такое параметры.
-
- С нами с:
- 23 окт 2020
- Сообщения:
- 14
- Симпатии:
- 0
В db.php:
<?php
$db = new mysqli(‘localhost’,’root’,’root’,’Users’);?>
-
acho
Активный пользовательИ не надо смешивать процедурный и ООП стили.
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
@nevidomo, ну я же говорю, переменные не понимаете. В одном месте она у вас $db называется, а в другом месте должна как-то преобразоваться в $connect сама собой?
-
- С нами с:
- 26 фев 2012
- Сообщения:
- 2.176
- Симпатии:
- 180
‘Users’ — это строка
$users — это переменная -
- С нами с:
- 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 -
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
Ну уже изменилось. Но документацию по mysqli_query так и не поискал. И код оформляешь как попало. Как правильно — у меня в подписи.
https://www.php.net/manual/ru/mysqli.query.php — читаем здесь, как правильно. Вообще не понимаю, откуда у тебя слово query в параметрах. Это неосознанное программирование, бич молодых программистов, судя по тем, что к нам на собеседования приходят. Код через сознание не проходит, спрашиваешь: «с какой целью написал именно так, а не иначе» — ответить не могут. Не приучайте себя к такому. Правило очень простое, чтоб программирование было осознанным — читать про каждую функцию, которая вызывается, документацию. Читать, как работает язык на котором пишешь. Читать, читать и ещё раз читать.
-
- С нами с:
- 23 окт 2020
- Сообщения:
- 14
- Симпатии:
- 0
большое спасибо
уже понял где проблема -
- С нами с:
- 1 апр 2013
- Сообщения:
- 7.562
- Симпатии:
- 1.284
- Адрес:
- Лень
@nevidomo, самое начало, от чего нужно начинать отталкиваться, это
Пи3дец — даже подсветку текстаАрены нахрен продуплить
какое б… программирование ??
Читаем Parse error — что за херня ? Транслятор нельзя было врубить и перевести ??? «Ошибка синтаксического анализа»
Что такое СИНТАКСИС ? Снова гуглим — узнаем.. Это тоже 6лядь как русский язык ГРА МА ТИ КА
С таким же успехом дальше переводим, думаем, покурим и снова думаем, можешь даже поужинать если до такого дошло.
Line ? строка
Что — то в строке 9 Синтаксис долбаный сломан в PHPВедь пхп интерпретатор ругается
Смотрим и дуплим, что там за 9 строка-
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.
Вроде бы понятно объяснил. Спрашивай конкретные вопросы, что не понял.