php: "Notice: Use of undefined constant"

arturabramian

Предыстория: хостер по ходу чего-то намутил с sendmail, в результате php-скрипты на сайте, отправляющие письма функцией mail, перестали отправлять. Я наехал на хостера, они уже неделю "усиленно решают проблему, многое сделано, но пока не решили".
Вот вчера один из скриптов, наколхоженный одним прогером по знакомству, начал выдавать вот такое:
Notice: Use of undefined constant APP_STATUS_NEW - assumed 'APP_STATUS_NEW' in /usr/home/website.ru/htdocs/admin/const.php on line 12
Notice: Use of undefined constant STAR - assumed 'STAR' in /usr/home/website.ru/htdocs/ap/application.php on line 8
другая ошибка:
Notice: Undefined variable: tournament_id in /usr/home/website.ru/htdocs/ap/application.php on line 11

и так вся страница вывода этого скрипта, в таких предупреждениях.
До этого было всё нормально. Я так подозреваю, что хостер что-то там намутил, и после этого вот такой результат работы скрипта. Другие скрипты (phpbb форум) вроде работают нормально, хотя может ещё какие косяки полезут.
Хочу наехать на хостера, но они такие гады, что им надо что-то конкретное предъявлять.
1) В чём может быть причина такой фигни? Я заметил, что хостер поменял php.ini (выключил safe_mod, прописал sendmail_from). Может ли выключение safe mod вызвать такие ошибки?
2) Может, достаточно как-то подправить скрипт, выдающий ошибку? Кавычки там где-нибудь проставить... не знаю, что надо делать.

kruzer25

Хочу наехать на хостера, но они такие гады, что им надо что-то конкретное предъявлять.
Хостер наконец-то включил вывод ошибок, и правильно сделал. У тебя кривой код, просто раньше это игнорировалось. На хостера наезжать не надо, надо наезжать на автора кода.
2) Может, достаточно как-то подправить скрипт, выдающий ошибку? Кавычки там где-нибудь проставить... не знаю, что надо делать.
Тут же всё русским английским языком сказано. Первые две ошибки - не определена константа, ты должен её определить или, действительно, проставить кавычки, если имелась в виду не константа STAR, а строка "STAR".
Третья ошибка - не определена переменная, тебе надо её определить прежде чем использовать.

arturabramian

Ну в общем да, ошибки попёрли из-за того, что они включили display_errors=on
А в чём ошибка кода?
скрипт, выдающий ошибки, содержит
require_once( "const.php");

и потом ещё
$message = $app_status[$db->f(status)]['message'];  

А в const.php содержится описание:
$app_status = array( APP_STATUS_NEW     =>  array ( 'color'=>'#E2E2E2', 'message'=>'Заявка рассматривается' 
APP_STATUS_APPROVE => array ( 'color'=>'#83FB6B', 'message'=>'Заявка одобрена' )
);

Что здесь неправильно, почему ошибка "Use of undefined constant APP_STATUS_NEW"?

iakobi91

$app_status = array( APP_STATUS_NEW => array ( 'color'=>'#E2E2E2', 'message'=>'Заявка рассматривается'
APP_STATUS_APPROVE => array ( 'color'=>'#83FB6B', 'message'=>'Заявка одобрена' )
);
Ну здесь они как ключи массива определены, а какого хера они в константах появляются? Либо ищи кусок кода, где они объявляются, либо там возможно какая-то макагня с register_globals=on раньше была, а теперь вырубили (и правильно)

kruzer25

$message = $app_status[$db->f(status)]['message'];
А что за status, это константа или строка такая?
$app_status = array( APP_STATUS_NEW => array ( 'color'=>'#E2E2E2', 'message'=>'Заявка рассматривается'
APP_STATUS_APPROVE => array ( 'color'=>'#83FB6B', 'message'=>'Заявка одобрена' )
);
Здесь и возникает ошибка. PHP пытается создать массив, у которого ключами будут значения соответствующих констант, а констант-то и нет.

iakobi91

ПЫЩЬ

kruzer25

А где ты увидел
define('CONST_NAME',array(...
?

arturabramian

PHP пытается создать массив, у которого ключами будут значения соответствующих констант, а констант-то и нет.
Я тоже так примерно подумал, и пробовал вместо APP_STATUS_NEW написать 'APP_STATUS_NEW', но ошибка, указывающая на конкретно это выражение, не исчезала.
Как правильно объявлять такой массив?
На пхп.нет в главе про массивы в примерах строковые ключи для элементов массива берутся в двойные кавычки. Это вообще имеет значение, двойные кавычки или простые? Вроде, насколько я помню, в данном конкретном случае это без разницы.

kruzer25

Я тоже так примерно подумал, и пробовал вместо APP_STATUS_NEW написать 'APP_STATUS_NEW', но ошибка, указывающая на конкретно это выражение, не исчезала.
Изменённый код и текст ошибки в студию.
Может, ошибка выдавалась на вторую константу?
На пхп.нет в главе про массивы в примерах строковые ключи для элементов массива берутся в двойные кавычки. Это вообще имеет значение, двойные кавычки или простые?
Ключ для элемента массива должен быть строкой или числом. Как задана эта строка, абсолютно пофигу - хоть это там написано в одиночных кавычках, хоть в двойных, хоть через heredoc, хоть как результат работы какой-то функции, хоть как значение переменной или константы или даже хоть "$name" (в двойных кавычках).
Вообще, такое ощущение, что ты даже и не пытался разобраться в синтаксисе языка, а просто откуда-то надёргал примеров и что-то из них склеил.

kruzer25

либо там возможно какая-то макагня с register_globals=on раньше была, а теперь вырубили
От register_globals константы не появляются ;)

arturabramian

Изменённый код и текст ошибки в студию.
Может, ошибка выдавалась на вторую константу?
ХЗ. Дочитал до конца справку на пхп.нет - получается, ошибка должна была исчезнуть. Вечерком попробую ещё раз расставить кавычки, сейчас неохота юзеров смущать своими тестами.
Вообще, такое ощущение, что ты даже и не пытался разобраться в синтаксисе языка, а просто откуда-то надёргал примеров и что-то из них склеил.

Читай внимательнее первый пост. Я сам ничего не дёргал и ничего из них не склеил, поскольку я вообще на пхп не прогаю. У меня есть уже написанные другими людьми скрипты, а мне надо исправлять в них ошибки и делать так, чтобы это всё работало. Я почитал книжку, но довольно сложно изучить синтаксис языка, если на нём не пишешь, т.е. практики ну вообще нет.
Оставить комментарий
Имя или ник:
Комментарий: