Перенаправление не работает при хостинге, но работает в XAMPP [dубликат]

Что это?

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

Почему это?

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

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

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

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

Список

Ничего не видно. Страница пустая и белая. (также известный как White Page / Screen Of Death) Код не запускается / что-то похожее на части моего кода PHP выводятся Предупреждение: не удается изменить информацию заголовка - уже отправлены заголовки Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean дано aka Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL aka Warning: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, boolean given (или аналогичные варианты). Предупреждение. [function] ожидает, что параметр 1 будет ресурсом, boolean с предупреждением: [fункция]: не удалось открыть поток: [причина] Предупреждение: ограничение open_basedir Предупреждение: разделение на ноль Предупреждение: недопустимое смещение строки «XXX» Ошибка анализа: ошибка синтаксиса, неожиданная «[» Ошибка синтаксиса: неожиданный T_XXX Ошибка анализа: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE Ошибка анализа: ошибка синтаксиса, неожиданный T_PAAMAYIM_NEKUDOTAYIM Ошибка анализа: синтаксическая ошибка, неожиданный «require_once» (T_REQUIRE_ONCE), ожидающая функция (T_FUNCTION) Ошибка анализа: ошибка синтаксиса, неожиданный T_VARIABLE Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты) Неустранимая ошибка: вызов функции-члена ... на не-объекте Неустранимая ошибка: вызов неопределенной функции XXX Fatal Ошибка: невозможно обновить XXX Неустранимая ошибка: нельзя использовать возвращаемое значение функции в контексте записи Фатальная ошибка: декларация AAA :: BBB () должна быть совместима с ошибкой CCC :: BBB () «Неустранимая ошибка: использование $ this, когда нет в контексте объекта Примечание: преобразование массива в строку Примечание: попытка получить свойство ошибки, отличной от объекта Примечание: неопределенная переменная Примечание: Неопределенный индекс Примечание: неопределенное смещение XXX [Ссылка] Примечание: Неинициализированное смещение строки: XXX Примечание: использование неопределенной константы XXX - Предполагается 'XXX' MySQL: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом ... в строке ... Строгие стандарты: нестатический метод [& lt; class> :: & lt; method>] не следует называть статически [ ! d10]

Также см.

Ничего не видно. Страница пустая и белая. (также известная как Белая страница / Экран смерти)
917
задан 12 March 2018 в 05:52

29 ответов

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

$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 на другую переменную замещения.

Вопросы, относящиеся:

Если нестатический метод называется статически. Пример:
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 на другую переменную замещения.
70
ответ дан 15 August 2018 в 14:46

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

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

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

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

Оба spinach и 1 не существуют в массиве, вызывая demo .

Решение состоит в том, чтобы убедиться, что индекс или смещение существует до доступа к этому индексу. Это может означать, что вам необходимо исправить ошибку в вашей программе, чтобы убедиться, что эти индексы существуют, когда вы ожидаете их. Или это может означать, что вам нужно проверить, существуют ли индексы с помощью 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
91
ответ дан 15 August 2018 в 14:46

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

или, в PHP 7.2 или новее:

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

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

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

Например:

// Wrong
echo $array[key];

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

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

// Wrong
echo varName;

// Right
echo $varName;

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

// Wrong
$foo = fasle;

// Right
$foo = false;

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

Вопросы, относящиеся:

Что представляет собой сообщение об ошибке PHP? Обратите внимание: Использование неопределенной константы "означает?
35
ответ дан 15 August 2018 в 14:46

Ошибка синтаксиса: ошибка синтаксиса, неожиданный 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 в вашем php.ini.

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

error_reporting(E_ALL);

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

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

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

Вопросы, относящиеся:

Справка: Ошибки в PHP / Синтаксис; и как их решить?
27
ответ дан 15 August 2018 в 14:46

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

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

Пожалуйста, не используйте функции 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 All "mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан« Вопросы по Stackoverflow

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

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

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

78
ответ дан 15 August 2018 в 14:46

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

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

Это 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 с спецификацией.

Вопросы, относящиеся:

Заголовки уже отправлены PHP Все PHP «Заголовки уже отправлены» Вопросы по порядку байтов стопового потока.
230
ответ дан 15 August 2018 в 14:46

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

происходит с кодом, подобным 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 базы данных типичный . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.

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

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

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

Вопросы, относящиеся:

Вызов член-функция для не-объекта Список всех PHP «Неустранимая ошибка: вызов функции-члена ... на не-объект» Вопросы по Stackoverflow
161
ответ дан 15 August 2018 в 14:46

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

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

Пример:

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

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

18
ответ дан 15 August 2018 в 14:46

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

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

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

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

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

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

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

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

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

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

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

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

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

45
ответ дан 15 August 2018 в 14:46

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

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

Если вы включили ведение журнала ошибок, вы найдете конкретное сообщение об ошибке в своем журнале ошибок. Обычно это будет в файле 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 или любым другим способом, который влияет на конфигурацию перед временем выполнения.

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

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

Похожие вопросы:

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

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

Белый экран смерти PHP Белый экран смерти PHP Белый экран смерти!
103
ответ дан 15 August 2018 в 14:46

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

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

Типичный пример для non-object notice будет

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

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

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

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

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

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

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

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

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

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

Примечание: Неопределенный указатель Фатальная ошибка: вызов функция-член ... на не-объекте
23
ответ дан 15 August 2018 в 14:46

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

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

Вариант 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];

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

25
ответ дан 15 August 2018 в 14:46

Замечание: Преобразование массива в строку

Это происходит просто, если вы пытаетесь рассматривать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или конкатенируется с строкой, потому что результат не определен. PHP будет использовать строку «Array» вместо массива и вызвать уведомление, чтобы указать, что это, вероятно, не то, что было предназначено, и что вы должны проверять свой код здесь. Вы, вероятно, захотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или закодируйте массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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

14
ответ дан 15 August 2018 в 14:46

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

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

$value = @(2 / 0);

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

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

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

Вопросы, относящиеся:

предупреждение: деление на ноль Предупреждение: разделение на ноль Работа с PHP и MySQL с нулевой ошибкой в ​​WordPress Theme Как подавить ошибку «Деление на ноль» Как поймать деление на ноль?
11
ответ дан 15 August 2018 в 14:46

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

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

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

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

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

class.php

<?php

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

class.php

<?php

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

do_stuff();
do_stuff();

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

37
ответ дан 15 August 2018 в 14:46

Предупреждение: [fункция] ожидает, что параметр 1 будет ресурсом, boolean задано

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

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

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

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

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

... дескриптор cURL и мультирум cURL.

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

resource(1) of type (curl)

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

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

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

Возвращаемые значения Возвращает ресурс указателя файла при успешном выполнении или FALSE при ошибке ,

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

$fp = fopen(...);

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

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

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

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

$fp = fopen(...);

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

$data = fread($fp, 1024);

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

Warning: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан
22
ответ дан 15 August 2018 в 14:46

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

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

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

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

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

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

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

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

http://localhost/my/file.php

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

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

17
ответ дан 15 August 2018 в 14:46

Строгие стандарты: нестатический метод [& lt; class> :: & lt; method>] не следует вызывать статически

Происходит при попытке вызвать нестатический метод для класса, поскольку он

Пример:

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

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

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

error_reporting(E_ALL & ~E_STRICT);

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

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

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

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

Похожие вопросы :

Как я могу решить «Нестатический метод xxx: xxx () не следует называть статическим в PHP 5.4?
8
ответ дан 15 August 2018 в 14:46

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

Это обычно происходит при непосредственном использовании функции с 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).

Вопросы, относящиеся:

Неустранимая ошибка: не может использовать функцию возвращаемое значение
61
ответ дан 15 August 2018 в 14:46

Предупреждение: действующее ограничение open_basedir

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

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

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

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

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

Вопросы, относящиеся:

open_basedir ограничение действует. Файл (/) не находится в пределах допустимых путей: Все PHP «Предупреждение: действующее ограничение open_basedir» Querstions on Stackoverflow
28
ответ дан 15 August 2018 в 14:46

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

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

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

путь к файлу неправильный путь к файлу относительный include path is wrong permissions too too ограничительный SELinux в силе и многие другие ...

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

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

или:

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

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

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

Вопросы, относящиеся

неверный путь к файлу

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

Предупреждение: действующее ограничение open_basedir
37
ответ дан 15 August 2018 в 14:46

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

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

Вопросы, относящиеся:

Ссылки: PHP Parse / Syntax Errors; и как их решить? Parse Error: синтаксическая ошибка: неожиданная '{' Ошибка анализа: ошибка синтаксиса, неожиданный конец файла в моем PHP-коде. Ошибка анализа: синтаксическая ошибка, неожиданный '& lt;' в-Fix? Ошибка анализа: синтаксическая ошибка, неожиданный '?'

Для получения дополнительной справки см.:

Ссылка: ошибки PHP / синтаксиса PHP; и как их решить?
66
ответ дан 15 August 2018 в 14:46

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

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

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

Вопросы, относящиеся:

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

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

Ссылка: ошибки в PHP / синтаксисе; и как их решить?
39
ответ дан 15 August 2018 в 14:46

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

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

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

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

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

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

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, посмотрите информацию о том, почему, поскольку это может быть уже не нужно.

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

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

Вопросы, относящиеся:

https://stackoverflow.com/search?q=Fatal+error%3A + Call + to + undefined + function
67
ответ дан 15 August 2018 в 14:46

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

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

Типичным примером может быть

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

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

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

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

Вопросы, относящиеся:

Все PHP «Замечание: неопределенная переменная» Вопросы на Stackoverflow PHP: «Уведомление: неопределенная переменная», «Уведомление: Неопределенный индекс» и « Примечание: Неопределенное смещение & quot; Ссылка: что такое переменная область, какие переменные доступны из того, где и что такое «неопределенная переменная»? ошибки?
36
ответ дан 15 August 2018 в 14:46

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

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

Считаем, что вы пытаетесь показать каждую букву из $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'
28
ответ дан 15 August 2018 в 14:46

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

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

Чтобы избежать таких ошибок, вы not всегда избегаете данных перед использованием в запросе.

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

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

Как я могу предотвратить SQL-инъекцию в PHP? mysql_real_escape_string() mysqli_real_escape_string() Как выполняется инъекция SQL из таблицы «Bobby Tables» XKCD комическая работа? SQL-инъекция, которая распространяется вокруг mysql_real_escape_string ()
57
ответ дан 15 August 2018 в 14:46

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

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

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

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

Вопросы, относящиеся:

Все «Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан» Вопросы по Stackoverflow
49
ответ дан 15 August 2018 в 14:46

Неустранимая ошибка: [TraitA] и [TraitB] определяют одно и то же свойство ([$ x]) в композиции [ClassC]

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

Пример:

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

Проблемное: хотя можно разрешить конфликты между use multiple Traits , в настоящее время нет синтаксиса, который бы разрешил конфликт между двумя конкурирующими свойствами. Единственным решением в это время является рефакторинг; то есть избежать конфликта между именами свойств, которые приводят к фатальной ошибке.

Вопросы, относящиеся:

PHP-черты: как разрешить конфликт имен свойств? Черты - конфликт свойств с родительским классом
2
ответ дан 15 August 2018 в 14:46

Другие вопросы по тегам:

Похожие вопросы: