PHP / CodeIgniter - $ _POST数据在奇怪的情况下完全消失在表单提交上

时间:2011-06-18 14:06:06

标签: php codeigniter post

编辑:我想我已经解决了一些问题。 - 这个角色 - - 似乎打破了它。如果我使用'常规'撇号(')它似乎工作正常,如果我用常规撇号替换其中的每个时髦撇号,它提交就好了。那么,下一个问题:为什么这个花哨的撇号会破坏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正在进行中?!

我确认的事情不是:

  • 我的浏览器(Mac OS X Snow Leopard上的最新Chrome Dev - 在Safari和Firefox中尝试过,同样的问题)
  • CI XSS过滤或安全消毒 - 将这些全部关闭,没有运气
  • CI表格验证。我也把它关了。
  • 我提交的数据(种类) - 请参阅最终描述要点。
  • 还尝试通过表单验证规则运行htmlspecialcharshtmlentities,没有雪茄。

感谢您的帮助。为了澄清,这里是我如何复制粘贴它的截图:

How I'm copy-pasting

(那里没什么复杂的吧?) - 最后,提交后的实际页面输出的快速截图(抱歉CSS好了,我正在研究它):

How it looks

2 个答案:

答案 0 :(得分:2)

不确定这是否会有所帮助,但请尝试使用$this->input->post('postvar')代替$_POST['postvar']。我相信CodeIgniter使用此功能来正确清理和编码后期数据。

答案 1 :(得分:1)

我建议您使用Text Helper库并使用其ascii_to_entities函数:

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


ascii_to_entities()

  

将ASCII值转换为字符实体,包括在网页中使用时可能导致问题的高字符和MS字符,这样无论浏览器设置如何,它们都可以一致地显示,或者可靠地存储在数据库中。对服务器支持的字符集有一定的依赖性,因此在所有情况下可能都不是100%可靠,但在大多数情况下,它应该正确识别正常范围之外的字符(如重音字符)。