Что это?
Это ряд ответов о предупреждениях, ошибках и уведомлениях, с которыми вы можете столкнуться при программировании PHP, и не знаете, как их исправить. Это также Вики Сообщества, поэтому каждый может принять участие, добавляя и поддерживая этот список.
Почему это?
Такие вопросы, как «Заголовки уже отправлены» или «Вызов члена необъекта» , часто появляются при переполнении стека. Коренная причина этих вопросов всегда одна и та же. Таким образом, ответы на эти вопросы, как правило, повторяют их, а затем показывают ОП, какую строку изменить в их конкретном случае. Эти ответы не добавляют никакой ценности сайту, поскольку они применяются только к определенному коду ОП. Другие пользователи, имеющие ту же ошибку, не могут легко прочитать решение из нее, потому что они слишком локализованы. Это печально, потому что, как только вы поняли основную причину, исправить ошибку - тривиально. Следовательно, этот список пытается объяснить решение в общем виде для применения.
Что мне здесь делать?
Если ваш вопрос был помечен как дубликат этого вопроса, найдите ваше сообщение об ошибке ниже и примените исправление к своему коду. Ответы обычно содержат дополнительные ссылки для расследования в случае, если это не должно быть ясно только из общего ответа.
Если вы хотите внести свой вклад, пожалуйста, добавьте свое «любимое» сообщение об ошибке, предупреждение или уведомление, по одному на ответ, краткое описание, что оно означает (даже если оно только выделяет термины на их странице руководства), возможное решение или подход отладки и список существующих вопросов и ответов, которые имеют значение. Кроме того, не стесняйтесь улучшать любые существующие ответы.
Список
- Ничего не видно Страница пустая и белая. (также известный как Белая Страница / Экран Смерти )
- Код не запускается / похоже, выводятся части моего кода PHP
- Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
- Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, логическое значение, известное как aka
Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL aka
Предупреждение: 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 - внутренняя ошибка сервера
- Устаревший: Синтаксис доступа к массиву и смещению строк с помощью фигурных скобок не рекомендуется
Также см:
Ответы:
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
Происходит, когда ваш скрипт пытается отправить HTTP-заголовок клиенту, но ранее он уже выводился, что привело к тому, что заголовки уже отправлялись клиенту.
Это
E_WARNING
и не остановит сценарий.Типичным примером будет файл шаблона, подобный этому:
session_start()
Функция попытается отправить заголовки с куки сессии для клиента. Но PHP уже отправлял заголовки, когда записывал<html>
элемент в выходной поток. Вы должны были бы переместитьsession_start()
наверх.Вы можете решить эту проблему, пройдя строки перед кодом, вызывающим предупреждение, и проверьте, где он выводит. Переместите любой код отправки заголовка перед этим кодом.
Часто пропускаемый вывод - это новые строки после закрытия PHP
?>
. Это считается стандартной практикой,?>
когда опускается, когда это последняя вещь в файле. Аналогичным образом, другой распространенной причиной этого предупреждения является то, что перед открытием<?php
стоит пустой пробел, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / символ новой строки, поэтому при запуске синтаксического анализа PHP не сможет отправить любой заголовок.Если в вашем файле более одного
<?php ... ?>
блока кода, между ними не должно быть пробелов. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически создан)Также убедитесь, что в вашем коде нет меток порядка следования байтов, например, когда код сценария UTF-8 с спецификацией.
Смежные вопросы:
источник
<?php ?>
и будет ли «более одного блока»<?php ?> <?php ?>
?Неустранимая ошибка: вызов функции-члена ... для необъекта
Происходит с кодом, похожим на
xyz->method()
гдеxyz
не является объектом и, следовательно,method
это не может быть вызвано.Это фатальная ошибка, которая приводит к остановке скрипта (уведомление о прямой совместимости: это станет исправимой ошибкой начиная с PHP 7).
Чаще всего это признак того, что в коде отсутствуют проверки на наличие ошибок. Проверьте, что объект на самом деле является объектом, прежде чем вызывать его методы.
Типичный пример может быть
В приведенном выше примере, запрос не может быть подготовлен и
prepare()
назначитfalse
к$statement
. Попытка вызоваexecute()
метода приведет к фатальной ошибке, потому чтоfalse
это «не объект», потому что значение является логическим.Выясните, почему ваша функция вернула логическое значение вместо объекта. Например, проверьте
$pdo
объект на наличие последней ошибки. Детали того, как отладить это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.Если даже
->prepare
происходит сбой, то ваш$pdo
объект дескриптора базы данных не был передан в текущий контекст . Найдите, где это было определено. Затем передайте его как параметр, сохраните как свойство или поделитесь им через глобальную область видимости.Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например
При попытке выполнить метод вне условного блока ваш объект может быть не определен.
Смежные вопросы:
источник
Ничего не видно Страница пустая и белая.
Также известный как Белая Страница Смерти или Белый Экран Смерти . Это происходит, когда сообщение об ошибке отключено и произошла фатальная ошибка (часто синтаксическая ошибка).
Если у вас включено ведение журнала ошибок, вы найдете конкретное сообщение об ошибке в вашем журнале ошибок. Обычно это будет файл с именем «php_errors.log», либо в центральном месте (например,
/var/log/apache2
во многих средах Linux), либо в каталоге самого сценария (иногда используется в среде общего хостинга).Иногда может быть проще временно включить отображение ошибок. На белой странице появится сообщение об ошибке. Будьте осторожны, потому что эти ошибки видны всем, кто посещает сайт.
Это легко сделать, добавив вверху скрипта следующий код PHP:
Код включит отображение ошибок и установит отчетность на самом высоком уровне.
Поскольку
ini_set()
выполняется во время выполнения, это не влияет на синтаксические ошибки / синтаксические ошибки. Эти ошибки появятся в журнале. Если вы также хотите отобразить их в выводе (например, в браузере), вы должны установитьdisplay_startup_errors
директиву наtrue
. Сделайте это вphp.ini
или в.htaccess
или любым другим способом, который влияет на конфигурацию до времени выполнения .Вы можете использовать те же методы для установки директив log_errors и error_log, чтобы выбрать свое местоположение файла журнала.
Просматривая журнал или используя дисплей, вы получите гораздо лучшее сообщение об ошибке и строку кода, где ваш скрипт останавливается.
Смежные вопросы:
Связанные ошибки:
источник
error_reporting(~0);
почему нет-1
? Это то, что~0
оценивает, и гораздо менее загадочно.~0
Более явно IMO: отменить набор пустых битов, т.е. включить все флаги. -1 не означает «не найден», как в strpos () в C, но как битовый набор со всеми установленными флагами, потому что -1 является двоичным1111'1111'1111'1111
(для 32 бит).1111'1111'1111'1111
это действительно 16 бит, но я надеюсь, вы понимаете, о чем я.E_STRICT
не входит вE_ALL
. php.net/manual/en/errorfunc.constants.php и прокрутите вниз доE_STRICT
.Примечание: неопределенный индекс
Происходит при попытке доступа к массиву по ключу, который не существует в массиве.
Типичным примером
Undefined Index
уведомления будет ( демо )И то,
spinach
и другое1
не существует в массиве, вызываяE_NOTICE
срабатывание.Решение состоит в том, чтобы убедиться, что индекс или смещение существует до доступа к этому индексу. Это может означать, что вам нужно исправить ошибку в вашей программе, чтобы гарантировать, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью
array_key_exists
илиisset
:Если у вас есть такой код:
то
$_POST['message']
не будет установлен при первой загрузке этой страницы, и вы получите вышеуказанную ошибку. Индекс массива будет существовать только после отправки формы и повторного запуска этого кода. Вы обычно проверяете это с помощью:Смежные вопросы:
источник
if(!empty($_POST['message'])){ //do stuff }
Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение
В первую очередь:
Это происходит, когда вы пытаетесь получить данные из результата,
mysql_query
но запрос не выполнен.Это предупреждение, которое не остановит сценарий, но сделает вашу программу неправильной.
Вам необходимо проверить результат , возвращаемый
mysql_query
поСмежные вопросы:
Связанные ошибки:
Другие
mysql*
функции, которые также ожидают результирующий ресурс MySQL в качестве параметра, будут вызывать ту же ошибку по той же причине.источник
mysql_query
не достаточно плохо, добавлениеor die
сверху это добавляет оскорбление раны.$res = mysql_query($query)
возвращает 1, если запрос выполнен успешно, поэтому он считается верным. Поэтому при переходе результатаmysql_query
вmysql_fetch_array()
к уведомлению шоу.mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
см. - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Любое предложение, чтобы избавиться от этой ошибки?mysql_fetch_array()
для запроса выбора, для вставки и обновления, вам не нужно извлекать набор результатов (и нет никакого набора результатов, позволяющего получить).Неустранимая ошибка: использование $ this, когда не в контексте объекта
$this
это специальная переменная в PHP, которая не может быть назначена. Если к нему обращаются в контексте, где это не существует, эта фатальная ошибка дана.Эта ошибка может произойти:
Если нестатический метод вызывается статически. Пример:
Как исправить: пересмотрите свой код еще раз,
$this
можно использовать только в контексте объекта и никогда не использовать в статическом методе. Кроме того, статический метод не должен обращаться к нестатическому свойству. Используйтеself::$static_property
для доступа к статическому свойству.Если код из метода класса был скопирован в обычную функцию или просто в глобальную область видимости с сохранением
$this
специальной переменной.Как исправить: Просмотрите код и замените его
$this
на другую переменную подстановки.Смежные вопросы:
источник
$closure = function() { self::method(); }
.$this
вы можете вызвать$closure = function() { $this->method(); };
Неустранимая ошибка: вызов неопределенной функции XXX
Происходит при попытке вызвать функцию, которая еще не определена. Распространенные причины включают отсутствующие расширения и включения, объявление условной функции, функцию в объявлении функции или простые опечатки.
Пример 1 - Объявление условной функции
В этом случае
fn()
никогда не будет объявлено, потому что$someCondition
это не так.Пример 2 - функция в объявлении функции
В этом случае
fn
будет объявлено только послеcreateFn()
вызова. Обратите внимание, что последующие вызовыcreateFn()
вызовут ошибку об объявлении существующей функции.Вы также можете увидеть это для встроенной функции PHP. Попробуйте найти функцию в официальном руководстве и проверьте, к какому «расширению» (модулю PHP) она относится и какие версии PHP ее поддерживают.
В случае отсутствия расширения установите это расширение и включите его в php.ini. Обратитесь к инструкции по установке в руководстве по PHP, чтобы узнать
apt
,yum
в каком расширении отображается ваша функция. Вы также можете включить или установить расширение, используя менеджер пакетов (например, в Debian или Ubuntu, в Red Hat или CentOS) или панель управления. в среде общего хостинга.Если функция была введена в более новой версии PHP из того, что вы используете, вы можете найти ссылки на альтернативные реализации в руководстве или его разделе комментариев. Если он был удален из PHP, поищите информацию о том, почему, поскольку в этом больше нет необходимости.
В случае отсутствия включений обязательно включите файл, объявляющий функцию, прежде чем вызывать функцию.
В случае опечаток, исправьте опечатку.
Смежные вопросы:
источник
Ошибка разбора: синтаксическая ошибка, неожиданный T_XXX
Бывает когда у тебя
T_XXX
токен в неожиданном месте, несбалансированные (лишние) скобки, использование короткого тега без его активации в php.ini и многое другое.Смежные вопросы:
Для дальнейшей помощи смотрите:
источник
Неустранимая ошибка: невозможно использовать возвращаемое значение функции в контексте записи
Обычно это происходит при использовании функции непосредственно с
empty
.Пример:
Это связано с тем, что
empty
это языковая конструкция, а не функция, ее нельзя вызывать с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент toempty()
должен быть переменной , но в PHP 5.5+ допускается произвольное выражение (например, возвращаемое значение функции).empty
несмотря на свое имя, фактически не проверяет, является ли переменная «пустой». Вместо этого он проверяет, существует ли переменная или== false
. Выражения (какis_null(null)
в примере) всегда будут считаться существующими, поэтому здесьempty
проверяется только, равно ли оно ложному. Вы можете заменитьempty()
здесь!
, напримерif (!is_null(null))
, или явно сравнить с ложным, напримерif (is_null(null) == false)
.Смежные вопросы:
источник
MySQL: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом ... в строке ...
Эта ошибка часто возникает из-за того, что вы забыли правильно экранировать данные, переданные в запрос MySQL.
Пример того, чего не следует делать («Плохая идея»):
Этот код может быть включен в страницу с формой для отправки, с URL-адресом, таким как http://example.com/edit.php?id=10 (для редактирования сообщения № 10)
Что произойдет, если представленный текст содержит одинарные кавычки?
$query
закончится с:И когда этот запрос отправляется в MySQL, он будет жаловаться на неправильный синтаксис, потому что в середине есть лишняя одинарная кавычка.
Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда экранировать данные перед использованием в запросе.
Экранирование данных перед использованием в запросе SQL также очень важно, потому что если вы этого не сделаете, ваш скрипт будет открыт для инъекций SQL. Внедрение SQL может привести к изменению, потере или модификации записи, таблицы или всей базы данных. Это очень серьезная проблема безопасности!
Документация:
mysql_real_escape_string()
mysqli_real_escape_string()
источник
Неустранимая ошибка: допустимый объем памяти в XXX байтов исчерпан (попытался выделить XXX байтов)
Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и прекращает его выполнение. Эта ошибка является фатальной, скрипт останавливается. Значение предела памяти можно настроить либо в
php.ini
файле, либо с помощьюini_set('memory_limit', '128 M');
скрипта (который перезапишет значение, определенное вphp.ini
). Цель ограничения памяти - не допустить, чтобы один скрипт PHP сожрал всю доступную память и отключил весь веб-сервер.Первое, что нужно сделать, это минимизировать объем памяти, необходимый вашему скрипту. Например, если вы читаете большой файл в переменную или извлекаете много записей из базы данных и сохраняете их все в массиве, это может занять много памяти. Измените свой код, чтобы вместо этого читать файл построчно или извлекать записи базы данных по одной, не сохраняя их все в памяти. Это требует некоторой концептуальной осведомленности о том, что происходит за кулисами и когда данные хранятся в памяти по сравнению с другими.
Если эта ошибка произошла, когда ваш скрипт не выполнял работу, интенсивно использующую память, вам нужно проверить код, чтобы увидеть, есть ли утечка памяти.
memory_get_usage
Функция является вашим другом.Смежные вопросы:
источник
Ошибка разбора: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE
Эта ошибка чаще всего встречается при попытке обратиться к значению массива с ключом в кавычках для интерполяции внутри строки в двойных кавычках, когда вся конструкция сложной переменной не заключена в
{}
.Случай ошибки:
Это приведет к
Unexpected T_ENCAPSED_AND_WHITESPACE
:Возможные исправления:
В строке в двойных кавычках PHP разрешает использовать строки ключей массива без кавычек и не выдает
E_NOTICE
. Таким образом, вышесказанное можно записать так:Вся переменная комплексного массива и ключ (и) могут быть заключены в
{}
, в этом случае они должны быть заключены в кавычки, чтобы избежатьE_NOTICE
. Документация PHP рекомендует этот синтаксис для сложных переменных.Конечно, альтернативой любому из вышеперечисленного является объединение переменной массива вместо ее интерполяции:
Для справки, смотрите раздел Variable Разбор в странице PHP Струны вручную
источник
Предупреждение: [функция] : не удалось открыть поток: [причина]
Это происходит при вызове файла обычно
include
,require
илиfopen
и PHP не может найти файл или не иметь достаточно прав для загрузки файла.Это может произойти по разным причинам:
Одна распространенная ошибка - не использовать абсолютный путь. Это можно легко решить, используя полный путь или магические константы, такие как
__DIR__
илиdirname(__FILE__)
:или:
Использование правильного пути - это один из шагов по устранению этих проблем, это также может быть связано с несуществующими файлами, правами файловой системы, препятствующими доступу, или ограничениями open basedir самим PHP.
Лучший способ быстро решить эту проблему - следовать приведенному ниже контрольному списку устранения неполадок.
Смежные вопросы:
Связанные ошибки:
источник
Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM
Оператор разрешения контекста также называется "Paamayim Nekudotayim" с иврита פעמיים נקודתיים. что означает "двойное двоеточие".
Эта ошибка обычно возникает, если вы случайно добавили
::
свой код.Смежные вопросы:
Документация:
источник
a()::b;
или$a=::;
.Примечание: использование неопределенной константы XXX - предполагается, что XXX
или в PHP 7.2 или более поздней версии:
Предупреждение: использование неопределенной константы XXX - предполагается «XXX» (это приведет к ошибке в будущей версии PHP)
Это уведомление появляется, когда токен используется в коде и выглядит как константа, но константа с таким именем не определена.
Одной из наиболее распространенных причин этого уведомления является неспособность заключить в кавычки строку, используемую в качестве ключа ассоциативного массива.
Например:
Другой распространенной причиной является отсутствие
$
знака (доллара) перед именем переменной:Или, возможно, вы неправильно написали какую-то другую константу или ключевое слово:
Это также может быть признаком отсутствия необходимого расширения или библиотеки PHP при попытке доступа к константе, определенной этой библиотекой.
Смежные вопросы:
источник
Неустранимая ошибка: невозможно переопределить класс [имя класса]
Неустранимая ошибка: невозможно переопределить [имя функции]
Это означает, что вы либо используете одно и то же имя функции / класса дважды и должны переименовать одно из них, либо это потому, что вы использовали
require
илиinclude
там, где вы должны использовать,require_once
илиinclude_once
.Когда класс или функция объявляются в PHP, они неизменны и не могут быть позже объявлены с новым значением.
Рассмотрим следующий код:
class.php
index.php
Второй вызов to
do_stuff()
выдаст ошибку выше. Изменяяrequire
наrequire_once
, мы можем быть уверены, что файл, содержащий определение,MyClass
будет загружен только один раз, и ошибка будет исключена.источник
Примечание: неопределенная переменная
Случается, когда вы пытаетесь использовать переменную, которая не была определена ранее.
Типичным примером будет
Если вы не определили
$counter
ранее, приведенный выше код вызовет уведомление.Правильный способ будет установить переменную перед ее использованием, даже если это просто пустая строка, как
Примечание: неопределенное свойство
Эта ошибка означает то же самое, но относится к свойству объекта. Повторное использование приведенного выше примера приводит к появлению ошибки, поскольку
counter
свойство не установлено.Смежные вопросы:
источник
Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE
Возможный сценарий
Я не могу найти, где мой код пошел не так. Вот моя полная ошибка:
Что я пытаюсь
Ответ
Ошибка синтаксического анализа: проблема с синтаксисом вашей программы, такая как отсутствие точки с запятой в конце оператора или, как в случае выше, отсутствие пропуска
.
оператора. Интерпретатор прекращает запуск вашей программы, когда он сталкивается с ошибкой разбора.Проще говоря, это синтаксическая ошибка, означающая, что в вашем коде есть что-то, что мешает его правильно проанализировать и, следовательно, запустить.
Что ты должен делать это внимательно проверить строки, где ошибка для любых простых ошибок.
Это сообщение об ошибке означает, что в строке x файла интерпретатор PHP ожидал увидеть открытую скобку, но вместо этого он обнаружил нечто вызываемое
T_VARIABLE
. ЭтаT_VARIABLE
вещь называетсяtoken
. Это способ интерпретации PHP различных основных частей программ. Когда переводчик читает в программе, он переводит то, что вы написали, в список токенов. Где бы вы ни поместили переменную в вашу программу,T_VARIABLE
в списке интерпретатора есть токен.Полезное чтение: список токенов парсера
Поэтому убедитесь, что вы включите хотя бы
E_PARSE
в свойphp.ini
. Ошибки разбора не должны существовать в производственных скриптах.Я всегда рекомендовал добавлять следующее утверждение при кодировании:
Отчеты об ошибках PHP
Кроме того, хорошая идея использовать IDE, которая позволит вам знать об ошибках разбора при наборе текста. Ты можешь использовать:
Смежные вопросы:
источник
Примечание: смещение неинициализированной строки:
*
Как видно из названия, такой тип ошибки возникает, когда вы, скорее всего, пытаетесь выполнить итерацию или найти значение в массиве с несуществующим ключом.
Считайте, что вы пытаетесь показать каждое письмо от
$string
Приведенный выше пример сгенерирует ( онлайн демо ):
И, как только сценарий завершит эхо,
D
вы получите ошибку, потому что внутриfor()
цикла вы сказали PHP показать вам строку с первой по пятую строку, из'ABCD'
которой существует, но поскольку цикл начинает считать0
и повторяетD
к тому времени, когда он достигнет4
, он выдаст ошибку смещения.Подобные ошибки:
источник
Примечание: попытка получить свойство ошибки необъекта
Происходит при попытке получить доступ к свойству объекта, когда объекта нет.
Типичным примером уведомления об отсутствии объекта будет
В данном случае
$users
это массив (то есть не объект), и он не имеет никаких свойств.Это похоже на доступ к несуществующему индексу или ключу массива (см. Примечание: неопределенный индекс ).
Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует о непроверенном возвращаемом значении, например, когда библиотека возвращает,
NULL
если объект не существует или просто неожиданное не-объектное значение (например, в результате Xpath, структурах JSON с неожиданным форматом, XML с неожиданным форматом и т. Д.) но код не проверяет наличие такого условия.Поскольку эти не-объекты часто обрабатываются в дальнейшем, часто происходит фатальная ошибка при вызове метода объекта для не-объекта (см .: Неустранимая ошибка: вызов функции-члена ... для не-объекта ) с остановкой скрипт.
Это можно легко предотвратить, проверив наличие ошибок и / или соответствие переменной ожиданиям. Вот такое уведомление с примером DOMXPath :
Проблема заключается в доступе к
nodeValue
свойству (полю) первого элемента, пока он не был проверен, существует ли он в$result
коллекции. Вместо этого стоит сделать код более явным, назначив переменные объектам, над которыми работает код:Связанные ошибки:
источник
json_decode
теперь возвращает экземплярstdclass
по умолчанию, поэтому пример кода будет работать.json_decode
теперь возвращает экземплярstdclass
по умолчанию» ? Я не могу найти это в журнале изменений.assoc
параметр имеет значение false. Этот параметр определяет, возвращает ли функцияstdclass
вместо ассоциативного массива.json_decode('[{"name": "hakre"}]', true)
вернет массив, в противном случаеstdclass
объектПредупреждение: действует ограничение open_basedir
Это предупреждение может появляться с различными функциями, связанными с доступом к файлам и каталогам. Он предупреждает о проблеме конфигурации.
Когда это появляется, это означает, что доступ к некоторым файлам был запрещен.
Само предупреждение ничего не нарушает, но чаще всего скрипт не работает должным образом, если доступ к файлу запрещен.
Исправление обычно заключается в изменении конфигурации PHP , называется соответствующий параметр
open_basedir
.Иногда используются неправильные имена файлов или каталогов, исправление заключается в использовании правильных.
Смежные вопросы:
источник
Ошибка разбора: синтаксическая ошибка, неожиданное '['
Эта ошибка встречается в двух вариантах:
Вариация 1
Этот синтаксис инициализатора массива был введен только в PHP 5.4; это вызовет ошибку парсера на версиях до этого. Если возможно, обновите установку или используйте старый синтаксис:
Смотрите также этот пример из руководства.
Вариация 2
Результаты разыменования массива также были введены в PHP 5.4. Если обновление невозможно, необходимо использовать (временную) переменную:
Смотрите также этот пример из руководства.
источник
Предупреждение: [функция] ожидает, что параметр 1 будет ресурсом, учитывая логическое значение
(Более общий вариант Warning: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение )
Ресурсы являются типом в PHP (например, строки, целые числа или объекты). Ресурс - это непрозрачный блоб, не имеющий собственной значимой ценности. Ресурс является специфическим и определяется определенным набором функций или расширений PHP. Например, расширение Mysql определяет два типа ресурсов :
Расширение cURL определяет еще два типа ресурсов :
Когда
var_dump
ed, значения выглядят так:Это все, что большинство ресурсов, числовой идентификатор (
(1)
) определенного типа ((curl)
).Вы носите эти ресурсы и передаете их различным функциям, для которых такой ресурс что-то значит. Обычно эти функции распределяют определенные данные в фоновом режиме, а ресурс - это просто ссылка, которую они используют для внутреннего отслеживания этих данных.
Ошибка « ... ожидает, что параметр 1 будет ресурсом, логическим заданием », как правило, является результатом неконтролируемой операции, которая должна была создать ресурс, но
false
вместо этого была возвращена . Например,fopen
функция имеет это описание:Так что в этом коде,
$fp
или будет ,resource(x) of type (stream)
илиfalse
:Если вы не проверяете, была ли
fopen
операция успешной или неудачной и, следовательно,$fp
является ли она допустимым ресурсом,false
и переходите$fp
к другой функции, которая ожидает ресурс, вы можете получить вышеуказанную ошибку:Вам всегда нужно проверять возвращаемое значение функций, которые пытаются выделить ресурс и могут потерпеть неудачу :
Связанные ошибки:
источник
Предупреждение: недопустимое смещение строки 'XXX'
Это происходит, когда вы пытаетесь получить доступ к элементу массива с синтаксисом в квадратных скобках, но вы делаете это со строкой, а не с массивом, поэтому операция явно не имеет смысла .
Пример:
Если вы думаете, что переменная должна быть массивом, посмотрите, откуда она берется, и устраните проблему там.
источник
Код не запускается / похоже, выводятся части моего кода PHP
Если вы не видите результатов из своего PHP-кода и / или вы видите части вашего буквального исходного кода PHP, выводимого на веб-странице, вы можете быть почти уверены, что ваш PHP фактически не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный файл PHP как есть. Поскольку код PHP встроен в
<?php ?>
теги, браузер попытается интерпретировать их как теги HTML, и результат может выглядеть несколько запутанным.Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:
* Если вы не перенастроите его, все может быть настроено.
Последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:
Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:
Вы также можете проверить , используете ли вы короткие открытые теги
<?
вместо<?php
и конфигурация PHP получился короткие открытые теги прочь.Также посмотрите, что PHP-код не выполняется, вместо этого код отображается на странице
источник
Предупреждение: 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
проверьте, что они на самом деле определены .Если вы получаете
"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=
имейте значимые значения.Часто это конфигурация провайдера. Так что свяжитесь с их поддержкой для несоответствий.
Найдите документацию вашего провайдера виртуального хостинга:
например, HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting или просто Google your´´.
Еще проконсультируйтесь с вашим провайдером веб-хостинга через их каналы поддержки.
Обратите внимание, что вы, возможно, также исчерпали доступный пул соединений . Вы получите предупреждения об отказе в доступе для слишком большого количества одновременных соединений. (Вы должны исследовать установку. Это неконтролируемая проблема конфигурации сервера, а не вопрос программирования.)
Ваша версия клиента libmysql может быть несовместима с сервером базы данных. Обычно к серверам MySQL и MariaDB можно обращаться с помощью PHP, скомпилированных в драйвере. Если у вас есть пользовательская установка, или устаревшая версия PHP, и гораздо более новый сервер баз данных, или значительно устаревший сервер - тогда несовпадение версий может помешать соединениям. (Нет, вы должны исследовать себя. Никто не может угадать ваши настройки).
Больше ссылок:
источник
Примечание: преобразование массива в строку
Это просто происходит, если вы пытаетесь рассматривать массив как строку:
Массив не может быть просто
echo
'd' или конкатенирован со строкой, потому что результат не очень хорошо определен. PHP будет использовать строку «Массив» вместо массива и инициировать уведомление, чтобы указать, что это, вероятно, не то, что было задумано, и что вы должны проверять свой код здесь. Вы, вероятно, хотите что-то вроде этого:Или зациклить массив:
Если это уведомление появляется где-то, чего вы не ожидаете, это означает, что переменная, которую вы считаете строкой, на самом деле является массивом. Это означает, что в вашем коде есть ошибка, которая делает эту переменную массивом вместо ожидаемой строки.
источник
Предупреждение: деление на ноль
Предупреждающее сообщение «Деление на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не приведет к исключению, поэтому некоторые разработчики будут иногда подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:
Но, как и в случае любого предупреждения, наилучшим подходом было бы отследить причину предупреждения и устранить ее. Причиной предупреждения будет любой случай, когда вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (потому что NULL == 0), потому что результат будет 'неопределенным'.
Чтобы исправить это предупреждение, вам следует переписать выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы либо не должны делить, либо вы должны изменить значение на 1, а затем разделить так, чтобы деление приводило к эквиваленту деления только на дополнительную переменную.
Смежные вопросы:
источник
$var1
делает == 0, то вы можете просто установить$var3
на$var2
. Даже если этого не сделать, остальное вообще не нужно, так как назначение в обоих случаях одинаковое, поэтому не надо и назначайте за пределамиif
Строгие стандарты: нестатический метод [<class> :: <method>] не должен вызываться статически
Происходит, когда вы пытаетесь вызвать нестатический метод в классе, поскольку он был статическим, и у вас также есть
E_STRICT
флаг в вашемerror_reporting()
настройках.Пример :
HTML::br()
или$html::br()
Вы действительно можете избежать этой ошибки, не добавляя
E_STRICT
кerror_reporting()
, например ,поскольку, как для PHP 5.4.0 и выше,
E_STRICT
включен вE_ALL
[ ref ]. Но это не рекомендуется. Решение состоит в том, чтобы определить вашу предполагаемую статическую функцию как актуальнуюstatic
:или вызовите функцию условно:
Смежные вопросы:
источник
Устаревший: Синтаксис доступа к массиву и смещению строк с помощью фигурных скобок не рекомендуется
Смещение строк и элементы массива могут быть доступны с помощью фигурных скобок
{}
до PHP 7.4.0:Это устарело с PHP 7.4.0 и генерирует предупреждение:
Вы должны использовать квадратные скобки
[]
для доступа к смещению строк и элементам массива:RFC этого изменения ссылок на PHP скрипт , который пытается исправить это механически.
источник