PHP parse_ini_file TC_CONSTANT предупреждение - PullRequest
2 голосов
/ 30 октября 2010

У меня странная проблема, странная, потому что в Google ничего не появляется. Я пытаюсь проанализировать INI-файл, полный кодов состояния HTTP, StatusCodes.ini. Я провел тестирование в трех различных средах: локально (WAMP) на общем хосте (Hostmonster.com), а теперь на выделенной машине, на которой работает CentOS с CPanel / WHM. Первые две среды работают нормально, но на выделенной машине я получаю предупреждение:

Warning:  syntax error, unexpected TC_CONSTANT in StatusCodes.ini on line 8

при работе:

$ini = parse_ini_file('StatusCodes.ini',true);
$codes = $ini['codes'];

INI-файл выглядит так:

[codes]
100 = Continue
101 = Switching Protocols
200 = OK
201 = Created
202 = Accepted
203 = Non-Authoritative Information
204 = No Content
205 = Reset Content
206 = Partial Content
300 = Multiple Choices
301 = Moved Permanently
302 = Found
303 = See Other
304 = Not Modified
305 = Use Proxy
307 = Temporary Redirect
400 = Bad Request
...

В случае, если вы не хотите считать, 204 = Нет содержимого, это строка 8. Я вычеркнул строку и ничего не изменилось. Есть предложения?

Ответы [ 2 ]

9 голосов
/ 30 октября 2010

Проблема, как вы заметили, связана со строкой 204 = No Content.

Это из-за No, который является специальным значением в файле INI (наряду с другими). Синтаксический анализатор INI попадает в эту строку и читает значение No для клавиши 204, затем находит конечный текст <space>Content, который генерирует ошибку.

Примечания к руководству по PHP (например, на странице для parse_ini_file):

Значения null, no и false приводят к "", yes и true, приводят к "1".

Простым решением было бы заключить все значений в двойные кавычки или в самом конце те, которые начинаются с ключевых слов INI, например:

[codes]
100 = "Continue"
101 = "Switching Protocols"
200 = "OK"
201 = "Created"
202 = "Accepted"
2 голосов
/ 30 октября 2010

К сожалению, parse_ini_file() немного узок в том, что он принимает.

Если значение в файле ini содержит не алфавитно-цифровые символы, его необходимо заключить в двойные кавычки (").

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

[codes]
100 = "Continue"
101 = "Switching Protocols"
200 = "OK"
...

и, при необходимости, префикс ваших ключей:

[codes]
c_100 = "Continue"
c_101 = "Switching Protocols"
c_200 = "OK"

один из них должен решить проблему.

...