$ this-> input-> post () всегда возвращает FALSE из-за нежелательного 301 - PullRequest
3 голосов
/ 15 мая 2011

Я работаю над страницей регистрации в CodeIgniter. Проблема в том, что мои данные не приходят через . Следующий код всегда выдает «fail»:

class Signup extends CI_Controller {

    function index()
    {    
        if ($this->input->post())
        {
            echo 'success'; 
        }
        else
        {
            echo 'fail';

            echo form_open('signup');

            echo form_input('username', 'Username');
            echo form_input('email_address', 'Email address');
            echo form_submit('submit', 'Create Acccount');

            echo form_close();
        }
    }

}

В чем может быть проблема?

Чтобы все стало еще интереснее, на моем локальном хосте форма работает просто отлично. Это когда на удаленном сервере, когда это не удается.


Обновление 1: В соответствии с запросом, это то, что выводит сервер: (Я скрыл URL, я не раскрыта)

<form accept-charset="utf-8" method="post" action="http://www.url.com/signup">
<input type="text" value="Username" name="username">
<input type="text" value="Email address" name="email_address">
<input type="submit" value="Create Account" name="submit">
</form>

Обновление 2: Я вижу еще одно различие в поведении между локальным хостом и удаленным сервером: при обновлении (cmd R или F5) страницы после отправки формы на локальном хосте мой браузер просит меня отправьте форму еще раз. Эта же страница на удаленном сервере не вызывает этот вопрос из браузера, поэтому похоже, что проблема вызвана некоим перенаправлением или URL?


Обновление 3: Похоже, что на удаленном сервере пользователь перенаправляется на 301. (перемещено навсегда) Я до сих пор не знаю, откуда происходит это перенаправление. Перенаправление эффективно убивает пост-данные, поэтому объясняет, почему post () возвращает false.

Итак, кто-нибудь знает, почему у меня 301?


Обновление 4: Меня перенаправили в CodeIgniter, установив для base_url значение http://www.url.com вместо http://url.com

После изменения это решило проблему! :)

Ответы [ 4 ]

3 голосов
/ 15 мая 2011

Проблема может быть вызвана перенаправлением 301 (директива HTTP-заголовка Location) с удаленного сервера. Если вы используете Firefox, вы можете проверить это с помощью плагина TamperData. Конечно, вы также можете просто увидеть, перенаправляется ли http://www.url.com/signup при запросе страницы.

Если заголовок HTTP Location равен http://url.com/signup (без www), то самое простое решение - использовать http://url.com/signup для действия формы. Обратите внимание, что вы также можете опустить адрес сервера, если форма находится на том же сервере. Вы можете использовать /signup вместо.

2 голосов
/ 15 мая 2011

Какую версию CI вы используете?CI Reactor внес изменения в $this->input->post()

Методы входного класса post () и get () теперь будут возвращать полный массив, если не указан первый аргумент.

Я только что проверил похожее состояние;Я использую CI Reactor на локальном хосте, и дореакторную версию в моем эфире, и получил то же самое.

$ _ POST действительно содержал данные.До реактора, $this->input->post ничего не возвращает, если не передан массив:

$this->input->post() вызывает _fetch_from_array()

function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
{
    if ( ! isset($array[$index]))
    {
        return FALSE;
    }

Однако в реакторе это делается вместо этого:

    if ($index === NULL AND ! empty($_POST))
    {
        $post = array();

        // Loop through the full _POST array and return it
        foreach (array_keys($_POST) as $key)
        {
            $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
        }
        return $post;
    }

Таким образом, вы получаете значения сообщений, даже если вы не указали индекс.

0 голосов
/ 14 августа 2012

У меня была эта проблема, это странное решение, я не могу объяснить, почему, но вот что сработало.Не используйте html, чтобы форма использовала библиотеку форм codeigniters.я пробовал оба пути и по какой-то причине

$this->input->post('your_variable'); 

работал только при использовании класса формы, см. codeigniter userguide

0 голосов
/ 15 мая 2011

Я бы начал с print_r () с использованием суперглобальных $ _POST / $ _ REQUEST, чтобы увидеть, видит ли PHP что-нибудь.Это должно помочь сузить его, чтобы увидеть, если это проблема php или CI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...