PHP / CodeIgniter - данные $ _POST полностью исчезают при отправке формы в странных обстоятельствах - PullRequest
5 голосов
/ 18 июня 2011

РЕДАКТИРОВАТЬ: Я думаю, что я что-то решил. - Этот персонаж - - кажется, ломает это. Если я использую «обычный» апостроф ('), он, кажется, работает нормально, если я заменяю каждый шикарный апостроф в нем обычным, он подает просто отлично. Итак, следующий вопрос: , почему этот причудливый апостроф нарушает CodeIgniter или PHP? Я предполагаю, что это ошибка CI, но, пожалуйста, исправьте меня, если я ошибаюсь. Во всяком случае, вот вопрос, который я первоначально разместил, я все равно был бы признателен за понимание того, почему это происходит, и если бы я мог многое с этим поделать:


Я рву волосы над этим. Это совершенно странно, и я просто не могу разобраться.

Во-первых, у меня есть базовая форма:

<?php $attributes = array('class' => 'form1'); $selected="";
echo form_open('admin/edit_page/'.$page->row('id'), $attributes); ?>

    <div>               
        <?php echo form_error('title'); ?>
        <label>Page Title:</label><input type="text" maxlength="100" name="title" value="<?php echo $page->row('title');?>" />
    </div>

    <div class="textarea">
        <?php echo form_error('content'); ?>
        <label>Page Content:</label><textarea name="content"><?php echo $page->row('content');?></textarea>
    </div>

    <div class="no">
        <input type="submit" value="Submit"/>
    </div>

</form>

Далее у меня есть соответствующая функция CI:

function edit_page($id)
{
    $this->form_validation->set_rules('title', 'Title', 'trim|required|max_length[50]');
    $this->form_validation->set_rules('content', 'Content', 'trim|required');

    // If validation has failed...
    if ($this->form_validation->run() == FALSE)
    {
        $data['page'] = $this->gallery_model->get_page($id);

        $this->load->view('admin/header');
        $this->load->view('admin/editpage', $data);
        $this->load->view('admin/footer');
    }
    else    // Validation successful
    {
        $title = $this->input->post('title');
        $content = $this->input->post('content');
        $this->gallery_model->edit_page($id, $title, $content);
        redirect('admin');
    }

}

Пока все в порядке, да? Вот где начинается безумная проблема.

  • Я могу «вручную» ввести любые данные, которые мне нравятся, в поле «Содержимое». Я нажимаю Отправить, все работает как положено - база данных обновлена ​​моими новыми данными, все хорошо в мире.
  • Я могу скопировать и вставить 15 абзацев Lorem Ipsum или что угодно в поле просто отлично. Хит отправить, ура.
  • Однако: - Я пытаюсь скопировать и вставить контент с сайта клиента, в частности, с этой страницы: http://jeremywebbphotography.com/biog.php - Я обновляю его сайт, так как мои навыки веб-разработчика значительно улучшились с того времени. Вот где дела идут странно - после нажатия кнопки сохранения после вставки копии форма перезагружается, я получаю сообщение об ошибке «Поле содержимого обязательно» , и моя копия-вставка в поле исчезает.
  • Если я запускаю WebKit Inspector в сетевом режиме и записываю запрос на отправку формы, я ясно вижу свой вставленный при копировании текст в массиве $ _POST ...
  • Однако, если я начну свою edit_page функцию с die("Content is ".$_POST['content']); - , ЭТО ОЧИСТИЛСЯ . Вывод буквально говорит «Контент есть». Вот и все.
  • Вышеуказанное работает, как и ожидалось, с полем title - оно влияет только на контент.
  • Я понял, что могут быть какие-то забавные специальные символы или что-то, вызывающее это в скопированном содержимом (даже если это не так) - но если вы скопируете и вставите его, то удалите все вплоть до первое слово 'Biog', затем отправьте (так что вы буквально отправляете одну строку), то же самое происходит! .

WTF продолжается?!

Вещи, которые я подтвердил, это не так:

  • Мой браузер (последняя версия Chrome Dev для Mac OS X Snow Leopard - пробовал в Safari и Firefox, та же проблема)
  • CI XSS Filtering или Security Sanitizing - отключили все это, не повезло
  • Проверка формы CI. Я тоже его выключил.
  • Данные, которые я отправляю (вид) - см. Окончательный описательный пункт.
  • Также попытался запустить htmlspecialchars и htmlentities по правилам проверки формы, без сигар.

Спасибо за вашу помощь. Чтобы уточнить, вот скриншот того, как я копирую его:

How I'm copy-pasting

(Там нет ничего сложного, верно?) - и, наконец, быстрый скриншот фактического вывода страницы после отправки (извините за CSS-шансы, я работаю над этим):

How it looks

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Не уверен, поможет ли это вообще, но попробуйте использовать $this->input->post('postvar') вместо $_POST['postvar']. Я считаю, что CodeIgniter использует эту функцию для правильной очистки и кодирования данных поста.

1 голос
/ 04 мая 2012

Я предлагаю вам использовать библиотеку Text Helper и использовать ее ascii_to_entities функцию:

$this->load->helper('text');
$content = $this->input->post('content');
$content = ascii_to_entities($content);


ascii_to_entities():

Преобразует значения ASCII в символьные объекты, включая символы высокого ASCII и MS Word, которые могут вызвать проблемы при использовании на веб-странице, чтобы их можно было отображать согласованно независимо от настроек браузера или надежно сохранять в базе данных. Существует некоторая зависимость от поддерживаемых наборов символов вашего сервера, поэтому она может быть не на 100% надежной во всех случаях, но по большей части она должна правильно идентифицировать символы за пределами нормального диапазона (например, символы с акцентом).

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