Основной вопрос об ошибках PHP

  • Автор темы Юрий Мазилкин
  • 89
  • Обновлено
  • 16, May 2024
  • #1
Я только что перенес систему, которую написал несколько лет назад, на PHP в новую среду с PHP 7.1.4 вместо PHP 5.x. Раньше мои программы работали отлично, но теперь выдают ошибки, многие из которых я никогда раньше не видел.

Я не очень хорошо программирую на PHP, хотя программировал на разных языках, включая Java, поэтому я ни в коем случае не новичок в программировании.

Я читал краткое руководство по обработке ошибок PHP, и они предложили написать функцию обработки ошибок и вызывать ее следующим образом:

 $report_layout = null;
PHP: Я сделал это и получил следующее:
 switch($_POST['report_layout']) {
Код (разметка): прав ли я в первой строке, предполагая, что [8] обозначает уровень серьезности ошибки, в частности E_NOTICE, который определяется как «Уведомления во время выполнения.



Скрипт обнаружил что-то, что может быть ошибка, но может произойти и при обычном запуске сценария."? Или 8 однозначно связана с ошибкой «Неопределенный индекс» в мире, где каждая отдельная ошибка имеет связанное с ней определенное число, например 37 для деления на ноль и 412 для выхода индекса массива за пределы? Я думаю, что это первое, и будут всевозможные ошибки с номером 8, но мои знания PHP отрывочны, поэтому я хочу быть уверенным.





Теперь, если я прав и что 8 — это серьезность ошибки, что обычно следует делать с ошибками E_NOTICE? В идеале я бы хотел, чтобы PHP не отображал это сообщение, и я хотел бы избавиться от него, сделав все, что мне нужно, чтобы PHP не думал, что что-то не так (в отличие от того, чтобы сказать ему не показывать мне ошибки ниже). определенная строгость). В данном конкретном случае строка кода, определенная как источник ошибки, выглядит следующим образом:

 Error: [8] Undefined index: report_layout File/Line: /storage/h13/139/1556139/public_html/SideTrekkedContributions.php/28
PHP: Черт меня побери, если я смогу понять, что здесь не так.

В старой системе я никогда не получал никаких ошибок по этому коду.

Но, возможно, старая система хотела показывать мне подобные сообщения, но подавляла мелкие ошибки; Я действительно не знаю.

Я попытался инициализировать эту переменную значением null
  //Error handler function function customError($errno, $errstr, $errfile, $errline, $errcontext) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "<b>File/Line:</b> $errfile/$errline<br>"; //echo "<b>Error context:</b><br>"; //print_r($errcontext); echo "....Ending Program"; die(); } //Set error handler set_error_handler("customError",E_ALL); 
PHP: но это НЕ предотвратило появление ошибки.

Я не знаю, как убедить PHP в том, что переменная была правильно инициализирована, поэтому ему не нужно сообщать мне, что существует неопределенный индекс. Может ли кто-нибудь просветить меня по вопросам, которые я поднял?

Юрий Мазилкин


Рег
26 Feb, 2013

Тем
1

Постов
1

Баллов
11
  • 18, May 2024
  • #2
Сарак уже ответил на другие твои вопросы. Позвольте мне ответить на ваш последний вопрос. Ошибка, которую вы получаете, четко упоминает об этом:
Неопределенный индекс: report_layout Это означает, что в ассоциативном массиве $_POST нет элемента с ключом с именем report_layout Итак, что вы можете сделать, так это добавить условие IF перед этим SWITCH, чтобы проверить, существует ли ключ массива! Пример:
 if( isset( $_POST['report_layout'] ) )
{

switch($_POST['report_layout'])

{

//......

//......

}
}
PHP: Надеюсь, это поможет. Спасибо
 

Дмитрий Ф1


Рег
06 May, 2014

Тем
0

Постов
2

Баллов
2
  • 19, May 2024
  • #3
Большая часть этих дебатов сводится к старой идее о том, что никогда не следует напрямую использовать значения $_POST или $_GET.

Ваши значения следует переместить в переменные, очистить, проверить значения по умолчанию и затем использовать.

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

После этого вы просто начнете выполнять MVC, что можно сделать даже на самом маленьком сайте «с нуля», но все это выходит далеко за рамки вопроса ОП.
 

Nimein


Рег
08 Sep, 2014

Тем
0

Постов
2

Баллов
2
  • 19, May 2024
  • #4
Все это выглядит хорошо. Единственное, что я бы изменил, это
 $prosper = $_POST['prosper'] ?? '';
PHP: Но есть еще способ @PoPSiCLe, который я еще не пробовал.
 $prosper = (array_key_exists('proposer', $_POST)) ? trim($_POST['proposer']) : "";
PHP:
 

sabinareingold


Рег
01 Jan, 2011

Тем
0

Постов
1

Баллов
1
  • 01, Jun 2024
  • #5
Просто чтобы немного прояснить.

Значения $_POST присутствуют ТОЛЬКО после отправки формы (то есть формы с методом = «post»). Таким образом, включенная вами форма не означает, что $_POST['report_layout'] определен.

Это также не означает, что он будет определен, даже если вы установите значение по умолчанию в форме (вам придется установить его непосредственно в PHP). Обычный способ сделать это — проверить, пусто ли значение $_POST, например, так:
 

if (isset($_POST['submitForm'])) {

if (isset($_POST['report_layout'])) {

switch($_POST['report_layout']) {

case 'Format1':

include('SideTrekkedContributions1.php');

break;

case 'Format2':

include('SideTrekkedContributions2.php');

break;

case 'Format3':

include('SideTrekkedContributions3.php');

break;

}

}

}

PHP: Конечно, на самом деле это не будет проверять, действительно ли установлен $_POST['report_layout'] - но опять же, это можно было бы проверить, например, так:
  if (isset($_POST['submitForm'])) { //do the rest of the $_POST-processing here } 


PHP: сначала проверяется, была ли отправлена форма, а затем проверяется, установлен ли $_POST['report_layout']. Обычно вы добавляете некоторую проверку ошибок, поэтому, если она не заполнена, вы предоставите пользователю сообщение об ошибке, объясняющее, что нужно сделать.

Кроме того, я вижу, что вы используете файлы .shtml.

Почему? И ваши соглашения об именах.

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

кроме того, первый комментарий не подходит кажется, не соответствует представленному коду и так далее.
 

rosenangelov


Рег
01 Jan, 2011

Тем
1

Постов
2

Баллов
12
  • 01, Jun 2024
  • #6
Конечно, в данном конкретном случае проверки одного isset() достаточно. Однако большинство форм будут иметь более одного ввода, и, следовательно, проверка того, действительно ли форма отправлена, прежде чем делать что-либо еще, обычно является хорошей практикой.
 

fonarevka


Рег
05 Oct, 2012

Тем
0

Постов
5

Баллов
5
  • 01, Jun 2024
  • #7
Это небольшая программа, созданная с использованием вашего обработчика ошибок, и она работает нормально.
 <?php

// error handler function

function myErrorHandler($errno, $errstr, $errfile, $errline)

{

echo "<b>Error:</b> [$errno] $errstr<br>";

echo "<b>File/Line:</b> $errfile/$errline<br>";

echo "....Ending Program";

die();

}

// function to test the error handling

function scale_by_log($vect, $scale)

{

if (!is_numeric($scale) || $scale <= 0) {

trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);

}

if (!is_array($vect)) {

trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);

return null;

}

$temp = array();

foreach($vect as $pos => $value) {

if (!is_numeric($value)) {

trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE);

$value = 0;

}

$temp[$pos] = log($scale) * $value;

}

return $temp;

}

// set to the user defined error handler

$old_error_handler = set_error_handler("myErrorHandler");

// trigger some errors, first define a mixed array with a non-numeric item

echo "vector a\n";

$a = array(2, 3, "foo", 5.5, 43.3, 21.11);

print_r($a);

// now generate second array

echo "----\nvector b - a notice (b = log(PI) * a)\n";

/* Value at position $pos is not a number, using 0 (zero) */

$b = scale_by_log($a, M_PI);

print_r($b);

// this is trouble, we pass a string instead of an array

echo "----\nvector c - a warning\n";

/* Incorrect input vector, array of values expected */

$c = scale_by_log("not array", 2.3);

var_dump($c); // NULL

// this is a critical error, log of zero or negative number is undefined

echo "----\nvector d - fatal error\n";

/* log(x) for x <= 0 is undefined, you used: scale = $scale" */

$d = scale_by_log($a, -2.5);

var_dump($d); // Never reached

?>



Код (разметка):

ВЫХОД :

вектор a Массив ([0] => 2 [1] => 3 [2] => foo [3] => 5,5 [4] => 43,3 [5] => 21,11 ) ---- вектор b — уведомление (b = log(PI) * a) Ошибка: [1024] Значение в позиции 2 не является числом, используется 0 (ноль)

Файл/строка: /opt/lampp/htdocs/Jagdish/test/cutom_error_handler.php/27

....Завершение программы
 

busyava


Рег
21 May, 2012

Тем
0

Постов
5

Баллов
5
  • 03, Jun 2024
  • #8
Как правило, никогда не следует предполагать, что что-то установлено. Простой тернарный код сделает всю работу
 var_dump($_SERVER["REQUEST_METHOD"]);
PHP: Также нет необходимости вкладывать операторы if. Следуя моему правилу никогда не предполагать, что что-то установлено, я всегда проверял правильность отправки формы, прежде чем проверять что-либо еще.
 var_dump($_POST);
PHP: простой
 if (isset($_POST['submit']) && isset($_POST['index'])) { } if (isset($_POST['submit'], $_POST['index'])) { }
PHP: после отправки вы увидите, что установлено, если ничего, то вам нужно дважды проверить, действительно ли вы выполняете запрос на публикацию, который вы можете сделать.
 isset($_POST['index']) ? $_POST['index''] : ''
PHP:
 

Лена Колосова


Рег
18 Mar, 2013

Тем
1

Постов
2

Баллов
12
  • 04, Jun 2024
  • #9
Когда я изменил 1 на 0 и снова запустил свой код, все сообщения PHP исчезли.

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

Вольха1


Рег
25 Sep, 2014

Тем
1

Постов
3

Баллов
13
  • 07, Jun 2024
  • #10
Наличие значения по умолчанию для выбора нескольких опций является обязательным (если мы не говорим об опросах и тому подобном), а не обязательным. обходной путь. Просто добавьте DEFAULT к одному из вариантов, который, по вашему мнению, нравится большинству пользователей. хотел бы выбирать.,
 

KKonstantin


Рег
11 Nov, 2015

Тем
1

Постов
2

Баллов
12
  • 08, Jun 2024
  • #11
Вот список номеров ошибок: http://php.net/manual/en/errorfunc.constants.php

[8] похоже, что это довольно общий результат типа «упс», но не серьезность. Многие люди подавляют сообщения об ошибках и ничего с ними не делают.

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

Roman K.


Рег
27 Mar, 2012

Тем
0

Постов
2

Баллов
2
  • 09, Jun 2024
  • #12
Учитывая, что _SideTrekkedContributionsMenu.shtml встраивается в код до того, как PHP выполнит оператор переключения, я думаю report_layout уже определен. Что мне не хватает? Что мне нужно сделать, чтобы PHP не считал, что report_layout не определен?
 

Gefahr


Рег
01 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 09, Jun 2024
  • #13
Полагаю, я мог бы заставить report_layout иметь значение и просто позволить пользователю изменить это значение, если ему не нравится значение по умолчанию.

Я бы предпочел этого не делать, поэтому думаю попробовать функцию array_key_exists.



Я никогда раньше не сталкивался с этим, но он позволил бы мне написать if, в котором говорится: «Если report_layout имеет значение, запустите соответствующий отчет, в противном случае просто отобразите меню и дождитесь ввода». Судя по всему, переключение выполняется еще до того, как пользователь выбрал отчет, что вызывает жалобу на то, что индекс не определен.

Спасибо за понимание!
 

klubni4ka1


Рег
20 Dec, 2012

Тем
0

Постов
2

Баллов
2
  • 12, Jun 2024
  • #14
Я бы начал с простого выполнения var_dump $_POST перед переключением, чтобы быть уверенным - возможно, значение не было выбрано, и поэтому переменная не отображается в $_POST.

Чтобы обойти это, вам нужно либо указать report_layout значение по умолчанию, чтобы переключатель был предварительно выбран, либо вам нужно добавить array_key_exists перед переключением.
 

cOeuuuR


Рег
27 Jun, 2012

Тем
1

Постов
2

Баллов
12
  • 12, Jun 2024
  • #15
Извините за задержку с ответом; Я экспериментировал со своим PHP-кодом, изучая вещи методом проб и ошибок, но не смог найти их в руководстве. Вы подняли несколько замечательных вопросов.



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



Вот почему я был озадачен полученной ошибкой.

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

Я тестировал через array_key_exists(). Например:

  //If the user has selected a report, execute the program that displays the desired report.

if (array_key_exists('report_layout', $_POST)) {

switch($_POST['report_layout']) {

case 'Format1':

include('SideTrekkedContributions1.php');

break;

case 'Format2':

include('SideTrekkedContributions2.php');

break;

case 'Format3':

include('SideTrekkedContributions3.php');

break;

} //end switch

} //end if

PHP: Есть ли причина, почему это лучше или хуже, чем isset() (или любой другой возможный подход)? Я также не осознавал, что оператор переключения будет выполнен сразу после того, как форма будет показана пользователю, прежде чем он/она сможет выбрать формат отчета.

Я просто поместил if вокруг всего оператора переключателя, чтобы он не выполнялся до тех пор, пока report_layout не получит значение, что произойдет только после нажатия кнопки «Отправить»:
  (array_key_exists('proposer', $_POST)) ? $proposer = trim($_POST['proposer']) : $proposer = ""; //This is the Proposer text field. 
PHP: Согласны ли вы, что это разумный способ справиться с ситуацией, или я мог бы добиться большего?
 

Maxiwap


Рег
22 Oct, 2014

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966

Интересно