【问题标题】:PHP/CodeIgniter - $_POST data totally disappears on form submission in bizarre circumstancesPHP/CodeIgniter - $_POST 数据在奇怪的情况下在表单提交时完全消失
【发布时间】:2011-06-18 14:06:06
【问题描述】:

编辑:我想我已经解决了一些问题。 - 这个角色 - - 似乎打破了它。如果我使用“常规”撇号 ('),它似乎可以正常工作,如果我用常规撇号替换其中的每个时髦撇号,它就可以正常提交。那么,下一个问题:为什么那个花哨的撇号会破坏 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 数组中清楚地看到我复制粘贴的文本...
  • 但是,如果我以 die("Content is ".$_POST['content']); 开始我的 edit_page 函数 - 它已经清除了它自己。输出字面意思是“内容是”。就是这样。
  • 上述内容与title 字段一样正常 - 它只影响内容。
  • 我发现复制的内容中可能有一些有趣的特殊字符或导致这种情况发生的东西(即使没有) - 但如果你复制粘贴它,然后删除 所有内容直到第一个单词“Biog”,然后提交(所以你实际上是提交一行),同样的事情仍然会发生!

WTF 怎么回事?!

我已经确认不是的事情:

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

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

(那里没什么复杂的,对吧?)——最后是提交后实际页面输出的快速屏幕截图(对于 CSS 专家感到抱歉,我正在努力):

【问题讨论】:

  • post_max_sizesuhosin.post.max_value_length的值是多少(如果安装了suhosin)?
  • 大约 10 秒前刚刚更新了我的问题 - 我想我知道它是什么。 Suhosin 没有安装(这只是 MAMP),不要认为post_max_size 是相关的,因为我提交了更多的 Lipsum 数据(15 段)就好了。
  • 您的表单页面使用的字符集是什么?
  • CI 输出 &lt;form action="http://dev.jeremywebb/admin/edit_page/3" method="post" accept-charset="utf-8" class="form1"&gt; - 我对字符编码不太感兴趣。看起来对吗?

标签: php codeigniter post


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我建议你使用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% 可靠,但在大多数情况下,它应该能够正确识别正常范围之外的字符(如重音字符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多