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

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

Пользователь
Регистрация
26.02.13
Сообщения
2
Реакции
0
Баллы
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 отрывочны, поэтому я хочу быть уверенным.
Основной вопрос об ошибках 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 в том, что переменная была правильно инициализирована, поэтому ему не нужно сообщать мне, что существует неопределенный индекс.

Может ли кто-нибудь просветить меня по вопросам, которые я поднял?
 

Дмитрий Ф1

Пользователь
Регистрация
06.05.14
Сообщения
2
Реакции
0
Баллы
1
Сарак уже ответил на другие твои вопросы.

Позвольте мне ответить на ваш последний вопрос.

Ошибка, которую вы получаете, четко упоминает об этом:
Неопределенный индекс: report_layout

Это означает, что в ассоциативном массиве $_POST нет элемента с ключом с именем report_layout

Итак, что вы можете сделать, так это добавить условие IF перед этим SWITCH, чтобы проверить, существует ли ключ массива!

Пример:
Код:
if( isset( $_POST['report_layout'] ) )
{ switch($_POST['report_layout']) { }
}
PHP: Надеюсь, это поможет.

Спасибо
 

Nimein

Пользователь
Регистрация
08.09.14
Сообщения
1
Реакции
0
Баллы
1
Большая часть этих дебатов сводится к старой идее о том, что никогда не следует напрямую использовать значения $_POST или $_GET.

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

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

sabinareingold

Пользователь
Регистрация
01.01.70
Сообщения
1
Реакции
0
Баллы
1
Адрес
в березовой роще :)
Все это выглядит хорошо. Единственное, что я бы изменил, это


$prosper = $_POST['prosper'] ?? '';

PHP: Но есть еще способ @PoPSiCLe, который я еще не пробовал.

$prosper = (array_key_exists('proposer', $_POST)) ? trim($_POST['proposer']) : "";
PHP:
 

rosenangelov

Пользователь
Регистрация
01.01.70
Сообщения
2
Реакции
0
Баллы
1
Просто чтобы немного прояснить. Значения $_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. Почему? И ваши соглашения об именах... вы смешиваете верблюжий регистр (с неправильным форматированием - верблюжий регистр начинается со строчной буквы) с подчеркиванием именования, и у вас чрезвычайно сложные имена для довольно большого количества кода... кроме того, первый комментарий не подходит кажется, не соответствует представленному коду и так далее.
 

fonarevka

Пользователь
Регистрация
05.10.12
Сообщения
4
Реакции
1
Баллы
3
Конечно, в данном конкретном случае проверки одного isset() достаточно. Однако большинство форм будут иметь более одного ввода, и, следовательно, проверка того, действительно ли форма отправлена, прежде чем делать что-либо еще, обычно является хорошей практикой.
 
Сверху Снизу