Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Десятки! Просто десятки Notice/
 
 автор: lElectroHardl   (16.03.2012 в 13:50)   письмо автору
 
 

По совету некоторых перешел с Денвера на Open Server. Все данные успешно перенес, создал базу, все хорошо работает.
Зашел на тестовый сайт, который писал на Денвере.... И тут мои глаза приняли такой вид: О_О.
На страницу вылезло около 25-ти предупреждений ошибок. Да, скажите Вы, - "поправь код, неуч". Но! Денвер на такого рода код даже не смотрел косо, а спокойно отрабатывал:
<?
$avatar_user 
$_FILES['avatar_user']["name"] ? $_FILES['avatar_user'] : NULL;
// Notice: Undefined index: avatar_user
if (preg_match("/^page[0-9]+$/"$url[0]) or preg_match("/^page[0-9]+$/"$url[1]))
// Notice: Undefined offset: 1

   
 
 автор: Valick   (16.03.2012 в 14:25)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 13:50)
 

просто у вас в денвере были отключены предупреждения (Notice:)
их как раз отключать нужно на рабочем сервере, а там где происходит отладка кода они должны быть включены

   
 
 автор: lElectroHardl   (16.03.2012 в 14:41)   письмо автору
 
   для: Valick   (16.03.2012 в 14:25)
 

<? error_reporting(E_ALL E_NOTICE);

Не хочет скрывать
Notice: Undefined offset

   
 
 автор: Slo_Nik   (16.03.2012 в 14:56)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 14:41)
 

& ~E_NOTICE

p.s. хоть бы в руководство заглянули....

   
 
 автор: lElectroHardl   (16.03.2012 в 15:06)   письмо автору
 
   для: Slo_Nik   (16.03.2012 в 14:56)
 

error_reporting(E_ALL & E_NOTICE); все-равно выдает все Нотайсы.

   
 
 автор: Slo_Nik   (16.03.2012 в 15:11)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 15:06)
 

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

   
 
 автор: lElectroHardl   (16.03.2012 в 15:19)   письмо автору
 
   для: Slo_Nik   (16.03.2012 в 15:11)
 

Не помогает.
Даже
error_reporting(0);

Не спасает от предупреждений // Notice: Undefined offset: 2
<?
// сам код, на который ругается
preg_match("/^page[0-9]+$/"$url[1// $url[1] == NULL. Денвер на такую конструкцию не ругался.

   
 
 автор: Slo_Nik   (16.03.2012 в 15:36)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 15:19)
 

Да всё помогает...
Когда Вы просто открываете страницу предупреждений нет?
А когда запускаете скрипт?
В случае с регулярным Вам надо проверить откуда берётся $url[1]...

p.s. и как Вы всё таки написали строку error_reporting() ?

p.s.s перед preg_match() сделайте вывод $url[1] в браузер, что там?

p.s.s.s инициализируйте все переменные в скрипте и забудьте о NOTICE...

   
 
 автор: lElectroHardl   (16.03.2012 в 15:49)   письмо автору
 
   для: Slo_Nik   (16.03.2012 в 15:36)
 

> инициализируйте все переменные в скрипте и забудьте о NOTICE...
$url[1] это 2-й параметр адресной строки (делал ЧПУ yf PHP). Нужно проверять каждый параметр? Ведь придется писать целый велосипед. Думаю, что можно обойтись без этого (на Денвере получалось).

И да, есть случаи, когда $url[1] попросту не существует. (опять же - Денвер не ругался и я был доволен).

   
 
 автор: Valick   (16.03.2012 в 16:50)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 15:49)
 

(опять же - Денвер не ругался и я был доволен).
ну а кто вам сказал что это хорошо?

   
 
 автор: cheops   (16.03.2012 в 17:02)   письмо автору
 
   для: Valick   (16.03.2012 в 16:50)
 

Сначала объявлять, что язык поддерживает необъявленные переменные, а потом на уровне начальных настроек запрещать это - тоже мало хорошего... да еще ладно бы можно было по аналогии с массивами и объектами явно объявлять числа и строки - даже когда это хочешь сделать: нет инструментов. А ассоциативные и разреженные массивы? Да язык изначально предназначен для режима E_ALL & E_NOTICE. Понятно, что в PHP сделано такое количество архитектурных ошибок и изменений по ходу существования языка, что еще одно погоды не сделает. Но я тоже не понимаю, почему я должен каждый раз проверять существование переменной или элемента массива, если очень часто мне как раз и нужно использовать пустые значения... тем более они всегда равны 0, а не как в других языках могут принимать произвольные значения. Хотя бы предоставили возможность включать и отключать конкретные виды предупреждений, как это сделано во всех остальных цивилизованных языках. Почему я во Flash или C++ могу отключить конкретное одно предупреждение, а тут нет? Перемудрили явно.

В любом случае не стоит настаивать на том, что это стандарт
these are warnings which often result from a bug in your code, but it's possible that it was intentional
Я вот может и хочу intentional использовать возможности языка, в противном случае на фига он тогда такой вообще нужен, я пойду и другой возьму, со строгой типизацией и объявлением переменных. Лично я PHP ровно за тем и использую, чтобы он неявно память выделял, не спрашивая никаких вопросов. А про инициализацию нужно помнить всегда, в любом языке, это понимание должно быть на уровне рефлексов, а не машина должна искать эти ошибки - есть среды, которые не ищут неинициализированные данные, более того, их не всегда можно проследить автоматически.

   
 
 автор: Valick   (17.03.2012 в 09:03)   письмо автору
 
   для: cheops   (16.03.2012 в 17:02)
 

В любом случае не стоит настаивать на том, что это стандарт
а никто и не настаивает, предупреждения они на то и нужны чтобы легче было найти ошибки в логике а не в синтаксисе, сравнивать что-то с несуществующей переменной не правда ли несколько нелогично?
по мне так достаточно что РНР дает возможность явно не указывать тип переменной и вводить переменные на любом участке кода, а не описывать их в самом начале

   
 
 автор: Slo_Nik   (16.03.2012 в 16:53)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 15:49)
 

плохо , что Вы били довольны когда Денвер не ругался

проверяйте, существует ли $url[1] или нет. присвойте значение по умолчанию...

   
 
 автор: Valick   (16.03.2012 в 17:01)   письмо автору
 
   для: Slo_Nik   (16.03.2012 в 16:53)
 

просто человек не понимает, что не инициализированная переменная и пустая переменная - это не одно и то же

   
 
 автор: lElectroHardl   (17.03.2012 в 15:36)   письмо автору
 
   для: Slo_Nik   (16.03.2012 в 16:53)
 

Но зачем? Это ведь велосипед!
Да! Объявлять динамические переменные - я считаю глупо. У меня только ЧПУ_php около сотни переменных. Мне их все объявлять? Получить не код, а сплошной борщ (с клубникой, кусочкаи метала и чаем).
Я сторонник того, что Денвер - молодец, - он не обращает внимания на структуру отдельного кода, если основная логика верна.

   
 
 автор: Slo_Nik   (17.03.2012 в 16:34)   письмо автору
 
   для: lElectroHardl   (17.03.2012 в 15:36)
 

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

   
 
 автор: cheops   (17.03.2012 в 17:31)   письмо автору
 
   для: Slo_Nik   (17.03.2012 в 16:34)
 

1. register_globals можно не принимать во внимание, ей уже много лет не пользуются.
2. Проблема использования переменных с одними и теми же названиями остается независимо от того инициализированы они или нет. Notice этого типа скорее отлавливает ошибки связанные с опечатками в именах переменных - тут они да здорово работают.

Однако, проблема остается, PHP традиционно силен именно неявным объявлением переменных, многие приемы основаны на этом. Поэтому будет оставаться целый класс разработчиков отключающих Notice ради этой возможности. Нужно дробить этот уровень ошибок на еще более мелкий и позволять выборочно включать/отключать конкретные типы Notice-замечаний. Так поступают во всех остальных языках, очень часто глушат конкретные даже не замечания, а предупреждения.

   
 
 автор: Slo_Nik   (17.03.2012 в 19:44)   письмо автору
 
   для: cheops   (17.03.2012 в 17:31)
 

с register_globals понятно, но не надо об этом забывать..

но инициализировать то всё равно надо...

Нужно дробить этот уровень ошибок на еще более мелкий и позволять выборочно включать/отключать конкретные типы Notice-замечаний
каким образом это можно сделать?

   
 
 автор: cheops   (17.03.2012 в 19:49)   письмо автору
 
   для: Slo_Nik   (17.03.2012 в 19:44)
 

>но инициализировать то всё равно надо...
Надо, особенно в крупных проектах.

   
 
 автор: Slo_Nik   (17.03.2012 в 20:00)   письмо автору
 
   для: cheops   (17.03.2012 в 19:49)
 

ну а каким образом можно разбить этот уровень на более мелкие?

   
 
 автор: cheops   (17.03.2012 в 20:41)   письмо автору
 
   для: Slo_Nik   (17.03.2012 в 20:00)
 

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

PS Залез в исходные коды и специально проверил (чтобы ничего не напутать) - это происки Zend-овского движка.

   
 
 автор: Slo_Nik   (17.03.2012 в 21:02)   письмо автору
 
   для: cheops   (17.03.2012 в 20:41)
 

как я понял это надо решать на уровне ядра?

   
 
 автор: cheops   (18.03.2012 в 12:01)   письмо автору
 
   для: Slo_Nik   (17.03.2012 в 21:02)
 

Даже ниже, на уровне движка Zend, на котором построено ядро.

   
 
 автор: lElectroHardl   (18.03.2012 в 15:07)   письмо автору
 
   для: Slo_Nik   (17.03.2012 в 16:34)
 

Вы не знаете логики моих приложений. Да, согласен, это опасно. но если КАЖДАЯ переменная в скрипте проходит пред. обработку, то думаю, дыры быть не должно :).

   
 
 автор: cheops   (16.03.2012 в 16:48)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 15:19)
 

Найдите php.ini и поправьте значение директивы в нем.

   
 
 автор: Slo_Nik   (16.03.2012 в 15:00)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 14:41)
 

НО!!!
Сделайте так, чтобы при error_reporting(E_ALL) не было NOTICE...
Это будет единственное, правильное решение...

   
 
 автор: lElectroHardl   (18.03.2012 в 15:10)   письмо автору
 
   для: lElectroHardl   (16.03.2012 в 13:50)
 

Все гуд.
Я Вася :). Я погашение Нотайсов поставил, после Инклуда файла ЧПУ, который и давал ошибки :).
Все. Вопрос решен. Взял во внимания фразы "ЮЛЯ, парень, не гони, это опасно!" и "Инициализируй их сейчайже, наъ!".

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования