【问题标题】:Really really stumped on a $_POST PHP Issue真的很难过 $_POST PHP 问题
【发布时间】:2012-05-08 20:53:48
【问题描述】:

我正在构建一个 CMS,我正在尝试制作一个版本控制系统。

每次用户发布对现有网页的更新时,我都希望“版本控制”表保留已编辑字段的事件日志...

为此,我运行了一堆循环来检查用户刚刚填写的表单内容是否与点击提交之前网站上的内容不同...

因此,在我进行任何更新之前,我有以下代码(如果格式不正确,请道歉):

$sql = "select * from pages where ID =" .$_POST[id];
$rs = odbc_exec ($db, $sql);
$contents_original = odbc_result($rs,"content");
$title_original = odbc_result($rs,"title");
$pageorder_original = odbc_result($rs,"pageorder");
$parent_original = odbc_result($rs,"parent");
$footer_original = odbc_result($rs,"footer");

$updated_content = trim(stripslashes(strtolower(htmlentities($_POST['content']))));
$original = trim(strtolower($contents_original));

if ($updated_content == $original) {
                $a = 'n';
                } else {
                $a = '<p>Contents changed.';
                }

// 以此类推,从变量 $b - $e ... then:

    $update = "$a $b $c $d $e"; 

然后是更新例程(所有这些都可以正常工作),并且在版本更新结束时,我将 $update 的内容插入到“事件”列中的 SQL 中(这也有效没问题)

但是!假设用户使用原始页面内容加载表单并单击提交...如果表单没有任何更改,则 $a 将 = ' ',因此,不应在“事件”列中输入任何内容。除了它不断输入“内容已更改”,事实上,它对每个字符串都这样做(例如标题字段、页脚字段等)!奇怪的是有 2 个整数输入,它们被事件菜单记录得很好。

如果我打印出 strlen(stripslashes(strtolower(htmlentities($_POST['content'])))) 和 strlen(strtolower($contents_original)) 它表明长度不同...

代码或数据库长度中没有任何内容会导致这种抑制。


输出来自: stripslashes(strtolower(stripcslashes($thenewcontent)))

章鱼你好!

欢迎来到乔纳森米。爱德华兹的平面设计页面。

无论您需要设计什么 - 商业网站、乐队徽标,应有尽有 - 我有能力为您提供创意和专业的产品。

点击下面的缩略图快速浏览:

要安排报价,或者如果您只是想谈谈想法,请给我发电子邮件至:contact[at]angry-octopus.co.uk 或致电 (0789)694-3379


输出自 stripslashes(strtolower(html_entity_decode($contents_original)))

章鱼你好!

欢迎来到乔纳森米。爱德华兹的平面设计页面。

无论您需要设计什么 - 商业网站、乐队徽标,应有尽有 - 我有能力为您提供创意和专业的产品。

点击下面的缩略图快速浏览:

要安排报价,或者如果您只是想谈谈想法,请给我发电子邮件至:contact[at]angry-octopus.co.uk 或致电 (0789)694-3379

^^^^^^^^^^^^^^ 以上所有内容均从记事本 .TXT 中复制/粘贴。

【问题讨论】:

  • 您的代码极易受到 sql 注入攻击
  • 为什么不使用 firebug 来查看来回传递的实际消息?
  • 它应该被隐藏和编码。它不在默认域页面上。

标签: php post odbc


【解决方案1】:

如果您调用htmlentities(),字符串可能会因为字符转换而变长。或者更短,因为您还使用stripslashes()。 (谢谢豪尔赫)

【讨论】:

  • 感谢您的建议。恐怕这行不通!数字仍然没有。我已经对各种字符串函数进行了很好的实验,但似乎没有什么可以让提交和数据库字段同时发生......
【解决方案2】:

是数据库中的数据多字节,

如果数据是 unicode(多字节),普通的 strlen 函数不能正常工作,因为它们会将字符串计为单字节

您可以尝试使用该功能:

mb_strlen (strtolower($contents_original)) )

http://www.php.net/manual/en/ref.mbstring.php

【讨论】:

  • 另外,阅读更改的最佳方法是保存在记事本(文件)中并在没有编码的编辑器中打开它,你会意识到这个问题..
  • 我试了一下,它确实改变了一些数字,但它们仍然不匹配,我还用 mb_check_encoding 检查了相同的结果,它得出了一个“1”,我不知道知道这是否证实该数据库确实是一个多字节数据库,但这意味着它可能是......
  • Aroha Labs,我会在编辑器中尝试一下。我开始失去希望了!我已经在这些愚蠢的代码行上工作了好几个小时了哈哈!
  • 看起来一模一样。数据库是 UTF-8,所以我在我的 PHP 中更改了它,因为它设置为 ANSI...也没有区别...(见上面的编辑)
  • 你有没有尝试修剪任何空白,str​​len 和 mb_strlen 会显示什么输出......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2012-03-22
  • 2012-12-17
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多