формирование - экранирование url php




Справка-Что означает эта ошибка в PHP? (20)

Что это?

Это ряд ответов о предупреждениях, ошибках и уведомлениях, с которыми вы можете столкнуться при программировании PHP, и не знаете, как их исправить. Это также Вики Сообщества, поэтому все приглашаются к участию, добавляя и поддерживая этот список.

Почему это?

Такие вопросы, как «Заголовки уже отправлены» или «Вызов члена необъекта» , часто появляются при переполнении стека. Коренная причина этих вопросов всегда одна и та же. Таким образом, ответы на эти вопросы, как правило, повторяют их, а затем показывают ОП, какую строку изменить в их конкретном случае. Эти ответы не добавляют никакой ценности сайту, поскольку они относятся только к определенному коду ОП. Другие пользователи, имеющие ту же ошибку, не могут легко прочитать решение из нее, потому что они слишком локализованы. Это печально, потому что, как только вы поняли основную причину, исправление ошибки становится тривиальным. Следовательно, этот список пытается объяснить решение в общем виде для применения.

Что мне здесь делать?

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

Если вы хотите внести свой вклад, пожалуйста, добавьте свое «любимое» сообщение об ошибке, предупреждение или уведомление, по одному на ответ, краткое описание, что оно означает (даже если оно только выделяет термины на их странице руководства), возможное решение или подход отладки и список существующих вопросов и ответов, которые имеют значение. Кроме того, не стесняйтесь улучшать любые существующие ответы.

Список

  • Ничего не видно Страница пустая и белая. (также известный как Белая Страница / Экран Смерти )
  • Код не запускается / похоже, выводятся части моего кода PHP
  • Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
  • Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, логическое значение, известное как
    Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL, иначе
    Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, с булевыми значениями (или аналогичными вариантами)
  • Предупреждение: [функция] ожидает, что параметр 1 будет ресурсом, учитывая логическое значение
  • Предупреждение: [функция] : не удалось открыть поток: [причина]
  • Предупреждение: действует ограничение open_basedir
  • Предупреждение: деление на ноль
  • Предупреждение: недопустимое смещение строки 'XXX'
  • Предупреждение: count (): Параметр должен быть массивом или объектом, который реализует Счетное
  • Ошибка разбора: синтаксическая ошибка, неожиданная '['
  • Ошибка разбора: синтаксическая ошибка, неожиданный T_XXX
  • Ошибка разбора: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE
  • Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM
  • Ошибка разбора: синтаксическая ошибка, неожиданное 'require_once' (T_REQUIRE_ONCE), ожидающая функция (T_FUNCTION)
  • Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE
  • Неустранимая ошибка: допустимый объем памяти в XXX байтов исчерпан (попытался выделить XXX байтов)
  • Неустранимая ошибка: вызов функции-члена ... для необъектного или нулевого
  • Неустранимая ошибка: вызов неопределенной функции XXX
  • Неустранимая ошибка: невозможно переопределить XXX
  • Неустранимая ошибка: невозможно использовать возвращаемое значение функции в контексте записи
  • Неустранимая ошибка: объявление AAA :: BBB () должно быть совместимо с таковым для CCC :: BBB () '
  • Неустранимая ошибка: использование $ this, когда не в контексте объекта
  • Неустранимая ошибка: объект класса Closure не может быть преобразован в строку
  • Примечание: преобразование массива в строку
  • Примечание: попытка получить свойство ошибки необъекта
  • Примечание: неопределенная переменная или свойство
  • Примечание: неопределенный индекс
  • Примечание: неопределенное смещение XXX [Ссылка]
  • Примечание: смещение неинициализированной строки: XXX
  • Примечание: использование неопределенной константы XXX - предполагается, что XXX
  • MySQL: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом ... в строке ...
  • Строгие стандарты: нестатический метод [<class> :: <method>] не должен вызываться статически
  • Предупреждение: функция ожидает, что параметр X будет логическим / string / integer
  • Ошибка HTTP 500 - внутренняя ошибка сервера

Также см:

  • Справка - Что означает этот символ в PHP?

Код не запускается / похоже, выводятся части моего кода PHP

Если вы не видите результатов из своего PHP-кода и / или вы видите части вашего буквального исходного кода PHP, выводимого на веб-странице, вы можете быть почти уверены, что ваш PHP фактически не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный файл PHP как есть. Поскольку PHP-код встроен в <?php ?> теги, браузер попытается интерпретировать их как теги HTML, и результат может выглядеть несколько запутанным.

Чтобы запустить ваши PHP-скрипты, вам нужно:

  • веб-сервер, который выполняет ваш скрипт
  • установить расширение файла на .php, иначе веб-сервер не будет интерпретировать его как таковой *
  • получить доступ к вашему файлу .php через веб-сервер

* Если вы не перенастроите его, все может быть настроено.

Последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:

file://C:/path/to/my/file.php

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

http://localhost/my/file.php

Вы также можете проверить , используете ли вы короткие открытые теги <? вместо <?php и конфигурация PHP получился короткие открытые теги прочь.

Также посмотрите, что PHP-код не выполняется, вместо этого код отображается на странице


Ошибка HTTP 500 - внутренняя ошибка сервера

Код состояния HTTP 500 и типичное предупреждение Apache или браузера - очень широкое сообщение. Это не настоящая ошибка. Чтобы выяснить, является ли неправильная конфигурация веб-сервера ( .htaccess ) или фатальная ошибка PHP, вы должны взглянуть на error.log .

Обычно вы можете найти веб-серверы error.log под:

  • /var/log/apache2 на серверах Linux, часто используется для локальных и виртуальных хостов.
  • /var/www/_user12345_/logs или аналогичный на планах общего хостинга.
    Обычно logs/ рядом с каждой htdocs/ папкой есть каталог.
  • C:\xampp\apache\logs\error.log для дистрибутивов WAMP / XAMPP Apache + PHP.
  • В качестве альтернативы просто используйте функцию поиска файлов, чтобы найти что-нибудь под названием «error.log».
    Или загляните в свой Apache httpd.conf и его ErrorLog директиву.
  • /var/log/nginx/nginx_error.log для NGINX .
  • C:\inetpub\logs\LogFiles для IIS .

Это текстовый файл. Найдите запись, наиболее точно соответствующую времени ошибки, и используйте значительную часть сообщения об ошибке (от «Ошибка PHP:…» до «в строке…») для дальнейшего поиска в Google.

[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message: PHP Error: Unfiltered input variable $_JSON['pokestop_lng'] in filyfile.php on line 845

Для установок FPM вы будете часто просто видеть фатальные ошибки PHP здесь. Принимая во внимание, что старые конфигурации mod_php (виртуальный хостинг) часто смешиваются в предупреждениях и уведомлениях (которые обычно также заслуживают изучения).

Если вы не настроены на использование системы или механизма ведения журнала Apache, вы также можете посмотреть PHP-файл error.log . Обычно проще оставить значения по умолчанию и просто включить error_display +, error_reporting чтобы выявить конкретную ошибку. В конце концов, HTTP 500 - это всего лишь разновидность белого экрана смерти PHP .

Смотрите также:


Предупреждение: [функция] ожидает, что параметр 1 будет ресурсом, учитывая логическое значение

(Более общий вариант Warning: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение )

Ресурсы являются type в PHP (например, строки, целые числа или объекты). Ресурс - это непрозрачный блоб, не имеющий собственной значимой ценности. Ресурс является специфическим и определяется определенным набором функций или расширений PHP. Например, расширение Mysql определяет два типа ресурсов :

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

Расширение cURL определяет еще два типа ресурсов :

... ручка cURL и мульти ручка.

Когда var_dump ed, значения выглядят так:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

Это все, что большинство ресурсов, числовой идентификатор ( (1) ) определенного типа ( (curl) ).

Вы носите эти ресурсы и передаете их различным функциям, для которых такой ресурс что-то значит. Обычно эти функции распределяют определенные данные в фоновом режиме, а ресурс - это просто ссылка, которую они используют для внутреннего отслеживания этих данных.

Ошибка « ... ожидает, что параметр 1 будет ресурсом, логическим значением », как правило, является результатом неконтролируемой операции, которая должна была создать ресурс, но false вместо этого была возвращена . Например, fopen функция имеет это описание:

Возвращаемые значения

Возвращает ресурс указателя файла в случае успеха или FALSE при ошибке.

Так что в этом коде, $fp или будет , resource(x) of type (stream) или false :

$fp = fopen(...);

Если вы не проверяете, была ли fopen операция успешной или неудачной и, следовательно, $fp является ли она допустимым ресурсом, false и переходите $fp к другой функции, которая ожидает ресурс, вы можете получить вышеуказанную ошибку:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Вам всегда нужно проверять возвращаемое значение функций, которые пытаются выделить ресурс и могут потерпеть неудачу :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Связанные ошибки:


Предупреждение: mysql_connect (): доступ запрещен для пользователя 'name' @ 'host'

Это предупреждение появляется при подключении к серверу MySQL / MariaDB с неверными или отсутствующими учетными данными (имя пользователя / пароль). Так что обычно это не проблема кода, а проблема конфигурации сервера.

  • Смотрите страницу руководства mysql_connect("localhost", "user", "pw") для примеров.

  • Проверьте, что вы на самом деле использовали $username и $password .

    • Нечасто, что вы получаете доступ без пароля - что и произошло, когда было сказано предупреждение (using password: NO) .
    • Только локальный тестовый сервер обычно позволяет подключаться с именем пользователя root , без пароля и test именем базы данных.

    • Вы можете проверить, действительно ли они верны, используя клиент командной строки:
      mysql --user="username" --password="password" testdb

    • Имя пользователя и пароль чувствительны к регистру и пробелы не игнорируются. Если ваш пароль содержит метасимволы, например $ , экранируйте их или поставьте пароль в одинарные кавычки .

    • Большинство провайдеров виртуального хостинга объявляют учетные записи mysql по отношению к учетной записи пользователя unix (иногда просто префиксы или дополнительные числовые суффиксы). См. Документацию для шаблона или документации, и CPanel или любой другой интерфейс для установки пароля.

    • См. Руководство MySQL по добавлению учетных записей пользователей с помощью командной строки. При подключении от имени администратора вы можете выполнить запрос, например:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Или использовать Adminer или WorkBench или любой другой графический инструмент для создания, проверки или исправить данные учетной записи.

    • Если вы не можете исправить свои учетные данные, то просить Интернет «пожалуйста, помогите» не будет иметь никакого эффекта. Только у вас и у вашего хостинг-провайдера есть разрешения и достаточный доступ для диагностики и устранения неполадок.

  • Убедитесь, что вы можете связаться с сервером базы данных, используя имя хоста, указанное вашим провайдером:
    ping dbserver.hoster.example.net

    • Проверьте это с консоли SSH прямо на вашем веб-сервере. Тестирование с локального клиента разработки на сервер общего хостинга редко имеет смысл.

    • Часто вы просто хотите, чтобы имя сервера было таким "localhost" , которое обычно использует локальный именованный сокет, когда он доступен. В других случаях вы можете попробовать "127.0.0.1" как запасной вариант.

    • Если ваш сервер MySQL / MariaDB прослушивает другой порт, используйте "servername:3306" .

    • Если это не помогает, возможно, проблема с брандмауэром. (Не по теме, не вопрос программирования. Дистанционная подсказка невозможна.)

  • При использовании констант типа eg DB_USER или DB_PASSWORD убедитесь, что они на самом деле defined .

    • Если вы получаете "Warning: Access defined for 'DB_USER'@'host'" и "Notice: use of undefined constant 'DB_PASS'" , то это ваша проблема.

    • Убедитесь, что ваш eg xy/db-config.php был на самом деле включен и whatelse.

  • Проверьте правильность установленных GRANT разрешений .

    • Недостаточно иметь пару username + password .

    • Каждая учетная запись MySQL / MariaDB может иметь прикрепленный набор разрешений.

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

    • Таким образом, предупреждение «Отказано в доступе» может также отображаться для mysql_query вызовов, если у вас нет прав доступа к SELECT определенной таблице или INSERT / UPDATE , а чаще всего DELETE .

    • Вы можете адаптировать разрешения учетной записи при подключении к клиенту командной строки, используя учетную запись администратора с запросом, подобным следующему:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Если сначала отображается предупреждение, Warning: mysql_query(): Access denied for user ''@'localhost' то у вас может быть предварительно настроенная пара php.ini-аккаунт / пароль .

    • Проверьте это mysql.default_user= и mysql.default_password= имейте значимые значения.

    • Часто это конфигурация провайдера. Так что свяжитесь с их поддержкой для несоответствий.

  • Найдите документацию вашего провайдера виртуального хостинга:

  • Обратите внимание, что вы, возможно, также исчерпали доступный пул соединений . Вы получите предупреждения об отказе в доступе для слишком большого количества одновременных соединений. (Вы должны исследовать установку. Это неконтролируемая проблема конфигурации сервера, а не вопрос программирования.)

  • Ваша версия клиента libmysql может быть несовместима с сервером базы данных. Обычно к серверам MySQL и MariaDB можно обращаться с помощью PHP, скомпилированных в драйвере. Если у вас есть пользовательская установка, или устаревшая версия PHP, и гораздо более новый сервер баз данных, или значительно устаревший сервер - тогда несовпадение версий может помешать соединениям. (Нет, вы должны исследовать себя. Никто не может угадать ваши настройки).

Больше ссылок:

Кстати, вы, вероятно, больше не хотите использовать mysql_* функции . Новички часто мигрируют в mysqli , что, впрочем, столь же утомительно. Вместо этого прочитайте на PDO и подготовленные заявления .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


Предупреждение: деление на ноль

Предупреждающее сообщение «Деление на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не приведет к исключению, поэтому некоторые разработчики будут иногда подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:

$value = @(2 / 0);

Но, как и в случае любого предупреждения, наилучшим подходом было бы отследить причину предупреждения и устранить ее. Причиной предупреждения будет любой случай, когда вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (потому что NULL == 0), потому что результат будет 'неопределенным'.

Чтобы исправить это предупреждение, вам следует переписать выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делить или изменять значение на 1, а затем делить так, чтобы деление приводило к эквиваленту деления только на дополнительную переменную.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Смежные вопросы:


Предупреждение: недопустимое смещение строки 'XXX'

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

Пример:

$var = "test";
echo $var["a_key"];

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


Строгие стандарты: нестатический метод [<class> :: <method>] не должен вызываться статически

Происходит, когда вы пытаетесь вызвать нестатический метод в классе, поскольку он был статическим, и у вас также есть E_STRICT флаг в ваших error_reporting() настройках.

Пример :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() или же $html::br()

Вы действительно можете избежать этой ошибки, не добавляя E_STRICT к error_reporting() , например ,

error_reporting(E_ALL & ~E_STRICT);

поскольку, как для PHP 5.4.0 и выше, E_STRICT включен в E_ALL [ ref ]. Но это не рекомендуется. Решение состоит в том, чтобы определить вашу предполагаемую статическую функцию как актуальную static :

public static function br() {
  echo '<br>';
}

или вызовите функцию условно:

$html = new HTML();
$html->br();

Смежные вопросы:


MySQL: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом ... в строке ...

Эта ошибка часто возникает из-за того, что вы забыли правильно экранировать данные, переданные в запрос MySQL.

Пример того, чего не следует делать («Плохая идея»):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Этот код может быть включен в страницу с формой для отправки, с URL-адресом, таким как http://example.com/edit.php?id=10 (для редактирования сообщения № 10)

Что произойдет, если представленный текст содержит одинарные кавычки? $query будет заканчиваться на:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

И когда этот запрос отправляется в MySQL, он будет жаловаться, что синтаксис неправильный, потому что в середине есть лишняя одинарная кавычка.

Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда экранировать данные перед использованием в запросе.

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

Документация:


Неустранимая ошибка: вызов функции-члена ... для необъекта

Происходит с кодом, похожим на xyz->method() где xyz не является объектом и, следовательно, этот method не может быть вызван.

Это фатальная ошибка, которая приводит к остановке скрипта (уведомление о прямой совместимости: это станет исправимой ошибкой, начиная с PHP 7).

Чаще всего это признак того, что в коде отсутствуют проверки на наличие ошибок. Проверьте, что объект на самом деле является объектом, прежде чем вызывать его методы.

typical примером будет

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

В приведенном выше примере запрос не может быть подготовлен, и prepare() назначит false для $statement . Попытка вызова метода execute() приведет к фатальной ошибке, потому что false - это «необъект», поскольку значение является логическим.

Выясните, почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo наличие последней ошибки. Детали того, как отладить это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.

Если даже - ->prepare терпит неудачу, тогда ваш $pdo дескриптора базы данных $pdo не был передан в текущую область . Найдите, где это было определено. Затем передайте его как параметр, сохраните как свойство или поделитесь им через глобальную область видимости.

Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

При попытке выполнить метод за пределами условного блока ваш объект может быть не определен.

Смежные вопросы:

  • Вызов функции-члена для необъекта
  • Список всех PHP "Неустранимая ошибка: вызов функции-члена ... для необъекта" Вопросы по

Неустранимая ошибка: допустимый объем памяти в XXX байтов исчерпан (попытался выделить XXX байтов)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и прекращает его выполнение. Эта ошибка является фатальной, скрипт останавливается. Значение предела памяти можно настроить либо в файле php.ini либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini ). Цель ограничения памяти - не допустить, чтобы один скрипт PHP сожрал всю доступную память и отключил весь веб-сервер.

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

Если эта ошибка произошла, когда ваш скрипт не выполнял работу, интенсивно использующую память, вам нужно проверить код, чтобы увидеть, есть ли утечка памяти. Функция memory_get_usage - ваш друг.

Смежные вопросы:

  • Все вопросы «Неустранимая ошибка: допустимый объем памяти в XXX байтах исчерпан» Вопросы по

Неустранимая ошибка: невозможно использовать возвращаемое значение функции в контексте записи

Обычно это происходит при использовании функции непосредственно с empty .

Пример:

if (empty(is_null(null))) {
  echo 'empty';
}

Это связано с тем, что empty является языковой конструкцией, а не функцией, ее нельзя вызывать с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент функции empty() должен быть переменной , но в PHP 5.5+ допустимо произвольное выражение (например, возвращаемое значение функции).

empty , несмотря на свое имя, на самом деле не проверяет, является ли переменная «empty». Вместо этого он проверяет, не существует ли переменная, или == false . Выражения (например, is_null(null) в примере) всегда будут считаться существующими, поэтому здесь empty проверяет, только равно ли оно значению false. Вы можете заменить empty() здесь на ! Например, if (!is_null(null)) или явно сравнить с false, например if (is_null(null) == false) .

Смежные вопросы:


Неустранимая ошибка: невозможно переопределить класс [имя класса]

Неустранимая ошибка: невозможно переопределить [имя функции]

Это означает, что вы либо используете одно и то же имя функции / класса дважды, и вам нужно переименовать одно из них, либо это происходит из-за того, что вы использовали require или include где вы должны использовать require_once или include_once .

Когда класс или функция объявляются в PHP, они неизменны и не могут быть позже объявлены с новым значением.

Рассмотрим следующий код:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

Второй вызов do_stuff() выдаст ошибку выше. Изменяя require на require_once , мы можем быть уверены, что файл, содержащий определение MyClass будет загружен только один раз, и ошибка будет исключена.


Ошибка разбора: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE

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

Случай ошибки:

Это приведет к Unexpected T_ENCAPSED_AND_WHITESPACE :

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Возможные исправления:

В строке в двойных кавычках PHP разрешает использовать строки ключей массива без E_NOTICE и не выдает E_NOTICE . Таким образом, вышесказанное можно записать так:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Вся переменная комплексного массива и ключ (и) могут быть заключены в {} , и в этом случае они должны быть заключены в кавычки, чтобы избежать E_NOTICE . Документация PHP рекомендует этот синтаксис для сложных переменных.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Конечно, альтернативой любому из вышеперечисленного является объединение переменной массива вместо ее интерполяции:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Для справки см. Раздел « Разбор переменных» на странице справки PHP Strings.


Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM

Оператор разрешения контекста также называется "Paamayim Nekudotayim" с иврита פעמיים נקודתיים. что означает «двойное двоеточие» или «двойная точка дважды».

Эта ошибка обычно возникает, если вы случайно добавили :: в свой код.

Смежные вопросы:

Документация:


Ошибка разбора: синтаксическая ошибка, неожиданный T_XXX

Происходит, когда у вас есть токен T_XXX в неожиданном месте, несбалансированные (лишние) скобки, использование короткого тега без его активации в php.ini и многое другое.

Смежные вопросы:

Для дальнейшей помощи смотрите:

  • http://phpcodechecker.com/ - который дает некоторые более полезные объяснения ваших проблем синтаксиса.

Предупреждение: [функция] : не удалось открыть поток: [причина]

Это происходит, когда вы вызываете файл обычно с помощью include , require или fopen и PHP не может найти файл или не имеет достаточных прав для загрузки файла.

Это может произойти по разным причинам:

  • неверный путь к файлу
  • путь к файлу относительно
  • неверный путь
  • разрешения слишком ограничительны
  • SELinux в силе
  • и многое другое ...

Одна распространенная ошибка - не использовать абсолютный путь. Это можно легко решить, используя полный путь или магические константы, такие как __DIR__ или dirname(__FILE__) :

include __DIR__ . '/inc/globals.inc.php';

или же:

require dirname(__FILE__) . '/inc/globals.inc.php';

Использование правильного пути - один из шагов по устранению этих проблем, это также может быть связано с несуществующими файлами, правами файловой системы, препятствующими доступу, или ограничениями open basedir самим PHP.

Лучший способ быстро решить эту проблему - следовать приведенному ниже контрольному списку устранения неполадок.

Смежные вопросы:

Связанные ошибки:


Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены

Происходит, когда ваш скрипт пытается отправить HTTP-заголовок клиенту, но ранее он уже выводился, что привело к тому, что заголовки уже отправлялись клиенту.

Это E_WARNING и он не остановит скрипт.

Типичным примером будет файл шаблона, подобный этому:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

Функция session_start() попытается отправить заголовки с файлом cookie сеанса клиенту. Но PHP уже отправлял заголовки, когда записывал элемент <html> в выходной поток. Вам нужно переместить session_start() наверх.

Вы можете решить эту проблему, пройдя строки перед кодом, вызывающим предупреждение, и проверьте, где он выводит. Переместите любой код отправки заголовка перед этим кодом.

Часто пропускаемый вывод - новые строки после закрытия PHP ?> . Это считается стандартной практикой, чтобы пропустить ?> Когда это последняя вещь в файле. Аналогичным образом, другой распространенной причиной этого предупреждения является случай, когда открывающий <?php имеет пустой пробел, строку или невидимый символ перед ним, в результате чего веб-сервер отправляет заголовки и пробел / символ новой строки, поэтому при запуске PHP синтаксический анализ не будет в состоянии представить любой заголовок.

Если в вашем файле более одного <?php ... ?> Кода, между ними не должно быть пробелов. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически создан)

Также убедитесь, что в вашем коде нет меток порядка следования байтов, например, когда код сценария UTF-8 с спецификацией.

Смежные вопросы:


Примечание: использование неопределенной константы XXX - предполагается, что XXX

или в PHP 7.2 или более поздней версии:

Предупреждение: использование неопределенной константы XXX - предполагается «XXX» (это приведет к ошибке в будущей версии PHP)

Это уведомление появляется, когда токен используется в коде и выглядит как константа, но константа с таким именем не определена.

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

Например:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Другой распространенной причиной является отсутствие знака $ (доллар) перед именем переменной:

// Wrong
echo varName;

// Right
echo $varName;

Или, возможно, вы неправильно написали какую-то другую константу или ключевое слово:

// Wrong
$foo = fasle;

// Right
$foo = false;

Это также может быть признаком отсутствия необходимого расширения или библиотеки PHP при попытке доступа к константе, определенной этой библиотекой.

Смежные вопросы:


Примечание: неопределенный индекс

Происходит при попытке доступа к массиву по ключу, который не существует в массиве.

Типичным примером уведомления о Undefined Index будет ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

И spinach и 1 не существуют в массиве, что вызывает E_WARNING .

Решение состоит в том, чтобы убедиться, что индекс или смещение существует до доступа к этому индексу. Это может означать, что вам нужно исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы, используя array_key_exists или isset :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Если у вас есть такой код:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

тогда $_POST['message'] не будет установлен при первой загрузке этой страницы, и вы получите вышеуказанную ошибку. Индекс массива будет существовать только после отправки формы и повторного запуска этого кода. Вы обычно проверяете это с помощью:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Смежные вопросы:


Примечание: попытка получить свойство ошибки необъекта

Происходит при попытке получить доступ к свойству объекта, когда объекта нет.

Типичным примером уведомления об отсутствии объекта будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users является массивом (то есть не объектом) и не имеет никаких свойств.

Это похоже на доступ к несуществующему индексу или ключу массива (см. Примечание: неопределенный индекс ).

Этот пример сильно упрощен. Чаще всего такое уведомление сигнализирует о непроверенном возвращаемом значении, например, когда библиотека возвращает NULL если объект не существует, или просто неожиданное не-объектное значение (например, в результате Xpath, структурах JSON с неожиданным форматом, XML с неожиданным форматом и т. Д. ) но код не проверяет наличие такого условия.

Поскольку эти необъекты часто обрабатываются в дальнейшем, часто происходит фатальная ошибка при вызове метода объекта для необъекта (см .: Неустранимая ошибка: вызов функции-члена ... для необъекта ) с остановкой скрипт.

Это можно легко предотвратить, проверив наличие ошибок и / или соответствие переменной ожиданиям. Вот такое уведомление с примером DOMXPath :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к nodeValue свойству (полю) первого элемента, пока он не был проверен, существует ли он в $result коллекции. Вместо этого стоит сделать код более явным, назначив переменные объектам, над которыми работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

  • Примечание: неопределенный индекс
  • Неустранимая ошибка: вызов функции-члена ... для необъекта




warnings