Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ошибки, которые проявились только на локальном компе.  (Прочитано 11754 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Chuda
Гость
« : 22-05-2009 00:51 » 

Давным-давно уже в разработке проект.
Скрипты живут на сервере, и им там хорошо.
В php.ini на том сервере есть такие строки:
Код:
error_reporting  =  E_ALL
display_errors = On
Ну то есть все ошибки чтобы всегда выводил. Мне так приятнее отлаживать, если что.
И никаких ошибок в реальной работе естественно не было.

В этом проекте встречаются в нескольких местах такие конструкции:
Страница содержит таблицу с выборкой из БД, а по нажатию нужной кнопки аяксом подгружается на эту же страницу ещё одна таблица.
И скрипт основной части страницы, и скрипт подгружаемой аяксом части содержат одинаковую строку require_once("settings.php"). В этом файле содержатся определения констант, как несложно догадаться.

Ради удобства разработки (ну и чтобы не править на живую на действующей системе) скопировала я проект себе на локальный компьютер.
И на локальном творятся чудеса.
Сама страница выглядит нормально, а вот в начале подгружаемой части вылезают ошибки типа таких:
Код:
Notice: Use of undefined constant SITE_ROOT - assumed 'SITE_ROOT' in /Users/shilgya/htdocs/settings.php on line 19
Notice: Undefined index: type in /Users/shilgya/htdocs/sattelitereport.php on line 164
Я в глубокой задумчивости.

Строка 19 из settings.php:
Код:
define(SITE_ROOT,"/");

Строка 164 из sattelitereport.php:
Код:
if(!$result['type']) {

Люди добрые! Помогите пожалуйста.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-05-2009 03:32 » 

Код:
define("SITE_ROOT", "/");

Код:
if (empty($result['type']))
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Chuda
Гость
« Ответ #2 : 22-05-2009 07:44 » 

RXL, спасибо. Про define — так оно и есть. Но почему?Не понял
И почему ошибка каждый раз, когда переменная впервые встречается в коде?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 22-05-2009 08:05 » new

Шильгия, потому, что аргумент — строка. Константа еще не объявлена — ее нельзя использовать и даже если вторым параметром передать другую константу, объявленную ранее, то значением аргумента будет значение константы, а не ее имя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Chuda
Гость
« Ответ #4 : 22-05-2009 08:12 » 

А с необъявленными переменными что за … ?
И почему ругань на ошибки появилась только в одном весьма хитром случае?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 22-05-2009 08:24 » 

а версии php одинаковые?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Chuda
Гость
« Ответ #6 : 22-05-2009 08:35 » 

наверно немного разные.
Но и там и там 5.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 22-05-2009 11:43 » 

Думаю, что в продакшн у тебя все-таки отключен вывод ошибок. Вот и все.

А переменные попросту надо инициализировать. И если нет уверенности, что она существует - проверять через isset() или empty() (в зависимости от контекста).
« Последнее редактирование: 22-05-2009 11:45 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Chuda
Гость
« Ответ #8 : 22-05-2009 11:53 » 

Рома, я всё же специально указала на то, что вывод ошибок включен Улыбаюсь

И вообще-то мне казалось, что переменные в php инициализируются в момент их первого использования.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 22-05-2009 20:31 » 

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

Переменные инициализируются в момент присвоения. А вот попытка получения значения неинициализированной переменной - грубая ошибка, о чем и сообщает NOTICE. То, что PHP либерально относится к этому, не извиняет программиста.
« Последнее редактирование: 22-05-2009 20:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Chuda
Гость
« Ответ #10 : 27-05-2009 07:32 » 

RXL, спасибо. Переписано и учтено на будущее Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines