Это несколько ответов о предупреждениях, ошибках и уведомлениях, которые могут возникнуть при программировании PHP, и не имеют понятия, как исправить. Это также Community Wiki, поэтому всем предлагается участвовать в добавлении и обслуживании этого списка.
На Stack Overflow часто появляются такие вопросы, как «Заголовки, уже отправленные» или «Вызов члена не объекта» . Основная причина этих вопросов всегда одна и та же. Таким образом, ответы на эти вопросы обычно повторяют их, а затем показывают OP, какая линия изменяется в его / ее конкретном случае. Эти ответы не добавляют никакого значения сайту, поскольку они применяются только к конкретному коду OP. Другие пользователи, имеющие одну и ту же ошибку, не могут легко прочитать решение, потому что они слишком локализованы. Это печально, потому что, как только вы поняли основную причину, исправление ошибки тривиально. Следовательно, этот список пытается объяснить решение в общем виде.
Если ваш вопрос был отмечен как дубликат этого, пожалуйста, найдите приведенное ниже сообщение об ошибке и примените исправление к вашему коду. Ответы обычно содержат дополнительные ссылки для расследования, если это не должно быть ясно из общего ответа.
Если вы хотите внести свой вклад, добавьте свое «любимое» сообщение об ошибке, предупреждение или уведомление, по одному на ответ, краткое описание, что это означает (даже если это только подчеркивание терминов на их странице руководства), возможное решение или отладочный подход и список существующих вопросов и ответов, которые имеют значение. Кроме того, не стесняйтесь улучшать любые существующие ответы.
Также см
Случается, когда ваш скрипт пытается отправить 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.
Связанные вопросы:
Бывает с кодом, похожим на 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_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, чтобы выбрать собственное местоположение файла журнала.
Глядя в журнал или используя дисплей, вы получите гораздо лучшее сообщение об ошибке и строку кода, где ваш скрипт останавливается.
Связанные вопросы:
Связанные ошибки:
Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.
Типичным примером для уведомления о 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
Связанные вопросы:
Прежде всего:
Пожалуйста, не используйте функции
mysql_*
в новом коде . Они больше не поддерживаются и официально устарели . См. Красную рамку ? Узнайте о подготовленных инструкциях и используйте PDO или MySQLi – эта статья поможет вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .
Это происходит, когда вы пытаетесь извлечь данные из результата mysql_query
но запрос не удался.
Это предупреждение и не остановит скрипт, но сделает вашу программу неправильной.
Вы должны проверить результат, возвращаемый mysql_query
по
$res = mysql_query($sql); if (!$res) { die(mysql_error()); } // after checking, do the fetch
Связанные вопросы:
Связанные ошибки:
Другие функции mysql*
которые также ожидают, что ресурс результата mysql в качестве параметра приведет к той же ошибке по той же причине.
$this
специальная переменная в PHP, которая не может быть назначена. Если он доступен в контексте, где он не существует, эта фатальная ошибка дается.
Эта ошибка может произойти:
Если нестатический метод называется статическим. Пример:
class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar();
Как исправить: снова просмотрите свой код, $this
может использоваться только в контексте объекта и никогда не должен использоваться в статическом методе. Кроме того, статический метод не должен обращаться к нестатистическому свойству. Используйте self::$static_property
для доступа к статическому свойству.
Если код из метода класса был скопирован в нормальную функцию или только глобальную область и сохранил $this
специальную переменную $this
.
Как исправить: просмотрите код и замените $this
на другую переменную замещения.
Связанные вопросы:
Случается, когда в неожиданном месте есть токен T_XXX
, несбалансированные (лишние) круглые скобки, использование короткого тега без активации его в php.ini и многие другие.
Связанные вопросы:
Для получения дополнительной помощи см .:
Случается, когда вы пытаетесь вызвать функцию, которая еще не определена. Общие причины включают в себя отсутствие расширений и включает в себя объявление условной функции, функцию в объявлении функции или простые опечатки.
Пример 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-запрос.
Пример того, что не делать («Плохая идея»):
$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-инъекция может привести к изменению, потере или изменению записи, таблицы или всей базы данных. Это очень серьезная проблема безопасности!
Документация:
mysql_real_escape_string()
mysqli_real_escape_string()
Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini
либо с помощью ini_set('memory_limit', '128 M');
в скрипте (который перезапишет значение, определенное в php.ini
). Целью ограничения памяти является предотвращение того, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.
Первое, что нужно сделать, это свести к минимуму объем памяти, необходимый вашему сценарию. Например, если вы читаете большой файл в переменной или извлекаете много записей из базы данных и сохраняете их все в массиве, которые могут использовать много памяти. Измените свой код, чтобы вместо этого читать строки по строке или извлекать записи базы данных по одному, не сохраняя их все в памяти. Это требует немного концептуального понимания того, что происходит за кулисами, и когда данные хранятся в памяти и в других местах.
Если эта ошибка возникла, когда ваш сценарий не выполнял интенсивную работу с памятью, вам нужно проверить свой код, чтобы узнать, есть ли утечка памяти. Функция memory_get_usage
– ваш друг.
Связанные вопросы:
Эта ошибка чаще всего встречается при попытке ссылаться на значение массива с цитируемым ключом для интерполяции внутри строки с двумя кавычками, когда вся сложная конструктивная переменная не заключена в {}
.
Это приведет к 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
Оператор разрешения области также называется «Paamayim Nekudotayim» с иврита פעמיים נקודתיים. что означает «двойная двоеточие» или «двойная точка дважды».
Эта ошибка обычно возникает, если вы случайно поместите ::
в свой код.
Связанные вопросы:
Документация:
Это означает, что вы либо используете одно и то же имя функции / класса дважды, и вам нужно переименовать один из них, или это потому, что вы использовали 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++; }
Связанные вопросы:
Это уведомление возникает, когда токен используется в коде и представляется константой, но константа с этим именем не определена.
Одной из наиболее распространенных причин этого уведомления является неспособность указать строку, используемую как ключ ассоциативного массива.
Например:
// Wrong echo $array[key]; // Right echo $array['key'];
Другими распространенными причинами является отсутствие знака $
(доллара) перед именем переменной:
// Wrong echo varName; // Right echo $varName;
Это также может быть признаком отсутствия необходимого расширения или библиотеки PHP при попытке доступа к константе, определенной этой библиотекой.
Связанные вопросы:
Это происходит, когда вы вызываете файл обычно с помощью include
, require
или fopen
и PHP не может найти файл или не имеет достаточного разрешения на загрузку файла.
Это может произойти по разным причинам:
Одна из распространенных ошибок заключается в том, чтобы не использовать абсолютный путь. Это можно легко решить, используя полный путь или магические константы, такие как __DIR__
или dirname(__FILE__)
:
include __DIR__ . '/inc/globals.inc.php';
или:
require dirname(__FILE__) . '/inc/globals.inc.php';
Обеспечение правильного пути используется одним шагом в устранении этих проблем, это также может быть связано с несуществующими файлами, правами файловой системы, препятствующими доступу или открытыми ограничениями на основе самого PHP.
Лучший способ быстро решить эту проблему – следовать нижеприведенному списку устранения неполадок.
Связанные вопросы:
Связанные ошибки:
Это предупреждение может отображаться с различными функциями, связанными с доступом к файлам и каталогам. Он предупреждает о проблеме конфигурации.
Когда он появляется, это означает, что доступ был запрещен для некоторых файлов.
Само предупреждение не нарушает ничего, но чаще всего скрипт не работает должным образом, если предотвращается доступ к файлу.
Обычно исправление изменяет конфигурацию PHP , связанная с ней настройка называется open_basedir
.
Иногда используются неправильные имена файлов или каталогов, тогда исправление должно использовать правильные.
Связанные вопросы:
Возможный сценарий
Я не могу найти, где мой код поступил не так. Вот моя полная ошибка:
Ошибка анализа: синтаксическая ошибка, неожиданный 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, которая позволит вам знать ошибки разбора при наборе текста. Вы можете использовать:
Связанные вопросы:
*
Как видно из названия, возникает такой тип ошибки, когда вы, скорее всего, пытаетесь перебрать или найти значение из массива с несуществующим ключом.
Подумайте, вы пытаетесь показать каждую букву из $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
, он выдает ошибку смещения.
Похожие ошибки:
Эта ошибка возникает в двух вариантах:
$arr = [1, 2, 3];
Этот синтаксис инициализатора массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:
$arr = array(1, 2, 3);
См. Также этот пример из руководства.
$suffix = explode(',', 'foo,bar')[1];
Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам необходимо использовать временную переменную:
$parts = explode(',', 'foo,bar'); $suffix = $parts[1];
См. Также этот пример из руководства.
(Более общая вариация предупреждения: 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:
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:
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.
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:
* 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
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
.
(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:
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");
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.
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:
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 :
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: