1 (изменено: k561, 2007-01-05 15:36:50)

Тема: не проходит post (The field count is empty!)

суть проблемы:
пытаемся создать таблицу(и при некоторых других операциях), получаем: "The field count is empty!"
после долгих разбирательств все же выяснилось, что где-то значения переданные post-ом херятся...
причем это проверялось и в версии 2.8.2.4 и в 2.9.1.1, далее остановился на 2.8.2.4

после некоторой медитации нашел причину:
модуль: ./libraries/common.lib.php
проверка:

if (!isset($_REQUEST['token']) || $_SESSION['PMA_token'] != $_REQUEST['token']) {
    /* List of parameters which are allowed from unsafe source */
    $allow_list = array(
        'db', 'table', 'lang', 'server', 'convcharset', 'collation_connection', 'target',
        /* Session ID */
        'phpMyAdmin',
        /* Cookie preferences */
        'pma_lang', 'pma_charset', 'pma_collation_connection', 'pma_convcharset',
        /* Possible login form */
        'pma_username', 'pma_password',
    );
    $keys = array_keys($_REQUEST);
    /* Remove any non allowed stuff from requests */
    foreach($keys as $key) {
        if (!in_array($key, $allow_list)) {
            unset($_REQUEST[$key]);
            unset($_GET[$key]);
            unset($_POST[$key]);
            unset($GLOBALS[$key]);
        } else {
            // allowed stuff could be compromised so escape it
            $_REQUEST[$key] = htmlspecialchars($_REQUEST[$key], ENT_QUOTES);
        }
    }
}

если закомментировать все unset, всё вроде бы начинает работать как надо...
более подробно пока не разбирался, может кто подскажет, где тут собака порылась?

---------
4.11-STABLE FreeBSD
mysql  Ver 14.7 Distrib 4.1.22, for portbld-freebsd4.11 (i386) using readline 5.2
PHP 4.4.4 with Suhosin-Patch 0.9.5 (cgi-fcgi) (built: Oct 18 2006 07:26:28)
phpMyAdmin – 2.8.2.4(2.9.1.1)

2

Re: не проходит post (The field count is empty!)

Очень странная ситуация. Дело в том что данное условие выполняется только при отсутствии элемента token в массиве механизмов ввода (POST, GET, COOKIE), либо при несоответсвии сессии. По идее, данная структура должна выполняться только при первом входе пользователя (значение token'у ещё не присвоен), либо при несоответствии token'а (то есть хак). В общем я в недоумении, почему у вас с token'ом проблемы.

Попробуйте сделать возвращаемый текст ошибки, немного более информативным, изменитв файл tbl_create.php. Строка 219:
PMA_mysqlDie($strTableEmpty, '', '', $err_url);
Заменить на:
PMA_mysqlDie($strTableEmpty . " \$num_fields = {$num_fields}. ", '', '', $err_url);
Это должно помочь определить значение пропадающей переменной.

Можно временно попробовать решить проблему добавив в массив $allow_list (файл libraries/common.lib.php строка 2881) - элемент 'num_fields'. Но это не решение проблемы, хотя всё же лучше, чем закомментированные unset, как вы сделали.

Очень советую вам написать баг-репорт на http://sourceforge.net/tracker/?atid=37 … _id=23067. И если не трудно, пожалуйста, держите нас в курсе решений данной проблемы.

3

Re: не проходит post (The field count is empty!)

изменение строки:
PMA_mysqlDie($strTableEmpty, '', '', $err_url);
только подтвердило, что $num_fields остается пустой.

добавление же num_fields в $allow_list надолго не спасает: при создании таблицы первая стадия (название таблицы и количество полей) проходит нормально, вторая же (заполненный список полей) не проходит, получаем все туже ошибку...

с отпиской разработчикам... боюсь показывать свой инглишь...

4

Re: не проходит post (The field count is empty!)

k561 сказал:

с отпиской разработчикам... боюсь показывать свой инглишь...

Эта проблема всплыла на сайте проекта 15 ноября: [1597047] Field count is empty when creating new table.

Отвечающий не смог воспроизвести описанную проблему на своей машине, и посоветовал вопрошающему установить XAMPP - аналог нашего "Денвера". Т.е. предположил, что проблема не в phpMyAdmin, а в коррректности установки и настройки связки Apache+MySQL+PHP.

За правильность этого вывода говорит абсолютная немассовость данной проблемы: 1 человек в багтрекере + 1 человек на форуме.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

5

Re: не проходит post (The field count is empty!)

Очевидно, проблема не в phpMyAdmin, но локализовать источник возникновения ошибки очень сложно. Как я уже говорил, проблема с token, но откуда возникает такое странное поведение скрипта - совершенно не понятно. Может версия FreeBSD с багом, может сборка программ была произведена с ошибками, может неправильно выставлены права на папку сессий. Здесь можно очень долго ковыряться отыскивая решение проблемы.

Я отпишу в официальный баг-репорт, если вы не против, вашу конфигурацию и проблему, может поможет кто.

6 (изменено: AngryFriar, 2007-01-11 09:47:45)

Re: не проходит post (The field count is empty!)

У меня та же хрень sad
конфигурация - Win2k Server, Apache 2.2, PHP 5.2.0, phpMyAdmin 2.9.1.1
не работало создание таблиц, не работал импорт. после комментирования ансетов стало работать ( вроде )

7

Re: не проходит post (The field count is empty!)

k561
Как говорится Та-Да! Нашёл причину возникающего некорректного поведения скрипта. smile

Цитата из моего предыдущего сообщения:

может неправильно выставлены права на папку сессий

В php.ini вы увели session.save_path из изначального /tmp в СамиЗнаетеКуда/tmp, но забыли выставить права для этой папки на запись для внешних пользователей chmod 4075[7], таким образом сессии, при внешних подключениях не сохранялись, а token в phpMyAdmin, как вы знаете, работает на механизме сессий. Именно поэтому у вас даже дизайн не работал, так как css стили подключаются динамически и так же с помощью token (защита от XSS - кросскриптинга).

AngryFriar
У вас проблема похожа. Только вместо chmod, которого в Винде по понятным причинам не существует, надо правильно настроить права на папку указанную в php.ini директивой session.save_path. Ещё одна вероятность - это то что у вас данной папки (указанной в session.save_path) физически не существует.

8

Re: не проходит post (The field count is empty!)

Hanut сказал:

k561
Как говорится Та-Да! Нашёл причину возникающего некорректного поведения скрипта. :)

Цитата из моего предыдущего сообщения:

может неправильно выставлены права на папку сессий

В php.ini вы увели session.save_path из изначального /tmp в СамиЗнаетеКуда/tmp, но забыли выставить права для этой папки на запись для внешних пользователей chmod 4075[7], таким образом сессии, при внешних подключениях не сохранялись, а token в phpMyAdmin, как вы знаете, работает на механизме сессий. Именно поэтому у вас даже дизайн не работал, так как css стили подключаются динамически и так же с помощью token (защита от XSS - кросскриптинга).

Извиняюсь, что так долго не отвечал - были на то причины...
Действительно вы правы :) просмотрел я это. Всецело моя ошибка.
Поклон вам до земли.