Ссылка. Что означает эта ошибка в PHP?

Что это?

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

Почему это?

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

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

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

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

Список

  • Ничего не видно. Страница пустая и белая. (также известная как Белая страница / Экран Смерти )
  • Код не запускается / что-то похожее на части моего кода PHP выводятся
  • Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки
  • Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean given aka
    Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL aka
    Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, boolean данный (или аналогичные варианты)
  • Предупреждение: [function] ожидает, что параметр 1 будет ресурсом, boolean given
  • Предупреждение: [функция] : не удалось открыть поток: [причина]
  • Предупреждение: ограничение open_basedir
  • Предупреждение: деление на ноль
  • Предупреждение: Неверное смещение строки 'XXX'
  • Ошибка анализа: синтаксическая ошибка, неожиданная '['
  • Ошибка анализа: синтаксическая ошибка, неожиданный 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, если не в объектном контексте
  • Примечание. Преобразование массива в строку
  • Примечание. Попытка получить свойство ошибки, отличной от объекта
  • Примечание. Неопределенная переменная
  • Примечание. Неопределенный индекс
  • Примечание: Неопределенное смещение XXX [Ссылка]
  • Примечание: Неинициализированное смещение строки: XXX
  • Примечание: использование неопределенной константы XXX – предполагается 'XXX'
  • MySQL: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом … в строке …
  • Строгие стандарты: нестатический метод [<class> :: <method>] не следует называть статически

Также см

  • Ссылка. Что означает этот символ в 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 с BOM.

Связанные вопросы:

  • Заголовки, уже отправленные PHP
  • Все PHP-заголовки уже отправлены. Вопросы по Stackoverflow
  • Значок байтового байта
  • Какие функции PHP создают выходные данные?

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

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

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

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

Типичным примером может служить

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

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

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

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

Связанные вопросы:

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

Ничего не видно. Страница пустая и белая.

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

Если вы включили регистрацию ошибок, вы найдете конкретное сообщение об ошибке в своем журнале ошибок. Обычно это будет в файле php_errors.log, либо в центральном расположении (например, /var/log/apache2 во многих средах Linux), либо в каталоге самого скрипта (иногда используется в среде с общим хостингом).

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

Это можно легко сделать, добавив в начале скрипта следующий код PHP:

 ini_set('display_errors', 1); error_reporting(~0); 

Код включит отображение ошибок и установит отчетность на самый высокий уровень.

Поскольку ini_set() выполняется во время выполнения, он не влияет на синтаксические ошибки. Эти ошибки появятся в журнале. Если вы хотите также отобразить их на выходе (например, в браузере), вы должны установить директиву display_startup_errors значение true . Сделайте это либо в php.ini либо в .htaccess либо любым другим способом, который влияет на конфигурацию перед выполнением .

Вы можете использовать те же методы, чтобы установить директивы log_errors и error_log, чтобы выбрать собственное местоположение файла журнала.

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

Связанные вопросы:

  • Белый экран смерти от PHP
  • Белый экран смерти!
  • PHP не отображает сообщения об ошибках
  • PHP испускает 500 на ошибках – где это документировано?
  • Как получить полезные сообщения об ошибках в PHP?
  • Все PHP-страницы «Белая страница смерти» на Stackoverflow

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

  • Ошибка анализа: синтаксическая ошибка, неожиданный T_XXX
  • Неустранимая ошибка: вызов функции-члена … на не объект
  • Код не запускается / что-то похожее на части моего кода PHP выводятся

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

Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.

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

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

Оба spinach и 1 не существуют в массиве, что вызывает E_NOTICE .

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

 $data = array('foo' => '42', 'bar'); if (array_key_exists('spinach', $data)) { echo $data['spinach']; } else { echo 'No key spinach in 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 

Связанные вопросы:

  • Ссылка: «Примечание: неопределенная переменная» и «Примечание: Неопределенный индекс»
  • Все PHP "Уведомление: неопределенный индекс" Вопросы по Stackoverflow
  • http://php.net/arrays

Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean

Прежде всего:

Пожалуйста, не используйте функции mysql_* в новом коде . Они больше не поддерживаются и официально устарели . См. Красную рамку ? Узнайте о подготовленных инструкциях и используйте PDO или MySQLi – эта статья поможет вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .


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

Это предупреждение и не остановит скрипт, но сделает вашу программу неправильной.

Вы должны проверить результат, возвращаемый mysql_query по

 $res = mysql_query($sql); if (!$res) { die(mysql_error()); } // after checking, do the fetch 

Связанные вопросы:

  • mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан в select
  • Все "mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан" Вопросы по Stackoverflow

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

  • Предупреждение: [function] ожидает, что параметр 1 будет ресурсом, boolean given

Другие функции mysql* которые также ожидают, что ресурс результата mysql в качестве параметра приведет к той же ошибке по той же причине.

Неустранимая ошибка: использование $ this, если не в объектном контексте

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

Эта ошибка может произойти:

  1. Если нестатический метод называется статическим. Пример:

     class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar(); 

    Как исправить: снова просмотрите свой код, $this может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property для доступа к статическому свойству.

  2. Если код из метода класса был скопирован в нормальную функцию или только глобальную область и сохранил $this специальную переменную $this .
    Как исправить: просмотрите код и замените $this на другую переменную замещения.

Связанные вопросы:

  1. Вызовите нестатический метод как статический: PHP Неустранимая ошибка: использование $ this, когда не в контексте объекта
  2. Скопировать код: Неустранимая ошибка: использование $ this, если не в контексте объекта
  3. Все «Использование $ this, если не в контексте объекта». Вопросы по Stackoverflow

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

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

Связанные вопросы:

  • Ссылка: ошибки PHP / синтаксиса; и как их решить?
  • Ошибка анализа: синтаксическая ошибка: неожиданный '{'
  • Ошибка анализа: ошибка синтаксиса, неожиданный конец файла в моем PHP-коде
  • Ошибка анализа: синтаксическая ошибка, неожиданный «<» in – Fix?
  • Ошибка анализа: синтаксическая ошибка, неожиданный '?'

Для получения дополнительной помощи см .:

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

Неустранимая ошибка: вызов неопределенной функции XXX

Случается, когда вы пытаетесь вызвать функцию, которая еще не определена. Общие причины включают в себя отсутствие расширений и включает в себя объявление условной функции, функцию в объявлении функции или простые опечатки.

Пример 1 – Декларация условной функции

 $someCondition = false; if ($someCondition === true) { function fn() { return 1; } } echo fn(); // triggers error 

В этом случае fn() никогда не будет объявлен, потому что $someCondition не является истинным.

Пример 2 – Функция в объявлении функции

 function createFn() { function fn() { return 1; } } echo fn(); // triggers error 

В этом случае fn будет объявлен только после createFn() . Обратите внимание, что последующие вызовы createFn() вызовут ошибку об обновлении существующей функции.

Вы также можете увидеть это для встроенной функции PHP. Попробуйте найти функцию в официальном руководстве и проверьте, к какому «расширению» (PHP-модуль) принадлежит, и какие версии PHP поддерживают его.

В случае отсутствия расширения, установите это расширение и включите его в php.ini. См. Инструкцию по установке в Руководстве по PHP для расширения, в котором появляется ваша функция. Вы также можете включить или установить расширение с помощью диспетчера пакетов (например, apt в Debian или Ubuntu, yum в Red Hat или CentOS) или панели управления в среде общего хостинга.

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

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

В случае опечаток исправьте опечатку.

Связанные вопросы:

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

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

Пример:

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

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

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

Связанные вопросы:

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

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-инъекция может привести к изменению, потере или изменению записи, таблицы или всей базы данных. Это очень серьезная проблема безопасности!

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

  • Как я могу предотвратить SQL-инъекцию в PHP?
  • mysql_real_escape_string()
  • mysqli_real_escape_string()
  • Как работает SQL-инъекция из комикса XBCD Bobby Tables?
  • SQL-инъекция, которая распространяется вокруг mysql_real_escape_string ()

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

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

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

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

Связанные вопросы:

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

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

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

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

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

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

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

В строке с E_NOTICE 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 aa 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» с иврита פעמיים נקודתיים. что означает «двойная двоеточие» или «двойная точка дважды».

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

Связанные вопросы:

  • Ссылка: ошибки PHP / синтаксиса; и как их решить?
  • Что означают два двоеточия в PHP?
  • В чем разница между :: (double colour) и -> (стрелкой) в PHP?
  • Неожиданный T_PAAMAYIM_NEKUDOTAYIM, ожидающий T_NS_Separator

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

  • Оператор разрешения масштаба (: 🙂

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

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

Это означает, что вы либо используете одно и то же имя функции / класса дважды, и вам нужно переименовать один из них, или это потому, что вы использовали 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 to require_once , мы можем быть уверены, что файл, содержащий определение MyClass будет загружен только один раз, и ошибка будет устранена.

Примечание. Неопределенная переменная

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

Типичным примером может служить

 foreach ($items as $item) { // do something with item $counter++; } 

Если вы еще не определили $counter , код, указанный выше, вызовет уведомление.

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

 $counter = 0; foreach ($items as $item) { // do something with item $counter++; } 

Связанные вопросы:

  • Все PHP «Уведомление: неопределенная переменная» Вопросы по Stackoverflow
  • PHP: «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение»
  • Ссылка: что такое переменная область, какие переменные доступны из того, где и какие ошибки «неопределенной переменной»?

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

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

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

Например:

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

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

 // Wrong echo varName; // Right echo $varName; 

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

Связанные вопросы:

  • Что означает сообщение об ошибке PHP «Уведомление: использование неопределенной константы»?

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

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

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

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

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

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

или:

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

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

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

Связанные вопросы:

  • Контрольный список устранения неполадок: не удалось открыть поток

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

  • Предупреждение: ограничение open_basedir

Предупреждение: ограничение open_basedir

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

Когда он появляется, это означает, что доступ был запрещен для некоторых файлов.

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

Обычно исправление изменяет конфигурацию PHP , связанная с ней настройка называется open_basedir .

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

Связанные вопросы:

  • open_basedir. Файл (/) не находится в пределах допустимых путей:
  • Все PHP "Предупреждение: действующее ограничение open_basedir" Querstions on Stackoverflow

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

Возможный сценарий

Я не могу найти, где мой код поступил не так. Вот моя полная ошибка:

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

Что я пытаюсь

 $sql = 'SELECT * FROM dealer WHERE id="'$id.'"'; 

Ответ

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

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

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

Это сообщение об ошибке означает, что в строке x файла интерпретатор PHP ожидал увидеть открытую скобку, но вместо этого он столкнулся с чем-то, называемым T_VARIABLE . Эта вещь T_VARIABLE называется token . Это способ интерпретации PHP-интерпретатора различных фундаментальных частей программ. Когда интерпретатор читает в программе, он переводит то, что вы написали, в список токенов. Где бы вы не поместили переменную в свою программу, в списке интерпретатора есть токен T_VARIABLE .

Хорошо читайте: Список токенов Parser

Поэтому убедитесь, что вы E_PARSE хотя бы E_PARSE в свой php.ini . Ошибки анализа не должны существовать в производственных сценариях.

Я всегда рекомендовал добавить следующую инструкцию во время кодирования:

 error_reporting(E_ALL); 

Отчеты об ошибках PHP

Также рекомендуется использовать среду IDE, которая позволит вам знать ошибки разбора при наборе текста. Вы можете использовать:

  1. NetBeans (прекрасный мир красоты, бесплатное программное обеспечение) (лучший, на мой взгляд)
  2. PhpStorm (дядя Гордон любит это: P, платный план, содержит проприетарное и бесплатное программное обеспечение)
  3. Eclipse (красота и зверь, бесплатное программное обеспечение)

Связанные вопросы:

  • Ссылка: ошибки PHP / синтаксиса; и как их решить?

Примечание: Неинициализированное смещение строки: *

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

Подумайте, вы пытаетесь показать каждую букву из $string

 $string = 'ABCD'; for ($i=0, $len = strlen($string); $i <= $len; $i++){ echo "$string[$i] \n"; } 

Вышеприведенный пример будет генерировать ( онлайн-демонстрацию ):

 A B C D Notice: Uninitialized string offset: 4 in XXX on line X 

И как только скрипт заканчивает эхо D вы получите ошибку, потому что внутри цикла for() вы сказали PHP, чтобы показать вам от первого до пятого символа строки из 'ABCD' который существует, но поскольку цикл начинает отсчитываться от 0 и эхосигнала D к моменту достижения 4 , он выдает ошибку смещения.

Похожие ошибки:

  • Недопустимое смещение строки 'option 1'

Ошибка анализа: синтаксическая ошибка, неожиданная '['

Эта ошибка возникает в двух вариантах:

Вариант 1

 $arr = [1, 2, 3]; 

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

 $arr = array(1, 2, 3); 

См. Также этот пример из руководства.

Вариант 2

 $suffix = explode(',', 'foo,bar')[1]; 

Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам необходимо использовать временную переменную:

 $parts = explode(',', 'foo,bar'); $suffix = $parts[1]; 

См. Также этот пример из руководства.

Предупреждение: [function] ожидает, что параметр 1 будет ресурсом, boolean given

(Более общая вариация предупреждения: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, имеет значение boolean )

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

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

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

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

Когда var_dump ed, значения выглядят следующим образом:

 $resource = curl_init(); var_dump($resource); resource(1) of type (curl) 

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

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


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

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

Returns a file pointer resource on success, or FALSE on error.

So in this code, $fp will either be a resource(x) of type (stream) or false :

 $fp = fopen(...); 

If you do not check whether the fopen operation succeed or failed and hence whether $fp is a valid resource or false and pass $fp to another function which expects a resource, you may get the above error:

 $fp = fopen(...); $data = fread($fp, 1024); Warning: fread() expects parameter 1 to be resource, boolean given 

You always need to error check the return value of functions which are trying to allocate a resource and may fail :

 $fp = fopen(...); if (!$fp) { trigger_error('Failed to allocate resource'); exit; } $data = fread($fp, 1024); 

Related Errors:

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

Notice: Trying to get property of non-object error

Happens when you try to access a property of an object while there is no object.

A typical example for a non-object notice would be

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

In this case, $users is an array (so not an object) and it does not have any properties.

This is similar to accessing a non-existing index or key of an array (see Notice: Undefined Index ).

This example is much simplified. Most often such a notice signals an unchecked return value, eg when a library returns NULL if an object does not exists or just an unexpected non-object value (eg in an Xpath result, JSON structures with unexpected format, XML with unexpected format etc.) but the code does not check for such a condition.

As those non-objects are often processed further on, often a fatal-error happens next on calling an object method on a non-object (see: Fatal error: Call to a member function … on a non-object ) halting the script.

It can be easily prevented by checking for error conditions and/or that a variable matches an expectation. Here such a notice with a DOMXPath example:

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

The problem is accessing the nodeValue property (field) of the first item while it has not been checked if it exists or not in the $result collection. Instead it pays to make the code more explicit by assigning variables to the objects the code operates on:

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

Related errors:

  • Примечание. Неопределенный индекс
  • Fatal error: Call to a member function … on a non-object

Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .

Пример:

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

If you think the variable should be an array, see where it comes from and fix the problem there.

Code doesn't run/what looks like parts of my PHP code are output

If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?> tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.

To actually run your PHP scripts, you need:

  • a web server which executes your script
  • to set the file extension to .php, otherwise the web server won't interpret it as such*
  • to access your .php file via the web server

* Unless you reconfigure it, everything can be configured.

This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:

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

This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:

 http://localhost/my/file.php 

You may also want to check whether you're using short open tags <? instead of <?php and your PHP configuration has turned short open tags off.

Also see PHP code is not being executed, instead code shows on the page

Warning: mysql_connect(): Access denied for user 'name'@'host'

This warning shows up when you connect to a MySQL/MariaDB server with invalid or missing credentials (username/password). So this is typically not a code problem, but a server configuration issue.

  • See the manual page on mysql_connect("localhost", "user", "pw") for examples.

  • Check that you actually used a $username and $password .

    • It's uncommon that you gain access using no password – which is what happened when the Warning: said (using password: NO) .
    • Only the local test server usually allows to connect with username root , no password, and the test database name.

    • You can test if they're really correct using the command line client:
      mysql --user="username" --password="password" testdb

    • Username and password are case-sensitive and whitespace is not ignored. If your password contains meta characters like $ , escape them, or put the password in single quotes .

    • Most shared hosting providers predeclare mysql accounts in relation to the unix user account (sometimes just prefixes or extra numeric suffixes). See the docs for a pattern or documentation, and CPanel or whatever interface for setting a password.

    • See the MySQL manual on Adding user accounts using the command line. When connected as admin user you can issue a query like:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Or use Adminer or WorkBench or any other graphical tool to create, check or correct account details.

    • If you can't fix your credentials, then asking the internet to "please help" will have no effect. Only you and your hosting provider have permissions and sufficient access to diagnose and fix things.

  • Verify that you could reach the database server, using the host name given by your provider:
    ping dbserver.hoster.example.net

    • Check this from a SSH console directly on your webserver. Testing from your local development client to your shared hosting server is rarely meaningful.

    • Often you just want the server name to be "localhost" , which normally utilizes a local named socket when available. Othertimes you can try "127.0.0.1" as fallback.

    • Should your MySQL/MariaDB server listen on a different port, then use "servername:3306" .

    • If that fails, then there's a perhaps a firewall issue. (Off-topic, not a programming question. No remote guess-helping possible.)

  • When using constants like eg DB_USER or DB_PASSWORD , check that they're actually defined .

    • If you get a "Warning: Access defined for 'DB_USER'@'host'" and a "Notice: use of undefined constant 'DB_PASS'" , then that's your problem.

    • Verify that your eg xy/db-config.php was actually included and whatelse.

  • Check for correctly set GRANT permissions .

    • It's not sufficient to have a username + password pair.

    • Each MySQL/MariaDB account can have an attached set of permissions.

    • Those can restrict which databases you are allowed to connect to, from which client/server the connection may originate from, and which queries are permitted.

    • The "Access denied" warning thus may as well show up for mysql_query calls, if you don't have permissions to SELECT from a specific table, or INSERT / UPDATE , and more commonly DELETE anything.

    • You can adapt account permissions when connected per command line client using the admin account with a query like:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • If the warning shows up first with Warning: mysql_query(): Access denied for user ''@'localhost' then you may have a php.ini-preconfigured account/password pair .

    • Check that mysql.default_user= and mysql.default_password= have meaningful values.

    • Oftentimes this is a provider-configuration. So contact their support for mismatches.

  • Find the documentation of your shared hosting provider:

    • eg HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting , or just google yours´.

    • Else consult your webhosting provider through their support channels.

  • Note that you may also have depleted the available connection pool . You'll get access denied warnings for too many concurrent connections. (You have to investigate the setup. That's an off-topic server configuration issue, not a programming question.)

  • Your libmysql client version may not be compatible with the database server. Normally MySQL and MariaDB servers can be reached with PHPs compiled in driver. If you have a custom setup, or an outdated PHP version, and a much newer database server, or significantly outdated one – then the version mismatch may prevent connections. (No, you have to investigate yourself. Nobody can guess your setup).

More references:

  • Serverfault: mysql access denied for 'root'@'name of the computer'
  • Warning: mysql_connect(): Access denied
  • Warning: mysql_select_db() Access denied for user ''@'localhost' (using password: NO)
  • Access denied for user 'root'@'localhost' with PHPMyAdmin

Btw, you probably don't want to use mysql_* functions anymore . Newcomers often migrate to mysqli , which however is just as tedious. Instead read up on PDO and prepared statements .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

Notice: Array to string conversion

This simply happens if you try to treat an array as a string:

 $arr = array('foo', 'bar'); echo $arr; // Notice: Array to string conversion $str = 'Foo ' . $arr; // Notice: Array to string conversion 

An array cannot simply be echo 'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:

 echo $arr[0]; $str = 'Foo ' . join(', ', $arr); 

If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.

Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. Например:

 $value = @(2 / 0); 

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

 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 } 

Related Questions:

  • warning: division by zero
  • Warning: Division By Zero Working on PHP and MySQL
  • Division by zero error in WordPress Theme
  • How to suppress the “Division by zero” error
  • How to catch a division by zero?

Strict Standards: Non-static method [<class>::<method>] should not be called statically

Occurs when you try to call a non-static method on a class as it was static, and you also have the E_STRICT flag in your error_reporting() settings.

Пример :

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

HTML::br() or $html::br()

You can actually avoid this error by not adding E_STRICT to error_reporting() , eg

 error_reporting(E_ALL & ~E_STRICT); 

since as for PHP 5.4.0 and above, E_STRICT is included in E_ALL [ ref ]. But that is not adviceable. The solution is to define your intended static function as actual static :

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

or call the function conventionally :

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

Related questions :

  • How can I solve "Non-static method xxx:xxx() should not be called statically in PHP 5.4?

Fatal error: [TraitA] and [TraitB] define the same property ([$x]) in the composition of [ClassC]

Occurs when a class attempts to use multiple Traits , where two or more of those Traits have defined a property by the same name, and with the property having differing initial values.

Пример:

 <?php trait TraitA { public $x = 'a'; } trait TraitB { public $x = 'b'; } class ClassC { use TraitA, TraitB; } 

Problematic: While it's possible to resolve conflicts between competing methods , there is currently no syntax that would resolve a conflict between two competing properties. The only solution at this time is to refactor ; ie, avoid a conflict between property names that produces a fatal error.


Related Questions:

  • PHP Traits: How to resolve a property name conflict?
  • Traits – property conflict with parent class